Архитектура трансформера
Собираем всё в одну машину: как токены превращаются в векторы, проходят через стопку одинаковых блоков «внимание + MLP» и на выходе дают вероятности следующего токена. Это скелет GPT, Llama и почти всех современных LLM.
Интуиция: конвейер из одинаковых блоков
Трансформер (transformer) — на удивление однообразная конструкция. Текст режется на токены, каждый токен становится вектором, и дальше этот набор векторов N раз подряд проходит через один и тот же блок. Внутри блока всего две операции: внимание (self-attention) — токены обмениваются информацией друг с другом, и MLP — каждый токен «переваривает» собранное в одиночку. Никаких рекурсий, никаких свёрток: глубина набирается простым повторением блока.
Полный путь данных в decoder-only модели (как GPT):
Эмбеддинги (embeddings) переводят номера токенов в векторы размерности d. Внимание само по себе не знает порядка слов — «кот ел рыбу» и «рыба ела кота» для него одинаковы, — поэтому к векторам добавляется позиционная информация (positional encoding): синусоиды, обучаемые векторы или RoPE в современных моделях.
Что внутри блока
Каждый блок — это два подслоя, и оба обёрнуты в одинаковую «упаковку» из остаточной связи и нормализации:
- Остаточная связь (residual connection) — выход подслоя прибавляется к входу, а не заменяет его. Градиент при обучении течёт по этому «шоссе» напрямую сквозь десятки блоков, не затухая — без residual глубокие сети практически не обучаются. Удобно думать так: есть поток (residual stream), а каждый подслой лишь дописывает в него поправку.
- Нормализация (LayerNorm) — приводит вектор каждого токена к стабильному масштабу, чтобы активации не разлетались с глубиной. В оригинальной статье LN стоял после подслоя (post-norm), современные модели ставят его до (pre-norm) — так обучение глубоких стеков заметно стабильнее.
- MLP-блок — два линейных слоя с нелинейностью: сначала расширение размерности примерно ×4 (d → 4d), затем сжатие обратно (4d → d). Он обрабатывает каждый токен независимо, между токенами ничего не передаёт. По современным представлениям именно в весах MLP «хранится» большая часть фактических знаний модели — на MLP приходится и примерно две трети параметров блока.
Выход: lm_head и логиты
После последнего блока вектор каждого токена проходит финальный LayerNorm и попадает в языковую голову (lm_head) — линейный слой размера d × V, где V — размер словаря. Результат — логиты (logits): по одному числу на каждый токен словаря. Softmax превращает их в распределение вероятностей, из которого сэмплируется следующий токен. Важная деталь обучения: благодаря causal mask модель за один проход предсказывает следующий токен для каждой позиции сразу — из фразы в 1000 токенов получается 1000 обучающих примеров, и все считаются параллельно. Именно эта параллельность (у RNN шаг t ждёт шага t−1) — главная причина, почему трансформер победил.
Encoder, decoder и сколько это всё весит
Из одних и тех же блоков собирают три типа моделей. Энкодер (encoder, BERT) — без каузальной маски: каждый токен видит всё предложение в обе стороны; хорош для понимания — классификация, поиск, извлечение сущностей. Декодер (decoder, GPT) — с маской, генерирует слева направо. Энкодер-декодер (T5, оригинальный transformer для перевода) — энкодер читает вход, декодер пишет выход, подглядывая в энкодер через cross-attention.
Параметры грубо считаются так: эмбеддинги V×d (словарь 50 тысяч × d=768 ≈ 38 млн), плюс на каждый блок примерно 12d² (4d² на проекции внимания Q, K, V и выходную + 8d² на MLP с расширением ×4). Для GPT-2 small: 12 блоков × 12 × 768² ≈ 85 млн + эмбеддинги ≈ 124 млн — сходится с официальной цифрой.
- «Нарисуйте блок трансформера» — attention и MLP, каждый в обёртке LN → подслой → сложение с входом (pre-norm). Обязательно проговори, что residual — это сложение, а не конкатенация.
- «Чем BERT отличается от GPT?» — маской и задачей: encoder без маски учится на восстановлении замаскированных токенов, decoder с маской — на предсказании следующего.
- «Почему трансформер вытеснил RNN?» — параллельное обучение по всей длине + прямой доступ к любому токену вместо затухающей памяти.
- «Где параметры?» — примерно ⅔ блока в MLP, ⅓ во внимании; плюс эмбеддинги, заметные у маленьких моделей и почти незаметные у больших.