大语言模型的终极之路
  • 大语言模型的终极之路
  • 更新计划
  • 大语言模型时代的NLP
    • 任务与评测
    • 参考资料
  • 基础知识
    • 负对数似然
    • Transformer
      • Cross Attention
      • 向量流动视角
      • Layer Normalization
      • Attention Block
    • 优化算法
      • 牛顿法
      • 梯度下降
  • 大语言模型
    • 大模型理论
      • Scaling Law
      • The Bitter Lesson
      • 思考,快与慢
    • 模型结构
      • MLP
      • Rotary Embedding
      • RMSNorm
      • Encoder-decoder
      • Decoder-only
      • MOE
      • 常见大模型
        • T5
        • GPT2
        • LLaMA
        • LLaMA 2
        • Mistral
        • GLM
        • Mixture
    • 如何训练一个ChatGPT
    • 微调
      • Instruction Tuning 指令微调
      • Domain Finetune 领域微调
    • 解码
      • 温度采样
      • Beam Search Decoding
  • Prompt 工程
    • Prompt, 一种技术路线
    • Prompt 写作规范
    • In-Context Learning
    • Chain-of-Thought
    • Generate Rather than Read
    • Program-of-Thought
    • Tree-of-Thought
    • 参考资料
  • 知识与幻觉
    • 知识边界
  • 大规模预训练
    • 计算资源消耗
    • Deepspeed
    • Megatron
    • 大规模数据处理
    • CUDA 算子优化
  • 强化学习
    • RLHF
      • RLHF
  • 大模型轻量化
    • 蒸馏
      • 黑盒蒸馏
      • 白盒蒸馏
        • KL 散度
    • 轻量化微调
      • LoRA
    • 量化
    • 剪枝
    • 推理加速
    • 参考资料
  • RAG-大模型检索
    • Page 3
  • 多智能体
    • Page 6
  • 多模态大模型
    • Page 1
  • 大模型安全与鲁棒
由 GitBook 提供支持
在本页
  1. 大语言模型
  2. 模型结构

RMSNorm

RMSNorm

LlamaRMSNorm 是一种用于深度学习模型的归一化方法,类似于 T5 中的 LayerNorm,但实现上有一些差异。它的主要目的是将输入特征归一化,使其在训练过程中更加稳健,尤其是在处理深层神经网络时。我们通过伪代码和公式来解释其实现原理。

公式解释

LlamaRMSNorm 中的主要步骤包括计算输入张量的平方均值(RMS),然后将其根倒数乘以输入张量进行归一化,最后再乘以一个可学习的参数向量。

公式步骤如下:

  1. 计算 RMS (Root Mean Square): RMS(x)=1d∑i=1dxi2 \text{RMS}(x) = \sqrt{\frac{1}{d} \sum_{i=1}^{d} x_i^2} RMS(x)=d1​∑i=1d​xi2​​ 其中 ( x ) 是输入张量,( d ) 是张量的最后一个维度的大小。

  2. 归一化: [ \hat{x} = \frac{x}{\text{RMS}(x) + \epsilon} ] 其中 ( \epsilon ) 是一个小值,用于防止除零错误。

  3. 缩放: [ y = \hat{x} \cdot g ] 其中 ( g ) 是一个可学习的参数向量。

伪代码

class LlamaRMSNorm(nn.Module):
    def __init__(self, hidden_size, eps=1e-6):
        """
        初始化
        参数:
        - hidden_size: 特征大小,即张量最后一个维度的大小
        - eps: 防止除零错误的常数,默认值为1e-6
        """
        super().__init__()
        # 初始化可学习参数,初始值为1
        self.weight = nn.Parameter(torch.ones(hidden_size))
        self.variance_epsilon = eps

    def forward(self, hidden_states):
        """
        前向传播
        参数:
        - 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)

解释

  • 初始化:

    • self.weight 是一个可学习的参数向量,初始化为全1。

    • self.variance_epsilon 是一个很小的常数,用于防止除零错误。

  • 前向传播:

    1. 获取输入张量的类型,并将其转换为 torch.float32。

    2. 计算输入张量的平方均值(variance)。

    3. 计算根均值的倒数并乘以输入张量以归一化。

    4. 将结果乘以可学习参数向量 self.weight。

    5. 将结果转换回输入张量的原始数据类型并返回。

通过上面的伪代码和公式解释,你可以理解 LlamaRMSNorm 是如何通过计算每个特征维度的平方均值来实现归一化的,这种归一化方法可以提升训练过程的稳定性,特别是在处理深层神经网络时。

上一页Rotary Embedding下一页Encoder-decoder

最后更新于11个月前