目录
BN(batch normalization)
00 前言
论文:《
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
01 为什么需要批量归⼀化层呢?
训练深层神经⽹络是⼗分困难的,特别是在较短的时间内使他们收敛更加棘⼿。批量归⼀化(batch normalization)是⼀种流⾏且有效的技术,可持续加速深层⽹络 的收敛速度。再结合残差块,批量归⼀化使得研究⼈员能够训练 100 层以上的⽹络。
数据预处理的作用
数据预处理的⽅式通常会对最终结果产⽣巨⼤影响:
- 使⽤真实数据时,我们的第⼀步是标准化输⼊特征,使其平均值为0,⽅差为1。直观地说,这种标准化可以很好地与我们的优化器配合使⽤,因为它可以将参数的量级进⾏统⼀。
- 对于典型的多层感知机或卷积神经⽹络。当我们训练时,中间层中的变量(例如,多层感知机中的仿射变换输出)可能具有更⼴的变化范围:不论是沿着从输⼊到输出的层,跨同⼀层中的单元,或是随着时间的推移,模型参数的随着训练更新变幻莫测。批量归⼀化的发明者⾮正式地假设,这些变量分布中的这种偏移可能会阻碍⽹络的收敛。直观地说,我们可能会猜想,如果⼀个层的可变值是另⼀层的 100 倍,这可能需要对学习率进⾏补偿调整。
- 更深层的⽹络很复杂,容易过拟合。这意味着正则化变得更加重要。批量归⼀化应⽤于单个可选层(也可以应⽤到所有层),其原理如下:在每次训练迭代中,我们⾸先归⼀化输⼊,即通过减去其均值并除以其标准差,其中两者均基于当前小批量处理。接下来,我们应⽤⽐例系数和⽐例偏移。正是由于这个基于批量统计的标准化,才有了批量归⼀化的名称。
总结一句话就是,在进行训练的时候,对数据进行预处理,使其标准化,但是当数据经过一个卷积层之后,得到的feature map 可能会发生改变(不在是标准化的分布了,,
),于是我没就在每一次卷积之后进行批量的标准化。
02 如何批量归⼀化层?
注意:如果我们尝试使⽤⼤小为
1
的小批量应⽤批量归⼀化,我们将⽆法学到任何东西。这是因为在减去均值之后,每个隐藏单元将为 0
。所以,只有使⽤⾜够⼤的小批量,批量归⼀化这种⽅法才是有效且稳定的。请注意,在应⽤批量归⼀化时,批量⼤小的选择可能⽐没有批量归⼀化时更重要。
我们在⽅差估计值中添加⼀个小常量 ϵ > 0,以确保不会除以零,即使在经验⽅差估计值可能消失的情况下也是如此。由于理论上尚未明确表述的原因,优化中的各种噪声源通常会导致更快的训练和较少的过拟合:这种变化似乎是正则化的⼀种形式。
是用来调整数值分布的方差大小,
是用来调节数值均值的位置。这两个参数是在反向传播过程中学习得到的,
的默认值是1,
的默认值是0。
![\gamma](https://i-blog.csdnimg.cn/blog_migrate/b2b2fde0c5d66d9bb0cf41d710bf8577.gif)
![\beta](https://i-blog.csdnimg.cn/blog_migrate/6dbd45f6c0b67511494a8782ec5fc360.gif)
![\gamma](https://i-blog.csdnimg.cn/blog_migrate/b2b2fde0c5d66d9bb0cf41d710bf8577.gif)
![\beta](https://i-blog.csdnimg.cn/blog_migrate/6dbd45f6c0b67511494a8782ec5fc360.gif)
论文中给出了详细的计算公式
全连接层和卷积层,他们的批量归⼀化实现略有不同。
全连接层
我们将批量归⼀化层置于全连接层中的仿射变换和激活函数之间。
式中::激活函数;
:隐藏层;
卷积层
对于卷积层,我们可以在卷积层之后和⾮线性激活函数之前应⽤批量归⼀化。当卷积有多个输出通道时,我们需要对这些通道的“每个”输出执⾏批量归⼀化,每个通道都有⾃⼰的拉伸(scale
)和偏移(
shift)
参数,这两个参数都是标量。假设我们的微批次包含 m
个⽰例,并且对于每个通道,卷积的输出具有⾼度
p 和宽度 q
。那么对于卷积层,我们在每个输出通道的
m
·
p
·
q
个元素上同时执⾏每个批量归⼀化。因此,在计算平均值和⽅差时,我们会收集所有空间位置的值,然后在给定通道内应⽤相同的均值和⽅差,以便在每个空间位置对值进⾏归⼀化。
总结:
- 在模型训练过程中,批量归⼀化利⽤小批量的均值和标准差,不断调整神经⽹络的中间输出,使整个神经⽹络各层的中间输出值更加稳定。
- 训练时要将traning参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
- batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。
- 建议卷积层不要使用偏置bias,因为没有用,即使使用了偏置bias求出的结果也是一样的:
参考
李沐 《动手学深度学习》