Оптимизация

Методы второго порядка

Ньютон, natural gradient, Фишер — почему они лучше и почему их всё равно не используют

Шаг 72 из 117 · ~30 мин

Ньютон

Градиентный спуск использует линейное приближение функции. Метод Ньютона — квадратичное:

xk+1=xk[2f(xk)]1f(xk)x_{k+1} = x_k - \htmlData{k=hess}{\big[\nabla^2 f(x_k)\big]^{-1}} \nabla f(x_k)

Вывод в одну строку: приблизим ff квадратикой в точке xkx_k и прыгнем сразу в её минимум. Отсюда главное свойство: на квадратичной функции Ньютон попадает в минимум за один шаг из любой точки, независимо от обусловленности.

Проверено: при κ=100\kappa = 100, κ=1\kappa = 1 и даже κ=105\kappa = 10^5 ответ достигается за одну итерацию. Сравните с 691691 шагом обычного спуска при κ=100\kappa = 100.

Причина в терминах урока 050: — это идеальный предобусловливатель. Он делает κ=1\kappa = 1 по построению, а при κ=1\kappa = 1 шаг 1/L1/L попадает в минимум сразу.

Заодно у Ньютона нет learning rate — размер шага определяется кривизной. Это и достоинство (нечего подбирать), и опасность (шаг может оказаться огромным, если кривизна мала).

Почему им не пользуются

Стоимость. Для dd параметров:

ddградиент O(d)O(d)гессиан O(d2)O(d^2)обращение O(d3)O(d^3)
10310^310310^310610^610910^9
10610^610610^6101210^{12}101810^{18}
10910^910910^9101810^{18}102710^{27}

При d=109d = 10^9 гессиан содержит 101810^{18} чисел — это 88 эксабайт памяти. Не «медленно», а физически невозможно.

Плюс две проблемы помимо стоимости:

  • на невыпуклой задаче гессиан не положительно определён. Тогда «шаг в минимум квадратики» может оказаться шагом вверх — в направлении отрицательной кривизны квадратика уходит в минус бесконечность. Отсюда все модификации: сдвиг спектра, доверительные области, гауссов-ньютон;
  • шум. Гессиан по минибатчу — плохая оценка, и обращать шумную матрицу опаснее, чем усреднять шумный градиент.

Что используют вместо

методчто делаетстоимость
L-BFGSприближает H1H^{-1} по истории mm последних шаговO(md)O(md)
гауссов-ньютонзаменяет HH на JJJ^\top J, всегда 0\succeq 0зависит
natural gradientпредобусловливает матрицей ФишераO(d2)O(d^2), нужны приближения
K-FACФишер как кронекерово произведение блоковпрактично
Adamдиагональное приближение по вторым моментамO(d)O(d)

Последняя строка — не шутка: Adam из урока 080 и есть самый дешёвый метод «второго порядка», если считать таковым любой, использующий больше информации, чем градиент. Он приближает кривизну диагональной матрицей, и это единственное приближение, которое масштабируется до миллиардов параметров.

L-BFGS стоит знать как реально работающий классический метод. Он хранит mm пар (шаг, изменение градиента), обычно m[5,20]m \in [5, 20], и строит из них приближение H1H^{-1} без явной матрицы. В глубоком обучении применяется редко — плохо переносит шум минибатчей — но для детерминированных задач среднего размера часто лучший выбор.

Natural gradient

Отдельная идея, из другого места. Обычный градиент зависит от параметризации: перейдите к θ=2θ\theta' = 2\theta, и градиент изменится. А ведь модель — та же.

Natural gradient предлагает мерить расстояние не в пространстве параметров, а в пространстве распределений, которые модель задаёт:

~=F1,F=E[logpθlogpθ]\tilde{\nabla} = F^{-1}\nabla, \qquad F = \mathbb{E}\big[\nabla \log p_\theta \, \nabla \log p_\theta^\top\big]

FF — матрица Фишера, и она есть в точности гессиан KL-дивергенции между pθp_\theta и pθ+δp_{\theta + \delta} при малом δ\delta. То есть natural gradient — это спуск, у которого шаг ограничен в KL, а не в евклидовой норме.

Отсюда сразу три связи с уже пройденным:

  • KL из блока 4 оказывается метрикой на пространстве моделей, а не только функцией потерь;
  • информация Фишера из блока 3 (кривизна log-правдоподобия) оказывается той самой матрицей;
  • PPO и TRPO ограничивают шаг в KL — это и есть natural gradient в приближении, и ветка B к нему вернётся.

Практически FF имеет размер d×dd \times d и потому недоступна; K-FAC приближает её кронекеровыми произведениями поблочно, и это работает.

Что стоит унести

Сравните Adam и спуск на повёрнутом ландшафте — это лучшая иллюстрация того, чего не хватает диагональным методам и что дал бы полный гессиан.

лосс, логарифмическая шкала

шаг α 0.05
итераций 150
f в конце
4.15e-7
обусловленность κ
30
порог 2/L
0.067
 
сходится

Ньютон решил бы это за один шаг. Adam близок к нему, потому что гессиан диагонален и диагонального приближения достаточно.

Итог блока в одной мысли: вся эта иерархия методов — способы получить информацию о кривизне за приемлемую цену. Ньютон берёт её точно и стоит O(d3)O(d^3); L-BFGS — по истории за O(md)O(md); Adam — по диагонали за O(d)O(d); момент — вообще без кривизны, но с памятью, что даёт κ\sqrt{\kappa}. А нормализация и стандартизация из уроков 050 и 100 действуют иначе: они уменьшают саму κ\kappa, и потому остаются самым выгодным вложением.

Источники

Проверки

0 из 2
  1. Почему не Ньютон

    Отметьте все верные утверждения о методах второго порядка.

  2. Когда шаг Ньютона допустим

    Гессиан задан как H=(abbc)H = \begin{pmatrix} a & b \\ b & c \end{pmatrix}.

    Реализуйте newton_vs_gd(a, b, c) — верните [lambda_min, lambda_max, gd_steps, newton_ok]:

    • собственные значения в закрытой форме, λ±=a+c2±(ac)24+b2\lambda_{\pm} = \frac{a+c}{2} \pm \sqrt{\frac{(a-c)^2}{4} + b^2};
    • newton_ok — можно ли делать шаг Ньютона: -1.0 если гессиан вырожден (какое-то собственное значение нулевое с допуском 101210^{-12}), 0.0 если он знаконеопределён (λmin0\lambda_{\min} \le 0), 1.0 если положительно определён. Вырожденность проверяйте первой;
    • gd_steps — сколько шагов градиентного спуска нужно для сокращения ошибки в миллион раз при оптимальном шаге, то есть ln106/lnρ\lceil \ln 10^{-6} / \ln \rho \rceil с ρ=κ1κ+1\rho = \frac{\kappa-1}{\kappa+1}. При κ=1\kappa = 1 верните 1.0; если newton_ok не равно 1.0, верните -1.0 — задача не является выпуклой квадратикой, и оценка неприменима.

    Заметьте, что число шагов Ньютона в ответе не спрашивается: на квадратичной функции оно равно единице при любом κ\kappa, и это главный факт урока.

    Проверить собственные значения можно двумя тождествами: λ+λ+=a+c\lambda_- + \lambda_+ = a + c и λλ+=acb2\lambda_- \lambda_+ = ac - b^2.

    функция newton_vs_gd

    Загрузка редактора…

    Ctrl/⌘ + Enter