1. 从零开始理解LLM训练的最小闭环
作为一名长期从事AI模型开发的技术人员,我深知初学者在接触大语言模型(LLM)训练时最常见的困惑点。那些看似简单的术语,当它们组合在一起时,往往会形成一道难以逾越的理解屏障。本文将从实际工程角度出发,为你拆解LLM训练的核心流程。
1.1 训练阶段的本质区别
在深入代码之前,我们需要明确LLM训练的三个主要阶段及其目标差异:
-
Pretraining(预训练):这是模型获取基础语言能力的阶段。就像教一个孩子识字和语法,我们给模型输入大量文本(如书籍、网页内容),让它学会预测下一个词。关键技术指标是perplexity(困惑度),衡量模型预测的准确程度。
-
SFT(监督微调):预训练后的模型虽然"懂语言",但不会很好地遵循指令。SFT阶段使用问答格式的数据,教会模型如何以助手的方式回应。这里的关键是构造高质量的指令-回答对,通常需要人工参与数据清洗。
-
DPO(直接偏好优化):即使经过SFT,模型仍可能产生不符合人类偏好的回答。DPO通过对比学习(chosen vs rejected回答)进一步优化模型输出质量。这个阶段最考验数据质量,需要精心设计的偏好对。
实际工程经验:在资源有限的情况下,建议将80%的精力放在数据质量上。我曾见过团队花费大量时间调整模型架构,最终发现效果提升主要来自数据清洗和标注规范的改进。
1.2 数据流动的完整链路
让我们用具体例子说明文本数据在训练时的完整处理流程:
- 原始文本:"深度学习是机器学习的分支"
- Tokenization:
- 使用GPT-2 tokenizer可能输出:["深", "度", "学", "习", "是", "机器", "学习", "的", "分支"]
- 转换为input_ids:[1032, 2345, 3456, 4567, 5678, 6789, 4567, 7890, 8901]
- Embedding查找:
- 每个ID对应一个768维向量(以BERT-base为例)
- 形状变为:[9, 768]
- Transformer处理:
- 经过12层Transformer block
- 每层都保持[9, 768]的形状
- 但每个位置的向量含义逐渐丰富
- 输出投影:
- 通过lm_head矩阵(768×50000)映射到词表空间
- 输出形状:[9, 50000]
- 损失计算:
- 预测目标:用位置n的输出预测位置n+1的token
- 计算交叉熵损失
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键组件深度解析
2.1 Tokenizer的工程考量
Tokenizer的质量直接影响模型性能。在实际项目中我们需要考虑:
