深度学习中各种优化方法详解

这篇文章主要参考Keras Documentation,另外增加了一些我的理解,希望尽量写的简洁明了。

如何使用Optimizer

这里我们定义了一个简单的FC网络用来解释Optimizer的使用方法:

from keras import optimizers
#定义模型
model = Sequential()
model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,)))
model.add(Activation('softmax'))
#编译模型
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)

如上的代码中,在model.compile()前定义了优化算法,然后将sgd作为参数传入model.compile()进行编译。这是最常用的方法,还有另一种方法是:

# pass optimizer by name: default parameters will be used
model.compile(loss='mean_squared_error', optimizer='sgd')

这种方法也可使用SGD算法,参数设置为默认参数,并不推荐这种写法。

Optimizer 共有的参数

参数 clipnormclipvalue 是所有优化器都可以使用的参数,用于对梯度进行裁剪。示例如下:

from keras import optimizers
#在进行梯度下降算法过程中,梯度值可能会较大,通过控制clipnorm可以实现梯度的剪裁
#使其2范数不超过clipnorm所设定的值
sgd = optimizers.SGD(lr=0.01, clipnorm=1.)
from keras import optimizers
#在进行梯度下降算法过程中,梯度值可能会较大,通过控制clipnorm可以实现梯度的剪裁
#使其2范数不超过clipvalue所设定的值
#比如-1,-2,-0.6等会被修剪为会被修剪为-0.5,而-0.4,0.3等不变
sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)

SGD(Stochastic gradient descent)

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

官方手册定义如下:
lr: float >= 0. Learning rate.
momentum: float >= 0. Parameter that accelerates SGD in the relevant direction and dampens oscillations.
decay: float >= 0. Learning rate decay over each update.
nesterov: boolean. Whether to apply Nesterov momentum.

具体实现:
需要:学习速率a,初始参数θ
每次迭代过程:
1、从训练集中随机抽取一批容量为m的样本{x1,…,xm},以及相关的输出yi
2、计算梯度并更新参数:
这里写图片描述

优点:
相比BGD算法计算速度快

缺点:
相比于BGD算法任何一个参数每次更新都会计算所有样本,SGD算法中是每选取一个样本,都会更新所有参数,所以每次迭代很容易收到样本的影响而偏离了原有的梯度方向,所以SGD算法并不能很好的反应真是梯度。

使用Decay的原因:
1、刚开始梯度很大,使用较大的学习率提高收敛速度,随着梯度慢慢减小一点点接近最优点,减小学习率可以保证收敛;
2、SGD对噪声敏感,得到的梯度肯定有误差,因此学习速率需要逐渐减小.否则模型无法收敛 。

其中ϵ0是初始学习率, ϵτ是最后一次迭代的学习率. τ自然代表迭代次数.一般来说,ϵτ 设为ϵ0的1%比较合适.而τ一般设为让训练集中的每个数据都输入模型上百次比较合适.那么初始学习率ϵ0怎么设置呢?书上说,你先用固定的学习速率迭代100次,找出效果最好的学习速率,然后ϵ0设为比它大一点就可以了.

这里只介绍momentum,decay, nesterov 参数的意义及使用方法:
SGD算法有一个缺陷,那就是对噪声敏感,每次计算梯度时都会受到数据集中噪声的影响,而Momentum方法可以比较好的缓解这个问题,尤其是在面对小而连续的梯度但是含有很多噪声的时候,可以很好的加速学习。Momentum是动量的意思,顾名思义他是维持物体运动状态的一个物理量,在这里就是维持梯度变化方向和速度的参数,可以有效的减小噪声对梯度变化方向和速度的影响。

关于SGD算法很简单,推荐参考吴恩达的课件NOTE1,可以从这里下载吴恩达课件

未完

参考文献:
1、https://keras.io/optimizers/
2、https://blog.csdn.net/u014595019/article/details/52989301

猜你喜欢

转载自blog.csdn.net/wangdongwei0/article/details/80300895
今日推荐