ORPO — SFT + preference 1 lần duy nhất, bỏ pipeline nhiều stage
ORPO kết hợp supervised fine-tuning và preference alignment thành một giai đoạn duy nhất bằng odds ratio, loại bỏ hoàn toàn reference model và đơn giản hóa pipeline alignment từ 3 bước xuống 1.
Bạn đã chán ngán với pipeline RLHF 3 giai đoạn (SFT → Reward Model → PPO) và thấy DPO vẫn còn "cồng kềnh" vì phải load 2 model? ORPO là câu trả lời: chỉ cần một giai đoạn, một model duy nhất, vừa học nói vừa học sở thích người dùng cùng lúc. Không reference model, không RL loop phức tạp—chỉ là fine-tuning thông thường với một loss function đặc biệt.
Alignment truyền thống bị ám ảnh bởi "pipeline complexity":
RLHF cổ điển: SFT để model biết nói → train Reward Model để đánh giá → chạy PPO để optimize. Ba stage, ba model, ba lần load data.
DPO (Direct Preference Optimization): Tiến bộ lớn khi bỏ reward model và RL loop, nhưng vẫn cần giữ reference model (π_ref) frozen trong memory để tính KL divergence. Training 7B model cần VRAM cho 14B parameters—và bạn phải lo lắng về distribution shift khi policy π_θ drift xa reference.
Vấn đề sâu hơn: Tại sao phải dạy model nói đúng trước, rồi mới dạy nó nói haysau? Đây là pedagogical inconsistency—giống như bắt học sinh viết văn hoàn chỉnh trước, rồi mới dạy cách không viết lung tung.
ORPO (Odds Ratio Preference Optimization) đặt câu hỏi: Nếu model đang học trả lời câu hỏi "Paris là thủ đô Pháp", tại sao không dạy nó ngay lập tức rằng "London là thủ đô Pháp" là sai?
Thay vì tách biệt SFT và preference learning, ORPO monolithic hóa quá trình:
1. Odds Ratio thay cho Relative Probability
DPO so sánh π_θ với π_ref: "Tôi khác reference bao nhiêu phần trăm?"
ORPO so sánh trong chính π_θ: "Câu đúng có odds cao hơn câu sai bao nhiêu?"
Odds của một câu trả lời y được định nghĩa là:
odds(y) = P(y|x) / (1 - P(y|x))
Khi P(y) → 1 (model rất tự tin), odds → ∞. Khi P(y) → 0, odds → 0. Odds ratio giữa câu thắng (y_w) và câu thua (y_l):
OR = odds(y_w) / odds(y_l)
Nếu OR = 100, nghĩa là câu đúng có khả năng xảy ra cao gấp 100 lần câu sai (theo model hiện tại). Loss function đơn giản là maximize log(OR), tức là:
L_OR = -log[odds(y_w) / odds(y_l)]
2. Self-Referential Learning
Điểm mấu chốt: Không cần reference model. Tất cả probabilities đến từ model đang train (π_θ). Khi model còn "ngu" (early training, P(y) thấp cho cả hai câu), raw probability gap có thể nhỏ, nhưng odds ratio vẫn phân biệt được đâu tốt hơn đâu. Khi model giỏi lên, odds ratio tự động đẩy câu đúng lên gần 1.0 và câu sai xuống gần 0.0.
3. The "Minor Penalty" Philosophy
ORPO không cố gắng đè bẹp câu sai xuống 0 probability (điều này dễ gây mode collapse). Thay vào đó, nó chỉ cần câu đúng có odds cao hơn câu sai một margin nào đó. Điều này giữ được diversity của generation trong khi vẫn đảm bảo quality ranking.
That's it. Không cần π_ref, không cần reward model riêng. Chỉ là cross-entropy loss quen thuộc cộng thêm một số hạng nhỏ "phạt" khi model thích câu sai hơn câu đúng.
Tương đương với việc maximize log-probability của y_w đồng thời minimize log-probability của y_l, nhưng thông qua odds thay vì raw probability.
Tại sao odds tốt hơn raw probability trong early training?
Khi model chưa converge, cả P(y_w) và P(y_l) đều nhỏ (ví dụ 0.01 vs 0.001). Raw gap là 0.009—khó học. Nhưng odds ratio là (0.01/0.99)/(0.001/0.999) ≈ 10. Một con số rõ ràng để optimize. Odds ratio tự động rescale signal theo mức độ uncertainty của model.
Memory Efficiency:
DPO cần giữ cả π_θ (trainable) và π_ref (frozen, cần forward pass để tính reference probability). Điều này gần như double memory usage (2x parameters + 2x activations). ORPO chỉ cần π_θ. Với model 7B, bạn tiết kiệm ~50% VRAM so với DPO—biến những GPU 24GB thành có thể train alignment cho model lớn.
Resource-constrained fine-tuning: Train alignment trên single GPU consumer (RTX 4090 24GB) cho model 7B-13B mà không cần QLoRA.
Rapid iteration: Không cần chờ SFT xong mới bắt đầu alignment. Một lệnh chạy từ base model đến aligned model.
Deployment simplicity: Production serving chỉ cần 1 model checkpoint, không cần giữ reference model để tính KL penalty.
Limitations cần lưu ý:
Vẫn cần paired data: Khác với KTO (chỉ cần binary good/bad), ORPO vẫn đòi hỏi cặp (win, lose) cho mỗi prompt. Không dùng được cho scalar rewards hay unpaired feedback.
Numerical instability: Khi model quá tự tin (P(y) → 1.0), term (1-P(y)) → 0 gây overflow trong log. Cần clamping hoặc epsilon nhỏ.
Multi-turn chưa chứng minh: Hiệu quả được validate chủ yếu trên single-turn QA và instruction following. Tính ổn định trên conversation dài với evolving context chưa được nghiên cứu sâu.
Ai đang dùng?
HuggingFace TRL đã implement ORPOTrainer từ v0.9.
Các fine-tune community (Mistral-ORPO, Llama-ORPO variants) trên HuggingFace Hub.
Startups cần alignment nhanh không có infrastructure RLHF phức tạp.