Flourish-3M
⚠️ Это учебный/исследовательский проект, а не модель для продакшена. Подробнее об ограничениях см. раздел «Качество».
Архитектура
- 10 слоёв, dim 128, FFN 384
- GQA: 4 query-головы / 2 kv-головы
- RMSNorm, RoPE, SwiGLU, QK-norm, без bias, без dropout
- Словарь токенизатора: 8 192 (byte-level BPE, регистр сохраняется), embedding'и входа/выхода общие (weight tying)
- Контекст: 512 токенов
- Итого: 3.02M параметров (из них 1.05M — эмбеддинги)
Тег qwen3 — не про происхождение модели. Архитектура (Llama-блок + QK-norm перед RoPE) в transformers совпадает по структуре тензоров с Qwen3ForCausalLM, поэтому для совместимости с AutoModelForCausalLM веса маппятся на Qwen3ForCausalLM.
Данные
- deepvk/cultura_ru_edu — ~1.2 млрд символов, Apache 2.0
- wikimedia/wikipedia (20231101.ru) — ~520 млн символов, CC-BY-SA-3.0
- Нерусские документы отфильтрованы (доля кириллицы < 60%)
- Итого ~531M токенов (train), обучение — около 0.94 эпохи (данные не повторяются)
Лицензия MIT относится только к весам модели; датасеты остаются под своими лицензиями.
Обучение
- Оптимизатор AdamW, lr 1.5e-3 с косинусным расписанием, warmup 305 шагов
- Batch: 32 768 токенов/шаг (micro-batch 32 x accum 2)
- Устройство: Apple Silicon (MPS), без AMP
- Всего шагов: 15 259
Качество
Финальные метрики (валидационная выборка, кросс-энтропия в натуральных логарифмах, усреднение по токенам):
- val loss: 3.626
- перплексия: ~37.6
Перплексия считается на токен используемого токенизатора (словарь 8 192, byte-level BPE). Токены у такого словаря короткие, поэтому значение напрямую не сравнимо с моделями, у которых другой токенизатор.
Динамика val loss/ppl по ходу обучения:
| Шаг | Val loss | PPL |
|---|---|---|
| 1 000 | 4.498 | 89.9 |
| 3 000 | 4.020 | 55.7 |
| 6 000 | 3.844 | 46.7 |
| 9 000 | 3.746 | 42.3 |
| 12 000 | 3.668 | 39.2 |
| 15 259 | 3.626 | 37.6 |
Что модель умеет:
- Воспроизводит словоформы, пунктуацию и структуру статей в стиле Wikipedia (согласование падежей при этом нередко нарушается)
Чего не умеет:
- Фактология практически отсутствует — имена, даты, географические привязки генерируются правдоподобно, но часто неверны
- Связность распадается уже через 1-2 предложения, тема может "плыть"
Пример генерации (промпт → продолжение)
Москва — столица
Москва — столица России
География
Серебряный стенами в 1986 году на протяжении 30 лет открыт в 1994 году.
История
На территории города располагался в 1120-х гг. здесь.
Административный центр — село «Костёр-Волжская»,
в 1975 году — в селе «Серебряная»,
в 1979 году — в городе Большого Северо-Западного городского округа,
в 1980 году — в городе Большой Савой,
в 1989 году — в городе Большого Серебряного Корского.
В 1990 году — в селе Житомир.
География
Находится в юго-восточной части России по прямой от административного центра коммуны и муниципалитета.
Использование
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("akanemind/Flourish-3M")
tokenizer = AutoTokenizer.from_pretrained("akanemind/Flourish-3M")
inputs = tokenizer("Москва — столица", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=100, do_sample=True, temperature=0.8)
print(tokenizer.decode(out[0]))