mini-batch GD

在继续课程之前,先确定一下符号:

  • 上角小括号L2W2-梯度下降的优化算法 - 图1#card=math&code=%28i%29&id=yaSre)表示训练集里的值,所以L2W2-梯度下降的优化算法 - 图2%7D#card=math&code=x%5E%7B%28i%29%7D&id=ndXij)是第L2W2-梯度下降的优化算法 - 图3个训练样本。
  • 上角中括号L2W2-梯度下降的优化算法 - 图4来表示神经网络的层数,L2W2-梯度下降的优化算法 - 图5表示神经网络中第L2W2-梯度下降的优化算法 - 图6层的L2W2-梯度下降的优化算法 - 图7值。
  • 大括号L2W2-梯度下降的优化算法 - 图8来代表不同的mini-batchL2W2-梯度下降的优化算法 - 图9L2W2-梯度下降的优化算法 - 图10表示单个mini-batch

假设你的训练样本一共有500万个,每个mini-batch都有1000个样本,那么你有5000个mini-batch。最后得到是L2W2-梯度下降的优化算法 - 图11。对Y也要进行相同处理,你相应地拆分Y的训练集。

  • 把训练集分割成小的子集,每次在一个子集上执行梯度下降法、更新参数,而不是同时处理所有的训练数据。
  • 一个 epoch 代表完整遍历了全部数据集一次。

理解

使用batch梯度下降法,遍历一次训练集只能做一个梯度下降,而使用mini-batch梯度下降法,遍历一次训练集能做5000个梯度下降。

使用batch梯度下降法时,每次迭代你都需要历遍整个训练集,可以预期每次迭代成本都会下降。如果L2W2-梯度下降的优化算法 - 图12在某次迭代中增加了,那肯定出了问题,也许你的学习率太大。

使用mini-batch梯度下降法,如果你作出代价函数在整个过程中的图,会发现并不是每次迭代都是下降的。在每次迭代中,你要处理的是L2W2-梯度下降的优化算法 - 图13L2W2-梯度下降的优化算法 - 图14,也就是每次迭代下你都在训练不同的样本集(mini-batch)。
L2W2-梯度下降的优化算法 - 图15
没有每次迭代都下降是不要紧的,但走势应该向下,噪声产生的原因在于也许L2W2-梯度下降的优化算法 - 图16L2W2-梯度下降的优化算法 - 图17是比较容易计算的mini-batch,因此成本会低一些。不过也许出于偶然,L2W2-梯度下降的优化算法 - 图18L2W2-梯度下降的优化算法 - 图19是比较难运算的mini-batch,或许你有一些残缺的样本,这样一来,成本会更高一些,所以才会出现这些摆动。

mini-batch、BGD 和 SGD

你需要决定的变量之一是mini-batch的大小,L2W2-梯度下降的优化算法 - 图20就是训练集的大小。

  • 极端情况下,如果mini-batch的大小等于L2W2-梯度下降的优化算法 - 图21,其实就是batch梯度下降法
  • 另一个极端情况,假设mini-batch大小为1,称为随机梯度下降法,每个样本都是独立的mini-batch,一次只处理一个样本。

L2W2-梯度下降的优化算法 - 图22

在两种极端下成本函数的优化情况:

  • batch梯度下降法从某处开始,相对噪声低些,幅度也大一些。
  • 随机梯度下降法中,每次迭代只对一个样本进行梯度下降。
    • 大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此SGD是有很多噪声的。
    • 平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。

mini-batch的大小在1和L2W2-梯度下降的优化算法 - 图23之间。

  • 如果训练样本不大,batch梯度下降法可以运行得很好。BGD的主要弊端在于特别是在训练样本数量巨大的时候,单次迭代耗时太长。
  • 如果使用SGD随机梯度下降法,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,你会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下
  • 选择不大不小的mini-batch尺寸,实际上学习率达到最快。你会发现两个好处,一方面,你得到了大量向量化,比如mini-batch大小为1000个样本,你就可以对1000个样本向量化。另一方面,你不需要等待整个训练集被处理完就可以开始进行后续工作。它不会总朝向最小值靠近,但它比随机梯度下降要更持续地靠近最小值的方向。它也不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率。

mini-batch的大小该如何选择呢?

  • 首先,如果训练集较小,直接使用batch梯度下降法,这里的少是说小于2000个样本。
  • 样本数目较大的话,一般的mini-batch大小为64到512。因为电脑内存设置和使用的方式,使mini-batch大小是2的L2W2-梯度下降的优化算法 - 图24次方,代码会运行地快一些。
  • 最后需要注意的是在你的mini-batch中,要确保L2W2-梯度下降的优化算法 - 图25L2W2-梯度下降的优化算法 - 图26要符合CPU/GPU内存,取决于你的应用方向以及训练集的大小。

