Обучение модели это поиск параметров, при которых функция потерь минимальна. Чтобы знать, куда двигать параметры, нужна производная. На собесе спрашивают определения, просят посчитать градиент простой функции и проверить его численно.
Производная
Производная f'(x) это скорость изменения f в точке, наклон касательной. Основные правила:
- (xⁿ)' = n·xⁿ⁻¹, (eˣ)' = eˣ, (ln x)' = 1/x;
- (f + g)' = f' + g', (f·g)' = f'g + fg';
- цепное правило: (f(g(x)))' = f'(g(x))·g'(x).
Важная производная для ML: сигмоида σ(x) = 1 / (1 + e⁻ˣ) имеет σ'(x) = σ(x)(1 - σ(x)). Максимум 0.25 в нуле. Отсюда затухание градиентов в глубоких сетях на сигмоидах.
Частные производные и градиент
Если функция зависит от нескольких переменных, частная производная по одной из них считается, когда остальные зафиксированы. Пример: f(x, y) = x² + 3xy.
∂f/∂x = 2x + 3y
∂f/∂y = 3x
Градиент это вектор всех частных производных: ∇f = (∂f/∂x, ∂f/∂y). Он указывает направление наискорейшего роста, длина равна скорости роста. Поэтому градиентный спуск делает шаг против градиента.
Градиент MSE линейной регрессии ŷ = Xw:
L = (1/n)·Σ(ŷᵢ - yᵢ)²
∇L = (2/n)·Xᵀ(Xw - y)
Якобиан и гессиан
- Якобиан векторной функции f: Rⁿ → Rᵐ это матрица m×n первых производных, J[i][j] = ∂fᵢ/∂xⱼ. Это линейное приближение функции около точки. Цепное правило для векторных функций это произведение якобианов.
- Гессиан скалярной функции это матрица n×n вторых производных. Он описывает кривизну.
В точке с нулевым градиентом (стационарной):
- все собственные значения гессиана положительные: локальный минимум;
- все отрицательные: максимум;
- разных знаков: седло. Пример f = x² - y² в нуле.
Нулевой градиент ещё не означает минимум.
Негладкие функции
ReLU и |x| не дифференцируемы в нуле. Используют субградиент: любое значение между левой и правой производной. PyTorch для ReLU в нуле берёт 0. На обучение это практически не влияет: точное попадание в ноль редкость.
Численная проверка градиента
Если вы пишете backward руками, сравните его с численной производной:
def numeric(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
- Центральная разность точнее прямой: ошибка O(h²) против O(h).
- Слишком маленький h (1e-12) ломается на округлении: вычитаются почти равные числа.
- Считайте в float64, сравнивайте относительную ошибку |a - n| / max(|a|, |n|). Около 1e-7 хорошо, около 1e-2 ошибка в коде.
- В PyTorch есть готовый
torch.autograd.gradcheck.
Частые ошибки
- Забыть производную внутренней функции в цепном правиле.
- Путать направление: градиент ведёт вверх, спуск идёт против.
- Считать, что нулевой градиент гарантирует минимум.
- Потерять множитель 2 или 1/n в градиенте MSE.
Что спросят на собесе
- Что такое градиент и почему спускаются по антиградиенту.
- Посчитать частные производные простой функции в точке.
- Производная сигмоиды и почему она мешает глубоким сетям.
- Что такое гессиан и как по нему отличить минимум от седла.
- Как проверить ручной backward численно.