返回学习地图
llmPhase B · 第 13

2.6 LLM训练

预训练全流程:数据清洗/Tokenization/训练策略/分布式训练

7 个章节·按类别展开/折叠
知识

为什么需要预训练?——LLM的九年义务教育

预训练是LLM的九年义务教育。在模型学会回答问题之前,它必须先读遍天下书。

类比:学做饭。你不可能在学会切菜、认识食材之前,直接做出米其林大餐。预训练就是让模型先通过阅读海量文本,学会语言的基本规律。

核心目标:预测下一个词。当你读到今天天气很,你的大脑会猜出好、热、冷。预训练就是让模型在看了几千亿个词后,也能做这种预测。

数据规模:GPT-3在约5000亿token上训练。如果把这比作读书,GPT-3读的书比全人类历史加起来还多。

自回归语言建模:模型训练的目标是让P(第1个词) * P(第2个词|第1个词) * ... * P(第N个词|前面所有词)最大化。每个*表示并且。

参数表:

参数含义典型值太大/太小
参数数量(N)模型权重总数70B, 175B, 1.8T太大→难训练;太小→表达能力弱
训练token数(D)模型看到多少词1T, 2T, 14T太少→过拟合;太多→收益递减
学习率(lr)每次参数调整步长1e-4 ~ 3e-4太大→发散;太小→收敛极慢
批次大小每次更新看多少样本4M tokens太大→内存不够;太小→噪声大
上下文长度模型一次能看多长2048, 4096, 128K太长→显存爆炸;太短→无法处理长文
知识

数据清洗:质量比数量更重要

Garbage In, Garbage Out。用垃圾数据训练,模型就学会垃圾。1万亿高质量token可能比3万亿低质量token更好。

数据来源:Common Crawl(网页)、书籍(Books3/Gutenberg)、学术论文(arXiv)、代码(GitHub)、维基百科。

关键步骤:1.去重(MinHash算法,相似度>0.9→重复);2.语言过滤(fastText识别176种语言);3.质量过滤(困惑度过滤、删除重复行);4.隐私过滤(删除身份证号、电话、邮箱);5.毒性过滤(内容分类器打分>0.8→删除)。

参数表:

参数含义典型值太大/太小
重复阈值MinHash相似度0.80~0.95太大→漏重复;太小→误删
困惑度阈值低质量过滤线参考模型平均2倍太高→保留垃圾;太低→删除正常
毒性阈值有害内容删除线0.7~0.9太高→保留有害;太低→删除正常
代码比例代码占总数据比例10%~30%太高→像程序员说话;太低→编程弱
知识

分布式训练:当模型太大一台GPU放不下

为什么需要分布式训练?以GPT-3(1750亿参数)为例,每个参数用4字节(FP32),模型本身需要700GB内存。最强GPU(H100)只有80GB显存。一台绝对放不下。

类比:搬家。3000斤的钢琴,你一个人搬不动,需要10个朋友(10台GPU)一起搬。

数据并行:每台GPU保存完整模型副本。大batch分成小份,每台独立计算梯度,然后同步求平均。

模型并行:1.张量并行:把矩阵切成几块放不同GPU。2.流水线并行:把模型按层拆分,数据像流水线流过。3.3D并行:三种并行同时使用,总GPU数=4*8=32块。

ZeRO:DeepSpeed核心创新。分片存储优化器状态、梯度和参数。ZeRO-3配合CPU Offload,可以在消费级GPU训练百亿参数模型!

框架对比:DeepSpeed(微软,超大规模)、Megatron-LM(NVIDIA,GPU集群)、FSDP(PyTorch原生)、Colossal-AI(潞晨,国产芯片)。

公式

交叉熵损失

