deep learning problems summary

SGD 的发展

  • whole pipeline:

    1. 计算当前梯度:$g_t = \nabla f(w_t)$
    2. 根据历史记录计算一阶动量和二阶动量:$m_t = \phi (g_1, g_2, …, g_t)$,$V_t = \psi (g_1, g_2, …, g_t)$
    3. 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}}$
    4. 根据下降梯度进行更新:$w_{t + 1} = w_t - \eta_t$
  • SGD:

    • pipeline:
      1. 计算当前梯度:$g_t = \nabla f(w_t)$
      2. 根据历史记录计算一阶动量和二阶动量:$m_t = g_t$,$V_t = I^2$
      3. 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha g_t$
      4. 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha g_t$
    • 问题:
      trapped in local valley and can be unstable
  • SGD with Momentum

    • idea:
      to overcome the trapped problem and unstable problem, the Momentum is brought in.
    • pipeline:
      1. 计算当前梯度:$g_t = \nabla f(w_t)$
      2. 根据历史记录计算一阶动量和二阶动量:$m_t = \beta_1 m_{t - 1}+ (1 - \beta_1) g_t$,$V_t = I^2$
      3. 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
      4. 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
  • SGD with Nesterov Acceleration

    • pipeline:
      1. 计算当前梯度:$g_t = \nabla f(w_t - \alpha \frac{m_{t - 1}}{\sqrt{V_{t - 1}}})$
      2. 根据历史记录计算一阶动量和二阶动量:$m_t = \beta_1 m_{t - 1}+ (1 - \beta_1) g_t$,$V_t = I^2$
      3. 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
      4. 根据下降梯度进行更新:$w_{t + 1} = w_t - \alpha (\beta_1 m_{t - 1}+ (1 - \beta_1) g_t)$
  • AdaGrad
    开始考虑二阶动量(嘛个鸡,不就是加速度吗。。。。很朴素。。。就像电动力学里面的电场的展开项,我二阶了就电偶极矩了。。。),考虑二阶量也很好理解,描述问题会更精准一点,但是会有额外的计算量的cost

    1. 计算当前梯度:$g_t = \nabla f(w_t)$
    2. 根据历史记录计算一阶动量和二阶动量:$m_t = \phi (g_1, g_2, …, g_t)$,$V_t = \sum_{\tau=1}^t g_{\tau}^2$
    3. 计算当前时刻下降的梯度:$\eta = \alpha \frac{m_t}{\sqrt{V_t}} = \frac{\alpha}{\sqrt{V_t}} m_t$
    4. 根据下降梯度进行更新:$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 Chain

  • Adam
    简单说,就是把上面方法都整合了一遍:

    谈到这里,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