Reward model на SmolLM-135M-Instruct (Human-Like)

Reward model из домашнего задания 2 курса по LLM (DPO и PPO). Выдаёт одно число: насколько ответ похож на «живой» разговорный, а не на шаблонный ответ ассистента. Использовалась как reward и value model для PPO-модели.

Другие модели из этого задания: DPO, PPO.

Обучение

Параметр Значение
Архитектура LlamaForSequenceClassification, num_labels=1
Что обучается только линейный слой score (576 параметров), backbone заморожен
Данные HumanLLMs/Human-Like-DPO-Dataset в формате implicit prompt, split 90/10 (9 795 / 1 089)
Тренер RewardTrainer из TRL 0.15.2
Эпохи / батч / LR 1 / 16 / 3e-4
max_length 1024
Время ~1 минута на 1× H100 (612 шагов)

Важная деталь — pad-токен. В transformers 4.48 LlamaForSequenceClassification берёт оценку с токена перед первым pad-токеном. Если сделать pad_token = eos_token (<|im_end|>), первым окажется конец реплики пользователя: модель оценивает только промпт, одинаковый у chosen и rejected, и лосс стоит на 0.693 с нулевым градиентом. Поэтому pad_token = "<|endoftext|>": этот токен в тексте не встречается.

Качество

Лосс за эпоху: в среднем 0.104, к концу обучения около 0.04. На примере из тестовой части награда chosen — 4.07, rejected — −0.51.

Модель обучала только линейный слой поверх замороженных признаков, поэтому оценивает в основном стиль (разговорный тон, встречный вопрос), а не полезность ответа. При PPO это проявилось: политика научилась давать короткие разговорные реплики почти без содержания.

Использование

Ответ нужно подавать в chat-template, вместе с промптом:

from transformers import AutoTokenizer, AutoModelForSequenceClassification

tok = AutoTokenizer.from_pretrained("maf1oz1/llm-course-hw2-reward-model")
rm = AutoModelForSequenceClassification.from_pretrained("maf1oz1/llm-course-hw2-reward-model")

chat = [
    {"role": "user", "content": "What's your morning routine like?"},
    {"role": "assistant", "content": "Coffee first, always! What about you?"},
]
inputs = tok(tok.apply_chat_template(chat, tokenize=False), return_tensors="pt")
print(rm(**inputs).logits[0].item())
Downloads last month
43
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for maf1oz1/llm-course-hw2-reward-model

Finetuned
(225)
this model

Dataset used to train maf1oz1/llm-course-hw2-reward-model