←上一篇 ↓↑ 下一篇→
3.4 正则化网络的激活函数 回到目录 3.6 Batch Norm 为什么奏效

将 Batch 拟合进神经网络 (Fitting Batch Norm into a Neural Network)

你已经看到那些等式,它可以在单一隐藏层进行Batch归一化,接下来,让我们看看它是怎样在深度网络训练中拟合的吧。

假设你有一个这样的神经网络,我之前说过,你可以认为每个单元负责计算两件事。第一,它先计算 zzz ,然后应用其到激活函数中再计算 aaa ,所以我可以认为,每个圆圈代表着两步的计算过程。同样的,对于下一层而言,那就是 z1[2]z_1^{[2]}z1[2]​ 和 a1[2]a_1^{[2]}a1[2]​ 等。所以如果你没有应用Batch归一化,你会把输入 XXX 拟合到第一隐藏层,然后首先计算 z[1]z^{[1]}z[1] ,这是由 w[1]w^{[1]}w[1] 和 b[1]b^{[1]}b[1] 两个参数控制的。接着,通常而言,你会把 z[1]z^{[1]}z[1] 拟合到激活函数以计算 a[1]a^{[1]}a[1] 。但Batch归一化的做法是将值进行Batch归一化,简称BN,此过程将由 β[1]\beta^{[1]}β[1] 和 γ[1]\gamma^{[1]}γ[1] 两参数控制,这一操作会给你一个新的规范化的 z[1]z^{[1]}z[1] 值( z~[1]\tilde{z}^{[1]}z~[1] ),然后将其输入激活函数中得到 a[1]a^{[1]}a[1] ,即 a[1]=g[1](z~[l])a^{[1]}=g^{[1]}(\tilde{z}^{[l]})a[1]=g[1](z~[l]) 。

现在,你已在第一层进行了计算,此时Batch归一化发生在 zzz 的计算和 aaa 之间,接下来,你需要应用 a[1]a^{[1]}a[1] 值来计算 z[2]z^{[2]}z[2] ,此过程是由 w[2]w^{[2]}w[2] 和 b[2]b^{[2]}b[2] 控制的。与你在第一层所做的类似,你会将 z[2]z^{[2]}z[2] 进行Batch归一化,现在我们简称BN,这是由下一层的Batch归一化参数所管制的,即 β[2]\beta^{[2]}β[2] 和 γ[2]\gamma^{[2]}γ[2] ,现在你得到 z~[2]\tilde{z}^{[2]}z~[2] ,再通过激活函数计算出 a[2]a^{[2]}a[2] 等等。

所以需要强调的是Batch归一化是发生在计算 zzz 和 aaa 之间的。直觉就是,与其应用没有归一化的 zzz 值,不如用归一过的 z~\tilde{z}z~ ,这是第一层( z~[1]\tilde{z}^{[1]}z~[1] )。第二层同理,与其应用没有规范过的 z[2]z^{[2]}z[2] 值,不如用经过方差和均值归一后的 z~[2]\tilde{z}^{[2]}z~[2] 。所以,你网络的参数就会是 w[1],b[1],w[2]w^{[1]},b^{[1]},w^{[2]}w[1],b[1],w[2] 和 b[2]b^{[2]}b[2] 等等,我们将要去掉这些参数。但现在,想象参数 w[1],b[1]w^{[1]},b^{[1]}w[1],b[1] 到 w[l],b[l]w^{[l]},b^{[l]}w[l],b[l] ,我们将另一些参数加入到此新网络中 β[1],β[2],γ[1],γ[2]\beta^{[1]},\beta^{[2]},\gamma^{[1]},\gamma^{[2]}β[1],β[2],γ[1],γ[2] 等等。对于应用Batch归一化的每一层而言。需要澄清的是,请注意,这里的这些 β\betaβ ( β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等)和超参数 β\betaβ 没有任何关系,下一张幻灯片中会解释原因,后者是用于Momentum或计算各个指数的加权平均值。Adam论文的作者,在论文里用 β\betaβ 代表超参数。Batch归一化论文的作者,则使用 β\betaβ 代表此参数( β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等),但这是两个完全不同的 β\betaβ 。我在两种情况下都决定使用 β\betaβ ,以便你阅读那些原创的论文,但Batch归一化学习参数 β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等和用于MomentumAdamRMSprop算法中的 β\betaβ 不同。

