RMSNorm原理及代码

本文介绍了RMSNorm层归一化的原理,相比于批量归一化,它针对每个样本的不同特征进行归一化,LLaMA模型选择RMSNorm以减少计算量,加快训练速度。代码示例来自HuggingFace的Transformers库。
摘要由CSDN通过智能技术生成

RMSNorm原理及代码

在大模型中使用层归一化有如下几个因素:

  1. 改善网络稳定性
  2. 加速收敛速度
  3. 提高模型的泛化能力

批量归一化是对一个批次内的数据进行归一化
层归一化是对一个样本中的不同特征进行归一化

如下是LayerNorm与RMSNorm的公式
在这里插入图片描述
在LLaMA中使用RMSNorm替代LayerNorm,因为RMSNorm相比LayerNorm,不需要计算样本与均值的差(减少了计算量,加快了训练速度)
代码:

class LlamaRMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        LlamaRMSNorm is equivalent to T5LayerNorm
        """
        super().__init__()
        self.weight = nn.Parameter(torch.ones(hidden_size))  # 以hidden_size大小的全1张量初始化
        self.variance_epsilon = eps  # 给定一个很小的数,防止分母为0

    def forward(self, hidden_states):
        input_dtype = hidden_states.dtype
        hidden_states = hidden_states.to(torch.float32)
        variance = hidden_states.pow(2).mean(-1, keepdim=True)
        hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
        return self.weight * hidden_states.to(input_dtype)  # to(input_dtype)是为了保持数据类型

代码来源于:https://github.com/huggingface/transformers/tree/main/src/transformers/models/llama/modeling_llama.py

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值