Mirror descent
Метод зеркального спуска является естественным обобщением метода проекции субградиента в случае обобщения l_2 нормы на более общий случай какой-то функции расстояния.
0.1 Dual norm:
Определение: Сопряженной нормой \|\cdot\|_* к данной \|\cdot\| называется:
\|y\|_* = \max \{\langle y,x\rangle: \|x\|=1 \}
Пример: (\|\cdot \|_p)_* = \|\cdot \|_q, \qquad \dfrac{1}{p} + \dfrac{1}{q} = 1
Доказательство:
Неравенство Гельдера:
\sum_{k=1}^n |x_k\,y_k| \le \biggl( \sum_{k=1}^n |x_k|^p \biggr)^{\frac{1}{p}} \biggl( \sum_{k=1}^n |y_k|^q \biggr)^{\frac{1}{q}} \text{ for all }x, y \in \mathbb{C}^n
Свойства:
- Двойственная норма \|\cdot\|_* является нормой
- l_2 норма сопряжена сама себе
- Двойственная норма к двойственной норме - исходная норма
- (\|\cdot\|_1)_* = \|\cdot\|_\infty, \;(\|\cdot\|_\infty)_* = \|\cdot\|_1
- Обобщенное неравенство Коши Шварца: \langle y,x \rangle \leq \|y\|_*\|x\|, следствие: \|x\|^2 \pm 2 \langle y,x \rangle + \|y\|_*^2 \geq 0
0.2 Bregman divergence
Попробуем интуитивно ввести понятие обобщенного расстояния, именуемого расстоянием Брэгмана. Для каждой точки y она возвращает расстояние этой точки до x - V_x(y). В самом простом случае можно взять V_x(y) = \frac{1}{2}\|x-y\|^2, \;\; \nabla V_x(y) = y-x. Рассмотрим уже классическую запись:
\begin{align*} \|x_{k+1} - y\|^2 &= \|x_{k+1}-x_k \|^2 + \|x_k - y\|^2 - 2 \langle x_k - x_{k+1} ,x_k - y\rangle \\ \tag{Req1} V_{x_{k+1}}(y) &= V_{x_{k+1}}(x_k) + V_{x_{k}}(y) - \langle \nabla V_{x_{k+1}(x_k)}, x_k - y \rangle \end{align*}
Для вводимого обобщенного расстояния будем требовать выполнения (Req1), кроме того (как будет видно при получении оценок), приятным свойством было бы еще следующее требование:
\tag{Req2} V_x(y) \geq \frac{1}{2} \|x-y\|^2
Определение: Дивергенцией (расстоянием) Брэгмана называется функция следующая V_x(y). Пусть S \subseteq \mathbb{R}^n - замкнутое выпуклое множество, тогда функция \phi : S \to \mathbb{R} называется прокс-функцией (distance generating function), если \phi является 1 - сильно выпуклой, т.е.:
\phi(y) \geq \phi(x) + \langle \nabla \phi(x), y-x\rangle + \frac{1}{2} \|y-x\|^2, \qquad \forall x,y \in S
Тогда прокс-функцией индуцируется расстояние Брэгмана:
V_x(y) = \phi(y) - \phi(x) - \langle\nabla \phi(x), y-x\rangle
Заметим, что определение сильной выпуклости зависит от выбора прямой нормы \|\cdot\|. Это важное замечание, поскольку именно это свойство позволит в будущем подстраивать расстояние под геометрию пространства.
0.2.1 Examples
- Выберем норму в прямом пространстве \|\cdot\| = \|\cdot\|_2, пусть \phi(x) = \frac{1}{2}\|x\|^2, тогда расстояние Брэгмана V_x(y) = \frac{1}{2}\|x-y\|^2. Такой выбор совпадает с тем, что мы видели ранее в методе проекции субградиента
- Выберем теперь другую норму \|\cdot\| = \| \cdot \|_1, пусть \phi(x) = \sum\limits_{i \in [n]}x_i \log x_i - антиэнтропия. Тогда эта функция будет 1 сильно выпукла на выпуклом множестве S : \left\{x \in S : x \geq 0, \sum\limits_{i \in [n]} x_i = 1\right\} (вероятностном симплексе), а соответствующая ей дивергенция Брэгмана: V_x(y) = \sum\limits_{i \in [n]} y_i \log \frac{y_i}{x_i} = D(y \| x) - расстояние Кульбака - Ляйблера.
- Еще немного примеров отсюда:
0.2.2 Свойства
- Аксиома тождества V_x(x) = 0
- Совместимость с Евклидовой нормой: V_x(y) \geq \frac{1}{2}\|x-y\|^2 \geq 0
- (Не)равенство треугольника: \langle -\nabla V_x(y), y-z\rangle = V_x(z) - V_y(z) - V_x(y)
Первые два свойства очевидны из определения. Докажем третье:
\begin{align*} \langle -\nabla V_x(y), y-z\rangle &= \langle \nabla \phi(x) - \nabla \phi(y) , y-z\rangle =\\ & = (\phi(z) - \phi(x) - \langle \nabla \phi(x), z -x \rangle) \\ & - (\phi(z) - \phi(y) - \langle \nabla \phi(y), z - y \rangle) \\ & - (\phi(y) - \phi(x) - \langle \nabla \phi(x), y - x \rangle) \\ & = V_x(z) - V_y(z) - V_x(y) \end{align*}
1 Возвращение к истокам
Пусть задано выпуклое замкнутое множество S \in \mathbb{R}^n, кроме того, есть алгоритм оптимизации, возвращающий последовательность точек x_1, \ldots, x_k, \ldots. Тогда запишем (не)равенство треугольника для расстояния Брэгмана, полагая y = x_{k+1}, x = x_k и произвольный z \in S (который мы в дальнейшем для целостности изложения будем обозначать y)
\begin{align*} \langle -\nabla V_{x_k}(x_{k+1}), x_{k+1}-z\rangle &= V_{x_k}(z) - V_{x_{k+1}}(z) - V_{x_k}(x_{k+1}) \\ \tag{baseMD} \langle -\nabla V_{x_k}(x_{k+1}), x_{k+1}-y\rangle &= V_{x_k}(y) - V_{x_{k+1}}(y) - V_{x_k}(x_{k+1}) \end{align*}
Просуммируем полученные равенства:
\sum\limits_{k = 0}^{T-1}\langle -\nabla V_{x_k}(x_{k+1}), x_{k+1}-y\rangle = V_{x_0}(y) - V_{x_{T}}(y) - \sum\limits_{k = 0}^{T-1}V_{x_k}(x_{k+1})
Имея ввиду полученное уравнение, давайте, наконец, попробуем сформулировать метод зеркального спуска:
x_{k+1} = \text{arg}\min\limits_{x \in S} \left( \langle \alpha_k g_k, x \rangle + V_{x_k}(x) \right)
Посмотрим внимательнее на условие проекции для точки x_{k+1}:
\langle \alpha_k g_k,x_{k+1} - y\rangle + \langle \nabla V_{x_k}(x_{k+1}),x_{k+1} - y\rangle \leq 0
\langle \alpha_k g_k,x_{k+1} - y\rangle \leq - \langle \nabla V_{x_k}(x_{k+1}),x_{k+1} - y\rangle
Попробуем теперь получить наше базовое неравенство, используя (baseMD):
\begin{align*} \langle \alpha_k g_k, x_k - y\rangle &\leq - \langle \nabla V_{x_k}(x_{k+1}),x_{k+1} - y\rangle - \langle \alpha_k g_k, x_{k+1} - x_k\rangle = \\ & = V_{x_k}(y) - V_{x_{k+1}}(y) - V_{x_k}(x_{k+1})- \langle \alpha_k g_k, x_{k+1} - x_k\rangle \leq\\ &\leq V_{x_k}(y) - V_{x_{k+1}}(y) - \frac{1}{2}\|x_k - x_{k+1}\|^2- \langle \alpha_k g_k, x_{k+1} - x_k\rangle \leq \\ &\leq V_{x_k}(y) - V_{x_{k+1}}(y) + \left(\langle \alpha_k g_k, x_k - x_{k+1}\rangle- \frac{1}{2}\|x_k - x_{k+1}\|^2 \right) \leq \\ &\leq V_{x_k}(y) - V_{x_{k+1}}(y) + \frac{\alpha_k^2}{2} \|g_k\|_*^2 \end{align*}
ТЕЛЕСКОПИРУЕМ
\begin{align*} \sum\limits_{k = 0}^{T-1} \langle \alpha_k g_k, x_k - y\rangle &\leq V_{x_0}(y) - V_{x_{T}}(y) + \sum\limits_{k = 0}^{T-1}\frac{\alpha_k^2}{2} \|g_k\|_*^2 \\ &\leq V_{x_0}(y) + \sum\limits_{k = 0}^{T-1}\frac{\alpha_k^2}{2} \|g_k\|_*^2 \\ &\leq M + \dfrac{\alpha^2 G^2 T}{2} \end{align*}
Здесь мы подразумеваем \|g_k\|_* \leq G равномерно по k, а V_{x_0}(y) \leq M. В итоге:
\begin{align*} f(\overline{x}) - f^* &= f \left( \frac{1}{T}\sum\limits_{k=0}^{T-1} x_k \right) - f^* \leq \dfrac{1}{T} \left( \sum\limits_{k=0}^{T-1} f(x_k) - f^* \right) \\ & \leq \dfrac{1}{T} \left( \sum\limits_{k=0}^{T-1}\langle g_k, x_k - x^* \rangle\right) \\ & \leq \dfrac{M}{\alpha T} + \dfrac{\alpha G^2}{2} \leq \sqrt{\dfrac{2 M G^2}{T}} \end{align*}
Выбирая шаг \alpha_k = \alpha = \sqrt{\dfrac{2M}{G^2 T}}
1.1 Алгоритм зеркального спуска (mirror descent):
x_{k+1} = \text{arg}\min\limits_{x \in S} \left( \langle \alpha_k g_k, x \rangle + V_{x_k}(x) \right)
Интересные фишки:
- Такая же скорость сходимости, как и для метода проекции субградиента.
- Работает в существенно более широком классе практических задач
1.2 Онлайн версия
Совершенно ясно, что в наших оценках на каждом шаге может быть новая функция f_k(x) на заданном классе. Поэтому, аналогичные оценки получаются и для онлайн постановки:
R_{T-1} = \sum\limits_{k = 0}^{T-1} f_k(x_k) - \min_{x} \sum\limits_{k = 0}^{T-1} f_k(x) \leq \sqrt{2 M G^2 T}
\overline{R_{T-1}} = \dfrac{1}{T}R_{T-1} \leq \sqrt{\dfrac{2 M G^2}{T}}
1.3 Еще одна интерпретация
Давайте покажем, что полученный алгоритм имеет еще одну очень интуитивную интерпретацию:
- y_{k} = \nabla \phi(x_k) Отображение в сопряженное пространство с помощью функции \nabla \phi(x)
- y_{k+1} = y_k - \alpha_k \nabla f_k(x_k) Градиентный шаг в сопряженном пространстве
- x_{k+1} = \text{arg}\min\limits_{x \in S}V_{\nabla \phi^*(y_{k+1})}(x) Обратное отображение с помощью функции \nabla \phi^*(x) и проекция на бюджетное множество
Для доказательства эквивалентности таких записей, следует сначала доказать факт того, что:
\left( \nabla \phi(x) \right)^{-1} = \nabla \phi^*(y)
Для этого пусть y = \nabla \phi(x). Заметим, что для сопряженной функции справедливо неравенство Фенхеля - Юнга: \phi^*(y) + \phi(x) \geq xy, в случае, если \phi(x) - дифференцируема, такое преобразование называется преобразованием Лежандра и выполняется равенство: \phi^*(y) + \phi(x) = xy. Дифференцируя равенство по y, получаем \nabla \phi^*(y) = x. Таким образом,
\nabla\phi^*(y) = \nabla\phi^*(\nabla \phi(x)) = x, \qquad \nabla\phi(x) = \nabla\phi(\nabla \phi^*(y)) = y
Доказательство:
\begin{align*} x_{k+1} &= \text{arg}\min\limits_{x \in S} \left\{ V_{\nabla \phi^*(y_{k+1})}(x) \right\} = \\ &= \text{arg}\min\limits_{x \in S} \left\{ \phi(x) - \phi(\nabla \phi^*(y_{k+1})) - \left\langle \nabla \phi (\nabla \phi^*(y_{k+1})),x - \nabla \phi^*(y_{k+1})\right\rangle\right\} = \\ &= \text{arg}\min\limits_{x \in S} \left\{ \phi(x) - \left\langle y_{k+1},x \right\rangle \right\} = \\ &= \text{arg}\min\limits_{x \in S} \left\{ \phi(x) - \left\langle \nabla \phi(x_k) - \alpha_k g_k,x \right\rangle \right\} = \\ &= \text{arg}\min\limits_{x \in S} \left\{ \phi(x) - \phi(x_k) - \left\langle \nabla \phi(x_k),x \right\rangle + \left\langle \alpha_k g_k,x \right\rangle \right\} = \\ &= \text{arg}\min\limits_{x \in S} \left\{ V_{x_k}(x) + \left\langle \alpha_k g_k,x \right\rangle \right\} \end{align*}
В последней строчке мы пришли к той формулировке, которую писали раньше. Заметим так же, еще одну интересную концепцию:
\begin{align*} x_{k+1} &= \text{arg}\min\limits_{x \in S} \left( \langle \alpha_k g_k, x \rangle + V_{x_k}(x) \right) \\ &= \text{arg}\min\limits_{x \in S} \left( \langle g_k, x \rangle + \frac{1}{\alpha_k}V_{x_k}(x) \right) \\ &= \text{arg}\min\limits_{x \in S} \left(f(x_k)+ \langle g_k, x \rangle + \frac{1}{\alpha_k}V_{x_k}(x) \right) \end{align*}
Здесь левая часть минимизируемого выражения представляет собой аппроксимацию первого порядка, а правая часть представляет собой проекционный член.
2 НАФИГА?
Резонный вопрос, ведь в случае, если мы выбрали \|\cdot\| = \|\cdot\|_2 Евклидову норму и Евклидово расстояние, то этот метод в точности совпадает с тем, что мы уже называем метод проекции субградиента.
Значит, надо предоставить сценарий, когда МЗС работает лучше, давайте рассмотрим S = \Delta_n - вероятностный симплекс, а так же следующее расстояние Брэгмана V_x(y) = \sum_{i \in [n]} y_i \log \frac{y_i}{x_i} = D(y \| x). Норма в прямом пространстве при этом \|\|_1, а в сопряженном - \|\|_\infty. Кроме того, для заданной дивергенции Брэгмана справедливо:
x_0 = \left( 1/n, \ldots, 1/n \right) \; \to \; V_{x_0}(x) \leq \log n \;\;\forall x \in \Delta_n
Тогда алгоритм зеркального спуска запишется в виде:
\begin{align*} x_{k+1} &= \text{arg}\min\limits_{x \in S} \left( \langle \alpha_k g_k, x \rangle + V_{x_k}(x) \right) \\ &= \text{arg}\min\limits_{x \in S} \left( \langle \alpha_k g_k, x \rangle + \sum_{i \in [n]} x_i \log \frac{x_i}{x_{k_i}} \right) \\ &= x_k \cdot \dfrac{e^{-\alpha_k g_k}}{\|x_k \cdot e^{-\alpha_k g_k}\|_1} \end{align*}
А оценки с учетом того, что M = \log n, \|g_k\|_\infty \leq G запишутся, как:
\begin{align*} f(\overline{x}) - f^* \leq \sqrt{\dfrac{2 \log (n) G^2}{T}} \end{align*}
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns
set()
sns.
= np.logspace(0,4, 10)
Ts
= 10
m = 1000
n = np.random.randn(m, n)
A = np.random.randn(n)
x_true < 0] = 0
x_true[x_true = x_true/(np.linalg.norm(x_true, 1))
x_true
= A@x_true
b
= np.ones(n)/n
x0
def f(x):
return np.linalg.norm(A@x - b, 1)
def grad(x):
return np.sum(A.T * np.sign(A@x - b), axis=1)
def mirror_descent(x0, grad, T):
= len(x0)
n = np.log(n)
M ## G = np.linalg.norm(A,np.inf)*1+np.linalg.norm(b,np.inf)
## alpha = np.sqrt(2*M/(G**2*T))
= 0.0001
alpha = x0
xk = []
sequence ## print('MD %.3f'%alpha)
for i in range(int(T)):
sequence.append(xk)= grad(xk)
g = xk * np.exp(-alpha * g) / np.sum(xk * np.exp(-alpha * g))
xk return sequence
def projection_subgradient_descent(x0, grad, T):
= len(x0)
n = 0.5
M ## G = np.linalg.norm(A,2)*1+np.linalg.norm(b,2)
## alpha = np.sqrt(2*M/(G**2*T))
= 0.0001
alpha ## print('GD %.3f'%alpha)
= x0
xk = []
sequence for i in range(int(T)):
sequence.append(xk)= grad(xk)
g = xk - alpha*g
xk <0] = 0
xk[xk= xk/(np.linalg.norm(xk, 1))
xk return sequence
= []
result_md = []
result_gd
for T in Ts:
print(T)
= mirror_descent(x0, grad, T)
md_T = projection_subgradient_descent(x0, grad, T)
gd_T
= np.mean(md_T, axis = 0)
x_md = np.mean(gd_T, axis = 0)
x_gd
- f(x_true))
result_md.append(f(x_md) - f(x_true))
result_gd.append(f(x_gd)
= 'GD')
plt.loglog(Ts, result_gd, label = 'MD')
plt.loglog(Ts, result_md, label 'T')
plt.xlabel(r'$f(\overline{x}) - f(x^*)$')
plt.ylabel( plt.legend()