本教材整理自 CS224N (Winter 2026) Lecture 6 Final Projects & Practical Tips(Diyi Yang)。原讲义 55 页 PPT 在 45 分钟里同时承担了三件事:复盘上节课的 Transformer、宣布 Assignment 3、并把"如何做一个 NLP 研究项目"压缩成一份高密度的实践指南。 对于研究生读者,这一讲是从"会做作业"过渡到"会做研究"的分水岭。它回答的不是"如何拿高分",而是:
research/methodology.md、research/paper-writing.md、nlp/transformers.md、frontiers/agents/原讲义用 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。
Transformer Decoder 是 Decoder Block 的堆叠。每个 block 固定四件套:
Encoder block 与 decoder block 的差别只有一处:把 Masked Multi-Head Attention 改成普通的 Multi-Head Attention(去掉 mask $M$)。这意味着 token $i$ 可以同时看到左右两边的所有 token,类似 BiLSTM。
当任务是"输入一个序列 → 输出一个序列"(翻译、摘要、数据到文本),自然的形态是把 encoder 和 decoder 拼起来。Decoder 多一层 cross-attention,用来"从 encoder 的输出 memory 里取信息"。
Self-attention 中 Q、K、V 来自同一个来源。Cross-attention 中:
为什么 $QK^\top$ 要除以 $\sqrt{d_k}$?这是个常考概念,原讲义一笔带过,这里完整推导一遍。
原 Transformer 论文(Vaswani et al., 2017)在 WMT 2014 EN-DE 上拿到 BLEU 28.4(big)/ 27.3(base),同时训练成本只有 ConvS2S 的 1/4:
| Model | BLEU EN-DE | BLEU EN-FR | Train cost (FLOPs) |
|---|---|---|---|
| GNMT + RL | 24.6 | 39.92 | $2.3\times10^{19}$ |
| ConvS2S | 25.16 | 40.46 | $9.6\times10^{18}$ |
| Transformer base | 27.3 | 38.1 | $3.3\times10^{18}$ |
| Transformer big | 28.4 | 41.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 —— 几乎是"换架构 = 重新发明任务"。
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 Transformer | RAG 是 2024-26 主流(见 L10) |
Transformer 自身对位置是"置换不变"的,必须额外注入位置信号。演进路线:
核心思想:让 $q_m$ 和 $k_n$ 的点积只依赖于相对位置 $m-n$。
原讲义抛出一个看似矛盾的事实:
"In practice, almost no large Transformer language models use anything but the quadratic cost attention we've presented here."
解释这个现象需要算两笔账:
原讲义没讲,但这是 2022-26 年 attention 落地的最大变量。
GPU 计算很快但内存带宽慢。标准 attention 实现把 $n \times n$ 的 attention matrix 写回 HBM 再读回来做 softmax,造成大量 IO。FlashAttention 的关键洞察:用 tiling + 在 SRAM 内完成 softmax,避免物化 $S$ 和 $P$ 矩阵。
| 版本 | 年份 | 关键改进 | 实测加速 |
|---|---|---|---|
| FlashAttention v1 | 2022 | tiling + online softmax, 不物化 $S/P$ | 2-4× vs PyTorch SDPA |
| FlashAttention v2 | 2023 | 降低非矩阵 FLOPs,更好并行(warp 级) | 再 1.5-2× |
| FlashAttention v3 | 2024 | H100 异步 (TMA + WGMMA)、FP8 路径 | FP16 1.5-2×,FP8 再 2× |
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
推理时每生成一个新 token 都需要重新算 attention。如果每次都从头算,复杂度是 $O(n^3)$。KV cache 把所有历史 token 的 K、V 缓存下来,新 token 只算自己的 K、V,对历史 cache 做一次 attention,单 step 复杂度 $O(n d)$。
| 方案 | 原理 | KV 缩减 | 代表模型 |
|---|---|---|---|
| MHA (baseline) | $H$ 个 Q、K、V 头 | 1× | 原版 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 |
| 组成 | 占比 | 说明 |
|---|---|---|
| 4 × 1.5 周 Assignments | 48% | a1 6% + a2/a3/a4 各 14%;a3 是 minGPT/minBERT,难度跳级 |
| Final Project | 49% | Proposal 8% + Milestone 6% + Poster/Web 3% + Report 32% |
| Participation | 3% | Ed 提问、guest lecture 反应、课程评估、karma |
| 维度 | Default (DFP) | Custom (CFP) |
|---|---|---|
| 题目 | 小型 GPT-2 + 下游任务(情感、改写、十四行诗) | 自定,需 TA/教授审批 |
| Starter code | 提供(PyTorch) | 无 |
| Baseline | 已知 | 自己挖 |
| Leaderboard | 有,便于自我定位 | 无 |
| 风险 | 低(数据/评估都现成) | 高(可能两周内发现做不通) |
| 上限 | 高(强 DFP 也会做"新东西") | 更高(best project award 候选) |
| 建议人群 | 研究经验少 / 想稳拿好成绩 / 想刷 PyTorch 工程 | 已有研究方向 / 后续要写论文 / 有 mentor 支持 |
| 历史占比 | ~50% | ~50% |
2026 版 DFP 的核心是"自己写完 GPT-2 实现 + 微调三个下游任务":
"The final project for cs224n must substantively involve both human language and neural networks."
项目允许使用外部代码、预训练模型、AI 助手,但:
原讲义给的提案模板:
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 风格)
原讲义给的 5 个问题,是你写 proposal "Key Paper Summary" 段时必须回答的:
2-3 页,包含:
讲义给的 8 板块:Abstract/Intro · Prior Work · Model · Model · Data · Experiments · Results · Analysis/Conclusion。逐段拆解:
| 段 | 关键问题 | 常见坑 |
|---|---|---|
| Abstract | 任务 + 方法 + 主要结果(一句话量化)+ 主要贡献 | 把方法写成"我们做了 X"而非"我们发现 Y" |
| Introduction | 动机、研究问题、贡献清单(bullet) | 把背景写成综述,3 页都进不到 contributions |
| Prior / Related Work | 3-5 类近邻工作,每类 1-2 句,标出"与我们的差别" | 逐篇罗列,不分类不比较 |
| Model / Method | 模型公式 + 架构图 + 训练目标 | 缺少图;公式没有定义符号 |
| Data | 数据来源、规模、切分、预处理、统计 | 不报数据规模和切分 |
| Experiments | setup(超参、硬件、随机种子数)、baseline、训练细节 | 不报随机种子数 → 不可复现 |
| Results | 主表 + ablation 表 + 一个有信息量的图 | 只有一个主表,"more is better" 但没有解释 |
| Analysis / Conclusion | 错误分析(看 10-50 个 example)+ 失败案例 + 未来工作 | 跳过错误分析,直接写"未来工作可以…" |
3% 占比看似小,但它是除报告外唯一面对老师/TA/同学的展示。不要把 8 页报告塞进海报:一张海报应该让人 30 秒看完整体、3 分钟看完核心。
tikzposter / beamerposter;Figma;Google Slides 自定义 48×36 inches| 类型 | 风险 | 报告核心章节 | 必备指标 |
|---|---|---|---|
| 1 应用 | 低 | Results 表 + 错误分析 | 任务指标 + baseline 对比 |
| 2 复现 | 中(原论文细节可能藏雷) | Method + 复现 gap 分析 | "我们 vs 原论文"对照表 |
| 3 新方法 | 高 | Method 公式 + ablation | 消融图 + 对 baseline 的 +X% |
| 4 分析 | 中 | Setup + 多个 probing 实验 | 统计显著性 + 反事实 |
| 5 理论 | 极高(不适合 8 周) | 定理 + 数值验证 | 证明 + toy example |
| 资源 | URL / 入口 | 用途 |
|---|---|---|
| ACL Anthology | aclanthology.org | NLP 全部会议论文,免费 |
| NeurIPS | papers.nips.cc | ML 顶会,含大量 LLM |
| OpenReview ICLR | openreview.net | 能看到审稿意见,学怎么评判 |
| arXiv | arxiv.org/list/cs.CL/new | 预印本,2026 年是 LLM 主战场 |
| Past cs224n | cs224n.stanford.edu | 往届 best project,读 3 个再开工 |
| HuggingFace Daily Papers | huggingface.co/papers | 编辑精选 + 社区投票 |
| Papers with Code | paperswithcode.com | 带代码 + leaderboard |
| NLP-progress | nlpprogress.com | 各任务 SOTA 跟踪(不一定最新,但导航好) |
"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,意味着:
本部分把原讲义的"Exciting areas 2026" bullet list 展开成每个方向都可做 8 周项目的研究地图。每节给出:(1) 问题定义、(2) 关键论文、(3) 经典 baseline、(4) 适合 CS224N 项目的"可做的 X"。
"LLM agent" 这个词在 2023 是营销词,2026 是工程标准。一个 agent = LLM + 外部工具调用 + 记忆 + 规划循环。核心问题已经从"能不能用"变成"如何评估、如何防止失控、如何降低长周期 cost"。
| 方向 | 代表工作 | 关键指标 | 适合 CS224N 项目 |
|---|---|---|---|
| Tool use (single-turn) | Toolformer (Schick 2023)、Gorilla、ToolBench | Tool call accuracy | 构造 1-2 个新 tool 的 fine-tune 数据,看 small LLM 能否学到 |
| Planning (ReAct 系) | ReAct, Reflexion, Tree-of-Thought, LLM Compiler | Success rate, # steps | 对比 ReAct vs CoT vs Plan-and-Solve 在某具体任务上的 trade-off |
| Memory | MemGPT, A-MEM, Letta | 长对话一致性 | 用 RAG vs 长上下文 vs 外存 memory 对比同一对话基准 |
| Computer-use | Claude Computer Use (2024)、GPT-Operator、SWE-agent | WebArena, OSWorld, SWE-bench | 挑一个 OSWorld 子任务,分析失败模式 |
| Multi-agent | AutoGen, MetaGPT, ChatDev, CAMEL | 任务完成率 / cost | 测"加更多 agent" 是否真的有用(很多论文显示是 placebo) |
| Protocol / 标准 | MCP (Model Context Protocol, Anthropic 2024)、Agent2Agent (Google 2025) | 互操作性 | 实现一个 MCP server,分析协议开销 |
推理(reasoning)是 2024-26 年最热的方向,没有之一。范式演进:
| 算法 | 需要的 reward | 显存开销 | 典型使用 |
|---|---|---|---|
| SFT | 无(需轨迹) | 1× 模型 | 初始化 / 蒸馏 |
| RLHF (PPO + ORM) | 偏好 RM | 4× 模型(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 |
Sycophancy = LLM 倾向于附和用户、即使用户错了。Sharma et al. (Anthropic 2023) 系统记录了这个现象:模型会把 "I disagree, that 3+3=7" 解读成"我之前错了,3+3=7"。原因是 RLHF reward model 把"用户开心"和"正确"混在一起学。
Hallucination 分两类:
| 基准 / 方法 | 评估目标 | 2026 状态 |
|---|---|---|
| TruthfulQA (Lin 2022) | 常见误解 | 已被大模型刷高,但仍能区分小模型 |
| HaluEval | summarization / QA | 常用基线 |
| FActScore (Min 2023) | 原子事实级 precision | 2024-26 主流度量 |
| HALoGEN (Pal 2024) | 10 个领域,1.4 万 prompt | 新基线 |
| Self-RAG / CRAG | RAG 缓解 | retrieval-then-decide |
| Semantic entropy (Farquhar 2024 Nature) | 不确定性检测 | 对 confabulation 有效 |
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 | ✅ |
| Neuronpedia | SAE features 浏览器 | ✅ |
| Activation patching / causal tracing | 定位 fact recall 的关键层 | — |
| Circuits (IOI, indirect object identification) | 逆向工程小行为 | — |
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 模型 |
| HELMET | Holistic 长上下文评估 | 多角度 |
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 | 纯合成"教科书"语料 + code | Phi-1/2/3 |
| Persona Hub (2024) | 10 亿 persona 驱动多样性 | Tencent |
| Model collapse 风险 | 合成数据连续训练会退化 | Shumailov 2024 Nature |
2026 年视觉 + 语言 + 语音几乎是默认配置。但项目层面"轻量入门"通常聚焦视觉-语言(VLM)。
| 模型族 | 架构特点 | 开源情况 |
|---|---|---|
| LLaVA / LLaVA-Next | ViT + projector + LLM | 开源 |
| Idefics-2/3 (HF) | perceiver-resampler | 开源 |
| Qwen2-VL / 2.5-VL | 原生动态分辨率 | 开源 |
| InternVL-2/2.5 | 放大 ViT, 双向训练 | 开源 |
| Gemini / GPT-4o | token-level 早期融合 | 闭源 |
| 方法 | 需要 | 稳定性 | 2026 流行度 |
|---|---|---|---|
| PPO + RM (RLHF) | 偏好对 + critic | 调参敏感 | 仍是大厂主流 |
| DPO | 偏好对 | 稳定 | 开源最常用 |
| IPO | 偏好对(加正则) | 更稳 | 研究常用 |
| KTO | 单点反馈(赞/踩) | 稳定 | 低标注成本 |
| SimPO | 偏好对(无 ref) | 稳定 | 2024 上升 |
| ORPO | 偏好对 + SFT 一起 | 简洁 | 2024 上升 |
| GRPO (RLVR) | 可验证 reward | 稳定 | 推理模型核心 |
静态基准饱和后,2024-26 年出现三类新评估:
本部分是 8 周项目的"工具箱"。每个小节都可直接抄进你的代码库。所有片段在 2026-05 的 PyTorch 2.5、Transformers 4.45、Accelerate 1.0、PEFT 0.13 上验证。
| 资源 | 典型成本 | 能跑什么(参考) | 申请方式 |
|---|---|---|---|
| Google Colab Free (T4 16GB) | 0 美元 | LoRA fine-tune 7B 4-bit;GPT-2 small full FT | colab.research.google.com |
| Colab Pro+ (A100 40GB) | 50 美元/月 | FT 7B FP16;LoRA 13B | 账号升级 |
| Stanford Sherlock GPU (A100 40GB / H100 80GB) | 课程配额 | FT 13B;预训练小 GPT | through 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 |
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
| 数据类型 | 范围 | 精度 | 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) |
GradScaler 把 loss 放大 $\sim 2^{15}$ 倍| Optimizer | 显存 | 主要超参 | 典型场景 |
|---|---|---|---|
| SGD + momentum | 1× params | lr, momentum | 视觉;CS224N 项目几乎不用 |
| AdamW | 2× params (m, v) | lr, betas=(0.9, 0.95), wd | NLP 默认 |
| Adafactor | ~0.5× params | lr, scale_parameter | T5; 大模型省显存 |
| Lion (Google 2023) | 1× params (动量) | lr ≈ 1/10 AdamW | 有时更稳,省一半显存 |
| Sophia (Stanford 2023) | 2× params + Hessian | lr, rho | 研究中 |
| Schedule-Free (Meta 2024) | 1× params | 无需 schedule | 新,慎用 |
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)})
wandb.run.log_code(".")),方便复现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 自动并行)。
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 GB | 100% | — |
| LoRA (r=16) | ~18 GB | 95-99% | 多任务 adapter 可切换 |
| QLoRA (4-bit + LoRA) | ~10 GB | 95-99% | 1×A6000/RTX 4090 可微调 7B |
| DoRA (weight-decomposed LoRA) | ~LoRA | +0.5-1% | 把权重分解 magnitude + direction |
| VeRA / LoRA-FA | 更省 | 略低 | 共享 random A、只学 B |
| 策略 | 显存复制 | 速度 | 适用 |
|---|---|---|---|
| DDP (DataParallel) | 每卡完整模型 + grad + opt | 最快 | 模型能装下单卡(≤ 1-3B) |
| FSDP / ZeRO-3 | 参数、梯度、优化器全 shard | ~80% DDP | 模型放不下单卡 |
| DeepSpeed ZeRO-Offload | opt 状态放 CPU | 更慢 | 显存极紧(单卡 24GB 训 7B) |
| Tensor Parallel | 逐层切分 | NVLink 内快 | 千亿模型 |
| Pipeline Parallel | 逐层切到不同 GPU | 慢,bubble 问题 | 万亿模型 |
| Sequence Parallel / Ring Attention | 序列维度切分 | — | 百万 token 上下文 |
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
| 引擎 | 核心技术 | 吞吐增益 | 适用 |
|---|---|---|---|
| vLLM | PagedAttention + continuous batching | 10-24× vs HF generate | 开源最常用 |
| TGI (Text Generation Inference) | 类似 vLLM | ~ vLLM | HF 出品 |
| TensorRT-LLM | NVIDIA kernel 极致优化 | 更高,但难调 | 生产 |
| SGLang | RadixAttention(cache 树) | 结构化 prompt 极快 | agents、JSON |
| llama.cpp | CPU/Apple Silicon GGUF | 本地推理 | 无 GPU 环境 |
| MLC-LLM | 跨平台编译 | WebGPU/移动端 | 端侧 |
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)
| 症状 | 大概率原因 | 第一招 |
|---|---|---|
| loss 一开始就 NaN | 初始化 / softmax 数值 | 检查 LayerNorm/Softmax 输入是否含 inf;用 torch.autograd.detect_anomaly() |
| loss 训了 100 步突然 NaN | FP16 溢出 | 启用 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 N | seq 长度变长 / 内存碎片 | 开 gradient_checkpointing;调小 max_seq_len;torch.cuda.empty_cache() |
| 训练比预期慢 3× | num_workers=0 / pin_memory off | DataLoader 加 4 workers + pin_memory=True |
| GPU 利用率 < 50% | I/O bottleneck | 把数据预 tokenize 缓存,避免 runtime tokenize |
| 多卡 loss 与单卡差很多 | 没正确同步 batch norm / 没 average loss | 用 SyncBN;DDP 自动平均梯度 |
| 梯度爆炸 grad_norm > 100 | lr 太大 / 数据有异常值 | 降 lr、加 clip、查脏数据 |
| val acc 抖动 ±5% | seed 不固定 / batch 太小 | 多 seed 跑取均值 ± std |
| val acc 0.5 训不动 | label 错位 / data shuffle bug | 打印 batch 的 (input, label) 对,肉眼检查 |
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 # 一段话写清楚: 我做了什么、结果如何
torch.manual_seed、numpy.random.seed、random.seed、torch.cuda.manual_seed_all、torch.use_deterministic_algorithms(True)worker_init_fn 单独设| 象限 | 例子 | 优点 | 风险 |
|---|---|---|---|
| 有标注 + 公开 | SQuAD, GLUE, MMLU, MATH | baseline 现成、可比较 | 已被 LLM 训练时见过(污染) |
| 有标注 + 私有 / 受限 | LDC、医学/法律数据 | 污染少 | 许可严,作业范围有限 |
| 无标注 + 公开 | Common Crawl, RedPajama, FineWeb | 大、免费 | 清洗工作量大 |
| 无标注 + 自采 | 爬虫、自家产品 log | 独特 | 耗时;许可、隐私 |
| 资源 | 覆盖 | 许可 | 访问 |
|---|---|---|---|
| HuggingFace Datasets | 638+ 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-Edu | 15T token 预训练语料 | ODC-By | huggingface.co/datasets/HuggingFaceFW |
| RedPajama-V2 | 30T token | 开放 | HF |
| Common Crawl | 万亿 token 原始网页 | 开放 | commoncrawl.org |
| 能力 | 经典 (≤2022) | 现代 (2023-26) |
|---|---|---|
| 通识知识 | MMLU (57 学科) | MMLU-Pro、GPQA-Diamond(专家级)、SuperGPQA |
| 数学 | GSM8K、MATH | AIME 2024/25、Omni-MATH、PutnamBench |
| 代码 | HumanEval、MBPP | SWE-bench (Verified/Lite)、LiveCodeBench、CodeContests |
| 推理 | BBH(BIG-Bench Hard) | ARC-AGI、MUSR、ZebraLogic |
| 事实 / 幻觉 | TruthfulQA | FActScore、HALoGEN、SimpleQA |
| 指令遵循 | — | IFEval、MT-Bench、Arena-Hard-Auto |
| 长上下文 | — | RULER、LongBench-v2、NoCha、HELMET |
| Agent / 工具 | — | WebArena、OSWorld、τ-Bench、ToolBench、AgentBench |
| 视觉-语言 | VQA-v2、MS-COCO | MMMU、MMMU-Pro、MathVista、CharXiv、Egonormia |
| 多语 | XNLI、XCOPA | MGSM、Belebele(122 语种 QA)、Flores-200 |
| 对抗 / 鲁棒 | Adversarial-NLI | HarmBench、StrongREJECT、jailbreak-bench |
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"]))
当总数据 < 几千条,单独拿 20% 当 dev 太亏。K-fold CV:
| 正则化方法 | 原理 | 典型超参 |
|---|---|---|
| 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 好 |
Report 里 32% 的"含金量"很大一部分来自有数据支撑的错误分析,不只是"准确率 88.5%"。
每条模板包含:动机 · 方法 · 数据 · 评估 · 难度。直接复制改成你的 Proposal 草稿。难度按 8 周 1-3 人团队估。
| 缩写 | 全称 | 2026 上下文 |
|---|---|---|
| BPE | Byte-Pair Encoding | tokenization 主流 |
| RoPE | Rotary Position Embedding | 位置编码事实标准 |
| RMSNorm | Root Mean Square Norm | 替代 LayerNorm,省计算 |
| SwiGLU | Swish-Gated Linear Unit | FFN 激活 |
| MoE | Mixture-of-Experts | 稀疏激活,Mixtral / DeepSeek-V3 |
| GQA / MQA / MLA | Grouped/Multi-Query/MultiHead-Latent Attn | KV cache 优化 |
| SFT | Supervised Fine-Tuning | post-train 第一步 |
| RLHF | RL from Human Feedback | 对齐主流 |
| DPO | Direct Preference Optimization | 替代 PPO 的简单方案 |
| RLVR | RL with Verifiable Rewards | reasoning 模型核心 |
| GRPO | Group Relative Policy Optimization | DeepSeek-R1 用 |
| CoT | Chain-of-Thought | 推理 prompting |
| ToT | Tree-of-Thoughts | 搜索式推理 |
| PRM / ORM | Process/Outcome Reward Model | 推理监督粒度 |
| RAG | Retrieval-Augmented Generation | 外挂知识 |
| SAE | Sparse Autoencoder | Mech Interp 工具 |
| LoRA / QLoRA / DoRA | Low-Rank Adapter 系 | PEFT 三件套 |
| FSDP / ZeRO | Fully Sharded Data Parallel | 大模型训练 |
| vLLM / TGI | 推理引擎 | PagedAttention |
| MCP | Model Context Protocol | Anthropic 2024 agent 协议 |
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."
research/paper-writing.md · research/methodology.md · frontiers/agents/