【深度学习】【BN】batch normalization(批量归一化)详解

批量归一化(batch normalization)开山之作:# Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

时间:2015年

训练深层神经网络是十分困难的,特别是在较短的时间内使他们收敛更加棘手。批量归一化是一种流行且有效的技术,尤其是可以加速深层网络的收敛速度。

1、为什么使用批量归一化?

首先关注一个问题,当我们的网络层比较深的时候,从我们的输入到输出的距离比较远,数据在下层,损失函数在上层。forward从下到上(从数据到损失)计算 ,backwards从上到下计算。梯度越在上面越容易大,越在下面(越靠近数据)越容易小(因为是n个很小的数进行相乘)。所以,在每次更新的时候,上层的网络梯度比较大,容易不断更新;而下层的网络梯度比较小,更新幅度较小。所以,==上层的部分会很容易收敛,而下层的更新就很慢。==我们知道,网络下层的部分(靠近数据,底层)抽取数据的细节特征,上层在底层抽取的信息基础上,抽取抽象特征。这就带来一个问题:下层抽取的特征如果改变了,上层就要重新开始训练。(底层虽然不容易更新,但也在不断更新。同时,顶层虽然更新快,但也随着底层的改变不断重新学习特征)。最终导致网络整体收敛慢。如何避免顶层总是重新学习(从头更新)?这就是批量归一化要解决的问题。

请添加图片描述

2、批量归一化

2.1 核心思想

为什么上层那些数据(特征)总是会改变?因为它们在不同层之间的均质和方差不同,也就是数据分布特征不统一。

核心思想:如果我们让每一层的数据,无论是输出还是梯度,都符合相同的某种分布,数据就变得稳定。比如,把每一层的均值变成0,方差变成1,固定住,变成正态分布。某一层的数据相对特征可以细调,但总的来说,这一层是符合某种分布的。这样,数据更新的时候就不会进行大的改变,容易学习底层细微的变动。

2.2 归一化的实现

2.2.1 固定小批量里面的均值和方差

B

B

B代表mini-batch,

μ

B

\mu_B

μB​代表均值,

σ

B

2

\sigma^2_{B}

σB2​代表方差,

ϵ

\epsilon

ϵ是一个很小的数(用于调节方差不为0)。

μ

B

=

1

B

i

B

x

i

 

a

n

d

 

σ

B

2

=

1

B

i

B

(

x

i

μ

B

)

2

+

ϵ

\mu_B=\frac{1}{\lvert B \rvert}\sum_{i\in B}x_i \space and \space \sigma^{2}_{B}=\frac{1}{\lvert B \rvert}\sum_{i\in B}(x_i-\mu_{B})^2+\epsilon

μB​=∣B∣1​i∈B∑​xi​ and σB2​=∣B∣1​i∈B∑​(xi​−μB​)2+ϵ

2.2.2 再做调整

x

i

x_i

xi​是我们的小批量中的某个输入,减去均值再处以方差得到输出。

μ

B

\mu_B

μB​和

σ

B

2

\sigma_B^2

σB2​是根据批量算出来的。这里的

γ

\gamma

γ和

β

\beta

β是机器可以学习的参数,如果某个分布特征不合适的话,可以用这两个参数进行调整。

x

i

=

γ

x

i

μ

B

2

σ

B

+

β

x’_{i}=\gamma\frac{x_i-\mu_B^2}{\sigma_B}+\beta

x’i​=γσB​xi​−μB2​​+β

3、批量归一化层

可习参数为

γ

\gamma

γ和

β

\beta

β。

存放(作用)位置:

  • 1、全连接层和卷积层输出后,并且在激活函数之前;
  • 2、全连接层和卷积层输入前。

对于1:为什么要在激活函数,如ReLu函数(

f

(

x

)

=

m

a

x

(

0

,

x

)

f(x)=max(0,x)

f(x)=max(0,x))之前?我还没得到确切的原因,李沐也没有讲清楚。我看了一些关于BN(Batch Normalization)存放顺序的讨论,私以为可以看看这个:讨论BN和ReLu先后顺序。最终结论:大部分人认为BN放在ReLu之后更好,并且做了大量实验验证确实如此,这和李沐的观点相反。

对于2:对全连接层来说,是面向特征维的;对卷积层来说,是面向通道维的。具体可以看一下全连接层和卷积层的区别。

4、批量归一化在做什么?

最初思想是用它来减少内部协变量偏移。

后续有论文指出,它可能就是通过在每个小批量里面加入噪声来控制模型复杂度。在公式

x

i

=

γ

x

i

μ

B

2

σ

B

+

β

=

x’_{i}=\gamma\frac{x_i-\mu_B^2}{\sigma_B}+\beta=

x’i​=γσB​xi​−μB2​​+β=中,

μ

B

2

\mu^2_B

μB2​(偏移)和

σ

B

\sigma_B

σB​(缩放)都是根据当前批量计算出来的数值,所以具有一定的随机性。说白了,就是我们也无法知道这个数值到底是多少,每一层都不一样,所以是某种噪声。

γ

\gamma

γ和

β

\beta

β可以学习,而且每次变化很细微,取决于learning rate。

所以,在做的事情就是:通过随机的偏移和缩放与不剧烈的、可学的参数来控制数据。

讨论:每个人的理解不同,有些人也许不这样认为批量归一化的工作机理,各说纷云。工程走在了理论的前面。

5、总结

  • 批量归一化固定小批量中的均值和方差,后学习出适合的偏移和缩放
  • 可以加速收敛速度,但一般不改变模型精度。所以,你可以通过加入BN来调高你的学习率。也许你之前的学习率是0.01,加入BN后你可以调整到0.1。原因:之前梯度太大,上层梯度爆炸;梯度太小,下层更新慢。加入之后,每层放在相似的分布,可以用一个较大的学习率。

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/6e9d305bec.html