Final Project 实战完全指南

面向 NLP 研究生的深度教材 · 改编自 Stanford CS224N Winter 2026 Lecture 6 (Diyi Yang)
覆盖:Transformer 三架构 · 项目方法论 · 研究问题定义 · Baseline 设计 · 2026 LLM 前沿 · 实战 Cookbook
版本 1.0 · 2026 春 · 教材整理:研究生学习版 · 编译于 2026-05

引论:Final Project 不是作业,而是研究入门

本教材整理自 CS224N (Winter 2026) Lecture 6 Final Projects & Practical Tips(Diyi Yang)。原讲义 55 页 PPT 在 45 分钟里同时承担了三件事:复盘上节课的 Transformer、宣布 Assignment 3、并把"如何做一个 NLP 研究项目"压缩成一份高密度的实践指南。 对于研究生读者,这一讲是从"会做作业"过渡到"会做研究"的分水岭。它回答的不是"如何拿高分",而是:

📐 本教材的写作原则
  1. 立体重写:原讲义的每个 bullet 都展开成"概念→直觉→公式/代码→陷阱"四段式。
  2. 2026 增量:原讲义没来得及讲的 FlashAttention、RoPE、o1 推理、Agents、Mech Interp 等,全部补齐到 2026 年 5 月。
  3. 可执行:所有"实战 cookbook"段落都是能直接 copy 到 PyTorch 脚本里跑的代码。
  4. 诚实标注时效:凡涉及"目前 SOTA"或"主流做法"的判断,都注明日期,便于一年后自检。

本教材的导航图

flowchart TD A["第一部分
Transformer 三架构
+ FlashAttn + RoPE"] --> B["第二部分
FP 总览
Default vs Custom"] B --> C["第三部分
项目生命周期
Proposal/Milestone/Report"] C --> D["第四部分
找课题方法论
Nails vs Hammers"] D --> E["第五部分
2026 LLM 前沿
(强化)"] E --> F["第六部分
实战 Cookbook
(强化)"] F --> G["第七部分
数据 & 现代基准"] G --> H["第八部分
训练原则"] H --> I["第九部分
15 个选题模板"] I --> J["附录"] style A fill:#fbecec style E fill:#fff7e6 style F fill:#eafaf0

课程定位

前置课程
Lecture 1-5:词向量、神经网络、依存解析、RNN LM、Transformer 与 Attention
同期内容
Lecture 6:本课(Final Project 实用提示)+ Assignment 3 发布(minBERT/minGPT 风格)
本课主线
15 分钟 Transformer 复盘 + 30 分钟项目方法论 + Q&A
下游对接
Lecture 7 Pretraining → Lecture 8 Post-training → Lecture 9 PEFT → Lecture 10 RAG/Agents
Project 时间表
Proposal 2 月 10 日 → Milestone 2 月 24 日 → Final Report 3 月底(参见 §3.1)
Lab Wiki 对照
research/methodology.mdresearch/paper-writing.mdnlp/transformers.mdfrontiers/agents/

第一部分:Transformer 三架构回顾(深化 + 2026 新增)

原讲义用 15 分钟、8 张幻灯片复盘 Transformer。这是个高度浓缩的时间预算,对于已经看过教材 Lecture 5 的读者,可以快速扫读 §1.1–1.3,重点看 §1.4 cross-attention 维度推导、§1.8 RoPE / YaRN 完整推导,以及 2026 年才补齐的 §1.10 FlashAttention§1.11 KV cache + MQA/GQA/MLA

1.1 Decoder:因果掩码与自回归

Transformer Decoder 是 Decoder Block 的堆叠。每个 block 固定四件套:

  1. Masked Multi-Head Self-Attention:当前 token 只能 attend 到自己和之前的 token(causal mask)
  2. Add & Norm:残差 + LayerNorm,2026 年实现普遍是 Pre-LN(norm 在 sub-layer 输入处)
  3. Feed-Forward Network:两层 MLP,中间维度 $d_{\text{ff}} = 4 d_{\text{model}}$ 是经典默认;LLaMA 系用 SwiGLU 把它压成 $\approx 2.67 d_{\text{model}}$ 后再分三路
  4. Add & Norm:再做一次残差 + LayerNorm
Decoder Inputs Embeddings Add Position Embeddings Block (×N) Masked Multi-Head Attention Add & Norm Feed-Forward Add & Norm Linear → Softmax Probabilities
图 1.1:Decoder 单 Block 结构。注意 mask 出现在 self-attention 内部,不在 Add & Norm 上。

Causal mask 的数学形式

公式 1.1 — Causal Mask
对长度 $n$ 的序列,在 softmax 之前给 attention logits 加一个上三角全 $-\infty$ 的矩阵: $$ M_{ij} = \begin{cases} 0 & j \le i \\ -\infty & j > i \end{cases}, \qquad \text{Attn}(Q,K,V) = \operatorname{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}} + M\right) V $$ $-\infty$ 经过 softmax 后变成 $0$,等价于"未来 token 的 value 不参与加权"。
⚠️ 训练时一次性算完,推理时增量算(KV cache)
训练时 GPT 类模型一次性把整段 $n$ 个 token 喂进去,配合 causal mask 做并行 teacher forcing;推理时则必须自回归生成,每生成一个新 token,把它的 K、V 追加到 cache(见 §1.11)。训练和推理的计算图不一样,这是很多人写 inference loop 写到怀疑人生的源头。

1.2 Encoder:去掉 mask 的双向上下文

Encoder block 与 decoder block 的差别只有一处:把 Masked Multi-Head Attention 改成普通的 Multi-Head Attention(去掉 mask $M$)。这意味着 token $i$ 可以同时看到左右两边的所有 token,类似 BiLSTM。

代表模型
BERT、RoBERTa、DeBERTa、ELECTRA、ModernBERT (2024)
典型任务
分类(情感、NLI)、抽取式 QA、序列标注(NER、POS)、retrieval(DPR、E5、bge)
为什么不能直接做 LM?
双向上下文 + 标准 LM 训练目标会"作弊"(每个位置都能看到答案)。BERT 用 MLM(masked language model)绕开:随机 mask 掉 15% 的 token 后做 cloze。
2026 现状
纯 encoder 在 retrieval / embedding 任务上仍是主力;分类任务大多被 decoder-only LLM 抢走(zero-shot prompt 就能干)。

1.3 Encoder-Decoder:seq2seq 的现代化身

当任务是"输入一个序列 → 输出一个序列"(翻译、摘要、数据到文本),自然的形态是把 encoder 和 decoder 拼起来。Decoder 多一层 cross-attention,用来"从 encoder 的输出 memory 里取信息"。

Encoder Block (×N) Multi-Head Attention Add & Norm Feed-Forward Add & Norm Encoder Inputs Decoder Block (×N) Masked Multi-Head Attn Add & Norm Multi-Head Attn (Cross) Add & Norm Feed-Forward Add & Norm Decoder Inputs K, V from encoder
图 1.2:Encoder-Decoder 整体。注意红色箭头:encoder 输出作为 cross-attention 的 K、V。
代表模型
原版 Transformer (Vaswani 2017)、T5、BART、mT5、Flan-T5、NLLB(多语翻译)
典型任务
机器翻译、摘要、grammatical error correction、code-to-text
2026 现状
除翻译外,多数 seq2seq 任务都被 decoder-only LLM 用"prompt + 生成"统一了。但 encoder-decoder 在多模态(如 Whisper、Florence-2、Idefics 用 encoder 接视觉/语音)里大量复活。

1.4 Cross-Attention 维度推导

Self-attention 中 Q、K、V 来自同一个来源。Cross-attention 中:

公式 1.2 — Cross-Attention
$$q_i = W_Q z_i,\quad k_j = W_K h_j,\quad v_j = W_V h_j$$ $$\text{out}_i = \sum_{j=1}^{n} \operatorname{softmax}_j\!\left(\frac{q_i \cdot k_j}{\sqrt{d_k}}\right) v_j$$ 直觉:每个 decoder 位置 $i$ 都把 encoder 的整段输出当作"外部记忆"来检索。
1 Decoder 输入是 $Z \in \mathbb{R}^{m \times d}$;encoder 输出是 $H \in \mathbb{R}^{n \times d}$。
2 $Q = Z W_Q \in \mathbb{R}^{m \times d_k}$,$K = H W_K \in \mathbb{R}^{n \times d_k}$,$V = H W_V \in \mathbb{R}^{n \times d_v}$。
3 $\text{logits} = Q K^\top / \sqrt{d_k} \in \mathbb{R}^{m \times n}$,softmax 沿"key 维度" $n$ 归一化。
4 输出 $O = \operatorname{softmax}(\cdot) V \in \mathbb{R}^{m \times d_v}$,再经 $W_O$ 投回 $d_{\text{model}}$。
💡 为什么没有 cross-attention mask?
Encoder 的输出对 decoder 任何位置都是"已知"的(已经看完整段输入了),所以没有 causal 约束。只在填充 padding 时需要 mask 掉对应位置。

1.5 Scaled Dot-Product:√dₖ 的来历

为什么 $QK^\top$ 要除以 $\sqrt{d_k}$?这是个常考概念,原讲义一笔带过,这里完整推导一遍。

1 假设 $q, k \in \mathbb{R}^{d_k}$ 的每个分量独立同分布,均值 0,方差 1。
2 点积 $q \cdot k = \sum_{i=1}^{d_k} q_i k_i$。每一项 $q_i k_i$ 期望为 0,方差为 $\mathbb{E}[q_i^2]\mathbb{E}[k_i^2] = 1$。
3 故 $\operatorname{Var}(q \cdot k) = d_k$,标准差 $\sqrt{d_k}$。当 $d_k$ 很大时,点积量级也大。
4 softmax 在大量级输入下会"饱和"——某一个 $\exp$ 项压过其他所有项,梯度近乎为 0。
5 除以 $\sqrt{d_k}$ 把方差缩回 1,softmax 不饱和,梯度健康。
✅ 实际数值感
$d_k = 64$(标准 head size):未缩放时点积 std $= 8$;缩放后 std $= 1$。 softmax 输入跨度从 $\pm 20$ 量级降到 $\pm 3$ 量级,导数从 $10^{-9}$ 量级回到 $10^{-1}$ 量级。

1.6 经典实验结果与 perplexity

原 Transformer 论文(Vaswani et al., 2017)在 WMT 2014 EN-DE 上拿到 BLEU 28.4(big)/ 27.3(base),同时训练成本只有 ConvS2S 的 1/4:

ModelBLEU EN-DEBLEU EN-FRTrain cost (FLOPs)
GNMT + RL24.639.92$2.3\times10^{19}$
ConvS2S25.1640.46$9.6\times10^{18}$
Transformer base27.338.1$3.3\times10^{18}$
Transformer big28.441.8$2.3\times10^{19}$

对长文档生成(Liu et al., 2018, WikiSum),Transformer-DMCA 把 test perplexity 从 seq2seq 的 5.05 降到 1.90,ROUGE-L 从 12.7 提到 38.8 —— 几乎是"换架构 = 重新发明任务"。

