手撕 Layer Norm(层归一化)

Happy-LLM:从零开始的大语言模型原理与实践教程.pdf P24

批归一化

Batch Normalization (BN) 

Mini-Batch 是指在训练模型时,每次迭代(更新参数)只使用数据集中的一部分样本(而不是全部数据或单个样本)。现代 GPU/TPU 适合处理矩阵运算,Mini-Batch 能充分利用硬件并行性。Batch Size (每个小批量的样本数量) 通常选 32、64、128 ,因为这些值是 2 的幂次,能更好地匹配硬件(如 GPU)的内存对齐需求,提高计算效率。

算法流程

批归一化的缺点

  1. 小 batch size 时,均值和方差的估计不准确,效果变差

  2. 不适用于变长序列任务,如 RNN 或 Transformer 中,句子长度可变,batch size 动态变化

  3. BN 需要为每个位置(token)单独保存和计算统计量,这在变长序列任务中可能导致内存爆炸(尤其是长文本)和计算效率低下

  4. 如果测试时的输入长度超过训练时的最大长度,则对于超出部分的 token 位置,BN 没有对应的训练统计量(均值和方差),导致无法归一化

BN不适用于动态的网络结构和RNN网络

层归一化

Layer Normalization

核心公式

N_{LN}=\gamma \cdot \frac{N-mean}{\sigma+\epsilon}+\beta

\gamma为缩放因子,初始全0;\beta为偏移因子,初始全1;\epsilon为防止分母为0的极小量

这里\gamma\frac{N-mean}{\sigma+\epsilon}的乘法是逐元素乘(哈得玛积)

手撕代码

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],方便进行逐元素计算。广播不会实际复制数据,而是通过逻辑上的虚拟扩展实现高效计算

参考文章

【CNN基础】一文读懂批归一化(Batch Normalization)_cnn模型batchnorm-CSDN博客https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/117988344

        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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值