事实上mini-batch大小是另一个重要的变量,你需要做一个快速尝试,才能找到能够最有效地减少成本函数的那个,我一般会尝试几个不同的值,几个不同的2次方,然后看能否找到一个让梯度下降优化算法最高效的大小。

优化算法

指数加权平均数

(Exponentially weighted averages)

我想向你展示几个优化算法,它们比梯度下降法快,要理解这些算法,你需要用到指数加权平均,在统计中也叫做指数加权移动平均,我们首先讲这个,然后再来讲更复杂的优化算法。

方程:L2W2-梯度下降的优化算法 - 图27%7B%7B%5Ctheta%20%7D%7Bt%7D%7D#card=math&code=%7B%7Bv%7D%7Bt%7D%7D%3D%5Cbeta%20%7B%7Bv%7D%7Bt-1%7D%7D%2B%281-%5Cbeta%20%29%7B%7B%5Ctheta%20%7D%7Bt%7D%7D&id=VWJaX)

以一年的温度数据为例。用数据作图,可以得到
L2W2-梯度下降的优化算法 - 图28
如果要计算趋势,也就是温度的局部平均值(或者说移动平均值),可以用上面那个方程。L2W2-梯度下降的优化算法 - 图29 是第 t 天的温度。

这里我们使用 0.9 为加权数,首先使L2W2-梯度下降的优化算法 - 图30,对每一天,用0.9的加权数乘以之前的数值、加上当日温度的0.1倍,即L2W2-梯度下降的优化算法 - 图31,得到第一天的温度值。第二天,又可以获得一个加权平均数,0.9乘以之前的值加上当日的温度0.1倍,即L2W2-梯度下降的优化算法 - 图32,以此类推,得到结果如图中红线。

L2W2-梯度下降的优化算法 - 图33

在计算时,可视L2W2-梯度下降的优化算法 - 图34大概是L2W2-梯度下降的优化算法 - 图35%7D#card=math&code=%5Cfrac%7B1%7D%7B%281%20-%5Cbeta%29%7D&id=LjBrk)的每日温度,如果L2W2-梯度下降的优化算法 - 图36是0.9,意思这是十天的平均值。将L2W2-梯度下降的优化算法 - 图37设置为接近1的一个值,比如0.98,计算L2W2-梯度下降的优化算法 - 图38%7D%20%3D50#card=math&code=%5Cfrac%7B1%7D%7B%281%20-%200.98%29%7D%20%3D50&id=wLoGk),这就是粗略平均了过去50天的温度,这时作图可以得到绿线。
L2W2-梯度下降的优化算法 - 图39
这个高值L2W2-梯度下降的优化算法 - 图40得到的曲线要平坦一些,原因在于你平均了几十天的温度,所以这个曲线波动更小,更加平坦,缺点是曲线进一步右移,因为当L2W2-梯度下降的优化算法 - 图41,相当于给前一天的值加了太多权重,只有0.02的权重给了当日的值,所以温度变化时,温度上下起伏更缓慢一些。当L2W2-梯度下降的优化算法 - 图42 较大时,指数加权平均值适应地更缓慢一些。

我们可以再换一个值试一试,如果L2W2-梯度下降的优化算法 - 图43是另一个极端值,比如说0.5,根据右边的公式(L2W2-梯度下降的优化算法 - 图44%7D%3D2#card=math&code=%5Cfrac%7B1%7D%7B%281-%5Cbeta%29%7D%3D2&id=br6y5)),这是平均了两天的温度。作图得到黄线。由于仅平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,有可能出现异常值,但是这个曲线能够更快适应温度变化。
L2W2-梯度下降的优化算法 - 图45

理解

我们分析L2W2-梯度下降的优化算法 - 图46的组成,也就是在一年第100天计算的数据,

L2W2-梯度下降的优化算法 - 图47)%20%20%5C%5C%3D%200.1%5Ctheta%7B100%7D%20%2B%200.1%20%5Ctimes%200.9%20%5Ctheta%7B99%7D%20%2B%200.1%20%5Ctimes%20%7B(0.9)%7D%5E%7B2%7D%5Ctheta%7B98%7D%20%2B%200.1%20%5Ctimes%20%7B(0.9)%7D%5E%7B3%7D%5Ctheta%7B97%7D%20%2B%200.1%20%5Ctimes%20%7B(0.9)%7D%5E%7B4%7D%5Ctheta%7B96%7D%20%2B%20%5Cldots%0A#card=math&code=v%7B100%7D%3D%200.1%5Ctheta%7B100%7D%20%2B%200.9v%7B99%7D%3D%200.1%5Ctheta%7B100%7D%20%2B%200.9%280.1%5Ctheta%7B99%7D%20%2B%200.9%280.1%5Ctheta%7B98%7D%20%2B0.9v%7B97%7D%29%29%20%20%5C%5C%3D%200.1%5Ctheta%7B100%7D%20%2B%200.1%20%5Ctimes%200.9%20%5Ctheta%7B99%7D%20%2B%200.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B2%7D%5Ctheta%7B98%7D%20%2B%200.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B3%7D%5Ctheta%7B97%7D%20%2B%200.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B4%7D%5Ctheta_%7B96%7D%20%2B%20%5Cldots%0A&id=N8zsq)

