- 2.1 Mini-batch 梯度下降(Mini-batch gradient descent )
- 2.2 理解 mini-batch 梯度下降法(Understanding mini-batch gradient descent )
- 2.3 指数加权平均数(Exponentially weighted averages )
- 2.4 理解指数加权平均数(Understanding exponentially weighted averages
- 2.5 指 数 加 权 平 均 的 偏 差 修 正 ( Bias correction in exponentially weighted averages
- 2.6 动量梯度下降法(Gradient descent with Momentum
- 2.7 RMSprop
- 2.8 Adam 优化算法(Adam optimization algorithm)
- 2.9 学习率 衰减(Learning rate decay)
- 2.10 局部最优的问题(The problem of local optima)
tags: [笔记, 吴恩达深度学习, 第二周:优化算法]
categories: [笔记, 吴恩达深度学习, 第二周:优化算法]
通过优化算法使得loss函数梯度下降平稳且快,从而达到快速训练出好的模型的效果。
2.1 Mini-batch 梯度下降(Mini-batch gradient descent )
在没有提出Mini-batch 梯度下降算法之前,都是在巨大的数据集上直接训练(整个巨大的数据集直接作为一个batch,进行batch梯度下降),这就导致模型训练速度很慢,使得深度学习在之前难以发挥重大作用。
而mini-batch梯度下降法具体思想是将整个大数据集划分为n个mini-batch样本数据集,一个epoch里分别对这个n个mini-batch样本数据集进行n次迭代,求出每个mini-batch的梯度。具体细节如下:
batch梯度下降法:使用向量化,能有效地对所有m个样本进行计算,允许你处理整个训练集,
而无需某个明确的公式。把训练样本放到巨大的矩阵X当中去,。Y也是如此,。𝑌的维数是,Y的维数是,使用向量化来快速处理所有m个样本。
mini-batch梯度下降法:若m很大的话,比如500万甚至是5000万或者更大的数,则用batch梯度下降法来训练、处理数据,速度会很慢。因此可以把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的𝑦 (1) 到𝑦 (1000) 取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从𝑦 (1001) 到𝑦 (2000) ,然后再取 1000个样本,以此类推。
其具体的原理或做法如下图所示:
其中,同样使用向量化去几乎同时处理 1000 个样本。
batch vs mini-batch: 使用 batch 梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用 mini-batch 梯度下降法,一次遍历训练集,能让你做 5000 个梯度下降。
2.2 理解 mini-batch 梯度下降法(Understanding mini-batch gradient descent )
batch 梯度下降法:每次迭代你都需要历遍整个训练集,可以预期每次迭代成本
都会下降,所以如果成本函数J是迭代次数的一个函数,它应该会随着每次迭代而减少,如会下降,所以如果成本函数𝐾是迭代次数的一个函数,它应该会随着每次迭代而减少,如
果J在某次迭代中增加了,那肯定出了问题,也许你的学习率太大。
mini-batch 梯度下降法:如果你作出成本函数在整个过程中的图,则并不是每次迭
代都是下降的,特别是在每次迭代中,你要处理的是X^ {t} 和Y ^{t} ,如果要作出成本函数J^ {t} 的图,而J^ {t} 只和X^ {t} ,Y ^{t} 有关,也就是每次迭代下你都在训练不同的样本集或者说训练不同的 mini-batch。
注:**没有每次迭代都下降是不要紧的,但走势应该向下。
mini-batch 的大小等于𝑛,其实就是 batch 梯度下降法(缺点:样本数量巨大的时候,要处理整个数据集,单次迭代耗时太长);mini-batch 大小为 1,就有了新的算法,叫做随机梯度下降法(失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下);因此一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果 mini-batch 大小是 2 的n次方,代码会运行地快一些。
需要注意的是在你的 mini-batch 中,要确保X^ {t} 和Y ^{t} 要符合 CPU/GPU 内存,这取决
于你的应用方向以及训练集的大小。
2.3 指数加权平均数(Exponentially weighted averages )
除了batch梯度下降法和 mini-batch 梯度下降法,还有一些更高效的梯度下降优化算法,这些都会使用到指数加权平均这一概念。
使用公式来计算每日的加权平均温度值,β=0.9的话则得到红色曲线。
注意,在计算时可视v_t大概是1/(1−β) 的每日温度,如果β是 0.9,则可以将每日温度v_t看作是十天的平均值,也就是红线部分。
β = 0.98,即β较大时,相当于平均了更多天的温度,所以指数加权平均值适应地更缓慢一些,为绿线部分,这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为现在平均的温度值更多,要平均更多的值,指数加权平均公式在温度变化时,适应地更缓慢一些,所以会出现一定延迟,;若β = 0.5,则相当于平均了两天的温度,如黄色曲线,会有更多的噪声,有可能出现异常值,但是这个曲线能够更快适应温度变化。
总结:指数加权平均数经常被使用,再说一次,它在统计学中被称为指数加权移动平均值,
我们就简称为指数加权平均数。这个参数(β)也是一个需要调整的超参数。
2.4 理解指数加权平均数(Understanding exponentially weighted averages
所以,这是一个加和并平均。有指数和加权,所以叫指数加权平均.
从 0.1 开始,到0.1 × 0.9,到0.1 × (0.9) 2 ,以此类推,所以就有了这个指数衰减函数。
注意:实际上,β=0.9,ε=1-β=0.1,而,大约是 0.34,0.35,换句话说,10天后曲线高度下降到1/3,相当于峰值的1/e.
因此,若是梯度下降算法中,具体做法是先初始化v𝜃 = 0(v相当于要更新的w或b),然后每一天,拿到第t天的数据,把v更新为v:= βv𝜃 + (1 − β)𝜃_t 。
梯度下降时更新w和b使用指数加权平均数的好处:它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了.
2.5 指 数 加 权 平 均 的 偏 差 修 正 ( Bias correction in exponentially weighted averages
计算指数加权平均数,你还需要知道一个专业概念,叫做偏差修正,可以让(梯度的)平均数运算更准确.
在上一个视频中,这个(红色)曲线对应β的值为 0.9,这个(绿色)曲线对应的β=0.98,
如果你执行公式,在β等于 0.98 的时候,得到的并不是绿色曲线,而是紫色曲线,你可以注意到紫色曲线的起点较低,我们来看看怎么处理.
可以看到偏差主要在估测初期,所以计算时不用vt而是用![](https://cdn.nlark.com/yuque/__latex/4b6a8ed497dc203182e0ee293a756eb5.svg#card=math&code=%5Cfrac%7Bv%7Bt%7D%7D%7B1-%5Cbeta%5E%7Bt%7D%7D&height=38&width=50),t就是现在的天数,则能使得估计变得更好\更准确,特别对于估计初期很有效.
2.6 动量梯度下降法(Gradient descent with Momentum
后续所说的这些梯度下降优化算法都用到mini-batch思想和指数加权平均这一概念,而具体的操作细节不同.
在纵轴上,你希望学习慢一点,因为你不想要这些摆动,但是在横轴上,你希望加快学习,你希望快速从左向右移,移向最小值,移向红点。所以就有了动量梯度下降法.它batch 或 mini-batch下降法训练快很多.
公式:
先计算vdW和v_db:![](https://cdn.nlark.com/yuque/__latex/f4962ea9df79321bdc7d7b4d8a3391ea.svg#card=math&code=v%7BdW%7D%3D%5Cbeta%20v%7BdWb%7D%2B%281-%5Cbeta%29%20dW%2C%20v%7Bdb%7D%3D%5Cbeta%20v%7Bdb%7D%2B%281-%5Cbeta%29%20db&height=20&width=363)
然后重新更新权重:![](https://cdn.nlark.com/yuque/__latex/ef0372c7c344bbdd5f6faf35b84892c5.svg#card=math&code=W%3A%3DW-a%20v%7Bd%20W%7D%2C%20b%3A%3Db-a%20v_%7Bd%20b%7D&height=18&width=220),这样就可以减缓梯度下降的幅度。
动量梯度下降法由来:
可以理解为如果你要最小化碗状函数,想象你从山上往下滚的一个球,这些微分项dW和db提供了加速度,Momentum 项相当于速度。而因为β稍小于 1,表现出一些摩擦力,所以球不会无限加速下去,所以不像梯度下降法,每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。
2.7 RMSprop
全称是 root mean square prop 算法,它也可以加速梯度下降.
记得在横轴方向或者在例子中的W方向,我们希望学习速度快,而在垂直方向,也
就是例子中的b方向,我们希望减缓纵轴上的摆动,所以有了S_dW 和S_db ,我们希望S_dW 会相对较小,所以我们要除以一个较小的数,而希望S_db又较大,所以这里我们要除以较大的数字,这样就可以减缓纵轴上的变化。
2.8 Adam 优化算法(Adam optimization algorithm)
Adam 优化算法基本上就是将 Momentum 和 RMSprop 结合在一起.
Adam里面同样使用了偏差修正,为了避免除以很小的数,几乎为零,在分母上加上一项ε=1e10-8.
2.9 学习率 衰减(Learning rate decay)
加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减。
学习率衰减,即慢慢减少α的本质在于,在学习初期,你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些,如绿线部分。
学习率衰减方法/公式:
其中,decay-rate为衰减率;epoch−num为当前epoch数,k为某常熟,t为 mini-batch 的数字.
2.10 局部最优的问题(The problem of local optima)
在深度学习领域,在高维度空间函数中,想要得到局部最优几乎不可能,因为如果你在 2 万维空间中,那么想要得到局部最优,所有的 2 万个方向都需要是这样,但发生的机率也许很小,也许是2^−20000; 事实上,如果你要创建一个神经网络,通常梯度为零的点并不是这个图中的局部最优点,实际上成本函数的零梯度点,通常是鞍点。
如果局部最优不是问题,那么问题是什么?结果是平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于 0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近 0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动,我换个笔墨颜色,大家看得清楚一些,然后你的算法能够走出平稳段(红色笔)。
总结:所以此次视频的要点是,
- 第一点,首先你不太可能困在极差的局部最优中,条件是你在训练较大的神经网络,存在大量参数,并且成本函数J被定义在较高的维度空间。
- 第二点,平稳段是一个问题,这样使得学习十分缓慢,这也是像 Momentum 或是RMSprop,Adam 这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如 Adam 算法,能够加快速度,让你尽早往下走出平稳段。