【深度学习】【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=B1iBxi and σB2=B1iB(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 xi=γσBxiμ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= xi=γσBxiμB2+β=中, μ B 2 \mu^2_B μB2(偏移)和 σ B \sigma_B σB(缩放)都是根据当前批量计算出来的数值,所以具有一定的随机性。说白了,就是我们也无法知道这个数值到底是多少,每一层都不一样,所以是某种噪声。 γ \gamma γ β \beta β可以学习,而且每次变化很细微,取决于learning rate。

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

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

5、总结

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 06:26:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 06:26:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 06:26:04       82 阅读
  4. Python语言-面向对象

    2024-01-31 06:26:04       91 阅读

热门阅读

  1. mac 编译ios平台opencv4.x版本arm framework

    2024-01-31 06:26:04       49 阅读
  2. jquery的9大选择器

    2024-01-31 06:26:04       64 阅读
  3. MySQL-运算符

    2024-01-31 06:26:04       49 阅读
  4. kafka3.0.0学习记录

    2024-01-31 06:26:04       50 阅读