咱们以前将了随机梯度降低和动量梯度降低,不过,还有不少其余的优化算法可使得模型稳定。算法
先来回顾随机梯度降低和动量梯度降低bash
随机梯度降低有两个问题:局部极值问题和saddle point 问题,动量梯度降低能够必定程度上解决这两个问题学习
由于他可使用以前积累的梯度方向。优化
不过这两个方法还有其余的两个问题:spa
受初始学习率影响太大code
初始化的学习率比较大,无论用哪一种梯度降低,都会致使梯度爆炸,模型不收敛cdn
每个梯度的学习率都是同样的blog
α是针对全局的,而不是每个维度定制的。图片
这个在图像上应用还不是特别明显,若是是针对稀疏的问题来讲,就比较明显了,会使得咱们丢失不少稀疏数据上的信息。it
由于对w求导数的时候,根据链式求导法则,最终都会到w对x的偏导,这时候若是x=0,那么他的参数更新也是0,对于稀疏数据来讲,由于他很稀疏,因此不少值都是0,不少时候是得不到梯度的更新的。
可是
可是其余维度的数据是不少的,这时候若是统一把学习率调小,会使得稀疏数据学习不到足够的信息
最好的解决方法是给每个维度都设置不一样的学习率
针对这两个问题,还有哪些其余的算法呢?
AdaGrad
学习率是逐渐衰减的,用以往梯度的平方和做为学习率的分母,从而使得整个学习率随着训练次数的增长而愈来愈小,这样也摆脱了学习率对初始值的依赖
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累积值太大,提早结束训练
复制代码
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)
复制代码
Adam
全部的上述算法都会用learning_ rate来作参数,可是Adam和上面讲的几种算法会在后期给每一个维度一个定制的学习率
Adam在如下场景比较有效
Beta1 = 0.9
Beta2 = 0.999
Learning_rate = 1e-3 or 5e-4(初始值比较小,能够经过冲量和累积梯度去放大他)
Adam结合了Momentum(动量梯度降低)(学习稳定)和Adagrad(能够随着训练次数和维度的变化而变化)的优势
[图片上传失败...(image-9a19d6-1538918434302)]
校准的意义在于经过这种方式使得开始的时候first_moment和second_moent变的相对大一些来加速训练