CV:Batch normalization

Posted zzzyzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CV:Batch normalization相关的知识,希望对你有一定的参考价值。

系列文章目录

Normalization 系列方法(一):CV【4】:Batch normalization
Normalization 系列方法(二):CV【5】:Layer normalization


文章目录


前言

对于早前的 CNN 模型来说,大多使用 batch normalization 进行归一化,随着 Transformer 在计算机视觉领域掀起的热潮, layer normalization 开始被用于提升传统的 CNN 的性能,在许多工作中展现了不错的提升

本文主要是对 batch normalization 用法的总结


1. Batch normalization

1.1. Motivation

1.1.1. Single-level view


神经网络可以看成是上图形式,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数。一次反向传播过程会同时更新所有层的权重 W 1 , W 2 , ⋯   , W L W_1, W_2, \\cdots, W_L W1,W2,,WL,前面层权重的更新会改变当前层输入的分布,而跟据反向传播的计算方式,我们知道,对 W k W_k Wk 的更新是在假定其输入不变的情况下进行的

如果假定第 k k k 层的输入节点只有 2 个,对第 k k k 层的某个输出节点而言,相当于一个线性模型 y = w 1 x 1 + w 2 x 2 + b y = w_1x_1 + w_2x_2 + b y=w1x1+w2x2+b,如下图所示,


假定当前输入 x 1 x_1 x1 x 2 x_2 x2 的分布如图中圆点所示,本次更新的方向是将直线 H 1 H_1 H1 更新成 H 2 H_2 H2,但是当前面层的权重更新完毕,当前层输入的分布换成了另外一番样子,直线相对输入分布的位置可能变成了 H 3 H_3 H3,下一次更新又要根据新的分布重新调整

1.1.2. Internal Covariate Shift

深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,每一层的参数更新都会导致上层的输入数据在输出时分布规律发生了变化,并且这个差异会随着网络深度增大而增大 —— 这就是 Internal Covariate Shift

每个神经元的输入数据不再是独立同分布的了,会导致如下问题:

  • 上层参数需要不断适应新的输入数据分布,降低学习速度
  • 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区。反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因 —— 梯度消失

1.1.3. Whitening

所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布

白化过程就是对数据进行如下的操作:

  • 去除数据之间的关联性,使之满足独立这个条件
  • 使得特征具有相同的均值和方差,就是同分布

之前的研究表明如果在图像处理中对输入图像进行白化(Whiten)操作的话,那么神经网络会较快收敛。

BN 作者就开始尝试:图像是深度神经网络的输入层,做白化能加快收敛,那么其实对于深度网络来说,其中某个隐层的神经元是下一层的输入,意思是其实深度神经网络的每一个隐层都是输入层,不过是相对下一层来说而已,那么能不能对每个隐层都做白化呢?

这就是启发BN产生的原初想法,而 BN 也确实就是这么做的,可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作

1.2. Definition

Batch Normalization,简称 BatchNormBN,翻译为批归一化,是神经网络中一种特殊的层,如今已是各种流行网络的标配。在原论文中,BN 被建议插入在(每个)ReLU 激活层前面,如下所示:


BN 的基本思想:

  • 因为深层神经网络在做非线性变换前的激活输入值(对于计算公式 x = W U + B x = WU + B x=WU+B U U U 是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动
    • 之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于 Sigmoid 函数来说,意味着激活输入值 W U + B WU + B WU+B 是大的负值或正值)
    • 这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因
  • BN 就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为 0 0 0 方差为 1 1 1 的标准正态分布
    • 就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,
    • 即让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度

1.3. Calculation process

1.3.1. Forward propagation

如果 batch size 为 m m m,则在前向传播过程中,网络中每个节点都有 m m m 个输出,所谓的 Batch Normalization,就是对该层每个节点的这 m m m 个输出进行归一化再输出,具体计算方式如下:

其操作可以分成2步,

  1. Standardization:首先对 m m m m m m 进行 Standardization,得到 zero mean unit variance 的分布 x ^ \\hatx x^
  2. scale and shift:然后再对 x ^ \\hatx x^ 进行 scale and shift,缩放并平移到新的分布 y y y,具有新的均值 β \\beta β 方差 γ \\gamma γ

