【深度学习基础】梯度下降的优化算法

【深度学习基础】梯度下降的优化算法

  • Mini-batch
    • 1. 定义
    • 2. mini batch的超参
    • 3. mini-batch size的选择
    • 4. 步骤
    • 5. BGD, mini batch, SGD的算法收敛性
  • 指数加权平均
  • 动量梯度下降法(Momentum)
    • 公式推导
  • RMSprop(root mean square prop)
  • Adam优化算法(Adaptive Moment Estimation)

可以直接挑战博客:
常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)

Mini-batch

1. 定义

**最速梯度下降法(Batch Gradient Descent, BSD)**是将所有训练集所有的梯度计算之后,再更新参数,这样大部分时间浪费在计算梯度上。
mini-batch是将训练集进行分组,分组之后,分别对每组求梯度,然后更新参数。
例如我们把100万样本分成1000份, 每份1000个样本, 这些子集就称为mini batch。然后我们分别用一个for循环遍历这1000个子集。 针对每一个子集做一次梯度下降。 然后更新参数w和b的值。接着到下一个子集中继续进行梯度下降。 这样在遍历完所有的mini batch之后我们相当于在梯度下降中做了1000次迭代。
1 epoch是指一次遍历了训练集,包括所有的mini-batch。
见下图,左边是full batch的梯度下降效果。 可以看到每一次迭代成本函数都呈现下降趋势,这是好的现象,说明我们w和b的设定一直再减少误差。 这样一直迭代下去我们就可以找到最优解。 右边是mini batch的梯度下降效果,可以看到它是上下波动的,成本函数的值有时高有时低,但总体还是呈现下降的趋势。 这个也是正常的,因为我们每一次梯度下降都是在min batch上跑的而不是在整个数据集上。 数据的差异可能会导致这样的效果(可能某段数据效果特别好,某段数据效果不好)。但没关系,因为他整体的是呈下降趋势的。
【深度学习基础】梯度下降的优化算法_第1张图片
把下面的图看做是梯度下降空间。 图1是full batch的图2是mini batch。 就像上面说的mini batch不是每次迭代损失函数都会减少,所以看上去好像走了很多弯路。 不过整体还是朝着最优解迭代的。 而且由于mini batch一个epoch就走了5000步,而full batch一个epoch只有一步。所以虽然mini batch走了弯路但还是会快很多。
【深度学习基础】梯度下降的优化算法_第2张图片
【深度学习基础】梯度下降的优化算法_第3张图片

2. mini batch的超参

超参:batch size,指每一个mini batch中有多少个样本,也就是块大小,
随机梯度下降法(stochastic gradient descent, SGD):mini-batch size == 1,每个样本都是独立的mini-batch。永远不会收敛,在最小值周边波动。
由于SGD每次只使用一个样本进行迭代,若遇上噪声则容易陷入局部最优解。

3. mini-batch size的选择

我们一般设置为2的n次方。 例如64,128,512,1024. 一般不会超过这个范围。不能太大,因为太大了会无限接近full batch的行为,速度会慢。 也不能太小,太小了以后可能算法永远不会收敛。 当然如果我们的数据比较小, 但也用不着mini batch了。 full batch的效果是最好的。

4. 步骤

  1. 确定mini-batch size,一般有32、64、128等,按自己的数据集而定,确定mini-batch_num=m/mini-batch_num + 1;
  2. 在分组之前将原数据集顺序打乱,随机打乱;
  3. 分组,将打乱后的数据集分组;
  4. 将分好后的mini-batch组放进迭代循环中,每次循环都做mini-batch_num次梯度下降。

5. BGD, mini batch, SGD的算法收敛性

批梯度处理能够保证算法收敛到最小值(如果选择的学习速率合适的话),可以plot代价函数随迭代次数的曲线,如果曲线是总是下降的,则能够收敛,反之需要调整学习速率。
随机梯度下降并不能保证算法收敛到最小值,最终结果可能是在最小值附近来回游走,为了观察其收敛特性,可以plot每100(1000)次迭代时100个example代价函数函数的平均值,如果是下降趋势,则可以收敛,否则可能需要调整增大或者减小平均的example数(将100改为1000或者10等),减小或者增大学习速率。

指数加权平均

常见数学中的指数加权平均。
v t = β ∗ v t − 1 + ( 1 − β ) ∗ θ t v_t = \beta * v_{t-1} + (1-\beta) * \theta_t vt=βvt1+(1β)θt
在样本的初始进行迭代更新的时候,采用偏差修正的公式进行计算迭代。
偏差修正(Bias correction)
v t 1 − β t \frac{v_t}{1 - \beta^t} 1βtvt

动量梯度下降法(Momentum)

公式推导

在时刻t,计算 d W d_W dW, d b d_b db在当前mini-batch的值:
v d W = β ∗ v d W + ( 1 − β ) ∗ d W v_{d_W} = \beta * v_{d_W} + (1 - \beta) * d_W vdW=βvdW+(1β)dW
d d b = β ∗ v d b + ( 1 − β ) ∗ d b d_{d_b} = \beta * v_{d_b} + (1 - \beta) * d_b ddb=βvdb+(1β)db
W : = W − α ∗ v d w , b : = b − α ∗ v d b W := W - \alpha * v_{d_w}, b := b - \alpha * v_{d_b} W:=Wαvdw,b:=bαvdb
β \beta β常用值是0.9。
用微分进行替代,可以降低下降的速度。

RMSprop(root mean square prop)

在时刻t,计算 d W d_W dW, d b d_b db在当前mini-batch的值:
S d W = β ∗ S d W + ( 1 − β ) ∗ [ d W ] 2 S_{d_W} = \beta * S_{d_W} + (1 - \beta) * [d_W] ^ 2 SdW=βSdW+(1β)[dW]2
S d b = β ∗ S d b + ( 1 − β ) ∗ [ d b ] 2 S_{d_b} = \beta * S_{d_b} + (1 - \beta) * [d_b] ^ 2 Sdb=βSdb+(1β)[db]2
W : = W − α ∗ d W S d W 2 , b : = b − α ∗ d b S d b 2 W := W - \alpha * \frac{d_W}{\sqrt[2]{S_{d_W}}}, b := b - \alpha * \frac{d_b}{\sqrt[2]{S_{d_b}}} W:=Wα2SdW dW,b:=bα2Sdb db

Adam优化算法(Adaptive Moment Estimation)

Adam优化算法(Adaptive Moment Estimation),综合了Momentum和RMSprop算法,黄色框是Momentum,红色框是RMSprop。该算法在各种网络结构上的表现都较好。
【深度学习基础】梯度下降的优化算法_第4张图片

参考

  1. 深度学习—加快梯度下降收敛速度(一):mini-batch、Stochastic gradient descent
  2. mini-batch 梯度下降

你可能感兴趣的:(深度学习)