training-llm
LLM-training / Algorithm Basics
最近做了一点训练,发现对 LLM 最基本的一些东西已经有点遗忘了
--修改补充于26/5/6
Loss
loss 算是最基础的东西了,用来衡量模型的输出和 target 的距离,主要分为两类:
- classification loss (discrete):当你需要一个离散的值,比如 LLM 模型输出的 logits,是要从最后的词表里选出 1个 / k 个 结果,就需要用到分类损失
- 以
cross entropy为例,用来衡量分布之间的差别 KL散度,可以用来衡量蒸馏的指标
- 以
- regression loss (contiguous):当需要一个连续的值的时候(一个连续的标量/向量),需要用回归损失去衡量这个值和 target 的“距离”
MSE(Mean Square Error):L2 Loss的平均值,用的是平方和MAE(Mean Absolute Error):L1 Loss的平均值
Optimize
从基本的凸优化开始讲起,虽然深度学习因为有很多 non-linear 的层破坏了凸性,但是凸优化的很多思想得以保留,比如gradient descent和Newton method
梯度下降就是简单有效的往梯度的反方向走,它只提供了一个方向,需要决定使用什么样的步长也就是学习率 lr,公式就是
而牛顿法则是加入了
Optimizer
Optimizer(优化器) 的职责是根据反向传播得到的梯度(),决定如何更新模型的参数
以下是几种最常见的优化器及其数学原理:(是学习率,是梯度)
1. SGD (Stochastic Gradient Descent, 随机梯度下降)
这是最基础的优化器,应该也是历史上出现的最早的一个优化器?它直接沿着梯度的反方向前进
-
数学原理:
其中 是学习率, 是当前步的梯度。
-
优缺点: 简单,但由于它是利用每个 Batch 计算梯度,更新路径会非常曲折(震荡严重),且容易陷入局部最优解或鞍点
2. SGD with Momentum (动量梯度下降)
为了解决 SGD 的震荡问题,动量法引入了一个“惯性”的概念;它不仅考虑当前梯度,还考虑之前的运动方向。
-
数学原理:
-
计算动量项:
-
更新参数:
其中 (通常取 0.9)是动量因子
-
-
直观理解: 当前运动的方向和梯度一致的时候,动量项在梯度的基础上就会加上之前的运动方向,相当于多了一个bonus;而当两个方向不一致的时候,相当于进入了一个震荡状态,这个时候就要给他一个penalty,防止他去做多余的震荡
3. AdaGrad (Adaptive Gradient Algorithm)
AdaGrad 开始尝试自适应学习率。它的核心思想是:对于更新频繁的参数,减小其学习率;对于更新不频繁的参数,增大其学习率。
-
数学原理:
其中 是历史所有梯度平方的累加。
-
优缺点: 适合处理稀疏数据。但由于 是不断累加的正数,学习率的分母逐渐变大,梯度的系数会迅速衰减直至趋近于 0,导致后期训练提前停止
4. RMSProp
RMSProp 是为了解决 AdaGrad 学习率消失问题而提出的。它不再累加所有历史梯度,而是使用**指数移动平均(EMA)**来只保留最近的梯度信息。
-
数学原理:
-
计算平方梯度的均值:
-
更新参数:
这让优化器能够“忘记”很久以前的梯度,从而保持稳定的下降速度。
-
5. Adam (Adaptive Moment Estimation)
Adam 是目前 LLM 训练中最常用的优化器,它结合了 Momentum(一阶矩,控制方向)和 RMSProp(二阶矩,控制步长)的优点。
-
数学原理:
-
一阶矩(动量):
-
二阶矩(缩放):
-
偏差修正: 由于 和 初始化为 0,初期会偏向 0,需要修正:
-
更新参数:
-
6. AdamW (Adam with Weight Decay)
这是针对 Adam 的一个重要修正版。在 Adam 中,L2 正则化(Weight Decay)会被二阶矩 异常缩放,导致正则化效果失效。
- 核心改进: AdamW 将 权重衰减(Weight Decay) 从梯度更新中分离出来,直接作用在参数 上。
- 现状: 在 Transformer 和所有主流的大模型预训练/微调中,AdamW 是默认的