4.1 卷积神经网络调参-adagrad_adam

559 阅读3分钟

4.3.1 adagrad_adam

我们之前将了随机梯度下降和动量梯度下降,不过,还有很多其他的优化算法可以使得模型稳定。

先来回顾随机梯度下降和动量梯度下降

随机梯度下降有两个问题:局部极值问题和saddle point 问题,动量梯度下降可以一定程度上解决这两个问题

因为他可以使用之前积累的梯度方向。

不过这两个方法还有其他的两个问题:

  • 受初始学习率影响太大

    初始化的学习率比较大,不管用哪种梯度下降,都会导致梯度爆炸,模型不收敛

  • 每一个梯度的学习率都是一样的

    α是针对全局的,而不是每一个维度定制的。

    这个在图像上应用还不是特别明显,如果是针对稀疏的问题来说,就比较明显了,会使得我们丢失很多稀疏数据上的信息。

    因为对w求导数的时候,根据链式求导法则,最终都会到w对x的偏导,这时候如果x=0,那么他的参数更新也是0,对于稀疏数据来说,因为他很稀疏,所以很多值都是0,很多时候是得不到梯度的更新的。

    但是

    但是其他维度的数据是很多的,这时候如果统一把学习率调小,会使得稀疏数据学习不到足够的信息

    最好的解决方法是给每一个维度都设置不同的学习率

针对这两个问题,还有哪些其他的算法呢?

  1. AdaGrad

    学习率是逐渐衰减的,用以往梯度的平方和作为学习率的分母,从而使得整个学习率随着训练次数的增加而越来越小,这样也摆脱了学习率对初始值的依赖

    image

grad_squared = 0 
while True:
    dx = compute_gradient(x)
    grad_squared += dx ** 2
    # + 1e-7 加一个比较小的值以防止初始值为0
    x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
*   优点

    *   前期, regularizer较小,放大梯度

    *   后期, regularizer较大,缩小梯度

    *   梯度随训练次数降低(可以防止一直跳过极值区域)

    *   每个分量有不同的学习率

*   缺点

    *   学习率设置太大,导致regularizer影响过于敏感

    *   后期,regularizer累积值太大,提前结束训练
  1. RMSProp

    • AdaGrad 的变种

    • 由累积平方梯度变为平均平方梯度

    • 解决了后期提前结束训练的问题

grad_squared = 0 
while True:
  dx = compute_gradient(x)
  # 平方和变成了平均值
  grad_squared += decay_rate * grad_squared + (1 - decay_rate) * (dx ** 2)
  x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
  1. Adam

    • 所有的上述算法都会用learning_ rate来做参数,但是Adam和上面讲的几种算法会在后期给每个维度一个定制的学习率

    • Adam在以下场景比较有效

      • Beta1 = 0.9

      • Beta2 = 0.999

      • Learning_rate = 1e-3 or 5e-4(初始值比较小,可以通过冲量和累积梯度去放大他)

    Adam结合了Momentum(动量梯度下降)(学习稳定)和Adagrad(可以随着训练次数和维度的变化而变化)的优点

    image

    [图片上传失败...(image-9a19d6-1538918434302)]

    校准的意义在于通过这种方式使得开始的时候first_moment和second_moent变的相对大一些来加速训练