Homework 1: Byte-level BPE and Transformer

Учебная авторегрессионная модель для продолжения русских анекдотов. Токенизатор и Transformer реализованы в домашней работе. Внешние предобученные веса не использовались.

Файлы и запуск

  • model.safetensors: финальные веса модели.
  • config.json: конфигурация финальной архитектуры.
  • vocabulary.json и merges.json: соответствующий весам Byte-level BPE, 4096 токенов.
  • model.py: определения модели и токенизатора из ноутбука.
  • generate.py: самостоятельный пример генерации.
  • HSE_hw1_bpe_and_transformer-Zassimuk.ipynb: исходный ноутбук с реализацией, экспериментами, сохранёнными результатами и выводами.

Модель использует собственные классы из model.py; пример не требует Transformers AutoModel или повторного обучения.

Пример проверен в чистом окружении Python 3.11 с PyTorch 2.5.1 на CPU: финальные веса загрузились, encode/decode прошли проверки на русском, пробелах, emoji и китайских символах; генерация для «Штирлиц пришел домой» совпала с приведённым ниже результатом из ноутбука.

pip install -r requirements.txt
python generate.py --prompt "Штирлиц пришел домой"

Чтобы скачать все файлы репозитория, включая исходный код, в Python:

from huggingface_hub import snapshot_download
folder = snapshot_download("WhyZosa/hw1-russian-jokes")
print(folder)

После скачивания запустите python /путь/к/скачанной/папке/generate.py. Для публичного репозитория загрузка не требует авторизации. GPU используется при наличии CUDA; иначе пример работает на CPU, где beam search может быть медленным.

Архитектура и обучение

Финальная модель: small, 84 167 424 обучаемых параметра, 12 слоёв, hidden size 768, 12 query-голов и 6 KV-голов, intermediate size 2048, контекст 128 токенов. Используются GQA, ALiBi, SwiGLU и RMSNorm. Финальный dropout — 0.05. EOS имеет ID 4095.

Источник — IgorVolochay/russian_jokes, файл dataset.csv, revision df1d9100b15b470ef20bc1bf53ae014a3776aa4e. Исходное разделение: 135 497 train и 15 056 development, seed 0xC0FFEE.

В ноутбуке обучены nano, mini, small, mini с RoPE и mini с MLA; сохранены их метрики и примеры. RoPE и MLA — отдельные бонусные эксперименты, в финальных весах используется ALiBi + GQA.

Для дополнительных экспериментов тексты нормализованы и очищены от точных дубликатов; из development удалены 111 текстов, совпавших с очищенным train. BPE4096 обучен на train. При расширении словаря веса собственной small-модели перенесены через соответствующие старые токены, затем дообучены.

Финальный checkpoint — short48, дополнительный шаг 6000. Этот этап продолжает vocab4096-b128/step-3000 и обучается на полных анекдотах длиной 12–48 токенов: 95 102 train и 10 534 development-примера. AdamW, learning rate 1e-4, weight decay 0.1, batch size 128, warmup 300 и cosine decay. В ноутбуке для всей цепочки указано 19 000 шагов. Обучение выполнено на A100 с bf16.

Результаты

Значения ниже взяты из сохранённых выводов ноутбука, а не получены новым независимым прогоном.

Эксперимент Токенизатор Development loss Perplexity
nano BPE1024 3.1956 24.43
mini BPE1024 2.6614 14.32
small BPE1024 2.4509 11.60
mini + RoPE BPE1024 2.6420 14.04
mini + MLA BPE1024 2.6526 14.19
small-tuned BPE1024 2.4317 11.38
Финальный short48: короткая очищенная development-подвыборка BPE4096 3.7909 44.29

Для финального checkpoint loss на исходном development с обрезанием до контекста 128 равен 4.8310. Loss разных токенизаторов и разных подвыборок напрямую несопоставим. Development использован для выбора весов и декодирования; независимая итоговая test-оценка не проводилась.

На short48 тренировочный loss снизился до 1.1177, а development loss вырос с 3.2863 до 3.7909: наблюдается переобучение. Финальные веса выбраны ради более связных коротких продолжений, а не минимального development loss.

Примеры генерации

Сохранённые примеры финальной модели из ноутбука. Параметры: num_beams=32, length_penalty=0.3, no_repeat_ngram_size=6, max_new_tokens=96; промпт кодируется без EOS. Маркер [EOS] ниже опущен для чтения.

Штирлиц пришел домой и застал жену с любовником. Это была любовь.

Студент приходит на экзамен с тремя бутылками коньяка и говорит профессору:- Прошу вас, пожалуйста, поставьте мне три!

— Доктор, у меня проблема, я не могу открываться людям. — можно поподробнее? — нет.

Сидят два рыбака, один с удочкой, второй еще трезвый...

Это выбранные примеры; полная панель из десяти начал, включая неудачные ответы, приведена в ноутбуке.

Ограничения

Связность и юмор нестабильны, возможны бессмыслица и повторы. В ноутбуке сообщается, что 3 из 20 продолжений полностью совпали с очищенными текстами train; новизна не подтверждена. Корпус и генерации могут содержать ненормативную лексику и оскорбительный контент. Модель предназначена для учебной демонстрации.

Downloads last month
28
Safetensors
Model size
84.4M params
Tensor type
F32
·
BOOL
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Dataset used to train WhyZosa/hw1-russian-jokes