--- language: - ru license: mit tags: - text-generation - causal-lm - russian - jokes - transformer - mla - rope datasets: - IgorVolochay/russian_jokes pipeline_tag: text-generation --- # Russian Jokes Generator Языковая модель, обученная с нуля, для генерации анекдотов ## О задании В рамках задания был реализован с нуля полный пайплайн обучения языковой модели: 1. **Byte-level BPE токенизатор** 2. **Transformer-модель** с современными архитектурными решениями: RMSNorm, GQA/MLA, SwiGLU, ALiBi/RoPE 3. **Train-loop**: linear warmup + linear decay scheduler, cross-entropy loss с маскированием паддингов. ## Архитектура | Параметр | Значение | |---|---| | Число слоёв | 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 | ## Токенизатор - **Тип:** Byte-level BPE - **Размер словаря:** 1024 ## Данные - **Датасет:** [IgorVolochay/russian_jokes](https://huggingface.co/datasets/IgorVolochay/russian_jokes) - **Train/test split:** 90/10 - **Средняя длина:** ~70 токенов на анекдот ## Гиперпараметры обучения | Параметр | Значение | |---|---| | 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 | ![Loss Curve](loss_curve.jpg) ## Примеры генерации Параметры генерации: `do_sample=True, top_k=40, temperature=0.8, max_new_tokens=200`. ### Пример 1 **Prompt:** «Заходит в бар» ``` Заходит в бар пьяный мужик, а тащит за диваном. Мужик: - Бармен, почему ты так долго не видел вон тот джип? - За что? - Хм.. Я так и знал, ты бы послал ее в этой бочке, когда я ем все в вашем теле, ты меня ругаешь, а ты - нет.. ``` ### Пример 2 **Prompt:** «Сидят два» ``` Сидят два зека, один жирный, второй спрашивает: - Где плачешь? - А я плачу... - Как он умеет? - Еще нет ``` ### Пример 3 **Prompt:** «Учительница спрашивает» ``` Учительница спрашивает учеников: - Вовочка, назови пожалуйста, учителя: "Скока-Петя, дядя, ты отдал 250 литров пять лет, а я - 10". - У меня 150. Пол - это 17. - А что, не знает, что такое 20-летняя сестра? - Не знаю. - А какая разница? - По-русски "газ" и "Родина". - Я тебе с ней расскажу, тормози. ``` ## Использование ```python 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())) ``` ---