Batch Normalization
深度学习中常用Normalization包括Batch Normalization, Layer Normalization, Instance Normalization等
,本文根据文章《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》内容理解Batch Normalization。
先验知识
文中提到,因为Network中的每一层的输出是下一层的输入,当输入乘上W以及加上b之后,在经过激活函数,它的分布其实发生了改变,这被称为covariate shift。covariate shift带来的问题是使得不同的层需要连续地适应新的分布。这不利于训练的收敛,通常会导致训练收敛速度变慢以及不收敛的问题,从而使得需要小心调整初始化策略以及学习率,以及需要drop put来防止过拟合。文中提到,在激活函数之前使用BN可以有效地减轻网络对初始化的依赖以及可以增大学习率来训练网络,同时可以remove掉drop out层,可谓是一举多得。
Batch Normalization公式
需要注意的是,BN层要加在激活函数之前,而不是激活函数之后,或者不是加在输入(激活函数后的tensor可以被视为是下一层的输入),文章的解释为:
BN的公式这里贴一下:
对每一个mini-batch做“白化”。
Inference时怎么用BN
特别注意,inference时,是用每一个mini-batch的均值和方差的期望当作inference时每一个sample"白化"的均值和方差!!!具体公式如下:
文章结果
下图是以MNIST数据集为例说明最后一层FC的输出,在经过sigmoid之前的值,在训练过程中的演变
下图是不同方法的准确度随着训练step的曲线,可以看到加了BN后,收敛速度明显加快