详细摘要 摘要
生成:2025-05-13 16:42摘要详情
- 音频文件
- Stanford CS336 Language Modeling from Scratch | Spring 2025 | 01 Overview and Tokenization
- 摘要类型
- 详细摘要
- LLM 提供商
- openai
- LLM 模型
- gemini-2.5-pro-exp-03-25
- 已创建
- 2025-05-13 16:42:36
摘要内容
概览/核心摘要 (Executive Summary)
Stanford CS336课程“从零开始构建语言模型”旨在让学生深入理解语言模型构建的全流程,包括数据、系统和模型层面。课程由Percy Liang、Pu [姓氏不清晰]、Roi [姓氏不清晰]、发言人姓名不清晰 (三年级博士生) 和 Barsaw (二年级博士生) 共同授课。Percy Liang强调,当前研究人员与底层技术日益脱节,本课程通过“从零开始构建”的理念,弥补这一差距,赋能基础研究。
课程承认,如GPT-4这类前沿模型因其巨大的参数量(传闻1.8万亿)和训练成本(数亿美元)非学术界所能及,且其细节不公开。因此,课程将专注于构建虽小但具代表性的模型,教授核心“机制”(如Transformer、模型并行)和“思维模式”(如极致优化硬件、严肃对待规模化),但“直觉”(关于数据和模型选择)只能部分传授。课程核心观点是“规模化算法”至关重要,强调在给定计算和数据预算下最大化模型效率,而非盲目追求规模。
课程内容分为五大模块:基础(实现完整Tokenizer、Transformer、训练循环)、系统(GPU内核优化、并行计算、推理优化)、规模法则(小规模实验预测大规模性能)、数据(评估、获取、清洗、去重)和对齐(监督微调、基于反馈的学习如DPO、GRPO)。课程作业量大,要求学生从空白文件开始编程,并提供H100集群资源。第一讲重点介绍了Tokenization,对比了字符、字节、词级别方法的优劣,并详细解释了字节对编码(BPE)算法的原理和实现步骤,指出其通过语料库统计自适应分配词汇表的有效性。
课程介绍与教学团队
- 课程名称: CS336 Language Models from Scratch (从零开始构建语言模型)
- 核心教员:
- Percy Liang: 主讲教师之一,强调课程能让学生了解语言模型构建的完整端到端流程,包括数据、系统和模型。
- Pu [姓氏不清晰]: 联合授课教师,认为“从零开始构建才能真正理解”,希望传授深度技术知识。
- Roi [姓氏不清晰]: 助教,曾是该课程学生。
- Barsaw: 二年级博士生,去年课程排行榜佼佼者。
- 课程更新:
- 这是该课程第二次开设。
- 学生规模扩大约50%。
- 助教从2名增加到3名。
- 所有讲座将在YouTube上公开,供全球学习者学习。
课程动机与理念
- 应对研究危机: Percy Liang指出,当前研究人员越来越脱离底层技术。
- “八年前,研究人员会自己实现和训练模型。”
- “六年前,至少会下载BERT这类模型进行微调。”
- “现在,许多人仅通过提示专有模型即可。”
- 抽象的泄露性: 虽然抽象能提高效率,但语言模型的抽象是“泄露的 (leaky)”,其内部机制不透明(“输入字符串,输出字符串”)。
- 赋能基础研究: 对技术的全面理解对于需要“撕开技术栈 (tearing up the stack)”并协同设计数据、系统和模型的根本性研究至关重要。
- 核心哲学: “要理解它,就必须构建它 (to understand it, you have to build it)。”
面临的挑战与课程教学范围
- 语言模型的工业化:
- GPT-4: 传闻拥有1.8万亿参数,训练成本高达1亿美元。
- X.ai: 正在构建拥有20万个H100 GPU的集群。
- 巨额投资: 预计四年内投资超过5000亿美元。
- 细节不公开: OpenAI明确表示“由于竞争格局和安全限制,我们不会披露任何细节。”
- 课程的局限性:
- 无法让学生训练自己的GPT-4级别模型。
- 将构建“小型语言模型 (small language models)”,但这可能不完全代表大型模型的行为。
- 例子1 (计算量分布): Stephen Roller的推文显示,小模型中Attention和MLP层的FLOPs大致相当,但在1750亿参数模型中,MLP层FLOPs占主导。过度优化小模型中的Attention可能方向错误。
- 例子2 (涌现行为): Jason Wei 2022年的论文显示,模型在训练FLOPs达到一定规模后,才会在某些任务上突然表现出“涌现能力 (emergent abilities)”,如上下文学习。
- 课程能教授的内容:
- 机制 (Mechanics): Transformer原理、模型并行如何高效利用GPU等。
- 思维模式 (Mindset): “尽可能压榨硬件性能 (squeeze as most out of the hardware as possible)”和“认真对待规模化 (take scaling seriously)”。Percy认为这是OpenAI成功的关键。
- 直觉 (Intuitions): 关于哪些数据和模型决策能带来好模型(只能部分教授,因大小模型表现可能不同)。
- 实验的重要性: 引用Noam Shazeer关于SwiGLU的论文结论:“我们无法解释,只能归功于神之仁慈 (divine benevolence)。” 表明有时实验结果胜于理论解释。
“惨痛的教训”与效率的重要性
- 对“惨痛教训 (Bitter Lesson)”的误解: 并非指“规模决定一切,算法不重要”。
- 正确解读: “规模化的算法 (algorithms at scale) 才是关键。”
- 效率在规模化中的极端重要性:
- 模型准确率 = 效率 × 资源投入。
- 大规模投入(如数亿美元)时,浪费是不可承受的。
- OpenAI在资源利用率上可能远超学术界。
- 算法效率的提升:
- OpenAI 2020年论文指出,2012-2019年间,将ImageNet训练至特定准确率的算法效率提升了44倍。“这比摩尔定律还快 (faster than Moore's law)。”
- 核心问题框架: “在给定的计算和数据预算下,如何构建最佳模型? (What is the best model one can build given a certain compute and data budget?)”
- 研究者的目标: 提升算法效率。
语言模型简史与当前格局
- 早期:
- 香农 (Shannon): 将语言模型用于估计英语的熵。
- NLP领域: 作为机器翻译、语音识别等大系统的组件。
- Google (2007): 训练了30个大型N-gram模型,使用了超过2万亿的tokens(比GPT-3还多),但这些是N-gram模型,未展现现代LM的复杂现象。
- 2010年代 (深度学习革命的关键组件):
- 首个神经语言模型 (Bengio团队, 2003)。
- Seq2Seq模型 (Sutskever, Google)。
- Adam优化器。
- 注意力机制 (Attention Mechanism)。
- Transformer (“Attention is All You Need”, 2017)。
- 混合专家模型 (Mixture of Experts, MoE) 的规模化研究。
- 模型并行技术 (Model Parallelism),当时已在探索训练千亿参数模型。
- 基础模型 (Foundation Models) 趋势:
- ELMo, BERT, T5等在当时引起轰动。
- OpenAI的推动: 结合已有组件,进行优秀工程实践,并大力推动规模法则 (Scaling Laws),催生了GPT-2和GPT-3。
- 开放模型的发展:
- 早期工作: EleutherAI (GPT-3之后)。
- Meta的早期尝试 (效果欠佳)。
- Bloom, Meta (Llama), Alibaba, DeepSeek AI, AI2等相继推出开源权重模型。
- 开放性的层级:
- 封闭模型 (Closed Models): 如GPT-4,无细节。
- 开放权重模型 (Open Weight Models): 提供权重和架构论文,但无数据集细节。
- 开源模型 (Open Source Models): 提供权重、数据和尽可能详细的论文。
- 当前格局: OpenAI, Anthropic, X.ai, Google, Meta, DeepSeek, Alibaba, Tencent等机构的前沿模型主导市场。
- 课程策略: 回顾这些关键组件的演进,并结合开源社区信息和对闭源模型的分析,尽可能接近前沿模型的最佳实践。
可执行讲座 (Executable Lecture)
- 讲座本身是一个“可执行程序”,可以逐步运行并展示内容。
- 特点:
- 嵌入代码并可单步执行,查看环境变量。
- 显示讲座的层级结构。
- 可跳转到定义。
- 本质是经过处理以便于观看的Python程序。
课程安排与后勤
- 课程网站: 所有资料在线。
- 学分与工作量: 5学分。引用课程评估:“第一个作业的工作量约等于CS224N所有五个作业加上期末项目的总和。”
- 适合人群: 对理解事物底层原理有“执念 (obsessive need)”的人,希望提升研究工程能力和大规模ML系统构建舒适度的人。
- 不适合人群:
- 本学期希望完成大量研究任务的人。
- 只想学习最新最热技术的人(课程更关注基础和自下而上的学习)。
- 将“从零训练语言模型”视为解决所有问题首选方案的人(提示工程和微调通常是更实际的起点)。
- 无法注册或旁听者:
- 所有讲义和作业在线。
- 讲座录像将上传至YouTube(有数周延迟)。
- 课程明年会再次开设。
- 作业 (5个):
- 不提供脚手架代码,强调“从零开始构建”。
- 提供单元测试和适配器接口以检查正确性。
- 学生需自行做软件设计决策。
- 策略:本地用小数据集原型验证,集群进行基准测试。
- 部分作业有排行榜(如在训练预算内降低困惑度)。
- AI工具(如Copilot):"自行承担使用风险 (use at your own risk)",学生对自身学习体验负责。
- 计算集群:
- 由Together AI提供H100 GPU。
- 需仔细阅读集群使用指南。
- 尽早开始作业,避免截止日期前集群拥堵。
- 学分问题: 课程固定为5学分,工作量不变。
- 沟通渠道: 将设立Slack频道。
- 旁听权限: 旁听学生可访问所有在线资料、作业,并通过Canvas观看讲座视频。
- 评分: 基于单元测试通过情况、模型性能(如损失值、效率)等,每个问题部分有明确分数。
课程结构:五大支柱
核心问题:“假如给你一个Common Crawl的网络转储数据、32个H100 GPU和两周时间,你应该怎么做?” 涉及Tokenizer、架构、系统优化、数据清洗等决策。
1. 基础 (Basics)
- 目标: 实现一个基础但完整的语言模型训练流程。
- 组件:
- Tokenizer: 字符串与整数序列的转换。
- 将主要学习字节对编码 (Byte Pair Encoding, BPE)。
- 提及有前景但尚未大规模应用的Tokenizer-free方法(直接处理原始字节)。
- 模型架构 (Model Architecture):
- 起点: 原始Transformer。
- 重要改进:
- 激活函数: SwiGLU。
- 位置编码: 旋转位置编码 (Rotary Positional Embeddings, RoPE)。
- 归一化: RMSNorm (比LayerNorm更简单)。
- 归一化层位置: 与原始Transformer不同。
- MLP层: 可用混合专家模型 (MoE)替代密集MLP。
- 注意力机制: 全注意力、滑动窗口注意力、线性注意力(旨在解决二次复杂度问题),以及低维版本如GQA, MQA。
- 替代架构: 状态空间模型 (State-Space Models)如Hyena,或混合模型。
- 训练 (Training):
- 优化器: AdamW (主流)。提及有前景的新优化器如Lion, Sophia。
- 学习率调度、批量大小、正则化等超参数。
- “细节至关重要 (details do matter)”,调优好的架构与普通Transformer性能差异可达数量级。
- Tokenizer: 字符串与整数序列的转换。
- 作业1:
- 实现BPE Tokenizer (“这部分工作量可能超乎预料”)。
- 实现Transformer、交叉熵损失、AdamW优化器、训练循环。
- 允许使用PyTorch,但不能使用其内置Transformer实现(有允许函数列表)。
- 数据集: TinyStories, OpenWebText。
- 排行榜: 在H100上训练90分钟,最小化OpenWebText困惑度。
2. 系统 (Systems)
- 目标: 进一步优化,最大化硬件利用率。
- 组件:
- 内核 (Kernels):
- GPU架构简介: 大量浮点运算单元、片外内存 (HBM)、片上缓存 (L1, L2)。
- 瓶颈: 数据移动成本。
- 优化技术: 融合 (Fusion)、分块 (Tiling) 以最小化数据移动。
- 实现工具: Triton (OpenAI开发)。
- 并行计算 (Parallelism):
- 多GPU互联 (NVLink, NVSwitch)。GPU间数据移动更慢。
- 技术: 数据并行 (Data Parallelism)、张量并行 (Tensor Parallelism) 等。
- 推理 (Inference):
- 定义: 给定提示和训练好的模型,生成Token。
- 应用: 强化学习、测试时计算 (Test-Time Compute)、模型评估。
- 成本: 全球推理成本正超过训练成本(训练是一次性,推理随使用量增加)。
- 阶段:
- Prefill (预填充): 处理输入提示,并行度高,计算密集型。
- Decode (解码): 逐个Token自回归生成,难以饱和GPU,内存密集型。
- 加速方法: 使用更便宜的模型、推测解码 (Speculative Decoding)、系统优化。
- 内核 (Kernels):
- 作业2:
- 实现一个Kernel。
- 实现数据并行。
- 实现一个简化版FSDP (Fully Sharded Data Parallel)。
- 强调基准测试和性能分析的习惯。
3. 规模法则 (Scaling Laws)
- 目标: 通过小规模实验预测大规模下的超参数和损失。
- 核心问题: 给定FLOPs预算,应选择多大的模型尺寸(大模型少数据 vs. 小模型多数据)?
- Chinchilla Optimal:
- 由OpenAI和DeepMind一系列论文提出。
- 对每个计算预算,找到最优参数量,拟合曲线外推。
- 经验法则: 模型参数量N × 20 ≈ 训练所需Token数量 (例如1.4B参数模型需28B Token)。
- 局限性: 未考虑推理成本。
- 作业3:
- 提供一个“训练API”,输入超参数返回损失值。
- 在FLOPs预算内,进行实验收集数据,拟合规模法则。
- 提交对更大规模下超参数(模型大小等)的预测。
- 强调实验设计的谨慎性(模拟真实场景)。
- 排行榜: 在给定FLOPs预算下最小化损失。
- 作业链接说明: 讲座中链接为2024年版本,2025年大致结构相似,但会有修改。
4. 数据 (Data)
- 目标: 理解数据在模型能力塑造中的关键作用。“你想让模型做什么? (What do I want this model to do?)”
- 组件:
- 评估 (Evaluation):
- 困惑度 (Perplexity)。
- 标准化测试 (如MMLU)。
- 指令遵循模型的生成评估。
- 集成 (Ensemble)、思维链 (Chain-of-Thought) 对评估的影响。
- 评估整个系统而非仅语言模型。
- 数据策管 (Data Curation):
- “我们正在互联网上训练模型”的说法不准确。数据需主动获取和处理。
- Common Crawl示例: 大量垃圾、非目标语言内容。
- 来源: 网页抓取、书籍、论文、GitHub等。
- 处理: 法律问题、数据购买(前沿模型)、从HTML/PDF/代码目录到纯文本的转换(有损过程)。
- 关键步骤: 过滤(高质量、去有害内容,通常用分类器)、去重。
- 评估 (Evaluation):
- 作业4:
- 提供原始Common Crawl数据。
- 训练分类器进行数据清洗、去重。
- 排行榜: 在给定Token预算下最小化困惑度。
5. 对齐 (Alignment)
- 目标: 使基础模型(能预测下一个Token)变得“有用 (useful)”。
- 对齐的方面:
- 遵循指令。
- 指定生成风格(长/短、列表、诙谐/严肃等)。
- 安全性(拒绝有害回答)。
- 对齐的两个阶段:
- 监督微调 (Supervised Fine-Tuning, SFT):
- 收集“提示-回答”对,进行监督学习。
- 基础模型已有潜力,少量样本(如数千)即可赋予指令遵循能力。
- 与预训练相似,最大化文本概率。
- 基于反馈的学习 (Learning from Feedback):
- 利用更轻量级的标注,让算法做更多工作。
- 数据类型:
- 偏好数据 (Preference Data): 对同一提示的多个回答进行A/B比较。
- 验证器 (Verifiers): 形式化验证器(数学、代码)或学习型验证器(训练LM评分)。
- 算法 (强化学习领域):
- PPO (Proximal Policy Optimization): 早期用于指令微调。
- DPO (Direct Preference Optimization): 针对偏好数据,更简单有效。
- GRPO (Group Relative Preference Optimization): DeepSeek开发,简化PPO,移除价值函数,效率更高。
- 监督微调 (Supervised Fine-Tuning, SFT):
- 作业5:
- 实现SFT, DPO, GRPO。
- 进行评估。
- 作业难度回顾: 作业1和2最重,作业3相对轻松,作业4和5(去年)难度低于1和2。
课程核心原则回顾:效率
- 效率是驱动原则: 所有设计决策都应围绕效率。
- 当前约束 (课程及多数研究者): 计算受限 (Compute Constrained)。
- 数据处理: 积极过滤,避免在劣质数据上浪费计算。
- Tokenization: 尽管字节级模型优雅,但当前计算效率低,故采用Tokenization。
- 模型架构: 许多设计决策源于效率考量。
- 训练: 通常只训练一个epoch,表明时间紧迫,需快速过更多数据。
- 规模法则: 用少量计算预测超参数。
- 对齐: 高效对齐可能使较小基础模型在特定任务上表现良好。
- 未来趋势 (前沿实验室): 数据受限 (Data Constrained)。
- 设计决策可能改变: 如训练更多epoch,或因Transformer主要为计算效率设计而出现新架构。
- 效率依然重要,但具体决策会随约束条件变化。
第一单元深入:Tokenization
- 参考资料: Andrej Karpathy关于Tokenization的视频。
- 定义: 将原始文本(通常是Unicode字符串)转换为整数序列(Token),每个整数代表一个Token。需要编码 (encode) 和解码 (decode) 过程。词汇表大小 (Vocabulary Size) 即Token能取的不同值的数量。
- 在线Tokenizer演示 (tiktokenizer.io):
- 空格通常是Token的一部分,且按惯例位于Token之前。
hello和hello是不同的Token。- 数字会被切分成片段。
- GPT-2 Tokenizer示例:
encode(): 字符串 -> 索引列表。decode(): 索引列表 -> 字符串。- 压缩率 (Compression Ratio): 字节数 / Token数 (示例中为1.6,即每个Token代表1.6字节)。
- Tokenization方法演进:
- 基于字符 (Character-based): Unicode字符 -> 码点 (codepoint)。
- 问题: 词汇表可能非常大(Unicode字符众多),对稀有字符不友好,效率低。压缩率示例为1.5。
- 基于字节 (Byte-based): 字符串 -> UTF-8字节序列。
- 优点: 词汇表小 (0-255)。
- 问题: 序列过长(压缩率为1.0,即1字节/Token),对二次复杂度的Attention机制是灾难。
- 基于词 (Word-based): 传统NLP方法,用正则表达式切分。
- 问题: 词汇表无界,易出现未登录词 (UNK token),处理麻烦。
- 基于字符 (Character-based): Unicode字符 -> 码点 (codepoint)。
- 字节对编码 (Byte Pair Encoding, BPE):
- 起源: Philip Gage于1994年为数据压缩提出。
- NLP应用: Sennrich等人2016年引入神经机器翻译。
- 语言模型应用: GPT-2采用。
- 核心思想: 在原始文本上训练Tokenizer,让常见字符序列有机地合并为单个Token,稀有序列则由多个Token表示。
- GPT-2细节: 先用基于词的Tokenizer进行预切分,再对各片段运行BPE(课程作业亦如此)。
- BPE算法步骤 (训练阶段):
- 将字符串转换为字节序列。
- 重复以下操作(指定合并次数
num_merges):- 统计训练数据中所有相邻Token对的出现频率。
- 找到最频繁出现的Token对 (A, B)。
- 创建一个新的Token ID (C),代表 (A, B) 的合并。
- 将训练数据中所有的 (A, B) 替换为 C。
- 记录这次合并 (A, B) -> C。
- BPE编码 (推理阶段):
- 将输入字符串转换为字节序列。
- 按照训练时学到的合并规则的顺序,依次将字节序列中的相应Token对替换为合并后的Token。
- BPE解码: 将Token ID递归地拆分为原始字节,再转换为字符串。
- 简单实现的效率问题: 编码时遍历所有合并规则可能低效。作业中需优化。
- Tokenization总结:
- BPE是一种有效的启发式算法,利用语料库统计进行自适应词汇表分配。
- Percy表示:“希望有一天不再需要讲这部分,因为我们将拥有能直接从字节映射的架构,但在那之前,我们必须处理Tokenization。”
下次课程预告
- 深入探讨PyTorch的细节。
- 关注资源核算 (Resource Accounting),理解FLOPs的去向。