我们构建一个指数衰减函数,从0.1开始,到L2W2-梯度下降的优化算法 - 图48,到L2W2-梯度下降的优化算法 - 图49%7D%5E%7B2%7D#card=math&code=0.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B2%7D&id=OROFa),以此类推,所以就有了这个指数衰减函数。计算L2W2-梯度下降的优化算法 - 图50是通过,把两个函数对应的元素,然后求和。所以选取每日温度,将其与指数衰减函数相乘,然后求和,就得到了L2W2-梯度下降的优化算法 - 图51

稍后我们详细讲解,不过所有的这些系数(L2W2-梯度下降的优化算法 - 图52%7D%5E%7B2%7D0.1%20%5Ctimes%20%7B(0.9)%7D%5E%7B3%7D%5Cldots#card=math&code=0.10.1%20%5Ctimes%200.90.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B2%7D0.1%20%5Ctimes%20%7B%280.9%29%7D%5E%7B3%7D%5Cldots&id=FGF35)),相加起来为1或者逼近1,我们称之为偏差修正,下个视频会涉及。

最后也许你会问,到底需要平均多少天的温度。
实际上L2W2-梯度下降的优化算法 - 图53%7D%5E%7B10%7D#card=math&code=%7B%280.9%29%7D%5E%7B10%7D&id=VzzaS)大约为0.35,这大约是L2W2-梯度下降的优化算法 - 图54,e是自然算法的基础之一。大体上说,如果有L2W2-梯度下降的优化算法 - 图55,在这个例子中,L2W2-梯度下降的优化算法 - 图56,所以L2W2-梯度下降的优化算法 - 图57L2W2-梯度下降的优化算法 - 图58%7D%5E%7B(%5Cfrac%7B1%7D%7B%5Cvarepsilon%7D)%7D#card=math&code=%7B%281-%5Cvarepsilon%29%7D%5E%7B%28%5Cfrac%7B1%7D%7B%5Cvarepsilon%7D%29%7D&id=oD4IJ)约等于L2W2-梯度下降的优化算法 - 图59,大约是0.34,0.35,换句话说,10天后,曲线的高度下降到L2W2-梯度下降的优化算法 - 图60,相当于在峰值的L2W2-梯度下降的优化算法 - 图61
相反,如果,那么0.98需要多少次方才能达到这么小的数值?L2W2-梯度下降的优化算法 - 图62%7D%5E%7B50%7D#card=math&code=%7B%280.98%29%7D%5E%7B50%7D&id=AEnc6)大约等于L2W2-梯度下降的优化算法 - 图63,所以前50天这个数值比L2W2-梯度下降的优化算法 - 图64大,数值会快速衰减,所以本质上这是一个下降幅度很大的函数,你可以看作平均了50天的温度。因为在例子中,要代入等式的左边,L2W2-梯度下降的优化算法 - 图65,所以L2W2-梯度下降的优化算法 - 图66为50,我们由此得到公式,我们平均了大约L2W2-梯度下降的优化算法 - 图67%7D#card=math&code=%5Cfrac%7B1%7D%7B%281-%5Cbeta%29%7D&id=bpJkA)天的温度。
这里L2W2-梯度下降的优化算法 - 图68代替了L2W2-梯度下降的优化算法 - 图69,也就是说根据一些常数,你能大概知道能够平均多少日的温度,不过这只是思考的大致方向,并不是正式的数学证明。

最后讲讲如何在实际中执行。一开始将L2W2-梯度下降的优化算法 - 图70初始化为0,L2W2-梯度下降的优化算法 - 图71,然后每一天,拿到第L2W2-梯度下降的优化算法 - 图72天的数据,把L2W2-梯度下降的优化算法 - 图73更新为L2W2-梯度下降的优化算法 - 图74%5Ctheta%7Bt%7D#card=math&code=v%3A%20%3D%20%5Cbeta%20v%7B%5Ctheta%7D%20%2B%20%281%20-%5Cbeta%29%5Ctheta_%7Bt%7D&id=TUFMN)。

指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已,然后把最新数据代入公式,不断覆盖就可以了,正因为这个原因,其效率,它基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存。当然它并不是最好的,也不是最精准的计算平均数的方法。但从计算和内存效率来说,这是一个有效的方法,所以在机器学习中会经常使用,更不用说只要一行代码,这也是一个优势。

偏差修正

在上一个视频中,这个(红色)曲线对应L2W2-梯度下降的优化算法 - 图75的值为0.9,这个(绿色)曲线对应的L2W2-梯度下降的优化算法 - 图76=0.98,如果你执行写在这里的公式,在L2W2-梯度下降的优化算法 - 图77等于0.98的时候,得到的并不是绿色曲线,而是紫色曲线,你可以注意到紫色曲线的起点较低,我们来看看怎么处理。
L2W2-梯度下降的优化算法 - 图78

计算移动平均数的时候,初始化L2W2-梯度下降的优化算法 - 图79L2W2-梯度下降的优化算法 - 图80,所以如果一天温度是40华氏度,那么L2W2-梯度下降的优化算法 - 图81,得到的值会小很多,所以第一天温度的估测不准。L2W2-梯度下降的优化算法 - 图82,假设L2W2-梯度下降的优化算法 - 图83L2W2-梯度下降的优化算法 - 图84都是正数,计算后L2W2-梯度下降的优化算法 - 图85要远小于L2W2-梯度下降的优化算法 - 图86L2W2-梯度下降的优化算法 - 图87,所以L2W2-梯度下降的优化算法 - 图88也不能很好估测出这一年前两天的温度。

有个办法可以修改这一估测,那就是不用L2W2-梯度下降的优化算法 - 图89,而是用L2W2-梯度下降的优化算法 - 图90,t 就是现在的天数。

举个具体例子,当L2W2-梯度下降的优化算法 - 图91时,L2W2-梯度下降的优化算法 - 图92,因此对第二天温度的估测变成了L2W2-梯度下降的优化算法 - 图93,也就是L2W2-梯度下降的优化算法 - 图94L2W2-梯度下降的优化算法 - 图95的加权平均数,并去除了偏差。你会发现随着L2W2-梯度下降的优化算法 - 图96增加,L2W2-梯度下降的优化算法 - 图97接近于0,所以当L2W2-梯度下降的优化算法 - 图98很大的时候,偏差修正几乎没有作用。因此当L2W2-梯度下降的优化算法 - 图99较大的时候,紫线基本和绿线重合了。不过在开始学习阶段,你才开始预测热身练习,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线。

在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人宁愿熬过初始时期,拿到具有偏差的估测,然后继续计算下去。如果你关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,偏差修正能帮助你在早期获取更好的估测。

1. 动量梯度下降 Momentum

(Gradient descent with Momentum)

还有一种算法叫做Momentum,或者叫做动量梯度下降法,运行速度几乎总是快于标准的梯度下降算法,其基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新你的权重。

因为小批量梯度下降仅在看到示例的子集后才进行参数更新,所以更新的方向具有一定的差异,因此小批量梯度下降所采取的路径将“朝着收敛”振荡。
利用冲量则可以减少这些振荡。冲量将过去的梯度考虑在内,以平滑梯度下降的步骤。它可以应用于批量梯度下降,小批次梯度下降或随机梯度下降。

冲量考虑了过去的梯度以平滑更新。我们将先前梯度的“方向”存储在变量 𝑣 中。这将是先前步骤中梯度的指数加权平均值,你也可以将 𝑣 看作是下坡滚动的球的“速度”,根据山坡的坡度/坡度的方向来提高速度(和冲量)。

image.png
红色箭头显示了带冲量的小批次梯度下降步骤所采取的方向。蓝点表示每一步的梯度方向(相对于当前的小批量)。让梯度影响 𝑣 而不是仅遵循梯度,然后朝 𝑣 的方向迈出一步。

使用动量梯度下降法,你需要做的是,在每次迭代中,假设用现有的 mini-batch 计算L2W2-梯度下降的优化算法 - 图101L2W2-梯度下降的优化算法 - 图102,你要做的是计算
L2W2-梯度下降的优化算法 - 图103dW#card=math&code=v%7B%7BdW%7D%7D%3D%20%5Cbeta%20v%7B%7BdW%7D%7D%20%2B%20%5Cleft%28%201%20-%20%5Cbeta%20%5Cright%29dW&id=VxpMc)
这跟我们之前的计算相似,也就是L2W2-梯度下降的优化算法 - 图104%5Ctheta%7Bt%7D#card=math&code=v%20%3D%20%5Cbeta%20v%20%2B%20%5Cleft%28%201%20-%20%5Cbeta%20%5Cright%29%5Ctheta%7Bt%7D&id=Ud3yJ),L2W2-梯度下降的优化算法 - 图105的移动平均数。接着同样地计算L2W2-梯度下降的优化算法 - 图106
L2W2-梯度下降的优化算法 - 图107%7Bdb%7D#card=math&code=v%7Bdb%7D%20%3D%20%5Cbeta%20v%7B%7Bdb%7D%7D%20%2B%20%28%201%20-%20%5Cbeta%29%7Bdb%7D&id=klRaa)
然后重新赋值权重,
L2W2-梯度下降的优化算法 - 图108
L2W2-梯度下降的优化算法 - 图109
这样就可以减缓梯度下降的幅度。如红色箭头路线:
L2W2-梯度下降的优化算法 - 图110

在上面这几个导数中,你会发现这些纵轴上的摆动平均值接近于零,因为正负数相互抵消。而在横轴方向的平均值仍然较大。因此用算法几次迭代后,动量梯度下降法使得纵轴方向的摆动变小了,横轴方向运动更快,因此你的算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动。

动量梯度下降法的一个本质,就是最小化碗状函数。这些微分项,想象它们为加速度,Momentum项相当于速度。

想象你有一个碗,你拿一个球,微分项给了这个球一个加速度,此时球正向碗底滚,球因为加速度越滚越快,而因为L2W2-梯度下降的优化算法 - 图111 稍小于1,表现出一些摩擦力,所以球不会无限加速下去。它不像梯度下降法每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。
L2W2-梯度下降的优化算法 - 图112

最后我们来看具体如何计算。

现在有两个超参数,学习率L2W2-梯度下降的优化算法 - 图113以及参数L2W2-梯度下降的优化算法 - 图114L2W2-梯度下降的优化算法 - 图115控制着指数加权平均数。L2W2-梯度下降的优化算法 - 图116 最常用的值是 0.9,平均前十次迭代的梯度。可以做一些超参数的研究,不过0.9是很棒的鲁棒数。

  • 速度用零初始化。
  • 如果L2W2-梯度下降的优化算法 - 图117,则它变为没有冲量的标准梯度下降。
  • L2W2-梯度下降的优化算法 - 图118的常用值范围是0.8到0.999。如果你不想调整它,则L2W2-梯度下降的优化算法 - 图119通常是一个合理的默认值。
  • 冲量L2W2-梯度下降的优化算法 - 图120越大,更新越平滑,因为我们对过去的梯度的考虑也更多。但是,如果L2W2-梯度下降的优化算法 - 图121太大,也可能使更新变得过于平滑。
  • 调整模型的最佳L2W2-梯度下降的优化算法 - 图122可能需要尝试几个值,以了解在降低损失函数L2W2-梯度下降的优化算法 - 图123的值方面最有效的方法。

那么关于偏差修正,所以你要拿L2W2-梯度下降的优化算法 - 图124L2W2-梯度下降的优化算法 - 图125除以L2W2-梯度下降的优化算法 - 图126,实际上人们不这么做,因为10次迭代之后,因为你的移动平均已经过了初始阶段,不再是一个具有偏差的预测。当然L2W2-梯度下降的优化算法 - 图127初始值是0,要注意到这是和L2W2-梯度下降的优化算法 - 图128拥有相同维数的零矩阵,也就是跟L2W2-梯度下降的优化算法 - 图129拥有相同的维数;L2W2-梯度下降的优化算法 - 图130的初始值也是向量零,和L2W2-梯度下降的优化算法 - 图131拥有相同的维数,也就是和L2W2-梯度下降的优化算法 - 图132是同一维数。
L2W2-梯度下降的优化算法 - 图133

最后要说一点,如果你查阅了动量梯度下降法相关资料,你经常会看到公式中L2W2-梯度下降的优化算法 - 图134被删除了,用的是
L2W2-梯度下降的优化算法 - 图135
所以L2W2-梯度下降的优化算法 - 图136缩小了L2W2-梯度下降的优化算法 - 图137倍,相当于乘以L2W2-梯度下降的优化算法 - 图138,用梯度下降最新值的时候,L2W2-梯度下降的优化算法 - 图139也会根据L2W2-梯度下降的优化算法 - 图140相应变化。实际上,二者效果都不错,只会影响到学习率L2W2-梯度下降的优化算法 - 图141的最佳值。
我觉得这个公式用起来没有那么自然,因为如果最后要调整超参数L2W2-梯度下降的优化算法 - 图142,就会影响到L2W2-梯度下降的优化算法 - 图143L2W2-梯度下降的优化算法 - 图144,你也许还要修改学习率L2W2-梯度下降的优化算法 - 图145,所以我更喜欢左边的公式,而不是删去了L2W2-梯度下降的优化算法 - 图146的这个公式。但是两个公式都将L2W2-梯度下降的优化算法 - 图147设置为0.9,是超参数的常见选择,只是在这两个公式中,学习率L2W2-梯度下降的优化算法 - 图148的调整会有所不同。

2. RMSprop 均方根

全称是root mean square prop算法,它和Momentum算法一样,也可以加速梯度下降。

L2W2-梯度下降的优化算法 - 图149

回忆一下执行梯度下降时(蓝箭头),虽然横轴方向正在推进,但纵轴方向会有大幅度摆动。假设纵轴代表参数L2W2-梯度下降的优化算法 - 图150,横轴代表参数L2W2-梯度下降的优化算法 - 图151,可能有L2W2-梯度下降的优化算法 - 图152L2W2-梯度下降的优化算法 - 图153或者其它重要的参数,为了便于理解,称之为L2W2-梯度下降的优化算法 - 图154L2W2-梯度下降的优化算法 - 图155
所以,你想减缓L2W2-梯度下降的优化算法 - 图156方向的学习,即纵轴方向,同时加快(至少不是减缓)横轴方向的学习,RMSprop算法可以实现这一点。

在第L2W2-梯度下降的优化算法 - 图157次迭代中,本算法会照常计算当下 mini-batch 的微分L2W2-梯度下降的优化算法 - 图158L2W2-梯度下降的优化算法 - 图159,所以我会保留这个指数加权平均数。我们用到新符号L2W2-梯度下降的优化算法 - 图160L2W2-梯度下降的优化算法 - 图161%20%7BdW%7D%5E%7B2%7D#card=math&code=S%7BdW%7D%3D%20%5Cbeta%20S%7BdW%7D%20%2B%20%281%20-%5Cbeta%29%20%7BdW%7D%5E%7B2%7D&id=phu5y),澄清一下,这个平方的操作是针对L2W2-梯度下降的优化算法 - 图162这一整个符号的。这样做能够保留微分平方的加权平均数,同样L2W2-梯度下降的优化算法 - 图163%7Bdb%7D%5E%7B2%7D#card=math&code=S%7Bdb%7D%3D%20%5Cbeta%20S%7Bdb%7D%20%2B%20%281%20-%20%5Cbeta%29%7Bdb%7D%5E%7B2%7D&id=qdGVA)。

接着更新参数值,L2W2-梯度下降的优化算法 - 图164L2W2-梯度下降的优化算法 - 图165

所以这就是RMSprop,全称是均方根,因为你将微分进行平方,然后最后使用了平方根。

理解原理

我们希望在横轴方向的学习速度快,而减缓纵轴方向上的摆动,所以有了L2W2-梯度下降的优化算法 - 图166L2W2-梯度下降的优化算法 - 图167,我们希望L2W2-梯度下降的优化算法 - 图168会相对较小,所以要除以一个较小的数,而希望L2W2-梯度下降的优化算法 - 图169较大,所以它要除以较大的数字,这样就可以减缓纵轴上的变化。

L2W2-梯度下降的优化算法 - 图170

你看这些微分,垂直方向的要比水平方向的大得多,所以斜率在L2W2-梯度下降的优化算法 - 图171方向特别大,也就是L2W2-梯度下降的优化算法 - 图172较大,L2W2-梯度下降的优化算法 - 图173较小。L2W2-梯度下降的优化算法 - 图174的平方较大,所以L2W2-梯度下降的优化算法 - 图175也会较大,而相比之下,L2W2-梯度下降的优化算法 - 图176会小一些,所以结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。
L2W2-梯度下降的优化算法 - 图177

RMSprop的影响就是你的更新最后会变成这样(绿色线),纵轴方向上摆动较小,而横轴方向继续推进。还有个影响就是,你可以用一个更大学习率L2W2-梯度下降的优化算法 - 图178,然后加快学习,而无须在纵轴上垂直方向偏离。
L2W2-梯度下降的优化算法 - 图179

要说明一点,这里把纵轴和横轴方向分别称为L2W2-梯度下降的优化算法 - 图180L2W2-梯度下降的优化算法 - 图181,只是为了方便展示而已。实际中,你会处于参数的高维度空间,所以需要消除摆动的垂直维度,你需要消除摆动,实际上是参数L2W2-梯度下降的优化算法 - 图182L2W2-梯度下降的优化算法 - 图183等的合集,水平维度可能L2W2-梯度下降的优化算法 - 图184L2W2-梯度下降的优化算法 - 图185等等,因此把L2W2-梯度下降的优化算法 - 图186L2W2-梯度下降的优化算法 - 图187分开只是方便说明。实际中L2W2-梯度下降的优化算法 - 图188是一个高维度的参数向量,L2W2-梯度下降的优化算法 - 图189也是一个高维度参数向量,但是你的直觉是,在你要消除摆动的维度中,最终你要计算一个更大的和值,这个平方和微分的加权平均值,所以你最后去掉了那些有摆动的方向。

最后再说一个这个算法的细节:要确保你的算法不会除以0。如果L2W2-梯度下降的优化算法 - 图190的平方根趋近于0怎么办?解决方法是在分母上加上一个很小很小的L2W2-梯度下降的优化算法 - 图191L2W2-梯度下降的优化算法 - 图192是多少没关系,L2W2-梯度下降的优化算法 - 图193是个不错的选择,这只是保证数值能稳定一些。

所以RMSpropMomentum有很相似的一点,可以消除梯度下降中的摆动,包括mini-batch梯度下降,并允许你使用一个更大的学习率L2W2-梯度下降的优化算法 - 图194,从而加快你的算法学习速度。

3. Adam 前两者的结合

Adam优化算法基本上就是将MomentumRMSprop结合在一起,得到的一个更好的优化算法。

原理

  1. 计算过去梯度的指数加权平均值,并将其存储在变量 𝑣(使用偏差校正之前)和 𝑣𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑒𝑑(使用偏差校正)中。
  2. 计算过去梯度的平方的指数加权平均值,并将其存储在变量 𝑠(偏差校正之前)和 𝑠𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑒𝑑(偏差校正中)中。
  3. 组合“1”和“2”的信息,在一个方向上更新参数。


L2W2-梯度下降的优化算法 - 图195
计算规则

在第L2W2-梯度下降的优化算法 - 图196次迭代中,你要计算微分,一般用mini-batch梯度下降法计算L2W2-梯度下降的优化算法 - 图197L2W2-梯度下降的优化算法 - 图198

接下来计算Momentum指数加权平均数,
L2W2-梯度下降的优化算法 - 图199dW#card=math&code=v%7BdW%7D%3D%20%5Cbeta%7B1%7Dv%7BdW%7D%20%2B%20%28%201%20-%20%5Cbeta%7B1%7D%29dW&id=KAsh2)
L2W2-梯度下降的优化算法 - 图200%7Bdb%7D#card=math&code=v%7Bdb%7D%3D%20%5Cbeta%7B1%7Dv%7Bdb%7D%20%2B%20%28%201%20-%5Cbeta%7B1%7D%20%29%7Bdb%7D&id=sqCpi)。

接着你用RMSprop进行更新,
L2W2-梯度下降的优化算法 - 图201%7B(dW)%7D%5E%7B2%7D#card=math&code=S%7BdW%7D%3D%5Cbeta%7B2%7DS%7BdW%7D%20%2B%20%28%201%20-%20%5Cbeta%7B2%7D%29%7B%28dW%29%7D%5E%7B2%7D&id=G6zdb)
L2W2-梯度下降的优化算法 - 图202%7B(db)%7D%5E%7B2%7D#card=math&code=S%7Bdb%7D%20%3D%5Cbeta%7B2%7DS%7Bdb%7D%20%2B%20%5Cleft%28%201%20-%20%5Cbeta%7B2%7D%20%5Cright%29%7B%28db%29%7D%5E%7B2%7D&id=DWz5J)。

相当于Momentum更新了超参数L2W2-梯度下降的优化算法 - 图203RMSprop更新了超参数L2W2-梯度下降的优化算法 - 图204

一般使用Adam算法的时候,要计算偏差修正L2W2-梯度下降的优化算法 - 图205L2W2-梯度下降的优化算法 - 图206也使用偏差修正,
L2W2-梯度下降的优化算法 - 图207
L2W2-梯度下降的优化算法 - 图208
L2W2-梯度下降的优化算法 - 图209
L2W2-梯度下降的优化算法 - 图210
t 是 Adam 采取的步骤数,表示第 t 次迭代。

最后更新权重,所以更新后是
L2W2-梯度下降的优化算法 - 图211
L2W2-梯度下降的优化算法 - 图212
如果你只是用Momentum,使用L2W2-梯度下降的优化算法 - 图213或者修正后的L2W2-梯度下降的优化算法 - 图214,但现在我们加入了RMSprop的部分,所以我们要除以修正后L2W2-梯度下降的优化算法 - 图215的平方根加上L2W2-梯度下降的优化算法 - 图216。𝜀 是一个很小的数字,以避免被零除。

本算法中有很多超参数,

  • 超参数学习率L2W2-梯度下降的优化算法 - 图217很重要,也经常需要调试,你可以尝试一系列值,然后看哪个有效。
  • L2W2-梯度下降的优化算法 - 图218常用的缺省值为0.9,这是dW的移动平均数,也就是L2W2-梯度下降的优化算法 - 图219的加权平均数,这是Momentum涉及的项。
  • 至于超参数L2W2-梯度下降的优化算法 - 图220Adam论文作者推荐使用0.999,这是在计算L2W2-梯度下降的优化算法 - 图221%7D%5E%7B2%7D#card=math&code=%7B%28dW%29%7D%5E%7B2%7D&id=rS65K)以及L2W2-梯度下降的优化算法 - 图222%7D%5E%7B2%7D#card=math&code=%7B%28db%29%7D%5E%7B2%7D&id=o6Zwp)的移动加权平均值,关于L2W2-梯度下降的优化算法 - 图223的选择其实没那么重要,Adam论文的作者建议L2W2-梯度下降的优化算法 - 图224L2W2-梯度下降的优化算法 - 图225,但你并不需要设置它,因为它并不会影响算法表现。

但是在使用Adam的时候,人们往往使用缺省值即可,L2W2-梯度下降的优化算法 - 图226L2W2-梯度下降的优化算法 - 图227L2W2-梯度下降的优化算法 - 图228都是如此,我觉得没人会去调整L2W2-梯度下降的优化算法 - 图229,然后尝试不同的L2W2-梯度下降的优化算法 - 图230值,看看哪个效果最好。你也可以调整L2W2-梯度下降的优化算法 - 图231L2W2-梯度下降的优化算法 - 图232,但我认识的业内人士很少这么干。

为什么这个算法叫做AdamAdam代表的是Adaptive Moment EstimationL2W2-梯度下降的优化算法 - 图233用于计算这个微分(L2W2-梯度下降的优化算法 - 图234),叫做第一Moment,L2W2-梯度下降的优化算法 - 图235用来计算平方数的指数加权平均数(L2W2-梯度下降的优化算法 - 图236%7D%5E%7B2%7D#card=math&code=%7B%28dW%29%7D%5E%7B2%7D&id=ci3ei)),叫做第二Moment,所以Adam的名字由此而来。

4. 学习率衰减

Learning rate decay

加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减。

对于固定值L2W2-梯度下降的优化算法 - 图237,不同的mini-batch在迭代过程中有噪音(蓝线),它下降朝向最小值,但是不会精确地收敛,所以你的算法最后在最小值附近以较大的幅度摆动。
L2W2-梯度下降的优化算法 - 图238

如果慢慢减小学习率L2W2-梯度下降的优化算法 - 图239的话,在初期的时候,L2W2-梯度下降的优化算法 - 图240学习率较大,学习相对较快,但随着L2W2-梯度下降的优化算法 - 图241变小,你的步伐也会变慢变小,所以最后你的曲线(绿色线)会在最小值附近的一小块区域里摆动。

所以慢慢减少L2W2-梯度下降的优化算法 - 图242的本质在于,在学习初期,你能有较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些。

你可以将L2W2-梯度下降的优化算法 - 图243学习率设为L2W2-梯度下降的优化算法 - 图244decay-rate称为衰减率,epoch-num为代数,L2W2-梯度下降的优化算法 - 图245为初始学习率),注意这个衰减率是另一个你需要调整的超参数。

还有一种衰减方法是指数衰减,其中L2W2-梯度下降的优化算法 - 图246相当于一个小于1的值,如L2W2-梯度下降的优化算法 - 图247,所以你的学习率呈指数下降。

人们用到的其它公式有L2W2-梯度下降的优化算法 - 图248或者L2W2-梯度下降的优化算法 - 图249L2W2-梯度下降的优化算法 - 图250mini-batch的数字,k是常数(也是一个超参数)。

有时人们也会用一个离散下降的学习率,也就是某个步骤有某个学习率,一会之后,学习率减少了一半,一会儿减少一半,一会儿又一半,这就是离散下降(discrete stair cease)的意思。
L2W2-梯度下降的优化算法 - 图251

手动衰减,只有模型数量小的时候有用,但有时候人们也会这么做。

对我而言,学习率衰减并不是我尝试的要点,设定一个固定的L2W2-梯度下降的优化算法 - 图252,然后好好调整,会有很大的影响,学习率衰减的确大有裨益,有时候可以加快训练,但它并不是我会率先尝试的内容。

关于局部最优

L2W2-梯度下降的优化算法 - 图253

曾经人们在提到局部最优时脑海里出现的图是左图这样的,但是这些理解并不正确。对于凸函数或凹函数,每个方向都是相同的(都在上升或都是下降)。但是一个具有高维度空间的函数,如果梯度为0,那么在每个方向,它可能是凸函数,也可能是凹函数。如果你在2万维空间中,想要得到局部最优,需要所有的2万个方向都一样,这发生的机率也许很小,也许是L2W2-梯度下降的优化算法 - 图254,你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点,如右图所示。

所以我们从深度学习历史中学到的一课就是,我们对低维度空间的大部分直觉,比如你可以画出上面的图,并不能应用到高维度空间中。

局部最优不是问题了,但问题在于导数长时间趋近于0的平缓段会减缓学习。我们会沿着这段长坡走,直到这里,然后走出平稳段。
L2W2-梯度下降的优化算法 - 图255

所以此次视频的要点是,
首先,你不太可能困在极差的局部最优中,条件是你在训练较大的神经网络,存在大量参数,并且成本函数L2W2-梯度下降的优化算法 - 图256被定义在较高的维度空间。
第二点,平稳段是一个问题,这样使得学习十分缓慢,这也是像Momentum或是RMSpropAdam这样的算法,能够加速学习算法的地方,能让你尽早往下走出平稳段。