5. Optimization algorithms
Mini-batch 梯度下降(Mini-batch gradient descent)
学习优化算法, 这能让神经网络运行得更快, 帮助快速训练模型, 找到合适的那一个.
原先的batch梯度下降法, 同时处理整个训练集, 当数据量大的时候, 处理速度缓慢(即使已经向量化).
所以可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch. $X^{\{t\}},Y^{\{t\}}$
表示不同的mini-batch.
其操作如图:
使用batch梯度下降法, 一次遍历训练集只能做一个梯度下降; 使用mini-batch梯度下降法, 一次遍历训练集, 能让你做5000个梯度下降. 当然正常来说, 要多次遍历训练集,还需要设置另一个for循环. 所以可以一直处理遍历训练集, 直到最后能收敛到一个合适的精度.
理解mini-batch梯度下降法(Understanding mini-batch gradient descent)
使用batch梯度下降法时,每次迭代都需要历遍整个训练集,可以预期每次迭代成本函数J都会下降,如果在某次迭代中增加了,那肯定出了问题,也许学习率太大.
使用mini-batch梯度下降法, 成本函数J在整个过程中并不是每次迭代都是下降的. 特别是在每次迭代中, J只和$X^{\{t\}},Y^{\{t\}}$
有关, 也就是每次迭代下都在训练不同的样本集或者说训练不同的mini-batch. 如果作出成本函数的图, 很可能会看到走向朝下, 但有更多的噪声, 没有每次迭代都下降是不要紧的, 但走势应该向下. (噪声产生的原因在于某个batch的$X^{\{t\}},Y^{\{t\}}$
比较容易计算, 成本较低, 有的则计算成本高些)
- 当mini-batch的大小 = m(训练集的大小) : batch梯度下降法
$(X^{\{t\}},Y^{\{t\}}) = (X,Y)$
- 最小化的成本函数的轮廓如图中的蓝色
- 当mini-batch的大小 = 1 : (stochastic)随机梯度下降法
- 每个样本都是独立的mini-batch
- 最小化的成本函数的轮廓如图中的紫色
- 每次迭代,只对一个样本进行梯度下降,大部分时候向着全局最小值靠近,有时候会远离最小值,因为那个样本恰好指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值, 随机梯度下降法永远不会收敛,而是会一直在最小值附近波动
- 可以通过减小学习率,噪声会被改善或有所减小
- 但是, 失去所有向量化带来的加速, 一次值处理一个样本, 效率低下.
- mini-batch大小在1和m之间 : mini-batch梯度下降
- 最快
- 最小化的成本函数的轮廓如图中的绿色
选择mini-batch的大小:
- 小于2000的数据集没必要使用mini-batch梯度下降
- 一般的mini-batch大小为64到512. (用2的n次幂会运行的快点)
- 作为一个超参数, 需多次尝试
指数加权平均数(Exponentially weighted averages)
指数加权平均数又称指数加权移动平均值
计算温度的移动平均值(每日温度的指数加权平均值):
通用公式:
$V_t = \beta V_{t-1} + (1-\beta)\theta_t$
$V_{t-1}$
表示之前的移动平均值,
$\theta_t$
表示当前的值,
$\beta$
表示加权数
$\frac{1}{1-\beta}$
表示天数
例子:
- 当
$\beta = 0.98$
时, 表示平均值的比重多点, 而当前数值的比重少点(加权平均公式在温度变化时,适应地更缓慢, 会出现一定延迟), 得到绿色曲线. - 当
$\beta = 0.5$
时, 波动大(更多的噪声), 得到黄色曲线. $\beta$
为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度
理解指数加权平均数(Understanding exponentially weighted averages)
所有的这些系数($0.1*(0.1*0.9)*(0.1*0.9^2)*(0.1*0.9^3)...$
),相加起来为1或者逼近1,我们称之为偏差修正
在实际中执行:
$v_{\theta}=0$
, 然后每一天, 拿到第t天的数据, 把v更新为: $v:=\beta v_{\theta} + (1-\beta)\theta_t$
指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字的内存和储存而已,然后把最新数据代入公式,不断覆盖就可以了, 效率极高. 当然它并不是最好的最精准的计算平均数的方法。如果要计算移动窗,直接算出过去10天的总和,过去50天的总和,除以10和50就好,如此往往会得到更好的估测。但缺点是,如果保存所有最近的温度数据,和过去10天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂.
指数加权平均的偏差修正(Bias correction in exponentially weighted averages)
偏差修正,可以让平均数运算更加准确.
$V_t = \beta V_{t-1} + (1-\beta)\theta_t$
当$\beta = 0.98$
时, 得到的并不是绿色曲线, 而是紫色曲线(起点较低)
计算移动平均数的时候,初始化$v_0=0$
,$v_1 = 0.98v_0+0.02\theta_1$
,但是$v_0=0$
,所以这部分没有了, 变成$v_1 = 0.02\theta_1$
, 得到的值会小很多,所以第一天温度的估测不准, 其结果也会影响$v_2$
. $v_2 = 0.98v_1+0.02\theta_2 = 0.98*0.02\theta_1+0.02\theta_2 = 0.0196\theta_1+0.02\theta_2$
解决方法: 不用$v_t$
,而是用$\frac{v_t}{1-\beta^t}$
, t就是现在的天数.
例子:
当t=2时,$1-\beta^t = 1 - 0.98^2 = 0.0396$
,因此对第二天温度的估测变成了$\frac{v_2}{0.0396} = \frac{0.0196\theta_1+0.02\theta_2}{0.0396}$
,也就是$\theta_1,\theta_2$
的加权平均数,并去除了偏差。你会发现随着t增加,$\beta^t$
接近于0,所以当t很大的时候,偏差修正几乎没有作用,紫线基本和绿线重合了. 在开始学习阶段,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你使结果从紫线变成绿线.
动量梯度下降法(Gradient descent with Momentum)
Momentum(动量梯度下降法),运行速度几乎总是快于标准的梯度下降算法. 基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新权重.
使用batch或mini-batch下降法, 图上蓝线的上下波动减慢了梯度下降法的速度. 若使用了较大的学习率(图中紫色箭头), 结果可能会偏离函数的范围. 所以在纵轴上, 希望学习慢一点,因为不想要这些摆动; 但是在横轴上,希望加快学习, 快速从左向右移,移向最小值,移向红点.
动量梯度下降法:
在第t次迭代中的过程中,
- 计算微分dW,db.
- 然后计算
$v_{dW} = \beta v_{dW} + (1-\beta)dW$
, 也就是计算dW的移动平均数. - 重新赋值权重
$W := W - \alpha v_{dW}$
. - db同理, 这样就可以减缓梯度下降的幅度.
例如,从图中会发现纵轴上的摆动平均值接近于零(因为上下摆动,正负数相互抵消). 但在横轴方向,所有的微分都指向横轴方向,因此横轴方向的平均值仍然较大,因此用算法几次迭代后,会发现动量梯度下降法,最终纵轴方向的摆动变小了,横轴方向运动更快,因此算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动.
想象你有一个碗,你拿一个球,微分项给了这个球一个加速度,此时球正向山下滚,球因为加速度越滚越快,而因为$\beta$
稍小于1,表现出一些摩擦力,所以球不会无限加速下去,所以不像梯度下降法,每一步都独立于之前的步骤,你的球可以向下滚,获得动量,可以从碗向下加速获得动量。
具体算法:
$\beta$
最常用的值是0.9, 相当于平均了前十次迭代的梯度.
RMSprop
Root mean square propagation算法, 可以加速梯度下降.
RMSprop,全称是均方根,因为将微分进行平方,然后最后使用平方根.
假设纵轴代表参数b,横轴代表参数W. RMSprop算法可以帮助减缓b方向的学习,即纵轴方向,同时加快.
RMSprop算法:
在第t次迭代中的过程中,
- 计算微分dW,db.
- 然后计算
$S_{dW} = \beta S_{dW} + (1-\beta)dW^2$
, 也就是计算微分dW平方的加权平均数. - 重新赋值权重
$W := W - \alpha \frac{dW}{\sqrt{S_{dW}}}$
. - db同理, 这样就可以减缓梯度下降的幅度.
原理:
我们希望参数W学习速度快(在横轴方向, W的方向), 而在垂直方向(b的方向), 我们希望减缓纵轴上的摆动,所以有了$S_{dW}和S_{db}$
.
我们希望$S_{dW}$
会相对较小,所以要除以一个较小的数;而希望$S_{db}$
又较大,所以要除以较大的数字, 这样就可以减缓纵轴上的变化.
观察微分,垂直方向(斜率在b的方向)的要比水平方向(W的方向)的大得多, 所以, $db > dW \Rightarrow (db)^2 > (dW)^2 \Rightarrow S_{db} > S_{dW} \Rightarrow \sqrt{S_{db}} > \sqrt{S_{dW}}$
. 这就相当于纵轴上的更新(b)要被一个较大的数($\sqrt{S_{db}}$
)相除,就能消除摆动,而水平方向的更新(W)则被较小的数相除($\sqrt{S_{dW}}$
).
图中绿色线就是用RMSprop更新后的影响, 纵轴方向上摆动较小, 而横轴方向继续推进.
还有个影响就是, 可以用一个更大学习率$\alpha$
, 然后加快学习, 而无须在纵轴上垂直方向偏离.
注意:
要确保算法不会除以0($S_{dW}$
的平方更可能无线趋近于0), 为了确保数值稳定, 在分母上加上一个很小的$\epsilon, \epsilon$
的值可以是$10^{-8}$
Adam 优化算法(Adam optimization algorithm)
Adam优化算法(Adaptive moment estimation)基本上就是将Momentum和RMSprop结合在一起.
Adam算法:
- 初始化
$v_{dW}=0,S_{dW}=0,... $
- 在第t次迭代中, 计算微分dW,..
- 计算Momentum指数加权平均数,
$v_{dW}=\beta_1v_{dW}+(1-\beta_1)dW$
, … - 接着用RMSprop进行更新,
$S_{dW} = \beta_2 S_{dW} + (1-\beta_2)(dW)^2$
- 一般使用Adam算法的时候要计算偏差修正,
$v^{corrected}_{dW} = \frac{v_{dW}}{1-\beta^t_1}$
, S也使用偏差修正,$S^{corrected}_{dW} = \frac{S_{dW}}{1-\beta^t_2}$
- 最后更新W, 除以修正后
$S_{dW}$
的平方根加上$\epsilon$
,$W:= W - \alpha \frac{v^{corrected}_{dW}}{S^{corrected}_{dW}+\epsilon}$
- db同理. Adam被证明能有效适用于不同神经网络,适用于广泛的结构, 是一种极其常用的学习算法.
Hyperparameters choice:
- $\alpha$
: need to be tuned
- $\beta_1$
: 0.9 ==> dW的加权平均数
- $\beta_2$
: 0.999 ==> (dW)^2 的加权平均数
- $\epsilon: 10^{-8}$
学习率衰减(Learning rate decay)
加快学习算法的一个办法就是随时间慢慢减少学习率, 称为学习率衰减(learning rate decay)
在学习率固定的情况下, 梯度下降如图中蓝色线, 算法最后在最小值附近摆动, 并不会真正收敛.
但要慢慢减少学习率的话, 开始学习较快, 对着$\alpha$
变小/步伐变小, 曲线(绿色线)会在最小值附近的一小块区域里摆动(小幅度摆动).
训练集拆分成不同的mini-batch. 第一次遍历训练集叫做epoch1, 第二次遍历训练集叫做epoch2.
学习率可以设为$\alpha = \frac{1}{1+decay\;rate * epoch-num} \alpha_0$
decay-rate称为衰减率
epoch-num为迭代数
$\alpha_0$
为初始学习率(超参数))
例子看图中表格
Other learning rate decay methods:
- 指数衰减(exponential decay):
$\alpha = 0.95^{epoch-num}\alpha_0$
$\alpha = \frac{k}{\sqrt{epoch-num}}\alpha_0$
$\alpha = \frac{k}{\sqrt{t}}\alpha_0$
, (t为mini-batch的数字)
- 离散下降(discrete stair cease): 学习率在某段时候减半, 如此反复.
- 手动衰减(manual decay)
局部最优的问题(The problem of local optima)
在深度学习研究早期, 人们总是担心优化算法会困在极差的局部最优.
从上图两个维度的图中, 可以看出有多个不同局部最优. 梯度下降法或者某个算法可能困在一个局部最优中,而不会抵达全局最优.
而这些低维的图曾经影响了我们的理解,但是这些理解并不正确. 事实上, 创建一个神经网络, 通常梯度为零的点并不是这个图中的局部最优点, 实际上成本函数的零梯度点, 通常是鞍点.
一个具有高维度空间的函数,如果梯度为0,那么在每个方向,它可能是凸函数,也可能是凹函数。如果在2万维空间中,那么想要得到局部最优,所有的2万个方向都需要是相同的, 但发生的机率也许很小,也许是$2^{-20000}$
, 因此在高维度空间, 更可能碰到鞍点(saddle point, 导数为0).
但是平稳段(plateaus)是一个问题, 使得学习十分缓慢. 平稳段是一块区域,其中导数长时间接近于0. 因为梯度等于或接近0,曲面很平坦,得花上很长时间慢慢抵达平稳段的出口点, 然后算法才能够走出平稳段.
平稳段是一个问题, 但是Momentum, RMSprop, Adam算法, 能够加快速度, 尽早往下走出平稳段.
conclusion:
- Unlikely to get stuck in a bad local optima
- Plateaus can make learning slow