开发面试题 Tomcat springcloud CANopen view primefaces jboss vue插件 admin框架 jquery循环 查看kafka消费情况 oracle查询数据库 oracle重命名表名 python转java python的array python中for循环的用法 python的编译器 python写入txt文件 java连接mysql java正则表达 java中的数据结构 java多线程教程 javastringbuilder java停止线程 java列表 sp5 vbs脚本 jb51 labview宝典 gg修改器下载 ps3d字体 只狼全鬼佛 windows游戏编程 沉沦之城 圣武枪魂 小米自动开关机 php单例模式 jdk下载64位 生成海报 upnp阻塞
当前位置: 首页 > 学习教程  > 编程语言

2020-6-15 吴恩达-改善深层NN-w3 Batch归一化(3.6 Batch Norm 为什么奏效?归一化前层输出的均值和方差,减少了对后层的影响,有助于加速NN学习。副作用是正则。)

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

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.6 Batch Norm 为什么奏效?Why does Batch Norm work?

为什么Batch归一化(简称BN)会起作用呢?

我们已经学习过如何归一化输入特征值xx,使其均值为0,方差1。它又是怎样加速学习的,有一些从0到1而不是从1到1000的特征值,通过归一化所有的输入特征值xx,以获得类似范围的值,可以加速学习,优化代价函数J更加简单。(因为任何位置都可以快速下降,步长大)

所以Batch归一化起的作用的一个原因,直观的一点就是,它在做类似的工作。但不仅仅对于这里的输入值,还有隐藏单元的值。
这只是Batch归一化作用的冰山一角,还有些深层的原理,它会有助于你对Batch归一化的作用有更深的理解,下面会做详细介绍。

Batch归一化有效的第二个原因是,它可以使权重比你的网络更滞后或更深层。
比如,第10层的权重更能经受得住变化,相比于NN中前层的权重,比如第1层。为了解释我的意思,让我们来看看这个最生动形象的例子。
在这里插入图片描述

观察上图。
这是一个网络的训练,或许是浅层网络,比如逻辑回归。也有可能是深层网络,这无关紧要,只需要知道这个网络是建立在我们著名的猫脸识别检测上。

假设你已经在所有黑猫的图像上训练了数据集(图左),如果现在你要把此网络模型应用于有色猫(图右)。这种情况下,y=1y=1的例子不只是左边的黑猫,还有右边其它颜色的猫,那么你的模型可能拟合的不会很好。
在这里插入图片描述

再说的简单一点,观察上图。
你的训练集是左图这个样子的,你的y=1y=1例子是红色圈,y=0y=0例子是黑色叉。
你试图把它们都统一于一个类似右图数据集,同样也是y=1y=1例子是红色圈,y=0y=0例子是黑色叉。
你也许无法期待,在左边训练得很好的模型,同样在右边也运行得很好。即使存在运行都很好的同一个函数,如果只看左图数据的话,你不会希望你的学习算法去发现绿色的决策边界。

所以就有了使你数据改变分布的这个想法,它有个有点怪的名字“Covariate shift”。如下图。
在这里插入图片描述

想法是这样的,假设你已经学习了 xxyy 的映射,如果 xx 的分布改变了,那么你可能需要重新训练你的学习算法。

“Covariate shift”的问题怎么应用于NN呢?
在这里插入图片描述

观察上图。试想一个像这样的深度网络,让我们从这层(第三层)来看看学习过程。
此网络已经学习了参数 w[3]w^{[3]}b[3]b^{[3]},从第三隐藏层的角度来看,它从前面的层中取得一些值,接着它需要做些什么,使希望输出值(预测值) y^\hat y 接近真实值 yy

在这里插入图片描述

如上图,让我们先遮住左边的部分。
从第三隐藏层的角度来看,它得到一些值,称为a1[2]a^{[2]}_1a2[2]a^{[2]}_2a3[2]a^{[2]}_3a4[2]a^{[2]}_4,这些值在这里也可以称作是特征值 x1x_1x2x_2x3x_3x4x_4。第三层隐藏层的工作就是找到一种方式,通过学习参数w[3]w^{[3]}b[3]b^{[3]},或w[4]w^{[4]}b[4]b^{[4]}w[5]w^{[5]}b[5]b^{[5]},使这些值映射到y^\hat y
在这里插入图片描述

