大模型--BN 批量正则化--33
1. 参考
详解归一化、标准化、正则化以及batch normalization
论文
Batch Normalization
BatchNorm层通常在激活函数之前应用。
它会自动计算每个特征
的均值和方差,并根据小批量数据的统计信息进行归一化处理,在使用时,需要注意训练与评估模式
的切换,
训练阶段,使用mini-batch的均值和方差,
评估模式(推理模式)下,会默认使用整个批次的均值和方差。
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc1 = nn.Linear(784, 256)
self.bn1 = nn.BatchNorm1d(256) # BatchNorm1d应用于全连接层输出
self.fc2 = nn.Linear(256, 10)
def forward(self, x):
x = torch.flatten(x, 1)
x = self.fc1(x)
x = self.bn1(x) # bn 用于激活函数之前
x = torch.relu(x)
x = self.fc2(x)
return x
理论
Batch Normalization由google在2015年提出,主要是为了解决深度神经网络训练过程中的内部协变量偏移
问题,同时有助于加速网络的收敛过程。
内部协变量偏移:
Internal Covariate Shift,在深度神经网络中,每一层的输入数据分布随着网络的训练而发生变化,这被称为内部协变量偏移。
这种变化可能导致每层需要不断适应前一层输出的分布变化,使得网络训练过程变得复杂和缓慢。
作用
首先,通过将特征数据的分布调整到标准正态分布,而在这分布下,激活函数的梯度比较大,能够完美解决梯度消失的问题;
其次,由于存在较大的梯度,能够加速模型的训练;
最后,由于数据被调整为比较标准的正态分布,模型能够学习到比较通用化的特征,屏蔽了距离正态分布中心较远的特征,避免了对离群特征点的使用,能够在一定程度上减弱过拟合。