假设BN层有 d d d 个输入节点,则 x x x 可构成 d × m d \\times m d×m大小的矩阵 X X XBN 层相当于通过行操作将其映射为另一个 d × m d \\times m d×m 大小的矩阵 Y Y Y,如下所示:


将 2 个过程写在一个公式里如下:


其中, x i ( b ) x^(b)_i xi(b)表示输入当前 batch b − t h b-th bth 样本时该层 i − t h i-th ith 输入节点的值, x i x_i xi [ x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( m ) ] [x_i^(1), x_i^(2), \\cdots, x_i^(m)] [xi(1),xi(2),,xi(m)] 构成的行向量,长度为 batch size m m m μ \\mu μ σ \\sigma σ 为该行的均值和标准差, ϵ \\epsilon ϵ 为防止除零引入的极小量(可忽略), γ \\gamma γ β \\beta β 为该行的 scaleshift 参数,可知

  • μ \\mu μ σ \\sigma σ 为当前行的统计量,不可学习
  • γ \\gamma γ β \\beta β 为待学习的 scaleshift 参数,用于控制 y i y_i yi 的方差和均值
    • 上文说过经过这个变换后某个神经元的激活 x x x 形成了均值为 0 0 0,方差为 1 1 1 的正态分布,目的是把值往后续要进行的非线性变换的线性区拉动,增大导数值,增强反向传播信息流动性,加快训练收敛速度
    • 但是这样会导致网络表达能力下降,为了防止这一点,每个神经元增加两个调节参数(scaleshift),这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强
  • BN 层中, x i x_i xi x j x_j xj 之间不存在信息交流 ( i ≠ j ) (i \\neq j) (i=j)

可见,无论 x i x_i xi 原本的均值和方差是多少,通过 BatchNorm 后其均值和方差分别变为待学习的 β \\beta β γ \\gamma γ

下图给出了一个计算均值 μ B \\mu_\\mathcalB μB 和方差 σ B 2 \\sigma_\\mathcalB^2 σB2 的示例:


上图展示了一个 batch size 为 2(两张图片)的 Batch Normalization 的计算过程

  • 假设 feature1、feature2 分别是由 image1、image2 经过一系列卷积池化后得到的特征矩阵,feature 的 channel 为 2,
    • 那么 x ( 1 ) x^(1) x(1) 代表该 batch 的所有 feature 的 channel1 的数据,
    • 同理 x ( 2 ) x^(2) x(2) 代表该batch的所有 feature 的 channel2 的数据
  • 然后分别计算 x ( 1 ) x^(1) x(1) x ( 2 ) x^(2) x(2) 的均值与方差,得到我们的 μ B \\mu_\\mathcalB μB σ B 2 \\sigma_\\mathcalB^2 σB2 两个向量
    • 然后再根据标准差计算公式分别计算每个 channel 的值(公式中 ϵ \\epsilon ϵ 的是一个很小的常量,防止分母为零的情况)。
  • 在我们训练网络的过程中,我们是通过一个 batch 一个 batch 的数据进行训练的,但是我们在预测过程中通常都是输入一张图片进行预测,此时 batch size 为 1,如果再通过上述方法计算均值和方差就没有意义了
    • 所以我们在训练过程中要去不断的计算每个 batch 的均值和方差,并使用移动平均(moving average) 的方法记录统计的均值和方差,在训练完后我们可以近似认为所统计的均值和方差就等于整个训练集的均值和方差。
  • 然后在我们验证以及预测过程中,就使用统计得到的均值和方差进行标准化处理

1.3.2. Reverse propagation

对于目前的神经网络计算框架,一个层要想加入到网络中,要保证其是可微的,即可以求梯度

反向传播求梯度只需抓住一个关键点,如果一个变量对另一个变量有影响,那么他们之间就存在偏导数,找到直接相关的变量,再配合链式法则,公式就很容易写出了,如下所示:


根据反向传播的顺序,首先求取损失

以上是关于CV:Batch normalization的主要内容,如果未能解决你的问题,请参考以下文章

批量归一化Batch Normalization 动手学深度学习v2

深度学习之 BN(Batch Normalization)批归一化

CV:Batch normalization

Batch Normalization

深度学习笔记Batch Normalization 以及其如何解决梯度消失问题

深度学习中batch normalization