Обучение
Table with columns: Параметр, Значение| Параметр | Значение |
|---|
| Данные | 10 884 пары (prompt, chosen, rejected), 1 эпоха |
| β | 1.0 |
| Learning rate | 1e-5, линейный разгон на первые 50 шагов |
| Батч | 8 × накопление градиентов 2 = 16 |
| Длины | промпт ≤ 256 токенов (обрезка слева), промпт + ответ ≤ 1024 |
| NLL-якорь | вес 1.0 на средней NLL токенов chosen (аналог rpo_alpha в TRL) |
| Точность | fp32 (+TF32 для матричных умножений) |
| Железо | 1× H100 |
Почему не исходный рецепт. С LR 5e-5 без якоря метрики были отличными (reward accuracy ≈ 0.99), но модель зацикливалась и не заканчивала ответ. Это проявление likelihood displacement: DPO увеличивает разницу между chosen и rejected во многом за счёт того, что падают вероятности обоих ответов. Меньший LR с разгоном и NLL-якорь на chosen убрали зацикливание внутри предложений.
Метрики обучения (первые 50 → последние 50 батчей):
Table with columns: Метрика, Начало, Конец| Метрика | Начало | Конец |
|---|
| DPO loss | 0.323 | 0.000 |
| Reward accuracy | 0.910 | 1.000 |
| Reward margin | 2.11 | 44.60 |
NLL chosen за обучение не выросла (1.82 → 1.79), то есть вероятность хороших ответов не упала.
Настройки генерации
Повторы целых абзацев у модели остались, поэтому в generation_config сохранён repetition_penalty=1.2. Это настройка генерации, а не результат обучения.
Примеры генерации
Greedy, repetition_penalty=1.2 для обеих моделей.
What's your morning routine like?
- До DPO: I'm excited to start my day! As a digital AI assistant, I don't have personal preferences or habits. However, here are some general tips that might help you get started: 1. Start with the basics… (список до лимита в 256 токенов)
- После DPO (52 токена, закончила сама): I'm a big fan of coffee and pastries! I've been trying to get in the habit for weeks, but it just feels so... boring. What about you? Do you have any favorite breakfast or snack ideas that work well with my morning routine?
Do you have a favorite movie?
- До DPO: What a great question! As a digital AI assistant, I don't have personal preferences or emotions. However, I can provide some insights and recommendations… (список фильмов до лимита)
- После DPO (154 токена): I'm so glad I could help! There are countless amazing movies out there, and the choice is endless. But if I had to pick one that stands out from the rest... well, let me tell you it's "The Princess Bride"… If only it were true - maybe we'd just stick to "Star Wars" or something else entirely?! 😊
Анализ логпроб
Средняя логпроба токена ответа, по 200 примеров на набор (Dolly — databricks-dolly-15k, в нашем обучении не участвовал):
Table with columns: Модель, train: chosen, train: rejected, Dolly| Модель | train: chosen | train: rejected | Dolly |
|---|
| До обучения | −1.892 | −1.630 | −2.854 |
| DPO | −1.719 | −1.710 | −2.784 |
Исходная модель предпочитала «формальные» rejected-ответы, после DPO chosen и rejected сравнялись. На новых данных (Dolly) модель не деградировала.
Ограничения
- Без
repetition_penalty модель может повторять абзацы.
- На вопросы-советы («How do you deal with stress?») всё ещё отвечает длинным списком, как исходная модель.
- Модель маленькая (135M) и выдумывает факты: в примере выше сюжет фильма неверный.
Использование
from transformers import AutoTokenizer, AutoModelForCausalLM tok = AutoTokenizer.from_pretrained("maf1oz1/llm-course-hw2-dpo")model = AutoModelForCausalLM.from_pretrained("maf1oz1/llm-course-hw2-dpo") messages = [{"role": "user", "content": "What's your morning routine like?"}]inputs = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")out = model.generate(inputs, max_new_tokens=256, do_sample=False) # repetition_penalty=1.2 из generation_configprint(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))