Happy-LLM:从零开始的大语言模型原理与实践教程.pdf P24
批归一化
Batch Normalization (BN)
Mini-Batch 是指在训练模型时,每次迭代(更新参数)只使用数据集中的一部分样本(而不是全部数据或单个样本)。现代 GPU/TPU 适合处理矩阵运算,Mini-Batch 能充分利用硬件并行性。Batch Size (每个小批量的样本数量) 通常选 32、64、128 ,因为这些值是 2 的幂次,能更好地匹配硬件(如 GPU)的内存对齐需求,提高计算效率。
算法流程
批归一化的缺点
-
小 batch size 时,均值和方差的估计不准确,效果变差
-
不适用于变长序列任务,如 RNN 或 Transformer 中,句子长度可变,batch size 动态变化
-
BN 需要为每个位置(token)单独保存和计算统计量,这在变长序列任务中可能导致内存爆炸(尤其是长文本)和计算效率低下
-
如果测试时的输入长度超过训练时的最大长度,则对于超出部分的 token 位置,BN 没有对应的训练统计量(均值和方差),导致无法归一化
BN不适用于动态的网络结构和RNN网络
层归一化
Layer Normalization
核心公式
为缩放因子,初始全0;
为偏移因子,初始全1;
为防止分母为0的极小量
这里和
的乘法是逐元素乘(哈得玛积)
手撕代码
class LayerNorm(nn.Module):
'''Layer Norm层'''
def __init__(self,features,eps=1e-6):
super(LayerNorm,self).__init__()
self.a_2=nn.Parameter(torch.ones(features))
self.b_2=nn.Parameter(torch.zeros(features))
self.eps=eps
def forward(self,x):
mean=x.mean(-1,keepdim=True)
std=x.std(-1,keepdim=True)
return self.a_2*(x-mean)/(std+self.eps)+self.b_2
易错点:Parameter 首字母要大写;zeros 是s不是es
例如x为形状为 [batch_size, seq_len, features] 的张量,-1表示在最后一个维度(特征维度)上计算mean(均值)和std(标准差)
x的形状为[bsz, max_len, features],mean和std的形状为[bsz,max_len,1],在mean和std的最后一个维度发生广播,形状变成[bsz, max_len, features],方便进行逐元素计算。广播不会实际复制数据,而是通过逻辑上的虚拟扩展实现高效计算
参考文章
Happy-LLM:从零开始的大语言模型原理与实践教程.pdf
Datawhale-学用AI,从此开始https://www.datawhale.cn/【深度学习中的批量归一化BN和层归一化LN】BN层(Batch Normalization)和LN层(Layer Normalization)的区别_bn和ln-CSDN博客
https://blog.csdn.net/m0_48086806/article/details/132153059一篇入门之-层归一化(Layer Normalization)是什么(含计算实例与代码示例)-老饼讲解
https://www.bbbdata.com/text/916老饼讲解主页-机器学习-BP神经网络-深度学习
https://www.bbbdata.com/