<p><b>预训练目标:让预测概率接近真实概率。</b></p><p><b>公式:</b>L = -(1/N) * Σᵢ log(P(yᵢ | y₁,...,yᵢ₋₁))</p><p><b>逐符号解释:</b></p><ul><li><b>L</b>:损失值,代表模型有多错。越大→越差;越小→越好。</li><li><b>-</b>:负号。log(概率)是负数,取负让结果变正。</li><li><b>1/N</b>:求平均。N是一句话的词数。</li><li><b>Σᵢ</b>:求和。对每个位置i计算损失后加起来。</li><li><b>log</b>:自然对数(以e为底)。</li><li><b>P(yᵢ | ...)</b>:在第i位置,模型给出正确词的概率。</li></ul><p><b>类比:猜谜游戏。</b>猜对概率0.01→log(0.01)≈-4.6→损失=4.6。猜对概率0.5→log(0.5)≈-0.69→损失=0.69。猜对概率0.99→log(0.99)≈-0.01→损失=0.01。</p><p><b>数值例子:</b>模型预测猫吃鱼,正确概率分别是0.5(猫)、0.7(吃)、0.9(鱼)。L = -(1/3)*[log(0.5)+log(0.7)+log(0.9)] = -(1/3)*[-0.693-0.357-0.105] = 0.385。</p><p><b>参数表:</b></p><table border="1"><tr><th>参数</th><th>含义</th><th>典型值</th><th>太大/太小</th></tr><tr><td>L</td><td>损失值</td><td>初期3~5,后期1.5~2.5</td><td>— 是训练结果</td></tr><tr><td>N</td><td>序列长度</td><td>512, 2048, 4096</td><td>太大→显存不足;太小→上下文不足</td></tr><tr><td>P(yᵢ)</td><td>正确词概率</td><td>后期0.3~0.5</td><td>不可能达1.0,但越接近越好</td></tr></table>
实例

例子:数据并行中的梯度同步

实例

场景:4块GPU,总batch=64,每块16个样本。模型只有一个权重w,初始值w=1.0。损失函数L(w)=(w-y)²。

前向传播:

GPU1: y=2 → 损失=(1-2)²=1 → 梯度=2(1-2)=-2
GPU2: y=3 → 损失=(1-3)²=4 → 梯度=2(1-3)=-4
GPU3: y=4 → 损失=(1-4)²=9 → 梯度=2(1-4)=-6
GPU4: y=5 → 损失=(1-5)²=16 → 梯度=2(1-5)=-8

梯度同步:总梯度=(-2)+(-4)+(-6)+(-8)=-20。平均梯度=-20/4=-5。

参数更新(学习率=0.1):w_new = 1.0 - 0.1*(-5) = 1.5。

验证:4块GPU的结果和单块GPU处理全部数据完全相同。

知识

训练策略:Warmup、衰减与梯度裁剪

1. Warmup(预热):训练开始时,模型参数随机初始化。此时大学习率会导致参数剧烈震荡。Warmup让学习率从0线性增加到目标值。Warmup步数=总步数的1%~5%。

2. 学习率衰减:Linear Decay(线性下降到0,GPT-3使用)、Cosine Decay(余弦曲线,LLaMA使用)、Step Decay(每N步减半)。

3. 梯度裁剪:如果梯度L2范数超过阈值,按比例缩小。公式:梯度 = 梯度 * (阈值 / ||梯度||)。典型阈值:1.0(GPT)~5.0。

4. 混合精度:前向/反向用FP16(快且省内存),参数更新用FP32(稳定)。维护FP32的主参数。

参数表:

参数含义典型值太大/太小
Warmup步数从0到目标学习率的步数总步数的1%~5%太多→浪费时间;太少→不稳定
最大学习率训练峰值学习率1e-4~6e-4太大→发散;太小→收敛极慢
梯度裁剪阈值最大允许梯度范数1.0~5.0太大→无保护;太小→严重限制学习
练习

练习:LLM训练

练习

Q1:模型预测我爱中国,正确概率0.5(我)、0.7(爱)、0.9(中国)。计算交叉熵损失和困惑度。

Q2:梯度向量[5,12,8],阈值=10。计算裁剪后的梯度。方向是否改变?

Q3:2块GPU,w=2.0,L(w)=(w-y)²,GPU1:y=1,GPU2:y=5,学习率=0.1。计算w更新结果。

Q4:总训练10000步,Warmup=1000步,目标lr=0.001。第500步、1000步、5000步的学习率分别是?

Q5:PPL=15和PPL=5,哪个模型更好?好多少?

查看答案

A1:L=-(1/3)*[log(0.5)+log(0.7)+log(0.9)]=0.385。PPL=exp(0.385)≈1.47。

A2:范数=√(25+144+64)=√233≈15.26>10。缩放=10/15.26≈0.655。裁剪后=[3.28,7.86,5.24]。方向不变(同比例缩放)。

A3:GPU1梯度=2(2-1)=2。GPU2梯度=2(2-5)=-6。平均=-2。w_new=2.0-0.1*(-2)=2.2。

A4:第500步:lr=(500/1000)*0.001=0.0005。第1000步:lr=0.001。第5000步:lr=0.001*(1-4000/9000)≈0.000556。

A5:PPL=5更好。PPL越低越好。好15/5=3倍。信息论角度:log₂(15)≈3.9比特 vs log₂(5)≈2.3比特,减少1.6比特不确定性。