Дофіно-tuning LLM методом ORPO
ORPO (Odds Ratio Preference Optimization) — метод дофіно-tuning з перевагами, запропонований Hong et al. (2024). Ключевою відмінністю від DPO: ORPO об'єднує SFT та preference optimization в один крок, не потребує окремої reference model та використовує odds ratio замість log-ймовірностей для штрафування небажаних відповідей.
ORPO vs DPO: технічні відмінності
DPO:
- Потребує SFT-дофіно-tuned reference model
- Тримає дві моделі в пам'яті (trained + reference) або використовує PEFT-трюки
- Оптимізує: log-відношення ймовірностей
- Гіперпараметр β визначає силу KL-штрафу
ORPO:
- Reference model не потрібна
- Одна модель у пам'яті
- Оптимізує SFT loss + OR-weighted rejection loss одночасно
- Гіперпараметр λ (lambda) — вага odds ratio loss
L_ORPO = L_SFT + λ * L_OR
L_SFT = -log P(y_w | x) # звичайний SFT loss на chosen відповідях
L_OR = -log(sigmoid(log(odds_ratio(y_w, x) / odds_ratio(y_l, x))))
де odds_ratio(y, x) = P(y|x) / (1 - P(y|x))
Реалізація ORPO через TRL
from trl import ORPOTrainer, ORPOConfig
from peft import LoraConfig
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3.1-8B-Instruct",
torch_dtype=torch.bfloat16,
device_map="auto"
)
orpo_config = ORPOConfig(
output_dir="./orpo-model",
num_train_epochs=3,
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=8e-6, # ORPO зазвичай потребує нижчий lr, ніж SFT
lr_scheduler_type="linear",
warmup_ratio=0.1,
beta=0.1, # λ в ORPO — вага OR loss (у TRL називається beta)
max_length=2048,
max_prompt_length=512,
bf16=True,
remove_unused_columns=False,
logging_steps=10,
)
trainer = ORPOTrainer(
model=model,
args=orpo_config,
train_dataset=train_dataset, # Формат: prompt, chosen, rejected
eval_dataset=eval_dataset,
peft_config=LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
task_type="CAUSAL_LM",
),
)
trainer.train()
Формат датасету для ORPO
Ідентичний DPO — пари переваг:
dataset = {
"prompt": "Як правильно написати технічне завдання?",
"chosen": "Технічне завдання включає декілька обов'язкових розділів: мета проекту, функціональні вимоги (з пріоритетами за MoSCoW), нефункціональні вимоги (продуктивність, безпека), обмеження, критерії прийняття...",
"rejected": "Пиши що ти хочеш, щоб розробники зрозуміли завдання"
}
Порівняння ефективності: ORPO vs DPO vs SimPO на практиці
Незалежні бенчмарки на AlpacaEval 2.0 (Win Rate vs GPT-4 Turbo):
| Метод | Win Rate | Пам'ять (7B) | Час навчання |
|---|---|---|---|
| SFT only | ~5% | 1× | 1× |
| DPO | ~15–20% | 2× (ref model) | 1.3× |
| ORPO | ~18–22% | 1× | 1× |
| SimPO | ~20–25% | 1× | 1× |
ORPO перевищує DPO за ефективністю пам'яті при порівнянній якості. SimPO (Simple Preference Optimization) — свіжіший метод, який часто показує дещо кращі результати.
Практичний case study: вирівнювання коду під стандарти команди
Завдання: дофіно-tune модель для code review під конкретні стандарти коду компанії — правила найменування, обов'язкові паттерни безпеки, заборонені практики.
Проблема з чистим SFT: модель добре відтворює «правильні» ревю, але не штрафує за ігнорування нарушень. Потрібна штрафна складова.
ORPO-датасет: 1800 пар. Chosen — ревю, що виявляє всі нарушення стандартів. Rejected — ревю, яке пропустило критичні нарушення або генерувало хибні зауваження.
Базова модель: Qwen2.5-Coder-7B-Instruct.
Конфігурація: ORPO, β=0.1, lr=5e-6, 2 епохи.
Результати:
- Recall нарушень стандартів: 0.67 → 0.91
- Precision зауважень (без хибних позитивів): 0.71 → 0.88
- False negative rate (пропуск критичних нарушень): 28% → 7%
- Час навчання: 3.5ч на 1×A100 40GB (без overhead reference model)
ORPO vs DPO: коли вибирати
Вибирайте ORPO:
- Обмежені GPU-ресурси (одна модель замість двох)
- Немає хорошої SFT-дофіно-tuned reference model
- Завдання середньої складності alignment
Вибирайте DPO:
- Вже є високоякісна SFT reference model
- Потрібна точна настройка KL-дивергенції
- Накопиче досвід роботи з DPO пайплайном
Вибирайте SimPO:
- Потрібен максимальний win rate на бенчмарках
- Є ресурси на підбір γ та β параметрів
Часові рамки
- Збір датасету переваг: 3–5 тижнів
- ORPO навчання (7B, LoRA, A100): 3–8 годин
- λ/β ітерації: 3–5 днів
- Оцінка (LLM-as-judge + людина): 1 тиждень
- Всього: 5–8 тижнів