所以现在,这是你算法的新参数,接下来你可以使用想用的任何一种优化算法,比如使用梯度下降法来执行它。

举个例子,对于给定层,你会计算 dβ[l]d\beta^{[l]}dβ[l],接着更新参数 β\betaβ 为 β[l]=β[l]−αdβ[l]\beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]}β[l]=β[l]−αdβ[l] 。你也可以使用AdamRMSpropMomentum,以更新参数 β\betaβ 和 γ\gammaγ ,并不是只应用梯度下降法。

即使在之前的视频中,我已经解释过Batch归一化是怎么操作的,计算均值和方差,减去均值,再除以方差,如果它们使用的是深度学习编程框架,通常你不必自己把Batch归一化步骤应用于Batch归一化层。因此,探究框架,可写成一行代码,比如说,在TensorFlow框架中,你可以用这个函数(tf.nn.batch_normalization)来实现Batch归一化,我们稍后讲解,但实践中,你不必自己操作所有这些具体的细节,但知道它是如何作用的,你可以更好的理解代码的作用。但在深度学习框架中,Batch归一化的过程,经常是类似一行代码的东西。

所以,到目前为止,我们已经讲了Batch归一化,就像你在整个训练站点上训练一样,或就像你正在使用Batch梯度下降法。

实践中,Batch归一化通常和训练集的mini-batch一起使用。你应用Batch归一化的方式就是,你用第一个mini-batch( X{1}X^{\{1\}}X{1} ),然后计算 z[1]z^{[1]}z[1] ,这和上张幻灯片上我们所做的一样,应用参数 w[1]w^{[1]}w[1] 和 b[1]b^{[1]}b[1] ,使用这个mini-batch( X{1}X^{\{1\}}X{1} )。接着,继续第二个mini-batch( X{2}X^{\{2\}}X{2} ),接着Batch归一化会减去均值,除以标准差,由 β[1]\beta^{[1]}β[1] 和 γ[1]\gamma^{[1]}γ[1] 重新缩放,这样就得到了 z~[1]\tilde{z}^{[1]}z~[1] ,而所有的这些都是在第一个mini-batch的基础上,你再应用激活函数得到 a[1]a^{[1]}a[1] 。然后用 w[2]w^{[2]}w[2] 和 b[2]b^{[2]}b[2] 计算 z[2]z^{[2]}z[2] ,等等,所以你做的这一切都是为了在第一个mini-batch( X{1}X^{\{1\}}X{1} )上进行一步梯度下降法。

类似的工作,你会在第二个mini-batch( X{2}X^{\{2\}}X{2} )上计算 z[1]z^{[1]}z[1] ,然后用Batch归一化来计算 z~[1]\tilde{z}^{[1]}z~[1] ,所以Batch归一化的此步中,你用第二个mini-batch( X{2}X^{\{2\}}X{2} )中的数据使 z~[1]\tilde{z}^{[1]}z~[1] 归一化,这里的Batch归一化步骤也是如此,让我们来看看在第二个mini-batch( X{2}X^{\{2\}}X{2} )中的例子,在mini-batch上计算 z[1]z^{[1]}z[1] 的均值和方差,重新缩放的 β\betaβ 和 γ\gammaγ 得到 z[1]z^{[1]}z[1] ,等等。

然后在第三个mini-batch( X{3}X^{\{3\}}X{3} )上同样这样做,继续训练。

