批量归一化产生的问题1顶部层训练快底部层训练慢损失Loss 在网络的最顶端输出端反向传播时靠近损失的层顶层直接收到梯度信号更新快靠近输入的底部层梯度要经过多层链式法则反向传播容易出现梯度消失和衰减更新非常慢2底部层一变顶部层全部白学内部协变量偏移最终产生的问题导致收敛变慢批量归一化就是为了解决这类问题每个需要归一化的维度都有一对独立的可学习的参数(γ,β)训练时通过反向传播自动学习作用的位置1全连接层或卷积层输出上激活函数前2全连接层或卷积层输入上作用的维度1全连接层作用在“特征维”假设输入形状为 (batch_size, num_features)BN 在每个特征维度上跨 batch 计算均值和方差。2卷积层作用在“通道维”假设输入形状为 (batch_size, channels, height, width)在每个通道上跨 batch、跨空间位置H×W计算均值和方差归一化到底在做什么还是有争议的工程走在了理论前面归一化通过固定数据分布和平滑优化地形让深层网络的训练从在崎岖山路上摸索变成在平滑大道上奔跑可以使用更大的学习率可以加速收敛但是不改变模型的精度具体实现实现一个具有张量的批量规范化层X为输入gamma和beta为两个参数moving_mean和moving_var为全局数据的均值和方差eps和momentum都有一定的值momentum负责更新全局均值和方差训练时梯度计算开启with torch.enable_grad() 或默认状态需要实时计算当前 batch 的均值方差并更新滑动平均推理时通常在 torch.no_grad() 环境下不计算梯度直接用训练期累积的滑动平均做归一化X可能为全连接层或者为卷积层如果输入为全连接层输入输入 X 形状(batch_size, num_features)dim0在 batch 维度上求平均结果 mean 形状(num_features,...,) 每个特征一个均值如果输入为2D卷积层输入计算出预测得出的Xhat更新全局的moving_mean和moving_var根据公式返回封装实现类的设计模式函数Module封装管理参数丶设备丶状态丶生命周期【示例】用在LeNet模型上简明实现直接调包nn.BatchNorm2d