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,然后再接激活函数。

image-20230203212700107

注意:\(\gamma\)\(\beta\)不是超参数,而是可以训练的参数

测试阶段

测试阶段的均值、方差、γ、β是用训练阶段全局求出的

image-20230319203458065

BN为什么能起作用?

直观理解:

与归一化输入特征值加速网络模型训练类似,输入特征存在0~1范围内的,也存在1 ~ 1000范围内的,将所有特征取值范围都转变成相似范围内可以加速网络模型的训练。

image-20230203203508283

由于特征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表示上一层输出的通道数,对于多通道二维图片,在通道的维度上取平均值和方差

posted @ 2023-02-03 21:29  dctwan  阅读(23)  评论(0编辑  收藏  举报