llm-course-hw2-reward-model

Reward model на базе SmolLM-135M-Instruct с линейной головой (AutoModelForSequenceClassification, num_labels=1), обученная RewardTrainer из TRL на парах из HumanLLMs/Human-Like-DPO-Dataset (Bradley–Terry loss). Использовалась как reward и value model для PPO.

Задание

Домашнее задание 2 курса по LLM: алайнмент SmolLM-135M-Instruct на датасете преференсов HumanLLMs/Human-Like-DPO-Dataset: chosen-ответы в нём эмоциональные и «человечные», rejected — сухие ответы в духе «As an AI language model…».

  1. DPO реализован с нуля: подготовка данных через chat template, лосс, лог-вероятности ответов, цикл обучения.
  2. Reward model (AutoModelForSequenceClassification с линейной головой) обучена RewardTrainer из TRL.
  3. PPO обучен PPOTrainer из TRL (trl==1.11.0, модуль trl.experimental.ppo) с этой reward model.

Данные разбиты 90/10 (train_test_split(test_size=0.1, seed=42)): 9795 пар для обучения и 1089 отложенных пар для оценки; разбиение общее для всех трёх моделей.

Обучение

параметр значение
trainable parameters только линейная голова score (бэкбон заморожен)
learning rate 0.0003
epochs 1
batch size 16
max length 1024
loss -log σ(r(x, y_w) − r(x, y_l))
precision bf16 autocast

Качество на отложенной части

метрика значение
accuracy (RewardTrainer.evaluate) 0.9991
accuracy (1089 пар, награда на < im_end
средняя награда chosen 0.830
средняя награда rejected -4.939

Сравнение моделей на отложенных промптах

128 отложенных промптов, сэмплирование с temperature 0.7, до 128 новых токенов. rm_score — средняя награда reward model из этой коллекции, emoji_rate — доля ответов с эмодзи, ai_phrase_rate — доля ответов с шаблонами вроде «as an AI», mean_tokens — средняя длина, eos_rate — доля ответов, закончившихся EOS.

model rm_score emoji_rate emoji_per_response ai_phrase_rate mean_tokens eos_rate
SFT (ref) -3.071 0.000 0.000 0.352 125.867 0.031
DPO · beta_0.1 -1.844 0.320 1.320 0.008 117.375 0.156
PPO · base -2.822 0.000 0.000 0.320 128.000 0.000

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

Награда — логит на последнем не-pad токене, то есть на <|im_end|> реплики ассистента. Чат-шаблон токенизатора в этом репозитории не добавляет перевод строки после последней реплики, а pad — отдельный токен <|endoftext|>; именно в этой позиции награду читает PPOTrainer.

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

repo = "Timur-th/llm-course-hw2-reward-model"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo)

def reward(prompt, response):
    messages = [{"role": "user", "content": prompt}, {"role": "assistant", "content": response}]
    text = tokenizer.apply_chat_template(messages, tokenize=False)
    inputs = tokenizer(text, return_tensors="pt", add_special_tokens=False)
    with torch.no_grad():
        return model(**inputs).logits[0, 0].item()

print(reward("Do you have a favorite movie?", "Oh, I love Spirited Away! 🎬 What about you?"))
print(reward("Do you have a favorite movie?", "As an AI language model, I do not have personal preferences."))

Связанные репозитории

Downloads last month
47
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 Timur-th/llm-course-hw2-reward-model

Finetuned
(225)
this model

Dataset used to train Timur-th/llm-course-hw2-reward-model

Collection including Timur-th/llm-course-hw2-reward-model