常见梯度下降法

(学习cs231n的笔记,图片就直接偷懒贴了视频的截图,见谅)

一、最常见的三种梯度下降法:
  • 批量梯度下降(BGD Batch gradient descent)
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度

缺点:就对整个数据集计算梯度,所以计算起来非常慢

  • 随机梯度下降(SGD stochastic gradient descent)
每次更新时对每个样本进行梯度更新,速度快,可以随时增加新的样本,但是会造成剧烈震荡

  • Mini-batch gradient descent(MBGD)
每一次利用一小批样本,即 n 个样本进行计算, 这样它可以降低参数更新时的方差,收敛更稳定


总结:以上三种的区别仅仅是训练样本大小的不同,但是没有增加其他权重,会遇到如同SGD的问题
Tensorflow实现函数:tf.train.GradientDescentOptimizer

二、随机梯度下降法(SGD )存在的问题:
1. 当存在两个或更多个权值矩阵时,某个方向的的权值改变对Loss影响很大,而另外的方向影响比较小,这就会造成权值矩阵在影响大的方向上震荡,然后缓慢的沿着影响小的方向前进

2. 存在局部最小值(鞍点),在局部最小值时,会停止更新,但是在局部最小值附近,由于梯度非常小,会使得更新非常慢
3. 我们经常用小批量的数据对Loss和梯度进行估计,这意味着我们每一步并不是去计算真是的梯度,而是在当前点对梯度进行噪声估计,所以优化的方向会比较曲折,也就是需要更多的时间

三、改进的梯度下降法:
1、Momentum
在梯度改变时增加惯性因素,在下一次的梯度时,会继续沿着上一次的梯度方向前进,rho即ρ,意思是摩擦系数
Tensorflow实现函数:tf.train.MomentumOptimizer(self, learning_rate, momentum,
use_locking=False, name="Momentum", use_nesterov=False)
常见梯度下降法_第1张图片




2、Nesterov momentum
常见梯度下降法_第2张图片

常见梯度下降法_第3张图片
比普通带动量的方式更加更加柔和,相当于提前知道梯度的变化方向,然后做出改变
Tensorflow实现函数:tf.train.MomentumOptimizer(self, learning_rate, momentum,
use_locking=False, name="Momentum", use_nesterov=False)
设置use_nesterov=True

总结:Momentum和Nesterov momentum的思路很像,都是在梯度改变时,考虑了上一时刻的梯度方向

3、AdaGrad
梯度更新规则:

其中 g 为:t 时刻参数 θ_i 的梯度

如果是普通的 SGD, 那么 θ_i 在每一时刻的梯度更新公式为:

但这里的 learning rate η 也随 t 和 i 而变
一般 η 就取 0.01
常见梯度下降法_第4张图片
缺点:因为grad_squared是单调递增的,这会导致学习步长会越来越小,越来越慢。在凸函数的情况下比较适用,但是在凹函数的情况下,会卡在局部最优值附近
TensorFlow函数:tf.train.AdagradOptimizer(self, learning_rate, initial_accumulator_value=0.1,
use_locking=False, name="Adagrad")

4、RMSProp
是对AdaGrad的一个变体
RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。
常见梯度下降法_第5张图片
参考文章:https://www.leiphone.com/news/201706/e0PuNeEzaXWsMPZX.html
http://www.mooc.ai/course/268/learn?lessonid=2175#lesson/2175


你可能感兴趣的:(MachineLearning)