Гессиан и кривизна
Гессиан — матрица вторых производных, описывающая, как изгибается функция вокруг точки.
Гессиан $\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)$ обращения.