mfc 哨兵模式 plugins 如何做网络营销推广 openssl vue使用教程 vue源码下载 后台系统模板 nginx视频教程 js获取焦点事件 java三维数组 bootstrap日历控件 linux关闭mysql matlab向量的模 vim跳到文件末尾 python最大值 python如何实现多线程 python基础教程 python字符串匹配 javalabel jdk环境配置 java循环list java开发语言 java集合类型 linux简介 bash命令 maya2008 黑市商人 assist是什么意思 电脑代码雨 pr加速视频 pro换肤 backtrack4 maya骨骼绑定教程 红巨星插件 网易云听歌识曲电脑版 企业路由器设置 东莞证券财富通下载 c语言小程序 刷机精灵下载
当前位置: 首页 > 学习教程  > 编程语言

2020-6-12 吴恩达-改善深层NN-w3 Batch归一化(3.5 将 Batch归一化-简称BN-拟合进NN(梯度下降法中使用BN))

2020/7/24 9:20:50 文章标签:

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

3.5 将 Batch Norm 拟合进神经网络 Fitting Batch Norm into a neural network

  • 1. 将BN拟合进NN
  • 2.在mini-batch中应用BN(维度提醒)
  • 3.总结BN应用于梯度下降步骤

1. 将BN拟合进NN

在这里插入图片描述

如上图,上节课我们学习了4个等式,它可以在单一隐藏层进行Batch归一化。
在本节中,让我们看看它是怎样在深度网络训练中拟合的吧。

在这里插入图片描述

观察上图的NN。
前面已经介绍过,你可以认为每个单元负责计算两件事。
它先计算z,然后应用其到激活函数中再计算a,即,每个神经元圆圈代表着两步的计算过程。

所以,如果你没有应用Batch归一化,你会把输入XX拟合到第一隐藏层,然后首先计算z[1]z^{[1]},这是由w[1]w^{[1]}b[1]b^{[1]}两个参数控制的。接着,你会把z[1]z^{[1]}拟合到激活函数以计算a[1]a^{[1]}

但Batch归一化的做法是将z[1]z^{[1]}值进行Batch归一化,简称BN。如下图,此过程将由β[1]\beta^{[1]}γ[1]\gamma^{[1]}两参数控制。
在这里插入图片描述

这一操作会给你一个新的规范化的z[1]z^{[1]}值—>z~[1]\tilde z^{[1]}。然后将其输入激活函数中得到a[1]a^{[1]},即a[1]=g[1](z~[1])a^{[1]}=g^{[1]}(\tilde z^{[1]})

现在我们已完成了在第一层进行了计算,此时Batch归一化(Batch Norm,BN)发生在 zz 的计算和 aa 之间。

接下来,你需要应用值a[1]a^{[1]}来计算z[2]z^{[2]},此过程是由 w[2]w^{[2]}b[2]b^{[2]} 控制的。
在这里插入图片描述

如上图。
与第一层所做的类似,你会将z[2]z^{[2]}进行Batch归一化。这是由第二层的Batch归一化参数 β[2]\beta^{[2]}γ[2]\gamma^{[2]} 所控制的。

现在你得到z~[2]\tilde z^{[2]},再通过激活函数计算出a[2]a^{[2]}

再次强调一下,Batch归一化是发生在计算zzaa之间的

我们的直觉就是,与其应用没有归一化(规范过)的值zz,不如用(经过方差和均值)归一过的z~\tilde z

现在NN的参数就是w[1]w^{[1]}b[1]b^{[1]}w[2]w^{[2]}b[2]b^{[2]}w[l]w^{[l]}b[l]b^{[l]}
以及新加入的参数β[1]\beta^{[1]}γ[1]\gamma^{[1]}β[2]\beta^{[2]}γ[2]\gamma^{[2]}β[l]\beta^{[l]}γ[l]\gamma^{[l]}
你可以使用你想用的任何一种优化算法,比如使用梯度下降法来应用它们。

当然,并不是只能应用梯度下降法,你也可以使用Adam或RMSprop或Momentum,以更新参数β\betaγ\gamma
例如: 对于给定层,你会计算dβ[l]d\beta^{[l]},接着更新参数β\betaβ[l]=β[l]αdβ[l]\beta^{[l]}=\beta^{[l]} - \alpha d\beta^{[l]}

注意:Batch归一化学习参数β\beta,和用于Momentum、Adam、RMSprop算法中的超参β\beta(计算指数的加权平均值)不同。两者之间没有任何关系

在上一节课中,我已经解释过Batch归一化是怎么操作的,计算均值和方差,减去均值,再除以方差。znorm(i)=z(i)μσ2+ϵz^{(i)}_{norm}=\frac{z^{(i)}-μ}{\sqrt {σ^2+\epsilon}}

如果它们使用的是DL编程框架,通常你不必自己把Batch归一化步骤应用于Batch归一化层。因此,可写成一行代码,比如说,在TensorFlow框架中,你可以用这个函数tf.nn.batch_normalization 来实现Batch归一化。

实践中,你不必自己操作所有这些具体的细节,但知道它是如何作用的,你可以更好的理解代码的作用。在DL框架中,Batch归一化的过程,经常是类似一行代码的东西。

2.在mini-batch中应用BN(维度提醒)

在实践中,Batch归一化通常和训练集的mini-batch一起使用。