现在,我想澄清此参数的一个细节。先前我说过每层的参数是 w[l]w^{[l]}w[l] 和 b[l]b^{[l]}b[l] ,还有 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] ,请注意计算 zzz 的方式如下, z[l]=w[l]a[l−1]+b[l]z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}z[l]=w[l]a[l−1]+b[l] ,但Batch归一化做的是,它要看这个mini-batch,先将 z[l]z^{[l]}z[l] 归一化,结果为均值0和标准方差,再由 β\betaβ 和 γ\gammaγ 重缩放,但这意味着,无论 b[l]b^{[l]}b[l] 的值是多少,都是要被减去的,因为在Batch归一化的过程中,你要计算 z[l]z^{[l]}z[l] 的均值,再减去平均值,在此例中的mini-batch中增加任何常数,数值都不会改变,因为加上的任何常数都将会被均值减去所抵消。

所以,如果你在使用Batch归一化,其实你可以消除这个参数( b[l]b^{[l]}b[l] ),或者你也可以,暂时把它设置为0,那么,参数变成 z[l]=w[l]a[l−1]z^{[l]}=w^{[l]}a^{[l-1]}z[l]=w[l]a[l−1] ,然后你计算归一化的 z[l]z^{[l]}z[l] , z~[l]=γ[l]z[l]+β[l]\tilde{z}^{[l]}=\gamma^{[l]}z^{[l]}+\beta^{[l]}z~[l]=γ[l]z[l]+β[l] ,你最后会用参数 β[l]\beta^{[l]}β[l] ,以便决定 z~[l]\tilde{z}^{[l]}z~[l] 的取值,这就是原因。

所以总结一下,因为Batch归一化超过了此层 z[l]z^{[l]}z[l] 的均值, b[l]b^{[l]}b[l] 这个参数没有意义,所以,你必须去掉它,由 β[l]\beta^{[l]}β[l] 代替,这是个控制参数,会影响转移或偏置条件。

最后,请记住 z[l]z^{[l]}z[l] 的维数,因为在这个例子中,维数会是( n[l],1n^{[l]},1n[l],1 ), b[l]b^{[l]}b[l] 的尺寸为( n[l],1n^{[l]},1n[l],1 ),如果是 lll 层隐藏单元的数量,那 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] 的维度也是( n[l],1n^{[l]},1n[l],1 ),因为这是你隐藏层的数量,你有 n[l]n^{[l]}n[l] 隐藏单元,所以 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] 用来将每个隐藏层的均值和方差缩放为网络想要的值。

让我们总结一下关于如何用Batch归一化来应用梯度下降法,假设你在使用mini-batch梯度下降法,你运行 t=1t=1t=1 到batch数量的for循环,你会在mini-batch X{1}X^{\{1\}}X{1} 上应用正向prop,每个隐藏层都应用正向prop,用Batch归一化代替 z[l]z^{[l]}z[l] 为 z~[l]\tilde{z}^{[l]}z~[l] 。接下来,它确保在这个mini-batch中, zzz 值有归一化的均值和方差,归一化均值和方差后是 z~[l]\tilde{z}^{[l]}z~[l] ,然后,你用反向prop计算 dw[l]dw^{[l]}dw[l] 和 db[l]db^{[l]}db[l] ,及所有 lll 层所有的参数, dβ[l]d\beta^{[l]}dβ[l] 和 dγ[l]d\gamma^{[l]}dγ[l] 。尽管严格来说,因为你要去掉 bbb ,这部分其实已经去掉了。最后,你更新这些参数: w[l]=w[l]−αdw[l]w^{[l]}=w^{[l]}-\alpha dw^{[l]}w[l]=w[l]−αdw[l] ,和以前一样, β[l]=β[l]−αdβ[l]\beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]}β[l]=β[l]−αdβ[l] ,对于 γ\gammaγ 也是如此 γ[l]=γ[l]−αdγ[l]\gamma^{[l]}=\gamma^{[l]}-\alpha d\gamma^{[l]}γ[l]=γ[l]−αdγ[l] 。

