11.2 Выпуклость
Выпуклость (convexity) играет решающую роль в разработке алгоритмов оптимизации, главным образом потому, что в этом случае алгоритмы легче анализировать и проверять. Иными словами, если алгоритм плохо работает в условиях выпуклости, то обычно трудно ожидать хороших результатов в других условиях. Кроме того, хотя задачи оптимизации в глубоком обучении обычно невыпуклые, они часто демонстрируют некоторую выпуклость вблизи локальных минимумов. Это может привести к интересным новым вариантам оптимизации, таким как (Izmailov et al., 2018).
MXNet:
%matplotlib inline
from d2l import mxnet as d2l
from mpl_toolkits import mplot3d
from mxnet import np, npx
npx.set_np()
PyTorch:
%matplotlib inline
from d2l import torch as d2l
import numpy as np
from mpl_toolkits import mplot3d
import torch
TensorFlow:
%matplotlib inline
from d2l import tensorflow as d2l
import numpy as np
from mpl_toolkits import mplot3d
import tensorflow as tf
PaddlePaddle:
%matplotlib inline
from d2l import paddle as d2l
import warnings
warnings.filterwarnings("ignore")
import numpy as np
from mpl_toolkits import mplot3d
import paddle
11.2.1 Определения
Прежде чем проводить выпуклый анализ, нужно определить выпуклые множества (convex sets) и выпуклые функции (convex functions).
11.2.1.1 Выпуклые множества
Выпуклое множество (convex set) — основа выпуклости. Проще говоря, множество в векторном пространстве называется выпуклым (convex), если для любых отрезок, соединяющий и , тоже лежит в . В математических обозначениях это означает, что для всех
Это звучит довольно абстрактно, поэтому посмотрим на пример на рис. 11.2.1. В первом наборе есть отрезки, которые не полностью лежат внутри множества, поэтому этот набор невыпуклый, а два других набора такой проблемы не имеют.
Рис. 11.2.1. Первый набор невыпуклый, два других выпуклые
Теперь рассмотрим пересечение (рис. 11.2.2). Пусть и — выпуклые множества. Тогда тоже выпукло. Действительно, возьмём произвольные . Поскольку и выпуклы, отрезок, соединяющий и , содержится и в , и в . Значит, он содержится и в , что и требовалось доказать.
Рис. 11.2.2. Пересечение двух выпуклых множеств выпукло
Легко получить и более общий результат: для выпуклых множеств их пересечение выпукло. Обратное неверно. Рассмотрим два непересекающихся множества и возьмём и . Поскольку , на рис. 11.2.3 отрезок, соединяющий и , обязан содержать часть, которая не принадлежит ни , ни . Значит, отрезок не лежит и в , откуда следует, что объединение выпуклых множеств не обязательно выпукло, то есть невыпукло (nonconvex).
Рис. 11.2.3. Объединение двух выпуклых множеств не обязательно выпукло
Как правило, задачи глубокого обучения определяются на выпуклых множествах. Например, , то есть множество -мерных векторов вещественных чисел, выпукло (ведь отрезок между любыми двумя точками из тоже лежит в ). В некоторых случаях используют переменные с ограниченной длиной, например шар радиуса определяется как .
11.2.1.2 Выпуклые функции
Теперь, когда мы определили выпуклые множества, можно ввести выпуклую функцию (convex function) . Пусть задано выпуклое множество . Функция называется выпуклой, если для всех и всех
Чтобы проиллюстрировать это, построим несколько функций и проверим, какие из них удовлетворяют условию. Ниже мы определяем выпуклые и невыпуклые функции.
MXNet, PyTorch, TensorFlow:
f = lambda x: 0.5 * x**2 # Выпуклая функция
g = lambda x: d2l.cos(np.pi * x) # Невыпуклая функция
h = lambda x: d2l.exp(0.5 * x) # Выпуклая функция
x, segment = d2l.arange(-2, 2, 0.01), d2l.tensor([-1.5, 1])
d2l.use_svg_display()
_, axes = d2l.plt.subplots(1, 3, figsize=(9, 3))
for ax, func in zip(axes, [f, g, h]):
d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
PaddlePaddle:
f = lambda x: 0.5 * x**2 # Выпуклая функция
g = lambda x: d2l.cos(np.pi * x) # Невыпуклая функция
h = lambda x: d2l.exp(0.5 * x) # Выпуклая функция
x, segment = d2l.arange(-2, 2, 0.01, dtype='float32'), d2l.tensor([-1.5, 1])
d2l.use_svg_display()
_, axes = d2l.plt.subplots(1, 3, figsize=(9, 3))
for ax, func in zip(axes, [f, g, h]):
d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
Как и ожидалось, косинус невыпуклый, а парабола и экспонента выпуклые. Обратите внимание, что условие на как выпуклое множество необходимо для того, чтобы выражение было осмысленным. В противном случае результат может оказаться не определён.
11.2.1.3 Неравенство Йенсена
Для выпуклой функции один из самых полезных математических инструментов — неравенство Йенсена (Jensen’s inequality). Оно является обобщением определения выпуклости:
где — неотрицательные вещественные числа с суммой , а — случайная величина. Другими словами, математическое ожидание выпуклой функции не меньше, чем выпуклая функция от математического ожидания, причём вторая часто оказывается более простым выражением. Чтобы доказать первое неравенство, мы многократно применяем определение выпуклости к одному слагаемому суммы.
Частое применение неравенства Йенсена — оценить сложное выражение более простым. Например, его можно применить к логарифмическому правдоподобию частично наблюдаемой случайной величины. А именно, поскольку , получаем
где — типичная ненаблюдаемая случайная величина, — наилучшая догадка о её распределении, а — распределение, полученное интегрированием по . Например, в кластеризации может быть меткой кластера, а — порождающей моделью при использовании меток кластеров.
11.2.2 Свойства
Рассмотрим некоторые интересные свойства выпуклых функций.
11.2.2.1 Локальный минимум является глобальным минимумом
Прежде всего, локальный минимум выпуклой функции является также глобальным минимумом. Докажем это методом от противного.
Предположим, что — локальный минимум. Тогда существует достаточно малое положительное число такое, что для , удовлетворяющих , выполняется .
Допустим теперь, что локальный минимум не является глобальным минимумом : существует , для которого . Тогда найдётся , например , такое что .
Однако по свойству выпуклости
что противоречит тому, что — локальный минимум. Следовательно, не существует , для которого . Итак, локальный минимум является также глобальным минимумом.
Например, у выпуклой функции есть локальный минимум , который является и глобальным минимумом.
f = lambda x: (x - 1) ** 2
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
То, что локальный минимум выпуклой функции является и глобальным, удобно. Это означает, что при минимизации функции мы не «застреваем». Однако заметим, что это не означает, что не может быть нескольких глобальных минимумов или что глобальный минимум может не существовать. Например, функция достигает минимума на всём интервале . Напротив, функция на не имеет минимума: при она стремится к , но ни при каком не принимает значения .
11.2.2.2 Множества подуровня выпуклой функции выпуклы
Выпуклые множества удобно определять через множества подуровня (below sets) выпуклой функции. Точнее, для выпуклой функции , определённой на выпуклом множестве , любое её множество подуровня
выпукло.
Докажем это. Для любых нужно показать, что при выполнено . Поскольку и , имеем
11.2.2.3 Выпуклость и вторая производная
Если у функции существует вторая производная, то выпуклость легко проверить. Нужно лишь убедиться, что , то есть для всех выполняется . Например, функция выпукла, поскольку , то есть её производная является единичной матрицей.
Более строго: выпукла тогда и только тогда, когда выпукла любая дважды дифференцируемая одномерная функция . Для любой дважды дифференцируемой многомерной функции она выпукла тогда и только тогда, когда её матрица Гессе .
Сначала докажем одномерный случай. Чтобы показать, что для выпуклой функции , воспользуемся
Поскольку вторая производная задаётся пределом конечной разности, получаем
Чтобы показать, что из следует выпуклость , используем тот факт, что означает, что — монотонно неубывающая функция. Пусть — три точки в , где и . По теореме о среднем существуют и , такие что
Из монотонности , поэтому
Поскольку , получаем
что и доказывает выпуклость.
Во-вторых, для доказательства многомерного случая нам понадобится лемма: функция выпукла тогда и только тогда, когда для всех выпукла функция
Чтобы показать, что выпуклость влечёт выпуклость , достаточно проверить, что для всех (так что )
Чтобы показать обратное, достаточно проверить для всех
Наконец, используя лемму и результат для одномерного случая, докажем многомерный случай: многомерная функция выпукла тогда и только тогда, когда выпукла при , . По одномерному случаю это условие выполнено тогда и только тогда, когда для всех выполнено (). По определению положительно полуопределённой матрицы это эквивалентно .
11.2.3 Ограничения
Удобное свойство выпуклой оптимизации — возможность эффективно работать с ограничениями (constraints). Она позволяет решать оптимизацию с ограничениями (constrained optimization) вида
Здесь — целевая функция, а — функции ограничений. Например, первое ограничение ограничивает параметр единичным шаром. Если же второе ограничение , то оно соответствует всем из полупространства. Одновременное выполнение обоих ограничений эквивалентно выбору в качестве множества ограничений сегмента шара.
11.2.3.1 Функция Лагранжа
Решать задачу оптимизации с ограничениями в общем случае трудно, и один из способов решения возникает из довольно простой физической интуиции. Представьте шар в коробке: шар скатится в самое низкое место, а сила тяжести будет уравновешена силами, с которыми стенки коробки действуют на шар. Коротко говоря, градиент целевой функции (то есть силы тяжести) компенсируется градиентом функции ограничения (из-за «отталкивания» стенки, которое удерживает шар внутри коробки). Заметим, что любое неактивное ограничение (то есть когда шар не касается стенки) не оказывает никакой силы на шар.
Здесь мы кратко выведем функцию Лагранжа ; описанные выше соображения можно выразить через следующую задачу поиска седловой точки:
Переменные () называются множителями Лагранжа (Lagrange multipliers): они обеспечивают корректное выполнение ограничений. Их величину выбирают так, чтобы для всех выполнялось . Например, для любого , при котором , в итоге выбираем . Кроме того, это задача поиска седловой точки (saddle point): мы хотим максимизировать по и одновременно минимизировать его по . Существует большое количество литературы о том, как получить функцию . Нам здесь достаточно знать, что седловая точка является оптимальным решением исходной задачи оптимизации с ограничениями.
11.2.3.2 Штрафы
Один из способов хотя бы приближённо удовлетворить задаче оптимизации с ограничениями — использовать функцию Лагранжа . Помимо выполнения , достаточно добавить к целевой функции . Это гарантирует, что ограничения не будут сильно нарушены.
Мы фактически уже использовали этот приём. Например, в затухании весов (раздел 4.5) к целевой функции добавляется , чтобы не становился слишком большим. Если рассматривать это как задачу с ограничениями, то для некоторого радиуса это гарантирует . Регулируя значение , можно менять размер .
Обычно добавление штрафа — хороший способ обеспечить приближённое выполнение ограничений. На практике это оказывается надёжнее, чем точное выполнение. Кроме того, для невыпуклых задач многие свойства точных методов из выпуклого случая (например, существование оптимального решения) перестают выполняться.
11.2.3.3 Проекции
Ещё одна стратегия выполнения ограничений — проекции (projections). Мы уже встречались с ними, например при отсечении градиентов в разделе 8.5, где длина градиента ограничивалась величиной :
Это и есть проекция на шар радиуса . В общем случае проекция на выпуклое множество определяется как
Это точка множества , ближайшая к .
Рис. 11.2.4. Выпуклые проекции
Определение проекции может показаться абстрактным, поэтому рассмотрим рис. 11.2.4. На нём два выпуклых множества: круг и ромб. Точки внутри каждого множества (жёлтые) при проекции остаются на месте. Точки вне множеств (чёрные) проецируются в ближайшие к исходным точкам точки внутри множеств (красные). Хотя для шара направление сохраняется, в общем случае это не обязательно.
Одно из применений выпуклых проекций — вычисление разреженных весовых векторов. В этом случае вектор весов проецируется на шар , который является обобщением примера с ромбом на рис. 11.2.4.
Резюме
В контексте глубокого обучения главная цель выпуклых функций — помочь нам глубже понять алгоритмы оптимизации. Из них мы выводим, как появляются градиентный спуск и стохастический градиентный спуск.
- Пересечение выпуклых множеств выпукло, а объединение — не обязательно.
- По неравенству Йенсена «полное математическое ожидание многомерной выпуклой функции» не меньше, чем «значение этой функции, вычисленное по математическим ожиданиям переменных».
- Дважды дифференцируемая функция выпукла тогда и только тогда, когда её матрица Гессе (матрица вторых производных) является положительно полуопределённой.
- Выпуклые ограничения можно добавить с помощью функции Лагранжа. На практике достаточно добавить штраф к целевой функции.
- Проекция отображает точку в ближайшую к ней точку выпуклого множества.
Упражнения
- Предположим, мы хотим проверить выпуклость множества, проводя все прямые между точками внутри множества и проверяя, лежат ли эти прямые целиком внутри него. i. Докажите, что достаточно проверить только точки на границе. ii. Докажите, что достаточно проверить только вершины множества.
- Обозначим шар радиуса через -норму и докажите, что выпукло при всех .
- Даны выпуклые функции и . Покажите, что тоже выпукла. Докажите, что невыпукла.
- Докажите, что нормировка softmax выпукла, то есть выпукла функция .
- Докажите, что линейное подпространство — выпуклое множество.
- Докажите, что при линейном подпространстве с проекция на матрицу может быть записана как .
- Докажите, что для выпуклой дважды дифференцируемой функции при можно записать .
- Для выпуклого множества и двух векторов и докажите, что проекция не увеличивает расстояние: .
MXNet: Обсуждение
PyTorch: Обсуждение
TensorFlow: Обсуждение
PaddlePaddle: Обсуждение
Литература
- Izmailov, P., Podoprikhin, D., Garipov, T., Vetrov, D., & Wilson, A. G. (2018). Averaging weights leads to wider optima and better generalization. arXiv preprint arXiv:1803.05407.
- Wigner, E. P. (1958). On the distribution of the roots of certain symmetric matrices. Annals of Mathematics, 325–327.