A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

深度学习基础模型算法原理及编程实现–10.优化方法:从梯度下降到NAdam

优化算法的出现顺序从前往后依次为:SGD、SGDM、NAG、AdaGrad、AdaDelta、Adam、Nadam,这些优化算法的演变其实都来自一个模型,其演化路径如下图所示:



1 一阶优化方法(梯度下降)



1.1 Jacobi矩阵的性质

Jacobi矩阵给出了优化问题中当前点的最优线性逼近。需要注意的是许多神经网络的jacobi矩阵总是秩亏损的,这导致反向传播算法仅仅得到搜寻方向上的部分信息,从而导致训练时间过长。比如,如果jacobi矩阵是diag([1,0,1,0,0,1,0,1]),那么仅在对角线值元素值为1的维度所对应的参数有更新,对角线元素值为0的维度更新为0。

1.2 Gradient Descent



1.3 Noisy gradient descent



1.4 Vanilla SGD



1.5 SGD with Momentum(缩写SGDM)



1.6 NAG(Nesterov Accelerated Gradient)



2 学习率退火

如果学习率过高,参数更新量过大,参数就会无规律地跳动,不能够稳定到损失函数更深更窄的凹点中去。如果慢慢减小它,可能在前期的很长时间内看参数无规律的跳动。如果快速减小它,参数更新量可能下降过快,使得学习速度变慢甚至趋于0。常用的学习率退火有3种方式:

2.1 随步数衰减

特定周期个数后就降低学习率。比如每过5或10个周期就将学习率减少一半或更多。或者用固定的学习率来进行训练,每当验证集错误率停止下降,就以一定的系数来降低学习率。

2.2 指数衰减



2.3 1/t衰减



3 二阶优化方法(牛顿法,又是一阶求跟方法)

一阶方法只使用梯度和函数评估去优化目标。二阶方法比如牛顿方法或者逆牛顿方法使用海塞矩阵或近似。尽管这为优化提供了额外的曲率信息,但精确计算二阶信息还是比较困难的。

3.1 牛顿法原理

3.1.1 牛顿法是一阶求跟方法



3.1.2 牛顿法是二阶优化方法

3.1.2.1 二阶泰勒分解求解



3.1.2.2 用求f’(x)=0根的方法来求解



3.1.3 海塞矩阵的性质

从式(1.9)可以发现,由于Hessian矩阵描述了损失函数的局部曲率,通过乘以Hessian矩阵的逆矩阵,可以在曲率小的时候大步前进,在曲率大的时候小步前进,从而使得参数更高效的更新。
此外,导数为0的点称为稳定点(Stationary points)。稳定点可以是(局部)最小值、(局部)最大值及鞍点。可通过计算Hessian矩阵H来进行判别:
(1)非退化的情况
 若H负定(所有特征值都是负的),这是(局部)最大值.
 若H正定(所有特征值都是正的),这是(局部)最小值.
 若H特征值既有正的,又有负的,那该点是鞍点。(有些方向函数值上升,有些方向函数值下降)。
种非退化的情况下面,我们考虑一个重要的类别,即strict saddle函数.这种函数有这样的特点:对于每个点x
要么x的导数比较大
要么x的Hessian矩阵包含一个负的特征值
要么x已经离某一个(局部)最小值很近了
为什么我们要x满足这三个情况的至少一个呢?因为
(2)退化的情况
 H特征值含0的情况。此时无法判断稳定点的类别,需参照更高维的导数。

3.1.4 海塞矩阵近似计算

3.1.4.1 对角线近似逆矩阵



3.1.4.2 Adadelta中的近似方法

3.1.4.2.1 时间加权



3.1.4.2.2 利用二阶优化方法的量纲是正确的



3.1.4.2.3 近似Hessian方法



3.2 AdaGrad



3.3 RMSProp



3.4 AdaDelta



3.5 Adam



3.6 Adamax

3.7 Nadam

4 不同优化方法结果比对

4.1 GD

eta1 = 0.1
step: 100 loss: 0.0044979134602375365


4.2 Vanilla SGD

eta1 = 0.1
step: 400 loss: 0.001108528235755615


4.3 Mini_batch SGD

eta1 = 0.1
step: 500 loss: 0.0062751857700584805


4.4 SGDM

eta1 = 0.1
beta1 = 1 - eta1
step: 400 loss: 0.005477318943045696


4.5 NAG

alpha = 0.05 #Nestreov项一步向前学习率
eta1 = 0.1
beta1 = 1 - eta1
step: 500 loss: 0.0027062579259504315


4.6 Adagrad

eta1 = 0.1
step: 2600 loss: 26.2471475715


4.7 RMSProp

eta1 = 0.1
eta2 = 0.1
beta2 = 1 - eta2
step: 500 loss: 0.00855535079012


4.8 Adadelta

eta1 = 0.1
beta1 = 1 - eta1
eta2 = 0.1
beta2 = 1 - eta2
step: 100 loss: 0.0170838268612


4.9 Adam

eta1 = 0.1
beta1 = 1 - eta1
eta2 = 0.1
beta2 = 1 - eta2
step: 100 loss: 0.0170408324886


5 编程实现

python版本:https://pan.baidu.com/s/1qZLJ7Gg
---------------------
【转载】
作者:drilistbox
原文:https://blog.csdn.net/drilistbox/article/details/80500661


3 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马