llm-course-hw1: маленькая языковая модель для русских анекдотов
Домашнее задание 1 курса по большим языковым моделям (ВШЭ): byte-level BPE токенизатор и Transformer-декодер, написанные с нуля на PyTorch и обученные на датасете IgorVolochay/russian_jokes.
Токенизатор
Byte-level BPE, обученный на тренировочной части датасета, претокенизация регулярным выражением из GPT-2.
| Параметр | Значение |
|---|---|
| Размер словаря | 4096 |
| Число слияний | 3839 |
| Специальный токен | [EOS] (id 4095, он же используется как pad) |
| Файлы | vocabulary.json, merges.json |
Архитектура
Decoder-only Transformer, конфигурация mini (словарь 4096):
| Параметр | Значение |
|---|---|
| Слоев | 6 |
| Голов внимания / KV-голов (GQA) | 6 / 3 |
| Размер скрытого слоя | 384 |
| Промежуточный размер SwiGLU | 1024 |
| Длина контекста | 128 |
| Dropout | 0.1 |
| Параметров | 12.88M |
Позиционное кодирование ALiBi (линейный штраф за расстояние до ключа, наклоны 2^(-8h/n)), Grouped-Query Attention, SwiGLU в feed-forward блоке, pre-normalization через RMSNorm, линейные слои без bias.
Обучение
| Параметр | Значение |
|---|---|
| Данные | train/test split 90/10 (seed 12648430): 130192 / 14449 текстов, без дубликатов, тексты от 20 до 500 символов |
| Оптимизатор | AdamW, lr 0.0006, weight decay 0.01 |
| Scheduler | линейный warmup 10% шагов, затем линейное затухание до нуля |
| Шагов / batch size | 8000 / 64 |
| Clip grad norm | 1.0 |
| Устройство | cuda |
Loss: cross-entropy на предсказании следующего токена, позиции паддингов исключены из loss по attention mask.
Качество
| Метрика на тестовой части | Значение |
|---|---|
| Cross-entropy loss | 3.603 |
| Perplexity | 36.7 |
Примеры генерации
Параметры: do_sample=True, top_k=10, max_new_tokens=200, seed 12648430. Модель маленькая, поэтому связность текста в основном локальная.
Промпт: Заходит в бар
Модель: Заходит в бар в бар и видит, как он сидит за столиком и спрашивает: - Что это такое? - Это не я, а в аптеке. - А в чем дело? - Это когда я ем, то и думаю, что это у вас. Продавец: - Это не то, что вы тут на работе.[EOS]
Промпт: Штирлиц пришел домой
Модель: Штирлиц пришел домой с работы и сказал: "Волгончик. Убери свои руки и у него же не было".[EOS]
Промпт: Приходит муж с работы
Модель: Приходит муж с работы, а жена его спрашивает:- Что случилось?Жена:- Я не умею в том месте, я смотрю, что у тебя нет ни слова.[EOS]
Промпт: Сидят два программиста
Модель: Сидят два программиста, а один у другого спрашивает: - Ты что делаешь? - Да вот, я вот вчера ночью на машине, в магазине, так в сапоге входит. - А что? - А ты что, на солнце смотрел? - А я на нее схватил. - А че ты так, я же не понял? - А че я тогда пойду?[EOS]
Как использовать
Классы ByteLevelBPETokenizer и TransformerForCausalLM берутся из ноутбука домашнего задания:
tokenizer = ByteLevelBPETokenizer.from_pretrained("spybro/llm-course-hw1")
model = TransformerForCausalLM.from_pretrained("spybro/llm-course-hw1").eval()
input_ids = torch.tensor(tokenizer.encode("Штирлиц пришел домой"))[None, :]
output = model.generate(input_ids, max_new_tokens=200, eos_token_id=tokenizer.eos_token_id, do_sample=True, top_k=10)
print(tokenizer.decode(output[0].tolist()))
- Downloads last month
- 128