Russian Jokes LLM
Языковые модели, обученные на датасете русских анекдотов в рамках домашней работы по курсу Deep Learning.
Описание задания
В рамках задания было реализовано с нуля:
- Byte-level BPE токенизатор — обучение словаря заданного размера и набора слияний, кодирование и декодирование текста
- Transformer для языкового моделирования со следующими компонентами:
- RMSNorm — предварительная нормализация
- GQA (Grouped Query Attention) — механизм внимания с группировкой запросов
- SwiGLU — активация в Feed-Forward блоке
- ALiBi — позиционные эмбеддинги
- RoPE — Rotary Positional Embedding
- MLA (Multi-Head Latent Attention)
Датасет
Обученные модели
| Модель | Репозиторий | Positional Encoding | Attention |
|---|---|---|---|
| Базовая | llm-course-hw1 | ALiBi | GQA |
| RoPE | llm-course-hw1-rope | RoPE | GQA |
| MLA | llm-course-hw1-mla | RoPE | MLA |
Архитектура
| Параметр | Значение |
|---|---|
| Слоёв | 3 |
| Голов внимания | 4 |
| KV голов | 2 |
| Hidden dim | 96 |
| Intermediate dim | 256 |
| Vocab size | 1024 |
| Max seq len | 128 |
| Параметров | ~0.5M |
Токенизатор
Byte-level BPE токенизатор с размером словаря 1024 токенов, обученный на тренировочной части датасета.
Специальный токен: [EOS] — конец последовательности.
Качество
| Модель | Train Loss | Val Loss |
|---|---|---|
| ALiBi | 3.496 | 3.490 |
| RoPE | 3.461 | 3.473 |
| MLA | 3.512 | 3.522 |
Примеры генерации
Prompt: Заходит в бар
ALiBi: Заходит в баре. Пока:- Ну что ты не могу внутьсячу?- Я не могу идешь!- Ну, сегодня я не могу сразу.
RoPE: Заходит в бар в кухни:- Папа, а вчера не знает, кто у тебя снова.
MLA: Заходит в барпарату. Слышал с пациенту:- Я тебе не папа, что я тебе, и с ним и говорит: - Мама, доктор, я не придется! - Ну и что, что это? - Да нет, ты мне, что у меня ведь я не понимаешь, что это я, что он у меня не знаю, что у тебя на кого?
Использование
import torch
from huggingface_hub import snapshot_download
tokenizer = ByteLevelBPETokenizer.from_pretrained("zhanslu/llm-course-hw1")
model = TransformerForCausalLM.from_pretrained("zhanslu/llm-course-hw1")
model.eval()
text = "Заходит в бар"
input_ids = torch.tensor(tokenizer.encode(text)[:-1])[None, :]
output = model.generate(
input_ids,
max_new_tokens=100,
eos_token_id=tokenizer.eos_token_id,
do_sample=True,
top_k=10
)
print(tokenizer.decode(output[0].tolist()))
- Downloads last month
- 98