Гессиан и кривизна

Гессиан — матрица вторых производных, описывающая, как изгибается функция вокруг точки.

Гессиан $\nabla^2 f(x)$ — матрица $n\times n$ из вторых частных производных $\dfrac{\partial^2 f}{\partial x_i\partial x_j}$; он задаёт локальную кривизну функции.

От наклона к кривизне

Градиент говорит, куда наклонена функция, но не говорит, насколько быстро меняется сам наклон. Эту информацию несёт вторая производная. В одном измерении знак $f''(x)$ различает чашу ($f''>0$, минимум) и купол ($f''<0$, максимум). В многомерии роль $f''$ играет гессиан:

$$\nabla^2 f=\begin{bmatrix}\dfrac{\partial^2 f}{\partial x_1^2} & \dfrac{\partial^2 f}{\partial x_1\partial x_2}\\[2mm] \dfrac{\partial^2 f}{\partial x_2\partial x_1} & \dfrac{\partial^2 f}{\partial x_2^2}\end{bmatrix}.$$

Для гладких функций смешанные производные равны ($\partial^2 f/\partial x_1\partial x_2 = \partial^2 f/\partial x_2\partial x_1$, теорема Шварца), поэтому гессиан симметричен.

Пример

Для $f(x,y)=x^2+3y^2$: $\dfrac{\partial^2 f}{\partial x^2}=2$, $\dfrac{\partial^2 f}{\partial y^2}=6$, смешанные нули. Значит

$$\nabla^2 f=\begin{bmatrix}2&0\\0&6\end{bmatrix}.$$

Оба числа на диагонали положительны — функция выгнута вверх по обеим осям, это чаша с минимумом. Разные числа ($2$ и $6$) означают, что по $y$ стенки чаши круче — это и есть источник «оврагов».

Что говорит гессиан о точке

Гессиан (в точке с $\nabla f=0$)Тип точки
Положительно определён (все собств. числа $>0$)Локальный минимум
Отрицательно определён (все $<0$)Локальный максимум
Знаконеопределён (есть $+$ и $-$)Седловая точка
Полуопределён (есть нули)Требуется доп. анализ

Численный гессиан

Вторые производные тоже считаются конечными разностями. Диагональный элемент:

$$\frac{\partial^2 f}{\partial x_i^2}\approx\frac{f(x+\varepsilon e_i)-2f(x)+f(x-\varepsilon e_i)}{\varepsilon^2}.$$

def f(v):
    x, y = v
    return x ** 2 + 3 * y ** 2

def hessian(f, v, eps=1e-4):
    n = len(v)
    H = [[0.0] * n for _ in range(n)]
    f0 = f(v)
    for i in range(n):
        for j in range(n):
            a = list(v); a[i] += eps; a[j] += eps
            b = list(v); b[i] += eps; b[j] -= eps
            c = list(v); c[i] -= eps; c[j] += eps
            d = list(v); d[i] -= eps; d[j] -= eps
            H[i][j] = (f(a) - f(b) - f(c) + f(d)) / (4 * eps * eps)
    return H

H = hessian(f, [1.0, 1.0])
for row in H:
    print([round(x) for x in row])

Вывод:

[2, 0]
[0, 6]

Численный гессиан совпал с аналитическим. Положительные числа на диагонали и нулевые вне её подтверждают: это чаша.

Как работает под капотом

Гессиан описывает квадратичное приближение функции вблизи точки $x_k$ (формула Тейлора второго порядка):

$$f(x_k+p)\approx f(x_k)+\nabla f(x_k)^{\!\top}p+\tfrac{1}{2}p^{\!\top}\nabla^2 f(x_k)\,p.$$

Метод Ньютона минимизирует именно это приближение на каждом шаге, поэтому ему и нужен гессиан. Беда в цене: гессиан — это $n^2$ чисел, а его обращение — $O(n^3)$ операций. Для $n=10^6$ (нейросеть) это невозможно, поэтому используют квазиньютоновские методы (BFGS), которые приближают гессиан дёшево.

Частые ошибки

  • Забыть проверить знакоопределённость. Нулевой градиент сам по себе не гарантирует минимум — это может быть седло или максимум.
  • Считать гессиан несимметричным. Для гладких функций он симметричен; асимметрия в численном расчёте — признак ошибки или слишком грубого шага.
  • Хранить полный гессиан для огромных $n$. $n^2$ памяти убивает большие задачи.

Итоги

  • Гессиан $\nabla^2 f$ — матрица вторых производных, описывает кривизну; для гладких функций симметричен.
  • В стационарной точке знакоопределённость гессиана различает минимум, максимум и седло.
  • Гессиан задаёт квадратичное приближение — основу метода Ньютона; его цена $O(n^2)$ памяти и $O(n^3)$ обращения.
Проверьте себя
1. Что описывает гессиан $\nabla^2 f$?
AНаправление роста
BЛокальную кривизну функции (вторые производные)
CЗначение функции
DДлину градиента
2. В точке с $\nabla f=0$ гессиан положительно определён. Что это за точка?
AМаксимум
BСедло
CЛокальный минимум
DПлато
3. Почему метод Ньютона не используют для нейросетей с миллионами параметров?
AОн неточен
BГессиан требует $O(n^2)$ памяти и $O(n^3)$ на обращение
CУ нейросетей нет градиента
DНьютон не сходится