如果你已将梯度计算如下,你就可以使用梯度下降法了,这就是我写到这里的,但也适用于有MomentumRMSpropAdam的梯度下降法。与其使用梯度下降法更新mini-batch,你可以使用这些其它算法来更新,我们在之前几个星期中的视频中讨论过的,也可以应用其它的一些优化算法来更新由Batch归一化添加到算法中的 β\betaβ 和 γ\gammaγ 参数。

我希望,你能学会如何从头开始应用Batch归一化,如果你想的话。如果你使用深度学习编程框架之一,我们之后会谈。,希望,你可以直接调用别人的编程框架,这会使Batch归一化的使用变得很容易。

现在,以防Batch归一化仍然看起来有些神秘,尤其是你还不清楚为什么其能如此显著的加速训练,我们进入下一个视频,详细讨论Batch归一化为何效果如此显著,它到底在做什么。

课程PPT





←上一篇 ↓↑ 下一篇→
3.4 正则化网络的激活函数 回到目录 3.6 Batch Norm 为什么奏效

3.5 将 Batch 拟合进神经网络-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授相关推荐

  1. 吴恩达deeplearning.ai系列课程笔记+编程作业(6)第二课 改善深层神经网络-第二周:优化算法 (Optimization algorithms)

    第二门课 改善深层神经网络:超参数调试.正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and ...

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

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

  3. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  4. 0.0 目录-深度学习第二课《改善神经网络》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  5. 0.0 目录-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授

    文章目录 第五课 第四课 第三课 第二课 第一课 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1.2 数学符号 ...

  6. 1.4 正则化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.3 机器学习基础 回到目录 1.5 为什么正则化可以减少过拟合 正则化 (Regularization) 深度学习可能存在过拟合问题--高方差,有两个解决方法,一个是正则 ...

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

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

  8. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 无 回到目录 1.2 什么是神经网络 欢迎 第一个视频主要讲了什么是深度学习,深度学习能做些什么事情.以下是吴恩达老师的原话: 深度学习改变了传统互联网业务,例如如网络搜索和 ...

  9. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

最新文章

  1. 打造高效机房就这么简单(一)
  2. cpu的主频主要影响微型计算机的,在微型计算机中,通常用主频来描述CPU的(1);对计算机磁盘工作影响最小的因 - 问答库...
  3. javascript高精度计算解决方案
  4. mysql、clickhouse读写分离性能测试
  5. cocoapos错误信息
  6. 自动驾驶路径规划论文解析(2)
  7. 记一次项目代码重构:使用Spring容器干掉条件判断
  8. bash脚本:case语句
  9. package.json 封装 vue模块_Vue管理系统前端~相关工具引入及封装
  10. 深入学习jquery源码之show()和hide()
  11. MATLAB--数字图像处理 频域图像分析
  12. 浅谈Android垃圾回收机制
  13. CSS-div垂直居中方法总结
  14. 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  15. 2021 ICPC Gran Premio de Mexico 2da Fecha - F.Flipped Factorization(PN筛)
  16. 树莓派云台舵机怎么用_教程 - 由多个舵机控制的云台 - MAKE 趣无尽
  17. R语言逻辑回归的预测概率怎么算
  18. Windows Azure 虚拟网络中虚拟机的网络隔离选项
  19. arduino mega 2560 针脚说明
  20. 路径正确下,Eclipse读取txt文件仍失败

热门文章

  1. 修改anaconda3 jupyter notebook 默认路径
  2. Oracle 分组统计,抽取每组前十
  3. DIV+CSS笔记(一)
  4. Oracle - 行转列, 列转行
  5. 共享内存生产者消费者模型
  6. linux修改selinux
  7. Asp.net 三层架构搭建示例一
  8. C++ STL 基本使用Win32 版
  9. C# 功能完整的单表增删改查程序
  10. VC++ 常用编程技巧总结