【caffe 深度学习】3.各类优化器介绍
1.主要优化器:
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer
2.各种优化器对比:
标准梯度下降法:
标准梯度下降先计算所有样本汇总误差,然后根据总误差来更新权值(可能费时比较严重)
随机梯度下降法:
随机梯度下降法随机抽取一个样本来计算误差,然后更新权值(所以权值更新的方向不保证正确)
批量梯度下降法:
批量梯度下降法是一个比较折中的方案,从总样本中抽取一定的批次(比如一共有10000个样本,随机抽取100个样本作为一个batch),然后计算这个batch的总误差,根据总误差来更新权值。
W:要训练的参数
J(W):代价函数
∇WJ(W):代价函数的梯度
η:学习率
(2)SGD:
W = W-η⋅∇WJ(W;x(i);y(i))
(2)Momentum:
γ:动力,通常设置为0.9
vt = γvt 1 + η∇WJ(W)
W = W-vt
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球的向下的速度。
(3)NAG(Nesterov accelerated gradient):
vt = γvt 1 + η∇WJ(W-γvt 1)
W = W-vt
NAG在TF中跟Momentum合并在同一个函数tf.train.MomentumOptimizer中,可以通过参数配置启用。
在Momentum中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提取知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是冲上另一个坡。γvt-1会用来修改W的值,计算W-γvt-1可以表示小球下一个位置大概在哪里。 从而我们可以提取计算下一个位置的梯度,然后使用到当前位置。
(4)Adagrad:
i:代表第i个分类
t:代表出现次数
ϵ:的作用是避免分母为0,取值一般为1e-8
η:取值一般为0.01
gt,i = ∇WJ(Wi)
它是基于GSD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数。它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照片)。
Adagrad主要的优势在于不需要人为地调节学习率,它可以自动调节。它的缺点在于,随着迭代次数增多,学习率也会越来越低,最终趋向于0。
(5)RMSprop:
RMS(Root Mean Square)是均方根的缩写。
γ:动力,通常设置为0.9
η:取值一般为0.001
E[g2]t:表示前t次的梯度平方的平均值
gt = ∇WJ(W)
E[g2]t = γE[g2]t-1 + (1-γ)g2t
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的
平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来越低的问题,而且也能自己调节学习
率,并且可以有一个比较好的效果。
(6)Adadelta:
使用Adadelta我们甚至不需要设置一个默认学习率,在Adadelta不需要使用学习率也可以达到一个非常好的效果 。
(7)Adam:
β1: 一般取值0.9
mt=β1mt 1+(1-β1)gt
vt=β2vt-1+(1-β2)g2t
就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些
处理之后再使用类似Adadelta和RMSprop的方式更新参数。
3.各种优化器表现
( SGD不能逃离鞍点问题,速度也比较慢)
我们选优化器的时候可以每一个优化器都试一遍,哪一个优化器最好用就选哪个优化器。