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
Safetensors
Model size
13M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train spybro/llm-course-hw1