第6讲 · CS224N:注意力机制、期末项目与 LLM 导论
| 课程 | Stanford CS224N / Ling284《Natural Language Processing with Deep Learning》,2024 春季学期 |
| 本讲标题 | Attention, Final Projects and LLM Intro |
| 视频 | YouTube · J7ruSOIzhrE(时长 4664 秒,约 77 分钟) |
| 课程主页 | cs224n.stanford.edu |
| 官方讲义 | 本讲对应的官方幻灯片为 cs224n-2026-lecture06-final-project.pdf(封面题名 Lecture 6: Final Projects & Practical Tips,Diyi Yang),可在课程主页的 Lecture 页面获取;本讲的幻灯片引用均以该文件页码为准(见文末「附录」「已知疑点」关于版本差异的说明)。 |
| 版权与出处 | 课程讲义、幻灯片与课堂内容版权归 Stanford CS224N 课程组及授课教师所有。本书是课堂录音的书面重构,用于学习交流;引用或再分发请注明原始课程与讲义来源。 |
对应讲次:第6讲(Stanford CS224N 自然语言处理)
制作模型:deepseek-flash(vb compose,据 run.log)
导览
(参考时间: 00:00:05)
📷 课程标题页
回到原视频 (00:00:05)
📷 本讲议程(讲义页)
回到原视频 (00:00:10)
这是一张 3–5 分钟就能读完的「问题地图」,只交代这一讲要回答什么、难在哪、老师打算怎么走,不剧透推导与结论。
① 老师自己提出的问题(按他讲的顺序)
- 机器翻译怎么评测? 上一讲末尾搭好了 encoder–decoder 的 LSTM 翻译系统,可我们怎么知道它译得好不好?为什么不能只靠人工打分?
- 注意力(attention)到底是什么、为什么需要它? 把整句源语言压进「一个固定长度的向量」,这件事为什么站不住脚?
- 注意力的分数有几种算法? 点积、双线性、低秩、加性,它们是什么关系,最后为什么是其中一种赢下了整个领域?
- 期末项目怎么做? 默认项目和自定义项目怎么选?提案、里程碑、报告各自要交付什么、怎么评分?算力不够怎么办?
- 2024 年之后做 NLP 项目,为什么几乎必须从预训练模型出发? 自己从零搭架构这条老路,为什么走不通了?
② 难点在哪
- 注意力的「谁查询谁」:解码器的当前隐状态是 query,编码器的每个隐状态既是 key 也是 value;每一步只和解码器的当前状态比较一次,而不是把所有东西一次比完。这一步最容易糊。
- 分数函数的谱系:点积 → 双线性 → 低秩 → 加性,四者不是四个孤立技巧,而是一条「参数从 0 个到一大堆、再到被重新压小」的演化线;理解这条线,才会明白 Transformer 为什么长成今天的样子。
- BLEU 的直觉与其缺陷:为什么用 n-gram 重合、为什么要惩罚过短的译文、为什么它至今仍是主流却依旧「粗」。
- 项目方法论里的两类评价:提案中的论文评审是总结性(summative)打分,项目计划是形成性(formative)反馈——这个区别决定了你该把时间花在哪里。
- 「我的贡献是什么」:下载一个很强的模型跑出很好的结果,不构成加分项。
③ 读者可能带着的疑问
A. 老师在本讲真正提出的问题:见上方 ①(源语言信息如何不被压扁、BLEU 够不够用、项目该怎么落地)。
B. 编者预判的读者疑问(编者预判,非老师原话):
- 编者预判:注意力是不是就是「加权平均」?——是,但权重来自 softmax 后的分数,且 query 决定了权重怎么算。
- 编者预判:RNN 上的注意力需不需要位置编码?——不需要,老师专门回答了这一点(见 2.6)。
- 编者预判:默认项目是不是「水课选项」?——恰恰相反,老师花了整整一页讲「这不是捷径」(见 3.3)。
- 编者预判:没有 GPU 怎么办?——本讲给了完整的替代清单(见 3.4)。
- 编者预判:直接用 GPT-4 跑一遍算不算项目?——老师明确说:不算,除非你能说清你在它之上做了什么(见 6.5)。
④ 本讲路线
先用一段「机器翻译评测史」把 BLEU 讲清楚(含 IBM 短语统计、句法统计十余年的停滞、2014–2016 年神经机器翻译的陡升),顺势说出注意力的动机;接着用图示 + 公式把注意力算一遍,再横向比较四种打分函数;最后 39 分钟全部给期末项目:评分政策 → 项目类型 → 算力现实 → 提案/里程碑/报告 → 找题目找数据 → 2024 年之后的 NLP 生态。
一、机器翻译的评测:BLEU 及其背后的一段历史
1.1 为什么需要一个自动评测指标
(参考时间: 00:00:49)
📷 上一讲末尾的 seq2seq 机器翻译系统图
回到原视频 (00:00:50)
这是上一讲末尾见过的那张图:我们用一个多层 LSTM 读入源语言句子(图中是德语),把最后一个隐状态交给另一组参数的解码器 LSTM,让它一次生成一个词,逐词产出译文。图中这个例子的英文译文看起来相当不错。
但问题是:我们凭什么判断译文好不好? 这就需要有办法评测机器翻译系统。
这是一个很复杂的领域。如果去翻文献,会发现人们提出过几百种不同的机器翻译评测指标(讲者本人也写过几篇相关论文,算是给这个问题添过乱)。但到今天为止,最常用的仍然是最早被提出的那个自动评测指标:BLEU(读作 /bluː/,全称 BiLingual Evaluation Understudy)。它由 IBM 提出——而 BLEU 和「blue」谐音,恐怕不是巧合。
在此之前,人们评测翻译的唯一办法就是让真人去看译文,判断翻得好不好。人工评测至今仍是广泛使用的金标准,因为很多自动指标都存在各种偏差和问题。可是:
我们常常希望快速迭代,希望把评测直接放进训练循环里。 人工评测做不到这一点。
所以 IBM 那篇论文提出:能不能造一个「勉强够用」的自动评测方法?
编者拓展|BLEU 的正式定义 给定候选译文 $c$ 与一组参考译文(记候选长度 $c$、参考中与 $c$ 最接近的长度 $r$),BLEU 由两部分组成:
$$\text{BLEU} = \text{BP} \cdot \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)$$
其中 $p_n$ 是候选译文中被参考译文匹配上的 $n$-gram 比例(即 $n$-gram 精确率),原论文取 $N=4$、$w_n = 1/4$;
$$\text{BP} = \begin{cases} 1, & c > r \\ \exp\left(1 - \dfrac{r}{c}\right), & c \le r \end{cases}$$
是简短惩罚(brevity penalty),用来压制「只翻译有把握的部分、把难句丢掉」的取巧策略——否则短译文会因为精确率高而白拿分。取对数再取指数,是为了把四个 $n$-gram 精确率变成几何平均,任何一阶精确率为 0 都会拉垮整体分数。 需要说明的是:讲义与课堂上都没有展开这些公式,讲者也说「作业三里会有讨论,我这里不逐个过公式」,因此以上推导是编者按原论文补全的。
1.2 BLEU 的直觉:拿 n-gram 的重合度打分
(参考时间: 00:03:00)
BLEU 的想法非常直接:
- 我们先有一段文本的一份或多份人工参考译文;
- 然后拿任意一份自动译文去和参考译文比,看它有多少 1-gram、2-gram、3-gram、4-gram 能在参考译文里找到重叠;
- 重叠越多,分数越高。
这里 n 取到 4 并不是什么神奇数字——你只取到 3 或 5 也可以,4 只是被认为是一个「合理的长度」。
📷 BLEU 的 n-gram 匹配示意
回到原视频 (00:04:20)
以讲者给出的示意图为例:机器译文里的 International Airport 这个片段可以在第二份参考译文中找到,于是这次匹配就贡献了一个 4-gram 命中;而 American 这个词在任何一份参考译文里都找不到,这一段就拿不到分;接着往下找,又能找到其他重叠片段,把它们累计起来就能算出一个分数。原初的想法是永远配多份参考译文,这样才能「采样」出可能译文的空间,覆盖得比较充分。不过近年来的实践里,用一份参考译文也并不罕见——在概率的意义上论证依然成立:译文越好,命中参考译文的次数就越多,分数自然越高。
为什么不能简单地逐词对齐检查? 因为翻译根本没有唯一正确答案。这不像机器学习里常见的分类任务——给一张图,正确答案是「拉布拉多」或「某种狗的品种」。对任何一个句子,都有很多种翻译方式,译者之间会争论「这个说法比那个说法更漂亮」;而且不同的译法会牵涉不同的词序,你没法顺着句子一路把词划掉。这正是 BLEU 采用「任意位置匹配 n-gram」的原因:只要词用得对,即使位置不同也能拿到合理分数。
不过它依然是一个相当粗糙的方法:
- 好的翻译可能因为用词恰好没和参考译文对上而拿到很低的 BLEU 分;
- 反过来,只要词对上了,即使这些词在整个句子里扮演完全错误的角色,也能拿到分数——只是 n 越大,就越难在不「正确使用词语」的情况下拿到匹配;
- 因此还有一条简短惩罚:如果系统译文太短,就扣分。否则你可以把难译的部分全部丢掉,只翻译容易的部分,然后在翻出来的那一点点内容上拿到很高的精确率。
分数怎么读? BLEU 理论取值在 0 到 100 之间,但你永远拿不到 100——因为译法本身有无数种。经验上:
- 到了 20 分上下,大致能看出原文在讲什么;
- 到了 30–40 分,译文已经好得多了;
- 近些年机器翻译系统拿到的 BLEU 常见于 50–60 分区间。
1.3 从短语统计到语法统计:停滞的十年
(参考时间: 00:08:45)
统计短语翻译(statistical phrase-based translation) 由 IBM 在 1990 年代末开创,在 2000 年代被重新发展起来,也正是 Google 在 2000 年代推出的 Google Translate 所用到的技术,此后又持续被改进了一个十年。
但业界有一个很强的共识:统计短语系统的进展基本上停滞了。它每年会好一点点——人们每年能拿更多数据训练传统的 n-gram 语言模型之类——但数字几乎不怎么往上走。
于是在大约 2005 到 2015 年之间,机器翻译界的主流想法是:要提升翻译质量,就得做句法驱动的翻译(syntax-based MT)。如果我们真的知道句子的结构、把结构往上传递,我们就知道词在句子里的角色,也就能翻得更好。这个念头尤其被这样一类观察推动:那时候翻译系统在法语→英语、西班牙语→英语这类相近的欧洲语言之间表现尚可,但在中文→英语、德语→英语上差得多——德语虽然和英语同属日耳曼语族,词序却非常不同(从句动词常在末尾、不同成分会被前置)。
讲者本人就是 2000 年代末做句法统计翻译的人之一。但实话是:它其实没怎么成功。句法方法的进展斜率或许比短语方法略大一点,但也没大出多少。
编者拓展|「瓶颈」的另一面:梯度消失 这一段的历史说明了一个反复出现的模式:当一个方向多年只能挤出微小的收益时,真正的突破往往来自换掉假设,而不是继续优化旧假设。注意力的两次冲击(2014 年加进 RNN 翻译、2017 年变成 Transformer 的唯一构件)都属于后者。
1.4 神经机器翻译的陡升
(参考时间: 00:11:09)
一切被彻底掀翻,是因为神经机器翻译(NMT)出现了:
- 2014 年是第一波尝试;
- 2015 年首次有 BLEU 评测结果:那一年它还不如最好的其他机器翻译方法;
- 2016 年它就已经超过了;
- 而且它处在一个陡峭得多的上升曲线上。
📷 神经机器翻译 BLEU 分数随时间的快速提升
回到原视频 (00:11:45)
(幻灯片给出的正是 Transformer 原论文 [Vaswani et al., 2017] 的机器翻译结果:在 WMT 2014 英德、英法测试集上,不仅 BLEU 更高,训练效率也更好。)
讲者在课上展示的曲线只画到 2019 年,此后它还在继续往上走。所以今天看到新系统拿到 50 多、60 多的 BLEU,已经不算罕见了。
二、注意力机制
2.1 瓶颈:把整句话压进一个向量
(参考时间: 00:13:11)
接下来讲注意力。它是神经网络里一个非常基础、非常重要的概念,而且有一个特别之处:它是真正新近发明出来的东西。
在此之前我们学过的所有东西——基本的前馈网络、循环网络、LSTM、还没讲的卷积网络——全都是上个千年就发明出来的。它们只是在等待足够的数据和算力,来证明自己有多好。而注意力是 2014 年在神经机器翻译的起点上被发明出来的,随后被证明是一个极具变革性的想法,让神经网络变得更强。
注意力的动机,正是我们前面看到的这个机器翻译问题:
- 我们跑一个 LSTM 扫过源语句子;
- 然后把这个隐状态当作解码器 LSTM 的上一个隐状态,去生成目标语句子。
这意味着——关于这个句子的一切有用信息,都必须被塞进那一个向量里。
一句四个词的句子或许还好办,但如果是一个 40 个词的句子呢?把句子的全部信息压进一个隐状态,显然不太可信。当然有粗糙的补救办法:把隐状态加大,获得更大的表示空间;用多层 LSTM,再获得更多表示空间——但这仍然是一件很可疑的事,而且这显然不是人类翻译时的做法。
人类翻译是怎么做的?读一遍句子、形成一个大概的理解,然后开始翻译;翻译到某处时,会回头去看句子的前面对应部分,并利用那里的信息。 所以「全部压进一个向量」并不是一个合理的模型。
正确的想法应该是:神经网络应当能够「注视(attend)」源句的不同位置,在需要的时候回看句子、取用需要的信息。
编者拓展|为什么这是一个「信息瓶颈」 设源句长度为 $n$、隐状态维度为 $d$。编码器最终只把 $\mathbb{R}^{n\times d}$ 的信息压缩成单个 $\mathbb{R}^d$ 向量再交给解码器,这就是一个典型的信息瓶颈:无论 $n$ 多大,解码器每次只能看到 $d$ 维。 后面会看到,注意力的做法是不再压缩,而是让解码器每一步都能访问整个 $\{h_1,\dots,h_n\}$,并用一个权重分布决定这次「看哪几处」。表示能力的上限因此从 $d$ 变成了 $n\times d$。
2.2 注意力是怎么工作的
(参考时间: 00:14:48)
做法是:在解码器的每一步,插入一个到编码器的直接连接,让我们能去看句子中的特定词。
📷 注意力解码:解码器查询编码器各位置的隐状态
回到原视频 (00:15:10)
推演一遍:
- 开始翻译时,我们手上有生成器(解码器)的当前隐状态;
- 把这个隐状态当作 query(查询),回头看编码器,找出有用的东西;
- 具体地:把解码器当前隐状态与源句中每一个位置的隐状态进行比较(比较方式稍后精确化);
- 基于比较结果算出一组注意力分数(attention scores)——也就是「生成译文的第一个词时,我该看源句的哪里」;
- 把这些分数送进 softmax,得到源句各位置上的一个概率分布 / 权重(attention distribution);
- 用这组权重对编码器的隐状态求加权平均,得到注意力输出(attention output)。
在这个例子里,生成第一个词时权重几乎全落在源句第一个词的隐状态上——那个词是法语 il,意为「he」。
- 把注意力输出与解码器的隐状态拼接起来,用两者共同生成一个输出向量;
- 这个向量再过一次 softmax,得到词表上的概率分布,输出第一个译文词 $y_1$。
然后重复上述过程:生成第二个词时,再次对源句每个位置算注意力,再取一次加权平均……每个时间步看的源句位置都不同,正是这些信息帮助我们完成翻译。
课上问答(重要的一点澄清):有同学问「图中绿色那个向量是什么」。讲者的回答是——绿色的向量(解码器隐状态)会与编码器的各个隐状态「一个一个地」配合使用,来算出注意力分数。也就是说,某个位置上的注意力分数,是「编码器在该位置的隐状态」与「解码器当前隐状态」的一个函数。
还有一个实现细节:有时候我们会把上一个时间步的注意力输出也作为额外输入喂进下一个时间步。(讲者特意指出:作业三的实现里就用了这一点,而且那里是有 bug 的——但可以先把这件事搁置。)
整体流程可以画成:
graph TD
A["编码器读入源句<br/>得到隐状态 h1 … hn"] --> B["解码器当前隐状态 s_t"]
B --> C["用 s_t 与每个 h_i 计算注意力分数 e_i^t"]
C --> D["送进 softmax<br/>得到注意力分布 α^t"]
D --> E["加权求和 a_t = Σ_i α_i^t · h_i"]
E --> F["拼接 [a_t ; s_t]"]
F --> G["线性层 + softmax<br/>输出下一个词"]
G -->|"把新词喂回解码器,进入下一步"| B
2.3 注意力的数学形式
(参考时间: 00:19:02)
把上面的过程写成公式。记号约定:
- 编码器隐状态记为 $h_1,\dots,h_n$;
- 解码器隐状态记为 $s_1,\dots,s_m$(另一套记号,和编码器不同);
- 现在处于第 $t$ 个时间步,解码器当前状态为 $s_t$。
第一步:对编码器每个位置算一个注意力分数。
最简单的方式是点积:
$$e_i^{t} = s_t^{\top} h_i$$
这只是一个数——任何实数都可以,它衡量「解码器现在想要的东西」和「源句第 $i$ 个位置的表示」有多契合。
第二步:把分数送进 softmax,得到注意力分布。
$$\alpha^{t} = \mathrm{softmax}\big(e^{t}\big), \qquad \sum_i \alpha_i^{t} = 1$$
第三步:对编码器隐状态求加权平均。
$$a_t = \sum_{i=1}^{n} \alpha_i^{t} h_i$$
📷 交叉注意力的细节:键与值来自编码器,查询来自解码器
回到原视频 (00:20:00)
(幻灯片把这件事写得更一般:编码器输出向量 $h_1,\dots,h_n \in \mathbb{R}^d$ 作为记忆,提供键和值 $k_i = K h_i,\ v_i = V h_i$;解码器输入向量 $z_1,\dots,z_n$ 提供查询 $q_i = Q z_i$。这正是我们刚刚描述的机制在 Transformer 里的标准写法:自我介绍时提到的 self-attention 是 k/q/v 同源,而这里的 attention 是 k/v 来自编码器、q 来自解码器。)
第四步:拼接起来,过输出层。
把注意力输出和解码器隐状态拼成一个双倍长度的向量:
$$u_t = \big[\,a_t\,;\,s_t\,\big]$$
再乘一个矩阵、过 softmax,就得到词表上的概率分布,选概率最高的词输出:
$$p(y_t \mid y_{ 第五步:重复。 生成第二个词时,把第一个词接下去,重新对每个位置算注意力,得到新的加权平均……如此逐步推进。 编者说明:上面的符号与原课程的标准记号一致($e^t_i$ 表示第 $t$ 步对第 $i$ 个源位置的分数),但具体矩阵名与是否额外接入上一步的注意力输出,不同实现略有差异。以作业三的脚手架为准。 (参考时间: 00:21:37) 注意力被发明出来是彻底的变革性事件。 最早的第一代现代神经机器翻译系统是 2014 年 Google 做的:一个纯 LSTM、八层深、隐状态很大的模型,拿到了不错的结果。 紧接着,蒙特利尔大学的 Dzmitry Bahdanau、Kyunghyun Cho、Yoshua Bengio 做了第二个版本,用了注意力;在大学负担得起的算力预算下,他们取得了更好的结果——注意力就是他们的秘密武器。 从此以后,几乎所有新的神经机器翻译系统都使用注意力。 注意力好在哪里?讲者列了四条: 📷 注意力权重呈现出的词对齐 以课上那个玩具句子「he hit me with a pie」为例:生成第一个词时,模型看着源句的第一个词(il,「他」);生成 hit 时,注意力已经投向 pie 那个位置(法语里 pie 也可以像英语那样当动词用);生成 me 时,注意力落在 m'(「我」)上;再往后生成「with the pie」时,注意力仍然停在源句里对应的名词短语上——这基本上就是你在词对齐里想看到的样子。这相当酷。 (参考时间: 00:25:15) 前面我用了最简单的点积。但一般情况下不止于此。注意力总是包含三件事:算注意力分数 → softmax 得分布 → 得到注意力输出。真正有变化空间的是「怎么算这些分数」,历史上出现过好几种做法。 (1)点积注意力(dot-product attention) $$e_i = s^{\top} h_i$$ 就是直接把两个向量做点积。它能用,但并不好用。原因在上一讲讲 LSTM 时提过:LSTM 的隐状态是它的全部记忆,它要同时存很多东西——帮助输出正确词的信息、关于后面的句子结构和要说什么的信息……既然记忆里什么都装了,那么有些部分适合用来做「回头看」的匹配,有些部分则不适合。你真正想要的是找出「和当前要说的内容相关」的那些部分,而不是全部。 (2)双线性 / 乘法注意力(bilinear / multiplicative attention) 于是在 2015 年,Thang Luong 和讲者本人建议:在两个向量之间插一个矩阵 $W$: $$e_i = s^{\top} W h_i$$ 这个矩阵的参数像网络里其他一切一样去学习。它使得隐状态不必逐维对齐——编码器可能把词义信息存在某几个维度上,解码器把词义信息存在另外几个维度上,通过学习合适的 $W$ 就能把它们匹配起来,从而找出正确的「该注意哪里」的位置。 编者说明:讲者在这里特意提了一句——他仍然觉得「双线性注意力」是更好的名字,但整个世界把它叫成了「乘法注意力」。 下文沿用世界的叫法。 (3)低秩版本:先投影到低维,再点积 双线性的问题是参数太多。讲者用的小例子里隐状态长度只有 6,所以 $W$ 只有 36 个参数;但如果隐状态长度是 1000,这个矩阵就有一百万个参数——这看起来有点问题。 很快有人提出:与其在中间放一个大矩阵,不如把它写成低秩矩阵——用两个「瘦」矩阵相乘得到那个大矩阵,瘦矩阵的宽度就是秩: $$W = U V^{\top}, \qquad e_i = s^{\top} U V^{\top} h_i = (U^{\top}s)^{\top}(V^{\top} h_i)$$ 只要做一点点线性代数就能看出,这个计算完全等价于:先把两个向量各自投影到低维空间,再在低维空间里做点积。 而 Thursday 讲 Transformer 时你会看到,Transformer 做的正是这件事:把大向量投影到低维空间,然后在低维空间里做点积注意力。 (4)加性注意力:让一个小神经网络来打分 课上有同学问:为什么不干脆用一个神经网络去算分数? 讲者的回答是:可以,而这正是历史上最早的做法。 在 Bahdanau 等人的原始论文里,注意力分数是这么算的:把 $s$ 和 $h$ 分别乘一个矩阵、相加、过 tanh、再乘一个向量,得到一个数: $$e_i = v^{\top}\tanh\big(W_1 s + W_2 h_i\big)$$ 这看起来和 LSTM 里到处都在做的计算一模一样——就是一个小神经网络在算注意力分数,然后再进 softmax。文献里把这种叫加性注意力(讲者吐槽:这个名字也很怪,叫「一个小神经网络」更合理)。 (5)为什么讲者「历史倒着讲」 这里有一个有意思的错位:原始论文用的是加性注意力;讲者和 Thang Luong 在第二年发现双线性在他们手上效果更好;后来那场大规模的新机器翻译架构探索又论证说,如果超参数调得好,加性其实比双线性更好——但它更复杂、也慢得多。 而无论谁更好,实践中的赢家是下面那一支: 编者拓展|为什么「低秩」这一支赢了
低秩形式同时满足三个条件:参数可控(秩 $k$ 通常远小于 $d$)、表达力足够(不是零参数的硬性对位)、计算便宜(点积可以写成矩阵乘法,在 GPU 上极为高效)。Transformer 将这一形式进一步一般化——连「同一组向量」都可以投影出不同的 Q/K/V,这就是我们 Thursday 要讲的自注意力。 (参考时间: 00:34:47) 问:为什么不用加一个非线性? 答:我们没有加。当时也觉得并不是特别必要——就是没有加。 问:RNN 上的注意力需不需要位置信息? 答:没有加位置信息,而且看起来也不太需要。 可以论证位置信息也许有用,但同样有很好的理由说它不必要。位置信息真正变得必要,是在你走到 Transformer 的时候。 原因是(回到前面的图):这些编码器状态是相对前一个状态递归算出来的,因为它是循环网络,所以每个位置的表示本身就知道「自己前面发生了什么」,也就大致知道自己处在什么位置。换个说法:最终那个表示已经蕴含了句子的整体语义,而回头看的时候,只要做类似的语义联想匹配就够了,不需要额外的位置信息。到了 Transformer,序列里所有位置是并行处理的、彼此没有先后可言,这时才必须显式地把位置信息加进去。 (参考时间: 00:37:15) 📷 转入期末项目部分的讲义议程页 「神经网络的干货今天就到这里。剩下的 39 分钟,我想讲期末项目,顺便讲一点关于数据和实验的事。」 📷 课程作业与评分政策 迟交政策:6 天免费迟交额度;用完之后每天从课程总分扣 1%,每次作业最多迟交 3 天。 协作政策:去读课程网站和荣誉准则。对项目来说: 使用别人写的代码/资源是完全可以的,我们并不指望你从零实现一切——但你必须把用了什么记录下来(给引用或 URL)。我们不想去分辨哪部分代码是你自己写的、哪部分是从网上下的。 评分看的是你带来的增量价值(value add)。 讲者进一步把这一点说透: 如果你下载了一个非常棒的神经网络、拿它跑了一些数据、得到了非常好的结果——这不算什么了不起的事,这里面没有多少你的增量。 想要有增量,你至少要做点有意思的事:理解它为什么效果这么好、它在什么样的例子上会失败、做足够扎实的实验分析。 如果是多人团队:请简要说明每位成员各自做了什么。绝大多数情况下每位成员拿同样的分数,但我们在极端情况下保留区别对待的权利。 (参考时间: 00:39:20) 📷 期末项目概览:默认项目与自定义项目 关于找导师: 📷 自定义项目可以找助教咨询 讲者说他非常乐意和人聊期末项目,但问题是——他只有一个人,不可能和 500 个人逐个聊。所以在课程办公时间页面的助教列表下,每位助教都写了自己熟悉的方向:如果你知道自己的项目大致是什么,尽量去找最相关的助教,或者找一个看起来友善的助教也行——用什么方式都行,去和助教聊。 (参考时间: 00:43:30) 📷 默认期末项目:小型 Transformer 实现 + 情感分析 讲者在课上的说法是:BERT 是一个著名的早期 Transformer,我们要做的是构建并试验一个最小化的 BERT 实现(讲义页面写的是 GPT-2,见文末「已知疑点」)。具体是: 📷 何时选默认项目 如果你: 那么——做默认项目吧。 很多人应该做它。历年统计上大约一半的学生做默认项目,其中甚至包括一些原本想做自定义项目、两周后发现「我原来那个想法完全行不通」而转过来的同学。 📷 何时选自定义项目 如果你: 那么——做自定义项目吧。 但有两条硬性限制: cs224n 的期末项目必须实质性地同时涉及「人类语言」和「神经网络」。 你显然可以用同样的模型去做生物序列、音乐、雷达数据——但对这门课,我们希望你去了解语言。这不意味着项目只能关于语言:视觉语言模型、音乐与语言的结合都可以,只要语言是实质性的、而非装饰性的。神经网络同理:也不必百分之百都是神经网络——比如你有个想法是用核方法证明它能做到和神经网络一样好,这当然也可以。 📷 关于「选哪条路」的说明 (参考时间: 00:48:43) 讲者用一段「坦白时刻」开场: 老实说,我们现在的处境不如前几年好。这全是 OpenAI 的锅——开玩笑的。一直到去年,我们总能从某家云厂商那里拿到非常慷慨的云计算赠送额度,这些额度提供了大量的算力支持。但现在正赶上大语言模型带来的 GPU 大短缺,云厂商不像以前那么慷慨了。AWS 的代表告诉我,我的这门课是他们去年最大的一笔免费 GPU 资助。所以今年会更难,我们得更多依赖同学们的创造力去找到免费和便宜的资源。 他给出的清单: 这些 GPU 选项的详细文档都已经发在课程讨论区(Ed)上了。 (参考时间: 00:53:29) 📷 项目提案的要求 提案每个团队交一份,所以第一步是先确定你的团队。提案有两个主要组成部分: 篇幅 3–4 页,在 Gradescope 上提交。 📷 写研究论文综述与项目计划的要点 论文综述怎么才算好? 讲者给了一串自我检查的问题清单(技能点:批判性地读一篇研究论文): 项目计划怎么才算好? 首先你得有一个整体上说得通的点子。但绝大多数「不够好的项目计划」,问题都出在具体操作层面: 两类评价要分清(编者整理):讲义明确写着,论文综述的评分主要是总结性的(summative)——它是「打分」,而且提案里的大部分分数都给在这一部分;项目计划的评分主要是形成性的(formative)——它更像反馈,我们会告诉你这个计划现不现实、哪些地方没想清楚。所以:先把论文读透写好,再把计划写清楚。 课上还提到一个今年的新要求:写一段伦理考量(ethical considerations),说明你的工作如果被真正部署到现实世界,可能带来哪些伦理挑战、可以如何缓解。这是现在很多会议和基金申请的要求,先让大家练一段。写多写少取决于你做的是什么:如果只是一个相当直白的问答系统,可能没多少可谈;但在所有情况下,都应该想一想这项工作可能的伦理考量。 整个提案最多四页。 关于基线,讲者特意强调: 任何你在做的事,都应该有东西可以对比。有时候对比对象就是之前做同一件事的系统;但如果你做的更新颖,就得想出一个「凭常识就能想到的显而易见做法」,并证明你能做得更好。这取决于你的项目:如果你要建一个复杂的新网络去计算两段文本的文本相似度,那么一个很简单的做法就是——把两段文本里每个词的词向量取出来求平均,再对这两个平均向量做点积。除非你的复杂网络显著优于这个做法,否则它看起来就不像是个好系统。所以一定要有基线。 (参考时间: 00:59:20) 📷 项目里程碑 里程碑夹在中间,目的是确保每个人都在推进。它本质上是一份进度报告: 对绝大多数项目,我们期望你到这一天已经实现了一个系统、并且有初步实验结果可展示(某些特殊类型的项目除外)。提交同样在 Gradescope 上。 讲者的补充:「对里程碑最核心的期待是,你已经搭好了环境、能跑通东西——哪怕只是那个查词向量的基线——也就是说你已经拿到数据、搭起框架、能跑出一个数字来。」 (参考时间: 01:00:00) 📷 项目报告的典型结构 (参考时间: 01:01:00) 📷 找研究题目的两种基本出发点 一切科学研究的起点基本只有两类: (参考时间: 01:01:50) 📷 项目的常见类型 这不是一张穷尽的清单,但绝大多数项目属于以下几类: 讲者补充说,cs224n 的项目里绝大多数属于前三种——最后你总有个系统、有数据、要做评测。但这不是硬性要求: (参考时间: 01:04:42) 讲者说这一页只是「随便挑的一些例子」,更多往届项目报告都在 cs224n 课程主页上可以找到。 📷 往届项目:Deep Poetry 例一:Deep Poetry。 一个带门控的 LSTM(gated LSTM),思路是:除了作为生成词序列的语言模型之外,模型里还额外加了东西,让输出能按押韵的格式押上韵——生成诗歌。挺好玩的。 📷 往届项目示例 例二:复现一篇没有开源实现的论文。 那时候还没有 Transformer,DeepMind 发表了一些很有意思的论文,讲神经图灵机(Neural Turing Machine)和可微分神经计算机(Differentiable Neural Computer, DNC),但没有放出现成的实现。于是一位叫 Carol 的同学决定自己写一个 DNC 的实现——某种意义上有点疯狂。截止日期前几天,它还没跑起来,本来可能彻底搞砸;但她最终在截止日期前跑通了,并得到了一些有意思的结果。所以:如果你的题目本身足够有意思,它不必是原创的——复现一件有意思的事也可以。 📷 有时项目后来会变成正式发表的论文 例三:从课程项目到正式论文。 那篇论文也出自早期,做的东西比较朴素,但它是新颖的、带来了进展。有时候课程项目后来真的会发展成发表的论文——比如幻灯片上这一项,就是两个 CS224N 项目团队的工作合并后发表在 EMNLP 2022 上。 编者说明:讲者在这一带提到了一篇「比较朴素但有进展」的早期论文,思路大致是:RNN 底部的词向量和顶部输出矩阵的列「某种意义上都是词向量」,于是可以让这两组向量共享,从而获得提升。(讲者说「算了这个我就不细讲了」。由于字幕在此处严重破碎、且对应幻灯片在讲义中没有文字说明,这里只保留其轮廓,不再展开。) 📷 往届项目示例:量化模型 例四:量化模型。 有人做过量化(quantization)方向的项目。这更像一个通用的神经网络技术,但只要你能显示它确实能用来做有用的事——比如即便是量化后的向量也能取得好的语言建模结果——我们就认可它算是在「用语言」。 📷 往届项目示例:代码语言模型 例五:代码语言模型与领域微调。 近两年(幻灯片上这两项来自 2024 年)很多人做的是基于预训练大语言模型的项目——这正是我们接下来几讲要讲的内容。比如有人用参数高效微调提升 Llama 生成 Fortran 代码的能力(讲者打趣:「大概是物理学家吧」)。代码里天然带有自然语言注释,注释在解释你想要这段代码做什么,所以这本质上是在做「人类语言说明 → 代码」的翻译。 例六:多模态的时尚目录生成。 另一个项目做的是「AI 驱动的时尚目录」,把图像转成文本描述——同样是从一个现成的视觉语言模型出发,研究如何微调它。 (参考时间: 01:09:22) 🖼️ 第 27 页幻灯片 · 27 📷 如何找到一个有意思的起点 📷 想在某件事上打败 SOTA? 如果你想在某个任务上刷新最佳成绩,有一些网站会汇总各任务的 SOTA 情况(不过它们并不总是正确): 但讲者也点出了这类清单的缺点:盯着排行榜和往年会议,很容易变成「在别人已经做过的问题上做得稍微好一点点」。这正说明为什么在研究中,想一个稍微不一样的问题往往更聪明——不必离别人做的太远,但要有某种不同,这样你才能做出更原创的东西。 (参考时间: 01:10:55) 📷 如何选题目:两条名言 图灵奖得主、斯坦福荣休教授 Ed Feigenbaum 说,要听从他导师的建议——AI 先驱、图灵奖与诺贝尔奖得主 Herb Simon:
「如果你看到某个研究领域里有很多人在做,那就去别的地方。」 那么该去哪里?Wayne Gretzky 说:
「我滑向冰球将要去的地方,而不是它曾经在的地方。」 (参考时间: 01:11:17) 📷 旧深度学习 NLP 与新深度学习 NLP 讲者说这一页要快速过一下,但它可能是本讲最重要的一页。 「我可以通过不只用常规的注意力、还允许复制注意力来提升摘要系统——你再做一次额外的注意力计算,加一个额外的概率门,直接把输入里的某个词复制到输出。」 这正是当年很多优秀的 cs224n 项目做的事,而且人们常常能从零搭出接近 SOTA 的系统。
- 2019–2024:这条路死了。 好吧,「死了」说得太绝对了;但它变得很难,而且罕见得多。
- 现在大多数工作都是下载一个大预训练模型——这其实固定了你的架构选择,你基本上得和它一起生活。之后动作就落在微调、或者领域自适应 + 微调等等上面。 讲者补充了两点现实: 如果你真有个不一样、够原创的好想法,当然可以做;但确实很难。就像在大语言模型时代,很多项目你根本不需要自己建模型,而是对 LLM 做实验、做上下文学习、或者围绕这些模型组件搭一个更大的「语言模型程序」。 另外要意识到你所处的世界在规模上的现实:有人看到 DeepMind 之类的机构最新推送的论文——用图结构推理、搜索来做某事——就跑来说「我想做这个」。但你继续往下读那篇论文,往往会发现他们是在 32 张 A100 上跑了一个月,这几乎不是你能拥有的算力。除非你是极少数有工业界资源的学生,否则不现实。 但这个「不现实」对世界上绝大多数人都是如此。你去翻博客就会发现,很多人都在用轻量的方式做事,并且把方法写出来——这正是参数高效微调这类方法如此流行的原因:它们可以轻量地做。 (参考时间: 01:12:36) 📷 推荐的工具链:Hugging Face Transformers 对几乎任何实际项目——你有一个数据集、想理解它、想从里面抽出事实之类的——唯一明智的选择就是:使用 Hugging Face Transformers(我们后面有专门的 tutorial),载入一个预训练模型,在文本上跑它,再在它之上和周围做别的事情。 自己搭架构只有在你能「做小」的时候才是明智的选择——那更像一个探索架构的项目:比如「我有个新非线性的想法,我猜它比 ReLU 更好,让我在小规模上验证一下」。 幻灯片给的示例代码(讲义原样,注释里也说明「不是完全可运行的代码,只是给出大致思路」): (参考时间: 01:14:00) 📷 2026 年有意思的方向(一) 现在很多令人兴奋的问题,都是在这个(预训练大模型)世界之内或周围展开的: 编者说明:这里的「谄媚」指模型倾向于附和用户的错误立场;「幻觉」指模型生成看似合理实则不实的内容。二者都是 LLM 评测中的活跃议题。 📷 2026 年有意思的方向(二):把模型做大与做小 (参考时间: 01:15:45) 📷 我能训练 GPT-2 或用 ChatGPT 做期末项目吗? (参考时间: 01:15:47) 课上讲者点名说:欢迎你在项目里使用 GPT-4、Gemini Pro、Claude Opus 或任何这类模型,但那样你就只能用 API——你不可能自己训练这些大模型;连开源的大模型,你也未必加载得进你的 GPU。(Gemini Pro 是 Google 的模型,Claude Opus 出自 Anthropic。) 由此可以做很多有意思的事:上下文学习、提示工程、围绕语言模型组件搭建更大的「语言模型程序」。也很欢迎做分析型项目:这些模型是否仍然带有性别/种族偏见?它们对类比的理解好不好?它们能不能解读情书?——只要是你感兴趣的话题都行。 但请记住: 我们评的是你做了什么有意思的事。 你的项目不应该是:「我把这些东西丢给 GPT-4,它生成了很好的文档摘要,我做完了。」
问题是:除此之外,你做了什么,让它成为一个有意思的研究项目? (参考时间: 01:17:25) 📷 祝项目顺利 🖼️ Slide 39 「我就讲到这里,非常感谢。」 说明:本讲视频是 2024 春季学期第 7 讲,而课程提供的官方幻灯片是 因此,下列页面在本讲的课堂录音中没有被逐页讲述(它们属于讲义的其他环节或其他学期的编排),按规范统一收录在这里,以保证讲义页码一一对应、不丢页。正文中引用的页码均按 📷 Transformer 解码器 📷 Transformer 编码器 页 4 · The Transformer Encoder:解码器的自注意力被限制为单向上下文(适合语言模型);若需要双向上下文(像双向 RNN 那样),就把自注意力里的掩码去掉,这就是编码器。 页 5 · The Transformer Encoder–Decoder:机器翻译这类 seq2seq 任务使用「编码器 + 解码器」结构;解码器被改造为对编码器输出做交叉注意力。本讲 00:00:49 起讲者展示的正是同构的 LSTM 版 encoder–decoder 图。 📷 文档生成任务上的 Transformers 📷 Transformer 还有哪些可以改进之处 📷 是否真的需要去掉注意力的二次开销 这几页属于讲义中「5. Finding data for your projects」一节。本讲视频里,讲者只在讲提案时提了一句「要说清你用什么数据、怎么评测」,没有逐页展开数据源,因此收录于此——但它们对选题极其有用,建议读者顺着链接查一查。 📷 为项目找数据 📷 Linguistic Data Consortium 📷 Hugging Face Datasets 📷 机器翻译数据 📷 不同类型的数据集 📷 更多数据集来源 这部分是讲义中「6. Care with datasets and in model development」与实验策略的内容。本讲录音在这段之前就转入了「找题目」和「LLM 时代」,因此未逐页讲述;但它们是做项目时最容易翻车的地方,强烈建议通读。 页 45 · Care with datasets and in model development:公开数据集通常自带 train/dev/test 划分,我们靠荣誉制度约束自己——只有开发完成后才跑测试集。这样的划分预设了数据集比较大;如果没有 dev 集、或者你还想要一个单独的调参集,就从训练数据里切。要权衡「切出来的集合够不够大」和「训练集被削掉多少」。交叉验证(cross-validation)是在数据很少时最大化利用数据的技术。固定测试集保证了所有系统对同一份金标准比较,总体上很好,但当测试集本身有异常性质时,就会扭曲这个任务的进展。 页 46 · Training models and pots of data:训练时模型会过拟合到它所训练的东西——它正确描述了训练数据里恰好发生的事,但这些模式不够一般,未必适用于新数据。监视和避免有害过拟合的办法,就是使用独立的验证集和测试集。 页 47 · Training models and pots of data:在训练集上估计/训练模型;常常在另一个独立数据集——调参集(tuning set)——上进一步设定超参数(调参集就是超参数的训练集);在开发集(dev set / 验证集)上观察进度;如果你反复这么做,你会过拟合到开发集,所以最好再准备第二个开发集 dev2;只有到最后,才在测试集上评测并报告最终数字——测试集要极少使用,理想情况下只用一次。 页 48 · Training models and pots of data:训练集、调参集、开发集、测试集必须完全不相交。在训练过的材料上报告测试结果是不合法的,那会得到虚假的好成绩。我们几乎总会在训练集上过拟合,所以需要一个独立的调参集(否则超参数不会设对)。如果你一直在同一个评测集上跑,你就会开始过拟合那个评测集——实际上你是在「用评测集训练」,学到了「在这个特定评测集上什么有用、什么没用」。要得到有效的系统性能度量,你需要另一个未被训练过的、独立的测试集——所以才有 dev2 和最终测试集。 页 49 · Getting your neural network to train:先抱着积极的心态——神经网络是想学的,如果它没在学,那是你做了什么妨碍了它。然后要认识到残酷现实:有很多原因会让神经网络完全学不动、或者学得很差;找到并修好它们(「调试与调参」)花的时间往往比实现模型本身还多;这些原因很难查清,但经验、实验上的细心和一些经验法则会有帮助。 页 50 · Experimental strategy:增量地做。先用一个非常简单的模型把它跑通——修一个复杂但有毛病的模型是非常难的;然后逐个加上「花哨的部件」,每加一个都保证模型能跑(不行就放弃它)。先在极少量数据上跑:在小数据集上你更容易看出 bug,而且训练极快,4–8 个样本就很好,用合成数据往往也行。确保你能在这份数据上拿到 100%(在训练集上测)——否则你的模型要么能力不够,要么就是坏的。 📷 实验策略(二):在大数据集上训练 📷 细节很重要 本节集中列出本次重构中不确定的地方,供读者自行判断。逐条给出依据或时间点。 讲义版本与课堂版本不一致(最重要的一条)。
视频标题为 Stanford CS224N Spring 2024 Lecture 7 – Attention, Final Projects and LLM Intro,而课程目录中提供的官方幻灯片为 讲者身份。录音中讲者说「Thang Luong 和我在 2015 年提出……」(参考时间: 00:27:18),这是 Christopher Manning 的口吻;但官方讲义署名是 Diyi Yang(2026 版)。本书正文统一称「讲者」,不对身份下断言。 默认项目的模型是 BERT 还是 GPT-2。
参考时间: 00:43:30 讲者口述为「BERT 是一个著名的早期 Transformer,我们要构建并试验一个最小化的 BERT 实现」;而讲义页 15 写的是「补全 GPT-2 的实现(attention、transformer block),再微调做情感分析」。二者冲突,本讲无法当场判定。正文以讲者口述为主、并标注了讲义版本。建议以课程当年的项目 handout 为准。 字幕严重破碎的几处(已按上下文做最小化改写,不做臆测补全): 01:04:42 前后 幻灯片页 25 只写了三个名字「Stanley Xie, Ruchir Rastogi and Max Chang」,页 26–30 无文字。编者按讲者讲述顺序(诗歌生成 → DNC 复现 → 早期论文 → 发表情况 → 量化 → 代码模型 → 时尚目录)与页 25–30 一一对应,这一对应关系是编者推断,不是讲义明示。 作业编号与截止日期。本讲中讲者多次说「作业三里会有讨论/有一个 bug」(参考时间: 00:17:46、00:33:38),而讲义页 2 写的是「Assignment 3 is out today」;讲义页 19、21 给出的截止日期是 2 月 10 日(提案)与 2 月 24 日(里程碑),这些是 2026 版讲义上的日期,并非 2024 年这一讲的实际日期。正文保留其原样并加注,请勿据此安排自己的时间。 「2024」与「2026」在讲义中的混用。讲义页 34 标题为 Old Deep Learning (NLP), new Deep Learning NLP,正文写「2019–2024 那段做法已死」;页 35、36、37 标题写「2026 NLP」。这些年份来自 2026 版讲义,与视频年份(2024)不一致。正文按讲者口述改为「近五年」等表述,同时保留讲义原文的年份引用。 BLEU 公式与「数百种指标」的说法。讲义与课堂都没有给出 BLEU 的完整公式,正文中「编者拓展|BLEU 的正式定义」是按 Papineni et al. (2002) 原论文补写的,其中的权重 $w_n=1/4$、$N=4$、简短惩罚形式均为该论文的标准定义,但讲者本人并未在课堂上陈述这些式子。 注意力的符号。讲者使用的符号是编码器隐状态 $h_i$、解码器隐状态 $s_t$、分数 $e^t_i$(参考时间: 00:19:02–00:21:30);讲义页 6 则使用 $h_i$(编码器输出)与 $z_i$(解码器输入)、以及 $k_i=Kh_i,\ v_i=Vh_i,\ q_i=Qz_i$ 的 Transformer 写法。两套符号都在正文中出现并已分别标注来源,读者不要混淆。 注意力打分函数的历史顺序。讲者自述「这里是非历史地(ahistorical)在讲——我先讲了点积,但最早提出的其实是加性」(参考时间: 00:28:53–00:31:00)。正文按此说明保留了两条线的错位,但四种打分的「谁先谁后、谁更好」在文献中仍有争论,讲者也只给出了自己团队的经验与后续工作的结论。 算力信息的时效性。Google 每人 50 美元 GCP 额度、Together AI 50 美元 API 额度、Colab Pro 每月 10 美元等,都是 2024 年那次课堂上的信息,早已过时;正文保留它们是为了完整呈现讲者的推理与当时的现实约束,不要当作当前可用的资源清单。 未展开的术语。讲者提到的 sycophancy、factuality、mechanistic interpretability、circuit training、compositionality 等,课堂上都只是一笔带过(参考时间: 01:14:15),讲义也只有词条没有解释。正文以「编者说明」给了最简释义,深度不足,想深入需自行查阅。 本讲未发现明显疑点的部分:机器翻译评测史(短语统计 → 句法统计 → NMT)的叙述、注意力动机的推演、以及项目评分/提案/里程碑/报告的规则说明,字幕与讲义基本一致,编者未作实质性改动。 下面这些页来自官方幻灯片,但课堂录制里没有对应的展示画面。由 🖼️ Slide 40 🖼️ Slide 41 🖼️ Slide 42 🖼️ Slide 43 🖼️ Slide 44
2.4 注意力的来历与价值
回到原视频 (00:24:12)2.5 注意力分数怎么算:四种写法
打分方式
形式
参数量
结局
点积
$s^\top h_i$
0
简单但不够好
双线性 / 乘法
$s^\top W h_i$
$d\times d$
当年更好用,参数量大
低秩投影 + 点积
$(U^\top s)^\top(V^\top h_i)$
两个 $d\times k$
成为 Transformer 与几乎所有现代网络的标配
加性(小神经网络)
$v^\top\tanh(W_1 s + W_2 h_i)$
更多
历史上最早;调好超参更强但更慢更复杂
graph LR
A["点积<br/>s·h : 无参数"] --> B["双线性<br/>s·Wh : 全矩阵参数多"]
B --> C["低秩分解<br/>W = UV^T"]
C --> D["等价于:两边投影到低维<br/>再点积"]
D --> E["Transformer 采用的<br/>Q/K 投影 + 点积注意力"]
A -.->|"更早的原始论文"| F["加性注意力<br/>一个小神经网络"]
F -.->|"更强但更慢更复杂"| D
2.6 课末问答:非线性与位置信息
三、期末项目:规则、类型与选择
回到原视频 (00:37:20)3.1 评分、迟交与协作政策
回到原视频 (00:37:40)
3.2 团队与工作量预期
回到原视频 (00:39:40)
回到原视频 (00:43:00)3.3 默认项目 vs. 自定义项目
默认项目
回到原视频 (00:43:50)
什么时候该选默认项目
回到原视频 (00:44:35)
什么时候该选自定义项目
回到原视频 (00:46:00)
「博弈」:两个选项都不是捷径
回到原视频 (00:47:35)
graph TD
Q{"你有明确想做、<br/>甚至已经在做的研究题目吗?"} -->|"没有,想被带着走"| D["默认项目<br/>补全小 Transformer 实现 → 微调做情感分析 → 自由扩展"]
Q -->|"有"| C{"它是否实质性同时涉及<br/>人类语言 与 神经网络?"}
C -->|"是"| CUS["自定义项目<br/>需提交提案并获批"]
C -->|"否"| D2["调整题目,或改做默认项目"]
D --> M["组队(1–3 人,鼓励组队)"]
CUS --> M
M --> T["提案 → 里程碑 → 海报/网页摘要 → 报告"]
3.4 算力:2024 年的现实
四、项目的四个阶段
4.1 提案(Project Proposal,8%)
回到原视频 (00:53:50)
回到原视频 (00:55:00)
4.2 里程碑(Project Milestone,6%)
回到原视频 (00:59:35)
4.3 最终报告(Project Writeup,32%)
回到原视频 (01:00:20)
graph LR
P["项目提案 8%<br/>2 页论文评审 + 项目计划"] --> MS["里程碑 6%<br/>进度报告,应已完成过半"]
MS --> PO["海报 / 网页摘要 3%"]
PO --> R["最终报告 32%<br/>会议论文式,最多 8 页"]
五、如何找题目:钉子、锤子与往届项目
5.1 两种出发点
回到原视频 (01:01:30)
5.2 项目类型
回到原视频 (01:02:10)
5.3 往届项目示例
回到原视频 (01:04:55)
回到原视频 (01:05:35)
回到原视频 (01:06:40)
回到原视频 (01:07:20)
回到原视频 (01:08:20)5.4 去哪里找灵感
回到原视频 (01:09:40)
回到原视频 (01:10:20)
5.5 一句忠告:去冰球要去的方向
回到原视频 (01:11:15)
六、2024 年之后的 NLP:从造架构到用模型
6.1 时代变了
回到原视频 (01:11:40)
6.2 标准工作流:Hugging Face Transformers
回到原视频 (01:12:50)
pip install transformers # By Huggingface
# Tutorial: Fri Feb 6, 1:30-2:50pm
# not quite runnable code but gives the general idea….
from transformers import BertForSequenceClassification, AutoTokenizer
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
model.train()
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
fine_tuner = Trainer(model=model, args=training_args,
train_dataset=train_dataset, eval_dataset=test_dataset)
fine_tuner.train()
eval_dataset = load_and_cache_examples(args, eval_task, tokenizer, evaluate=True)
results = evaluate(model, tokenizer, eval_dataset, args)
6.3 现在有前景的方向
回到原视频 (01:14:15)
回到原视频 (01:14:40)
6.4 规模现实主义:能训什么、能载什么
回到原视频 (01:15:50)
6.5 用 GPT-4 / Gemini / Claude 做项目
回到原视频 (01:17:25)
附录:课堂未展示的幻灯片
cs224n-2026-lecture06-final-project.pdf(2026 版讲义,封面标注为 Lecture 6)。两版内容与顺序并不完全一致:2026 版讲义的开头是「上一讲 Transformer 的快速回顾」,而 2024 年这一讲的实际开头是「机器翻译评测 + 注意力」。slides_text.md 的编号标注。A. Transformer 架构回顾页(讲义页 3–5)
回到原视频 (00:33:45)
回到原视频 (00:34:05)
B. Transformers 的其他结果与未解决的开放问题(讲义页 8–10)
回到原视频 (00:11:55)
回到原视频 (00:33:50)
回到原视频 (00:34:10)
C. 数据与数据集(讲义页 39–44)
回到原视频 (00:55:30)
回到原视频 (00:55:35)
回到原视频 (00:55:40)
回到原视频 (00:55:45)
回到原视频 (00:55:50)
回到原视频 (00:55:55)
D. 数据集使用规范与实验方法论(讲义页 45–52)
回到原视频 (00:56:00)
回到原视频 (00:56:05)
附:参考与延伸阅读
编者补充
已知疑点
cs224n-2026-lecture06-final-project.pdf,封面写的是 CS224N/Ling284, Diyi Yang, Lecture 6: Final Projects & Practical Tips。两者在年份、讲次编号、章节顺序上都不一致:2026 版讲义开头是「上一讲 Transformer 回顾(15 分钟)」,而 2024 年这一讲实际的开头是「机器翻译评测 + 注意力」。因此本讲幻灯片引用只是主题对应,并不保证课堂上真的翻到了那一页。文末「附录」中收录的 20 页即为此种对应关系下无法确证被讲到的页面。American 未命中、International Airport 在第二份参考译文中命中)。
附录:课堂未展示的幻灯片
附录:官方幻灯片里课堂未展示的页
vb slides 自动补入,供对照查阅。