第 9 章 · 序列模型与注意力

语言、语音、股票、DNA——世界大量数据是序列(顺序有意义)。处理序列的老王者是循环神经网络(RNN),新王者是 Transformer(注意力机制)——2017 年论文标题「Attention Is All You Need」宣告换朝,2022 年 ChatGPT 让全世界知道了它。本章讲清 RNN 的贡献与困境,重点讲透注意力:它是大模型(第 10 章)的全部地基,值得用这一章慢慢磨。

9.1 序列难题:变长 + 上下文 + 长程依赖

序列数据对第 7 章的网络提出三个刁难:

  • 变长:句子 3 个词到 300 个词,全连接的输入定长;
  • 顺序敏感:「狗咬人」≠「人咬狗」,词袋式的输入丢失语序;
  • 长程依赖:「我在中国长大,……(说了 50 个词)……,所以我说中文」——答案取决于 50 词之前的信息。

RNN 的答案:给网络加一个隐藏状态(记忆),逐词读入,每步更新:

ht=tanh⁡(Whh‘t−1‘+Wxxt+b)h_t = \tanh(W_h h_`{t-1}` + W_x x_t + b)

h 一路滚,历史压缩在里面。它是第一个「能处理任意长度序列」的网络,1990s~2017 年的 NLP 主宰(机器翻译、语音识别)。LSTM/GRU 加「门控」(可学习的遗忘/记忆阀门)缓解长程问题,一度是最强 Seq2Seq。

9.2 RNN 的死穴:串行与遗忘

两个结构性缺陷:其一,串行——必须算完 t−1 才能算 t,无法并行(第 7 章的 GPU 巨兽空转,序列 1000 词就是 1000 步串行);其二,长程遗忘——信息每步被压缩重写,50 词前的关键信息衰减殆尽(LSTM 缓解但没根治,梯度沿时间连乘照样消失,第 7 章的梯度问题在时间维重演)。

2017 年的 Transformer 用一句话判了 RNN 死刑:把循环扔掉,让每个词直接「看」所有词(自注意力)——上下文不再靠逐步压缩,而是一步到位;计算完全并行,长程依赖一步可达。

9.3 注意力:查询、键、值的查询系统

注意力(attention)的直觉:每个词根据「相关性」从其他词那里取信息。实现成一套查询系统(和数据库课的检索惊人同构):

  • 每个 token 生成三个向量:Query(我要找什么)、Key(我是什么标签)、Value(我携带的内容);
  • 相关度 = Q·K 点积(越大越相关),softmax 归一成权重(总和 1);
  • 输出 = 按权重加权求和所有 Value。

‘Attention‘(Q,K,V)=‘softmax‘ ⁣(‘QK⊤‘‘dk‘)V\text`{Attention}`(Q, K, V) = \text`{softmax}`\!\left(\frac`{QK^\top}``{\sqrt{d_k}}`\right) V

(√d 是缩放:维度大时点积过大,softmax 饱和,梯度死。)

例句「The animal didn't cross the street because it was too tired」:「it」的 Query 与「animal」的 Key 高度匹配,于是 it 的输出里大量混入 animal 的 Value——指代消解在这一步数学地完成了。注意力权重矩阵可视化,你能直接看到「谁在看谁」(大模型的少数可解释窗口)。

自注意力(self-attention):Q、K、V 全来自同一句(词与词互相看);多头(multi-head):并排 8~96 组独立的 Q/K/V(每组一个「视角」:一组盯语法、一组盯指代……,具体学到什么没人完全知道),各自输出拼接。位置编码:注意力天生无序(集合运算!),要把「位置」信息加进 token 表示(原始用正弦波,现代用 RoPE 等旋转编码)。

9.4 Transformer:堆叠的注意力积木

完整 Transformer 块 = 自注意力 + 前馈网络(MLP)+ 残差连接 + 层归一化,堆 N 层:

x ──▶ [多头自注意力] ──▶ [+x 残差] ──▶ [MLP(逐词两层网络)] ──▶ [+残差] ──▶ 下一层

残差连接(第 8 章 ResNet 的移民)让梯度走高速通道(几十层可训);层归一化稳定每层的数值分布;MLP 占参数大头(负责「消化」注意力收集来的信息)。GPT-3 有 96 层、1.2 万维、96 个头、1750 亿参数——没有新魔法,全是本章积木的堆料,配上海量数据与算力(缩放定律:模型/数据/算力按比例放大,能力可预测地涨,这是大模型时代的路线图)。

两种用法:BERT 式(只有编码器,双向看全文,适合理解类任务:分类、检索)与 GPT 式(只有解码器,带掩码的注意力只能看左边,自回归生成:预测下一个 token,一次一个,这就是「生成」的机械本质)。今天的所有大模型几乎都是 GPT 式。

9.5 注意力的账单:二次方的代价

自注意力的复杂度是 O(n²)(n 个词互相看,n² 对 QK 点积):序列翻倍,计算翻四倍。这直接造出大模型的两条限制:上下文窗口(模型一次能看的最大 token 数,从 2K 卷到百万级,窗口外的它「失忆」)、长文档成本(整本书喂进去代价惊人)。研究界的长上下文攻关(稀疏注意力、滑动窗口、检索增强)全是围绕这个二次方做文章——「把 O(n²) 压下来」是 2020 年代 AI 系统工程的中央战场(第 10 章的 RAG 就是工程绕行方案)。

常见认知误区

  • 「注意力模拟了人类注意」。它是加权平均的检索机制,名字取意「pay attention to」,不是认知科学的仿造;别用「人怎么集中注意」去预测它的行为。
  • 「Transformer 理解了语言」。它学的是 token 序列的统计结构(而且学得惊人地好);「理解」之争(第 1 章)未决,工程上只谈「在什么任务上什么分布内可靠」。
  • 「RNN 完全死了」。极低资源、流式、超长序列场景(状态空间模型 Mamba 是 RNN 思想的 2024 复兴)仍在权衡串行 vs 并行;架构选择永远看约束。
  • 「注意力图 = 解释」。注意力权重高 ≠ 该词是决策原因(有研究表明相关不等于因果);可解释性要靠更严谨的工具,别把可视化当证明。

练习

  1. 手算:三个词的 Q、K 矩阵(数值自造 2 维),手算注意力分数、softmax、加权输出;验证「与自己最匹配」(Q·K 对角占优)在无位置编码时是否成立。
  2. 动手:用 PyTorch 的 nn.MultiheadAttention 跑一个 4 词句子的前向(随机参数),打印注意力矩阵,观察第一层「谁在看谁」。
  3. 动手:字符级小 GPT(跟着 nanoGPT 的极简版):在莎士比亚文本上训练一个 2 层 Transformer,采样几段「伪莎翁」,体感「预测下一个字符」如何长出文风。
  4. 思考:RNN 把历史压缩进一个定长向量(有损),注意力把历史全部摊开(O(n²) 但无损)。用计组课第 7 章(存储层次:缓存 vs 内存)类比这个取舍,讨论「上下文窗口」是不是 AI 版的「缓存大小」。