2.1 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授


←上一篇↓↑下一篇→
1.15 总结回到目录2.2 理解 mini-batch 梯度下降法

Mini-batch 梯度下降 (Mini-batch Gradient Descent)

本周将学习优化算法,这能让你的神经网络运行得更快。机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,你需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助你快速训练模型。

其中一个难点在于,深度学习没有在大数据领域发挥最大的效果,我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢。因此,你会发现,使用快速的优化算法,使用好用的优化算法能够大大提高你和团队的效率,那么,我们首先来谈谈mini-batch梯度下降法。

在这里插入图片描述

你之前学过,向量化能够让你有效地对所有 m m m 个样本进行计算,允许你处理整个训练集,而无需某个明确的公式。所以我们要把训练样本放大巨大的矩阵 X X X 当中去, X = [ x ( 1 ) x ( 2 ) x ( 3 ) ⋯ x ( m ) ] X=[x^{(1)}x^{(2)}x^{(3)}\cdots x^{(m)}] X=[x(1)x(2)x(3)x(m)] Y Y Y 也是如此, Y = [ y ( 1 ) y ( 2 ) y ( 3 ) ⋯ y ( m ) ] Y=[y^{(1)}y^{(2)}y^{(3)}\cdots y^{(m)}] Y=[y(1)y(2)y(3)y(m)] ,所以 X X X 的维数是 ( n x , m ) (n_x,m) (nx,m) Y Y Y 的维数是 ( 1 , m ) (1,m) (1,m) ,向量化能够让你相对较快地处理所有 m m m 个样本。如果 m m m 很大的话,处理速度仍然缓慢。比如说,如果 m m m 是500万或5000万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快,准确地说,这是你可以做的一些事情。

你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的 x ( 1 ) x^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000) 取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从 x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000) ,然后再取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,因为5000乘以1000就是5000万。

在这里插入图片描述

你共有5000个mini-batch,所以最后得到是 X ( 5000 ) X^{(5000)} X(5000)

在这里插入图片描述

Y Y Y 也要进行相同处理,你也要相应地拆分 Y Y Y 的训练集,所以这是 Y ( 1 ) Y^{(1)} Y(1) ,然后从 y ( 1001 ) y^{(1001)} y(1001) y ( 2000 ) y^{(2000)} y(2000) ,这个叫 Y ( 2 ) Y^{(2)} Y(2) ,一直到 Y ( 5000 ) Y^{(5000)} Y(5000)

在这里插入图片描述

mini-batch的数量 t t t 组成了 X ( t ) X^{(t)} X(t) Y ( t ) Y^{(t)} Y(t) ,这就是1000个训练样本,包含相应的输入输出对。

在这里插入图片描述

在继续课程之前,先确定一下我的符号,之前我们使用了上角小括号 ( i ) (i) (i) 表示训练集里的值,所以 x ( i ) x^{(i)} x(i) 是第 i i i 个训练样本。我们用了上角中括号 [ l ] [l] [l] 来表示神经网络的层数, z [ l ] z^{[l]} z[l] 表示神经网络中第 l l l 层的 z z z 值,我们现在引入了大括号 t t t 来代表不同的mini-batch,所以我们有 X ( t ) X^{(t)} X(t) Y ( t ) Y^{(t)} Y(t) ,检查一下自己是否理解无误。

在这里插入图片描述

X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} 的维数:如果 X { 1 } X^{\{1\}} X{1} 是一个有1000个样本的训练集,或者说是1000个样本的 x x x 值,所以维数应该是 ( n x , 1000 ) (n_x,1000) (nx,1000) X { 2 } X^{\{2\}} X{2} 的维数应该是 ( n x , 1000 ) (n_x,1000) (nx,1000) ,以此类推。因此所有的子集维数都是 ( n x , 1000 ) (n_x,1000) (nx,1000) ,而这些( Y { t } Y^{\{t\}} Y{t} )的维数都是 ( 1 , 1000 ) (1,1000) (1,1000)

解释一下这个算法的名称,batch梯度下降法指的是我们之前讲过的梯度下降法算法,就是同时处理整个训练集,这个名字就是来源于能够同时看到整个batch训练集的样本被处理,这个名字不怎么样,但就是这样叫它。

