在逻辑回归中提到过梯度下降法,还有一篇博客详细的介绍了梯度下降法这里我再介绍一下梯度下降法中的常用优化器。如果不知道逻辑回归和梯度下降法,请先阅读上面2篇博客。
梯度下降法的优化器比较多,比如:BGD、SGD 、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam。
但是常用的就2个:SGD和Adadelta,所以这主要介绍着2中优化器
SGD
即随机梯度下降法,他是梯度下降法中的一种方式。在求解损失函数最小值时,它随机采用样本不断的迭代,从而得到最小化损失函数
特点
- 采用的是随机样本,随机打乱数据并重复执行
- 很容易进入局部最小值,而将局部最小值当做全局最优解
- 学习率设置过大,将导致收敛过程震荡,难以收敛
- 学习率设置过小,将导致收敛速度缓慢,同时也容易进入局部最小值
- 由于样本只有一个,下降过程难免出现震荡,但由于数据量小,计算也非常快
与BGD(批量梯度下降法)对比
- BGD(批量梯度下降法)每次样本量更大,下降更稳定,但是计算量更大
- SGD收敛到最小值时,容易更发生震荡,每次更新,方向不一定是对的
- SGD可以在进入最小值时,较少学习率,减小震荡
- SGD因为计算速度更快,所以被人喜欢使用
keras代码
sgd = optimizers.SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
- lr:学习率,是一个非负数
- momentum:扩展功能,表示动量优化,用于加速SGD在相关方向上前进,并抑制震荡,是一个非负数。
- decay:扩展功能,表示每次参数更新后的学习率衰减参数,是一个非负数
- nesterov:扩展功能,是一个布尔值,表示是否使用Nestrov动量(NAG)优化
Adadelta
我们都希望模型训练能快速收敛到一个好的结果,于是就有了Adadelta,他可以根据参数在训练期间更新频率进行自动调整学习率。
- 自动调节优化器,比如SGD训练时,我们希望前期他的学习率高,跑的快,当快收敛的时候又能减少学习率,以至于收敛的时候不震荡。所以自动调节应运而生。
- Adadelta的超参数推荐默认值即可,不建议修改
- 它是Momentum、NAG、Adagrad等优化器一步步优化出来的结果
总结
对于新手来说,使用Adadelta就足够了,但是往往熟悉的程序员更喜欢SGD,因为SGD更能掌控模型收敛的过程