5. Optimization algorithms

views 437 words

Mini-batch 梯度下降(Mini-batch gradient descent)

学习优化算法, 这能让神经网络运行得更快, 帮助快速训练模型, 找到合适的那一个.

-w584

原先的batch梯度下降法, 同时处理整个训练集, 当数据量大的时候, 处理速度缓慢(即使已经向量化).

所以可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch. $X^{\{t\}},Y^{\{t\}}$表示不同的mini-batch.

其操作如图: -w577

使用batch梯度下降法, 一次遍历训练集只能做一个梯度下降; 使用mini-batch梯度下降法, 一次遍历训练集, 能让你做5000个梯度下降. 当然正常来说, 要多次遍历训练集,还需要设置另一个for循环. 所以可以一直处理遍历训练集, 直到最后能收敛到一个合适的精度.

理解mini-batch梯度下降法(Understanding mini-batch gradient descent)

-w579 使用batch梯度下降法时,每次迭代都需要历遍整个训练集,可以预期每次迭代成本函数J都会下降,如果在某次迭代中增加了,那肯定出了问题,也许学习率太大.

使用mini-batch梯度下降法, 成本函数J在整个过程中并不是每次迭代都是下降的. 特别是在每次迭代中, J只和$X^{\{t\}},Y^{\{t\}}$有关, 也就是每次迭代下都在训练不同的样本集或者说训练不同的mini-batch. 如果作出成本函数的图, 很可能会看到走向朝下, 但有更多的噪声, 没有每次迭代都下降是不要紧的, 但走势应该向下. (噪声产生的原因在于某个batch的$X^{\{t\}},Y^{\{t\}}$比较容易计算, 成本较低, 有的则计算成本高些)

-w573

  • 当mini-batch的大小 = m(训练集的大小) : batch梯度下降法
    • $(X^{\{t\}},Y^{\{t\}}) = (X,Y)$
    • 最小化的成本函数的轮廓如图中的蓝色
  • 当mini-batch的大小 = 1 : (stochastic)随机梯度下降法
    • 每个样本都是独立的mini-batch
    • 最小化的成本函数的轮廓如图中的紫色
    • 每次迭代,只对一个样本进行梯度下降,大部分时候向着全局最小值靠近,有时候会远离最小值,因为那个样本恰好指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值, 随机梯度下降法永远不会收敛,而是会一直在最小值附近波动
    • 可以通过减小学习率,噪声会被改善或有所减小
    • 但是, 失去所有向量化带来的加速, 一次值处理一个样本, 效率低下.
  • mini-batch大小在1和m之间 : mini-batch梯度下降
    • 最快
    • 最小化的成本函数的轮廓如图中的绿色

选择mini-batch的大小:

-w436

  • 小于2000的数据集没必要使用mini-batch梯度下降
  • 一般的mini-batch大小为64到512. (用2的n次幂会运行的快点)
  • 作为一个超参数, 需多次尝试

指数加权平均数(Exponentially weighted averages)

指数加权平均数又称指数加权移动平均值

-w515

计算温度的移动平均值(每日温度的指数加权平均值):

-w262

通用公式:

$V_t = \beta V_{t-1} + (1-\beta)\theta_t$

$V_{t-1}$表示之前的移动平均值,

$\theta_t$表示当前的值,

$\beta$表示加权数

$\frac{1}{1-\beta}$表示天数

例子:

-w495

  • $\beta = 0.98$时, 表示平均值的比重多点, 而当前数值的比重少点(加权平均公式在温度变化时,适应地更缓慢, 会出现一定延迟), 得到绿色曲线.
  • $\beta = 0.5$时, 波动大(更多的噪声), 得到黄色曲线.
  • $\beta$为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度

理解指数加权平均数(Understanding exponentially weighted averages)

-w583

-w608

-w647

所有的这些系数($0.1*(0.1*0.9)*(0.1*0.9^2)*(0.1*0.9^3)...$),相加起来为1或者逼近1,我们称之为偏差修正

-w649

在实际中执行:

-w563

$v_{\theta}=0$, 然后每一天, 拿到第t天的数据, 把v更新为: $v:=\beta v_{\theta} + (1-\beta)\theta_t$

指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字的内存和储存而已,然后把最新数据代入公式,不断覆盖就可以了, 效率极高. 当然它并不是最好的最精准的计算平均数的方法。如果要计算移动窗,直接算出过去10天的总和,过去50天的总和,除以10和50就好,如此往往会得到更好的估测。但缺点是,如果保存所有最近的温度数据,和过去10天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂.

指数加权平均的偏差修正(Bias correction in exponentially weighted averages)

偏差修正,可以让平均数运算更加准确.

-w584

$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(动量梯度下降法),运行速度几乎总是快于标准的梯度下降算法. 基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新权重.

-w565

