1. BN层作用概述

BN层会使得神经网络对超参数得选择更加稳定,超参数的变化范围可以更大,工作效果也更好。即使是深层网络,BN层的存在也会使得模型训练更加容易。同时BN层具有一定的正则化效果。

下面将说明BN层的具体作用方式,并解释BN层起到上述作用效果的原因。

2. BN层作用方式

一般我们认为BN层作用在激活函数之前

我们以一个神经网络中的某一个隐藏层(L层)中的某一个节点(1节点)为例,说明BN层的作用方式。在训练过程中,我们一次输入网络一个batch大小的数据。经过网络计算到第L层时,batch中的每一个单独的数据,都会在L层的1号节点输出一个值(设为 z ( 1 ) 到 z ( m ) z^{(1)}到z^{(m)} z(1)z(m))。则该批量数据在L层1号节点一共输出batch(m)个数据。我们对这batch个数据求均值 μ \mu μ和方差 σ 2 \sigma^{2} σ2,并使用求得的均值和方差对该节点的数据进行归一化。具体计算公式如下,其中 ϵ 是极小量,防止分母为零 \epsilon是极小量, 防止分母为零 ϵ是极小量,防止分母为零
μ = 1 m ∑ z ( i ) σ 2 = 1 m ∑ ( z ( i ) − μ ) 2 z n o r m ( i ) = z ( i ) − μ σ 2 + ϵ \mu = \frac{1}{m}\sum z^{(i)}\\ \sigma^2 = \frac{1}{m}\sum(z^{(i)}-\mu)^2\\ z_{norm}^{(i)} = \frac{z^{(i)-\mu}}{\sqrt{\sigma^2 + \epsilon}} μ=m1z(i)σ2=m1(z(i)μ)2znorm(i)=σ2+ϵ z(i)μ
这样得到的 z n o r m ( i ) z_{norm}^{(i)} znorm(i),**满足均值为0方差为1的分布。**但有时我们不希望隐藏层单元经过BN输出的值总是满足均值为零方差为1的分布。也许不同分布会更有意义。比如,如果我们使用softmax激活函数,如下图。均值为0方差为1的分布会更多的聚集在softmax的线性部分,若我们像更多的利用softmax的非线性特性,则需要改变数据的分布。

在这里插入图片描述

所以我们对 z n o r m ( i ) z_{norm}^{(i)} znorm(i)再进行一步变换 z ( i ) = γ z n o r m ( i ) + β {z^{(i)}} = \gamma z_{norm}^{(i)} + \beta z(i)=γznorm(i)+β这里的 γ 和 β \gamma和\beta γβ会改变数据的分布,对原始分布(均值为0,方差为1)进行缩放和平移。同时**这两个参数 γ 和 β \gamma和\beta γβ是模型的学习参数,所以我们会使用梯度下降或类似算法对其进行更新。**到此BN层的作用方式介绍完,我们接下来看其实际应用再我们的神经网络中的作用位置。

3. BN作用位置

我们借助吴恩达老师课程中的一张图理解BN层的作用位置。我们认为图中一个圆圈代表一个节点,在不使用BN层的情况下每个圆圈有两部计算,分别是通过权重 w , b w, b w,b计算 z z z z z z再通过激活函数计算 a a a。当我们加入BN层时,其作用位置在图中红线部分,也就是在激活函数之前。

在这里插入图片描述

由于其作用位置在激活函数之前,我们根据前面BN层的公式可以意识到,无论时第一步通过 w , b w, b w,b计算,还是经过BN层,数据均在进行线性变换。由于BN层会首先计算一个batch数据的均值和方差,然后将这组数据变为均值为0,方差为1的分布。所以第一步 w , b w, b w,b变换中的 b b b参数就失去了作用,无论其为多少在BN第一步计算时都会被减去,失去效果。所以我们不使用 b b b权重,偏置效果将由BN层的参数 β \beta β实现。

4. BN层起作用的原因
  1. BN层会使得深层网络对浅层网络的扰动的敏感性减低,如果不加入BN层,浅层网络的扰动会逐层积累,到达深层时可能数据分布会发生巨大变化,这会导致深层网络的参数训练困难。BN层会减少每层网络之间的联系,使得每层网络可以独立学习,有助于加速整个网络的学习。
  2. 一些激活函数如sigmoid在输入值过大或过小时会进入饱和区,会造成梯度过小,甚至梯度消失,不利于训练。所以BN也会使得数据分布在激活函数较为合适的区域,加快网络训练速度。
  3. BN层还有一定的正则化效果,通过上文我们了解BN层的均值和方差是在一个batch上的所有数据计算的。因为我们的batch通常是数据集中的一小部分,所以计算出的均值和偏差均存在噪音。这些噪音会对网络起到正则化的效果(类似于droupout),使得网络不过分依赖某一个节点的输出。
5. 测试时的BN层

上文介绍的BN层需要计算一个小batch的所有数据的均值和方差,但是当我们使用模型进行测试的时候,可能单次仅有一个输入,这时计算的均值和方差显然是没有意义的。所以解决这一问题的大致思想是,我们会在训练时记住整个训练集的均值和方差作为我们测试时的均值方差数据。不同的框架会有不同的相关操作,但其最终的结果均有预期的效果,不必担心!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