Batch Normalization (BN) 介绍

举报
冰糖柠萌 发表于 2019/09/26 16:12:01 2019/09/26
【摘要】 Batch Normalization(BN)解决的是Internal Covariate Shift (ICS)的问题。Internal Covariate Shift在文中定义为The change in the distribution of network activations due to the change in network parameters during train...

Batch Normalization(BN)解决的是Internal Covariate Shift (ICS)的问题。

Internal Covariate Shift在文中定义为
The change in the distribution of network activations due to the change in network parameters during training.

也就是在训练的过程中因为网络参数改变引起网络各层输出的分布改变。

Internal Covariate Shift分为两个部分,Internal和Covariate Shift。

  1. Covariate Shift。Covariate Shift 指在有监督学习中,对训练数据集X_s和测试数据集X_t,边际分布不一致,即P(x_s)\neq P(x_t),但条件分布一致P(y|x_s)= P(y|x_t)。通过domain adaptation的方法解决。参考 https://www.quora.com/What-is-Covariate-shift

  2. Internal。注意在网络中前一层的输出是下一层的输入。对某一中间层而言,在训练的过程中,因为前面层的参数不断变化,输出分布变化,对该层的输入分布也不断变化。

对某一中间层而言,输入的分布不断改变,需要不断适应新的分布,学习效率也就不高。

BN希望固定网络的各层输入的分布,以加快训练速度。


白化(whitening)模型的输入可以使得训练收敛更快。神经网络时多层的结构,考虑白化神经网络中各层的输入。

对mini-batch做Normalization

对整个数据集做白化复杂度很高,BN做了两个必要的化简:

  1. instead of whitening the features in layer inputs and outputs jointly, we will normalize each scalar feature independently, by making it have the mean of zero and the variance of 1.

  2. since we use mini-batches in stochastic gradient training, each mini-batch produces estimates of the mean and variance of each activation.

对一个d维的输入x,对每一维分别标准化。比如对第k维

,这里对均值和方差都是从mini-batch求的。

注意到简单地对某个层的输入做标准化会改变这个层地表示。为了解决这个问题,BN对每个激活值引入两个参数,分别做scale和shift,思想是allows the BN transform to represent the identity transformation and preserves the network capacity
(感觉类似于resnet)。即

完整的Batch Normalizing Transform 如下图

反传时的梯度,使用链式法则chain rule求取

测试阶段的BN

测试时,BN的均值和方差用的是训练时记录的。因为测试时均值和方差时固定的,BN层变为一个线性变换。

对卷积层做BN

对conv层的BN和对fc层的BN不同,因为filter在图像上移动,filter weight是整个图像共用的。

为了保持卷积的性质,在conv层中,对同一个feature map不同位置的元素,一起做normalization。比如输入维度[N, C, W, H],那么对N*W*H个元素一起求均值和方差,也就是会有C个均值和方差。

参考 https://stackoverflow.com/questions/38553927/batch-normalization-in-convolutional-neural-network

BN使得可以用较大的学习率训练

通常,大学习率会增大参数,进而增大后续计算的梯度,引起模型爆炸。采用BN层,可以使梯度反传不受参数规模影响。

具体而言,假设有一个标量a,对BN层有
\text{BN}(Wu)=\text{BN}((aW)u)
即,经过BN处理后的输出,不受标量a影响。所以有

  1. \frac{\partial \text{BN}((aW)u)}{\partial u}=\frac{\partial \text{BN}(Wu)}{\partial u},即,标量a不影响反传的梯度。

  2. \frac{\partial \text{BN}((aW)u)}{\partial (aW)}=\frac{1}{a}\frac{\partial \text{BN}(Wu)}{\partial W},即,大的参数会引起小的梯度。

两个结论公式都可以通过导数是输出对输入的变化率简单得到。


Reference:
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
深度学习中 Batch Normalization为什么效果好?


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。