Skip to content

LLM 训练流程

大语言模型的训练通常分为三个阶段:预训练(Pre-training)、和基于人类反馈的强化学习(RLHF)。

2.2.1 预训练(Pre-training)

预训练是LLM训练的第一阶段,目标是让模型学习通用的语言表示和世界知识。

训练目标:下一个Token预测

预训练采用方式,目标是预测序列中的下一个token:

\(\mathcal{L}_{\text{pretrain}} = -\sum_{t=1}^{T} \log P(x_t | x_{<t}; \theta)\)

python
#   预训练伪代码
  for batch in dataloader:
        input_ids = batch['input_ids']       # [batch_size, seq_len]
        labels = batch['labels']           #   向右偏移一位的input_ids
        logits = model(input_ids)             # [batch_size, seq_len, vocab_size]
        loss = cross_entropy(logits, labels)


        loss.backward()
        optimizer.step()

预训练数据

数据源占比说明
Common Crawl60-80%网页数据,需要清洗
书籍/文学5-15%高质量长文本
Wikipedia3-5%百科知识
代码10-20%GitHub等代码库
学术论文2-5%ArXiv等

典型预训练配置

模型参数量训练Token数批次大小学习率训练时长
GPT-3175B300B3.2M0.6×10⁻⁴~数月
LLaMA-270B2T4M1.5×10⁻⁴~数月
GPT-4~1.8T~13T未知未知未知

Chinchilla Scaling Laws

DeepMind 的Chinchilla研究表明,模型参数量 \(N\) 和训练token数 \(D\) 应满足:

\(D \approx 20N\)

即对于给定计算预算,模型大小和数据量应该同时扩展。例如: - 70B参数的模型应该训练约1.4T tokens - 这与早期只关注参数量的做法不同

2.2.2 监督微调(Supervised Fine-Tuning, SFT)

预训练后的模型需要通过SFT学习遵循指令和完成任务的能力。

SFT数据格式

SFT数据通常采用对话格式

python

{
  "messages": [
    {"role": "system", "content": "你是一个有帮助的助手。"},
    {"role": "user", "content": "解释什么是机器学习。"},
    {"role": "assistant", "content": "机器学习是人工智能的一个分支..."}
  ]
}

训练目标

SFT只在assistant的回复上计算损失

\(\mathcal{L}_{\text{SFT}} = -\sum_{(x, y) \in \mathcal{D}} \sum_{t=1}^{|y|} \log P(y_t | x,y_{<t}; \theta)\)

python
def compute_sft_loss(model, batch):
           """
           只在assistant回复上计算损失
           """
           input_ids = batch['input_ids']
           labels = batch['labels']
           loss_mask = batch['loss_mask']      # 1 表示assistant回复的位置
           logits = model(input_ids)


           #   应用loss mask
           losses = F.cross_entropy(logits.view(-1, vocab_size), labels.view(-1),
           losses = losses * loss_mask.view(-1)


           return losses.sum() / loss_mask.sum()

SFT vs 预训练的关键区别

方面预训练SFT
数据量万亿级tokens十万到百万级样本
数据质量原始网页数据人工标注/高质量数据
训练目标无监督有监督
学习率较大 (~1e-4)较小 (~1e-5)
训练轮数1 epoch3-5 epochs

2.2.3 RLHF (人类反馈强化学习)

RLHF通过人类偏好数据进一步对齐模型行为,使其输出更符合人类期望。RLHF三阶段流程

奖励模型训练

对于偏好对 \((x, y_w, y_l)\),其中 \(y_w\) 是人类偏好的回复,\(y_l\) 是不偏好的回复:

\(\mathcal{L}_{\text{RM}} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log \sigma\left(r(x, y_w) - r(x,y_l)\right)\right]\)

PPO (Proximal Policy Optimization)

PPO 是RLHF中常用的优化算法,目标函数:

\(\mathcal{L}_{\text{PPO}} = \mathbb{E}_{(x, y)}\left[\min\left(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t\right)\right]\)

其中:

  • \(r_t(\theta) = \frac{\pi_\theta(y_t|x, y_{<t})}{\pi_{\theta_{\text{old}}}(y_t|x, y_{<t})}\)是重要性采样比率
  • \(\hat{A}_t\) 是优势函数估计
  • \(\epsilon\) 是裁剪参数(通常 0.1 或0.2)

KL散度约束

为了防止策略偏离SFT模型太远,加入KL散度惩罚:

\(\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{PPO}} - \beta \cdot \text{KL}(\pi_\theta |\pi_{\text{SFT}})\)

DPO(Direct Preference Optimization)

DPO是RLHF的替代方案,直接用偏好数据优化策略,无需显式训练奖励模型:

\(\mathcal{L}_{\text{DPO}} = -\mathbb{E}_{(x, y_w, y_l)}\left[\log \sigma\left(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)\right]\)

DPO 的优势:

  • 更简单,无需训练奖励模型
  • 训练更稳定
  • 计算开销更小

用心记录,持续成长