# 深度学习中的优化算法串讲

## 基本框架

1. 计算损失函数关于当前参数的梯度：
g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t)

2. 根据历史梯度计算一阶和二阶动量：
m t = ϕ ( g 1 , g 2 , . . . , g t ) V t = ψ ( g 1 , g 2 , . . . , g t ) m_t = \phi(g_1,g_2,...,g_t) \\ V_t = \psi(g_1,g_2,...,g_t)
这里一阶动量是关于历史梯度的一阶函数，二阶动量是关于历史梯度的二阶函数。

3. 计算当前时刻的下降梯度：
Δ θ t = − η m t V t \Delta \theta_t = -\eta \frac{m_t}{\sqrt{V_t}}
所有的优化算法都是基于这个公式，只不过是一阶动量和二阶动量的计算方式不同。

4. 根据下降梯度更新参数：
θ t + 1 = θ t + Δ θ t \theta_{t+1} = \theta_t + \Delta \theta_t

Δ θ t = − η m t V t = − η g t \Delta \theta_t = -\eta \frac{m_t}{\sqrt{V_t}} = -\eta g_t

v n + 1 = − η d L d W n v_{n+1} = - \eta \frac{dL}{dW_n}

W n + 1 = W n + v n + 1 W_{n+1} = W_n + v_{n+1}

## Momentum

v n + 1 = a v n − η d L d W n v_{n+1} = av_{n} - \eta \frac{dL}{dW_n}

W n + 1 = W n + v n + 1 W_{n+1} = W_n + v_{n+1}

W n + 1 = W n − η 1 h n d L d W n W_{n+1} = W_n- \eta \frac{1}{\sqrt{h_n}} \frac{dL}{dW_n}

h n = h n − 1 + d L d W n ∗ d L d W n h_n = h_{n-1} + \frac{dL}{dW_n} * \frac{dL}{dW_n}

W ~ = W n − 1 − η v n − 1 \tilde W = W_{n-1} - \eta v_{n-1}

v n = α v n − 1 + η d L ( W ~ n ) d W ~ n v_n = \alpha v_{n-1} + \eta \frac{dL(\tilde W_n)}{d\tilde W_n}

W n = W n − 1 − v n W_n = W_{n-1} - v_n

## RMSProp

W n + 1 = W n − η 1 h n d L d W n W_{n+1} = W_n- \eta \frac{1}{\sqrt{h_n}} \frac{dL}{dW_n}

h n = β h n − 1 + ( 1 − β ) d L d W n ∗ d L d W n h_n = \beta h_{n-1} + (1 - \beta)\frac{dL}{dW_n} * \frac{dL}{dW_n}

x t = x t − 1 + Δ x \boldsymbol{x}_t = \boldsymbol{x}_{t-1} + \Delta\boldsymbol{x}

Δ x = − E ( Δ x 2 ) t + ϵ E ( g 2 ) t + ϵ g t \Delta\boldsymbol{x} = - \sqrt{\frac{ E(\Delta\boldsymbol{x}^2)_t + \epsilon}{E(g^2)_t + \epsilon}} g_t

E ( g 2 ) t = ρ E ( g 2 ) t − 1 + ( 1 − ρ ) g t ⊙ g t E(g^2)_t =\rho E({g}^2)_{t-1} + (1 - \rho) \boldsymbol{g}_t \odot \boldsymbol{g}_t

E ( Δ x 2 ) t = ρ E ( Δ x 2 ) t − 1 + ( 1 − ρ ) Δ x t ⊙ Δ x t E(\Delta\boldsymbol{x}^2)_t = \rho E(\Delta\boldsymbol{x}^2)_{t-1} + (1 - \rho) \boldsymbol \Delta{x}_t \odot \boldsymbol \Delta{x}_t

g t g_t 即这一时刻的梯度，其中的点乘是矩阵各个元素分别乘积，和我们理解的数与数相乘一致。 ϵ \epsilon 是一个较小的常数，用来防止零除，或者在其他值为0时整体也不为0。其中： v 0 = 0 \boldsymbol{v}_0 = 0 E ( g 2 ) t = 0 E(g^2)_t = 0 。这个算法和RMSProp英雄所见略同，但是学习率变成了动态调整的了，省去了人工调节超参数的麻烦，在x的变化较小的情况下，自动把学习率降低，有利于减小振荡，达到最优点。

m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t

v t = β 2 v t − 1 + ( 1 − β 2 ) g t ⊙ g t v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t \odot g_t

m t ^ = m t 1 − β 1 t \hat{m_t} = \frac{m_t}{1- \beta_1^t}

v t ^ = v t 1 − β 2 t \hat{v_t} = \frac{v_t}{1- \beta_2^t}

x t + 1 = x t − η v ^ t + ϵ m t ^ \boldsymbol{x}_{t+1} = x_t - \frac{\eta}{\sqrt{\hat v_t + \epsilon}} \hat{m_t}

β 1 \beta_1 β 2 \beta_2 是梯度一阶矩估计值和二阶矩估计值的指数衰减速率，在0到1之间。每一步的有效学习率在一定范围变动。这个算法适用于大多数非凸环境的优化，是目前最流行的算法。之所以还要除以一项计算估计值是因为这样可以保证里面每一个梯度或者梯度的平方前面的参数之和为1！越往前的梯度前面的参数就越小，呈指数衰减。这就是一个指数加权移动平均的概念。这样随着梯度的降低，越来越解决最优点的同时，分子在不断减小，学习率降低，并保留一部分之前的冲量，让其能冲出鞍点。同时保留了分母中RMSProp的优点。