【深度学习】2.2优化算法

Mini-batch梯度下降法

向量化可以有效快速地对m个样本进行计算,无需某个明确的公式就可以处理整个训练集。所以我们要把训练样本放到巨大的矩阵X当中去,X = [x(1) x(2) x(3) … x(m)];Y也是如此,Y = [y(1) y(2) y(3) … y(m)]。所以X的维数是(nx, m),Y的维数是(1, m)。但若样本数量m过大时,计算速度仍会过慢,因为在对整个训练集执行梯度下降法时,必须先处理所有样本,才能进行一步梯度下降法,然后再重新处理样本,才能进行下一步梯度下降法。
将训练集分割为小一点的子训练集,这些子集叫做mini-batches。那么把第一个子训练集的样本都取出来(它们统称为X{1}),再取出接下来的样本(X{2}),以此类推去处理。对Y也进行相同的处理,去拆分Y的训练集。
这样mini-batch的数量t组成了X{t}和Y{t}
使用上角小括号(i)表示训练集里的值,x(i)表示第i个训练样本;
使用上角中括号[l]表示神经网络的层数,z[l]表示神经网络中第l层的z值;
使用上角大括号{t}来表示不同的mini-batches,有X{t}、Y{t}的表示

X的维数是(nx, m),所以如果X{1}是一个有1000个样本的训练集,那么X{1}的维数是(nx, 1000),X{2}的维数也是(nx, 1000),所有的子集维数都是(nx, 1000);而Y的维数是(1, m),所以Y的所有的自己维数都是(1, 1000)。

batch梯度下降法指的就是梯度下降法算法,就是同时处理整个的X和Y的训练集,我们可以同时看到整个batch训练集的样本被处理。
mini-batch梯度下降法指的是同时处理单个的mini-batchX{t}和Y{t}的算法。

在训练集上运行mini-batch梯度下降法的原理:
首先对输入X{t}执行前向传播,然后计算Z[1] = W[1]X{t} + b[1], A[1] = g[1](Z[1]), … , A[L] = g[L](Z[L])。然后计算损失函数J{t},因为子集的样本规模是1000,所以J的值为从i=1到l的y hat(i)和y(i)损失的总和再除以1000,其中使用的是来自mini-batchX{t}和Y{t}中的样本;如果使用了正则化,还需要添加正则化的术语,这是一个mini-batch的损失。
接下来,执行反向传播来计算J{t}的梯度。只使用X{t}和Y{t},然后更新加权值W[l] = W[l] - αdW[l],b[l] = b[l] - αdb[l]。这就是使用mini-batch梯度下降法训练样本的一步,它只遍历了一次训练集。
使用batch梯度下降法,一次遍历训练集只能做一个梯度下降;而使用mini-batch梯度下降法,一次遍历训练集可以做5000个梯度下降(有5000个样本)。

理解mini-batch梯度下降法

使用batch梯度下降法时,每次迭代都需要遍历整个训练集,可以预期每次迭代的成本都会下降,所以如果成本函数J是迭代次数的一个函数,它应该随着每次迭代而减少;如果J在某次迭代中增加了,那肯定出现了某些问题。
使用mini-batch梯度下降法,成本函数J在整个过程中并不是每次迭代都是下降的。成本函数J{t}只和X{t}和Y{t}有关,也就是说每次迭代都在训练不同的样本集。所以J{t}的变化应该是走向减小,但有很多的噪声。噪声产生的原因是因为X{1}和Y{1}可能方便计算一点,所以成本小一些,而X{2}和Y{2}有可能是比较难运算的,所以成本会更高一些,所以就会出现这些摆动。

