Từ mô hình gốc đến trợ lý: SFT, RLHF, DPO và GRPO
Base model chỉ tiếp tục văn bản; post-training mới biến nó thành trợ lý. Tìm hiểu SFT, reward model, DPO và GRPO.
Trên trang này
Hãy yêu cầu GPT-2 — một mô hình ngôn ngữ pretrained khá tốt — viết một bài haiku về biển:
prompt: Write a haiku about the sea.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.Nó không bối rối, và cũng không thất bại trong nhiệm vụ của mình. Nó đang làm đúng chính xác điều mà Chương 10 đã huấn luyện nó làm: cho trước một đoạn văn bản, tạo ra phần văn bản tiếp nối hợp lý. Trên internet, một dòng như Write a haiku about the sea. thường được theo sau bởi văn xuôi nói về biển, và một câu vừa xuất hiện thì có xác suất cao bất thường là sẽ xuất hiện lại. Mô hình là một bộ dự đoán next-token xuất sắc và là một trợ lý vô dụng.
Bây giờ, cùng yêu cầu đó với một mô hình được xây dựng theo cùng cách — Qwen2.5, nửa tỷ tham số, lớn gấp bốn lần GPT-2 ở trên và vẫn là rất nhỏ theo bất kỳ chuẩn nào của năm 2026 — sau các giai đoạn huấn luyện mà chương này nói tới:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.Nhiều tham số gấp bốn lần không dạy cho mô hình biết ngừng nói. Khoảng cách giữa hai đầu ra đó không phải là scale, không phải architecture và không phải lượng dữ liệu. Đó là post-training: một giai đoạn thứ hai, nhỏ hơn pretraining nhiều bậc độ lớn, lấy một bộ dự đoán văn bản và biến nó thành thứ biết trả lời.
Giai đoạn một: cho nó thấy một câu trả lời trông như thế nào
Liên kết đến mục: Giai đoạn một: cho nó thấy một câu trả lời trông như thế nàoBước đầu tiên là bước ít hào nhoáng nhất và làm phần lớn công việc. Thu thập các ví dụ gồm instruction đi kèm response tốt, rồi tiếp tục huấn luyện trên chúng với đúng loss từ Chương 8 — dự đoán token tiếp theo — nhưng chỉ trên phần response. Đây là supervised fine-tuning, hay SFT.
Không có kiến thức mới nào về ngôn ngữ được dạy ở đây. Thứ được dạy là một định dạng: rằng văn bản có hình dạng này sẽ được theo sau bởi văn bản có hình dạng kia, rồi nó dừng lại. Hãy nhìn lại lỗi của base model. Nó đã trả lời câu hỏi trong câu đầu tiên rồi sau đó không thể dừng, vì chưa từng có gì trong quá trình huấn luyện của nó đánh dấu điểm kết thúc của một response. Dừng lại là một hành vi được học.
Đó cũng là lý do mô hình cần được cho biết các ranh giới nằm ở đâu, và đó chính là vai trò của chat template:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistantCác marker <|im_start|> và <|im_end|> đó là những token thật trong vocabulary, được thêm trước fine-tuning, và mô hình đã thấy hàng triệu marker như vậy ở đúng những vị trí này. Chúng là cách mô hình biết đến lượt ai nói và một lượt kết thúc ở đâu.
Bỏ qua template và đưa cho mô hình một câu hỏi trần, bạn đang đưa cho nó một chuỗi mà nó chưa từng thấy trong huấn luyện. Đo trực tiếp, cùng mô hình, cùng câu hỏi, cùng greedy decoding:
Không có template — chuỗi thô What is the capital of France?:
The capital of France is Paris.
To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.
[...and then it starts writing a
Python script to check its own answer]Có template:
The capital of France is Paris.Câu trả lời đều đúng trong cả hai trường hợp, nhưng khi thiếu marker, mô hình trôi sang viết Python để tự kiểm tra, vì prompt nó nhận không giống bất kỳ thứ gì nó từng được fine-tuning trên đó. Đây là nguyên nhân phổ biến nhất của hiện tượng “mô hình trở nên kém thông minh hơn khi tôi gọi trực tiếp”: template không phải lớp trang trí bao quanh mô hình, nó là một phần của mô hình, và template sai là một sự suy giảm âm thầm, không có lỗi nào báo kèm.
Giai đoạn hai, và vấn đề mà nó được sinh ra để giải quyết
Liên kết đến mục: Giai đoạn hai, và vấn đề mà nó được sinh ra để giải quyếtSFT có một trần giới hạn, và trần đó là dữ liệu. Để fine-tuning trên một demonstration, bạn cần ai đó viết response lý tưởng — và với hầu hết câu hỏi thú vị, viết một câu trả lời tốt là khó, chậm, đắt, và chỉ tạo ra đúng một câu trả lời mà bạn không thể xác minh chất lượng.
Thứ con người làm tốt là so sánh. Khi được cho xem hai response, một annotator có thể nói khá chắc response nào tốt hơn chỉ trong vài giây, dù không thể tự tạo ra cả hai. Đây là sự thật mà toàn bộ giai đoạn thứ hai được xây trên đó, và cũng là phần mà phần lớn lời giải thích thường hiểu ngược:
Con người không viết câu trả lời. Họ xếp hạng các cặp.
Vì vậy dữ liệu là các cặp — một prompt, hai response, và response nào thắng. Dữ liệu đó không thể đưa vào next-token loss, vì không có chuỗi mục tiêu. Nó cần một cỗ máy khác.
Reward model, và nó thật sự học gì
Liên kết đến mục: Reward model, và nó thật sự học gìBạn không thể yêu cầu con người chấm điểm mọi response trong quá trình huấn luyện — đó là hàng triệu phán đoán. Vì vậy bạn huấn luyện một mô hình bắt chước con người: một reward model nhận vào một response và trả về một scalar.
Huấn luyện nó từ các so sánh dùng một kết quả từ năm 1952. Mô hình Bradley–Terry2 nói rằng nếu hai item có sức mạnh tiềm ẩn, xác suất một item thắng item kia là logistic function của hiệu giữa chúng. Đảo chiều ý đó lại và nó trở thành một loss: với việc con người thích hơn , hãy tối đa hóa
mà trong code chính là toàn bộ vòng lặp huấn luyện:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() Hãy chú ý thứ mô hình không bao giờ thấy: một điểm tuyệt đối. Nó chỉ học các chênh lệch, đúng chính xác với thứ dữ liệu chứa.
Giờ đến phần đáng đo. Reward model học những gì annotator đã thưởng, và annotator là con người. Đây là một mô phỏng trong đó chất lượng thật của một response chỉ phụ thuộc vào việc hữu ích và đúng — độ dài không có giá trị gì — nhưng annotator mô phỏng có thiên hướng nhẹ thích câu trả lời dài hơn khi mọi thứ khác gần như ngang nhau, một bias con người đã được ghi nhận rõ. Huấn luyện reward model trên 2000 so sánh và đọc các trọng số của nó:
| bias độ dài của annotator | trọng số học được trên hữu ích | trên đúng | trên độ dài |
|---|---|---|---|
| 0.0 | +1.00 | +1.00 | +0.01 |
| 0.3 | +0.98 | +1.00 | +0.15 |
| 0.6 | +0.97 | +1.00 | +0.27 |
| 1.2 | +1.00 | +0.99 | +0.59 |
Reward model đang hoạt động hoàn hảo. Nó đã học trung thành các preference được cho xem — bao gồm cả phần của những preference đó không liên quan gì đến chất lượng. Reward model không phải thước đo của cái tốt; nó là thước đo của những gì annotator đã chọn, và mọi bias trong nhóm annotation giờ đã là một hệ số trong một hàm khả vi mà một mô hình lớn hơn nhiều sắp tối ưu hóa theo.
Reward hacking, được đo trực tiếp
Liên kết đến mục: Reward hacking, được đo trực tiếpĐiều này đưa ta đến chuyện xảy ra khi bạn tối ưu hóa nó. Hãy cho policy một ngân sách nỗ lực cố định để phân bổ trên các thuộc tính của response, với một bất đối xứng thực tế: hữu ích và đúng là đắt, còn dài hơn thì rẻ — bạn chỉ cần tiếp tục viết.
Reward trên mỗi đơn vị nỗ lực, với mô hình đã huấn luyện ở trên: hữu ích 8,26, đúng 8,31, độ dài 31,70. Độ dài trả lợi gần gấp bốn lần độ đúng, không phải vì reward model bị hỏng, mà vì nó rẻ.
Tối ưu hóa theo reward đó và quan sát cả hai con số:
| điểm của reward model | chất lượng thật | độ dài tạo ra | |
|---|---|---|---|
| policy ban đầu | 12.588 | 0.974 | 3.365 |
| sau tối ưu hóa | 31.696 | 0.000 | 12.497 |
Reward tăng 2,5 lần. Thứ mà reward lẽ ra phải đo đã về không. Policy phát hiện rằng nó có thể đạt điểm cực cao bằng cách viết dài và không nói gì cả, và không phần nào của vòng lặp huấn luyện có cách nhận ra, vì reward model là định nghĩa của cái tốt bên trong vòng lặp.
Đây là reward hacking, và nếu bạn từng thắc mắc vì sao chat model dài dòng đến vậy, bảng này là một phần lớn của câu trả lời.
KL penalty thật sự mua được gì
Liên kết đến mục: KL penalty thật sự mua được gìCách phòng vệ tiêu chuẩn là phạt policy khi nó di chuyển quá xa khỏi nơi nó bắt đầu, đo khoảng cách bằng KL divergence từ Chương 4:
Reference là mô hình SFT — policy trước giai đoạn reinforcement. Tuyên bố là điều này ngăn mô hình lang thang vào hành vi suy biến. Hãy xem bao nhiêu phần của tuyên bố đó còn đứng vững sau khi đo. Cùng thiết lập, quét :
| reward | chất lượng thật | độ dài | KL | |
|---|---|---|---|---|
| 0 | 31.699 | 0.000 | 12.498 | 2.994 |
| 1 | 31.697 | 0.000 | 12.497 | 2.993 |
| 5 | 28.318 | 0.285 | 10.700 | 2.163 |
| 15 | 12.860 | 1.542 | 2.552 | 0.151 |
| 30 | 10.426 | 1.719 | 1.303 | 0.025 |
| 60 | 9.632 | 1.769 | 0.908 | 0.005 |
| chỉ riêng reference model | 9.162 | 1.791 | 0.687 | 0 |
Hãy đọc hàng cuối so với phần còn lại. Ở và , penalty hoàn toàn không làm gì: reward đáng giá hơn KL quá nhiều nên optimiser trả tiền phạt và vẫn hack. Từ 5 đến 15, hành vi dao động mạnh. Và đến , chất lượng thật đã leo trở lại 1,769 — con số này vẫn thấp hơn 1,791 mà reference model có trước khi toàn bộ chuyện này bắt đầu.
Một lưu ý trước khi con số đó được trích dẫn ở bất kỳ đâu: 1,791 ở hàng cuối và 0,974 mà bảng đầu tiên gán cho starting policy là hai phép đo khác nhau của cùng một mô hình trước RL, được hai thí nghiệm thực hiện riêng. Hãy so sánh các hàng trong cùng một bảng, đừng so sánh chéo giữa các bảng — kết luận của mỗi bảng đứng trên các hàng của chính nó, và không kết luận nào phụ thuộc vào baseline của bảng kia.
Vì vậy tóm tắt trung thực không phải là “KL penalty ngăn reward hacking”. Nó là:
KL penalty không ngăn reward hacking. Nó giới hạn policy có thể di chuyển xa khỏi reference đến đâu — và vì thất bại cần có sự di chuyển, điều đó có ích. Nhưng nó là dây xích, không phải cơ chế sửa lỗi: ở thấp, dây xích đứt; ở cao, bạn nhận lại reference model và toàn bộ giai đoạn đắt đỏ chẳng mua được gì.
Dải hữu dụng rất hẹp, vị trí của nó phụ thuộc vào reward model, và không có cách nào tìm ra ngoài việc nhìn vào dữ liệu đo. Đó là lý do reference model phải tốt — KL là sàn ở chất lượng của reference, không phải trần trên thất bại — và đó là một phần lớn lý do giai đoạn này khó trong thực tế chứ không phải trên nguyên lý.
PPO, và vì sao DPO đã thay thế nó
Liên kết đến mục: PPO, và vì sao DPO đã thay thế nóThuật toán khiến cách này hoạt động ở scale là Proximal Policy Optimization.3 Tóm gọn trong một đoạn: nó ước lượng advantage của mỗi response, cập nhật policy để tăng xác suất của các response trên baseline, và clip kích thước của bất kỳ cập nhật đơn lẻ nào để một ước lượng advantage lớn không phá hủy policy chỉ trong một bước. Áp dụng vào language model4 nghĩa là giữ bốn mô hình hoạt động cùng lúc — policy, reference, reward model và critic — với policy liên tục tạo sample mới trong suốt quá trình huấn luyện.
Nó hoạt động, nó đã tạo ra InstructGPT và mọi thứ hậu duệ từ đó, và nó thật sự khó: bốn mô hình trong bộ nhớ, sampling trong vòng lặp huấn luyện, và danh tiếng bất ổn hoàn toàn xứng đáng. Giả vờ rằng bạn có thể triển khai nó trong một bài blog sẽ là không trung thực, nên chương này không làm vậy.
Thứ thay thế nó cho phần lớn mục đích đến từ một quan sát. Objective có KL-regularization ở trên có policy tối ưu dạng đóng, và biểu thức đó có thể được đảo ngược: reward có thể được viết theo policy tối ưu và reference. Thay biểu thức đó ngược vào Bradley–Terry loss làm reward model biến mất hoàn toàn. Thứ còn lại là một supervised loss trên các cặp preference — không sampling, không critic, không reward model, hai mô hình trong bộ nhớ thay vì bốn.
Đó là Direct Preference Optimization,5 và nó gồm hai dòng:
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
"""pi_* and ref_* are summed log-probabilities of a full response."""
logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
return -F.logsigmoid(logits) Hãy đọc điều nó nói. Đại lượng được đẩy lên là policy thích winner nhiều hơn reference từng thích bao nhiêu, trừ đi mức nó thích loser nhiều hơn bao nhiêu. Reference không phải một penalty được gắn thêm sau đó — nó nằm bên trong loss, đó là lý do DPO không cần một hạng KL riêng.
Tính chất quan trọng nhất nằm ở gradient. Đánh giá loss và gradient của nó trên cùng một cặp ở năm trạng thái khác nhau của policy:
| trạng thái của policy | loss | độ lớn gradient |
|---|---|---|
| đã rất thích winner | 0.5130 | 0.0401 |
| đã thích winner, nhưng yếu | 0.6685 | 0.0488 |
| giống hệt reference | 0.6931 | 0.0500 |
| thích loser | 0.7981 | 0.0550 |
| rất thích loser | 1.0055 | 0.0634 |
Gradient tăng khi policy sai nhiều hơn. Những cặp mô hình đã xử lý tốt gần như không đóng góp gì; những cặp nó làm ngược lại mới chi phối cập nhật. DPO gán trọng số cho mỗi ví dụ theo mức policy hiện đang sai, một cách tự động, không cần scheduling — và cơ chế tự gán trọng số đó đang làm phần việc mà ước lượng advantage và critic của PPO từng làm. (Loss ở hàng thứ ba đúng bằng , đây là mốc để kiểm tra bất kỳ implementation nào: một policy giống hệt reference của nó chưa học được gì và phải nằm ở .)
GRPO6 đi một đường khác để thoát khỏi cùng vấn đề. Nó giữ vòng lặp sampling nhưng xóa critic: thay vì huấn luyện một mô hình dự đoán baseline, nó sample một nhóm response cho cùng một prompt và dùng mean reward của nhóm đó trực tiếp làm baseline. Advantage của một response là nó tốt hơn các response anh em của mình bao nhiêu. Đổi lại, bạn thay một mô hình nguyên vẹn bằng một batch lớn hơn, và đó là điều đã khiến huấn luyện bằng verifiable reward — chủ đề của Chương 12 — trở nên thực tế.
Hiện chi tiết
Ba mảnh nữa của bức tranh post-training, thật ngắn gọn.
RLAIF và Constitutional AI.7 Annotator không nhất thiết phải là con người. Đưa cho một mô hình một bộ nguyên tắc viết sẵn và yêu cầu nó phê bình rồi sửa các đầu ra của chính nó, hoặc chọn giữa hai candidate, và bạn có một preference dataset được tạo ra với tốc độ và chi phí của máy. Phản đối hiển nhiên — mô hình đang tự chấm bài của mình — là có thật, và câu trả lời trung thực là nó hoạt động tốt hơn nghe có vẻ vì đánh giá dễ hơn tạo sinh, cũng chính là bất đối xứng mà toàn bộ chương này dựa vào.
LIMA, và việc cần ít dữ liệu đến mức nào.8 Một nghìn demonstration được tuyển chọn kỹ đã tạo ra một assistant cạnh tranh được. Giải thích được đề xuất là pretraining đã cài sẵn kiến thức và định dạng, còn post-training chỉ cần chọn hành vi nào trong số các hành vi hiện có của mô hình sẽ được đưa ra bề mặt. Nếu điều đó đúng, chất lượng dữ liệu post-training quan trọng hơn số lượng — và hành vi của lĩnh vực này kể từ đó cho thấy mọi người tin như vậy.
LoRA và QLoRA.910 Fine-tuning mọi weight của một mô hình lớn cần bộ nhớ cho weight, gradient của chúng và trạng thái optimiser — mười sáu byte trên mỗi tham số của Chương 10, trên hai trung bình mà Chương 6 đã tự tay xây — ở một scale cần cả cluster. LoRA đóng băng các weight gốc và huấn luyện một cặp ma trận low-rank bên cạnh chúng, cắt giảm số tham số có thể huấn luyện theo nhiều bậc độ lớn; QLoRA còn quantize base đã đóng băng xuống 4 bit. Cả hai được nhắc ở đây như technique. Việc fine-tuning có phải là thứ đáng chi tiền hay không lại là một câu hỏi khác, và là câu hỏi của Chương 20.
Alignment tax, và câu hỏi chưa ai trả lời
Liên kết đến mục: Alignment tax, và câu hỏi chưa ai trả lờiCó hai điều cần mang theo.
Điều thứ nhất là giai đoạn này có chi phí, và nó thể hiện dưới dạng capability. Các mô hình thường tệ hơn một cách đo được ở một số benchmark task sau alignment training — alignment tax — vì objective đã thay đổi: một response an toàn, dè dặt và đúng định dạng không phải lúc nào cũng là response tối đa hóa độ chính xác. Một phần khoảng cách đó đã được kỹ thuật hóa để giảm đi, và một phần là trade-off thật chứ không phải bug cần sửa.
Điều thứ hai là câu hỏi mà từ aligned che giấu. Aligned với ai? Chuỗi là: một công ty viết guideline, contractor diễn giải chúng, các so sánh của họ huấn luyện reward model, reward model định hình policy, và policy trả lời câu hỏi từ một người chưa từng thấy bất kỳ phần nào trong chuỗi đó. Mỗi mắt xích là một lựa chọn do những con người cụ thể đưa ra, và không thuật toán nào trong chương này có ý kiến gì về việc các lựa chọn đó có tốt hay không.
Đó không phải một thủ pháp tu từ. Đó là lý do cụ thể khiến hai frontier model từ chối những yêu cầu khác nhau, vì sao cùng một mô hình đổi ý giữa các phiên bản, và vì sao “aligned” là mô tả của một quá trình hơn là một thuộc tính của một tạo vật. Phần toán học trong chương này đã ổn định. Phần đó thì chưa.
Tiếp theo sẽ đi đâu
Liên kết đến mục: Tiếp theo sẽ đi đâuPost-training đã dạy mô hình trả lời. Nó chưa dạy mô hình suy nghĩ trước khi trả lời, và hai điều đó khác nhau theo một cách hóa ra có thể huấn luyện được.
Chương 12 nói về điều xảy ra khi bạn để một mô hình dùng nhiều tính toán hơn cho một câu hỏi khó ở thời điểm trả lời thay vì ở thời điểm huấn luyện — chain of thought, reinforcement learning từ verifiable reward, và lý do một mô hình trình bày bước làm của mình không chỉ đang giải thích bản thân mà đang tính toán theo một cách khác. Chương đó cũng trả món nợ từ chương này: GRPO xuất hiện trong đó, làm công việc mà critic của PPO từng làm, trên các reward không cần annotator nào cả vì một proof hoặc kiểm tra được, hoặc không.
Nguồn và phương pháp
Liên kết đến mục: Nguồn và phương phápCác generation ở trên đến từ gpt2 và Qwen/Qwen2.5-0.5B-Instruct với greedy decoding, nên chúng tái lập chính xác. Chương 11 của Hugging Face LLM Course hướng dẫn SFT và DPO với trl và peft nếu bạn muốn chạy thứ thật thay vì mô phỏng; chương 7 trong Build a Large Language Model (From Scratch) của Sebastian Raschka triển khai instruction fine-tuning từ đầu đến cuối mà không cần thư viện.
Tài liệu tham khảo
Liên kết đến mục: Tài liệu tham khảo-
Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). Việc ủy quyền này là có chủ ý: hộp từ vựng ở trên là tập con nhỏ nhất còn dùng được, còn chủ đề thật sự là cả một cuốn sách. ↩
-
Bradley, R. A. and Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). Mô hình so sánh theo cặp nằm dưới mọi reward model đang được dùng hôm nay. ↩
-
Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017). ↩
-
Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — bài báo đã biến công thức ba giai đoạn thành chuẩn. Trước đó là Christiano et al. (arXiv:1706.03741), giới thiệu việc học reward model từ so sánh của con người, và Stiennon et al. (arXiv:2009.01325), áp dụng nó vào summarisation. ↩
-
Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). Phần suy dẫn loại bỏ reward model nằm ở mục 4 và đáng đọc trọn vẹn; nó ngắn hơn danh tiếng của nó. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Giới thiệu GRPO ở mục 4.1. ↩
-
Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022). ↩
-
Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023). ↩
-
Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021). ↩
-
Dettmers, T., Pagnoni, A., Holtzman, A. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