Перейти к содержимому
ПереводыStanford

CS336, лекции 3–4: архитектуры, гиперпараметры и смесь экспертов

Перевод слайдов лекций Тацунори Хашимото (весна 2025): что общего у современных LLM — pre-norm, RMSNorm, SwiGLU, RoPE, — какие гиперпараметры почти у всех одинаковы, приёмы стабильности, GQA/MQA и устройство MoE вплоть до DeepSeek-V3.

  • Лекция 3 — это «обзор рынка» архитектур: какие решения приняты почти во всех LLM 2023–2025 годов. Она опирается на модули 4.5 «Архитектура трансформера» — особенно урок 4.5.3 о RMSNorm, SwiGLU и GQA — и 5.2 об эффективном внимании. Разделы о стабильности (z-loss, QK-норма) дополняют урок 5.4.4.
  • Лекция 4 — смесь экспертов. Читайте после модуля 5.3; финал лекции (DeepSeek-V3, MLA, MTP) совпадает с нашим «китайским» модулем 5.3.2.
  • Таблицы с десятками моделей — справочные: новичку достаточно выводов в рамках «Итоги».

Лекция 3. Всё, что вы не хотели знать об архитектуре и обучении LM

Заголовок раздела «Лекция 3. Всё, что вы не хотели знать об архитектуре и обучении LM»
  • Вступайте в Slack!
  • Проверьте, что у вас последняя версия задания!
  • Быстро вспомнить «стандартный» трансформер (тот, что вы реализуете).
  • Что общего у большинства больших LM?
  • Каковы типичные вариации архитектуры и процесса обучения?

Тема дня: лучший способ научиться — практический опыт; второй по качеству — учиться на опыте других.

Отправная точка: «исходный» трансформер (4)

Заголовок раздела «Отправная точка: «исходный» трансформер (4)»

