Batch Normalization
参考:
【 深度学习李宏毅 】 Batch Normalization (中文)bilibili
7.5. 批量规范化 — 动手学深度学习 2.0.0 documentation (d2l.ai)
3.6 Batch Norm 为什么奏效?- 吴恩达_bilibili
《Batch Normalization_ Accelerating Deep Network Training by Reducing Internal Covariate Shift》
BN的作用
加速网络训练(加速收敛),同时起到了正则化(可以取代dropout层)的作用
BN具体做了什么?
训练阶段
BN基于随机梯度下降,在每一个Mini-Batch的基础上进行操作。在卷积层计算完成后,进行BN处理,将输出的分布归一化成标准正态分布,均值为0,方差为1,然后再接激活函数。
注意:\(\gamma\)和\(\beta\)不是超参数,而是可以训练的参数
测试阶段
测试阶段的均值、方差、γ、β是用训练阶段全局求出的
BN为什么能起作用?
直观理解:
与归一化输入特征值加速网络模型训练类似,输入特征存在0~1范围内的,也存在1 ~ 1000范围内的,将所有特征取值范围都转变成相似范围内可以加速网络模型的训练。
由于特征x1的取值范围远小于特征x2的取值范围,要使得特征x1对网络的贡献与特征x2相同,则权重w1必然要远大于w2,因此就得出了左图的代价函数Loss,相比于归一化之后w1与w2近似的趋近正圆形的Loss,后者更容易训练。
另一种理解:
经过批量归一化后,将每一层的输出集中在0附近(均值为0),对于sigmoid这样的饱和激活函数,可以改善梯度(远离饱和区),加快收敛。
pytorch如何使用BN
net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5), nn.BatchNorm2d(6), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.BatchNorm2d(16), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2), nn.Flatten(),
nn.Linear(256, 120), nn.BatchNorm1d(120), nn.Sigmoid(),
nn.Linear(120, 84), nn.BatchNorm1d(84), nn.Sigmoid(),
nn.Linear(84, 10))
nn.BatchNorm2d( C ),其中的参数C表示上一层输出的通道数,对于多通道二维图片,在通道的维度上取平均值和方差