使用batch或mini-batch下降法, 图上蓝线的上下波动减慢了梯度下降法的速度. 若使用了较大的学习率(图中紫色箭头), 结果可能会偏离函数的范围. 所以在纵轴上, 希望学习慢一点,因为不想要这些摆动; 但是在横轴上,希望加快学习, 快速从左向右移,移向最小值,移向红点.

动量梯度下降法:

在第t次迭代中的过程中,

  1. 计算微分dW,db.
  2. 然后计算$v_{dW} = \beta v_{dW} + (1-\beta)dW$, 也就是计算dW的移动平均数.
  3. 重新赋值权重 $W := W - \alpha v_{dW}$.
  4. db同理, 这样就可以减缓梯度下降的幅度.

例如,从图中会发现纵轴上的摆动平均值接近于零(因为上下摆动,正负数相互抵消). 但在横轴方向,所有的微分都指向横轴方向,因此横轴方向的平均值仍然较大,因此用算法几次迭代后,会发现动量梯度下降法,最终纵轴方向的摆动变小了,横轴方向运动更快,因此算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动.

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

具体算法:

-w494

$\beta$最常用的值是0.9, 相当于平均了前十次迭代的梯度.

-w646

RMSprop

Root mean square propagation算法, 可以加速梯度下降.

RMSprop,全称是均方根,因为将微分进行平方,然后最后使用平方根.

-w564

假设纵轴代表参数b,横轴代表参数W. RMSprop算法可以帮助减缓b方向的学习,即纵轴方向,同时加快.

RMSprop算法:

在第t次迭代中的过程中,

  1. 计算微分dW,db.
  2. 然后计算$S_{dW} = \beta S_{dW} + (1-\beta)dW^2$, 也就是计算微分dW平方的加权平均数.
  3. 重新赋值权重 $W := W - \alpha \frac{dW}{\sqrt{S_{dW}}}$.
  4. 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结合在一起.

-w571

Adam算法:

  1. 初始化$v_{dW}=0,S_{dW}=0,... $
  2. 在第t次迭代中, 计算微分dW,..
  3. 计算Momentum指数加权平均数, $v_{dW}=\beta_1v_{dW}+(1-\beta_1)dW$, …
  4. 接着用RMSprop进行更新, $S_{dW} = \beta_2 S_{dW} + (1-\beta_2)(dW)^2$
  5. 一般使用Adam算法的时候要计算偏差修正, $v^{corrected}_{dW} = \frac{v_{dW}}{1-\beta^t_1}$, S也使用偏差修正, $S^{corrected}_{dW} = \frac{S_{dW}}{1-\beta^t_2}$
  6. 最后更新W, 除以修正后$S_{dW}$的平方根加上$\epsilon$, $W:= W - \alpha \frac{v^{corrected}_{dW}}{S^{corrected}_{dW}+\epsilon}$
  7. 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)

-w505

在学习率固定的情况下, 梯度下降如图中蓝色线, 算法最后在最小值附近摆动, 并不会真正收敛.

但要慢慢减少学习率的话, 开始学习较快, 对着$\alpha$变小/步伐变小, 曲线(绿色线)会在最小值附近的一小块区域里摆动(小幅度摆动).

-w558

训练集拆分成不同的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: -w506

  1. 指数衰减(exponential decay):
    1. $\alpha = 0.95^{epoch-num}\alpha_0$
    2. $\alpha = \frac{k}{\sqrt{epoch-num}}\alpha_0$
    3. $\alpha = \frac{k}{\sqrt{t}}\alpha_0$, (t为mini-batch的数字)
  2. 离散下降(discrete stair cease): 学习率在某段时候减半, 如此反复.
  3. 手动衰减(manual decay)

局部最优的问题(The problem of local optima)

在深度学习研究早期, 人们总是担心优化算法会困在极差的局部最优.

-w586

从上图两个维度的图中, 可以看出有多个不同局部最优. 梯度下降法或者某个算法可能困在一个局部最优中,而不会抵达全局最优.

而这些低维的图曾经影响了我们的理解,但是这些理解并不正确. 事实上, 创建一个神经网络, 通常梯度为零的点并不是这个图中的局部最优点, 实际上成本函数的零梯度点, 通常是鞍点.

一个具有高维度空间的函数,如果梯度为0,那么在每个方向,它可能是凸函数,也可能是凹函数。如果在2万维空间中,那么想要得到局部最优,所有的2万个方向都需要是相同的, 但发生的机率也许很小,也许是$2^{-20000}$, 因此在高维度空间, 更可能碰到鞍点(saddle point, 导数为0).

-w550

但是平稳段(plateaus)是一个问题, 使得学习十分缓慢. 平稳段是一块区域,其中导数长时间接近于0. 因为梯度等于或接近0,曲面很平坦,得花上很长时间慢慢抵达平稳段的出口点, 然后算法才能够走出平稳段.

平稳段是一个问题, 但是Momentum, RMSprop, Adam算法, 能够加快速度, 尽早往下走出平稳段.

conclusion:

  • Unlikely to get stuck in a bad local optima
  • Plateaus can make learning slow