SGD 的发展:
whole pipeline:
- 计算当前梯度:$g_t = \nabla f(w_t)$
- 根据历史记录计算一阶动量和二阶动量:$m_t = \phi (g_1, g_2, …, g_t)$,$V_t = \psi (g_1, g_2, …, g_t)$
- 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}}$
- 根据下降梯度进行更新:$w_{t + 1} = w_t - \eta_t$
SGD:
- pipeline:
- 计算当前梯度:$g_t = \nabla f(w_t)$
- 根据历史记录计算一阶动量和二阶动量:$m_t = g_t$,$V_t = I^2$
- 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha g_t$
- 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha g_t$
- 问题:
trapped in local valley and can be unstable
- pipeline:
SGD with Momentum
- idea:
to overcome the trapped problem and unstable problem, the Momentum is brought in. - pipeline:
- 计算当前梯度:$g_t = \nabla f(w_t)$
- 根据历史记录计算一阶动量和二阶动量:$m_t = \beta_1 m_{t - 1}+ (1 - \beta_1) g_t$,$V_t = I^2$
- 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
- 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
- idea:
SGD with Nesterov Acceleration
- pipeline:
- 计算当前梯度:$g_t = \nabla f(w_t - \alpha \frac{m_{t - 1}}{\sqrt{V_{t - 1}}})$
- 根据历史记录计算一阶动量和二阶动量:$m_t = \beta_1 m_{t - 1}+ (1 - \beta_1) g_t$,$V_t = I^2$
- 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
- 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
- pipeline:
AdaGrad
开始考虑二阶动量(嘛个鸡,不就是加速度吗。。。。很朴素。。。就像电动力学里面的电场的展开项,我二阶了就电偶极矩了。。。),考虑二阶量也很好理解,描述问题会更精准一点,但是会有额外的计算量的cost- 计算当前梯度:$g_t = \nabla f(w_t)$
- 根据历史记录计算一阶动量和二阶动量:$m_t = \phi (g_1, g_2, …, g_t)$,$V_t = \sum_{\tau=1}^t g_{\tau}^2$
- 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \frac{\alpha}{\sqrt{V_t}} m_t$
根据下降梯度进行更新:$w_{t + 1} = w_t - \eta_t$
你看这里 lr:$\frac{\alpha}{\sqrt{V_t}}$ 是自适应的,$V_t = \sum_{\tau=1}^t g_{\tau}^2$,是递增,lr则会递减,如果lr下降的太快,提前converge,那global optimal可能就没有被探索到
AdaDelta / RMSProp
$V_t = \psi (g_1, g_2, …, g_t) = \sum_{\tau=1}^t g_{\tau}^2 \rightarrow V_t = \psi (V_{t - 1}, g_{t}) = \beta_2 V_{t - 1} + (1 - \beta_2) g_{t}^2$ 不是只考虑全部历史,考虑前一次对本次的影响有点像Markov ChainAdam
简单说,就是把上面方法都整合了一遍:谈到这里,Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。
把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。
(引自: https://zhuanlan.zhihu.com/p/32230623)SGD的一阶动量:
$m_t = \phi (m_{t - 1}, g_{t}) = \beta_1 m_{t - 1} + (1 - \beta_1) g_{t}$
加上AdaDelta的二阶动量:
$V_t = \psi (V_{t - 1}, g_{t}) = \beta_2 V_{t - 1} + (1 - \beta_2) g_{t}^2$Bayesian Optimization:
总结:
可以算是”万能”的,但对于特定的模型,不一定是最优的解法。更好的解法比如针对SVM的SMO算法、针对含隐变量的模型的EM算法等等。(from 王赟(yun第一声))
补充一点在数值分析里的结论…(虽然讨论的不是神经网络,但本质上还是求函数的极值点梯度下降法的问题在于,当很接近极值点的时候,下一步搜索的方向和之前搜索的方向correlation太高,会表现出在原地转圈的形状,每一步的改进量越来越小为了避免这一点才引出了共轭梯度法,要求新的搜索方向和之前每一步的搜索方向正交。
(作者:匿名用户 链接:https://www.zhihu.com/question/38677354/answer/85324507)RNN