我是本课程的助教 KPH。这门课程第一年开设,我也负责了上半程的内容准备与一部分的授课。
上半程的课程定位非常清晰:从基础自然语言处理知识开始,先透彻理解当前常见语言模型(主要基于 Transformer)的架构及原理,再从实践中真枪实弹实现一个完整的语言模型。此后过渡到实际工程实践中的常用框架(hf & wandb),最后选讲一些工程实践中的定量分析问题。
以上的内容正好对应了我们上半程的 9 个 Lecture,以此划分成四个循序渐进的部分。
目录
- 授课内容的梳理
- 课程质量的复盘
- 明年授课的规划
- 广告位招租
授课内容的梳理
PART1:
Lec1:基础自然语言处理。考虑到选课人群中有相当一部分并没有学过《自然语言处理》这门课,所以我们从最基础的词向量编码开始介绍,逐步推进到语言建模的概念,并介绍一些简单的语言模型,进行 NLP 基础知识的扫盲。
Lec2:Transformer 的基本架构。这一讲主要还是基于 2017 年 original Transformer 论文中的原版架构,重点在于彻底讲清模型架构各组件的设计原理,也就是核心 idea 的理解。
Lec3:Transformer 架构的迭代。真正接轨当代模型的一讲,基于 Lec2 的内容,全面梳理了模型架构时至今日的迭代更新,比如 RoPE、MoE 和几种 KV-Cache 的优化,在其中也进行了大量原理的分析推导。
以上三讲对应了第一部分,也就是作为整门课奠基的理论知识部分。
PART2:
Lec4:BPE 分词器的工程实现。
Lec5:Transformer 架构的工程实现。
Lec6:模型训练与解码的工程实现。
以上三讲是第二部分,也就是完整手搓并训练 LLM 的工程实战。值得一提的是,我们在 Lec6 中新加入了十几页 PPT 的篇幅专门介绍 AdamW 优化器的数学原理,而这是在模板课程(Stanford CS336)中没有的。
PART3:
Lec7:Hugging Face
Lec8:wandb
第三部分,内容虽然不多,但重要性不必多说。虽然彻底理解 LLM 架构确实需要动手完整实现,但现实的科研及工业生产中并不需要手搓模型,而是直接利用成熟的框架和工具即可。这也是我们的课程考虑到受众均为本科生,从而相比 CS336 额外添加的部分。
PART4:
Lec9:资源计算。大致分为显存估算与计算量估算两大部分,以此扩展到通过已有硬件条件估算最大 batch_size 与训练时长的问题。
最后一部分。非常遗憾,由于授课时长有限,本来打算再加一个 Lec10,细讲一下模型参数化以及神经网络 activations 尺度的分析(这和我 26 年寒假期间做过的科研项目也有很强的关联),如果以后有机会的话,能加上还是很有意义的。
总结来说,我们上半程的授课内容有非常鲜明的特色:
- 大量引入了数学原理的分析与推导。虽然这门课名为工程实践,但大家基本都有科研背景。所以在课程项目(也是和给分直接相关的部分)中学会工程实践,知道 “怎么做” 之外,课上多了解一些 “是什么”“为什么” 也是很有好处的。
- 比较重视常用工具的介绍与使用。比如专门用两个 Lectures 来介绍这两种工具,关于这两种工具的使用预计也会有一次课程作业,这也算是一种比较实事求是的改进。
下半程的课程内容大概包含了几个模块:
- Scaling laws:模型的参数量、训练数据量、训练计算量等不断扩大,这些变量与 loss 的变化可以总结出定量的规律;除此之外,scaling 过程中超参的选择也存在一定的变化规律。
- 多卡训练:上半程主要着眼于架构本身与小模型单卡预训练,但实际工程中(哪怕训练规模远不及工业界的学术界科研)基本都离不开多卡训练。作业 2 中也着重涉及了相关的练习。感谢 JHR 助教在这一部分的贡献。
- 监督微调:采用 LoRA 技术,用特定的数据集对部分参数做后训练对齐,使预训练模型在某一方面达到特定需求。作业 3 就是一个简易的 SFT 微调练习。感谢林竹雨老师和 ZZX 助教在这一部分的付出。
课程质量的复盘
那么,对于这门第一年开设的课程,课程质量和大家的学习情况如何?
拿我自己来说,我大三下学期在负责这门课的同时也在进行 LLM 方向的保研套磁与课题组面试。在好几次面试当中都被提到梳理 Transformer 的架构与 2017 年至今的架构迭代。这正好分别对应了我们 Lec2 和 Lec3 的内容,或者说是这两讲的子集。事实证明每次面试当中直接使用 Lec2/3 中的知识进行作答有碾压级别的表现,尤其是 Lec3(架构迭代)部分的内容非常全面,基本都取得了超出导师预期的效果,从未有过翻车案例。
从大家的成绩来讲,这门课程开设的第一年就达成了所有选课者综合分均为 60 分以上,通过率 100% 的纪录,大家基本上也都能较为完整地完成三次作业,这是很不容易的。
但当前存在的问题也是不可忽视的。首先从课程内容与容量上来讲,8 周的课时来讲全 LLM 方向的知识与工程实践技能是远远不够的。所以我们只在和预训练(即模型架构相关)的领域做了非常细致的讲解与练习(作业 1、2),而在后训练部分仅涉及了 SFT 与作业 3 的练习,其他很多后训练的技术都是缺失的(这也是我自己在知识上的盲区,我也急需进行补课)。而作为 2026 年非常热门的 Agent 则完全没有涉及,完全没有与 harness 相关的知识介绍与实操练习。
而在作业的线下检查过程中,我们也发现了明显的问题:许多同学的掌握程度是有很大的上升空间的。我在作业 1、作业 3 的检查过程中遇到了很多同学,在这两次作业写完的前提下连 FFN 模块的名字都不记得、Attention 模块的 forward 流程只能答上 “应该有 RoPE”(在课上曾经对 Attention 进行了大量板书推导与大半节课的讲解)。这种掌握程度下作业能拿将近满分是非常不正常的。考虑到这门课程的难度,我们没有像某些课程一样采取严格到死板教条甚至不切实际的查重 / 查 AI 率与扣分,但靠这种手段勉强拿分,什么都没学到的结果是令人遗憾的。
明年授课的规划
LLM 领域迭代速度非常快,这使得在可预见的范围内,今年授课的内容在明年春学期很可能就显得不够前沿。所以明年的具体授课内容仍有很大变数,授课容量可能也要明显超出今年。
但我们目前仍需要基于复盘出的问题,理清我们能够在明年至少需要添加些什么,明年的课程应当大致按照什么脉络展开。我目前的思路是按照 “预训练”、“后训练”、“Harness 与 Agent” 三大部分展开。
预训练
这其实就是占了我们今年一大半的内容,即作业 1 和作业 2 的覆盖范围(模型架构、Scaling Laws 与具体的模型训练)。这一部分目前相对完善,明年可能要添加的内容主要在于 Lec3 的模型架构迭代一讲,囊括进最近一年里新的架构迭代内容。
后训练
我们今年的 SFT 正是后训练的一部分。但目前还有很多后训练相关的技术,我们可能会在明年适量削减预训练部分的课时,兼顾后训练的介绍与练习。如果条件允许,明年后训练相关的作业可能会不止 SFT 一项。
Harness 与 Agent
这也和我这段时间校外科研实习做的工作高度相关。Agent 是当前阶段的热门,但主要在于工程而非数学原理,所以即使加入也不会占太多课时。我们可能会介绍一些常用的框架,并介绍一些当前非常重要的 Agent 应用(如 Auto research)
广告位招租
今年建立课程框架花费了极大的时间与精力,而明年课程内容的改革同样不会轻松。这也使得我们仍然需要有知识储备与专业技能的助教加入我们,共同进行课程的优化迭代。有意者请邮件联系我:kuangph2023@shanghaitech.edu.cn