在神经网络中,第lll层隐藏层的输入就是第l−1l-1l−1层隐藏层的输出A[l−1]A^{[l-1]}A[l−1]。对A[l−1]A^{[l-1]}A[l−1]进行标准化处理,从原理上来说可以提高W[l]W^{[l]}W[l]和b[l]b^{[l]}b[l]的训练速度和准确度。这种对各隐藏层的标准化处理就是Batch Normalization。一般是对Z[l−1]Z^{[l-1]}Z[l−1]进行标准化处理而不是A[l−1]A^{[l-1]}A[l−1]
Batch Normalization对第lll层隐藏层的输入Z[l−1]Z^{[l-1]}Z[l−1]做如下标准化处理,忽略上标[l−1][l-1][l−1]:
m是单个mini-batch包含样本个数,ε是为了防止分母为零,可取值10−810^{-8}10−8。使得该隐藏层的所有输入z(i)z^{(i)}z(i)均值为0,方差为1
大部分情况下并不希望所有的z(i)z^{(i)}z(i)均值都为0,方差都为1,也不太合理。通常需要对z(i)z^{(i)}z(i)进行进一步处理:
γ\gammaγ和β\betaβ是learnable parameters,可以通过梯度下降等算法求得。γ\gammaγ和β\betaβ是让z~(i)\tilde z^{(i)}z~(i)的均值和方差为任意值,只需调整其值。如:
则z~(i)=z(i)\tilde z^{(i)}=z^{(i)}z~(i)=z(i),即identity function。设置γ\gammaγ和β\betaβ为不同的值,可以得到任意的均值和方差
通过Batch Normalization,对隐藏层的各个z[l](i)z^{[l](i)}z[l](i)进行标准化处理,得到z~[l](i)\tilde z^{[l](i)}z~[l](i),替代z[l](i)z^{[l](i)}z[l](i)
输入的标准化处理Normalizing inputs和隐藏层的标准化处理Batch Normalization是有区别的。Normalizing inputs使所有输入的均值为0,方差为1。而Batch Normalization可使各隐藏层输入的均值和方差为任意值。从激活函数的角度来说,如果各隐藏层的输入均值在靠近0的区域即处于激活函数的线性区域,这样不利于训练好的非线性神经网络,得到的模型效果也不会太好
Last updated 6 years ago