IgorVolochay/russian_jokes
Viewer • Updated • 151k • 207 • 12
Языковая модель, обученная с нуля, для генерации анекдотов
В рамках задания был реализован с нуля полный пайплайн обучения языковой модели:
| Параметр | Значение |
|---|---|
| Число слоёв | 12 |
| Hidden dim | 768 |
| Intermediate dim (FFN) | 2048 |
| Число attention голов | 12 |
| Head dim | 64 |
| Attention | Multi-Head Latent Attention |
| KV-латент dim | 256 |
| RoPE head dim | 32 |
| Активация | SwiGLU |
| Нормализация | RMSNorm (pre-norm) |
| Позиционное кодирование | RoPE |
| Всего параметров | ~80M |
| Параметр | Значение |
|---|---|
| Optimizer | AdamW |
| Learning rate | 2e-4 |
| LR schedule | linear warmup (10%) + linear decay to 0 |
| Batch size | 32 |
| Max sequence length | 128 |
| Weight decay | 0.01 |
| Gradient clipping | 1.0 |
| Количество шагов | 14,000 |
| Метрика | Значение |
|---|---|
| Final train loss | 2.3490 |
| Final validation loss | 2.4395 |
| Baseline ("nano" model) | 3.497 |
Параметры генерации: do_sample=True, top_k=40, temperature=0.8, max_new_tokens=200.
Prompt: «Заходит в бар»
Заходит в бар пьяный мужик, а тащит за диваном.
Мужик:
- Бармен, почему ты так долго не видел вон тот джип?
- За что?
- Хм.. Я так и знал, ты бы послал ее в этой бочке,
когда я ем все в вашем теле, ты меня ругаешь, а ты - нет..
Prompt: «Сидят два»
Сидят два зека, один жирный, второй спрашивает:
- Где плачешь?
- А я плачу...
- Как он умеет?
- Еще нет
Prompt: «Учительница спрашивает»
Учительница спрашивает учеников:
- Вовочка, назови пожалуйста, учителя: "Скока-Петя,
дядя, ты отдал 250 литров пять лет, а я - 10".
- У меня 150. Пол - это 17.
- А что, не знает, что такое 20-летняя сестра?
- Не знаю.
- А какая разница?
- По-русски "газ" и "Родина".
- Я тебе с ней расскажу, тормози.
import torch
# Определи классы из ноутбука перед использованием
tokenizer = ByteLevelBPETokenizer.from_pretrained("Kass-sandra/llm-course-hw1-mla-rope")
model = TransformerForCausalLM.from_pretrained("Kass-sandra/llm-course-hw1-mla-rope")
model.eval()
prompt = "Заходит в бар"
input_ids = torch.tensor(tokenizer.encode(prompt)[:-1])[None, :]
output = model.generate(
input_ids,
max_new_tokens=200,
eos_token_id=tokenizer.eos_token_id,
do_sample=True,
top_k=40,
temperature=0.8,
)
print(tokenizer.decode(output[0].tolist()))