Трансформер не равен attention. Блок чередует смешивание позиций и нелинейное преобразование каждой позиции; residual оставляет прямой путь, normalization управляет масштабом. Глубина возникает из многократного повторения этой простой грамматики.
Два вида обмена
Пусть содержит представления токенов. Self-attention позволяет позиции получать сведения от других позиций. Feed-forward network, или MLP, независимо преобразует каждую строку:
Attention смешивает по длине, MLP смешивает по каналам. Один без другого ограничен: attention даёт взвешенные линейные смеси values, MLP создаёт новые нелинейные признаки.
В pre-norm записи блок:
Подробности разобраны в attention. Здесь важен весь маршрут сигнала.
Поток разветвляется перед каждым подслоем: одна ветвь проходит без изменений, вторая через LN и MHA или MLP. Знаки сложения показывают residual. На полях подписано, где взаимодействуют позиции, а где только каналы.
Residual как право ничего не менять
Подслой обучает поправку :
Если полезное преобразование пока не найдено, достаточно сделать . Без residual каждый слой обязан заново передавать весь сигнал. Для градиента
и единичный путь не зависит от весов .
Это не гарантирует идеальной оптимизации: много матриц тоже могут быть нестабильны. Но архитектура даёт короткую дорогу. Похожую идею аддитивной памяти мы видели в LSTM.
Layer normalization
Для одного token vector :
Нормировка идёт по каналам внутри позиции, не по batch и не по времени. Поэтому один пример можно обрабатывать независимо.
Pre-norm помещает LN до подслоя и обычно облегчает обучение глубоких сетей. Post-norm из исходной работы нормирует после residual; варианты отличаются градиентной динамикой. При сравнении нельзя менять порядок молча.
Слева показана норма представления по 24 слоям, справа — норма градиента от выхода к каждому слою. Серые кривые без residual быстро затухают или расходятся, синие остаются в рабочем диапазоне. Это конкретный опыт на одинаковой synthetic-задаче, не универсальная гарантия.
Лаборатория блока
Отключайте подслои по одному. Без MLP позиции обмениваются исходными признаками, но хуже строят нелинейную комбинацию. Без attention каждая позиция живёт отдельно. Без residual небольшое случайное преобразование на каждом слое быстро стирает начальную геометрию.
Проследите один token vector по слоям и сравните cosine similarity с его начальным embedding. Снижение similarity не равно потере информации: представление может поворачиваться, сохраняя декодируемый признак. Проверьте линейным probe.
Decoder: следующий токен
Decoder-only transformer использует causal mask. После блоков получаем , затем logits:
Обучающая цель — следующий токен. Все позиции одной последовательности можно вычислить параллельно во время обучения, потому что правильные предыдущие токены известны. При генерации следующий токен неизвестен, поэтому шаги последовательны; 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, скорость оптимизации и специально составленные минимальные пары на порядок слов.
Кривые показывают полный блок, вариант без residual, без positional encoding и без MLP. Справа столбцы дают accuracy на парах кот догнал пса / пёс догнал кота. Без позиции общий loss может быть умеренным, но порядок рушится.
Мини-исследование: где хранится признак
Создайте предложения с двумя именами и отношением: Анна выше Бориса. После нескольких отвлекающих фраз задайте вопрос, кто ниже. Для каждого слоя обучите linear probe, предсказывающий отношение из представления последнего токена. Получится кривая decodability по глубине.
Затем проведите causal test. Возьмите пару примеров с противоположным отношением и замените activation выбранного слоя/позиции из одного примера другой. Если output переворачивается, этот участок residual stream не только содержит декодируемый признак, но и влияет на ответ.
Контроль обязателен: patch случайной позиции того же слоя и patch с тем же отношением. Измеряйте изменение log-odds, а не только итоговый класс. Связь с attention-интервенциями помогает не принимать heatmap за причинную схему.
Мини-исследование: compute одного блока
Для фиксированного измерьте время forward при длинах 64–4096. Отдельно профилируйте MHA и MLP. На коротких строках MLP может доминировать из-за , на длинных attention — из-за . Найдите 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 содержит около параметров, MLP с шириной — около . Значит, большая часть параметров часто находится в MLP, хотя внимание получает больше картинок. На длине attention имеет квадратичную часть , MLP — .
При короткой последовательности и большом доминирует MLP; при очень длинной — карта внимания. Это объясняет, почему ускорения зависят от режима.
Следующий урок рассмотрит не блок, а то, чем его кормят: корпус и предобучение.
Блок как система путей
Трансформер — композиция двух операций и двух инфраструктурных опор. Attention смешивает позиции, MLP перестраивает каналы, residual сохраняет маршрут сигнала, LN стабилизирует масштаб. Понимание блока начинается с отключения частей и контрольных задач, а не с рисунка сотен прямоугольников.