老学庵

天行健,君子以自强不息;地势坤,君子以厚德载物!

0%

LLM之模型训练Tricks

  学习LLM过程中的经典策略记录。

Causal mask

  Causal mask是自注意力机制中的一种掩码。在自注意力机制中,每个位置的输出都依赖于序列中所有位置都输入,包括当前位置之后的位置。这种机制在解码器中特别常见,因为解码器在生成输出时必须按顺序依次生成。但是在预测时,未来显然是不可见的,所以需要在每个位置处将未来的位置的信息屏蔽,这种屏蔽的方式也就是Causal mask。它保证了解码器在生成时,只是基于历史信息,而不是未来的信息。

  通常情况下,Causal mask是一个二维矩阵,该矩阵对角线以下的元素全为1,表示允许当前位置之前的信息流动,而对角线以上的元素都为0,表示屏蔽了当前位置之后的信息。在使用 Transformer 架构进行序列到序列任务时,常见的做法是在解码器的自注意力层中应用这种 causal mask,以确保生成的序列是自左向右生成的。

为什么在LLM模型预训练时,计算交叉熵损失函数时需要loss mask

  在自回归训练中,模型需要根据前\(n-1\)个Token预测第\(n\)个Token。此时,输入序列为\(X = [x_1,x_2,...,x_{n-1}]\),目标序列为\(Y= [y_1,y_2,...,y_m] \quad m \geq n\),掩码规则为仅对目标序列中与当前预测位置匹配的Token计算损失(如第\(i\)个预测位置仅计算\(y_i\)的损失,其他位置(包括填充Token)设为0,不参与损失计算. 其主要作用如下:

  • 忽略无效Token

      预训练数据通常包含填充(Padding)标记或特殊符号(如),这些位置的真实值对模型无意义。若不加掩码,模型会错误学习生成这些无效Token,导致训练效率下降。

  • 聚焦有效生成

      通过掩码选择性计算损失,模型仅关注实际需要生成的Token(如自回归任务中预测下一个Token),避免被无关信息干扰。

  • 保持损失归一化

      掩码确保不同批次、不同长度序列的损失计算公平,避免填充Token拉低整体损失值

深度学习中常用归一化技术

  归一化技术在深度学习中常用于对输入数据进行标准化处理的方法,归一化技术本质上是将输入空间映射到一个规范化空间的过程,此映射的常见形式如下:

  • Min-Max

    \[\bar{x} = \dfrac{x-x_{min}}{x_{max} - x_{min}}\]

  将数据缩放到\([0,1]\)范围,适用于数据分布已知且无异常值的请况。

  • Z-Score

    \[\bar{x} = \dfrac{x - \mu}{\delta}\]

\[\mu = \frac{1}{m} \sum_{i=1}^{m} x_i, \quad \sigma^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu)^2\]   将数据转换为均值为0,标准差为1的分布,适用于数据服从正态分布的情况

  在实际使用中,会针对性的做一些调整以适应不同任务,不同场景,主要有Batch Norm、Layer Norm、RMS Norm等:

  • Batch Norm

      对每个特征通道(如图像的RGB通道)在批量数据上计算均值和方差,通过标准化和平移/缩放参数调整分布,公式如下:

    \[y = \gamma \cdot \dfrac{x-\mu}{\sqrt{\sigma^2 + \epsilon}} + \beta\]

  • Layer Norm

      对单个样本的所有特征维度(如序列模型的每个token向量)计算均值和方差,实现跨样本的归一化,公式同上,只是针对的输入不同

  • RMS Norm

      LayerNorm的变体,仅计算均方根(RMS)替代均值和方差,去除平移参数\(\beta\),简化计算,公式如下:

    \[y = \gamma \cdot \dfrac{x-\mu}{\sqrt{RMS(x)^2 + \epsilon}}\]

    其中 \[RMS(x) = \sqrt{\frac{1}{N}\sum_{i = 1}^Nx_i^2}\]

在深度学习中归一化技术有如下意义:

  • 提高训练速度

    • 归一化可以使不同特征的数值范围相近,避免某些特征值过大或过小,影响梯度更新,导致训练过程缓慢。
    • 通过减少梯度下降的震荡,使优化过程更稳定,加快收敛速度。
  • 防止梯度消失或梯度爆炸

    • 归一化可以保持数据分布的稳定性,防止某些层的输入值过大或过小,从而避免梯度消失或梯度爆炸问题,尤其是在深层网络中。
  • 提高模型的泛化能力

    • 归一化可以减少特征对不同尺度的依赖,使模型对输入数据的变化更具鲁棒性,提高泛化能力,降低过拟合风险。
  • 减少不同特征之间的影响

    • 由于不同特征的尺度不同,模型可能会过度依赖某些大数值特征,导致训练过程不稳定。归一化后,各特征的权重分布更加均衡,提高模型的稳定性。

归一化技术对比如下:

方法 典型应用场景 核心优势 局限性
Batch Norm 图像分类(CNN)、小批量训练场景 加速收敛、降低初始化敏感度 对批量大小敏感,无法处理序列数据(如NLP)
Layer Norm 自然语言处理(如BERT、GPT)、RNN、长序列模型 适应动态批量、保持序列位置不变性 计算开销较大,对噪声敏感
RMS Norm 超大规模语言模型(如LLaMA、DeepSeek)、高精度工业检测 计算高效、数值稳定性强、减少梯度爆炸风险 无法处理均值敏感任务(如某些CV任务)

  需要注意的是,在训练和推理阶段,Batch Norm的处理方式是截然不同的。

  • 训练阶段

      在训练阶段,BN会计算每个批次的均值和方差,同时维护全局均值和全局方差,并使用滑动平均来进行更新:

    \[ \begin{cases}\mu_g = \alpha \mu_g + (1 - \alpha)\mu_{b} \\ \delta_g^2 = \alpha \delta_g^2 + (1-\alpha)\delta_b^2 \end{cases}\] 其中\(\alpha\)为平滑系数。

  • 推理阶段

      在推理阶段,会直接使用训练阶段得到的全局均值\(\mu_g\),全局方差\(\delta_g^2\)进行数据归一化,确保输入数据特征分布的一致性,同时保证模型在推理阶段的稳定性。

  因此在进行模型推理时,若使用原生pytorch,在推理前,需调用模型的eval()方法,将模型设置为推理模式,以确保在使用BN的模型推理场景,能正确使用训练阶段的全局均值和方差。对于使用非BN标准化方法的场景,如LN,RN,IN,GN等在训练和推理时都是采用各自当前的均值和方差,但是也要在推理前将模型设置为推理模式,因为Dropout算法在训练和推理阶段也是完全不同的,在推理阶段,Dropout是静默的,随机冻结参数的比例为0。若使用第三方推理框架,如OnnxRuntime、TensorRT等,在使用torch到处模型参数前,也需要将模型设置为推理模式。

大模型构建流程

  根据OpenAI联合创始人Andrej Karpathy在微软Build 2023大会上公开的信息,OpenAI使用的大模型构建流程如下图所示,主要包括以下四个阶段: