Условия оптимальности

Минимум гладкой функции узнаётся по двум признакам: нулевой градиент и положительная кривизна.

Стационарная точка — точка, где $\nabla f(x)=0$. Это необходимое условие локального экстремума гладкой безусловной задачи.

Необходимое условие первого порядка

Представьте, что вы стоите во впадине. В любую сторону шаг ведёт вверх — значит наклон во все стороны нулевой, иначе нашлось бы направление спуска. Формально: если $x^*$ — локальный минимум гладкой $f$, то

$$\nabla f(x^*)=0.$$

Это необходимое, но не достаточное условие: ему удовлетворяют и максимумы, и сёдла. Все такие точки называют стационарными. Поиск минимума гладкой функции = поиск корня уравнения $\nabla f(x)=0$ — отсюда родство оптимизации и решения нелинейных уравнений (метод Ньютона работает и там, и там).

Достаточное условие второго порядка

Чтобы отличить минимум от седла и максимума, смотрят на гессиан в стационарной точке:

  • $\nabla f(x^*)=0$ и $\nabla^2 f(x^*)$ положительно определён $\Rightarrow$ строгий локальный минимум.
  • $\nabla f(x^*)=0$ и $\nabla^2 f(x^*)$ отрицательно определён $\Rightarrow$ строгий локальный максимум.
  • $\nabla^2 f(x^*)$ знаконеопределён $\Rightarrow$ седло.

Разбор примера

$f(x,y)=x^2-y^2$. Градиент $\nabla f=(2x,-2y)$ обнуляется только в $(0,0)$. Гессиан там $\begin{bmatrix}2&0\\0&-2\end{bmatrix}$ — собственные числа $+2$ и $-2$, значит седло: по оси $x$ чаша, по оси $y$ купол. Проверим кодом, что вокруг нуля есть и более низкие, и более высокие точки.

def f(x, y):
    return x * x - y * y

center = f(0, 0)
print("f(0,0)   =", center)
print("f(0.1,0) =", round(f(0.1, 0), 4), "(выше -> рост по x)")
print("f(0,0.1) =", round(f(0, 0.1), 4), "(ниже -> спад по y)")
print("Вывод: (0,0) — седло, не минимум")

Вывод:

f(0,0)   = 0
f(0.1,0) = 0.01 (выше -> рост по x)
f(0,0.1) = -0.01 (ниже -> спад по y)
Вывод: (0,0) — седло, не минимум

Численная проверка стационарности

На практике алгоритм останавливают, когда $\lVert\nabla f(x_k)\rVert$ становится меньше порога $\tau$. Посмотрим, как градиент стремится к нулю по мере приближения к дну чаши $f(x)=(x-2)^2$.

def grad(x):           # производная (x-2)^2 = 2(x-2)
    return 2 * (x - 2)

for x in [0.0, 1.0, 1.5, 1.9, 1.99, 2.0]:
    g = grad(x)
    stop = "СТОП" if abs(g) < 1e-2 else ""
    print(f"x={x:<5} |grad|={abs(g):.3f} {stop}")

Вывод:

x=0.0   |grad|=4.000 
x=1.0   |grad|=2.000 
x=1.5   |grad|=1.000 
x=1.9   |grad|=0.200 
x=1.99  |grad|=0.020 
x=2.0   |grad|=0.000 СТОП

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

Все итеративные методы по сути ищут корень $\nabla f(x)=0$. Поэтому критерий останова — малость нормы градиента. Но осторожно: на плато градиент тоже мал, хотя минимума нет; и наоборот, в крутом овраге около минимума градиент бывает велик. Поэтому в серьёзных солверах комбинируют несколько критериев: малость градиента, малость шага $\lVert x_{k+1}-x_k\rVert$ и малость изменения функции.

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

  • Объявить минимумом любую стационарную точку. Это может быть седло или максимум — проверяйте гессиан.
  • Единственный критерий останова. Только по градиенту легко остановиться на плато; комбинируйте критерии.
  • Забыть про границы. Условие $\nabla f=0$ верно для безусловной задачи; с ограничениями минимум может лежать на границе, где градиент не нулевой.

Итоги

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