Datawhale 大模型基础(so-large-lm):把 CS324 搬进中文世界的 LLM 理论教材
posts posts 2026-04-23T19:39:08+08:00so-large-lm 以斯坦福 CS324 和李宏毅生成式 AI 课为蓝本,把 LLM 原理系统中文化,并与 llm-universe、self-llm 构成理论→开发→实战三段路径。本文核对仓库读数与章节原文,解读分词与架构两块核心内容,也指出教程原例中的两处笔误。技术笔记LLM, Datawhale, 教程, TransformerDatawhale 大模型基础(so-large-lm):把 CS324 搬进中文世界的 LLM 理论教材
中文学习者想系统读 LLM 原理时,一直只有两条路:直接啃斯坦福 CS324 的英文讲义,或者在社交平台捡碎片化的"十分钟看懂 Transformer"。Datawhale 的 so-large-lm(大模型基础)做的事情很具体:把 CS324 的课程框架完整搬成中文,14 章从数据一路讲到安全伦理,再配上两个 B 站视频。截至 2026 年 10 月 5 日,它有 7,712 Stars、637 Forks。
先说清它的边界:这是一本"原理打底"的教材,框架继承自 2022 年前后的 CS324,追前沿不是它的任务——第 14 章的"前沿"停在 Llama 3。它的价值在于把分词、架构、训练这些不过时的底层机制讲扎实,再交给姐妹项目去做应用和实战。
本文内容核对自仓库 main 分支的章节原文与 GitHub API 读数(2026-10-05),包括对教程原例中两处笔误的订正。
一、先看全局:三段学习路径与 14 章地图
so-large-lm 不是孤立的仓库。README 把它列为 Datawhale LLM 学习矩阵的第一段,三段各有分工:
| 阶段 | 项目 | 定位 | 规模(2026-10-05) |
|---|---|---|---|
| 理论基石 | so-large-lm | 深入理解 LLM 原理、架构与算法 | 7,712 Stars |
| 应用开发 | llm-universe | 快速入门 LLM 开发,搭建 Demo | 14,073 Stars |
| 模型实战 | self-llm | 基于 AutoDL 的开源模型部署与微调指南 | 32,387 Stars |
三个仓库都是 Datawhale 社区维护,README 建议的学习顺序就是表格顺序。实际读者经常倒着走——先在 llm-universe 里跑通了 API 调用,遇到"为什么这样设计"的问题,再回头补 so-large-lm 的理论。
14 章分三部分。前四章讲基础与架构,中间四章讲数据与训练,最后六章是安全、伦理与前沿:
| 部分 | 章节 | 内容 |
|---|---|---|
| 基础与架构 | ch01–ch04 | 引言、大模型的能力、模型架构、新的架构方向(MoE、检索模型) |
| 数据与训练 | ch05–ch08 | 数据工程、模型训练、适配与微调、分布式训练 |
| 安全伦理与前沿 | ch09–ch14 | 有害性分析(上/下篇)、法律与伦理、环境影响、智能体、Llama 家族 |
二、内容从哪来,深浅是否均匀
读之前值得知道四件事,都来自对仓库本身的核对。
蓝本与重写。 项目自述以斯坦福 CS324 和李宏毅生成式 AI 课程为理论基石。实际读感更接近"忠实的中文重写"而不是直译:教程保留了 CS324 的论述顺序和核心例子,同时加入了不少面向初学者的 Tips(比如解释字符串和词元序列的区别)。第 3 章讲中文分词时用的例子就是"我今天去了商店。"——没有空格断开的句子,英文讲义里感受不到这个问题。
大纲与实际章节有一处错位。 README 把"分词策略 (Tokenization)“列在 ch05 的内容亮点里,但 ch05 的实际内容只有数据工程:WebText、C4、The Pile 这些数据集的来龙去脉,加上数据集文档和数据生态。分词真正的讲解位置是 ch03 的 3.2 节。以实际章节为准。
各章深浅差异明显。 最厚的 ch03 有约 3.4 万字节,最薄的 ch08(分布式训练)不到 6 千字节,只有前者的六分之一。想系统学分布式训练的读者,这一章只能当提纲用。
它是纯文档教程,没有配套代码。 docs/content 目录下就是 14 个 Markdown 文件和图片,没有代码目录。14 章里有 8 章一个代码块都没有;ch02、ch07 里以代码块形式出现的"示例”,其实是 GPT-3 提示词和自然语言推理的文本样例,不是可运行的程序。“每个章节配有代码"这类说法在这个仓库上不成立——动手环节需要读者自己搭,本文进阶路径给了具体做法。
另一个小提醒:README 徽标标注 MIT 协议,但仓库根目录目前没有 LICENSE 文件,GitHub 也未识别出许可证。想引用或复用其内容的话,建议先向社区确认授权状态。
三、分词:语言模型的第一道加工(ch03 · 3.2)
这一节回答的问题是:字符串怎么变成模型能计算的东西。语言模型的定义是"词元(token)序列上的概率分布”,但自然语言到不了模型手里——到模型手里的是字符串,比如教程全章反复用的那句 “the mouse ate the cheese”。分词器负责在两者之间转换:
the mouse ate the cheese ⇒ [the, mouse, ate, the, cheese, .]什么样的分词算好?教程给了三条直觉标准:词元不能太碎(极端情况是字符或字节,序列难建模),也不能太粗(否则 mother-in-law 和 father-in-law 无法共享参数),每个词元最好是有语义或统计意义的单位。后面两种算法都在这三条标准里权衡。
BPE:从字符里长出词汇表
最简单的方案是按空格切,但中文没有空格,德语有 Abwasserbehandlungsanlange 这样的复合词,英语的 don’t 也需要拆成 do 和 n’t。字节对编码(BPE)换了一条路:不预设词的边界,从字符开始,让高频共现自己浮出来。算法是个四步循环:
- 把词汇表初始化为字符的集合;
- 找出语料中共现次数最多的词元对;
- 用合并后的新符号替换所有出现;
- 把新符号加进词汇表,回到第 2 步,直到词汇量够大。
教程用三个句子的语料演示了这个循环:["the car", "the cat", "the rat"]。第一轮合并,“t"和"h"以"th"形式出现 3 次(“h"和"e"也是 3 次,随机选了一组),词汇表变成 ['t','h','e',' ','c','a','r','th'];第二轮合并出"the”,第三轮合并出"ca”。几个高频词就这么从 26 个字母里长了出来。
顺带指出教程原例的一处笔误:原文把初始词汇表写成含重复元素 't' 的 8 元素列表。三个句子切分后取并集,正确的初始词汇表是 {'t','h','e',' ','c','a','r'} 共 7 个字符。不影响算法演示,但照抄代码时会踩到。
字节级 BPE:解决多语言的稀疏问题
BPE 在字符层面跑,会遇到 Unicode 的规模问题:教程引用的数字是 144,697 个字符(这一数字沿用 CS324 成文时的 Unicode 统计),训练语料不可能覆盖所有字符。解法是对字节而非字符跑 BPE——任何语言的文本都变成 256 种字节的组合,稀疏问题消失。
这里要订正教程原例的第二个笔误。原文写"今天"的字节序列是 [x62, x11, 4e, ca],这个序列既不是 UTF-8 编码(按 UTF-8 解码出来是 b\x11N\xca,与"今天"无关),长度也不对。“今天"是两个汉字,UTF-8 编码为 6 个字节:
今 U+4ECA → E4 BB 8A
天 U+5929 → E5 A4 A9
今天 ⇒ [E4, BB, 8A, E5, A4, A9]修正之后反而更能看清字节级方案的意图:汉字、韩文、emoji 在字节层面一视同仁,模型不需要为每种文字准备一套字符表。
Unigram:换个哲学建词汇表
BPE 靠频率合并,Unigram 反过来:先定一个目标函数,让分词结果的概率最大,再逐步剪枝。教程给了个最小例子——训练数据是字符串 ababc,词汇表 V = {ab, c},分词结果把整串拆成 (ab)(ab)(c),似然值 p = 2/3 · 2/3 · 1/3 = 4/27(“ab"出现过两次所以概率是 2/3,“c"是一次)。
算法流程是:从一颗"相当大"的种子词汇表出发,用 EM 算法同时优化词元概率和分词方式,然后算出每个词元的 loss——移除它会让似然值掉多少——按 loss 排序,只保留前 80% 的词元,循环往复。低贡献的词元被系统性淘汰,留下的词汇表是"有原则"的。
工程上,Unigram 是 SentencePiece 工具支持的分词方法之一,与 BPE 并列,T5 和 Gopher 的分词器就是这么训练出来的(教程原文)。选型时的实际差异:BPE 简单直接,Unigram 能给出带概率的分词方案,适合需要多种切分粒度的场景。
四、三类架构:同一个 Transformer 的三种用法(ch03 · 3.3)
分词之后,词元序列进入模型。教程把现代语言模型分成三类,这个分类直接决定你拿模型能做什么:
| 架构 | 代表模型 | 做什么 | 教程指出的特点 |
|---|---|---|---|
| 编码端(Encoder-Only) | BERT、RoBERTa | 输入序列 → 上下文向量表征 φ(x) | 双向上下文,擅长分类等理解任务,不能直接生成文本 |
| 解码端(Decoder-Only) | GPT 系列 | 自回归预测下一个词元 | 天然适合生成,训练目标简单(最大似然),但只看得到左侧上下文 |
| 编码-解码端(Encoder-Decoder) | 最初的 Transformer、BART、T5 | 编码器处理输入,解码器生成输出 | 结合两者优点,适合序列到序列任务 |
教程举的例子很直白。同一个"他们移动而强大"的句子,编码端做情感分类,输出是 [[CLS], 他们, 移动, 而, 强大] ⇒ 正面情绪;解码端做续写,输入 [[CLS], 他们, 移动, 而],下一个词元预测出"强大”。选架构先看任务形态:理解、生成、还是转换。
至于 Transformer 内部,教程按"注意力机制 → 残差连接和归一化 → 位置嵌入"的顺序展开,几个值得带走的心智模型:
- 注意力是软查找表:一个查询 y 去和序列里每个元素算匹配度,匹配输出是值的加权组合——“软"就软在不像字典查找那样非此即彼。
- 多头是多个视角:语法、语义等不同方面的匹配同时进行,各注意力头的输出拼接组合。
- 前馈层补位:自注意力让词元互相通信,前馈网络对每个位置独立做非线性变换,提供另一路表达。
- 位置信息外挂:注意力本身对顺序不敏感,位置编码把"谁是第几个"注入进去。
五、一次流转:一句话穿过第 3 章
把上面两节串起来,跟着教程的贯穿例走一遍。“the mouse ate the cheese” 进了 ch03 之后经历四步:
- 它先是字符串——Unicode 字符的序列,模型无法直接处理;
- 分词器把它切成词元序列
[the, mouse, ate, the, cheese, .],每个词元来自词汇表 V。BPE 决定了"cheese"是一个词元还是"ch”+“eese"两截; - 词元查表变成向量,再经上下文表征
φ映射为随语境变化的向量序列——教程在 3.3 开头给了一个 2 维的示意:同一个"the"在不同位置得到不同的向量; - 三类架构各自接手:BERT 拿整串向量做分类,GPT 拿前缀预测下一个词元,T5 让编码器读入、解码器吐出另一串词元。
分词决定模型的"词汇”,架构决定模型对这串向量的"用法”——这就是 ch03 想在一章里说清的两件事。
六、采用建议:谁该读,从哪读
适合现在就读的:有 Python 基础和基本线性代数、想补理论底子的学习者;在 llm-universe 里跑通过 API 调用、但说不清"为什么这样设计"的应用开发者;准备面试 LLM 岗位、需要能推导注意力机制的人。ch03 一章就值回时间——它是全书最厚的一章,分词加架构的内容在中文教材里少有这么完整的。
可以缓一缓的:想了解 Llama 3 之后进展的读者,这套框架的终点在 2023 年;想尽快跑起来自己模型的读者,直接去 self-llm,遇到原理问题再回来查。
建议的读法:ch01–ch02 快速过(建立能力和局限的认知),ch03 精读并手推公式,之后按需取用——做数据就读 ch05,做微调就读 ch07。不用强迫自己从头到尾读完,第三部分的伦理和环境影响章节与工程实践关系较远,当作视野补充即可。配套的两个 B 站视频(大模型技术全景、Llama 开源家族)可以代替部分文字阅读。
自测题
- 架构选择。任务一:“给 10 万条用户评论做情感分类”;任务二:“根据用户输入生成回复”。分别在三类架构中选型并说明理由,两者选择的差异在哪里?
- 分词算法对比。BPE、Unigram、字节级 BPE 三者在处理中英混排文本时各有什么优劣?如果训练一个中英双语模型,你会选哪种分词方案,为什么?
- 学习路径。一个没有 NLP 背景、但会写 Python 的开发者想"做一个客服机器人”,他应该按什么顺序走完三段学习矩阵?如果目标换成"理解 Transformer 原理",顺序怎么变?
进阶路径
阶段一:能读懂,但没算过。 目标是把手上的理解变成可推导的。具体做法:拿 ch03 的注意力公式,用一个 3 个词元的句子手算一遍注意力权重,算完再看注意力可视化图就有了坐标;照着 ch02 里 GPT-3 的提示示例(教程以文本形式给出),自己为一个新任务设计一条 few-shot 提示,对比效果差异。
阶段二:能推导,但没实现过。 用不超过 200 行 Python 实现一个简化版 BPE:输入一段中文文本,输出词表和切分结果。写完你会对"为什么这个词被切成这两个 token"有直接判断。另一个练习:对比 LLaMA、Qwen、ChatGLM 三家开源模型的分词器,看它们的词表大小和中文覆盖率的差异。
阶段三:能实现,但没设计过。 尝试写一份"从零训练 1B 参数模型"的方案:数据配比、分词器选型、架构超参、训练策略逐项给出选择和理由。做完再回头读 ch06 和 ch08,对"目标函数设计"和"并行策略"的取舍会有具体的体感。
常见问题
零基础能直接读吗? 不建议。教程的定位是"深入理解 LLM 原理",需要基本的编程和数学底子。零基础读者更适合先走 llm-universe,先做出东西,再回头补原理。
需要 GPU 吗? 读这套教程本身不需要——它是纯文档,没有需要运行的训练代码。GPU 需求出现在你自己搭建的动手环节(比如阶段二的 BPE 实现是纯 CPU 任务,微调实验才需要 GPU),届时可以用 AutoDL 按小时计费的实例或 Colab 免费额度。
英文不好能读吗? 教程本身是中文的,但引用的原始论文是英文。遇到术语边读边查,一两周就能适应;关键概念本文和教程都给了中文对照。
学完能找到 LLM 相关的工作吗? 这套教程给的是原理理解——看懂论文、说清设计取舍,这些是必要的底子,但岗位要求的是"底子 + 项目经验"的组合。读完后去 llm-universe 和 self-llm 做出能演示的东西,才是完整的准备。
本文仓库数据与章节内容核对自 GitHub API 及 datawhalechina/so-large-lm main 分支文档原文,读数截至 2026-10-05。项目地址:datawhalechina/so-large-lm。
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。