Ньютон: учитываем кривизну

Метод Ньютона строит в каждой точке параболу-приближение и сразу прыгает в её вершину — отсюда фантастическая скорость.

Метод Ньютона минимизирует функцию по правилу $x_{k+1}=x_k-[\nabla^2 f(x_k)]^{-1}\nabla f(x_k)$, используя кривизну (гессиан), а не только наклон.

Идея: парабола вместо прямой

Градиентный спуск видит только наклон и потому шагает «вслепую» на $\alpha$. Метод Ньютона использует и кривизну: он приближает функцию вблизи $x_k$ квадратичной моделью (парабола/чаша) по формуле Тейлора и прыгает прямо в её вершину. Для квадратичной функции это попадание в минимум за один шаг.

Минимум квадратичной модели $f(x_k)+\nabla f^\top p+\tfrac12 p^\top\nabla^2 f\,p$ достигается там, где её градиент нулевой: $\nabla^2 f\,p+\nabla f=0$, откуда шаг $p=-[\nabla^2 f]^{-1}\nabla f$. Это и есть формула Ньютона:

$$x_{k+1}=x_k-[\nabla^2 f(x_k)]^{-1}\,\nabla f(x_k).$$

Одномерный случай

В 1D гессиан — это просто $f''$, и формула упрощается:

$$x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}.$$

Это тот же ньютоновский поиск корня, но применённый к уравнению $f'(x)=0$. Минимизировать $f$ = найти корень её производной.

Реализация 1D и квадратичная сходимость

Минимизируем $f(x)=x^4-3x^3+2$. Производные: $f'=4x^3-9x^2$, $f''=12x^2-18x$. Минимум там, где $f'=0$, $x\ne0$: $x=9/4=2.25$.

def fp(x):   # f'(x)
    return 4 * x ** 3 - 9 * x ** 2

def fpp(x):  # f''(x)
    return 12 * x ** 2 - 18 * x

x = 3.0
for k in range(1, 7):
    x = x - fp(x) / fpp(x)
    err = abs(x - 2.25)
    print(f"шаг {k}: x={x:.10f}  ошибка={err:.2e}")

Вывод:

шаг 1: x=2.5000000000  ошибка=2.50e-01
шаг 2: x=2.2916666667  ошибка=4.17e-02
шаг 3: x=2.2514619883  ошибка=1.46e-03
шаг 4: x=2.2500018962  ошибка=1.90e-06
шаг 5: x=2.2500000000  ошибка=3.20e-12
шаг 6: x=2.2500000000  ошибка=4.44e-16

Посмотрите на ошибку: $0.25\to 0.04\to 0.001\to 10^{-6}\to 10^{-13}$. Число верных цифр примерно удваивается каждый шаг — это квадратичная сходимость. Градиентному спуску на такую точность понадобились бы десятки-сотни итераций.

Многомерный пример

В $n$ измерениях нужно решить систему $\nabla^2 f\,p=-\nabla f$. Для $2\times2$ обратим гессиан вручную (формула $2\times2$).

def grad(v):
    x, y = v
    return [2 * x + y, x + 2 * y]          # f = x^2 + xy + y^2

def solve2(H, b):                          # решаем H p = b для 2x2
    a, bb, c, d = H[0][0], H[0][1], H[1][0], H[1][1]
    det = a * d - bb * c
    return [(d * b[0] - bb * b[1]) / det, (-c * b[0] + a * b[1]) / det]

H = [[2, 1], [1, 2]]                        # гессиан постоянен (квадратичная f)
x = [4.0, -3.0]
g = grad(x)
p = solve2(H, [-g[0], -g[1]])
x = [x[0] + p[0], x[1] + p[1]]
print("После 1 шага Ньютона: x =", [round(c, 6) for c in x])
print("Градиент в новой точке:", grad(x))

Вывод:

После 1 шага Ньютона: x = [0.0, 0.0]
Градиент в новой точке: [0.0, 0.0]

Для квадратичной функции Ньютон попал в минимум $(0,0)$ за один шаг из любой стартовой точки — никаких оврагов, никакой осцилляции. Гессиан «знает» форму чаши целиком.

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

Сила Ньютона — в инвариантности к масштабу: умножение гессианом «выпрямляет» овраги, поэтому метод не страдает от большого числа обусловленности. Но есть три «но». Первое: гессиан стоит $O(n^2)$ памяти и $O(n^3)$ на решение системы — для больших $n$ запретительно. Второе: вдали от минимума гессиан может быть незнакоопределён, и шаг Ньютона укажет в сторону роста — нужна страховка (демпфирование, line search, сдвиг гессиана). Третье: нужны вторые производные, которых часто нет. Эти проблемы решают квазиньютоновские методы.

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

  • Чистый Ньютон вдали от минимума. Без line search или демпфирования он может разойтись, если гессиан плохой.
  • Делить на $f''$ около перегиба. При $f''\approx 0$ шаг $f'/f''$ взрывается.
  • Применять к огромным $n$. $O(n^3)$ убивает; там нужны BFGS или градиентные методы.

Итоги

  • Ньютон: $x_{k+1}=x_k-[\nabla^2 f]^{-1}\nabla f$ — прыжок в вершину квадратичной модели.
  • Квадратичная сходимость: число верных цифр удваивается за шаг; на квадратичной функции — один шаг.
  • Цена: $O(n^2)$ память, $O(n^3)$ решение, нужен знакоопределённый гессиан и страховка вдали от минимума.
Проверьте себя
1. Какую информацию использует метод Ньютона сверх градиентного спуска?
AЗначение функции
BКривизну (гессиан $\nabla^2 f$)
CИсторию шагов
DСлучайность
2. Что означает квадратичная сходимость метода Ньютона?
AОшибка убывает линейно
BЧисло верных цифр примерно удваивается на каждом шаге
CСходимость за два шага
DФункция квадратичная
3. Почему чистый Ньютон не годится для нейросетей с миллионами параметров?
AОн неточен
BГессиан стоит $O(n^2)$ памяти и $O(n^3)$ на решение системы
CУ них нет минимума
DОн сходится слишком медленно