--- language: - ru tags: - text-generation - causal-lm - transformer - byte-level-bpe - alibi - rope - gqa - swiglu - education - course-work datasets: - IgorVolochay/russian_jokes library_name: pytorch pipeline_tag: text-generation license: mit model-index: - name: llm-course-hw1 (nano/mini/small) results: - task: name: Language Modeling type: text-generation dataset: name: Russian Jokes type: IgorVolochay/russian_jokes split: test metrics: - name: Validation cross-entropy type: loss value: 2.624 --- # LLM Course HW1 — Byte-level BPE + Tiny Russian Jokes LM Это домашнее задание: обучение **Byte-level BPE** токенизатора и небольшой **Causal Transformer** на датасете русских анекдотов. ## Что внутри - **Токенизатор:** Byte-level BPE, обучен с нуля на `IgorVolochay/russian_jokes` - **Модель:** Causal Transformer с: - **ALiBi** позиционными смещениями *(по умолчанию)* или **RoPE** *(опционально)* - **GQA** (Grouped-Query Attention) - **SwiGLU** в FFN - (опционально) **Multi-Head Latent Attention (MLA)** для экономии KV-кэша - **Конфиги размеров:** `nano` / `mini` / `small` - **Код генерации и обучения** на PyTorch > Примечание: Модель и токенизатор — **кастомные классы**, не `transformers`. Для использования см. примеры ниже. --- ## Файлы в репозитории - `model.safetensors` — веса модели - `config.json` — конфиг модели - `vocabulary.json`, `merges.json` — файлы Byte-level BPE - `README.md` — эта карточка --- ## Архитектура - **Embedding:** token embedding (без learnable pos embed; позиции кодируются ALiBi или RoPE) - **Attention:** Multi-head, **GQA** (число KV-голов меньше числа Q-голов) - **Positional encoding:** - **ALiBi** (additive linear bias) — не требует табличек, хорошо масштабируется - **RoPE** (опционально): комплексные вращения Q/K; требует чётного `head_dim` - **FFN:** **SwiGLU** = `silu(W₁a x) ⊙ (W₁b x)` → `W₂` - **Norm:** **RMSNorm** (pre-norm) - **(Опция) MLA:** свёртка K/V в общий латент и on-the-fly дешифрация (снижение памяти под KV-кэш) --- ## Тренировочные детали - **Датасет:** `IgorVolochay/russian_jokes` (train/test split 90/10, фиксированный seed) - **Оптимизатор:** AdamW (`lr=3e-4`, `weight_decay=0.1`) - **Шедулер:** Linear warmup (10% шагов) → linear decay - **Batching:** паддинг до максимальной длины в батче + `attention_mask` - **Критерий:** next-token cross-entropy с маскированием паддингов - **Макс. контекст:** `max_seq_len=128` --- ## Графики ![Графики](https://cdn-uploads.huggingface.co/production/uploads/680935db7430904d820dd79c/on8e96peXjTNWsYffdsth.png)