Обучение
Table with columns: Параметр, Значение| Параметр | Значение |
|---|
| Policy / reference | SmolLM-135M-Instruct (та же база, что у reward model) |
| Reward / value model | maf1oz1/llm-course-hw2-reward-model |
| Данные | промпты датасета, train/test 75/25 |
| Эпохи | 1 (510 шагов; по умолчанию в PPOConfig стоит 3) |
| Батч / PPO-эпох на батч | 16 / 4 |
| Learning rate | 1e-5 |
| Длина ответа при обучении | 64 токена |
stop_token | "eos" (без него TRL обнуляет eos_token_id в настройках генерации политики, и после обучения модель не останавливается) |
missing_eos_penalty | 1.0 |
| Железо / время | 1× H100, ~20 минут |
Метрики
Среднее за первые 20 → последние 20 шагов:
Table with columns: Метрика, Начало, Конец| Метрика | Начало | Конец |
|---|
| Награда reward model | 0.51 | 3.40 |
| KL к исходной модели | 2.1 | 17.2 |
Примеры генерации
Greedy, repetition_penalty=1.2 для обеих моделей. До PPO каждый ответ упирался в лимит 256 токенов и начинался с «As a digital AI assistant…» или шаблонного списка советов.
Table with columns: Вопрос, После PPO| Вопрос | После PPO |
|---|
| What's your morning routine like? | I'm a busy person, but I've got my daily routine set up for you. What do you think is the most important thing to start with today? (33 токена) |
| Do you have a favorite movie? | I don't have a personal preference, but I'd be happy to share with you my top 10 favorite movies of all time. What's your name? (34 токена) |
| How do you deal with stress? | Dealing with stress is a crucial aspect of maintaining overall well-being. Here are some strategies to help you cope: (25 токенов) |
Выводы
PPO изменил поведение модели: ответы стали короткими и разговорными, со встречным вопросом, и модель сама заканчивает ответ. Цена — содержательность: ответ про стресс заканчивается на вступлении к списку. Это прямое следствие устройства награды:
- лимит в 64 токена вместе со штрафом за незаконченный ответ толкают к краткости;
- reward model с одним обученным линейным слоем оценивает в основном стиль, а не полезность.
Рост KL до 17 показывает, что модель заметно ушла от исходной туда, где reward model даёт высокую награду. Это наглядный пример того, что RL оптимизирует ровно то, что награждают.
Анализ логпроб
Средняя логпроба токена ответа, по 200 примеров на набор (Dolly — databricks-dolly-15k, в нашем обучении не участвовал):
Table with columns: Модель, train: chosen, train: rejected, Dolly| Модель | train: chosen | train: rejected | Dolly |
|---|
| До обучения | −1.892 | −1.630 | −2.854 |
| PPO | −2.007 | −1.758 | −2.734 |
PPO не обучается на ответах датасета, поэтому логпробы chosen и rejected немного упали: модель сместилась к своим коротким ответам.
Использование
from transformers import AutoTokenizer, AutoModelForCausalLM tok = AutoTokenizer.from_pretrained("maf1oz1/llm-course-hw2-ppo")model = AutoModelForCausalLM.from_pretrained("maf1oz1/llm-course-hw2-ppo") 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)print(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))
В токенизатор этого репозитория при обучении PPO добавлен отдельный токен [PAD], которого нет в словаре модели. Для генерации одного промпта это не важно, а для батчей с паддингом поставьте tok.pad_token = tok.eos_token.