批量归一化利用了小批量的平均值和方差,调整神经网络的中间输出。改善了因模型参数的更新造成的输出层输出的剧烈变化。
对全连接层做批量归一化
批量归一化层的输入是全连接层的输出,批量归一化层的输出是激活函数的输入。
对一批小批量做归一化,目标维度是批次,即求出的均值的形状是一个样本的形状,对每一个样本做标准化后得到的也是一个样本的形状。
引入可学习参数γ和β,与样本形状相同,分别与样本做按元素乘法和加法计算。
最终得到了批量归一化层的输出yi
在学习过程中,也存在批量归一化层不对样本造成任何变化的可能,即若样本经过批量归一化没有意义,可学习参数γ和β可令输出等于输入
对卷积层做批量归一化
同样,批量归一化层在卷积层后,激活函数前。
对卷积层的每个通道都做一次批量归一化,每个通道各自拥有可学习参数γ和β
批量归一化在训练和预测时的不同之处
训练时,可以将批量设置大一点,使得样本的均值和方差计算准确。
预测时,不适用训练时计算均值和方差的方法,使用移动平均估算整个训练数据样本均值和方差。
移动平均法能有效地消除预测中的随机波动
#对全连接层批量归一化时
#dim0是批量方向
mean = X.mean(dim=0)
var = ((X - mean) ** 2).mean(dim=0)
#对卷积层批量归一化时
#dim0是批量方向,dim1是通道方向,dim23是样本高宽,对0,2,3方向求平均,求得每个通道的均值
mean = X.mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
var = ((X - mean) ** 2).mean(dim=0, keepdim=True).mean(dim=2, keepdim=True).mean(dim=3, keepdim=True)
dim=True).mean(dim=3, keepdim=True)