什么是预训练(Pretraining)
P0 · llm_training
📊 考点:pretraining
🏷 标签:self-supervised-learning, language-model
1️⃣ 考察意图
面试官想确认你是否真正理解 LLM 训练范式的核心——预训练不是“跑个脚本”,而是通过自监督学习从无标注数据中压缩世界知识。考察类型是背概念+工程取舍,刁钻点在于:很多人只会背“Next Token Prediction”,但说不清为什么预训练能泛化、为什么需要千亿 token、以及预训练和微调的本质区别。答好了能展示你对训练范式的底层认知,以及从数据、模型到算力的全局视野。
2️⃣ 标准答
预训练(Pretraining)是 LLM 训练的第一阶段:在大规模无标注文本上,通过自监督学习目标(如 Next Token Prediction 或 Masked Language Modeling)训练一个语言模型,使其学会语法、语义、事实知识和推理模式。核心是压缩——模型被迫从上下文预测下一个 token,从而隐式学习语言的统计规律和世界知识。
关键要素:
- 数据规模:GPT-3 用了 570GB 文本(约 3000 亿 token),Llama 3 用了 15T token。数据质量比数量更重要——去重、过滤低质量内容(如 HTML 乱码)能提升 20%+ 下游性能。
- 模型容量:参数规模从 100M(GPT-1)到 1.8T(GPT-4)。容量决定知识存储上限,但存在“涌现”阈值——约 6.7B 参数时出现少样本学习能力(Wei et al., 2022)。
- 计算资源:Llama 3 8B 预训练需约 1.7M GPU 小时(H100)。实际落地坑:显存瓶颈——用 FlashAttention 减少显存占用 50%+,或用梯度检查点(Gradient Checkpointing)以时间换空间。
典型目标函数:
- 自回归(GPT 系列):最大化 P(x_t | x_{<t}),因果掩码。优势:天然适合生成;劣势:双向上下文缺失,BERT 在 NLU 任务上更强。
- 掩码语言模型(BERT):随机 mask 15% token,预测被掩 token。优势:双向上下文;劣势:训练-推理不一致(预训练有 [MASK],推理没有)。
工程取舍:
- 为什么用自回归? 生成任务(如对话、代码)需要从左到右的因果性,且自回归可统一预训练和推理(都是 next token prediction),避免 BERT 的 mismatch。
- 为什么不用更大 batch? 梯度噪声与 batch size 存在 trade-off:batch 太大(>4M tokens)导致收敛变慢,太小(<256K tokens)梯度方差大。GPT-3 用 3.2M tokens/batch 作为平衡点。
实际落地的坑 + 解法:
- 坑:训练不稳定(loss 震荡)。解法:用学习率预热(warmup,如前 2000 step 从 0 线性增加到 3e-4)+ 余弦衰减;或用 AdamW 优化器(权重衰减 0.1)。
- 坑:数据重复导致过拟合。解法:用 MinHash 去重(SimHash 变体),确保每个文档在 1000 token 窗口内相似度 <0.8。
- 坑:长上下文能力不足。解法:用 RoPE(旋转位置编码)替代绝对位置编码,支持外推至 128K token(如 Llama 3)。
预训练 vs 微调:
- 预训练:学习通用表示(语法、知识、推理),成本高(百万美元级),一次训练多任务受益。
- 微调:适配特定任务(如指令跟随、分类),成本低(千美元级),但会遗忘预训练知识(灾难性遗忘)。解法:用 LoRA(低秩适配)只更新 0.1% 参数,保留预训练能力。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从定义、关键要素、工程取舍三个层面回答。定义上,预训练是在大规模无标注文本上通过自监督学习(如 Next Token Prediction)训练语言模型,学习通用语言表示。关键要素包括数据规模(如 Llama 3 用 15T token)、模型容量(参数决定知识上限)和计算资源(FlashAttention 解决显存瓶颈)。工程取舍上,自回归比 MLM 更适合生成任务,但 NLU 稍弱。总结一句:预训练是 LLM 能力的基石,核心是‘用数据压缩知识’。”
4️⃣ 高频追问 & 应对
追问 1:预训练数据需要多大?为什么不是越多越好?
数据量取决于模型容量和任务复杂度。经验法则:Chinchilla 定律(Hoffmann et al., 2022)建议 token 数 = 参数 × 20。例如 7B 模型需要 140B token。但数据不是越多越好:超过最优比例后,边际收益递减(每 2x 数据,loss 下降 0.1 左右)。更关键的是数据质量:重复数据会导致过拟合(如 C4 数据集中 30% 是重复内容),低质量文本(如机器翻译错误)会污染表示。实际做法:先用 100B token 做小规模实验,观察 loss 曲线是否收敛,再决定是否扩展。
追问 2:预训练和微调的本质区别是什么?为什么不能直接微调?
本质区别:预训练学习通用表示(语法、语义、知识),微调学习任务特定映射(如分类边界)。直接微调的问题:1)数据量不足——微调通常只有几千到百万条,无法覆盖所有知识,导致过拟合;2)灾难性遗忘——微调会覆盖预训练权重,丢失常识(如 GPT-3 微调后无法回答简单事实问题)。解法:用 LoRA 或 Adapter 只更新少量参数,保留预训练能力。实际案例:Alpaca 在 LLaMA 上微调,用 52K 指令数据,但模型仍保留原始知识。
追问 3:预训练时 loss 不下降怎么办?
排查三步:1)检查数据——是否有大量重复或噪声(如 HTML 标签未清理),用 MinHash 去重后 loss 通常下降 0.2-0.5;2)检查学习率——过高(>1e-3)导致震荡,过低(<1e-5)收敛慢,建议用学习率扫描(从 1e-5 到 1e-3 对数搜索);3)检查模型初始化——用 DeepNet 初始化(残差缩放)或 LayerNorm 预热,避免梯度爆炸。如果以上都正常,可能是模型容量不足(如 100M 参数学 100B token),需要增加参数或减少数据。
5️⃣ 避坑 · 常见错误答法
- ❌ “预训练就是让模型背数据,记住所有文本。” → ✅ “预训练是通过自监督学习压缩数据中的统计规律,模型学的是概率分布而非记忆。例如 GPT-3 能生成新句子,说明它学到了语法和推理,而非死记硬背。”
- ❌ “预训练和微调没区别,都是训练模型。” → ✅ “预训练学习通用表示(如语法、知识),微调学习任务特定映射(如分类边界)。两者数据规模、目标函数、计算成本完全不同。预训练用无标注数据,微调用有标注数据;预训练成本是微调的 100-1000 倍。”
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“预训练为检索提供基础表示”切入——预训练模型(如 BERT)的 embedding 质量直接影响检索精度,对比 BM25 和 DPR 的差异,强调预训练对语义理解的重要性。
- 如果你只做过传统 NLP:用“词向量类比”迁移——预训练类似 Word2Vec 学习词表示,但扩展到句子级和上下文级,且目标函数从 CBOW 升级为 Next Token Prediction。强调预训练是“端到端”的,无需手工特征。
- 如果你是校招无项目:聚焦 Hugging Face 预训练 demo——在 WikiText-103 上训练 100M 参数 GPT-2,记录 loss 从 10 降到 3 的过程,并展示在文本分类任务上微调后准确率提升 15%。强调对训练流程(数据加载、分布式训练、checkpoint)的理解。
7️⃣ 延伸阅读
- “Scaling Laws for Neural Language Models”(Kaplan et al., 2020)——预训练 scaling law 的奠基论文
- “Training Compute-Optimal Large Language Models”(Chinchilla, Hoffmann et al., 2022)——数据-参数最优比例
- “RoFormer: Enhanced Transformer with Rotary Position Embedding”(RoPE, 2021)——长上下文位置编码
- “FlashAttention: Fast and Memory-Efficient Exact Attention”(Dao et al., 2022)——显存优化核心技术
- Hugging Face 官方教程:Pre-training a Language Model from Scratch(transformers 文档)——实操指南