Perplexity 直觉

公式 1.3 — Perplexity
$$\text{PPL} = \exp\!\left(-\frac{1}{N}\sum_{i=1}^{N}\log p(w_i \mid w_{<i})\right) = \exp(\text{cross-entropy})$$ PPL = $V$ 意味着模型每一步在 $V$ 个等概率候选中"平均"挑选;越小越好,下界是 1。

1.7 待改进 ①:二次复杂度

Self-attention 的算力开销主要是 $QK^\top$($O(n^2 d)$)和 attention $\times V$($O(n^2 d)$); 显存开销则被 $n \times n$ 注意力矩阵主导 $O(n^2)$。 当 $n \ge 50{,}000$(长文档、整本书),$n^2 = 2.5 \times 10^9$,单层就会撑爆显存。

方案复杂度代表工作2026 落地度
稀疏 attention(local + stride)$O(n\sqrt n)$ 或 $O(n)$Sparse Transformer, Longformer, BigBird退潮,被 RoPE+滑窗 + FlashAttn 替代
线性 attention(核近似)$O(n d^2)$Performer, Linear Transformer, Mamba (SSM)Mamba/Mamba-2/Jamba 仍活跃
分块/滑窗$O(n w)$,$w$=窗口Mistral SWA, Gemma-2 局部+全局交替主流 LLM 标配
IO-aware 精确 attention仍 $O(n^2)$ 但线性显存FlashAttention v1/v2/v3 (§1.10)事实标准
检索 + 短窗$O(n)$RAG、Memorizing TransformerRAG 是 2024-26 主流(见 L10

1.8 待改进 ②:位置编码演进(RoPE 完整推导 + YaRN)

Transformer 自身对位置是"置换不变"的,必须额外注入位置信号。演进路线:

  1. 绝对正余弦(原版):$\operatorname{PE}_{(\text{pos},2i)} = \sin(\text{pos}/10000^{2i/d})$,加在 embedding 上
  2. 学习的绝对位置嵌入(BERT, GPT-2):每个位置一个可训练向量,无法外推
  3. 相对位置 bias(T5, Shaw et al. 2018):在 attention logits 上加 $b_{i-j}$
  4. ALiBi(Press et al. 2022):线性距离惩罚 $-m \cdot |i-j|$,无参数,可外推
  5. RoPE(Su et al. 2021):把位置变成复数旋转,被 LLaMA/GPT-NeoX/Qwen/DeepSeek 全部采用
  6. NTK-aware / YaRN / LongRoPE(2023-2024):在不重新预训练的前提下把 RoPE 上下文从 4K 扩到 128K+

RoPE 完整推导

核心思想:让 $q_m$ 和 $k_n$ 的点积只依赖于相对位置 $m-n$

1 把 $d$ 维向量按维度两两配对成 $d/2$ 个二维平面 $(x_{2i}, x_{2i+1})$。
2 在位置 $m$,对第 $i$ 对应用旋转矩阵: $$ R_{\theta_i, m} = \begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \cos m\theta_i \end{pmatrix},\quad \theta_i = 10000^{-2i/d} $$
3 令 $\tilde q_m = R_{\Theta,m}\, q,\ \tilde k_n = R_{\Theta,n}\, k$。则 $$\tilde q_m^\top \tilde k_n = q^\top R_{\Theta,m}^\top R_{\Theta,n} k = q^\top R_{\Theta, n-m} k$$ (旋转矩阵的复合就是角度相加;$R^\top R = I$)
4 内积只依赖差 $n-m$,这正是相对位置编码想要的性质——不靠 bias,靠几何
🔭 上下文外推:YaRN / NTK-aware
RoPE 训练时只见过角度 $m\theta_i$,$m \in [0, L_{\text{train}})$。当推理时 $m > L_{\text{train}}$,高频维度的角度会进入"训练时从未出现"的区域,模型崩溃。
  • Position Interpolation (PI): 把所有 $m$ 缩放成 $m \cdot L_{\text{train}}/L_{\text{new}}$。简单但损害短距离精度。
  • NTK-aware scaling: 只缩放低频维度(base $10000 \to 10000\alpha$)。
  • YaRN (Peng et al. 2023): 分段处理 — 完全保留高频、interpolate 中频、extrapolate 低频,并加一个 attention temperature 修正。
  • LongRoPE (Microsoft 2024): 用进化搜索找最优非均匀缩放因子,把 LLaMA-2 7B 扩到 2M token。

1.9 为什么大模型仍然用 quadratic attention?

原讲义抛出一个看似矛盾的事实:

"In practice, almost no large Transformer language models use anything but the quadratic cost attention we've presented here."

解释这个现象需要算两笔账:

算力账
对一个 $d=4096$、$n=4096$ 的 LLM,attention FLOPs ≈ $4 n^2 d = 2.7 \times 10^{11}$,FFN FLOPs ≈ $16 n d^2 = 1.1 \times 10^{12}$。FFN 是 attention 的 4 倍。当 $n$ 不超过 $d$ 时,attention 不是瓶颈。
质量账
近似 attention 在小规模上指标接近 baseline,但 scale up 到 7B+ 后系统性掉点,且常常在 in-context learning / 长程依赖上更明显。
2026 例外
状态空间模型 Mamba/Mamba-2、Jamba(Mamba+MoE+Attention 混合)、RWKV-7 在某些任务(特别是超长上下文 + 流式)已经能打。但旗舰模型 GPT-5、Claude 4、Gemini 2.x 仍是quadratic + FlashAttention + 滑窗 的工程组合。

1.10 【新】FlashAttention 与 IO-aware 算子

原讲义没讲,但这是 2022-26 年 attention 落地的最大变量。

问题:HBM 带宽才是真瓶颈

GPU 计算很快但内存带宽慢。标准 attention 实现把 $n \times n$ 的 attention matrix 写回 HBM 再读回来做 softmax,造成大量 IO。FlashAttention 的关键洞察:用 tiling + 在 SRAM 内完成 softmax,避免物化 $S$ 和 $P$ 矩阵。

公式 1.4 — Online Softmax (Milakov & Gimelshein 2018)
软最大化可以分块流式计算:维护 $(m_i, \ell_i)$,其中 $m_i$ 是当前最大值、$\ell_i$ 是归一化常数: $$ m_i^{\text{new}} = \max(m_i, m_{\text{block}}),\quad \ell_i^{\text{new}} = e^{m_i - m_i^{\text{new}}} \ell_i + e^{m_{\text{block}} - m_i^{\text{new}}} \ell_{\text{block}} $$ 对应的输出向量按相同因子更新。分块结果与一次性计算等价(数值上)。
版本年份关键改进实测加速
FlashAttention v12022tiling + online softmax, 不物化 $S/P$2-4× vs PyTorch SDPA
FlashAttention v22023降低非矩阵 FLOPs,更好并行(warp 级)再 1.5-2×
FlashAttention v32024H100 异步 (TMA + WGMMA)、FP8 路径FP16 1.5-2×,FP8 再 2×
✅ 你需要做的
PyTorch 2.x 的 torch.nn.functional.scaled_dot_product_attention 已经会自动选择 FlashAttention kernel。手写循环或 einsum 实现的 attention 会被它免费踩死,速度差 5-10 倍。
import torch.nn.functional as F
# Q, K, V: (B, H, N, D)
out = F.scaled_dot_product_attention(Q, K, V, is_causal=True)
# 自动用 FlashAttention(如果硬件支持);否则 fallback 到 math 或 mem-efficient

1.11 【新】KV cache、MQA、GQA、MLA

推理时每生成一个新 token 都需要重新算 attention。如果每次都从头算,复杂度是 $O(n^3)$。KV cache 把所有历史 token 的 K、V 缓存下来,新 token 只算自己的 K、V,对历史 cache 做一次 attention,单 step 复杂度 $O(n d)$。

KV cache 的内存问题

公式 1.5 — KV cache 显存
$$ \text{KV mem} = 2 \times n_{\text{layers}} \times n_{\text{heads}} \times d_{\text{head}} \times L \times \text{batch} \times \text{bytes} $$ LLaMA-2 70B(80 层 × 64 头 × 128 维),$L=4096$, batch=1, FP16: $2 \times 80 \times 64 \times 128 \times 4096 \times 1 \times 2 \approx \mathbf{10.7\ GB}$ —— 比模型参数本体(140 GB at FP16 / 35 GB at INT4)少,但比想象的大很多,长上下文 + 大 batch 时会成为瓶颈

解决方案谱系

方案原理KV 缩减代表模型
MHA (baseline)$H$ 个 Q、K、V 头原版 Transformer, GPT-3
MQA (Shazeer 2019)$H$ 个 Q,但所有头共享 1 套 K、V$H$×PaLM, Falcon, Gemini 1
GQA (Ainslie 2023)$H$ 个 Q,每 $g$ 个头共享 1 套 K、V$g$×(典型 4-8×)LLaMA-2/3, Mistral, Qwen2
MLA (DeepSeek-V2 2024)把 K、V 用低秩 latent 压缩$\sim$10×DeepSeek-V2/V3, R1
💡 工程含义
GQA 已经是 2025-26 年的"事实默认":质量比 MHA 几乎不掉,推理吞吐能翻几倍。如果你的 custom project 涉及"用预训练模型做长上下文应用",用 vLLM 部署 + GQA 模型是最省 GPU 的组合。

第二部分:Final Project 总览

2.1 评分政策与课程定位

组成占比说明
4 × 1.5 周 Assignments48%a1 6% + a2/a3/a4 各 14%;a3 是 minGPT/minBERT,难度跳级
Final Project49%Proposal 8% + Milestone 6% + Poster/Web 3% + Report 32%
Participation3%Ed 提问、guest lecture 反应、课程评估、karma
📐 项目 = 半门课
49% 的占比意味着:你在最后 8 周里花在项目上的精力,应该不少于前 6 周写全部 4 个 assignment 的总和。如果你以"作业的强度"对待项目,会被报告里那 32% 直接判死刑。
Late day 政策
6 天免费晚交;超出后每天扣总分 1%,单个 assignment 最多用 3 天
合作政策
可用现成代码/资源,必须 document,且按"value-add"评分
团队
1-3 人;多人项目期望工作量随人数线性增加
语言/框架
不限,但 99% 用 PyTorch(也方便 TA debug)

2.2 Default vs Custom:决策矩阵

flowchart TD A[开始选项] --> B{你有具体感兴趣的
研究课题吗?} B -- 是 --> C{有数据 + 评估方案吗?} B -- 否 --> D[Default Final Project] C -- 是 --> E{8 周内可完成原型吗?} C -- 否 --> F[先做 Default
把课题留到下学期] E -- 是 --> G[Custom Final Project] E -- 否 --> H[缩小 scope
或转 Default] style D fill:#eafaf0 style G fill:#fff7e6 style F fill:#fbecec style H fill:#fbecec
维度Default (DFP)Custom (CFP)
题目小型 GPT-2 + 下游任务(情感、改写、十四行诗)自定,需 TA/教授审批
Starter code提供(PyTorch)
Baseline已知自己挖
Leaderboard有,便于自我定位
风险低(数据/评估都现成)高(可能两周内发现做不通)
上限高(强 DFP 也会做"新东西")更高(best project award 候选)
建议人群研究经验少 / 想稳拿好成绩 / 想刷 PyTorch 工程已有研究方向 / 后续要写论文 / 有 mentor 支持
历史占比~50%~50%
⚠️ Gamesmanship 警告(讲义原文)
"The path to success is not to do something that looks kinda weak/ill-considered compared to what you could have done with the DFP."
翻译:CFP 不是"逃离 leaderboard"的避难所。一个潦草的 CFP 比一个扎实的 DFP 拿分低得多。Best Project Award 在两边都颁。

2.3 Default Final Project 拆解(minGPT + 下游任务)

2026 版 DFP 的核心是"自己写完 GPT-2 实现 + 微调三个下游任务"

  1. 实现部分:补全 attention、transformer block 等核心模块(沿用 Stanford 自家的 starter code)
  2. 任务 1:情感分类(Rotten Tomatoes 5 类,输入"Light, silly, photographed with colour and depth..." → 输出 4 Positive)
  3. 任务 2:Paraphrasing(改写,QQP 风格)
  4. 任务 3:Sonnet generation(十四行诗生成,Shakespeare 风格)
  5. 扩展方向:硬件效率(剪枝、量化、distillation)、更好的 prompt、不同 decoding 策略
flowchart LR S[Starter code
未实现部分] --> A[补全 attention
+ Transformer block] A --> B[Pretrain checkpoint
GPT-2 small] B --> C[Fine-tune SST/RT
情感] B --> D[Fine-tune QQP-like
改写] B --> E[Generate sonnets
风格生成] C --> X[Extension:
LoRA / 4-bit / 蒸馏] D --> X E --> X
✅ Strong DFP 的三种增量
  1. 方法增量:对 attention 做 sparse / linear 改造,对比 perplexity
  2. 数据增量:换更难的情感数据集(GoEmotions 28 类、CARER 多语)
  3. 效率增量:把 124M GPT-2 用 LoRA + QLoRA 压到 7M 可训练参数、显存 4 GB 内跑完三个任务

2.4 Custom Project 的两条铁律

"The final project for cs224n must substantively involve both human language and neural networks."
  1. Substantive 自然语言成分:不能只是"NLP 数据 + 通用 ML"。比如纯做文本分类的 SVM,或拿 BERT 当黑盒做 retrieval 而不分析 NLP 部分,都会被拒。
  2. Substantive 神经网络成分:不能只是"提示工程 prompts ChatGPT 一万次然后画个图"。哪怕用 GPT-4,也必须有你自己训练/微调/分析的神经网络部分。
💡 借助 office hours 找 mentor
2026 winter 的 TA 专长涵盖:LLM Pre-training、Post-training、RL、Evals、Multimodality、Agentic Systems、Mech Interp、Multilinguality、Audio/Speech、Generative AI、3D Vision。office_hours 页面列出每个 TA 的研究关键词;选题前先扫一遍,找一个能给你专业反馈的人。

2.5 Honor Code 与 value-add 评分

项目允许使用外部代码、预训练模型、AI 助手,但:

❌ Value-add 反例
  • "我们 fine-tune 了 BERT 在 SST-2 上拿到 92%。" → BERT-base 在 SST-2 上 zero-effort 也是 92%,value-add = 0
  • "我们用 ChatGPT zero-shot 在 GLUE 上比 BERT 强。" → 这是 OpenAI 的 value-add,不是你的
  • "我们调用了 LangChain 的 RAG demo。" → 0 创新,等于上交别人的 README

第三部分:项目生命周期与交付物

3.1 时间线总览

第 1-3 周(与 a1-a2 并行)
选题、组队、与 TA 1-on-1。读 2-3 篇关键论文。
2 月 10 日 — Proposal 截止(8%)
3-4 页:关键论文 + 计划 + 数据 + 评估。Formative grading(不会拿满分,但会拿反馈)。
第 4-5 周
实现 baseline。在 tiny data 上跑通端到端。开始第一轮实验。
2 月 24 日 — Milestone 截止(6%)
2-3 页:已跑实验 + 初步结果 + 剩余计划。必须有实际跑出来的数字。
第 6-7 周
主要实验、ablation、错误分析。Poster 草稿。
第 8 周
Poster session(3%)。报告写作。第 9 周通常给一两天 buffer。
3 月底 — Final Report 截止(32%)
8 段结构,6-8 页正文。Summative grading

3.2 Project Proposal(8%):四件套写法

原讲义给的提案模板:

  1. 关键论文 + 你的 takeaway(你打算用 / 改进 / 反驳这篇)
  2. 你计划做什么 + 如何创新(红字 innovate 不是装饰)
  3. 数据:从哪里来、规模、许可、清洗
  4. 评估:用什么指标、与什么 baseline 比、有什么 ablation

📝 Proposal 模板(直接 copy 改)

1. Motivation (3-5 句)
   - 任务是什么;为什么值得做;现状什么样
2. Key Paper Summary (1 段)
   - 引用核心论文 + 它的 setup / 贡献 / 局限
3. Proposed Approach (1 段)
   - 你打算怎么做(具体到模型类型、损失、训练流程)
   - 标出 "我们的创新点是 …"
4. Data & Preprocessing (短表格 + 1 段)
   - 数据集名、规模、source、license、所需预处理
5. Evaluation Plan (短表格)
   - 指标(accuracy / BLEU / ROUGE / F1 / human eval)
   - Baseline(一定要列具体名字 + 论文里的数字)
   - 计划做的 ablation
6. Milestone (2-3 句)
   - "到 Feb 24 我们将完成 X,得到初步结果 Y"
7. References (BibTeX 风格)

3.3 如何"批判性阅读"一篇 NLP 论文

原讲义给的 5 个问题,是你写 proposal "Key Paper Summary" 段时必须回答的:

  1. 主要的贡献是什么?
  2. 让它 work 的东西是通用可复用,还是特例
  3. 有没有缺陷或漂亮的细节
  4. 它和同类论文怎么比?
  5. 它有没有提示你去做更多事
💡 论文阅读的"三遍法"(Keshav, S. 2007)
  1. 第一遍(10 分钟):只看标题、摘要、intro、conclusion、section heading、figures。决定值不值得读下去。
  2. 第二遍(1 小时):读完正文,理解贡献。跳过推导细节,但记下不懂的术语。
  3. 第三遍(4-5 小时):复现关键公式或图。试着"如果我是作者,我会怎么做下一步"。
对项目 proposal,第二遍 + 一点第三遍即可;要"基于"这篇论文做创新,必须第三遍。

3.4 Project Milestone(6%):进度报告

2-3 页,包含:

⚠️ Milestone 的隐藏含义
"You should be more than halfway done." 这句话不是夸张。如果 milestone 时你还在写训练循环,那 final report 时你将没有时间做错误分析、ablation、写作打磨—— 而这三项才是 report 32% 的真正含金量来源。

3.5 Project Writeup(32%):8 段结构详解

讲义给的 8 板块:Abstract/Intro · Prior Work · Model · Model · Data · Experiments · Results · Analysis/Conclusion。逐段拆解:

📑 报告 8 段标准写法

关键问题常见坑
Abstract任务 + 方法 + 主要结果(一句话量化)+ 主要贡献把方法写成"我们做了 X"而非"我们发现 Y"
Introduction动机、研究问题、贡献清单(bullet)把背景写成综述,3 页都进不到 contributions
Prior / Related Work3-5 类近邻工作,每类 1-2 句,标出"与我们的差别"逐篇罗列,不分类不比较
Model / Method模型公式 + 架构图 + 训练目标缺少图;公式没有定义符号
Data数据来源、规模、切分、预处理、统计不报数据规模和切分
Experimentssetup(超参、硬件、随机种子数)、baseline、训练细节不报随机种子数 → 不可复现
Results主表 + ablation 表 + 一个有信息量的图只有一个主表,"more is better" 但没有解释
Analysis / Conclusion错误分析(看 10-50 个 example)+ 失败案例 + 未来工作跳过错误分析,直接写"未来工作可以…"
✅ 三个加分项
  1. 失败的 ablation:报告"我们试了 X,没用"。审稿人最爱这种诚实,是研究品味的标志。
  2. 定性 examples:附录里放 5-10 个 model output 截图,比 100 个数字都更有说服力。
  3. 显存/时间 cost:报告"我们方法比 baseline 多用 30% 显存、慢 2×",这是诚实,不会扣分反而加分。

3.6 Poster / Web Summary(3%)

3% 占比看似小,但它是除报告外唯一面对老师/TA/同学的展示。不要把 8 页报告塞进海报:一张海报应该让人 30 秒看完整体、3 分钟看完核心。

推荐布局
左中右三栏:Motivation/Method · Experiments/Results · Analysis/Future
字号
标题 ≥ 72pt,section heading ≥ 36pt,正文 ≥ 24pt(1m 外看得清)
必须有的元素
1 个 hero figure + 1 个主结果表 + 1 个错误案例
工具
LaTeX tikzposter / beamerposter;Figma;Google Slides 自定义 48×36 inches

第四部分:找研究课题方法论

4.1 Nails vs Hammers:两个出发点

🔨 Nails(问题驱动)
从一个具体的领域问题出发("医疗对话里的幻觉怎么减"),找现有方法不够好的地方,做改进。
🔧 Hammers(方法驱动)
从一个技术方法出发("SAEs 能解释 LLM"),找它能扩展、改进、理解、应用的新场景。
💡 8 周项目的现实建议
Nails 派需要"读懂领域",CFP 第一选;Hammers 派需要"读懂方法",DFP 扩展项第一选。两者都先确认数据和评估—— "我能用什么数据、用什么指标证明我赢了" 这个问题答不出来,就别开工。

4.2 五种典型项目类型

  1. 应用/任务:找个任务(in-the-wild 或 Kaggle/shared task),用现成模型做出强 baseline 后改进
  2. 复杂架构实现:把某个论文的架构(特别是没开源的)实现出来并复现结果
  3. 新或变体模型:提出新模型,做实验验证
  4. 分析项目:分析一个已有模型的行为(语言学、错误、能力边界)
  5. 理论 / 语言学项目(罕见):证明某种模型类、数据、表征的非平凡性质
类型风险报告核心章节必备指标
1 应用Results 表 + 错误分析任务指标 + baseline 对比
2 复现中(原论文细节可能藏雷)Method + 复现 gap 分析"我们 vs 原论文"对照表
3 新方法Method 公式 + ablation消融图 + 对 baseline 的 +X%
4 分析Setup + 多个 probing 实验统计显著性 + 反事实
5 理论极高(不适合 8 周)定理 + 数值验证证明 + toy example

4.3 四个历届 CS224N 项目案例剖析

案例 1:Deep Poetry — Word + Char LM 生成莎士比亚十四行诗(Xie, Rastogi, Chang)

  • 类型:新变体模型(type 3)
  • 方法:Gated LSTM,把 char-level 和 word-level 两路向量按可学习 gate 融合 — $(1-g_{w_t}) x^{\text{word}}_{w_t} + g_{w_t} x^{\text{char}}_{w_t}$
  • 为什么 strong:明确动机(莎士比亚词汇罕见,char-level 能 backoff)+ 完整定性输出 + 工程实现清晰
  • 2026 借鉴:相同的"两路融合"思想现在用在 mixture-of-experts、tokenizer-free LM (Byte Latent Transformer 2024) 上

案例 2:Differentiable Neural Computer (DNC) 实现 — Carol Hsin

  • 类型:复杂架构实现(type 2)
  • 价值:DNC 论文(Graves et al. 2016 Nature)实现极难且没开源;学生重新实现 + 在 bAbI + copy task 上验证
  • 为什么 strong:选择了"硬骨头",文档化优化挑战的过程本身就有价值
  • 2026 视角:DNC 思路在现代"长记忆 LLM"(Memorizing Transformer、RecurrentGemma、Titans 2024)里复活

案例 3:Improved Learning through Augmenting the Loss — Inan & Khosravi → ICLR 2017

  • 类型:新方法(type 3)
  • 贡献:(a) tied embeddings,(b) 用 word embedding 相似度做 label smoothing
  • 为什么变成 ICLR 论文:方法简单 + 在 Penn Treebank 上 SOTA + ablation 干净
  • 对你的启示:项目→顶会论文的最短路径,往往是"loss / training 上的小但有效的改动"

案例 4:ConCoRD — 两组 CS224N 项目合并 → EMNLP 2022

  • 类型:应用 + 新方法(type 1 + 3)
  • 动机:QA 模型对"麻雀是鸟吗""鸟有脚吗""麻雀有脚吗"会自相矛盾
  • 方法:sample 候选答案 → 用 NLI 模型估计两两 entailment/contradiction → MaxSAT 求最优一致赋值
  • 2026 视角:相同思想现在叫 self-consistency(Wang et al. 2022),是 reasoning 的关键技巧之一

4.4 资源全景

资源URL / 入口用途
ACL Anthologyaclanthology.orgNLP 全部会议论文,免费
NeurIPSpapers.nips.ccML 顶会,含大量 LLM
OpenReview ICLRopenreview.net能看到审稿意见,学怎么评判
arXivarxiv.org/list/cs.CL/new预印本,2026 年是 LLM 主战场
Past cs224ncs224n.stanford.edu往届 best project,读 3 个再开工
HuggingFace Daily Papershuggingface.co/papers编辑精选 + 社区投票
Papers with Codepaperswithcode.com带代码 + leaderboard
NLP-progressnlpprogress.com各任务 SOTA 跟踪(不一定最新,但导航好)

4.5 Feigenbaum × Gretzky:找"未被开垦的地方"

"If you see a research area where many people are working, go somewhere else." — Herb Simon(图灵奖 + 诺贝尔经济学奖)
"I skate to where the puck is going, not where it has been." — Wayne Gretzky

两句话合起来:避开拥挤、追前沿但别追当下的爆款。对 2026 年 NLP,意味着:

4.6 Old vs New Deep Learning NLP(范式变迁)

2010-2018 旧 NLP
"我提了个新架构"(attention copy、coverage、gating…),从头训。CS224N 历史上很多 best project 是这种。
2019-2024
"我下载了 BERT,调一调"。Pre-train + fine-tune 主导。新架构难发了。
2025-2026
"我用大模型做 X"——X 包括 Agents、Eval、Mech Interp、合成数据、Reasoning。训练不再是研究的中心,使用、评估、分析才是。
💡 范式启示
DFP 让你体验2018 的世界(从头实现 GPT-2 + 调);CFP 让你参与2026 的世界。两者都有 best project award,因为课程不预设你只能做哪种

第五部分:2026 LLM 前沿十大方向(强化)

本部分把原讲义的"Exciting areas 2026" bullet list 展开成每个方向都可做 8 周项目的研究地图。每节给出:(1) 问题定义、(2) 关键论文、(3) 经典 baseline、(4) 适合 CS224N 项目的"可做的 X"。

📅 时效声明
本部分内容截至 2026-01。LLM 领域 6 个月就会洗一次牌;引用任何"目前 SOTA" 时,请先用 arXiv 最近三个月的预印本核对一遍。

5.1 Agents:tool use / planning / memory / multi-agent

"LLM agent" 这个词在 2023 是营销词,2026 是工程标准。一个 agent = LLM + 外部工具调用 + 记忆 + 规划循环。核心问题已经从"能不能用"变成"如何评估、如何防止失控、如何降低长周期 cost"。

架构骨架

flowchart LR U[User goal] --> P[Planner LLM] P --> T{Pick tool} T --> A1[Web search] T --> A2[Code exec] T --> A3[File / DB] T --> A4[Sub-agent] A1 --> O[Observation] A2 --> O A3 --> O A4 --> O O --> M[Memory store] M --> P P --> R{Done?} R -- 否 --> T R -- 是 --> F[Return answer]
方向代表工作关键指标适合 CS224N 项目
Tool use (single-turn)Toolformer (Schick 2023)、Gorilla、ToolBenchTool call accuracy构造 1-2 个新 tool 的 fine-tune 数据,看 small LLM 能否学到
Planning (ReAct 系)ReAct, Reflexion, Tree-of-Thought, LLM CompilerSuccess rate, # steps对比 ReAct vs CoT vs Plan-and-Solve 在某具体任务上的 trade-off
MemoryMemGPT, A-MEM, Letta长对话一致性用 RAG vs 长上下文 vs 外存 memory 对比同一对话基准
Computer-useClaude Computer Use (2024)、GPT-Operator、SWE-agentWebArena, OSWorld, SWE-bench挑一个 OSWorld 子任务,分析失败模式
Multi-agentAutoGen, MetaGPT, ChatDev, CAMEL任务完成率 / cost测"加更多 agent" 是否真的有用(很多论文显示是 placebo)
Protocol / 标准MCP (Model Context Protocol, Anthropic 2024)、Agent2Agent (Google 2025)互操作性实现一个 MCP server,分析协议开销
✅ CS224N 上能 8 周做完的 agents 项目
  1. 评估:选一个公开 benchmark(WebArena / τ-Bench / SWE-bench Lite),对比 2-3 个开源 agent 框架,做错误分类
  2. 能力探针:构造一个"需要 N 步推理才能完成"的合成任务,看 agent 在不同 N 下的 success rate 曲线
  3. Cost-aware:在保持任务成功率前提下,研究怎么减少 token cost(截断、压缩、cache、planner-executor 分离)
  4. 安全:构造 prompt injection / tool poisoning 测试集,评估主流 agent 的鲁棒性

5.2 Reasoning:CoT → o1 范式 → RLVR

推理(reasoning)是 2024-26 年最热的方向,没有之一。范式演进:

2022 — Chain-of-Thought (Wei et al.)
"Let's think step by step" 的 prompt 能把 GSM8K 从 17% 提到 56%。零成本,但只对大模型起作用。
2022 — Self-Consistency (Wang et al.)
采样 N 条 CoT,对答案做 majority vote。GSM8K 再 +18%。
2023 — Tree-of-Thoughts (Yao et al.)
把 CoT 做成搜索树,用 LLM 自评打分剪枝。
2023 — PRM800K / Verify Step by Step (OpenAI)
训练 process reward model (PRM) 给每一步打分,比 ORM (outcome reward) 强。
2024-09 — OpenAI o1
把"长 CoT"作为模型内部能力训练出来(不再靠 prompt)。test-time compute 越多越准。
2025-01 — DeepSeek-R1 (开源)
用纯 RL (GRPO) + 可验证奖励 (math/code 答案能自动判对错) 训练,无 PRM 也能复现 o1 级别表现。
2025-04 — Anthropic Claude 3.7 / OpenAI o3
Hybrid reasoning(一个模型既能快答也能慢推)。Test-time compute scaling 成为新维度。

RLVR:Reinforcement Learning with Verifiable Rewards

公式 5.1 — GRPO 简化目标
对一个 prompt $q$,采样 $G$ 个 completion $o_1, \ldots, o_G$,计算每个的可验证 reward $r_i$(math 题答案对/错 → 1/0),用群组归一化优势: $$A_i = \frac{r_i - \operatorname{mean}(\{r_j\})}{\operatorname{std}(\{r_j\})}$$ 然后做 PPO-style 截断更新: $$\mathcal{L} = -\mathbb{E}_q \frac{1}{G}\sum_i \min\!\left(\frac{\pi_\theta(o_i|q)}{\pi_{\theta_{\text{old}}}(o_i|q)} A_i, \operatorname{clip}(\cdot, 1\!-\!\epsilon, 1\!+\!\epsilon) A_i\right)$$ 跟 PPO 比节省了 critic(用 group baseline 代替)。
算法需要的 reward显存开销典型使用
SFT无(需轨迹)1× 模型初始化 / 蒸馏
RLHF (PPO + ORM)偏好 RM4× 模型(policy + ref + RM + value)InstructGPT, GPT-4
DPO / IPO / SimPO偏好对2× 模型(policy + ref)Llama-3-Instruct, Zephyr
GRPO (RLVR)可验证 reward(math/code)2× 模型(policy + ref)DeepSeek-R1, Qwen-Math
✅ CS224N 上能 8 周做完的 reasoning 项目
  1. RLVR 复现:在 GSM8K-1K 子集上对 Qwen2.5-1.5B 跑 GRPO,看 reasoning 能力涌现曲线
  2. 错误分类:把 o1-mini / R1-distill 在 MATH-500 上答错的题分类(算术、推理、知识、misread),找出可改进的方向
  3. Inference-time scaling:固定模型,研究 best-of-N、majority vote、reward-weighted、tree search 哪个最 cost-effective
  4. 跨域迁移:math 上 RL 训练的"长 CoT"能不能 zero-shot 迁移到 logic / commonsense 推理?

5.3 Sycophancy 与对齐税

Sycophancy = LLM 倾向于附和用户、即使用户错了。Sharma et al. (Anthropic 2023) 系统记录了这个现象:模型会把 "I disagree, that 3+3=7" 解读成"我之前错了,3+3=7"。原因是 RLHF reward model 把"用户开心"和"正确"混在一起学。

度量
SycophancyEval、TruthfulQA-Reverse、CharXiv-错答时的让步率
缓解
合成对抗数据 + DPO;用 process reward 替代 outcome;多轮一致性 loss
可做的项目
构造 1000 条"用户故意提出错误前提"的 prompt,跑 5 个开源模型,画 sycophancy 强度对比

5.4 Hallucination:度量与缓解

Hallucination 分两类:

  1. Factuality hallucination:说出与外部事实不符的内容("诺贝尔奖给了 Yann LeCun")
  2. Faithfulness hallucination:在 RAG / summarization 中编造文档没有的内容
基准 / 方法评估目标2026 状态
TruthfulQA (Lin 2022)常见误解已被大模型刷高,但仍能区分小模型
HaluEvalsummarization / QA常用基线
FActScore (Min 2023)原子事实级 precision2024-26 主流度量
HALoGEN (Pal 2024)10 个领域,1.4 万 prompt新基线
Self-RAG / CRAGRAG 缓解retrieval-then-decide
Semantic entropy (Farquhar 2024 Nature)不确定性检测对 confabulation 有效
✅ 适合 8 周的 hallucination 项目
  • 用 FActScore 评估"开源 LLM + RAG" 在医学/法律/学术问答上的 atomic precision
  • 测试 self-consistency 是不是真的能降低 hallucination(vs 只是降低 variance)
  • 建立"针对某领域"的 fine-grained hallucination 类型学

5.5 Mechanistic Interpretability

Mech Interp 试图把 LLM "拆开"看:哪个 attention head 在做什么、神经元代表什么概念、哪个回路触发哪个行为。2024 年起 Anthropic 用 Sparse Autoencoders (SAE) 在 Claude 3 Sonnet 上找到了 millions of interpretable features,这是分水岭事件。

工具 / 方法用途开源
TransformerLens (Nanda)activation patching, attention 可视化
SAELens训练 + 加载 sparse autoencoder
NeuronpediaSAE features 浏览器
Activation patching / causal tracing定位 fact recall 的关键层
Circuits (IOI, indirect object identification)逆向工程小行为
✅ 适合 8 周的 Mech Interp 项目
  • 用 Gemma-2-2B + 公开 SAE,定位某种"语言学现象"的 feature(如否定、被动语态)
  • 复现 IOI circuit 在更大模型(LLaMA-3-8B)上的形态变化
  • 用 activation patching 找 "model knows X but won't say" 的位置(refusal circuit)

5.6 长上下文与 needle-in-haystack

2024-26 年模型支持的 context 已经从 4K 飙到 2M(Gemini 2.0)、10M(实验性)。但"声称支持"和"真的能用"是两回事

基准测什么设计思路
Needle in a Haystack (Kamradt)给定 N 文档,找出某句太简单,所有现代模型已 100%
RULER (NVIDIA 2024)13 个 subtask(multi-needle, aggregation, QA)当前主流
LongBench-v2 (THU 2024)503 个长上下文 QA区分 8K vs 128K 模型
NoCha整本小说级别 plot QA挑战大多数 128K 模型
HELMETHolistic 长上下文评估多角度
💡 长上下文 vs RAG 的 trade-off
2026 共识:对"少量精确事实"用 RAG,对"需要整段理解"用长上下文。 RAG 便宜、可更新、可解释;长上下文准确率上限高但贵且不稳定("lost in the middle" 现象仍在)。

5.7 数据中心 AI 与 synthetic data

Pre-training 算力增长慢于模型规模需求,数据质量成为新瓶颈。2024-25 一系列工作(Phi-3/4、Llama-3、Qwen2.5)共识:少而精的合成数据 > 大而脏的网络数据

合成方法原理代表
Self-Instruct (Wang 2022)用强模型生成指令Alpaca, Vicuna
Evol-Instruct逐步加难WizardLM
Distillation从大模型蒸馏到小模型Phi 系列, R1-Distill
Textbooks Are All You Need纯合成"教科书"语料 + codePhi-1/2/3
Persona Hub (2024)10 亿 persona 驱动多样性Tencent
Model collapse 风险合成数据连续训练会退化Shumailov 2024 Nature

5.8 Multimodal LLM

2026 年视觉 + 语言 + 语音几乎是默认配置。但项目层面"轻量入门"通常聚焦视觉-语言(VLM)。

模型族架构特点开源情况
LLaVA / LLaVA-NextViT + projector + LLM开源
Idefics-2/3 (HF)perceiver-resampler开源
Qwen2-VL / 2.5-VL原生动态分辨率开源
InternVL-2/2.5放大 ViT, 双向训练开源
Gemini / GPT-4otoken-level 早期融合闭源

5.9 对齐算法谱系(RLHF/DPO/RLVR)

flowchart LR SFT[SFT
监督微调] --> RM[训练 Reward Model
偏好对] RM --> PPO[PPO/RLHF] SFT --> DPO[DPO/IPO/SimPO
直接偏好优化] DPO --> ORPO[ORPO
SFT+DPO 联合] SFT --> KTO[KTO
仅 thumbs-up/down] SFT --> RLVR[RLVR/GRPO
可验证奖励] PPO --> Constitutional[Constitutional AI
RLAIF] style RLVR fill:#fff7e6 style DPO fill:#eafaf0
方法需要稳定性2026 流行度
PPO + RM (RLHF)偏好对 + critic调参敏感仍是大厂主流
DPO偏好对稳定开源最常用
IPO偏好对(加正则)更稳研究常用
KTO单点反馈(赞/踩)稳定低标注成本
SimPO偏好对(无 ref)稳定2024 上升
ORPO偏好对 + SFT 一起简洁2024 上升
GRPO (RLVR)可验证 reward稳定推理模型核心

5.10 评估新范式(LLM-as-judge、动态基准)

静态基准饱和后,2024-26 年出现三类新评估:

  1. LLM-as-judge:MT-Bench、AlpacaEval、Arena-Hard。便宜,但有自我偏好长度偏好偏差
  2. 众包对抗 / 动态:Chatbot Arena(人投票)、LiveCodeBench(持续加新题防数据污染)
  3. 能力切片:MMLU-Pro、GPQA-Diamond、AIME、SWE-bench、τ-Bench;不再追求"single number"
⚠️ 数据污染问题
GPT-5、Claude 4 等的训练截止日期在不断后移,老 benchmark 都可能被训练时见过。强 project 评估必须:(1) 用 cutoff 后发布的数据;(2) 做去污染检查(n-gram overlap);(3) 至少加一个 hold-out 私有集。
✅ 评估方向的好选题
  • 构造一个"针对某行业"的私有评估集(例如医学影像报告、法律案例),评估 5 个开源 LLM
  • 研究 LLM-as-judge 的 bias:长度、风格、自我偏好的定量衡量
  • 动态基准 — 设计一个"自动生成新题"的 pipeline 防数据污染

第六部分:项目实战 Cookbook(强化)

本部分是 8 周项目的"工具箱"。每个小节都可直接抄进你的代码库。所有片段在 2026-05 的 PyTorch 2.5、Transformers 4.45、Accelerate 1.0、PEFT 0.13 上验证。

6.1 算力规划与硬件 cheat sheet

资源典型成本能跑什么(参考)申请方式
Google Colab Free (T4 16GB)0 美元LoRA fine-tune 7B 4-bit;GPT-2 small full FTcolab.research.google.com
Colab Pro+ (A100 40GB)50 美元/月FT 7B FP16;LoRA 13B账号升级
Stanford Sherlock GPU (A100 40GB / H100 80GB)课程配额FT 13B;预训练小 GPTthrough TA
Stanford SCG / Marlowe研究组配额多机训练via advisor
AWS p5.48xlarge (8×H100)约 98 美元/小时多卡 FSDP 13B+个人/课程信用
Lambda Cloud (1×A100)约 1.29 美元/小时同 Colab Pro+,更可控lambdalabs.com
RunPod / Vast.ai (spot)0.3-0.6 美元/小时预算紧时抢占式,要 checkpoint
OpenAI / Anthropic / Together API按 token大模型推理、合成数据账号 + API key
💡 显存粗算(FP16)
  • 模型权重:$N \times 2\,\text{bytes}$(7B → 14 GB)
  • 梯度:同上(7B → 14 GB)
  • Adam 状态(fp32 m+v):$N \times 8\,\text{bytes}$(7B → 56 GB)
  • 激活(取决于 batch / seq):可达模型权重 1-3 倍
  • 总 ≈ 20-25 GB / 1B 参数(full FT);LoRA 减到 2-4 GB / 1B

6.2 PyTorch 训练循环黄金模板

🐍 单卡训练循环(最小可用版)

import torch, math, time, os, json
from torch.utils.data import DataLoader
from torch.optim import AdamW
from torch.optim.lr_scheduler import LambdaLR
from torch.cuda.amp import autocast, GradScaler

# ---------- config ----------
cfg = dict(
    lr=3e-4, weight_decay=0.1, betas=(0.9, 0.95), eps=1e-8,
    warmup=500, total_steps=10_000,
    grad_accum=4, grad_clip=1.0,
    bf16=True,                       # H100/A100 推荐 BF16
    log_every=20, eval_every=500, save_every=2000,
    out_dir="runs/exp01",
)
os.makedirs(cfg["out_dir"], exist_ok=True)
device = "cuda"

# ---------- model / data ----------
model = build_model().to(device)
train_loader = DataLoader(train_ds, batch_size=8, shuffle=True,
                          num_workers=4, pin_memory=True, drop_last=True)

# ---------- optimizer ----------
# 标准做法:bias 和 LayerNorm 不加 weight decay
decay, no_decay = [], []
for n, p in model.named_parameters():
    if not p.requires_grad: continue
    (no_decay if p.ndim < 2 or "bias" in n else decay).append(p)
optim = AdamW(
    [{"params": decay,    "weight_decay": cfg["weight_decay"]},
     {"params": no_decay, "weight_decay": 0.0}],
    lr=cfg["lr"], betas=cfg["betas"], eps=cfg["eps"], fused=True,
)

# ---------- lr schedule: linear warmup + cosine ----------
def lr_lambda(step):
    if step < cfg["warmup"]:
        return step / max(1, cfg["warmup"])
    progress = (step - cfg["warmup"]) / max(1, cfg["total_steps"] - cfg["warmup"])
    return 0.5 * (1 + math.cos(math.pi * progress))
sched = LambdaLR(optim, lr_lambda)

# ---------- AMP ----------
dtype = torch.bfloat16 if cfg["bf16"] else torch.float16
scaler = GradScaler(enabled=not cfg["bf16"])   # BF16 不需要 loss scaling

# ---------- loop ----------
step, micro = 0, 0
model.train()
t0 = time.time()
for epoch in range(99):
    for batch in train_loader:
        batch = {k: v.to(device, non_blocking=True) for k, v in batch.items()}

        with autocast(dtype=dtype):
            out = model(**batch)
            loss = out.loss / cfg["grad_accum"]    # 平均

        if cfg["bf16"]:
            loss.backward()
        else:
            scaler.scale(loss).backward()

        micro += 1
        if micro % cfg["grad_accum"] != 0:
            continue

        # ---- 梯度裁剪 + step ----
        if cfg["bf16"]:
            torch.nn.utils.clip_grad_norm_(model.parameters(), cfg["grad_clip"])
            optim.step()
        else:
            scaler.unscale_(optim)
            torch.nn.utils.clip_grad_norm_(model.parameters(), cfg["grad_clip"])
            scaler.step(optim)
            scaler.update()
        sched.step()
        optim.zero_grad(set_to_none=True)

        step += 1
        if step % cfg["log_every"] == 0:
            tok_s = step * cfg["grad_accum"] * 8 * 1024 / (time.time() - t0)
            print(f"step {step}  loss {out.loss.item():.4f}  "
                  f"lr {sched.get_last_lr()[0]:.2e}  tok/s {tok_s:.0f}")
        if step % cfg["save_every"] == 0:
            torch.save({"model": model.state_dict(), "step": step},
                       f"{cfg['out_dir']}/ckpt_{step}.pt")
        if step >= cfg["total_steps"]: raise SystemExit
✅ 这份模板的关键设计
  1. 分组 weight decay:bias 和 LayerNorm 不加 decay 是 GPT-2 以来的标配,能省 0.5-1% perplexity
  2. linear warmup + cosine:现代 LLM 默认;warmup 步数 ~1-2% total steps
  3. BF16 优先:A100/H100 上 BF16 比 FP16 稳定(不需 loss scaler,不易溢出)
  4. grad accum loss 平均:在反传前除以 accum 步数,否则梯度幅度会偏大
  5. fused AdamW:PyTorch 2.x 的 fused 实现比默认快 1.5×
  6. set_to_none=True:清零梯度比赋 0 快

6.3 Mixed-Precision (BF16/FP16/FP8)

数据类型范围精度2026 用途
FP32$\pm 3.4\times10^{38}$~7 位十进制master weights、loss、optimizer 状态
FP16$\pm 6.5\times10^{4}$~3 位十进制V100 / RTX 30 系;需要 loss scaling
BF16$\pm 3.4\times10^{38}$~2-3 位A100 / H100 / TPU 主流;不需要 loss scaling
FP8 (E4M3 / E5M2)$\pm 448$ / $\pm 5.7\times10^{4}$极低H100 TransformerEngine;推理为主
INT8 / INT4推理量化(bitsandbytes / GPTQ / AWQ)
⚠️ FP16 的两个陷阱
  1. 梯度下溢:小梯度变成 0;必须用 GradScaler 把 loss 放大 $\sim 2^{15}$ 倍
  2. 激活溢出:softmax / LayerNorm 中间值可能 inf;某些 op(比如 LN)应该 cast 回 FP32
BF16 把 7-bit 尾数和 8-bit 指数对调,放弃精度换范围,所以训练 LLM 几乎都用它。

6.4 Gradient Accumulation 与有效 batch

公式 6.1 — 有效 batch
$$\text{effective batch} = \text{micro batch} \times \text{grad accum} \times \text{num GPUs}$$ LLM 训练通常追求 effective batch ≥ 256(小模型)到 4M tokens(大模型)。当单卡显存放不下大 batch,就用 grad accum 把 N 个 micro-batch 累积成一次更新。
💡 Loss 平均要小心
PyTorch 默认 cross-entropy 是 token-mean,不是 batch-sum;如果你直接 sum N 个 micro-batch 的 loss 而不除 N,梯度量级会变 N 倍,相当于学习率突然乘 N。

6.5 学习率 schedule 与 optimizer 选型

Optimizer显存主要超参典型场景
SGD + momentum1× paramslr, momentum视觉;CS224N 项目几乎不用
AdamW2× params (m, v)lr, betas=(0.9, 0.95), wdNLP 默认
Adafactor~0.5× paramslr, scale_parameterT5; 大模型省显存
Lion (Google 2023)1× params (动量)lr ≈ 1/10 AdamW有时更稳,省一半显存
Sophia (Stanford 2023)2× params + Hessianlr, rho研究中
Schedule-Free (Meta 2024)1× params无需 schedule新,慎用
✅ Schedule 选择经验
  • 预训练:linear warmup(1-2% steps)→ cosine 到 10% lr → 保持。Chinchilla / LLaMA 都这么做
  • SFT / LoRA:linear warmup(3-5%)→ linear decay 到 0
  • RLHF/DPO:constant lr(很小,1e-6 量级),无 schedule
  • RLVR/GRPO:constant 或 cosine,lr 与 SFT 接近

6.6 实验追踪:W&B / TensorBoard

📊 W&B 三行集成

import wandb
wandb.init(project="cs224n-fp", name="exp01-lora-r8", config=cfg)

# 训练循环里
wandb.log({"loss": loss.item(), "lr": sched.get_last_lr()[0], "step": step})
# 评估循环里
wandb.log({"eval/acc": acc, "eval/ppl": math.exp(eval_loss)})
💡 应该 log 什么
  • 必须:train/loss、lr、grad_norm、tokens_per_sec、gpu_mem_used
  • 强烈推荐:每 N 步的生成样本(W&B Table);param/grad histogram
  • 每次 eval:eval/loss、所有指标、所用时长
  • 系统:自动捕获 git commit + git diff(wandb.run.log_code(".")),方便复现

6.7 HuggingFace + accelerate 完整工作流

🤗 完整 SFT 脚本(accelerate 启动)

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from trl import SFTTrainer
from datasets import load_dataset

model_name = "Qwen/Qwen2.5-1.5B-Instruct"
tok = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype="bfloat16", attn_implementation="flash_attention_2")

