Ng深度学习笔记 改善深层神经网络 优化算法

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

向量化能够有效地对所有个样本进行计算而无需某个明确的公式。所以我们要把训练样本放大巨大的矩阵当中去。

但如果m很大的话,处理速度仍然缓慢。必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理训练样本,才能进行下一步梯度下降法。

所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,算法速度会更快:

把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的到取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从到,然后再取1000个样本,以此类推。

x ( 1 ) x^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000)称为 x { 1 } x^{\{1\}} x{1} x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000)称为 x { 2 } x^{\{2\}} x{2},如果训练样本一共有500万个,每个mini-batch都有1000个样本,也就有5000个mini-batch.对y也要进行相同处理。
Ng深度学习笔记 改善深层神经网络 优化算法
Ng深度学习笔记 改善深层神经网络 优化算法
符号总结:

  • 使用了上角小括号表示训练集里的值, x ( i ) x^{(i)} x(i)是第个训练样本。
  • 上角中括号来表示神经网络的层数, z [ l ] z^{[l]} z[l]表示神经网络中第l层的值
  • 大括号来代表不同的mini-batch, x { t } 和 y { t } x^{\{t\}}和 y^{\{t\}} x{t}y{t}.

x { t } 和 y { t } x^{\{t\}}和 y^{\{t\}} x{t}y{t}的维数:对于有1000个样本的训练集, X 1 X^{{1}} X1维数应该是 ( n x , 1000 ) (n_{x},1000) (nx,1000) X 2 X^{{2}} X2的维数应该是 ( n x , 1000 ) (n_{x},1000) (nx,1000),以此类推。因此所有的子集维数都是 ( n x , 1000 ) (n_{x},1000) (nx,1000),而这些( Y t Y^{{ t}} Yt)的维数都是 ( 1 , 1000 ) (1,1000) (1,1000)

mini-batch梯度下降法的原理: 在训练集上运行mini-batch梯度下降法,因为我们有5000个各有1000个样本的组, 运行for t=1……5000,因为我们有5000个各有1000个样本的组,在for循环里你要做得基本就是对 X t X^{{t}} Xt Y t Y^{{t}} Yt执行一步梯度下降法。
Ng深度学习笔记 改善深层神经网络 优化算法

这是使用mini-batch梯度下降法训练样本的一步,也可被称为进行“一代”(1 epoch)的训练。一代这个词意味着只是一次遍历了训练集。

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

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

Ng深度学习笔记 改善深层神经网络 优化算法

使用batch梯度下降法时,每次迭代都需要历遍整个训练集,每次迭代成本都会下降,成本函数 J J J会随着每次迭代而减少,如果 J J J在某次迭代中增加了,也许是因为学习率太大。

使用mini-batch梯度下降法,则并不是每次迭代都是下降的,特别是在每次迭代中,如果要作出成本函数 J t J^{{ t}} Jt的图,而 J t J^{{t}} Jt只和 X t X^{{ t}} Xt Y t Y^{{t}} Yt有关,很可能会看到这样的结果:走向朝下,但有更多的噪声

mini-batch的大小:
两种极端下成本函数的优化情况

  • 如果mini-batch的大小等于训练集的大小 m m m,则就是batch梯度下降法。
  • mini-batch大小为1,就随机梯度下降法,每个样本都是独立的mini-batch。

batch梯度下降法从某处开始,相对噪声低些,幅度也大一些。
Ng深度学习笔记 改善深层神经网络 优化算法

随机梯度下降法中,每次迭代,只对一个样本进行梯度下降,大部分时候向着全局最小值靠近,有很多噪声,平均来看它最终会靠近最小值。随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。

用mini-batch梯度下降法,不会总朝向最小值靠近,但它比随机梯度下降要更持续地靠近最小值的方向,它也不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率。
Ng深度学习笔记 改善深层神经网络 优化算法

m的选择:

  1. 如果训练集较小,直接使用batch梯度下降法;样本数目较大的话,一般的mini-batch大小为64到512
  2. 考虑到电脑内存设置和使用的方式,如果mini-batch大小是2的 n n n次方,代码会运行地快一些
  3. 3.mini-batch中,要确保 X t ​ X^{{ t}}​ Xt Y t ​ Y^{{t}}​ Yt要符合CPU/GPU内存,取决于你的应用方向以及训练集的大小。

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

指数加权平均数的关键方程:

v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt
β \beta β在统计学中被称为指数加权移动平均值,我们就简称为指数加权平均数。

β \beta β较大时得到的曲线要平坦一些,原因在于多平均了前面的数据,所以这个曲线,波动更小,更加平坦,缺点是曲线进一步右移。

β \beta β较小时,如0.5,平均的数据太少,所以得到的曲线有更多的噪声,有可能出现异常值,但是这个曲线能够更快适应变化。