所要决定的变量之一是mini-batch的大小,m是训练集的大小。
极端情况下,让mini-batch的大小=m,那么这就是batch梯度下降法,当训练样本数量巨大的时候耗时很长;
另一种极端情况下,让mini-batch的大小=1,这就是随机梯度下降法,每个样本都是独立的mini-batch,随机梯度下降法永远都不会收敛,而是会一直在最小值附近波动,此方法会失去向量化带来的加速,效率过低;
当选择mini-batch的大小在1和m之间时,在实践中效果是最好的,学习率会达到最快。一方面,得到了大量向量化;另一方面,不需要等所有样本处理完,就可以开始进行后续的工作。

mini-batch的大小选择:
如果训练集较小(小于2000个样本),直接使用batch梯度下降法;
样本数量较大时,mini-batch的大小为64-512(一般选择2的次方运行更快,64、128、256、512,1024用的相对较少了)。
不管什么情况,在mini-batch中,所有的X{t}和Y{t}都要符合CPU/GPU内存。

指数加权平均

指数加权平均也叫指数加权移动平均值。

某天的V等于前一天V值的0.9加上当日温度的0.1,即
V0 = 0
V1 = 0.9V0 + 0.1θ1
V2 = 0.9V1 + 0.1θ2
V3 = 0.9V2 + 0.1θ3

Vt = 0.9Vt-1 + 0.1θt
就可以得到一组温度值的移动平均值,每日温度的指数加权平均值。

对于Vt = βVt-1 + (1-β)θt,Vt可以看作大概是1/ (1-β)的每日温度的平均值,也就是说如果β=0.9,可以将它看作十天的平均值。

理解指数加权平均

Vt = βVt-1 + (1-β)θt
V100 = βV99 + (1-β)θ100
V99 = βV98 + (1-β)θ99
V98 = βV97 + (1-β)θ98

因此,
V100 = (1-β)×θ100 + (1-β)β×θ99 + (1-β)β2×θ98 + (1-β)β3×θ97 + …
这是一个加和并平均,所有这些系数加起来为1或逼近1,称之为偏差修正。指数加权平均数的必要组成就是偏差修正。

指数加权平均的偏差修正

在一开始计算V1、V2等值时,偏差较大,可以不用Vt,而用Vt / (1-βt),比如当t=2时,1-βt = 1-β2 ,估测值就为V2 / (1-β2) = [βV1 + (1-β)θ2] / (1-β2)。当t很大的时候,1-βt接近于1,偏差修正几乎没有作用;不过在开始学习阶段,偏差修正可以让我们更好的预测温度。
在机器学习中,在计算指数加权平均数的大部分时候,都不必去执行偏差修正,因为熬过初始时期拿到具有偏差的估测就可以继续计算下去了。如果关心初始时期的偏差,在刚开始计算指数加权移动平均数的时候,使用偏差修正可以更好的估测。

动量梯度下降法

Momentum算法(也叫Momentum梯度下降法)效果也非常不错,运行速度总是快于标准的梯度下降算法。基本思路就是计算梯度的指数加权平均数,并利用该梯度更新权重。
在使用batch梯度下降算法时,会不断波动,因此只能选择较小的学习率,否则会偏差很大;而较小的学习率会影响学习速度。所以使用Momentum梯度下降法。

在第t次迭代中,用现有的mini-batch计算微分dW和db,令VdW = βVdW + (1-β)dW,可以计算出dw的移动平均数;令Vdb = βVdb + (1-β)db。然后重新赋值权重,W = W - αVdWb =b - αVdb,这样就可以减缓梯度下降的幅度,在抵达最小值的路上减少了摆动。
算法为:
在这里插入图片描述
因此,有两个超参数:学习率α和参数β,β控制着指数加权平均数,β最常用的值是0.9。
实际上,β取0.9,相当于做了前10次的平均,而10次迭代之后,我们的预测不再具有偏差,因此不太使用VdW / (1-βt)偏差修正。
此外,VdW的初始值为0,它与dW拥有相同维数;Vdb的初始值也是向量零,它与db、b也拥有相同维数。

RMSprop

