文章

training-llm

#llm-training
本文目录 10

LLM-training / Algorithm Basics

最近做了一点训练,发现对 LLM 最基本的一些东西已经有点遗忘了

​ —修改补充于26/5/6

Loss

loss 算是最基础的东西了,用来衡量模型的输出和 target 的距离,主要分为两类:

  • classification loss (discrete):当你需要一个离散的值,比如 LLM 模型输出的 logits,是要从最后的词表里选出 1个 / k 个 结果,就需要用到分类损失
    • 以cross entropy为例,用来衡量分布之间的差别
    • KL散度,可以用来衡量蒸馏的指标DKL(P∥Q)=∑xP(x)log⁡Q(x)P(x)D_{KL}(P \parallel Q) = \sum_x P(x) \log \frac{Q(x)}{P(x)}
  • regression loss (contiguous):当需要一个连续的值的时候(一个连续的标量/向量),需要用回归损失去衡量这个值和 target 的“距离”
    • MSE(Mean Square Error):L2 Loss的平均值,用的是平方和
    • MAE(Mean Absolute Error): L1 Loss的平均值

Optimize

从基本的凸优化开始讲起,虽然深度学习因为有很多 non-linear 的层破坏了凸性,但是凸优化的很多思想得以保留,比如gradient descent和Newton method

梯度下降就是简单有效的往梯度的反方向走,它只提供了一个方向,需要决定使用什么样的步长也就是学习率 lr,公式就是θ=θ0−η∇fθ\theta = \theta_{0} - \eta \nabla f_{\theta}

而牛顿法则是加入了

Optimizer

Optimizer(优化器) 的职责是根据反向传播得到的梯度(∇θ\nabla \theta),决定如何更新模型的参数 θ\theta

以下是几种最常见的优化器及其数学原理:(η\eta是学习率,gtg_t是梯度)

1. SGD (Stochastic Gradient Descent, 随机梯度下降)

这是最基础的优化器,应该也是历史上出现的最早的一个优化器?它直接沿着梯度的反方向前进

  • 数学原理:

    θt+1=θt−η⋅gt\theta_{t+1} = \theta_t - \eta \cdot g_t

    其中 η\eta 是学习率,gtg_t 是当前步的梯度。

  • 优缺点: 简单,但由于它是利用每个 Batch 计算梯度,更新路径会非常曲折(震荡严重),且容易陷入局部最优解或鞍点

2. SGD with Momentum (动量梯度下降)

为了解决 SGD 的震荡问题,动量法引入了一个“惯性”的概念;它不仅考虑当前梯度,还考虑之前的运动方向。

  • 数学原理:

    1. 计算动量项:vt=γvt−1+ηgtv_t = \gamma v_{t-1} + \eta g_t

    2. 更新参数:θt+1=θt−vt\theta_{t+1} = \theta_t - v_t

      其中 γ\gamma(通常取 0.9)是动量因子

  • 直观理解: 当前运动的方向和梯度一致的时候,动量项在梯度的基础上就会加上之前的运动方向,相当于多了一个bonus;而当两个方向不一致的时候,相当于进入了一个震荡状态,这个时候就要给他一个penalty,防止他去做多余的震荡


3. AdaGrad (Adaptive Gradient Algorithm)

AdaGrad 开始尝试自适应学习率。它的核心思想是:对于更新频繁的参数,减小其学习率;对于更新不频繁的参数,增大其学习率。

  • 数学原理:

    θt+1=θt−ηGt+ϵ⋅gt\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot g_t

    其中 Gt=∑τ=1tgτ2G_t = \sum_{\tau=1}^t g_\tau^2 是历史所有梯度平方的累加。

  • 优缺点: 适合处理稀疏数据。但由于 GtG_t 是不断累加的正数,学习率的分母逐渐变大,梯度的系数会迅速衰减直至趋近于 0,导致后期训练提前停止

4. RMSProp

RMSProp 是为了解决 AdaGrad 学习率消失问题而提出的。它不再累加所有历史梯度,而是使用**指数移动平均(EMA)**来只保留最近的梯度信息。

  • 数学原理:

    1. 计算平方梯度的均值:E[g2]t=βE[g2]t−1+(1−β)gt2E[g^2]_t = \beta E[g^2]_{t-1} + (1-\beta)g_t^2

    2. 更新参数:θt+1=θt−ηE[g2]t+ϵ⋅gt\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot g_t

      这让优化器能够“忘记”很久以前的梯度,从而保持稳定的下降速度。


5. Adam (Adaptive Moment Estimation)

Adam 是目前 LLM 训练中最常用的优化器,它结合了 Momentum(一阶矩,控制方向)和 RMSProp(二阶矩,控制步长)的优点。

  • 数学原理:

    1. 一阶矩(动量): mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1)g_t

    2. 二阶矩(缩放): vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2

    3. 偏差修正: 由于 mtm_t 和 vtv_t 初始化为 0,初期会偏向 0,需要修正:

      m^t=mt1−β1t,v^t=vt1−β2t\hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t}

    4. 更新参数: θt+1=θt−η⋅m^tv^t+ϵ\theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}


6. AdamW (Adam with Weight Decay)

这是针对 Adam 的一个重要修正版。在 Adam 中,L2 正则化(Weight Decay)会被二阶矩 vtv_t 异常缩放,导致正则化效果失效。

  • 核心改进: AdamW 将 权重衰减(Weight Decay) 从梯度更新中分离出来,直接作用在参数 θ\theta 上。
  • 现状: 在 Transformer 和所有主流的大模型预训练/微调中,AdamW 是默认的