相比之下,mini-batch梯度下降法,指的是我们在下一张幻灯片中会讲到的算法,你每次同时处理的单个的mini-batch X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} ,而不是同时处理全部的 X X X Y Y Y 训练集。

那么究竟mini-batch梯度下降法的原理是什么?在训练集上运行mini-batch梯度下降法,你运行for t=1……5000,因为我们有5000个各有1000个样本的组,在for循环里你要做得基本就是对 X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} 执行一步梯度下降法。假设你有一个拥有1000个样本的训练集,而且假设你已经很熟悉一次性处理完的方法,你要用向量化去几乎同时处理1000个样本。

在这里插入图片描述

首先对输入也就是 X { t } X^{\{t\}} X{t} ,执行前向传播,然后执行 z [ 1 ] = W [ 1 ] X + b [ 1 ] z^{[1]}=W^{[1]}X+b^{[1]} z[1]=W[1]X+b[1] ,之前我们这里只有,但是现在你正在处理整个训练集,你在处理第一个mini-batch,在处理mini-batch时它变成了 X { t } X^{\{t\}} X{t} ,即 z [ 1 ] = W [ 1 ] X { t } + b [ 1 ] z^{[1]}=W^{[1]}X^{\{t\}}+b^{[1]} z[1]=W[1]X{t}+b[1] ,然后执行 A [ 1 ] k = g [ 1 ] ( Z [ 1 ] ) A^{[1]k}=g^{[1]}(Z^{[1]}) A[1]k=g[1](Z[1]) ,之所以用大写的 Z Z Z 是因为这是一个向量内涵,以此类推,直到 A [ L ] = g [ L ] ( Z [ L ] ) A^{[L]}=g^{[L]}(Z^{[L]}) A[L]=g[L](Z[L]) ,这就是你的预测值。注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理1000个而不是500万个样本。接下来你要计算损失成本函数 J J J ,因为子集规模是1000, J = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)}) J=10001i=1lL(y^(i),y(i)) ,说明一下,这( L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)},y^{(i)}) L(y^(i),y(i)) )指的是来自于mini-batch X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} 中的样本。

如果你用到了正则化,你也可以使用正则化的术语, J = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) + λ 21000 ∑ l ∣ ∣ w [ l ] ∣ ∣ F 2 J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_F J=10001i=1lL(y^(i),y(i))+21000λlw[l]F2 ,因为这是一个mini-batch的损失,所以我将 J J J 损失记为上角标 t t t ,放在大括号里( J { t } = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) + λ 21000 ∑ l ∣ ∣ w [ l ] ∣ ∣ F 2 J^{\{t\}}=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_F J{t}=10001i=1lL(y^(i),y(i))+21000λlw[l]F2 )。

你也会注意到,我们做的一切似曾相识,其实跟之前我们执行梯度下降法如出一辙,除了你现在的对象不是 X X X Y Y Y ,而是 X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} 。接下来,你执行反向传播来计算 J { t } J^{\{t\}} J{t} 的梯度,你只是使用 X { t } X^{\{t\}} X{t} Y { t } Y^{\{t\}} Y{t} ,然后你更新加权值, W W W 实际上是 W [ l ] W^{[l]} W[l] ,更新为 W [ l ] : = W [ l ] − α d W [ l ] W^{[l]}:=W^{[l]}-\alpha dW^{[l]} W[l]:=W[l]αdW[l] ,对 b b b 做相同处理, b [ l ] : = b [ l ] − α d b [ l ] b^{[l]}:=b^{[l]}-\alpha db^{[l]} b[l]:=b[l]αdb[l] 。这是使用mini-batch梯度下降法训练样本的一步,我写下的代码也可被称为进行“一代”(1 epoch)的训练。一代这个词意味着只是一次遍历了训练集。

在这里插入图片描述

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

如果你有一个丢失的训练集,mini-batch梯度下降法比batch梯度下降法运行地更快,所以几乎每个研习深度学习的人在训练巨大的数据集时都会用到,下一个视频中,我们将进一步深度讨论mini-batch梯度下降法,你也会因此更好地理解它的作用和原理。

课后PPT

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
1.15 总结回到目录2.2 理解 mini-batch 梯度下降法

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值