β = 0.9 \beta=0.9 β=0.9的时候,得到的结果是红线,如果它更接近于1,比如0.98,结果就是绿线,如果 β \beta β小一点,如果是0.5,结果就是黄线。

Ng深度学习笔记 改善深层神经网络 优化算法
Ng深度学习笔记 改善深层神经网络 优化算法
Ng深度学习笔记 改善深层神经网络 优化算法

进一步地分析,来理解如何计算出每日温度的平均值。

同样的公式, v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

使 β = 0.9 \beta=0.9 β=0.9,写下相应的几个公式,所以在执行的时候, t t t从0到1到2到3, t t t的值在不断增加,为了更好地分析,我写的时候使得 t t t的值不断减小,然后继续往下写。

v 100 = 0.1 θ 100 + 0.9 v 99 v_{100}= 0.1\theta_{100} + 0.9v_{99} v100=0.1θ100+0.9v99

v 99 = 0.1 θ 99 + 0.9 v 98 v_{99} = 0.1\theta_{99} +0.9v_{98} v99=0.1θ99+0.9v98),所以: v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 v 98 ) v_{100} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9v_{98}) v100=0.1θ100+0.9(0.1θ99+0.9v98)

v 98 = 0.1 θ 98 + 0.9 v 97 v_{98} = 0.1\theta_{98} +0.9v_{97} v98=0.1θ98+0.9v97)所以: v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 ( 0.1 θ 98 + 0.9 v 97 ) ) v_{100} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9(0.1\theta_{98} +0.9v_{97})) v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))

以此类推把这些括号都展开,

v 100 = 0.1 θ 100 + 0.1 × 0.9 θ 99 + 0.1 × ( 0.9 ) 2 θ 98 + 0.1 × ( 0.9 ) 3 θ 97 + 0.1 × ( 0.9 ) 4 θ 96 + … v_{100} = 0.1\theta_{100} + 0.1 \times 0.9 \theta_{99} + 0.1 \times {(0.9)}^{2}\theta_{98} + 0.1 \times {(0.9)}^{3}\theta_{97} + 0.1 \times {(0.9)}^{4}\theta_{96} + \ldots v100=0.1θ100+0.1×0.9θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+0.1×(0.9)4θ96+

计算 v 100 v_{100} v100是通过,把两个函数对应的元素,然后求和,用这个数值100号数据值乘以0.1,99号数据值乘以0.1乘以 ( 0.9 ) 2 {(0.9)}^{2} (0.9)2,这是第二项,以此类推,所以选取的是每日温度,将其与指数衰减函数相乘,然后求和,就得到了 v 100 v_{100} v100

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

指数加权平均数公式的好处之一在于,它占用极少内存,电脑内存中只占用一行数字而已。但缺点是,如果保存所有最近的温度数据,和过去10天的总和,必须占用更多的内存,执行更加复杂,计算成本也更加高昂。

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

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

v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}_{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

计算移动平均数的时候,初始化 v 0 = 0 v_{0} = 0 v0=0 v 1 = 0.98 v 0 + 0.02 θ 1 v_{1} = 0.98v_{0} +0.02\theta_{1} v1=0.98v0+0.02θ1,但是 v 0 = 0 v_{0} =0 v0=0,所以这部分没有了( 0.98 v 0 0.98v_{0} 0.98v0),所以 v 1 = 0.02 θ 1 v_{1} =0.02\theta_{1} v1=0.02θ1,所以如果一天温度是40华氏度,那么 v 1 = 0.02 θ 1 = 0.02 × 40 = 8 v_{1} = 0.02\theta_{1} =0.02 \times 40 = 8 v1=0.02θ1=0.02×40=8,因此得到的值会小很多,所以第一天温度的估测不准。

所以,在估测初期,也就是不用 v t v_{t} vt,而是用 v t 1 − β t \frac{v_{t}}{1- \beta^{t}} 1βtvt,t就是现在的天数。举个具体例子,当 t = 2 t=2 t=2时, 1 − β t = 1 − 0.98 2 = 0.0396 1 - \beta^{t} = 1 - {0.98}^{2} = 0.0396 1βt=10.982=0.0396,因此对第二天温度的估测变成了 v 2 0.0396 = 0.0196 θ 1 + 0.02 θ 2 0.0396 \frac{v_{2}}{0.0396} =\frac{0.0196\theta_{1} + 0.02\theta_{2}}{0.0396} 0.0396v2=0.03960.0196θ1+0.02θ2,也就是 θ 1 \theta_{1} θ1 θ 2 \theta_{2} θ2的加权平均数,并去除了偏差。你会发现随着 t t t增加, β t \beta^{t} βt接近于0,所以当 t t t很大的时候,偏差修正几乎没有作用,因此当 t t t较大的时候,紫线基本和绿线重合了。