ds = load_dataset("HuggingFaceH4/ultrachat_200k", split="train_sft[:5000]")

args = TrainingArguments(
    output_dir="out/qwen-sft", num_train_epochs=2,
    per_device_train_batch_size=2, gradient_accumulation_steps=8,
    learning_rate=2e-5, warmup_ratio=0.03, lr_scheduler_type="cosine",
    bf16=True, gradient_checkpointing=True,
    logging_steps=10, save_steps=500,
    report_to="wandb", run_name="qwen-sft-v1",
)

trainer = SFTTrainer(
    model=model, tokenizer=tok, args=args,
    train_dataset=ds, max_seq_length=2048,
    dataset_text_field="messages",          # 自动 apply chat template
)
trainer.train()
trainer.save_model()

启动:accelerate launch --num_processes 4 sft.py(4 卡 DDP 自动并行)。

6.8 LoRA / QLoRA / DoRA cookbook

公式 6.2 — LoRA 参数化
对原始权重 $W \in \mathbb{R}^{d \times k}$,LoRA 添加旁路: $$W' = W + \alpha \cdot B A,\quad B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times k}$$ 其中 $r \ll \min(d,k)$(典型 $r = 8, 16, 32, 64$),$\alpha$ 是缩放系数(典型 $\alpha = 2r$)。 冻结 $W$,只训练 $A, B$ —— 训练参数从 $dk$ 降到 $r(d+k)$。

