Трансформер не равен attention. Блок чередует смешивание позиций и нелинейное преобразование каждой позиции; residual оставляет прямой путь, normalization управляет масштабом. Глубина возникает из многократного повторения этой простой грамматики.

Два вида обмена

Пусть XRn×dX\in\mathbb R^{n\times d} содержит представления токенов. Self-attention позволяет позиции получать сведения от других позиций. Feed-forward network, или MLP, независимо преобразует каждую строку:

MLP(x)=W2ϕ(W1x+b1)+b2.\operatorname{MLP}(x)=W_2\phi(W_1x+b_1)+b_2.

Attention смешивает по длине, MLP смешивает по каналам. Один без другого ограничен: attention даёт взвешенные линейные смеси values, MLP создаёт новые нелинейные признаки.

В pre-norm записи блок:

X=X+MHA(LN(X)),Y=X+MLP(LN(X)).\begin{aligned} X'&=X+\operatorname{MHA}(\operatorname{LN}(X)),\\ Y&=X'+\operatorname{MLP}(\operatorname{LN}(X')). \end{aligned}

Подробности Q,K,VQ,K,V разобраны в attention. Здесь важен весь маршрут сигнала.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Схема pre-norm transformer block с attention MLP residual и размерностями
Рис. 77.1. Грамматика блока трансформера

Поток n×dn\times d разветвляется перед каждым подслоем: одна ветвь проходит без изменений, вторая через LN и MHA или MLP. Знаки сложения показывают residual. На полях подписано, где взаимодействуют позиции, а где только каналы.

Residual как право ничего не менять

Подслой обучает поправку F(x)F(x):

y=x+F(x).y=x+F(x).

Если полезное преобразование пока не найдено, достаточно сделать F0F\approx0. Без residual каждый слой обязан заново передавать весь сигнал. Для градиента

yx=I+Fx,\frac{\partial y}{\partial x}=I+\frac{\partial F}{\partial x},

и единичный путь не зависит от весов FF.

Это не гарантирует идеальной оптимизации: много матриц I+JI+J_\ell тоже могут быть нестабильны. Но архитектура даёт короткую дорогу. Похожую идею аддитивной памяти мы видели в LSTM.

Layer normalization

Для одного token vector xRdx\in\mathbb R^d:

μ=1djxj,σ2=1dj(xjμ)2,\mu=\frac1d\sum_jx_j,\qquad \sigma^2=\frac1d\sum_j(x_j-\mu)^2, LN(x)j=γjxjμσ2+ε+βj.\operatorname{LN}(x)_j= \gamma_j\frac{x_j-\mu}{\sqrt{\sigma^2+\varepsilon}}+\beta_j.

Нормировка идёт по каналам внутри позиции, не по batch и не по времени. Поэтому один пример можно обрабатывать независимо.

Pre-norm помещает LN до подслоя и обычно облегчает обучение глубоких сетей. Post-norm из исходной работы нормирует после residual; варианты отличаются градиентной динамикой. При сравнении нельзя менять порядок молча.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Нормы активаций и градиентов по слоям для сети с residual и без него
Рис. 77.2. Residual удерживает сигнал сквозь глубину

Слева показана норма представления по 24 слоям, справа — норма градиента от выхода к каждому слою. Серые кривые без residual быстро затухают или расходятся, синие остаются в рабочем диапазоне. Это конкретный опыт на одинаковой synthetic-задаче, не универсальная гарантия.

Лаборатория блока

Сигнал через attention, MLP и residual

Загружается живая иллюстрация…

Отключайте подслои по одному. Без MLP позиции обмениваются исходными признаками, но хуже строят нелинейную комбинацию. Без attention каждая позиция живёт отдельно. Без residual небольшое случайное преобразование на каждом слое быстро стирает начальную геометрию.

Проследите один token vector по слоям и сравните cosine similarity с его начальным embedding. Снижение similarity не равно потере информации: представление может поворачиваться, сохраняя декодируемый признак. Проверьте линейным probe.

Decoder: следующий токен

Decoder-only transformer использует causal mask. После LL блоков получаем H(L)H^{(L)}, затем logits:

zt=Wvocabht+b.z_t=W_{\mathrm{vocab}}h_t+b.

Обучающая цель — следующий токен. Все позиции одной последовательности можно вычислить параллельно во время обучения, потому что правильные предыдущие токены известны. При генерации следующий токен неизвестен, поэтому шаги последовательны; KV-cache экономит пересчёт прошлого.

Weight tying может использовать одну матрицу для входных embeddings и выходной проекции. Это уменьшает параметры и связывает геометрию чтения с предсказанием.

Encoder и encoder–decoder

Encoder видит весь вход двунаправленно и строит контекстные представления. Для классификации можно агрегировать специальный токен или все позиции. Encoder–decoder добавляет cross-attention: decoder queries обращаются к encoder keys/values.

Архитектуры соответствуют задачам:

  • encoder — понимание фиксированного входа;
  • decoder — авторегрессивная генерация;
  • encoder–decoder — преобразование входной последовательности в выходную, например перевод.

Граница не абсолютна: decoder можно обучить классификации через текстовый ответ, но вычислительная цена и интерфейс цели будут другими.

Что меняется с глубиной

Ранние слои часто сохраняют локальные и лексические признаки, средние собирают отношения, поздние подстраиваются под выходную цель. Это статистическая картина, а не жёсткое расписание.

Linear probe обучает простой классификатор по замороженным представлениям разных слоёв. Если признак декодируется, он присутствует линейно, но не обязательно используется моделью причинно. Activation patching заменяет активацию одного запуска другой и проверяет влияние на результат.

Визуализации attention map должны дополняться такими вмешательствами. Отдельная голова — лишь одна ветвь residual stream.

TinyStories как контролируемый корпус

TinyStories состоит из коротких историй с ограниченной лексикой, сгенерированных для исследования малых языковых моделей. На нём можно обучить небольшой decoder и увидеть связный текст без огромных вычислений. Но синтетический стиль и узкий мир делают benchmark специальным.

Проведите ablation: одинаковые данные и бюджет, но без residual, без positional encoding или с меньшим MLP. Сравните validation loss, скорость оптимизации и специально составленные минимальные пары на порядок слов.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Кривые validation loss четырёх трансформеров и результаты на тесте порядка слов
Рис. 77.3. Ablation раскрывает работу частей блока

Кривые показывают полный блок, вариант без residual, без positional encoding и без MLP. Справа столбцы дают accuracy на парах кот догнал пса / пёс догнал кота. Без позиции общий loss может быть умеренным, но порядок рушится.

Мини-исследование: где хранится признак

Создайте предложения с двумя именами и отношением: Анна выше Бориса. После нескольких отвлекающих фраз задайте вопрос, кто ниже. Для каждого слоя обучите linear probe, предсказывающий отношение из представления последнего токена. Получится кривая decodability по глубине.

Затем проведите causal test. Возьмите пару примеров с противоположным отношением и замените activation выбранного слоя/позиции из одного примера другой. Если output переворачивается, этот участок residual stream не только содержит декодируемый признак, но и влияет на ответ.

Контроль обязателен: patch случайной позиции того же слоя и patch с тем же отношением. Измеряйте изменение log-odds, а не только итоговый класс. Связь с attention-интервенциями помогает не принимать heatmap за причинную схему.

Мини-исследование: compute одного блока

Для фиксированного d=512d=512 измерьте время forward при длинах 64–4096. Отдельно профилируйте MHA и MLP. На коротких строках MLP может доминировать из-за d2d^2, на длинных attention — из-за n2n^2. Найдите empirical crossover на своём устройстве.

Повторите при MLP expansion 2 и 8 и при local attention. Укажите batch, precision, прогрев и память. Это не benchmark hardware вообще; это способ проверить формулы сложности на конкретном режиме и понять, почему оптимизация одной части иногда почти не ускоряет весь блок.

Для каждого варианта оцените arithmetic intensity: число операций на прочитанный байт. Attention при малых batch может быть ограничена bandwidth, MLP лучше насыщает матричный ускоритель. Поэтому одинаковые FLOP не гарантируют одинаковое время.

Сравнивайте также end-to-end generation с KV-cache. Быстрый training forward и низкая latency одного нового токена являются разными режимами. Эта проверка готовит почву для стоимости инференса в scaling laws.

Unit test должен подтвердить: logits полного префикса и пошагового decode с cache совпадают в пределах численной погрешности на нескольких длинах.

Параметры и вычисления

В типичном блоке MHA содержит около 4d24d^2 параметров, MLP с шириной 4d4d — около 8d28d^2. Значит, большая часть параметров часто находится в MLP, хотя внимание получает больше картинок. На длине nn attention имеет квадратичную часть O(n2d)O(n^2d), MLP — O(nd2)O(nd^2).

При короткой последовательности и большом dd доминирует MLP; при очень длинной — карта внимания. Это объясняет, почему ускорения зависят от режима.

Следующий урок рассмотрит не блок, а то, чем его кормят: корпус и предобучение.

Блок как система путей

Трансформер — композиция двух операций и двух инфраструктурных опор. Attention смешивает позиции, MLP перестраивает каналы, residual сохраняет маршрут сигнала, LN стабилизирует масштаб. Понимание блока начинается с отключения частей и контрольных задач, а не с рисунка сотен прямоугольников.

Задачи