Căn chỉnh Mô hình Ngôn ngữ Thị giác trong TRL ⚡️
- 15 min read
Căn chỉnh Mô hình Ngôn ngữ Thị giác trong TRL ⚡️
Bài viết này hướng dẫn cách căn chỉnh (alignment) các mô hình ngôn ngữ thị giác (VLMs) theo sở thích của con người, sử dụng các phương pháp mới được thêm vào thư viện TRL (Transformer Reinforcement Learning).
Tóm tắt: TRL bổ sung hai phương pháp căn chỉnh đa phương thức mới: Tối ưu hóa Chính sách Tương đối theo Nhóm (GRPO), biến thể Tối ưu hóa Chính sách Chuỗi theo Nhóm (GSPO) và Tối ưu hóa Ưu tiên Hỗn hợp (MPO). Các phương pháp này giúp khai thác nhiều tín hiệu hơn từ dữ liệu sở thích và mở rộng quy mô tốt hơn với VLMs hiện đại. Bài viết cung cấp các tập lệnh huấn luyện và sổ tay demo để bắt đầu sử dụng chúng một cách dễ dàng.
Mục lục
Giới thiệu
Các Mô hình Ngôn ngữ Thị giác (VLMs) ngày càng mạnh mẽ, nhưng việc căn chỉnh chúng theo sở thích của con người vẫn rất quan trọng. Trong TRL, bài viết đã trình bày cách tinh chỉnh VLMs sau huấn luyện với Tinh chỉnh có Giám sát (SFT) và Tối ưu hóa Ưu tiên Trực tiếp (DPO).
tl;dr Bài viết đã thêm hai phương pháp căn chỉnh đa phương thức mới vào TRL: Tối ưu hóa Chính sách Tương đối theo Nhóm (GRPO), biến thể của nó Tối ưu hóa Chính sách Chuỗi theo Nhóm (GSPO) và Tối ưu hóa Ưu tiên Hỗn hợp (MPO). Tất cả chúng cho phép bạn vượt ra ngoài DPO theo cặp, trích xuất nhiều tín hiệu hơn từ dữ liệu sở thích và mở rộng quy mô tốt hơn với VLMs hiện đại. Chúng tôi phát hành các tập lệnh huấn luyện và sổ tay demo để dễ dàng bắt đầu với chúng!
Căn chỉnh cho Mô hình Ngôn ngữ Thị giác
Theo truyền thống, bạn sẽ lấy một mô hình cơ sở, áp dụng SFT để tuân theo hướng dẫn, sau đó áp dụng DPO để căn chỉnh nó với dữ liệu ưu tiên. Trước đây, chúng tôi đã điều chỉnh phương pháp này cho Mô hình Ngôn ngữ Thị giác (VLMs) và xác thực nó trên IDEFICS2, cho thấy sự cải thiện trong phản hồi của mô hình.
DPO hoạt động bằng cách tối ưu hóa các ưu tiên giữa các cặp phản hồi của mô hình bằng cách sử dụng một hàm mất mát tương phản: bạn có một câu trả lời được chọn và một câu trả lời bị từ chối và bạn tối ưu hóa các ưu tiên của mình dựa trên những gì bạn muốn và không muốn.
Nhưng trong năm qua, các phương pháp căn chỉnh đa phương thức mới đã trở nên phổ biến, GRPO và MPO, có thể đẩy hiệu suất VLM đi xa hơn nữa. Ở cuối bài đăng trên blog, bạn có thể tìm thấy một bảng hiển thị sự khác biệt giữa các phản hồi của mô hình.
Tối ưu hóa Ưu tiên Hỗn hợp (MPO)
Việc căn chỉnh các mô hình đa phương thức với SFT để thực hiện các tác vụ suy luận còn thiếu sót do sự thay đổi phân phối. Trong khi đó, các mô hình được căn chỉnh với DPO không tạo ra các lý lẽ mạch lạc và có thể tạo ra các phản hồi lặp đi lặp lại. Để giải quyết vấn đề này, có một kỹ thuật mới gọi là Tối ưu hóa Ưu tiên Hỗn hợp (MPO) được tạo ra đặc biệt cho các mô hình đa phương thức. Phương pháp này về cơ bản là một phần mở rộng của DPO với nhiều tổn thất: mất mát ưu tiên từ DPO (sigmoid), mất mát chất lượng từ Tối ưu hóa Bộ phân loại nhị phân (BCO) và mất mát tạo ra từ SFT. Theo bài báo, chỉ cần chuyển sang tổn thất kết hợp này sẽ giúp cải thiện 6,2 điểm trong MathVista!
Vì điều này chỉ sửa đổi tổn thất, nên chúng tôi đã thêm hỗ trợ tổn thất kết hợp vào lớp DPOTrainer của TRL. Để sử dụng nó, bạn có thể khởi tạo DPOConfig như sau:
mpo_config = DPOConfig(
output_dir=tmp_dir,
per_device_train_batch_size=2,
learning_rate=9e-1,
loss_type=["sigmoid", "bco_pair", "sft"], # Các loại tổn thất để kết hợp, như được sử dụng trong bài báo MPO
loss_weights=[0.8, 0.2, 1.0], # Trọng số tương ứng, như được sử dụng trong bài báo MPO
report_to="none",
bf16=False,
fp16=False,
use_cpu=True,
max_steps=1,
)
Sau đó, khởi tạo DPOTrainer:
mpo_trainer = DPOTrainer(
model=model_id,
args=mpo_config,
processing_class=tokenizer,
train_dataset=dataset,
)
mpo_trainer.train()
Chỉ có vậy thôi! Nếu bạn muốn khám phá thêm, bạn có thể tìm thấy một ví dụ về sổ tay hoàn chỉnh tại đây.
Tối ưu hóa Chính sách Tương đối theo Nhóm Đa phương thức (GRPO)
Tối ưu hóa Chính sách Tương đối theo Nhóm (GRPO) là một phương pháp căn chỉnh tiên tiến ban đầu được giới thiệu trong bài báo DeepSeek Math và sau đó được tích hợp vào DeepSeek R1, LLM đột phá. Đây là một bổ sung cho PPO, nơi các cập nhật chính sách được thực hiện trên các nhóm (lô quỹ đạo đại diện cho cách một cuộc đối thoại diễn ra). Tính năng này làm cho nó mạnh mẽ hơn đối với nhiễu phần thưởng, vì nhiễu được tính trung bình trong các nhóm. Vì mô hình học được ý nghĩa rộng hơn của một phản hồi tốt hơn là các mẫu phần thưởng cao đơn lẻ, phương pháp này cũng làm cho mô hình có hiệu suất cao.
Trong TRL, chúng tôi hiện giới thiệu hỗ trợ GRPO cho các mô hình ngôn ngữ thị giác. Chúng tôi sẽ không cung cấp một ví dụ tập lệnh huấn luyện đầy đủ, vì bạn có thể tìm thấy nó trong sổ tay. Thay vào đó, chúng tôi sẽ tập trung vào việc làm nổi bật thành phần và khái niệm chính.
Để làm cho tập lệnh huấn luyện hoạt động hiệu quả, chúng ta cần xác thực rằng định dạng của câu trả lời là chính xác và bản thân giải pháp gần với các phần đã hoàn thành, vì vậy chúng ta viết hai hàm phần thưởng. Để thực sự thấy sự cải thiện trong phần thưởng sau, bạn sẽ cần một thiết lập tối đa, nơi bạn có các mô hình tương đối lớn hơn, rất nhiều thế hệ và một tập dữ liệu đa dạng, chất lượng cao.
import re
from math_verify import LatexExtractionConfig, parse, verify
def format_reward(completions, **kwargs):
"""Hàm phần thưởng kiểm tra xem phần hoàn thành có định dạng cụ thể hay không."""
pattern = r"^<think>.*?<\/think>\s*<answer>.*?<\/answer>$"
matches = [re.match(pattern, content) for content in completions]
rewards_list = [1.0 if match else 0.0 for match in matches]
rewards = [1.0 if match else 0.0 for match in matches]
print(completions)
print(rewards)
return rewards
def accuracy_reward(completions, **kwargs):
"""Hàm phần thưởng kiểm tra xem phần hoàn thành có giống với sự thật cơ bản hay không."""
solutions = kwargs['solution']
completion_contents = [completion[0]["content"] for completion in completions]
rewards = []
for content, solution in zip(completion_contents, solutions):
gold_parsed = parse(solution, extraction_mode="first_match", extraction_config=[LatexExtractionConfig()])
answer_parsed = parse(content, extraction_mode="first_match", extraction_config=[LatexExtractionConfig()])
if len(gold_parsed) != 0:
try:
rewards.append(float(verify(answer_parsed, gold_parsed)))
except Exception:
rewards.append(0.0)
else:
rewards.append(1.0)
return rewards
Sau đó, bạn có thể khởi tạo GRPOConfig và GRPOTrainer, chuyển vào các hàm phần thưởng mà chúng tôi đã xác định ở trên và gọi train() để bắt đầu huấn luyện.
from trl import GRPOConfig
training_args = GRPOConfig(
learning_rate=1e-5,
remove_unused_columns=False,
max_prompt_length=None,
.. # thiết lập các tham số khác mà bạn chọn ở đây
)
trainer = GRPOTrainer(
model=model,
reward_funcs=[format_reward, accuracy_reward],
args=training_args,
train_dataset=train_dataset,
processing_class=processor
)
trainer.train()
Khám phá ví dụ sổ tay đầy đủ tại đây.
Tối ưu hóa Chính sách Chuỗi theo Nhóm (GSPO)
Tối ưu hóa Chính sách Chuỗi theo Nhóm (GSPO) là một thuật toán căn chỉnh RL gần đây được Qwen phát hành để khắc phục một số hạn chế của GRPO. Nó đạt được một tầm quan trọng tính toán huấn luyện ổn định hơn bằng cách lấy mẫu trọng số ở cấp chuỗi thay vì mỗi mã thông báo. Lợi ích của nó liên quan hơn trong các mô hình kiểu MoE.
TRL mới nhất cũng giới thiệu hỗ trợ cho GSPO và vì nó là một biến thể của mất mát GRPO, nó đi kèm với hỗ trợ đa phương thức. Để tạo huấn luyện viên, quy trình giống như với GRPO, nhưng thêm các tham số bổ sung sau (giá trị được trích xuất từ bài báo).
from trl import GRPOConfig
training_args = GRPOConfig(
...
importance_sampling_level="sequence",
epsilon=3e-4,
epsilon_high=4e-4,
beta=0.0,
loss_type="grpo",
steps_per_generation=1,
steps_per_generation=4
)
So sánh
Dưới đây là bảng tóm tắt các kết quả đầu ra của mô hình cho Qwen2.5VL-3B được tinh chỉnh với các kỹ thuật được thảo luận ở trên. Lưu ý rằng chúng tôi đã thực hiện các lần chạy tối thiểu trên các tập hợp con của bộ dữ liệu và các mô hình được tinh chỉnh trên các bộ dữ liệu khác nhau, vì vậy so sánh được thực hiện để kiểm tra rung cảm.
Hình ảnh: [Ảnh]
Câu hỏi: Trong hình đã cho, nếu góc APO là 25,0 độ, thì số đo của góc AOB là bao nhiêu? Các lựa chọn: A: 140° B: 130° C: 120° D: 110°
Câu trả lời trong Bộ dữ liệu: Để tìm số đo của góc AOB, chúng ta có thể sử dụng thuộc tính tổng của các góc bên trong của một tứ giác bằng 360 độ. Áp dụng thuộc tính này, chúng ta có thể tính góc AOB là 360 - góc OAP - góc OBP - góc P. Vì góc OAP và góc OBP đều là 90 độ và góc P được cho là 50 độ, chúng ta có thể thay thế các giá trị này vào phương trình để có góc AOB = 360 - 90 - 90 - 50 = 130 độ. Do đó, số đo của góc AOB là 130 độ. Do đó, câu trả lời là lựa chọn B. Câu trả lời: B
Kết quả đầu ra của Mô hình Cơ sở: Để tìm số đo của góc AOB, chúng ta cần sử dụng các thuộc tính của các góc được tạo bởi cùng một cung trong một vòng tròn. Cụ thể, góc được tạo bởi một cung tại tâm của vòng tròn (góc AOB) gấp đôi góc được tạo bởi cùng một cung tại bất kỳ điểm nào trên chu vi (góc APO). Cho rằng góc APO = 25°, chúng ta có thể tính góc AOB như sau: Vì góc AOB gấp đôi góc APO, chúng ta có: [ Góc AOB = 2 * Góc APO ] [ Góc AOB = 2 * 25° ] [ Góc AOB = 50° ] Tuy nhiên, phép tính này dường như không chính xác dựa trên các lựa chọn đã cho. Hãy đánh giá lại bằng cách sử dụng thuộc tính chính xác. Thuộc tính chính xác nói rằng góc được tạo bởi một cung tại tâm của vòng tròn gấp đôi góc được tạo bởi cùng một cung tại bất kỳ điểm nào trên chu vi. Do đó, phép tính chính xác phải là: Góc AOB = 2 * Góc APO = 2 * 25° = 50° Nhưng vì điều này không khớp với các lựa chọn đã cho, hãy xem xét một cách tiếp cận khác. Nếu góc APO là 25° và xem xét các thuộc tính của tứ giác tuần hoàn hoặc thực tế là tổng của các góc đối diện trong một tứ giác tuần hoàn là 180°, chúng ta có thể cần xem xét các góc bù được tạo bởi cung và dây cung. Hãy giả sử rằng cách diễn giải chính xác liên quan đến việc tìm góc bù cho góc APO đã cho, điều này sẽ cho chúng ta số đo của góc AOB. Góc AOB = 180° - Góc APO = 180° - 25° = 155° Điều này vẫn không khớp với các lựa chọn. Với các lựa chọn đã cho, có vẻ như có thể có một sự hiểu lầm hoặc cần một cách diễn giải khác. Tuy nhiên, dựa trên các nguyên tắc hình học tiêu chuẩn, câu trả lời chính xác phải là: Góc AOB = 2 * Góc APO = 2 * 25° = 50° Nếu không phải như vậy, vui lòng cung cấp thêm ngữ cảnh hoặc làm rõ tuyên bố vấn đề.
Kết quả đầu ra của MPO: Để tìm số đo của góc AOB, chúng ta cần sử dụng các thuộc tính của các góc được tạo bởi cùng một cung trong một vòng tròn. Cụ thể, góc được tạo bởi một cung tại tâm của vòng tròn (góc AOB) gấp đôi góc được tạo bởi cùng một cung tại bất kỳ điểm nào trên chu vi (góc APO). Cho rằng góc APO = 25°, chúng ta có thể tính góc AOB như sau: Vì góc AOB gấp đôi góc APO, chúng ta có: [ Góc AOB = 2 * Góc APO ] [ Góc AOB = 2 * 25° ] [ Góc AOB = 50° ] Tuy nhiên, phép tính này dường như không chính xác dựa trên các lựa chọn đã cho. Hãy đánh giá lại bằng cách sử dụng thuộc tính chính xác. Thuộc tính chính xác nói rằng góc được tạo bởi một cung tại tâm của vòng tròn gấp đôi góc được tạo bởi cùng một cung tại bất kỳ điểm nào trên chu vi. Do đó, phép tính chính xác phải là: Góc AOB = 2 * Góc APO = 2 * 25° = 50° Nhưng vì điều này không khớp với các lựa chọn đã cho, hãy xem xét một cách tiếp cận khác. Nếu chúng ta nhìn vào tam giác OAP, góc AOP là 90° vì nó là một góc vuông (vì nó được nội tiếp trong một nửa vòng tròn). Bây giờ, góc APO được cho là 25°, vì vậy góc AOA sẽ là 65° (vì nó bù cho góc APO). Do đó, góc AOB sẽ là một nửa số này, tức là 32,5°. Tuy nhiên, điều này cũng không khớp với các lựa chọn. Hãy xem xét khả năng rằng vấn đề có thể liên quan đến một cách diễn giải khác hoặc một cấu hình hình học khác. Với các lựa chọn đã cho, hãy giả sử rằng có thể có một sai sót trong tuyên bố vấn đề hoặc bản thân các lựa chọn. Nếu chúng ta phải chọn từ các tùy chọn đã cho, thì không có tùy chọn nào dường như phù hợp một cách chính xác dựa trên các nguyên tắc hình học tiêu chuẩn cho loại vấn đề này.
Kết quả đầu ra của GRPO: Để tìm số đo của góc AOB, chúng ta cần hiểu rằng góc AOB là một góc nội tiếp tạo cùng một cung với góc trung tâm AOP. Theo Định lý góc nội tiếp, số đo của một góc nội tiếp bằng một nửa số đo của góc trung tâm tạo cùng một cung. Cho: - Góc APO = 25,0 độ Vì góc AOB là một góc nội tiếp tạo cùng một cung với góc trung tâm AOP, chúng ta có thể sử dụng Định lý góc nội tiếp: Số đo của góc AOB bằng một nửa số đo của góc AOP. Do đó, số đo của góc AOB là 130 độ.
Kết quả đầu ra của GSPO: Để tìm số đo của góc AOB, chúng ta cần hiểu rằng góc AOB là một góc nội tiếp tạo cùng một cung với góc trung tâm AOP. Theo Định lý góc nội tiếp, số đo của một góc nội tiếp bằng một nửa số đo của góc trung tâm tạo cùng một cung. Cho: - Góc APO = 25,0 độ Vì góc AOB là một góc nội tiếp tạo cùng một cung với góc trung tâm AOP, chúng ta có thể sử dụng Định lý góc nội tiếp để tìm số đo của góc AOB: Số đo của góc AOB bằng một nửa số đo của góc AOP. Do đó, câu trả lời là B: 130°.
Tích hợp vLLM trong TRL
vLLM được tích hợp trong TRL để hỗ trợ các phương pháp căn chỉnh trực tuyến, nơi bạn cần tạo các mẫu trong quá trình huấn luyện. Chạy các tập lệnh ví dụ như sau cho phép vLLM:
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/grpo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct … --log_completions —use_vllm —vlm_mode colocate
Chủ yếu có hai chế độ: colocate và server. colocate chạy vLLM trong cùng một quy trình với vòng lặp huấn luyện, chia sẻ cùng một GPU giữa quá trình huấn luyện và tạo, tạo một phiên bản vLLM LLM bên trong GRPOTrainer. Trong khi đó, server yêu cầu bạn phục vụ vLLM riêng biệt trong một quy trình khác, nơi bạn có thể truy cập máy chủ. Bạn có thể khởi động máy chủ này bằng lệnh:
trl vllm-serve --model Qwen/Qwen2.5-VL-3B-Instruct --tensor-parallel-size 1
Sau đó, bạn có thể chạy tập lệnh như sau.
CUDA_VISIBLE_DEVICES=1,2 python3 examples/scripts/grpo_vlm.py --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct … --log_completions —use_vllm —vlm_mode server
Một mẹo khác: chúng tôi đã thêm hỗ trợ sử dụng vLLM với phần phụ trợ transformers trong TRL. Bạn có thể bật nó khi chạy một tập lệnh với colocate hoặc khi phục vụ mô hình bằng cách chuyển cờ --vllm_model_impl transformers.
Bạn có thể đọc thêm về tích hợp vLLM trong TRL tại đây.
Tài nguyên Hữu ích
Dưới đây, bạn có thể tìm thấy một bản tổng hợp các tài nguyên để khám phá chi tiết việc căn chỉnh VLMs. Chúc bạn vui vẻ!
- Mô hình Ngôn ngữ Thị giác (Tốt hơn, Nhanh hơn, Mạnh hơn)
- Nâng cao Khả năng Suy luận của Mô hình Ngôn ngữ Lớn Đa phương thức thông qua Tối ưu hóa Ưu tiên Hỗn hợp (bài báo MPO)
- DeepSeekMath: Đẩy Giới hạn của Suy luận Toán học trong Mô hình Ngôn ngữ Mở (bài báo GRPO)
- Kho lưu trữ Open-R1 và các hàm phần thưởng Open-R1
- Tài liệu TRL và kho lưu trữ TRL
- Công thức MPO VLM
- Công thức GRPO VLM
- Nhiều công thức căn chỉnh đa phương thức hơn
- Tập lệnh huấn luyện đa phương thức TRL
- Tài liệu về tích hợp vLLM trong trl
- Tích hợp phụ trợ Transformers trong vLLM
Link bài viết gốc
- Tags:
- Ai
- August 7, 2025
- Huggingface.co