🧪 PEFT-LoRA 8 行接入

from peft import LoraConfig, get_peft_model
peft_cfg = LoraConfig(
    r=16, lora_alpha=32, lora_dropout=0.05, bias="none",
    target_modules=["q_proj","k_proj","v_proj","o_proj"],   # LLaMA / Qwen
    task_type="CAUSAL_LM",
)
model = get_peft_model(model, peft_cfg)
model.print_trainable_parameters()
# trainable: 8.4M  ||  all params: 1.5B  ||  trainable%: 0.55
方法显存(7B)质量额外特性
Full FT≥ 140 GB100%
LoRA (r=16)~18 GB95-99%多任务 adapter 可切换
QLoRA (4-bit + LoRA)~10 GB95-99%1×A6000/RTX 4090 可微调 7B
DoRA (weight-decomposed LoRA)~LoRA+0.5-1%把权重分解 magnitude + direction
VeRA / LoRA-FA更省略低共享 random A、只学 B

6.9 分布式训练(DDP / FSDP / DeepSpeed)

策略显存复制速度适用
DDP (DataParallel)每卡完整模型 + grad + opt最快模型能装下单卡(≤ 1-3B)
FSDP / ZeRO-3参数、梯度、优化器全 shard~80% DDP模型放不下单卡
DeepSpeed ZeRO-Offloadopt 状态放 CPU更慢显存极紧(单卡 24GB 训 7B)
Tensor Parallel逐层切分NVLink 内快千亿模型
Pipeline Parallel逐层切到不同 GPU慢,bubble 问题万亿模型
Sequence Parallel / Ring Attention序列维度切分百万 token 上下文
💡 选择经验
对 CS224N 项目,99% 用 DDP 或 FSDP。FSDP 在 accelerate config 里勾一下就行:
distributed_type: FSDP
fsdp_config:
  fsdp_sharding_strategy: FULL_SHARD
  fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
  fsdp_offload_params: false
  fsdp_state_dict_type: SHARDED_STATE_DICT