[Схема энкодера-декодера из статьи «Attention Is All You Need».] Вспомним выбор, сделанный в стандартном трансформере:

  • позиционное кодирование: синусы и косинусы, PE(pos,2i)=sin⁡(pos/100002i/dmodel)PE_{(pos,2i)} = \sin(pos/10000^{2i/d_{\text{model}}}), PE(pos,2i+1)=cos⁡(pos/100002i/dmodel)PE_{(pos,2i+1)} = \cos(pos/10000^{2i/d_{\text{model}}});
  • FFN: ReLU, FFN(x)=max⁡(0,xW1+b1)W2+b2\mathrm{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2;
  • тип нормализации: post-norm, LayerNorm.

Что реализовали вы — простой современный вариант (5)

Заголовок раздела «Что реализовали вы — простой современный вариант (5)»

[Схема decoder-only трансформера из задания 1.] Отличия:

  • LayerNorm стоит перед блоком;
  • вращательное позиционное кодирование (RoPE);
  • FF-слои используют SwiGLU, а не ReLU;
  • у линейных слоёв (и у layernorm) нет свободных членов (bias).

Почему мы выбрали это? Что стоит выбирать вам?

Архитектур много. Только за год с прошлого CS336 вышло больше 19 новых плотных (dense) моделей, многие — с мелкими правками архитектуры. [Коллаж из титульных страниц техотчётов: Llama 3, Nemotron-4 340B, Qwen2.5, Gemma 2, Reka, Falcon2-11B, InternLM2 и др.]

Посмотрим на данные о плотных архитектурах (7)

Заголовок раздела «Посмотрим на данные о плотных архитектурах (7)»

Учимся у множества других моделей и статей. [Большая таблица: модели с 2017 по 2025 год и их выбор — тип нормализации, параллельные слои, позиционное кодирование, активации и т. д.] Мы пройдёмся по многим основным вариантам архитектуры и гиперпараметров:

  • что общего у всех этих моделей?
  • какие части различаются?
  • чему можно из этого научиться?
  • Типичные вариации архитектуры: активации и FFN; варианты внимания; позиционное кодирование.
  • Гиперпараметры, которые важны (или нет): что такое ff_dim? Всегда ли размерности голов в сумме дают model_dim? Сколько элементов в словаре?
  • Приёмы стабильности.

Подумаем о ключевой части архитектуры. [Та же таблица моделей.] Взгляд сверху:

  • согласия мало (кроме pre-norm);
  • тренд — к архитектурам «как у LLaMA».

Единственное, в чём согласны все (на 2024 год). Устроить LayerNorm так, чтобы она не влияла на основной путь остаточного сигнала (слева). [Рисунок из Xiong et al., 2020: слева Post-LN — нормализация после сложения с остатком, справа Pre-LN — нормализация на входе подслоя, а остаточный путь «чистый».]

Почти все современные LM используют pre-norm (но BERT был post-norm). (Одно забавное исключение — OPT-350M. Не знаю, почему у неё post-norm.)

[Графики Salazar & Nguyen (2019): BLEU на англо-вьетнамском переводе — варианты с PreNorm выше PostNorm. Графики Xiong et al. (2020): Pre-LN без разогрева (warmup) сходится быстрее Post-LN с разогревом по loss на валидации и BLEU; на BERT Pre-LN тоже быстрее.]

  • Затухание градиента [Xiong 2020]. [Столбцы: ожидаемая норма градиента по слоям; у Post-LN без разогрева она растёт к верхним слоям, у Pre-LN ровная.]
  • Всплески градиента [Salazar, Nguyen]. [График нормы градиента по итерациям: у PostNorm резкие пики.]

Изначально заявленное преимущество — можно убрать разогрев. Сегодня — стабильность и больший learning rate у больших сетей.

Если ставить LayerNorm в остаточный поток плохо… почему бы не поставить post-norm вне потока? [Схема: нормализация и на входе подслоя, и на его выходе — до сложения с остатком.] Недавние модели: Grok, Gemma 2. OLMo 2 делает только неостаточную post-norm.

Исходный трансформер: LayerNorm — нормализует среднее и дисперсию по dmodeld_{\text{model}}:

y=x−E[x]Var[x]+ϵ⋅γ+β.y = \frac{x - \mathrm{E}[x]}{\sqrt{\mathrm{Var}[x] + \epsilon}} \cdot \gamma + \beta.

Известные модели: GPT-3/2/1, OPT, GPT-J, BLOOM.

Многие современные LM: RMSNorm — не вычитает среднее и не добавляет свободный член:

y=x∥x∥22+ε⋅γ.y = \frac{x}{\sqrt{\lVert x \rVert_2^2 + \varepsilon}} \cdot \gamma.

Известные модели: семейство LLaMA, PaLM, Chinchilla, T5.

(Примечание переводчика: на слайде формула записана упрощённо; в RMSNorm под корнем стоит среднее квадратов 1d∑ixi2\frac{1}{d}\sum_i x_i^2, то есть ∥x∥22/d\lVert x \rVert_2^2 / d, — см. урок 4.5.3.)

Современное объяснение — она быстрее (и не хуже):

  • меньше операций (не нужно считать среднее);
  • меньше параметров (нет свободного члена, который надо хранить).

Есть ли в этом объяснении смысл? Умножения матриц — подавляющее большинство FLOPs (и памяти) [Ivanov et al., 2023]:

Класс операцийДоля FLOPs
тензорные свёртки (матричные умножения)99.80%
статистическая нормализация0.17%
поэлементные0.03%

Важный урок: FLOPs — это не время работы! (Подробно обсудим позже.)

Класс операцийДоля FLOPsДоля времени
тензорные свёртки99.80%61.0%
статистическая нормализация0.17%25.5%
поэлементные0.03%13.5%

RMSNorm всё равно может быть важна из-за значимости перемещения данных. [Схема блока внимания с подписями: слева вверху у каждой операции число FLOPs (у MHA — «43G»), справа — отношение FLOPs к обращениям к памяти (у MHA — «153», у dropout и LayerNorm — единицы).]

Выигрыш RMSNorm во времени (и, что удивительно, в качестве) замечен в статьях. [Таблица Narang et al., 2020: при тех же 223M параметрах и 11.1T операций у RMSNorm 3.68 шага/с против 3.50 у ванильного трансформера, финальный loss 1.821 против 1.838 и лучшие метрики SuperGLUE.]

У большинства современных трансформеров нет свободных членов. Исходный трансформер: FFN(x)=max⁡(0,xW1+b1)W2+b2\mathrm{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2. Большинство реализаций (если они не вентильные): FFN(x)=σ(xW1)W2\mathrm{FFN}(x) = \sigma(xW_1)W_2.

Причины: память (как с RMSNorm) и стабильность оптимизации.

  • Практически все делают pre-norm.
    • Интуиция — сохранить хорошие стороны остаточных связей.
    • Наблюдения — градиент распространяется лучше, меньше всплесков.
    • Некоторые добавляют вторую нормализацию вне остаточного потока (это НЕ post-norm).
  • Большинство делает RMSNorm.
    • На практике работает не хуже LayerNorm.
    • Но у неё меньше параметров, которые надо гонять туда-сюда, — это экономит время по часам.
    • Свободные члены вообще чаще убирают: компромисс «вычисления/параметры» у них невыгоден.

Целый зоопарк активаций: ReLU, GeLU, Swish, ELU, GLU, GeGLU, ReGLU, SeLU, SwiGLU, LiGLU. Что это? Что используют? Важно ли это?

  • ReLU: FF(x)=max⁡(0,xW1)W2FF(x) = \max(0, xW_1)W_2. Известные модели: исходный трансформер, T5, Gopher, Chinchilla, OPT.
  • GeLU: FF(x)=GELU(xW1)W2FF(x) = \mathrm{GELU}(xW_1)W_2, где GELU(x):=xΦ(x)\mathrm{GELU}(x) := x\Phi(x) (Φ\Phi — функция распределения стандартного нормального закона). Известные модели: GPT-1/2/3, GPT-J, GPT-NeoX, BLOOM.
  • SwiGLU / GeGLU (следующий слайд). Известные модели: Llama, PaLM, T5 v1.1, большинство моделей после 2023 года.

GLU меняют «первую часть» FF-слоя: FF(x)=max⁡(0,xW1)W2FF(x) = \max(0, xW_1)W_2. Вместо линейного слоя + ReLU дополним его (поэлементным) линейным членом:

max⁡(0,xW1)  →  max⁡(0,xW1)⊗(xV).\max(0, xW_1) \;\to\; \max(0, xW_1) \otimes (xV).

Получаем вентильный вариант (ReGLU) — заметьте, появился лишний параметр VV:

FFReGLU(x)=(max⁡(0,xW1)⊗xV) W2.FF_{\text{ReGLU}}(x) = (\max(0, xW_1) \otimes xV)\, W_2.

Вентильные варианты стандартных FF-слоёв (23)

Заголовок раздела «Вентильные варианты стандартных FF-слоёв (23)»
  • GeGLU: FFNGEGLU(x,W,V,W2)=(GELU(xW)⊗xV)W2\mathrm{FFN}_{\text{GEGLU}}(x, W, V, W_2) = (\mathrm{GELU}(xW) \otimes xV)W_2. Известные модели: T5 v1.1, mT5, LaMDA, Phi-3, Gemma 2, Gemma 3.
  • SwiGLU (swish — это x⋅sigmoid(x)x \cdot \mathrm{sigmoid}(x)): FFNSwiGLU(x,W,V,W2)=(Swish1(xW)⊗xV)W2\mathrm{FFN}_{\text{SwiGLU}}(x, W, V, W_2) = (\mathrm{Swish}_1(xW) \otimes xV)W_2. Известные модели: LLaMA 1/2/3, PaLM, Mistral, OLMo, большинство моделей после 2023 года.

Замечание: у вентильных моделей размер dffd_{ff} уменьшают на 2/3.

Да, довольно стабильно. [Таблица Shazeer, 2020: средний балл GLUE у FFN с ReLU 83.80, GELU 83.86, Swish 83.60; у вентильных — GEGLU 84.12, SwiGLU 84.36, ReGLU 84.67.]

Да, и другие работы подтверждают Shazeer 2020. [Таблица Narang et al., 2020: у GeGLU и SwiGLU финальный loss 1.792 и 1.789 против 1.838 у ванильного трансформера с ReLU.]

  • Много вариаций (ReLU, GeLU, *GLU) в разных моделях.
  • *GLU не обязательна для хорошей модели (см. GPT-3), но, вероятно, помогает. Другие недавние модели-исключения: Nemotron 340B (квадрат ReLU), Falcon 2 11B (ReLU).
  • Но данные указывают на довольно стабильный выигрыш от SwiGLU и GeGLU.

Обычные блоки трансформера последовательные: сначала внимание, потом MLP. Можно ли распараллелить блок трансформера?

Несколько моделей (GPT-J, PaLM, GPT-NeoX) используют параллельные слои; впервые — в GPT-J. Из статьи PaLM: вместо стандартной последовательной формулировки

y=x+MLP(LayerNorm(x+Attention(LayerNorm(x))))y = x + \mathrm{MLP}(\mathrm{LayerNorm}(x + \mathrm{Attention}(\mathrm{LayerNorm}(x))))

используется параллельная:

y=x+MLP(LayerNorm(x))+Attention(LayerNorm(x)).y = x + \mathrm{MLP}(\mathrm{LayerNorm}(x)) + \mathrm{Attention}(\mathrm{LayerNorm}(x)).

Параллельная формулировка даёт примерно на 15% более быстрое обучение на больших масштабах, потому что входные матричные умножения MLP и внимания можно слить. Абляции показали небольшую потерю качества на 8B и никакой — на 62B.

При правильной реализации LayerNorm можно делить, а матричные умножения — сливать. Недавние модели: Cohere Command A, Falcon 2 11B, Command R+.

  • Pre- или post-norm: все делают pre-norm (кроме OPT-350M) — вероятно, не без причины.
  • LayerNorm или RMSNorm: у RMSNorm явный выигрыш в вычислениях, иногда даже в качестве.
  • Вентили: GLU в целом, похоже, лучше, хотя разница мала.
  • Последовательные или параллельные слои: очень серьёзных абляций нет, но есть выигрыш в вычислениях.

Много вариантов позиционного кодирования (30)

Заголовок раздела «Много вариантов позиционного кодирования (30)»
  • Синусоидальное: прибавить синусы и косинусы, позволяющие локализовать позицию: Embed(x,i)=vx+PEpos\mathrm{Embed}(x, i) = v_x + PE_{pos}. Известные модели: исходный трансформер.
  • Абсолютное: прибавить к эмбеддингу вектор позиции: Embed(x,i)=vx+ui\mathrm{Embed}(x, i) = v_x + u_i. Известные модели: GPT-1/2/3, OPT.
  • Относительное: добавить вектор в вычисление внимания: eij=xiWQ(xjWK+aijK)Tdze_{ij} = \frac{x_i W^Q (x_j W^K + a^K_{ij})^T}{\sqrt{d_z}}. Известные модели: T5, Gopher, Chinchilla.
  • RoPE (следующие слайды). Известные модели: GPT-J, PaLM, LLaMA, большинство моделей 2024+.

RoPE: вращательное позиционное кодирование (31)

Заголовок раздела «RoPE: вращательное позиционное кодирование (31)»

Ход мысли: относительное позиционное кодирование должно быть такой функцией f(x,i)f(x, i), что

⟨f(x,i),f(y,j)⟩=g(x,y,i−j).\langle f(x, i), f(y, j) \rangle = g(x, y, i - j).

То есть функция внимания зависит только от относительной позиции (i−j)(i - j). Чем существующие кодирования не достигают этой цели?

  • Синусоидальное: есть перекрёстные члены, которые не относительны: ⟨Embed(x,i),Embed(y,i)⟩=⟨vx,vy⟩+⟨PEi,vy⟩+…\langle \mathrm{Embed}(x, i), \mathrm{Embed}(y, i) \rangle = \langle v_x, v_y \rangle + \langle PE_i, v_y \rangle + \ldots
  • Абсолютное: очевидно, не относительное.
  • Относительное: eije_{ij} выше — не скалярное произведение.

Как решить эту проблему?

  • Мы хотим, чтобы эмбеддинги были инвариантны к абсолютной позиции.
  • Мы знаем, что скалярные произведения инвариантны к произвольному повороту.

[Рисунок: векторы слов «we» и «know». В эмбеддинге «we know that» вектор «we» повёрнут на 0 позиций, «know» — на 1. В «of course we know» «we» повёрнут на 2 позиции, «know» — на 3. Угол между векторами в обоих случаях одинаков — он зависит только от разности позиций.]

Поворотов много — какой выбрать? Просто разбить координаты на пары и поворачивать каждую пару в 2D (мотивация — комплексные числа). [Рисунок из Su et al., 2021: пара координат (x1,x2)(x_1, x_2) поворачивается на угол mθ1m\theta_1, где mm — позиция; разные пары — с разными частотами θi\theta_i.]

Умножаем на синусы и косинусы:

f{q,k}(xm,m)=RΘ,mdW{q,k}xm,f_{\{q,k\}}(x_m, m) = R^d_{\Theta,m} W_{\{q,k\}} x_m,

где RΘ,mdR^d_{\Theta,m} — блочно-диагональная матрица из блоков 2×2 (cos⁡mθi−sin⁡mθisin⁡mθicos⁡mθi)\begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{pmatrix}, i=1,…,d/2i = 1, \ldots, d/2.

Отличие от синусоидального кодирования — оно не аддитивное, перекрёстных членов нет.

[Фрагмент кода внимания из Hugging Face: обычные проекции q_proj, k_proj, v_proj и перестановка измерений; затем cos, sin = self.rotary_emb(value_states, position_ids) — получаем матрицу RoPE; затем apply_rotary_pos_emb(query_states, key_states, cos, sin) — умножаем входы запросов и ключей; дальше — то же, что в обычном многоголовом внимании.]

Замечание: кодирование применяется в каждой операции внимания, чтобы обеспечить инвариантность к позиции.

Вопросы о гиперпараметрах трансформера, которые могли у вас возникнуть на CS224N:

  • Во сколько раз размер FF-слоя должен превышать скрытый размер?
  • Сколько голов, и должно ли num_heads всегда делить скрытый размер?
  • Каким должен быть размер словаря?

И другие вопросы о настройке модели:

  • Регуляризуют ли вообще эти огромные LM?
  • Как масштабируют такие модели — очень глубокими или очень широкими?

Удивительно (?) единодушный гиперпараметр 1 (37)

Заголовок раздела «Удивительно (?) единодушный гиперпараметр 1 (37)»

Отношение размерностей FF-слоя и модели. Для FFN(x)=max⁡(0,xW1+b1)W2+b2\mathrm{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 важны две размерности — размерность FF-слоя (dffd_{ff}) и модели (dmodeld_{\text{model}}). Каким должно быть их отношение?

dff=4 dmodel.d_{ff} = 4\, d_{\text{model}}.

Это верно почти всегда. Исключений немного.

Вспомним: варианты GLU уменьшают размер на 2/3. Значит, у большинства вариантов GLU dff=83dmodeld_{ff} = \frac{8}{3} d_{\text{model}}. Так в основном и есть. Известные примеры:

Модельdff/dmodeld_{ff} / d_{\text{model}}
PaLM4
Mistral 7B3.5
LLaMA-2 70B3.5
LLaMA 70B2.68
Qwen 14B2.67
DeepSeek 67B2.68
Yi 34B2.85
T5 v1.12.5

Модели примерно в этом диапазоне, хотя у PaLM, LLaMA-2 и Mistral чуть больше.

Как мы видели (и ещё увидим), у большинства LM скучные, консервативные гиперпараметры. Исключение — T5 [Raffel et al., 2020] с очень смелыми настройками. Для модели на 11B они взяли dff=65 536d_{ff} = 65\,536 и dmodel=1024d_{\text{model}} = 1024 — поразительный множитель 64. [Цитата из статьи: «для 11B мы используем dffd_{ff} = 65 536 со 128-головым вниманием… мы масштабировали dffd_{ff}, потому что современные ускорители (вроде TPU) эффективнее всего на больших плотных матричных умножениях, как в FF-сетях трансформера».]

Другие недавние исключения: Gemma 2 (8×), SmolLM и Gemma 3 (4×, с GLU).

Эмпирически есть «котловина» от 1 до 10, где этот гиперпараметр близок к оптимальному. [График Kaplan et al., 2020: рост loss в зависимости от dff/dmodeld_{ff}/d_{\text{model}} для модели на 50M параметров — около нуля примерно от 1 до 4, затем растёт до 8% при 64.]

  • «Стандартные» dff=4dmodeld_{ff} = 4 d_{\text{model}} и dff=2.66dmodeld_{ff} = 2.66 d_{\text{model}} хорошо сработали почти у всех современных LLM.
  • Но T5 показывает, что работают даже радикальные dff=64dmodeld_{ff} = 64 d_{\text{model}}. Этот выбор не высечен в камне.
  • При этом у T5 есть «улучшенная» модель-продолжение (T5 v1.1) с куда более стандартным множителем 2.5 на GeGLU, так что множитель 64, видимо, неоптимален.

Удивительно (?) единодушный гиперпараметр 2 (42)

Заголовок раздела «Удивительно (?) единодушный гиперпараметр 2 (42)»

Отношение «размерность головы × число голов» к размерности модели. Напоминание — слайд из CS224N: «Многоголовое self-attention вычислительно эффективно: хотя мы считаем hh голов, это не намного дороже. Считаем XQ∈Rn×dXQ \in \mathbb{R}^{n \times d} и переставляем в Rn×h×d/h\mathbb{R}^{n \times h \times d/h} (так же для XKXK, XVXV), затем транспонируем в Rh×n×d/h\mathbb{R}^{h \times n \times d/h} — теперь ось голов как ось батча. Почти всё остальное то же, и матрицы того же размера».

Так быть не обязано: размерность головы может быть больше model_dim / num_heads. Но большинство моделей следует этому правилу.

Сколько голов, какая размерность модели? (43)

Заголовок раздела «Сколько голов, какая размерность модели? (43)»
МодельЧисло головРазмерность головыРазмерность моделиОтношение
GPT-396128122881
T5128128102416
T5 v1.1646440961
LaMDA12812881922
PaLM48258184321.48
LLaMA26412881921

У большинства моделей отношение около 1; заметные исключения — у некоторых моделей Google.

Есть статьи против отношения 1:1 [Bhojanapalli et al., 2020]. [График перплексии от числа параметров при разной размерности головы.] Но на практике мы, похоже, не видим заметных «низкоранговых бутылочных горлышек»…

Делать модель глубокой или широкой? Насколько глубокой и широкой? Здесь большинство моделей тоже удивительно единодушны:

Модельdmodel/nlayerd_{\text{model}} / n_{\text{layer}}
BLOOM205
T5 v1.1171
PaLM (540B)156
GPT-3 / OPT / Mistral / Qwen128
LLaMA / LLaMA2 / Chinchilla102
T5 (11B)43
GPT-233

«Золотая середина» — примерно от 100 до 200.

Очень глубокие модели труднее параллелить, и у них выше задержка. [Цитата из Tay et al., 2021: «Масштабирование глубины имеет очевидное ограничение — слои нельзя распараллелить между устройствами: каждый ждёт предыдущий. Ширину же легко распараллелить на тысячи устройств». Схема: четыре слоя на четырёх GPU, прямой и обратный проход идут по цепочке.]

[График Kaplan et al., 2020: для моделей на 50M, 274M и 1.5B параметров «широкий диапазон архитектур даёт похожее качество» — loss почти не меняется при dmodel/nlayerd_{\text{model}}/n_{\text{layer}} от ~10 до ~200. Графики Tay et al., 2021 — качество в зависимости от FLOPs для разных форм модели.]

Одноязычные модели — 30–50 тысяч токенов; многоязычные и продакшн-системы — 100–250 тысяч.

МодельТокеновМодельТокенов
исходный трансформер37 000mT5250 000
GPT40 257PaLM256 000
GPT-2/350 257GPT-4100 276
T5 / T5 v1.132 128Command A255 000
LLaMA32 000DeepSeek100 000
Qwen 15B152 064
Yi64 000

Одноязычным словарям не нужно быть огромными, а многоязычным — нужно.

Нужна ли регуляризация при предобучении? Аргументы против:

  • данных очень много (триллионы токенов), больше, чем параметров;
  • SGD делает только один проход по корпусу (трудно что-то запомнить).

Звучит разумно… но что делают на практике?

МодельDropout*Weight decay
исходный трансформер0.10
GPT-20.10.1
T50.10
GPT-30.10.1
T5 v1.100
PaLM0(переменный)
OPT0.10.1
LLaMA00.1
Qwen 14B0.10.1

Многие старые модели использовали dropout при предобучении. Новые (кроме Qwen) полагаются только на weight decay.

* Чаще всего статьи dropout просто не обсуждают. У открытых моделей это близко к тому, что dropout нет. Для закрытых моделей это может быть не так.

У [Andriushchenko et al., 2023] интересные наблюдения о weight decay в LLM:

  • он нужен не для борьбы с переобучением [график: loss на валидации почти равен loss на обучении при любом weight decay];
  • weight decay взаимодействует с learning rate (косинусное расписание) [графики: с косинусным затуханием LR модели с weight decay в конце обучения достигают меньшего loss на обучении; при постоянном LR — нет].
  • FF-слой: правило множителя 4 (8/3 для GLU) — стандарт (с некоторыми обоснованиями).
  • Размерность головы: «размерность головы × число голов = dmodeld_{\text{model}}» — стандарт, но почти без проверки.
  • Пропорции: широкий диапазон «хороших» значений (100–200). Значение диктуют системные соображения.
  • Регуляризация: LM всё ещё «регуляризуют», но эффект — в основном на динамике оптимизации.

В последнее время много внимания к стабильному обучению. Не обучайте модели, похожие на синюю кривую! [Графики OLMo 0424 7B (синяя) и OLMo 2 1124 7B (оранжевая): у синей кривая loss в частых всплесках, норма градиента — сплошные пики; у оранжевой обе гладкие.]

Где возникают проблемы? Берегитесь softmax! (54)

Заголовок раздела «Где возникают проблемы? Берегитесь softmax! (54)»

Softmax может вести себя плохо из-за экспонент и деления на ноль. [Схема трансформера с двумя местами softmax: выходной — над словарём, и внутри внимания.]

Вспомним вычисление softmax:

log⁡P(x)=log⁡eUr(x)Z(x)=Ur(x)−log⁡Z(x),Z(x)=∑r′=1∣V∣eUr′(x).\log P(x) = \log \frac{e^{U_r(x)}}{Z(x)} = U_r(x) - \log Z(x), \qquad Z(x) = \sum_{r'=1}^{\lvert V \rvert} e^{U_{r'}(x)}.

Добавим к функции потерь штраф, прижимающий log⁡Z\log Z к нулю [Devlin, 2014]:

L=∑i[log⁡P(xi)−α (log⁡Z(xi)−0)2]=∑i[log⁡P(xi)−αlog⁡2Z(xi)].L = \sum_i \left[\log P(x_i) - \alpha\, (\log Z(x_i) - 0)^2\right] = \sum_i \left[\log P(x_i) - \alpha \log^2 Z(x_i)\right].

Это полезно для стабильности! Приём «z-loss» впервые применили в PaLM: «Мы дополнительно используем вспомогательный loss z_loss=10−4⋅log⁡2Zz\_loss = 10^{-4} \cdot \log^2 Z, чтобы нормализатор softmax был близок к 0; мы обнаружили, что это повышает стабильность обучения». Другие примеры: Baichuan 2 (2023), DCLM (2024), OLMo 2 (2025).

(Примечание переводчика: если log⁡Z≈0\log Z \approx 0, то Z≈1Z \approx 1 и логиты сами по себе почти являются логарифмами вероятностей — в них не накапливаются огромные значения, на которых bf16 теряет точность.)

Запросы и ключи пропускают через LayerNorm (RMSNorm) перед операцией softmax. [Схема блока внимания с LN после проекций Q и K и картинка-мем «STACK MORE LAYER Norms».] Другие примеры: DCLM, OLMo 2, Gemma 2. Изначально пришло из моделей зрения и мультимодальных моделей [Dehghani 2023, Idefics, Chameleon].

Логиты мягко ограничивают сверху через tanh. Из статьи Gemma 2: «Мы ограничиваем логиты в каждом слое внимания и в финальном слое так, чтобы они оставались между −soft_cap и +soft_cap: logits ← soft_cap * tanh(logits / soft_cap). Мы берём soft_cap = 50.0 для слоёв self-attention и 30.0 для финального слоя».

Это не даёт логитам взрываться, но, возможно, вредит качеству? [Таблица перплексий: базовая модель в bf16 — 11.19, soft-cap — 11.24, QK-норма — 10.84.]

Большинство моделей почти не трогают головы внимания, за редкими исключениями:

  • GQA / MQA: экономия на инференсе за счёт уменьшения числа голов;
  • разреженное или скользящее окно внимания (GPT-4, Mistral): ограничение шаблона внимания ради экономии вычислений;
  • экзотика с SSM (Jamba, Falcon 3 и др.): не рассматриваем (простите!).

Подумаем о вычислениях во внимании. [Схема: XQ⋅KTXTXQ \cdot K^T X^T даёт оценки внимания для всех пар, затем softmax, умножение на XVXV и проекция.]

  • Всего арифметических операций: bnd2bnd^2; всего обращений к памяти: bnd+bhn2+d2bnd + bhn^2 + d^2 (входы XX, матрица softmax, проекции).
  • Арифметическая интенсивность высокая: O((1k+1bn)−1)O\left(\left(\frac{1}{k} + \frac{1}{bn}\right)^{-1}\right) — GPU можно держать загруженными.

(Примечание переводчика: bb — размер батча, nn — длина последовательности, dd — размерность модели, hh — число голов, kk — размерность головы.)

А как насчёт инкрементального случая, когда мы генерируем текст? Ключевое отличие: процесс генерации нельзя распараллелить — он идёт шаг за шагом. Здесь внимание нужно инкрементально пересчитывать и обновлять через KV-кэш. [Анимация из статьи о KV-кэше: на каждом шаге добавляется одна строка K и V, новый запрос умножается на весь кэш.]

Какова инкрементальная арифметическая интенсивность?

  • Всего операций: bnd2bnd^2; всего обращений к памяти: bn2d+nd2bn^2 d + nd^2.
  • Интенсивность плохая: O((nd+1b)−1)O\left(\left(\frac{n}{d} + \frac{1}{b}\right)^{-1}\right) — нужны большие батчи и короткие последовательности (nn) или большие размерности модели (dd).

Можно ли это обойти? Член n/dn/d трудно уменьшить.

MQA — просто меньше размерностей ключей (62)

Заголовок раздела «MQA — просто меньше размерностей ключей (62)»

Ключевая идея: запросов много, а ключи и значения — одни на всех. Гораздо меньше данных гоняется в память и обратно (KV-кэш). Всего обращений к памяти: bnd+bn2k+nd2bnd + bn^2 k + nd^2; интенсивность O((1d+ndh+1b)−1)O\left(\left(\frac{1}{d} + \frac{n}{dh} + \frac{1}{b}\right)^{-1}\right). [Схема из блога Fireworks: общие K и V, отдельные Q на каждую голову.]

Не сжимать KV до одной головы — просто сделать голов меньше. Простой регулятор между выразительностью (отношение запросов к ключам) и эффективностью инференса. [Схема: multi-head — у каждого запроса свои ключ и значение; grouped-query — группы запросов делят ключ и значение; multi-query — все запросы делят одни.]

[Таблицы: у MQA небольшая потеря перплексии [Shazeer 2019]; у GQA потеря малая или никакой [Ainslie 2023].]

Разреженное и скользящее окно внимания (65)

Заголовок раздела «Разреженное и скользящее окно внимания (65)»

Внимание ко всему контексту может быть дорогим (квадратичным). Строим разреженное или структурированное внимание, обменивая выразительность на время работы (GPT-3). [Рисунки Child et al., 2019: полная матрица внимания, «шаговый» (strided) и «фиксированный» шаблоны.]

Ещё одна вариация идеи — внимание со скользящим окномвнимание со скользящим окном (SWA)EN sliding window attention (SWA)Токен видит только w последних токенов. Стоимость O(n·w) вместо O(n²), KV-кэш не больше w позиций на слой.: берём только главную часть шагового шаблона, а глубина сети расширяет эффективный контекст (Mistral).

Текущий стандартный приём — чередовать «полное» и «дальнобойное» внимание (67)

Заголовок раздела «Текущий стандартный приём — чередовать «полное» и «дальнобойное» внимание (67)»

Из Cohere Command A: каждый 4-й слой — с полным вниманием. Дальняя информация — через NoPE (без позиционного кодирования), ближняя — через RoPE + скользящее окно. Другие модели: LLaMA 4; Gemma делает скользящее окно + полное внимание с RoPE.

  • Многие аспекты трансформеров (архитектура, гиперпараметры) общие у больших LM.
  • Основные различия? Позиционное кодирование, активации, токенизация.

[Коллаж: слухи о том, что GPT-4 — MoE; анонс Mixtral в X от Mistral AI; Grok; статьи DeepSeekMoE и DeepSeek-V3; Llama 4; OLMoE.]

[Схема из Fedus et al., 2022: плотная модель — один FFN-слой; разреженная — несколько FFN-«экспертов» и маршрутизатор, который направляет каждый токен к одному из них.]

Заменяем большой FF-слой (многими) большими FF-сетями и слоем-селектором. Число экспертов можно увеличивать, не меняя FLOPs.

  • При тех же FLOPs больше параметров — лучше [Fedus et al., 2022]. [Слева: loss на тесте падает с ростом числа экспертов от 1 до 256 при одинаковых FLOPs. Справа: кривые перплексии Switch-Base с 16–128 экспертами лежат ниже плотной T5-Base.]
  • MoE обучаются быстрее [OLMoE]. [Switch-Base с 64 экспертами достигает качества T5-Base в 7 раз быстрее. У OLMoE (1.3B активных, 6.9B всего) против плотной 1.3B — в 2–3 раза меньше токенов или времени до того же качества.]
  • Очень конкурентны по сравнению с плотными аналогами. [График: MMLU в зависимости от числа активированных параметров; DeepSeek-V2 выше всех при ~21B активных, Mixtral 8x22B, Qwen1.5, LLaMA 3 70B — ниже или правее.]
  • Хорошо параллелятся на много устройств. [Схема: эксперты одного слоя размещены на разных устройствах.]

MoE — это большинство самых сильных открытых моделей, и они довольно быстрые. [Таблица из анонса Llama 4 Maverick: сравнение с Gemini 2.0 Flash, DeepSeek v3.1 и GPT-4o по цене и бенчмаркам.]

Ранние результаты MoE от китайских групп — Qwen (9)

Заголовок раздела «Ранние результаты MoE от китайских групп — Qwen (9)»

Китайские LLM-компании тоже много работают над MoE, особенно в малом масштабе.

МодельПараметров, млрдАктивных, млрдMMLUGSM8KHumanEvalМногоязычностьMT-Bench
Mistral-7B7.27.264.147.527.440.07.60
Gemma-7B8.57.864.650.932.3——
Qwen1.5-7B7.77.761.062.536.045.27.60
DeepSeekMoE 16B16.42.845.018.826.8—6.93
Qwen1.5-MoE-A2.7B14.32.762.561.534.240.87.17

Ранние результаты MoE от китайских групп — DeepSeek (10)

Заголовок раздела «Ранние результаты MoE от китайских групп — DeepSeek (10)»

Есть и хорошие недавние абляции MoE, показывающие, что они в целом хороши. [Таблица из статьи DeepSeekMoE: при одинаковых 0.2B активированных параметрах и 100B токенов обучения MoE на 2.0B параметров (Hash Layer, Switch) лучше плотной 0.2B: loss на Pile 1.881 у Switch против 2.060 у плотной; HellaSwag 49.1 против 38.8.]

[Столбчатая диаграмма из техотчёта DeepSeek-V3: MMLU-Pro, GPQA-Diamond, MATH 500, AIME 2024, Codeforces, SWE-bench Verified — DeepSeek-V3 против DeepSeek-V2.5, Qwen2.5-72B, Llama-3.1-405B, GPT-4o и Claude-3.5-Sonnet; на MATH 500 у V3 90.2.]

  • Инфраструктура сложна, преимущества проявляются на многих узлах. [Цитата из Fedus et al., 2022: «На высоком уровне разреженность хороша, когда устройств много и есть куда положить дополнительные параметры… поэтому разреженные модели хороши при обучении с параллелизмом по данным и/или модели или при высокой пропускной способности сервинга».]
  • Целевые функции обучения несколько эвристичны (и иногда нестабильны) [Zoph et al., 2022]. [Графики loss с расхождением обучения.]
  • Типично: заменить MLP слоем MoE.
  • Реже: MoE для голов внимания [ModuleFormer, JetMoE].
  • функция маршрутизации;
  • размеры экспертов;
  • целевые функции обучения.

Многие алгоритмы маршрутизации сводятся к «выбрать top-k». [Три матрицы «эксперты × токены»:]

  • токен выбирает эксперта;
  • эксперт выбирает токен;
  • глобальная маршрутизация через оптимизацию.

Почти все MoE используют стандартную маршрутизацию «токен выбирает top-k». [Недавние абляции OLMoE: «токен выбирает» (TC) и «эксперт выбирает» (EC) — кривые loss, HellaSwag и MMLU почти совпадают, TC чуть лучше.]

Распространённые варианты маршрутизации подробнее (17)

Заголовок раздела «Распространённые варианты маршрутизации подробнее (17)»
  • Top-k — используется в большинстве MoE: Switch Transformer (k = 1), GShard (k = 2), Grok (2), Mixtral (2), Qwen (4), DBRX (4), DeepSeek (7).
  • Хеширование — распространённый базовый вариант.
  • RL для обучения маршрутов — в самых ранних работах (Bengio 2013), сейчас редко.
  • Решение задачи сопоставления — линейное назначение (linear assignment) для маршрутизации; в разных статьях, например Clark ‘22.

Большинство статей используют старую классическую top-k маршрутизацию. Как она работает?

htl=∑i=1N(gi,t FFNi(utl))+utl,h_t^l = \sum_{i=1}^{N} \left(g_{i,t}\, \mathrm{FFN}_i(u_t^l)\right) + u_t^l, gi,t={si,t,si,t∈Topk({sj,t∣1≤j≤N},K),0,иначе,si,t=Softmaxi(utlTeil).g_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} \in \mathrm{Topk}(\{s_{j,t} \mid 1 \le j \le N\}, K), \\ 0, & \text{иначе}, \end{cases} \qquad s_{i,t} = \mathrm{Softmax}_i\left({u_t^l}^T e_i^l\right).
  • gi,tg_{i,t} — вентиль (gating); вентили выбирает логистический регрессор (si,ts_{i,t}).
  • Это маршрутизатор DeepSeek (V1–2) (так же делают Grok и Qwen).
  • Mixtral, DBRX и DeepSeek-V3 применяют softmax после TopK [Dai et al., 2024].

(Примечание переводчика: utlu_t^l — вход токена tt в слой ll, eile_i^l — обучаемый вектор-«центроид» эксперта ii; сумма с utlu_t^l — это остаточная связь.)

Недавние вариации от DeepSeek и других китайских LM (20)

Заголовок раздела «Недавние вариации от DeepSeek и других китайских LM (20)»

Эксперты меньше, их больше, плюс несколько общих экспертовобщий экспертEN shared expertКлючевая идея DeepSeekMoE., которые включены всегда. (Используется в DeepSeek и Qwen; идея — из DeepSpeed-MoE.) [Схема из DeepSeekMoE: (a) обычная top-2 маршрутизация, (b) + мелкое дробление экспертов (2N экспертов, K = 4), (c) + изоляция общего эксперта (DeepSeekMoE).]

Больше экспертов и общие эксперты, похоже, в целом помогают. [Столбцы: на HellaSwag, PIQA, ARC, TriviaQA, NaturalQuestions каждое добавление — мелкие эксперты, общий эксперт — улучшает нормированное качество.]

Выигрыш от мелкозернистых экспертов есть, от общих — нет. [Кривые: 32 маршрутизируемых эксперта против 31 + 1 общего — одинаково; 8 → 32 → 64 эксперта — лучше.]

МодельМаршрутизируемыхАктивныхОбщихДоля дробления
GShard204820
Switch Transformer6410
ST-MoE6420
Mixtral820
DBRX1640
Grok820
DeepSeek v164621/4
Qwen 1.560441/8
DeepSeek v3256811/14
OLMoE64801/8
MiniMax3220~1/4
Llama 4 (Maverick)128111/2

(Примечание переводчика: «доля дробления» — во сколько раз эксперт меньше стандартного FFN плотной модели того же размера.)

Главная трудность: разреженность нужна для эффективности обучения… но разреженные решения вентилей недифференцируемы! Решения?

  1. Обучение с подкреплением, чтобы оптимизировать политику вентилей.
  2. Стохастические возмущения.
  3. Эвристические «балансировочные» функции потерь.

Угадайте, что используют на практике?

RL через REINFORCE работает, но не настолько лучше, чтобы это была явная победа. [Графики Clark et al., 2020: loss на валидации в зависимости от числа экспертов для S-BASE, RL-R и Hash — линии близки.] RL — «правильное решение», но из-за дисперсии градиентов и сложности им широко не пользуются.

Из Shazeer et al., 2017 — решения маршрутизации стохастические, с гауссовым шумом:

G(x)=Softmax(KeepTopK(H(x),k)),H(x)i=(x⋅Wg)i+StandardNormal()⋅Softplus((x⋅Wnoise)i),G(x) = \mathrm{Softmax}(\mathrm{KeepTopK}(H(x), k)), \qquad H(x)_i = (x \cdot W_g)_i + \mathrm{StandardNormal}() \cdot \mathrm{Softplus}((x \cdot W_{\text{noise}})_i),

где KeepTopK(v,k)i=vi\mathrm{KeepTopK}(v, k)_i = v_i, если viv_i среди kk наибольших элементов vv, и −∞-\infty иначе.

  1. Это естественно приводит к немного более устойчивым экспертам.
  2. Благодаря softmax модель учится ранжировать K экспертов.

Стохастический «джиттер» в Fedus et al., 2022: равномерное мультипликативное возмущение логитов маршрутизатора (router_logits *= uniform(1 - eps, 1 + eps)) с той же целью — менее хрупкие эксперты. Позже его убрали в Zoph et al., 2022. [Таблица: доля стабильных запусков — базовая модель 4/6, с джиттером входа 3/3, с dropout 3/3.]

Эвристические балансировочные функции потерь (28)

Заголовок раздела «Эвристические балансировочные функции потерь (28)»

Ещё одна ключевая проблема — системная эффективность требует, чтобы эксперты использовались равномерно… Из Switch Transformer [Fedus et al., 2022]: к общей функции потерь для каждого слоя Switch добавляется вспомогательная. Для NN экспертов и батча B\mathcal{B} из TT токенов:

loss=α⋅N⋅∑i=1Nfi⋅Pi,fi=1T∑x∈B1{arg⁡max⁡p(x)=i},Pi=1T∑x∈Bpi(x),\text{loss} = \alpha \cdot N \cdot \sum_{i=1}^{N} f_i \cdot P_i, \qquad f_i = \frac{1}{T} \sum_{x \in \mathcal{B}} \mathbb{1}\{\arg\max p(x) = i\}, \qquad P_i = \frac{1}{T} \sum_{x \in \mathcal{B}} p_i(x),

где fif_i — доля токенов, отправленных эксперту ii, а PiP_i — доля вероятности маршрутизатора, выделенная эксперту ii.

Производная по pi(x)p_i(x) равна αNT2∑1arg⁡max⁡p(x)=i\frac{\alpha N}{T^2} \sum \mathbb{1}_{\arg\max p(x) = i}, так что чем чаще эксперта используют, тем сильнее его «притормаживают».

  • Балансировка по экспертам — как в Switch Transformer: LExpBal=α1∑i=1N′fiPi\mathcal{L}_{\text{ExpBal}} = \alpha_1 \sum_{i=1}^{N'} f_i P_i, fi=N′K′T∑t=1T1(токен t выбирает эксперта i)f_i = \frac{N'}{K'T} \sum_{t=1}^{T} \mathbb{1}(\text{токен } t \text{ выбирает эксперта } i), Pi=1T∑t=1Tsi,tP_i = \frac{1}{T}\sum_{t=1}^{T} s_{i,t}.
  • Балансировка по устройствам — та же цель, но агрегированная по устройствам: LDevBal=α2∑i=1Dfi′Pi′\mathcal{L}_{\text{DevBal}} = \alpha_2 \sum_{i=1}^{D} f'_i P'_i, fi′=1∣Ei∣∑j∈Eifjf'_i = \frac{1}{\lvert \mathcal{E}_i \rvert} \sum_{j \in \mathcal{E}_i} f_j, Pi′=∑j∈EiPjP'_i = \sum_{j \in \mathcal{E}_i} P_j.

Вариант DeepSeek-V3 — смещения для каждого эксперта (30)

Заголовок раздела «Вариант DeepSeek-V3 — смещения для каждого эксперта (30)»

Заводим для каждого эксперта смещение (bias), повышающее его шансы получить токены, и подбираем его онлайн-обучением:

gi,t′={si,t,si,t+bi∈Topk({sj,t+bj∣1≤j≤Nr},Kr),0,иначе.g'_{i,t} = \begin{cases} s_{i,t}, & s_{i,t} + b_i \in \mathrm{Topk}(\{s_{j,t} + b_j \mid 1 \le j \le N_r\}, K_r), \\ 0, & \text{иначе}. \end{cases}

Они называют это балансировкой без вспомогательного лоссабалансировка без вспомогательного лоссаEN auxiliary-loss-free load balancingМетод DeepSeek (arXiv:2408.15664, использован в V3) — к оценкам роутера прибавляется смещение b_i, влияющее только на выбор экспертов; после каждого шага b_i сдвигается на ±γ по загрузке. (но подход не полностью без него…): дополнительно используется «последовательностный» вспомогательный loss LBal=α∑i=1NrfiPi\mathcal{L}_{\text{Bal}} = \alpha \sum_{i=1}^{N_r} f_i P_i, где fif_i и PiP_i считаются по токенам одной последовательности, — чтобы избежать крайнего дисбаланса внутри неё.

Что будет, если убрать балансировочные потери? (31)

Заголовок раздела «Что будет, если убрать балансировочные потери? (31)»

[Графики OLMoE: без балансировочного loss (LBL) качество хуже; доля токенов по 8 экспертам без балансировки — один-два эксперта забирают большую часть, с балансировкой — все около 1/8.]

MoE хорошо параллелятся — каждый FFN помещается на одно устройство. Это открывает дополнительные виды параллелизма. [Схема из Switch Transformer: как распределяются веса и данные по ядрам при параллелизме по данным, по модели, по экспертам и их комбинациях.]

Маршрутизация MoE даёт параллелизм, но и некоторые сложности. Современные библиотеки вроде MegaBlocks (используется во многих открытых MoE) применяют более умные разреженные матричные умножения. [Схема: батч независимых матричных умножений по экспертам, блочно-диагональное умножение и блочно-разреженное умножение для разного числа токенов у экспертов.]

Забавный побочный вопрос — стохастичность MoE-моделей (34)

Заголовок раздела «Забавный побочный вопрос — стохастичность MoE-моделей (34)»

Были предположения, что стохастичность GPT-4 вызвана MoE… Откуда у MoE лишняя случайность? Отбрасывание токенов (token dropping) при маршрутизации происходит на уровне батча — значит, запросы других людей могут отбросить ваш токен! [Схема: маршрутизация, перестановка токенов по экспертам с ограниченной ёмкостью — лишние токены отбрасываются, вычисление и обратная перестановка.]

[Сноска из Zoph et al., 2022: у экспонент маленькое возмущение входа может сильно изменить выход. Пример: в softmax подаются 10 логитов по 128 и один 128.5. Ошибка округления 0.5 в bfloat16 изменит выход softmax на 36% и неверно сделает все логиты равными: вероятность меняется примерно с 0.142 до 0.091. Это происходит потому, что максимум вычитается из всех логитов (ради численной устойчивости), и ошибка округления меняет 128.5 на 128.]

Решение: считать маршрутизатор экспертов во float32 (иногда с вспомогательным z-loss):

Lz(x)=1B∑i=1B(log⁡∑j=1Nexj(i))2.L_z(x) = \frac{1}{B} \sum_{i=1}^{B} \left(\log \sum_{j=1}^{N} e^{x_j^{(i)}}\right)^2.

Что будет, если убрать z-loss? [Графики OLMoE: без z-loss в кривых loss обучения и валидации частые всплески, HellaSwag и MMLU немного хуже.]

Разреженные MoE могут переобучаться на небольших данных дообучения. [График: на SuperGLUE CB разреженная модель лучше на обучении, но хуже на валидации, чем плотная.]

  • Решение Zoph et al. — дообучать только не-MoE MLP. [Столбцы: дообучение всех параметров, только не-MoE, только MoE, только внимания, только FFN.]
  • Решение DeepSeek — много данных: 1,4 млн примеров SFT.

Можно ли инициализировать MoE предобученной LM? [Схема: копируем MLP плотного блока в несколько экспертов, добавляем маршрутизатор. График: upcycling даёт лучшую точность, чем продолжение обучения плотной модели, при том же дополнительном бюджете TPU.]

Берёт модель MiniCPM (top-k = 2, 8 экспертов, ~4B активных параметров). Простая MoE, показывает выигрыш относительно базовой модели при ~520B токенов обучения. [Таблица: MiniCPM-MoE (13.6B) выше MiniCPM-2.4B на C-Eval, CMMLU, MMLU, HumanEval, MBPP, GSM8K, MATH, BBH.]

Qwen MoE инициализирован моделью Qwen 1.8B; top-k = 4, 60 экспертов и 4 общих. Архитектура и настройка похожи на DeepSeekMoE, но это один из первых (подтверждённых) успехов upcycling. [Та же таблица, что на слайде 9.]

В завершение пройдёмся по архитектуре MoE от DeepSeek.

V1 (16B, 2.8B активных): общие (2) + мелкозернистые (64/4) эксперты; стандартная top-k маршрутизация; стандартная балансировка вспомогательными потерями (по экспертам + по устройствам).

V2 (236B, 21B активных): общие (2) + мелкозернистые (160/10) эксперты, 6 активных. Новое:

  • маршрутизация top-M по устройствам (сначала выбираются M устройств, затем эксперты только на них);
  • балансировочный loss для коммуникаций — балансирует обмен и на вход, и на выход.

V3 (671B, 37B активных) (на слайде опечатка — «V2»): общий (1) + мелкозернистые (на слайде — 258) эксперты, 8 активных. Новое:

  • сигмоида + softmax, top-K + top-M: si,t=Sigmoid(utTei)s_{i,t} = \mathrm{Sigmoid}(u_t^T e_i), вентили нормируются по выбранным экспертам gi,t=gi,t′/∑jgj,t′g_{i,t} = g'_{i,t} / \sum_j g'_{j,t};
  • балансировка без вспомогательного лосса + последовательностный вспомогательный loss.

(Примечание переводчика: маршрутизируемых экспертов у DeepSeek-V3 256 — как в таблице на слайде 23.)

Бонус: что ещё нужно, чтобы сделать DeepSeek MoE v3? (44)

Заголовок раздела «Бонус: что ещё нужно, чтобы сделать DeepSeek MoE v3? (44)»

MLA — многоголовое латентное вниманиемногоголовое латентное внимание (MLA)EN multi-head latent attention (MLA)Предложено DeepSeek в DeepSeek-V2 (2024).. Основная идея: выразить Q, K, V как функции «латентной» активации меньшей размерности. [Схема MLA из статьи DeepSeek-V2.]

Основная идея: выразить Q, K, V как функции латентной активации меньшей размерности:

ctKV=WDKVht,ktC=WUKctKV,vtC=WUVctKV.c_t^{KV} = W^{DKV} h_t, \qquad k_t^C = W^{UK} c_t^{KV}, \qquad v_t^C = W^{UV} c_t^{KV}.

Выгода: в KV-кэше нужно хранить только ctKVc_t^{KV}, а он может быть гораздо меньше. WUKW^{UK} можно слить с проекцией Q. (Запросы тоже сжимают — ради экономии памяти при обучении: ctQ=WDQhtc_t^Q = W^{DQ} h_t, qtC=WUQctQq_t^C = W^{UQ} c_t^Q.)

Сложность: RoPE конфликтует с кэшированием в стиле MLA.

  • Без RoPE: ⟨Q,K⟩=⟨hWQ,WUKctKV⟩=⟨h WQWUK,ctKV⟩\langle Q, K \rangle = \langle h W^Q, W^{UK} c_t^{KV} \rangle = \langle h\, W^Q W^{UK}, c_t^{KV} \rangle.
  • С RoPE: ⟨QRq,RkK⟩=⟨hWQRq,RkWUKctKV⟩=⟨h WQRqRkWUK,ctKV⟩\langle Q R_q, R_k K \rangle = \langle h W^Q R_q, R_k W^{UK} c_t^{KV} \rangle = \langle h\, W^Q R_q R_k W^{UK}, c_t^{KV} \rangle — матрица поворота зависит от позиции и встаёт между WQW^Q и WUKW^{UK}, их уже нельзя заранее перемножить.

Решение — несколько нелатентных размерностей ключа, которые можно поворачивать.

MTP: небольшие лёгкие модели, предсказывающие на несколько шагов вперёд (но MTP делают только на один токен вперёд). [Схемы из DeepSeek-V3 и EAGLE; абляции — в статье.]

  • MoE используют разреженность — не каждому входу нужна вся модель.
  • Дискретная маршрутизация сложна, но эвристики top-k, похоже, работают.
  • Теперь много эмпирических данных, что MoE работают и экономически выгодны.

  1. Возьмите блок из урока 4.5.3 и посчитайте параметры FFN для dmodel=512d_{\text{model}} = 512: с ReLU и dff=4dmodeld_{ff} = 4 d_{\text{model}} и со SwiGLU и dff=83dmodeld_{ff} = \frac{8}{3} d_{\text{model}}. Убедитесь, что они почти равны (у SwiGLU три матрицы вместо двух — отсюда множитель 2/3).
  2. Реализуйте z-loss: к кросс-энтропии добавьте 1e-4 * torch.logsumexp(logits, dim=-1).pow(2).mean() и сравните норму логитов в конце короткого обучения с ним и без него.
  3. Повторите пример со слайда 35 лекции 4: вычислите softmax от десяти логитов 128 и одного 128.5 во float32 и в bfloat16 (torch.tensor(..., dtype=torch.bfloat16)). Что происходит с 128.5 при переводе в bfloat16?
  4. Реализуйте маршрутизатор top-k со вспомогательным loss Switch Transformer и проверьте на случайных данных, что loss минимален (равен α\alpha) при равномерной загрузке экспертов. Сравните с домашней работой модуля 5.3.
ENRU
pre-norm / post-normнормализация на входе подслоя / после сложения
RMSNorm, bias termRMSNorm, свободный член
gated linear unit (GLU), SwiGLUвентильный линейный блок, SwiGLU
parallel layersпараллельные слои (внимание и MLP одновременно)
rotary position embedding (RoPE)вращательное позиционное кодирование
aspect ratioпропорции модели (ширина к глубине)
z-loss, QK norm, logit soft-cappingz-loss, QK-нормализация, мягкое ограничение логитов
arithmetic intensityарифметическая интенсивность
MQA, GQAмногозапросное внимание, внимание с группами запросов
sliding window attentionвнимание со скользящим окном
mixture of experts (MoE), routerсмесь экспертов, маршрутизатор
token choice / expert choiceтокен выбирает эксперта / эксперт выбирает токен
shared / fine-grained expertsобщие / мелкозернистые эксперты
load balancing lossбалансировочная функция потерь
token dropping, capacityотбрасывание токенов, ёмкость эксперта
upcyclingапсайклинг (инициализация MoE плотной моделью)
multi-head latent attention (MLA)многоголовое латентное внимание