Batch Norm

来源:互联网 发布:mysql直接复制数据文件 编辑:程序博客网 时间:2024/05/22 14:32

文中图片均出自本人之手,做的相当凑合


我们都知道在一个如下图的单元中

将x1、x2、x3减去均值除以方差也就是使输入数据的均值为0方差为1,可以加快该网络的训练速度。

如果是在如下图的深层网络中呢?

将输入值x1、x2、x3进行归一化操作之后只是加快了第一层网络的速度,并不能对后边的n层网络产生影响,这时我们应该怎么办呢。
简单来说就是将每一层前的输入包括输入层的x和隐藏层的a均进行减去均值除以方差的操作,我们叫做Batch Norm。
下边就用最直观的方式介绍Batch Norm是如何操作的。
想象这里是某一隐层1,输入层的输入值经过归一化之后传了进来,接下来就是熟悉的操作:
z = wx + b
在以往没有Batch Norm的情况下,接下来我们就要套激活函数了:
a = g(z) 注:(g()为某一种激活函数)
然后这个a就是这一隐层的输出,也就是下一隐层的输入了。
这时的a用一句不是那么官方的话来讲,是‘参差不齐’的,为了仍然可以达到‘均值为0,方差为1’的效果,我们要在这一隐层的操作中加一点东西:

  • z = wx + b
  • μ = (z的平均)
  • σ2 = (z的方差)
  • z_norm = (z - μ) / √(σ2 + ε)

在这里分母加一个ε的目的是为了防止分母为0。
然而我们又不希望隐层的输入的均值永远为0,方差永远为1,也许有不同的均值和方差得到的分布更有意义。
因此我们要做到的不是让均值为0,方差为1,而是要控制均值和方差的大小,这也是我在上边一段中将‘均值为0,方差为1’打引号的原因。

  • z = γ · z_norm + β

如果γ = √(σ2 + ε), β = μ,则z就是等于z_norm,因此我们可以通过这个式子得到最终可以控制均值和方差的z。
最后在这个z上套上一个激活函数:

  • a = g(z)。

OK,到这里,一个加上Batch Norm的神经元就完整的完成了。
除了之前的神经网络中存在的参数w和b,在这里我们又多了两个参数γ和β。这两个参数也和w、b一样,需要梯度下降算法来优化。


为什么要使用Batch Norm呢?上边所说的加快训练速度只是一个简单的原因,在简单的深层网络中,如果前层中的参数改变,后层中的参数也会跟着变化,如果加上Batch Norm,即使输入数据的分布会有变化,但是他们的均值方差可控,从而使变化带来的影响减小,使各个层之间更加独立,更利于每层‘专门做自己的事情’。


以上均为个人理解
同样爱好机器学习或者也在机器学习路上探索的同学,可以加为好友共同进步。QQ:16198466

原创粉丝点击