现在我们把网络的左边部分揭开,如上图。
这个网络还有参数w[2]w^{[2]} ,b[2]b^{[2]}w[1]w^{[1]} ,b[1]b^{[1]},如果这些参数改变,ai[2]a^{[2]}_i的值也会改变。
所以从第三层隐藏层的角度来看,ai[2]a^{[2]}_i的值在不断地改变,所以它就有了“Covariate shift”的问题。

Batch归一化做的,是它减少了这些隐藏值(如上例中的ai[2]a^{[2]}_i)分布变化的数量。
在这里插入图片描述

如上图,绘制这些隐藏单元值的分布,这是以重整第二层隐藏层值zz为例。
观察左图,在这里只绘制两个值z1[2]z^{[2]}_1z2[2]z^{[2]}_2而不是四个值,以便我们设想为2D坐标。
当参数w[2]w^{[2]} ,b[2]b^{[2]}w[1]w^{[1]} ,b[1]b^{[1]}发生变化,z1[2]z^{[2]}_1z2[2]z^{[2]}_2值会从红色叉叉变为黑色圈圈。

Batch归一化可以确保无论z1[2]z^{[2]}_1z2[2]z^{[2]}_2怎样变化,它们的均值和方差都保持不变。所以即使z1[2]z^{[2]}_1z2[2]z^{[2]}_2的值改变,至少他们的均值和方差也会是均值0,方差1,或不一定必须是均值0,方差1(如右图),而是由 β[2]\beta^{[2]}γ[2]\gamma^{[2]} 决定的归一化值。

BN限制了前层参数w[2]w^{[2]} ,b[2]b^{[2]}w[1]w^{[1]} ,b[1]b^{[1]}的更新,对值zi[2]z^{[2]}_i或者ai[2]a^{[2]}_i分布影响的程度。第三层看到的这种情况,因此得到学习。

BN减少了输入值改变的问题,它会使这些值变得更稳定,NN之后的层就会有更坚实的基础。即使输入分布改变了一些,BN也会让它改变得更少。它做的是前面层保持学习,当前面层改变时,可以减少后层被迫需要适应改变的程度

你可以这样理解

  • BN减弱了前层参数作用与后层参数作用之间的联系。它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习。
  • 从NN后层的角度而言,前层不会变动的很多,因为它们被同样的均值和方差所限制。所以这会使得后层的学习工作变得更容易些。

Batch归一化还有一个作用,它有轻微的正则化效果。

对于每个mini-batch,mini-batch X{t}X^{\{t\}}的值为 z[l]z^{[l]},在mini-batch计算中,由均值和方差缩放。因为在mini-batch上计算的均值和方差,是由一小部分数据估计得出的,并不是在整个数据集上,所以均值和方差会有一些小的噪声。由此,从 zzz~\tilde z 的缩放过程也会有一些噪音,因为它是用有些噪音的均值和方差计算得出的。

和dropout相似,BN往每个隐藏层的激活值上增加了噪音。

dropout有增加噪音的方式,它使一个隐藏的单元,以一定的概率乘以0,以一定的概率乘以1。所以你的dropout含几重噪音,因为它(在每一层)乘以0或1。

Batch归一化含几重噪音,因为标准偏差的缩放和减去均值带来的额外噪音。这里的均值和标准差的估计值也是有噪音的。所以类似于dropout,Batch归一化有轻微的正则化效果,因为给隐藏单元添加了噪音,这迫使后部单元不过分依赖任何一个隐藏单元。因为添加的噪音很微小,所以并不是巨大的正则化效果。如果你想得到比dropout更强大的正则化效果,可以将BN和dropout一起使用。

另一个轻微非直观的效果是,如果你应用了较大的mini-batch,比如说,用了512。通过应用较大的min-batch,你减少了噪音,因此减少了正则化效果。这是dropout的一个奇怪的性质,就是应用较大的mini-batch会减少正则化效果

但是不要把Batch归一化当作正则化,应该把它当作将你归一化隐藏单元激活值并加速学习的方式。正则化几乎是一个意想不到的副作用,它会对你的算法有额外的期望效应或非期望效应。

还有一个细节需要提醒。

Batch归一化一次只能处理一个mini-batch数据,它在mini-batch上计算均值和方差。测试时,你试图做出预测,评估NN,你也许没有mini-batch的例子,也许一次只能进行一个简单的例子,所以测试时,你需要准备一些不同的东西以确保你的预测有意义。


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

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?