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

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

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

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

你之前学过,向量化能够让你有效地对所有 mmm 个样本进行计算,允许你处理整个训练集,而无需某个明确的公式。所以我们要把训练样本放大巨大的矩阵 XXX 当中去, 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)] , YYY 也是如此, 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)] ,所以 XXX 的维数是 (nx,m)(n_x,m)(nx​,m) , YYY 的维数是 (1,m)(1,m)(1,m) ,向量化能够让你相对较快地处理所有 mmm 个样本。如果 mmm 很大的话,处理速度仍然缓慢。比如说,如果 mmm 是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)

对 YYY 也要进行相同处理,你也要相应地拆分 YYY 的训练集,所以这是 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的数量 ttt 组成了 X(t)X^{(t)}X(t) 和 Y(t)Y^{(t)}Y(t) ,这就是1000个训练样本,包含相应的输入输出对。

在继续课程之前,先确定一下我的符号,之前我们使用了上角小括号 (i)(i)(i) 表示训练集里的值,所以 x(i)x^{(i)}x(i) 是第 iii 个训练样本。我们用了上角中括号 [l][l][l] 来表示神经网络的层数, z[l]z^{[l]}z[l] 表示神经网络中第 lll 层的 zzz 值,我们现在引入了大括号 ttt 来代表不同的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个样本的 xxx 值,所以维数应该是 (nx,1000)(n_x,1000)(nx​,1000) , X{2}X^{\{2\}}X{2} 的维数应该是 (nx,1000)(n_x,1000)(nx​,1000) ,以此类推。因此所有的子集维数都是 (nx,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} ,而不是同时处理全部的 XXX 和 YYY 训练集。

那么究竟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]) ,之所以用大写的 ZZZ 是因为这是一个向量内涵,以此类推,直到 A[L]=g[L](Z[L])A^{[L]}=g^{[L]}(Z^{[L]})A[L]=g[L](Z[L]) ,这就是你的预测值。注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理1000个而不是500万个样本。接下来你要计算损失成本函数 JJJ ,因为子集规模是1000, J=11000∑i=1lL(y^(i),y(i))J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})J=10001​∑i=1l​L(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=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_FJ=10001​∑i=1l​L(y^​(i),y(i))+21000λ​∑l​∣∣w[l]∣∣F2​ ,因为这是一个mini-batch的损失,所以我将 JJJ 损失记为上角标 ttt ,放在大括号里( J{t}=11000∑i=1lL(y^(i),y(i))+λ21000∑l∣∣w[l]∣∣F2J^{\{t\}}=\frac1{1000}\sum_{i=1}^lL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{21000}\sum_l||w^{[l]}||^2_FJ{t}=10001​∑i=1l​L(y^​(i),y(i))+21000λ​∑l​∣∣w[l]∣∣F2​ )。

你也会注意到,我们做的一切似曾相识,其实跟之前我们执行梯度下降法如出一辙,除了你现在的对象不是 XXX , YYY ,而是 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} ,然后你更新加权值, WWW 实际上是 W[l]W^{[l]}W[l] ,更新为 W[l]:=W[l]−αdW[l]W^{[l]}:=W^{[l]}-\alpha dW^{[l]}W[l]:=W[l]−αdW[l] ,对 bbb 做相同处理, b[l]:=b[l]−αdb[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 梯度下降法

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

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

    ←上一篇 ↓↑ 下一篇→ 2.1 Mini-batch 梯度下降 回到目录 2.3 指数加权平均 理解 Mini-batch 梯度下降 (Understanding Mini-batch Gradie ...

  2. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  3. 3.9 神经网络的梯度下降法-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.8 激活函数的导数 回到目录 3.10 直观理解反向传播 神经网络的梯度下降法 (Gradient Descent for Neural Networks) 在这个视频中 ...

  4. 3.12 总结-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 TensorFlow 回到目录 1.1 为什么是ML策略 (第三课) 总结 习题 第 61 题 如果在大量的超参数中搜索最佳的参数值,那么应该尝试在网格中搜索而不是 ...

  5. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  6. 3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授

    注意力模型 (Attention Model) 在上个视频中你已经见到了,注意力模型如何让一个神经网络只注意到一部分的输入句子.当它在生成句子的时候,更像人类翻译.让我们把这些想法转化成确切的式子,来 ...

  7. 3.12 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 随机初始化 回到目录 4.1 深层神经网络 文章目录 总结 习题 第 21 题 第 22 题 第 23 题 第 24 题 第 25 题 第 26 题 第 27 题 ...

  8. 机器学习和深度学习到底怎么学?顶尖专家吴恩达告诉你

    机器学习和深度学习到底怎么学? 在外国版知乎上,有位网友问:新手如何学习机器学习?学习完MOOC的课程后有没有能力阅读研究论文或者真正的做出一点研究成果? 这个困惑很多人的问题吴恩达给出了详细的回答, ...

  9. 1.8 其他正则化方法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 理解 Dropout 回到目录 1.9 归一化输入 其他正则化方法 (Other Regularization Methods) 除了 L2L2L2 正则化和随机失活 ...

最新文章

  1. pandas dataframe 删除带空值的行 各种空值 (dropna()、isna()、isnull()、fillna())
  2. Fibonacci数列的java实现
  3. HDU 1285--确定比赛名次【拓扑排序 amp;amp; 邻接表实现】
  4. Eclipse 代码风格配置
  5. 文巾解题 45. 跳跃游戏 II
  6. 【LeetCode】462. 最少移动次数使数组元素相等 II
  7. oracle不一致性关闭下次,Oracle DataGuard
  8. Android APK 打包过程 MD
  9. 原子性、有序性和可见性解释
  10. 日均请求量1.6万亿次背后,DNSPod的秘密-国密DoH篇
  11. U盘启动盘恢复为普通盘
  12. Keras验证集切分
  13. php进程是什么,PHP的进程模型是什么
  14. 火灾自动报警系统 300W广播功率放大器
  15. 建立主DNS区域和辅助DNS区域的最佳实践
  16. List 接口中扩充的 10 个方法详解
  17. 第八题:输出 9*9 乘法口诀表
  18. 【时间之外】做产品必须知道的SKU是什么?
  19. ABP入门系列之1——ABP总体介绍
  20. 实战新浪微博、腾讯微博的分享功能

热门文章

  1. VC++ 利用PDB和dump文件定位问题并进行调试
  2. Python windows安装MYSQL_db
  3. 【CF582E】Boolean Function 树形DP+FWT
  4. knockout的使用
  5. hadoop文件写入
  6. [moka同学笔记]PHP操作Redis收集
  7. Vim 键盘指令高清图
  8. c++ list 容器
  9. android sdk入门(1)
  10. C++中的空类,编译器默认可以产生哪些成员函数