全称为root mean square prop(均方根)算法,它也可以加速梯度下降。
在第t次迭代中,该算法会照常计算当下mini-batch的微分dW、db,接着令SdW = βSdW + (1-β)dW2,这样可以保留微分平方的加权平均数;同样,令Sdb = βSdb + (1-β)(db)2,接着RMSprop会更新参数值W = W - αdW/(SdW)1/2, b = b - αdb/(Sdb)1/2。分母不可过小,如果接近0会使整个值很大,因此实际操作中,还要在分母加上一个很小很小的ε,一般选择10-8
在这些微分中,db较大,dW较小,因为函数的倾斜程度,即b方向上的变化要比W方向上的变化大。db较大,因此Sdb会较大一点。所以,使用RMSprop算法的摆动较小,而向最小值的推进较快;还可以选择一个较大的学习率,从而加快学习。

Adam优化算法

Adam(Adaptive Moment Estimation)优化算法基本上就是将RMSprop和Momentum结合起来。
首先要初始化:
VdW = 0, Vdb = 0,
SdW = 0, Sdb = 0,
在第t次迭代中,用当前的mini-batch计算dW和db。
接下来计算Momentum指数加权平均数:
VdW = β1VdW + (1-β1)dW,
Vdb = β1Vdb + (1-β1)db。
接着用RMSprop进行更新:
SdW = β2SdW + (1-β2)dW2
Sdb = β2Sdb + (1-β2)(db)2
相当于Momentum更新了超参数β1,用RMSprop更新了超参数β2
使用Adam优化算法时,一般都要计算偏差修正:
VdWcorrected = VdW / (1-β1t),(t是迭代次数)
Vdbcorrected = Vdb / (1-β1t),
SdWcorrected = SdW / (1-β2t),
Sdbcorrected = Sdb / (1-β2t),
最后更新权重:
W = W - αVdWcorrected/ [(SdWcorrected)1/2 + ε],
b = b - αVdbcorrected / [(Sdbcorrected)1/2 +ε]。
其中包含了很多超参数,其中超参数学习率α很重要,也经常需要调试,可以尝试一系列值,看哪个更有效。β1常用的缺省值为0.9,β2推荐使用0.999,ε的选择不太重要,推荐10-8。实际操作中,一般大家都使用缺省值,不改变,仅仅去改变α的值。
β1用于计算微分dW、db,叫做第一矩;
β2用来计算平方数的指数加权平均数,叫做第二矩。

学习率衰减

加快学习算法的一个办法就是随时间慢慢减少学习率,称为学习率衰减。这样,在学习初期,可以以较大的步伐靠近最小值;当开始收敛的时候,小一些的学习率可以让步伐变小,从而在最小值附近波动。
第一次遍历训练集叫做第一代,第二次就是第二代,以此类推。可以将学习率α设置为α0 / (1+decay rate * 代数),其中,α0为初始学习率(需要自己去试值),decay rate称为衰减率(需要自己去试值)。

指数衰减:
α = 0.95代数×α0,其中,0.95可以换成其他的小于1的值,所以学习率会呈指数下降。
或者:
α = 某个常数k/ (代数)1/2×α0
离散下降:
在这里插入图片描述

局部最优的问题

假设想要优化的参数就是w1和w2,平面的高度就是损失函数。
在这里插入图片描述
在图中似乎各处都分布着局部最优,梯度下降法或者某个算法可能困在一个局部最优中,而不会抵达全局最优。
在这里插入图片描述
事实上,如果想要创建一个神经网络,通常梯度为0的点并不是这个图中的局部最优点,实际上成本函数的零梯度点通常是鞍点(上图蓝点处)。
但是一个具有高维空间的函数,如果梯度为0,那么在某个方向可能是凸函数,也可能是凹函数。
如果在一个20000维的神经网络,更有可能出现鞍点,在某个方向是下降再上升,再另一个方向是上升再下降。

在训练很大的神经网络时,不太容易困在局部最优上,并且成本函数J被定义在较高的维度空间;但平稳段会使学习变得非常缓慢,在这种情况下,可以使用Adam算法来加快速度。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值