mixed_precision: bf16

6.10 推理加速(vLLM / TGI / TensorRT-LLM)

引擎核心技术吞吐增益适用
vLLMPagedAttention + continuous batching10-24× vs HF generate开源最常用
TGI (Text Generation Inference)类似 vLLM~ vLLMHF 出品
TensorRT-LLMNVIDIA kernel 极致优化更高,但难调生产
SGLangRadixAttention(cache 树)结构化 prompt 极快agents、JSON
llama.cppCPU/Apple Silicon GGUF本地推理无 GPU 环境
MLC-LLM跨平台编译WebGPU/移动端端侧

🚀 vLLM 离线批推理

from vllm import LLM, SamplingParams
llm = LLM(model="Qwen/Qwen2.5-7B-Instruct", tensor_parallel_size=2,
          dtype="bfloat16", max_model_len=8192,
          gpu_memory_utilization=0.9)
sp = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=512)
outs = llm.generate(prompts=batch_of_prompts, sampling_params=sp)
for o in outs: print(o.outputs[0].text)

6.11 Debug 12 招(NaN、loss 不降、OOM…)

症状大概率原因第一招
loss 一开始就 NaN初始化 / softmax 数值检查 LayerNorm/Softmax 输入是否含 inf;用 torch.autograd.detect_anomaly()
loss 训了 100 步突然 NaNFP16 溢出启用 GradScaler;降 lr;检查 grad_norm
loss 不下降lr 太小 / 错的 mask先用 tiny data (8 样本) overfit,看 loss 能不能到 0
train loss 降但 dev 不降数据泄漏的反面:dev 太难 / domain shift抽样看 dev examples
train acc 不到 100% on tiny data模型容量不够 / bug看 batch 内 logits 分布
CUDA OOM at step Nseq 长度变长 / 内存碎片开 gradient_checkpointing;调小 max_seq_len;torch.cuda.empty_cache()
训练比预期慢 3×num_workers=0 / pin_memory offDataLoader 加 4 workers + pin_memory=True
GPU 利用率 < 50%I/O bottleneck把数据预 tokenize 缓存,避免 runtime tokenize
多卡 loss 与单卡差很多没正确同步 batch norm / 没 average loss用 SyncBN;DDP 自动平均梯度
梯度爆炸 grad_norm > 100lr 太大 / 数据有异常值降 lr、加 clip、查脏数据
val acc 抖动 ±5%seed 不固定 / batch 太小多 seed 跑取均值 ± std
val acc 0.5 训不动label 错位 / data shuffle bug打印 batch 的 (input, label) 对,肉眼检查
✅ 神经网络 debug 三定律
  1. 先在 4-8 个样本上 overfit 到 0 loss。做不到,说明模型 / loss / 数据有 bug,再大的 batch 也救不了。
  2. 对比已知 working 的代码(HuggingFace Trainer、nanoGPT)。盲调神经网络是 90% 的人浪费时间的方式。
  3. 每改一处只改一处。同时改 lr + 模型 + 数据,loss 变了你不知道是谁干的。

