Формулы математического анализа для ML¶
~5 минут чтения
Предварительно: Подготовка к интервью по математике
Математический анализ -- механизм обучения каждой нейросети. Backpropagation -- это chain rule, применённый к вычислительному графу: GPT-4 вычисляет ~1.8 триллиона частных производных за один backward pass. Gradient descent -- итеративное применение формулы theta = theta - lr * grad(L). Знание производных активаций (sigmoid'(x) = sigma(x)(1-sigma(x))) критично для понимания vanishing gradients: при 50 слоях с sigmoid градиент уменьшается в (0.25)^50 раз. Вопросы на вывод градиентов MSE, Cross-Entropy и Softmax+CE встречаются на 50%+ ML-интервью. Log-sum-exp trick предотвращает numerical overflow в softmax -- без него модель крашится на logits > 700.
Производные¶
Основные правила¶
Chain Rule¶
Базовые производные¶
| Функция | Производная |
|---|---|
| \(x^n\) | \(nx^{n-1}\) |
| \(e^x\) | \(e^x\) |
| \(a^x\) | \(a^x \ln a\) |
| \(\ln x\) | \(\frac{1}{x}\) |
| \(\log_a x\) | \(\frac{1}{x \ln a}\) |
| \(\sin x\) | \(\cos x\) |
| \(\cos x\) | \(-\sin x\) |
| \(\tan x\) | \(\sec^2 x = \frac{1}{\cos^2 x}\) |
Производные для ML¶
Sigmoid¶
Tanh¶
ReLU¶
Leaky ReLU¶
Softplus¶
GELU (приближение)¶
Log¶
Частные производные¶
Градиент¶
Направление наибольшего роста¶
указывает в направлении наибольшего роста функции
Производная по направлению¶
Градиенты для Loss функций¶
MSE¶
Cross-Entropy¶
Binary Cross-Entropy¶
Softmax + Cross-Entropy¶
где \(p_i = \text{softmax}(z_i)\), \(y\) — one-hot
Гессиан¶
Определение¶
Условие минимума¶
- \(\nabla f = 0\) (стационарная точка)
- \(\mathbf{H}\) положительно определена (локальный минимум)
Условие седловой точки¶
- \(\nabla f = 0\)
- \(\mathbf{H}\) имеет разные знаки собственных значений
Оптимизация¶
Gradient Descent¶
Newton's Method¶
Taylor Expansion (первый порядок)¶
Taylor Expansion (второй порядок)¶
Интегралы¶
Основные¶
Гауссов интеграл¶
Гамма-функция¶
Backpropagation¶
Chain Rule для композиций¶
Для нескольких путей¶
Пример: Dense Layer¶
Полезные тождества¶
Производная softmax¶
где \(\delta_{ij}\) — дельта Кронекера
Log-sum-exp trick¶
где \(c = \max_i x_i\) (для численной стабильности)
Производная log-softmax¶
Типичные заблуждения¶
Заблуждение: градиент softmax + cross-entropy сложный
Отдельно производная softmax -- матрица Якоби p_i * (delta_ij - p_j). Отдельно производная CE -- (-y_i / p_i). Но их композиция элегантно упрощается до dL/dz_i = p_i - y_i. Это одна из причин, почему CE используется именно с softmax: простой градиент, быстрый backward. Если на интервью вас просят вывести градиент -- выводите сразу для пары, не по отдельности.
Заблуждение: ReLU не дифференцируем, значит gradient descent не работает
ReLU не дифференцируем в одной точке x=0. На практике вероятность попасть ровно в 0 при float32 -- исчезающе мала. В PyTorch/TensorFlow для x=0 субградиент определён как 0. Это не мешает обучению: сходимость SGD доказана для субдифференцируемых функций. Настоящая проблема ReLU -- dying neurons (40--50% нейронов могут "умереть" при большом learning rate), что решается Leaky ReLU или PReLU.
Заблуждение: Newton's method всегда быстрее gradient descent
Метод Ньютона имеет квадратичную сходимость vs линейная у GD. Но вычисление Hessian стоит O(n^2) памяти и O(n^3) для инверсии, где n -- количество параметров. Для GPT-3 с 175B параметров Hessian занял бы ~10^20 float32 = 10^11 ТБ. Поэтому на практике используют приближения: L-BFGS (квази-ньютоновский, хранит ~10 последних градиентов), Adam (адаптивный lr с momentum), или natural gradient (использует Fisher information matrix).
Интервью¶
Выведите градиент Binary Cross-Entropy по предсказанию модели.
"dL/dy_hat = -y/y_hat ... или что-то такое"
"L = -[y * log(y_hat) + (1-y) * log(1-y_hat)]. Берём производную: dL/dy_hat = -y/y_hat + (1-y)/(1-y_hat). Приводим к общему знаменателю: = (-y(1-y_hat) + (1-y)y_hat) / (y_hat(1-y_hat)) = (y_hat - y) / (y_hat(1-y_hat)). Важно: если y_hat близко к 0 или 1, знаменатель стремится к 0 и градиент взрывается -- поэтому на практике используют BCEWithLogitsLoss, которая принимает logits до sigmoid и численно стабильна."
Почему для softmax используют log-sum-exp trick?
"Для скорости вычислений"
"Для численной стабильности, не скорости. softmax(z_i) = exp(z_i) / sum(exp(z_j)). Если max(z) = 1000, то exp(1000) = inf в float32 (overflow при z > 709). Trick: log(sum(exp(z_i))) = c + log(sum(exp(z_i - c))), где c = max(z). Вычитая c, все экспоненты <= 1, overflow невозможен. В PyTorch это реализовано в torch.nn.functional.log_softmax и CrossEntropyLoss. Без этого трика модель NaN-ится на logits > 700."
Объясните chain rule в контексте backpropagation.
"Это когда мы перемножаем производные слоёв"
"Chain rule: dL/dx = dL/dy * dy/dx. В нейросети с N слоями: dL/dW_1 = dL/dz_N * dz_N/dz_{N-1} * ... * dz_2/dz_1 * dz_1/dW_1. Это произведение Якобианов. Проблема: при sigmoid каждый множитель <= 0.25, после 50 слоёв градиент = (0.25)^50 ~ 10^{-30} -- vanishing gradient. Решения: ReLU (множитель = 1 для x>0), skip connections (ResNet -- добавляет единичную матрицу к Якобиану), нормализация (BatchNorm, LayerNorm). На практике autograd в PyTorch строит computational graph и применяет chain rule автоматически через .backward()."
See Also¶
- Linear Algebra -- матричное дифференцирование, гессиан, градиенты по матрицам
- Loss Functions -- gradient формулы для MSE, BCE, Cross-Entropy
- Probability & Statistics -- MLE = оптимизация log-likelihood, связь с loss
- PyTorch Cheatsheet -- autograd, backward(), optimizer.step()
- Activation Functions in LLMs -- GELU, SwiGLU, sigmoid и их производные в контексте трансформеров