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

Обозначения и математический минимум

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

СимволСмыслКлюч конфига / имя в кодеПример (учебный конфиг)
BBразмер батча — сколько последовательностей обрабатывается одновременноbatch_size2
TTдлина последовательности (куска токенов, поданного в модель)seq_lenдо 128
Tmax⁡T_{\max}максимальная длина контекстаmax_position_embeddings128 или 512
VVразмер словаряvocab_size~1000
ddразмерность модели: эмбеддинга и скрытого состоянияembed_dim, emb_size256
LLчисло блоков декодераnum_layers4
HHчисло голов Q (запросов)num_heads, num_q_heads4
GGчисло голов K/V (ключей и значений)num_kv_heads2
dhd_hразмер одной головыhead_size64
dffd_{ff}скрытый размер feed-forward сетиintermediate_size1024
EEчисло экспертов MoEnum_experts8
kkсколько экспертов выбирается на токенtop_k_experts2
WWширина скользящего окна вниманияwindow_size16

Обычно H⋅dh=dH \cdot d_h = d, а dff=4dd_{ff} = 4d, но в некоторых моделях это не так — каждый раз это оговаривается.

СимволСмысл
xtx_tтокен (целое число от 0 до V−1V-1) на позиции tt; позиции нумеруются с 0
x<tx_{<t}все токены до позиции tt: x0,…,xt−1x_0, \dots, x_{t-1}
ht∈Rd\mathbf{h}_t \in \mathbb{R}^{d}скрытое состояние (вектор) позиции tt
X∈RT×dX \in \mathbb{R}^{T \times d}матрица скрытых состояний: строка tt — вектор позиции tt
H(l)∈RT×dH^{(l)} \in \mathbb{R}^{T \times d}выход блока декодера l=1,…,Ll = 1, \dots, L; H(0)H^{(0)} — вход первого блока (эмбеддинги)
U(l)∈RT×dU^{(l)} \in \mathbb{R}^{T \times d}состояние внутри блока ll после attention-подслоя (главы части II)
E∈RV×dE \in \mathbb{R}^{V \times d}матрица эмбеддингов токенов; E[xt]E[x_t] — её строка. В главах о MoE EE — число экспертов, и матрица эмбеддингов там обозначается EtokE_{\text{tok}}
Z∈RT×VZ \in \mathbb{R}^{T \times V}матрица логитов для всей последовательности; строка ZtZ_t — вектор z\mathbf{z} позиции tt
Q,K,VQ, K, Vматрицы запросов, ключей и значений в attention (не путать VV-матрицу со словарём — из контекста всегда ясно)
WQ,WK,WV,WOW_Q, W_K, W_V, W_Oматрицы весов проекций attention
z∈RV\mathbf{z} \in \mathbb{R}^{V}logits — ненормированные оценки токенов
p∈RV\mathbf{p} \in \mathbb{R}^{V}распределение вероятностей следующего токена, p=softmax(z)\mathbf{p} = \mathrm{softmax}(\mathbf{z})
L\mathcal{L}функция потерь (loss)
θ\thetaвсе обучаемые параметры модели; в главе о RoPE θi\theta_i — частота ii-й пары координат
η\etaскорость обучения (learning rate)
τ\tauтемпература при генерации
⊙\odotпоэлементное произведение (произведение Адамара)
[ a; b ][\,a;\,b\,]конкатенация векторов

В пособии, как и в PyTorch, вектор — это строка, а линейный слой умножает её на матрицу справа:

y=xW+b,x∈Rdin,  W∈Rdin×dout,  b∈Rdout,  y∈Rdout\mathbf{y} = \mathbf{x} W + \mathbf{b}, \qquad \mathbf{x} \in \mathbb{R}^{d_{in}},\; W \in \mathbb{R}^{d_{in} \times d_{out}},\; \mathbf{b} \in \mathbb{R}^{d_{out}},\; \mathbf{y} \in \mathbb{R}^{d_{out}}

где:

  • x\mathbf{x} — входной вектор длины dind_{in};
  • WW — матрица весов: столбец jj — это веса, с которыми входы складываются в выход jj;
  • b\mathbf{b} — сдвиг (bias);
  • y\mathbf{y} — выход длины doutd_{out}.

Для матрицы X∈RT×dinX \in \mathbb{R}^{T \times d_{in}} из TT строк то же умножение применяется к каждой строке сразу: Y=XW+bY = XW + \mathbf{b} (b\mathbf{b} прибавляется к каждой строке). Число параметров слоя — din⋅dout+doutd_{in} \cdot d_{out} + d_{out}.

В PyTorch nn.Linear(d_in, d_out) хранит матрицу транспонированной (weight имеет форму [d_out, d_in]) и считает x @ weight.T + bias — результат тот же.