6.12 复现性与 checkpoint 规范

📦 一个可复现的实验目录长什么样

runs/exp01_lora-qwen1.5/
├── config.yaml          # 全部超参(含 seed)
├── git_info.txt         # git rev-parse HEAD + diff
├── env.txt              # pip freeze
├── train.log            # 完整 stdout
├── wandb_url.txt        # W&B run URL
├── ckpt/
│   ├── step_500.pt
│   ├── step_1000.pt
│   └── best.pt          # 按 dev 指标
├── eval/
│   ├── dev_preds.jsonl  # {input, gold, pred, score}
│   └── dev_metrics.json
└── README.md            # 一段话写清楚: 我做了什么、结果如何
💡 三件最容易忘的复现性细节
  1. 固定所有随机源torch.manual_seednumpy.random.seedrandom.seedtorch.cuda.manual_seed_alltorch.use_deterministic_algorithms(True)
  2. 记录 data loader 的 worker seed:用 worker_init_fn 单独设
  3. 记录硬件:A100 vs H100 / CUDA 11 vs 12 会让结果有 ±0.1-0.3 的小差异,写在 README 里免得审稿人质疑

第七部分:数据资源与现代基准

7.1 数据来源的四象限

象限例子优点风险
有标注 + 公开SQuAD, GLUE, MMLU, MATHbaseline 现成、可比较已被 LLM 训练时见过(污染)
有标注 + 私有 / 受限LDC、医学/法律数据污染少许可严,作业范围有限
无标注 + 公开Common Crawl, RedPajama, FineWeb大、免费清洗工作量大
无标注 + 自采爬虫、自家产品 log独特耗时;许可、隐私
⚠️ 自采数据是 8 周项目最大的时间陷阱
讲义原话:"Be careful on scoping things so that this doesn't take most of your time!!!" 经验值:数据收集 + 清洗不应超过总时间的 25%。超过 → 立即转用公开数据集。

