Batch Normalization,顾名思义,批规范化,是深度学习中常用的一种训练优化方法。
BN 的目的
BN是为了解决covariate shift。 从字面上来看,就是相关变量漂移。在Google的论文"Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift"里 ,提到每次SGD时,通过mini-batch来对相应的activation做规范化操作,从而可以固定每层输入信号的均值与方差
covariate shift 是什么呢,在统计机器学习有一个经典假设,就是“源空间与目标空间的数据分布一致” ,如果不一致,需要用一些办法来解决。covariate shift就是这样一个问题。令 是训练集样本的概率密度分布函数,
是训练集样本的概率密度分布函数。通过在训练集上进行训练,我们最终得到一个
, 该函数由x 和 一组参数
决定。在传统机器学习上,通常假设训练集和测试集独立同分布。当
不再等于
时,我们称之为 covariate shift 。
由上面,我们易于看出,神经网络的确符合上面的定义。神经网络的多层输出,经过各网络层的变换,其每层的输出分布与输入分布是不一致的。然而它们所指向的都是同一个样本(即对于不同层的分布,
,
=
, 条件概率是一致的,其边缘概率不一样)
解决梯度消失,梯度爆炸,或者网络的收敛速度很慢,可以加入BN, 加快训练速度,提升模型精度
BN的具体变换过程
- 具体过程
下图表示得非常清楚。其中,
加入训练过程,学习得到。
BN变换过程
之所以最后要把,
加入到计算中去,是因为前面减去均值,除以方差之后,把输出会限制在正态分布内,使网络的表达能力变弱。我理解,
,
,是训练学习出来的均值和方差。BN,对不均一的数据进行归一化,用学习出来的
,
替换
-
如何训练
加入BN之后还是链式求导的法则。训练过程如下图表示
BN训练过程
需要注意的是,在训练过程中,上述用到的均值和方差是通过移动平均法得到的。在测试过程中,用的是整个样本集的均值和方差。
如何使用BN
用在非线性变换之前,即在线性变换之后,激活函数之前
tensorflow接口
在tensorflow中使用BN
tf.contrib.layers.batch_norm(
inputs,
decay=0.999, 用来求滑动平均的decay系数。(new_variable=decay×old_variable+(1−decay)×old_variable)
center, 在归一化后是否乘以上面所说的$\gamma$
scale, 在归一化后是否加上上文所说的$\beta$**
epison, 上面公式中的$\epsilon$,主要为了防止除以0
updates_collections, 指定更新操作,一般为None
is_traing, 上文所说,训练与测试计算方法不一样
)
还有一些参数暂时未用到,此处不展开
网友评论