你应用Batch归一化的方式就是,

  • 你用第一个mini-batch子集(X{1}X^{\{1\}}),和上面介绍的方法一样,应用参数w[1]w^{[1]}b[1]b^{[1]},计算z[1]z^{[1]}
  • 然后在这个mini-batch子集(X{1}X^{\{1\}})中计算z[1]z^{[1]}的均值和方差。Batch归一化会减去均值,除以标准差,由β[1]\beta^{[1]}γ[1]\gamma^{[1]}重新缩放,这样就得到了z~[1]\tilde z^{[1]}
  • 在第一个mini-batch子集(X{1}X^{\{1\}})的基础上,你再应用激活函数得到a[1]=g(z~[1])a^{[1]}=g(\tilde z^{[1]})
  • 接着,继续第一个mini-batch(X{2}X^{\{2\}}),然后用w[2]w^{[2]}b[2]b^{[2]}计算z[2]z^{[2]},等等。
    在这里插入图片描述

以上你做的这一切都是为了在第一个mini-batch子集(X{1}X^{\{1\}})上进行梯度下降法。
在这里插入图片描述

观察上图。
类似的工作,你会在第二个mini-batch子集(X{2}X^{\{2\}})上计算z[1]z^{[1]},然后用Batch归一化来计算z~[1]\tilde z^{[1]}。这里的BN步骤和第一个mini-batch子集是类似的,在第二个mini-batch(X{2}X^{\{2\}})中计算z[1]z^{[1]}的均值和方差,重新缩放的β\betaγ\gamma得到z~[1]\tilde z^{[1]},等等。

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

在这里,要澄清BN参数化过程的一个细节。

上面介绍过每层的参数是w[l]w^{[l]}b[l]b^{[l]}β[l]\beta^{[l]}γ[l]\gamma^{[l]}
请注意 zz 计算的方式如下,z[l]=w[l]a[l1]+b[l]z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}

Batch归一化做的是,在mini-batch子集上,先将z[l]z^{[l]}归一化,结果为均值0和标准方差,再由β\betaγ\gamma重缩放。但这意味着,无论b[l]b^{[l]}的值是多少,都是要被减去的,因为在Batch归一化的过程中,你要计算z[l]z^{[l]}的均值,再减去平均值。所以,mini-batch中增加任何常数,数值都不会改变,因为加上的任何常数都将会被均值减去所抵消。
在这里插入图片描述

也就是说,如果你在使用BN,其实你可以消除参数b[l]b^{[l]},或者你也可以暂时把它设置为0。那么,公式就变成z[l]=w[l]a[l1]z^{[l]}=w^{[l]}a^{[l-1]}
在这里插入图片描述

然后你计算归一化的z[l]z^{[l]},即znorm[l]z^{[l]}_{norm}z~[l]=γ[l]znorm[l]+β[l]\tilde z^{[l]}=\gamma^{[l]} z^{[l]}_{norm}+\beta^{[l]},你最后会用参数β[l]\beta^{[l]}决定z~[l]\tilde z^{[l]}的取值。也就是说,控制参数变为β[l]\beta^{[l]},它会影响转移或偏置条件。
在这里插入图片描述

最后,请记住z[l]z^{[l]}的维数。本例中,n[l]n^{[l]}ll 层隐藏单元的数量

  • z[l]z^{[l]}维数是(n[l]n^{[l]},1)
  • b[l]b^{[l]}的尺寸为(n[l]n^{[l]},1)
  • β[l]\beta^{[l]}γ[l]\gamma^{[l]}的维度也是(n[l]n^{[l]},1)。因为β[l]\beta^{[l]}γ[l]\gamma^{[l]}用来将每个隐藏层的均值和方差缩放为网络想要的值。

3.总结BN应用于梯度下降步骤

总结一下关于如何用Batch归一化来应用梯度下降法。

假设你在使用mini-batch梯度下降法,运行t=1t=1到batch数量的for循环,每次循环中

  • 在mini-batch(X{t}X^{\{t\}}) 上应用正向传播(forward prop)
  • 每个隐藏层用Batch归一化把z[l]z^{[l]}代替为z~[l]\tilde z^{[l]}。确保在这个mini-batch中,zz值有归一化的均值和方差。
  • 然后,你用反向传播(back prop)计算dw[l]dw^{[l]}dβ[l]d\beta^{[l]}dγ[l]d\gamma^{[l]}。注意:前面已经介绍过了,这里去除了计算db[l]db^{[l]}
  • 最后,你更新这些参数:
    w[l]:=w[l]αdw[l]w^{[l]}:=w^{[l]}-\alpha dw^{[l]}
    β[l]:=β[l]αdβ[l]\beta^{[l]}:=\beta^{[l]}-\alpha d\beta^{[l]}
    γ[l]:=γ[l]αdγ[l]\gamma^{[l]}:=\gamma^{[l]}-\alpha d\gamma^{[l]}

在这里插入图片描述

通过以上步骤,你就可以使用mini-batch梯度下降法了。
当然,这些步骤同样也适用于有Momentum、RMSprop、Adam的梯度下降法,可以由这些优化算法来更新由Batch归一化添加到算法中的 β\betaγ\gamma 参数。

本节中我们学会如何从头开始应用Batch归一化。如果你使用DL编程框架之一,你可以直接调用别人的编程框架,这会使BN的使用变得很容易。


本文链接: http://www.dtmao.cc/news_show_50040.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?