7.2 关键数据源全景

资源覆盖许可访问
HuggingFace Datasets638+ NLP 数据集,多任务多语各异(务必看清)huggingface.co/datasets · load_dataset()
Linguistic Data Consortium (LDC)treebank、coreference、speech需 Stanford 账号linguistics.stanford.edu/resources/resources-corpora
statmt.org / WMT机器翻译 shared task 数据研究用statmt.org
Kaggle各种比赛 + 数据集各异kaggle.com
GLUE / SuperGLUE通用语言理解开放gluebenchmark.com
SQuAD / Natural Questions抽取式 QA开放HF datasets
FineWeb / FineWeb-Edu15T token 预训练语料ODC-Byhuggingface.co/datasets/HuggingFaceFW
RedPajama-V230T token开放HF
Common Crawl万亿 token 原始网页开放commoncrawl.org

7.3 现代基准巡礼(按能力切片)

能力经典 (≤2022)现代 (2023-26)
通识知识MMLU (57 学科)MMLU-Pro、GPQA-Diamond(专家级)、SuperGPQA
数学GSM8K、MATHAIME 2024/25、Omni-MATH、PutnamBench
代码HumanEval、MBPPSWE-bench (Verified/Lite)、LiveCodeBench、CodeContests
推理BBH(BIG-Bench Hard)ARC-AGI、MUSR、ZebraLogic
事实 / 幻觉TruthfulQAFActScore、HALoGEN、SimpleQA
指令遵循IFEval、MT-Bench、Arena-Hard-Auto
长上下文RULER、LongBench-v2、NoCha、HELMET
Agent / 工具WebArena、OSWorld、τ-Bench、ToolBench、AgentBench
视觉-语言VQA-v2、MS-COCOMMMU、MMMU-Pro、MathVista、CharXiv、Egonormia
多语XNLI、XCOPAMGSM、Belebele(122 语种 QA)、Flores-200
对抗 / 鲁棒Adversarial-NLIHarmBench、StrongREJECT、jailbreak-bench

🔬 几个 2024-25 值得了解的 benchmark(讲义只提了 4 个)

  • SWE-bench (Jimenez et al. 2024):从真实 GitHub issue + PR 构造的 bug-fix 基准。模型要读懂 repo 并提交可通过 unit test 的 patch。SWE-bench Verified(人工标注的 500 题子集)是 2024-25 主流。
  • WebArena (Zhou et al. 2023):在自托管的 OneStopShop / GitLab / Reddit 镜像里完成真实 web 任务,端到端评估 agent。
  • TruthfulQA (Lin et al. 2022):817 道"人类常错"的题("咳嗽能止心脏病吗?"),测模型有没有学到人类偏见。
  • Egonormia (Rezaei et al. 2025):从 ego-centric video 测社交规范判断("你应该接住朋友的鞋还是让他自己捡?")。

7.4 数据清洗 cookbook

🧹 文本数据 6 步清洗模板

import re, hashlib
from datasets import load_dataset

def clean_text(s: str) -> str:
    s = re.sub(r"\s+", " ", s).strip()      # 1. normalize whitespace
    s = re.sub(r"http\S+|www\.\S+", "", s)  # 2. drop URLs(任务允许时)
    s = "".join(c for c in s if c.isprintable())   # 3. 控制字符
    return s

def is_quality(s: str) -> bool:
    if len(s.split()) < 20: return False           # 4. 过短
    if len(set(s)) / len(s) < 0.05: return False   # 5. 重复字符
    return True

seen = set()
def dedup(s: str) -> bool:                          # 6. MinHash / 简化版 hash dedup
    h = hashlib.md5(s.encode()).hexdigest()[:16]
    if h in seen: return False
    seen.add(h); return True

ds = load_dataset("your-dataset")
ds = ds.map(lambda x: {"text": clean_text(x["text"])})
ds = ds.filter(lambda x: is_quality(x["text"]) and dedup(x["text"]))
💡 严肃项目应该用的工具
  • FastText 语种识别:cc.fasttext.176 模型,过滤非目标语种
  • MinHash + LSH:近似去重(datasketch / text-dedup)
  • Heuristic 质量过滤:Gopher 规则、C4 规则
  • Decontamination:n-gram overlap 与所有 eval set 对比,删除污染样本

第八部分:训练原则与防过拟合

8.1 train / tune / dev / dev2 / test:五个数据池

train
用来 SGD / Adam 更新参数
tune
调超参(lr, dropout, batch, 模型 size)。与 dev 不同源最好
dev (validation)
每 N 步评估、决定早停 / 选 checkpoint
dev2
当你已经"过拟合到 dev",需要第二个 dev 验证泛化
test
整学期只跑 1 次,写在 report 里的那一次
❌ 论文 review 经常因为这件事被拒
"我们在 dev 上选了最好的模型,在 test 上得到 88.5"——OK
"我们在 test 上调了 5 组超参,选最好的报"——这叫 test set overfitting,是学术不端。

8.2 Cross-validation:小数据集的最大化技巧

当总数据 < 几千条,单独拿 20% 当 dev 太亏。K-fold CV:

公式 8.1 — K-fold
把 train 切成 $K$ 折,第 $k$ 轮用第 $k$ 折当 dev,其余 $K-1$ 折训练。报告 $K$ 次结果的均值 ± std。 $K = 5$ 或 $10$ 是标准选择。仍然需要一个独立 test。

8.3 Overfitting 的两条对角线

训练步数 / 时间 Loss train dev 早停最佳点
图 8.1:train loss 持续下降,dev loss 先降后升 —— 转折点(实际是最低点)是 early stopping 的选择位置。
正则化方法原理典型超参
Dropout训练时随机置零p=0.1(LLM)到 0.3-0.5(FT 小数据)
Weight decay (L2)权重平方惩罚0.01-0.1
Label smoothing软化 one-hot 标签$\epsilon = 0.1$
Early stopping看 dev 最低点patience = 3-10 evals
Data augmentation回译、EDA、合成数据
Mixup / Cutmix线性混合样本NLP 中较少
对抗训练 (AT, FreeLB)对 embedding 加扰动训练慢但 robustness 好

8.4 增量开发流程

flowchart LR A[最简模型
+ 4-8 样本] --> B{tiny data
能到 100%?} B -- 否 --> C[修 bug
加大模型] C --> A B -- 是 --> D[换成全量数据] D --> E{train loss
接近 0?} E -- 否 --> F[加模型容量/
更长训练] F --> D E -- 是 --> G{dev 也好?} G -- 否 --> H[加 regularization
dropout/wd/data aug] H --> D G -- 是 --> I[做 ablation
+ 错误分析] style A fill:#eafaf0 style I fill:#fff7e6
✅ 讲义原话提炼
  • "Start with a positive attitude — neural networks want to learn" — 不学是你拦着它
  • "Initially run on a tiny amount of data — 4-8 examples is good" — bug 在 tiny 上肉眼可见
  • "Make sure you can get 100% on this data" — 否则就是模型/bug 问题
  • "Overfitting on training is not to fear" — 现代深度学习模型能记住整个 train 还泛化得很好
  • "Regularize until you don't overfit on dev" — generous dropout 是秘诀

8.5 错误分析方法论

Report 里 32% 的"含金量"很大一部分来自有数据支撑的错误分析,不只是"准确率 88.5%"。

🔍 错误分析五步法

  1. 抽样 50-100 个错例(uniformly from dev set)。直接看模型 input + gold + pred。
  2. 开个 Google Sheet,每行一个错例,自己定义 5-10 个 error 类别打 tag。
  3. 统计各类比例:长尾分布常见(例如 60% 错例属于同一类)。
  4. 定向修复 head 类别:把数据增强 / loss 函数 / 后处理对准最大那 1-2 类。
  5. 重新评估 + 报告:在 report 里贴出 "before/after error breakdown" 表 —— 这是研究品味的体现。
💡 LLM 错误分析的现代套路
对 LLM 生成任务,可以让 GPT-4 / Claude 帮你做初步分类("请给这 100 个错例打 tag,从如下 8 类选一个"),再人工 spot-check 10%。Time-on-task 能从 4 小时降到 30 分钟。必须在 report 写明评估流程,且对 tag 体系做 inter-annotator 一致性检查。

第九部分:项目选题模板(5 DFP 扩展 + 10 CFP 模板)

每条模板包含:动机 · 方法 · 数据 · 评估 · 难度。直接复制改成你的 Proposal 草稿。难度按 8 周 1-3 人团队估。

9.1 DFP 扩展模板(5 个)

DFP-1:用 LoRA + 4-bit 把 GPT-2 蒸成 7M 可训练参数

  • 动机:原 starter code 全参微调,验证 PEFT 能不能不掉点
  • 方法:QLoRA (r=16) + bitsandbytes 4-bit;对 attn 的 q/k/v/o 加 LoRA
  • 数据:DFP 默认三任务(情感 + 改写 + 十四行诗)
  • 评估:与 full FT 在每个任务上对比 ± 显存 / 训练时长 trade-off
  • 难度:⭐⭐

