批量归一化的基本动机
神经网络训练过程的本质是学习数据分布,然而随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之改变,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。
批量归一化可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。
批量归一化(Batch Normalization)
批量归一化方法是针对每一批数据,在网络的每一层输入之前增加归一化处理(均值为0,标准差为1),将所有批数据强制在统一的数据分布下;
即对该层的任意一个神经元(假设为第 k k k维) x ‾ k \overline{x}^k xk采用如下公式:
x ‾ k = x k − E [ x k ] V a r [ x k ] \overline{x}^k=\frac{x^k-E[x^k]}{\sqrt {Var[x^k]}} xk=Var[xk]xk−E[xk] ,
其中 x k x^k xk为该层第 k k k个神经元的原始输入数据, E [ x k ] E[x^k] E[xk]为这一批输入数据在第 k k k个神经元的均值, V a r [ x k ] \sqrt {Var[x^k]} Var[xk]为这一批数据在第 k k k个神经元的标准差。
批量归一化的局限
由于归一化之后的输入分布被强制为0均值和1标准差,批量归一化同时也降低了模型的拟合能力。以Sigmoid激活函数为例,批量归一化之后数据整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布。
为了恢复原始数据分布,具体实现中引入了变量重构以及可学习参数
γ
\gamma
γ和
β
\beta
β:
y
k
=
γ
k
x
‾
k
+
β
k
y^k=\gamma^k\overline{x}^k+\beta^k
yk=γkxk+βk ,其中
γ
\gamma
γ和
β
\beta
β分别为输入数据分布的方差和偏差。
对于一般的网络,不采用批量归一化操作时, γ \gamma γ和 β \beta β两个参数高度依赖前面网络学习到的连接权重(对应复杂的非线性);而在批量归一化操作中, γ \gamma γ和 β \beta β变成了该层的学习参数,仅用两个参数就可以恢复最优的输入数据分布,与之前网络层的参数解耦,从而更加有利于优化的过程,提高模型的泛化能力。
批量归一化应用于卷积神经网络
-
完整的归一化前向传导过程公式:
μ b ← 1 m ∑ i = 1 m x i \mu_b←\frac{1}{m}\sum_{i=1}^mx_i μb←m1∑i=1mxi ,
σ b 2 ← 1 m ∑ i = 1 m ( x i − μ b ) 2 \sigma_b^2←\frac{1}{m}\sum_{i=1}^m(x_i-\mu_b)^2 σb2←m1∑i=1m(xi−μb)2 ,
x ‾ i ← x i − μ b σ b 2 + ϵ \overline{x}_i←\frac{x_i-\mu_b}{\sqrt {\sigma_b^2+\epsilon}} xi←σb2+ϵxi−μb ,
y i ← γ x ‾ i + β ≡ B N γ , β ( x i ) y_i←\gamma\overline{x}_i+\beta≡BN_{\gamma,\beta}(x_i) yi←γxi+β≡BNγ,β(xi) ,
-
考虑卷积神经网络的参数共享机制
每一个卷积核的参数在不同位置的神经元当中是共享的,因此也应该被一起归一化。
具体实现中,假设网络训练中每一批包含 b b b个样本,由一个卷积核生成的特征图的宽高分别为 w w w和 h h h,则每个特征图所对应的全部神经元个数为 b ∗ w ∗ h b*w*h b∗w∗h;利用这些神经元对应的所有输入数据,根据一组待学习的参数 γ \gamma γ和 β \beta β对每个输入数据进行批量归一化操作。如果有 f f f个卷积核,就对应 f f f个特征图和 f f f组不同的 γ \gamma γ和 β \beta β参数。