Пример: x=(1,2)\mathbf{x} = (1, 2), W=(10−1210)W = \begin{pmatrix} 1 & 0 & -1 \\ 2 & 1 & 0 \end{pmatrix}, b=(0,0,1)\mathbf{b} = (0, 0, 1). Тогда y=(1⋅1+2⋅2,  1⋅0+2⋅1,  1⋅(−1)+2⋅0)+b=(5,2,0)\mathbf{y} = (1\cdot1 + 2\cdot2,\; 1\cdot0 + 2\cdot1,\; 1\cdot(-1) + 2\cdot0) + \mathbf{b} = (5, 2, 0).

Тензор — многомерный массив. Форма пишется в квадратных скобках, как в PyTorch: [B, T, d] — батч из BB последовательностей по TT векторов размерности dd. В attention добавляется ось голов: [B, H, T, d_h]. Операции над последней осью (линейный слой, нормализация, softmax по ключам) применяются независимо ко всем остальным индексам.

a⋅b=∑i=1naibi,∥a∥=a⋅a,cos⁡(a,b)=a⋅b∥a∥ ∥b∥\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i, \qquad \|\mathbf{a}\| = \sqrt{\mathbf{a} \cdot \mathbf{a}}, \qquad \cos(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\|\,\|\mathbf{b}\|}

Скалярное произведение велико, когда векторы смотрят в одну сторону и длинные; косинус измеряет только угол. На скалярном произведении построен attention: «насколько запрос похож на ключ».

Softmax превращает вектор произвольных чисел z\mathbf{z} в распределение вероятностей:

softmax(z)i=ezi∑j=1nezj\mathrm{softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}

где:

  • ziz_i — ii-я компонента входа (logit);
  • знаменатель — нормировка, чтобы сумма выходов была равна 1.

Свойства: все выходы положительны; больший ziz_i даёт большую вероятность; прибавление одной и той же константы ко всем ziz_i результат не меняет (поэтому на практике вычитают max⁡jzj\max_j z_j, чтобы eze^{z} не переполнялось). Пример: z=(2,1,0)\mathbf{z} = (2, 1, 0) → ez≈(7.389,2.718,1)e^{\mathbf{z}} \approx (7.389, 2.718, 1), сумма ≈11.107\approx 11.107, softmax≈(0.665,0.245,0.090)\mathrm{softmax} \approx (0.665, 0.245, 0.090).

Логарифм ln⁡\ln — натуральный. Полезные факты: ln⁡(ab)=ln⁡a+ln⁡b\ln(ab) = \ln a + \ln b (произведение вероятностей превращается в сумму логарифмов), ln⁡1=0\ln 1 = 0, ln⁡p<0\ln p < 0 при 0<p<10 < p < 1.

  • P(xt∣x<t)P(x_t \mid x_{<t}) — условная вероятность токена xtx_t при известных предыдущих.
  • Математическое ожидание E[X]\mathbb{E}[X] — среднее значение случайной величины; дисперсия Var[X]=E[(X−EX)2]\mathrm{Var}[X] = \mathbb{E}[(X - \mathbb{E}X)^2] — средний квадрат отклонения.
  • Для независимых X,YX, Y с нулевым средним: Var[X+Y]=Var[X]+Var[Y]\mathrm{Var}[X + Y] = \mathrm{Var}[X] + \mathrm{Var}[Y] и Var[XY]=Var[X] Var[Y]\mathrm{Var}[XY] = \mathrm{Var}[X]\,\mathrm{Var}[Y]. Эти два факта объясняют масштаб 1/dh1/\sqrt{d_h} в attention и инициализацию весов.
  • N(μ,σ2)\mathcal{N}(\mu, \sigma^2) — нормальное распределение со средним μ\mu и дисперсией σ2\sigma^2; «веса инициализируются N(0,0.022)\mathcal{N}(0, 0.02^2)» значит «со стандартным отклонением 0.02».
  • Градиент ∇θL\nabla_\theta \mathcal{L} — вектор частных производных loss по всем параметрам; показывает направление наибыстрейшего роста. Обучение делает шаг в обратную сторону: θ←θ−η∇θL\theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}.
  • Цепное правило: если y=f(g(x))y = f(g(x)), то dydx=f′(g(x)) g′(x)\frac{dy}{dx} = f'(g(x))\, g'(x). Обратное распространение ошибки (backpropagation) — это цепное правило, применённое ко всему графу вычислений от loss к каждому параметру; в PyTorch его выполняет loss.backward().

O(⋅)O(\cdot) описывает, как растут время или память с ростом размера: attention стоит O(T2d)O(T^2 d) операций — удвоение длины текста учетверяет работу.

После каждой формулы идёт список «где: …» с расшифровкой всех символов и форм тензоров, затем объяснение словами и, по возможности, числовой пример. Если в формуле встречается незнакомый символ — ищите его в таблицах выше или в глоссарии.