DFP-2:Sonnet generation 加 RLHF/DPO(让"诗更莎士比亚")

  • 动机:生成质量是主观的,cross-entropy 不能反映"风格契合度"
  • 方法:标 200 对偏好(mine 自动生成 vs Shakespeare 原作),用 DPO 微调
  • 数据:Shakespeare sonnet corpus + 自合成偏好
  • 评估:押韵率 / 五步抑扬 / 人工评 + LLM-as-judge
  • 难度:⭐⭐⭐

DFP-3:替换 attention 为 SSM / Mamba 看长上下文

  • 动机:自己实现一个非 quadratic attention 替代
  • 方法:把 GPT-2 一半层换成 Mamba block,混合架构
  • 数据:WikiText-103;测 perplexity 在不同长度下的曲线
  • 评估:perplexity vs context length;显存 vs context length
  • 难度:⭐⭐⭐⭐

DFP-4:情感分类的对抗鲁棒性

  • 动机:fine-tune 后 in-domain 准确率高,OOD 怎样?
  • 方法:训 baseline + FreeLB / 对抗数据增强
  • 数据:训 Rotten Tomatoes,测 IMDB、Yelp、Amazon、SST-2
  • 评估:OOD acc + checklist (Ribeiro 2020) 行为测试
  • 难度:⭐⭐⭐

DFP-5:Decoding 策略比较(greedy / top-k / top-p / contrastive / speculative)

  • 动机:所有人都用 top-p=0.9,但有更好的吗?
  • 方法:在 sonnet 生成上对比 6 种 decoding,加 speculative decoding 加速
  • 数据:DFP sonnet 任务
  • 评估:质量(人工 + judge)+ 多样性(distinct-n)+ tokens/sec
  • 难度:⭐⭐

9.2 CFP 模板(10 个,对应 §5 十大方向)

CFP-1:Agents — 对比 ReAct vs Reflexion 在 τ-Bench 的 cost-success tradeoff

  • 动机:多步 agent 框架的实际收益 vs cost 没有统一对比
  • 方法:用 Qwen2.5-7B-Instruct 作 backbone,跑 3 个开源 agent 框架
  • 数据:τ-Bench retail / airline 任务
  • 评估:success rate, cost/task, # tool calls, # tokens
  • 难度:⭐⭐⭐

CFP-2:Reasoning — 在 1.5B 模型上复现 RLVR/GRPO,研究 reward shape

  • 动机:DeepSeek-R1 证明纯 RL 可以 emerge reasoning,但什么 reward 设计最关键?
  • 方法:Qwen2.5-1.5B + GRPO + verifiable reward;对比 binary vs format-aware reward
  • 数据:GSM8K-1k 子集
  • 评估:MATH-500 / AIME; emergence curve
  • 难度:⭐⭐⭐⭐

CFP-3:Sycophancy — 跨 5 个开源模型的让步率对比

  • 动机:sycophancy 与模型规模 / 对齐方法的关系
  • 方法:手工构造 200 道"用户错误前提"问题,用 LLM-as-judge 打 sycophancy 分
  • 数据:自构 + SycophancyEval 子集
  • 评估:让步率、推理一致性
  • 难度:⭐⭐

CFP-4:Hallucination — 用 semantic entropy 检测特定领域 hallucination

  • 动机:Farquhar 2024 Nature 在通用 QA 验证;医学 / 法律领域呢?
  • 方法:复现 semantic entropy;扩展到中文医学 QA
  • 数据:MedMCQA, CMB-Exam, 自构 200 题
  • 评估:AUROC of hallucination detection
  • 难度:⭐⭐⭐

CFP-5:Mech Interp — 在 Gemma-2-2B 上定位"否定"的 SAE feature

  • 动机:LLM 处理否定有名地差,定位机制可能指导改进
  • 方法:在 Neuronpedia 公开 SAE 上搜索 + activation patching 验证
  • 数据:自构 5000 条否定/肯定对照 prompt
  • 评估:因果干预后否定理解 accuracy 变化
  • 难度:⭐⭐⭐⭐

CFP-6:长上下文 — RULER 上测 5 个开源 128K 模型,找"真实有效长度"

  • 动机:"声称 128K"和"真能用 128K"差很多
  • 方法:直接跑 RULER;按 13 个 subtask 分别画 acc vs length 曲线
  • 数据:RULER 基准
  • 评估:每模型的"effective context"(acc 跌破 80% 的 length)
  • 难度:⭐⭐

CFP-7:合成数据 — 测试 model collapse 在 SFT 上的强度

  • 动机:Shumailov 2024 Nature 在 pre-training 显示 collapse;SFT 呢?
  • 方法:用 LLM-A 生成 100K SFT 数据,训 LLM-B;再用 B 生成下一代 SFT 数据训 C;迭代 5 代
  • 数据:起始用 Alpaca 5K 引导
  • 评估:每代在 MT-Bench / Arena-Hard / 多样性指标 (distinct-n)
  • 难度:⭐⭐⭐⭐

CFP-8:VLM — 评估 Qwen2-VL / LLaVA-Next / InternVL 在中文 OCR-VQA 上

  • 动机:中文 VLM 评估资源稀缺
  • 方法:构造中文图文 QA 1000 题(含繁体)
  • 数据:自构 + 公开 ChartQA-zh
  • 评估:accuracy + 错误类型分布
  • 难度:⭐⭐⭐

CFP-9:对齐 — DPO vs SimPO vs ORPO 在同一 SFT base 上的可重复对比

  • 动机:原论文各自只报最好结果,缺少受控对比
  • 方法:固定 base = Qwen2.5-1.5B-SFT + 同一份偏好数据 (UltraFeedback) + 三种 loss
  • 数据:UltraFeedback 训练 + Arena-Hard 评估
  • 评估:胜率、calibration、训练稳定性曲线
  • 难度:⭐⭐⭐

CFP-10:评估 — LLM-as-judge 的 length bias 量化

  • 动机:Singhal 2023 指出 judge 偏好长回答;定量影响多大?
  • 方法:用同一答案 + 添加无信息冗余生成"配对样本",看 judge 打分变化
  • 数据:MT-Bench prompt 池
  • 评估:length 与 judge 打分的相关系数;分模型对比 GPT-4o / Claude 3.5 / Llama-3.1-70B
  • 难度:⭐⭐

第十部分:附录

A. 项目检查表(可打印)

📋 Proposal Checklist

  • ☐ 任务一句话能讲清楚(电梯演讲)
  • ☐ 引用了 ≥ 1 篇核心论文,并写了 takeaway
  • ☐ 数据集名 + 规模 + 来源 + 许可
  • ☐ Baseline 写了具体名字 + 论文里的数字
  • ☐ 评估指标具体(不写 "evaluate qualitatively")
  • ☐ Milestone 有可验证目标("我们将在 Feb 24 前得到 baseline + 一组 ablation")
  • ☐ 团队成员姓名 + 邮箱
  • ☐ 3-4 页,PDF

📋 Milestone Checklist

  • ☐ 有跑出来的数字(不只是 "we plan to")
  • ☐ baseline 复现成功
  • ☐ 至少一个"主方法"训练完跑出数字
  • ☐ 剩余时间表(按周)
  • ☐ 遇到的问题 + 解决方案 / 妥协
  • ☐ 2-3 页

📋 Final Report Checklist

  • ☐ Abstract 含一句量化主结果
  • ☐ Intro 末尾有 bullet 形式的 contributions
  • ☐ 至少 1 张架构图 + 1 张主结果表 + 1 张 ablation 表 + 1 张错误分析
  • ☐ 模型公式带符号定义
  • ☐ 数据切分 + 规模写清
  • ☐ 多 seed 训练(≥ 2-3 个)并报 mean ± std
  • ☐ 错误分析:定量 + 定性 examples
  • ☐ 失败的 ablation 也写
  • ☐ 资源 / 时间 cost 报告
  • ☐ 代码 link + README(可复现)
  • ☐ Contributions statement(多人项目)
  • ☐ AI 使用声明(见 C.)

B. NLP 术语速查

缩写全称2026 上下文
BPEByte-Pair Encodingtokenization 主流
RoPERotary Position Embedding位置编码事实标准
RMSNormRoot Mean Square Norm替代 LayerNorm,省计算
SwiGLUSwish-Gated Linear UnitFFN 激活
MoEMixture-of-Experts稀疏激活,Mixtral / DeepSeek-V3
GQA / MQA / MLAGrouped/Multi-Query/MultiHead-Latent AttnKV cache 优化
SFTSupervised Fine-Tuningpost-train 第一步
RLHFRL from Human Feedback对齐主流
DPODirect Preference Optimization替代 PPO 的简单方案
RLVRRL with Verifiable Rewardsreasoning 模型核心
GRPOGroup Relative Policy OptimizationDeepSeek-R1 用
CoTChain-of-Thought推理 prompting
ToTTree-of-Thoughts搜索式推理
PRM / ORMProcess/Outcome Reward Model推理监督粒度
RAGRetrieval-Augmented Generation外挂知识
SAESparse AutoencoderMech Interp 工具
LoRA / QLoRA / DoRALow-Rank Adapter 系PEFT 三件套
FSDP / ZeROFully Sharded Data Parallel大模型训练
vLLM / TGI推理引擎PagedAttention
MCPModel Context ProtocolAnthropic 2024 agent 协议

C. AI 使用披露与学术诚信(强烈推荐)

2026 winter 课程明确允许使用 ChatGPT / Claude 等 AI 工具,但必须在 report 末尾加披露段。建议模板:

"This work used the following AI tools: GPT-4o (OpenAI), Claude 3.5 Sonnet (Anthropic). We used these tools for: (1) brainstorming the related work taxonomy in §2; (2) initial draft of the Python data loader (Section 4.1); (3) proofreading the final writeup. All experimental design, model implementation, training, evaluation, and final interpretation were done by the authors. We did not use AI to write the Results or Analysis sections."
❌ 红线
  • 把 ChatGPT 给的 "Related Work" 直接粘进去(无 citation, 高 plagiarism 风险)
  • 用 AI 跑 baseline 然后伪装成自己的 ablation 结果
  • 编造 reference(AI 有时会编 BibTeX)— 一旦被 TA 抽查发现,零分
✅ 绿区
  • "我用 Claude 生成了 1000 条合成训练数据"——披露 + 在 Data 段写流程
  • "我用 GPT-4 做 LLM-as-judge"——披露 + 报告 judge prompt + 与人工抽样对比
  • "我用 Copilot 写训练循环"——很正常,简短披露即可

D. 与本课程其他章节的桥接

L01 History
早期 NLP 历史 — 为什么 word2vec 革命性
L05 Transformers
Attention 与 Transformer — 本课 Part 1 的前置
L07 Pretraining
Pretraining — DFP 用到的 GPT-2 怎么 pre-train
L08 Post-training
SFT / RLHF / DPO — §5.9 的详细版
L09 PEFT
LoRA / Adapter / Prefix tuning — §6.8 的理论版
L10 RAG / Agents
RAG 与 Agents — §5.1 的详细版
L11 Evaluation
评估方法 — §5.10 / §7.3 的扩展
L12-13 Reasoning
Reasoning Part 1 · Part 2 — §5.2 的完整版
Lab Wiki
research/paper-writing.md · research/methodology.md · frontiers/agents/