Week 8:Recurrent Neural Networks and Transformer
// @order: 999
下面是基于课件 AIAA3201-week8.pdf 的期末复习版学习笔记。课件主线是:从 RNN 处理序列的局限,演进到 attention,再抽象为 general attention layer,最后形成 Transformer encoder-decoder 架构。
Week 8:Recurrent Neural Networks and Transformer
0. 本章核心目标与“进化树”
本章要解决的根本问题是:
如何让神经网络有效处理可变长度的序列输入/输出,并且能够建模长距离依赖?
传统 CNN / vanilla NN 通常假设固定大小输入和固定大小输出。例如图像分类是 image → class。但很多任务不是这样:
图像描述:image → sequence of words 视频分类:sequence of frames → action class 视频描述:sequence of frames → caption 机器翻译:source sentence → target sentence
本章技术演进树可以概括为:
Vanilla NN / CNN
↓ 不能自然处理可变长度序列
RNN
↓ 用 hidden state 逐步读入序列
Seq2Seq Encoder-Decoder
↓ 把整个输入压缩成一个 context vector,形成信息瓶颈
RNN + Attention
↓ 每个 decoding step 动态选择输入中相关部分
General Attention Layer
↓ 抽象成 query-key-value 的通用操作
Self-Attention
↓ 输入之间直接两两交互,但缺少顺序信息
Positional Encoding + Masked Attention + Multi-Head Attention
↓
Transformer Encoder-Decoder
↓ 高并行、长距离依赖建模强,但 memory cost 高
Vision Transformer / Transformer-only vision-language models
重要程度标注:
| 模块 | 重要程度 | 期末考重点 | | ——————————— | —-: | ————————- | | RNN hidden state update | ★★★★★ | 必考基础 | | Seq2Seq bottleneck | ★★★★★ | attention 的动机 | | Attention 计算流程 | ★★★★★ | alignment、softmax、context | | Q/K/V self-attention | ★★★★★ | Transformer 核心 | | Positional encoding | ★★★★☆ | 为什么需要、sin/cos 直觉 | | Masked self-attention | ★★★★☆ | autoregressive decoding | | Multi-“head” attention | ★★★★☆ | 为什么多个 “head” | | Transformer encoder/decoder block | ★★★★★ | 架构题常考 | | 优化器 recap | ★★★☆☆ | 可能作为选择/简答 |
—
1. Recap:优化与正则化
这一部分是上一讲复习,但期末仍可能考概念选择题。
1.1 SGD 的三个问题
SGD 基本更新:
其中:
表示第 (t) 次迭代的参数向量;
是 learning rate;
是当前参数处的梯度。
SGD 的三个典型问题:
第一,loss landscape 条件数很大。某些方向变化很快,某些方向变化很慢。SGD 会在陡峭方向震荡,在平坦方向前进很慢。
第二,遇到 local minimum 或 saddle point 时容易停滞。深度学习中 saddle point 通常比真正 bad local minimum 更常见。
第三,mini-batch gradient 有噪声。真实 empirical loss 是:
梯度为:
但 SGD 每次只用 mini-batch 估计这个梯度,所以方向会抖动。
—
1.2 Momentum:用历史梯度平滑更新
课件公式:
符号解释:
是 velocity,即历史梯度的指数累积;
是 momentum coefficient,也可理解为 friction,常用 (0.9) 或 (0.99);
是 learning rate。
直觉:Momentum 不是给每个参数自适应学习率,而是让更新方向具有惯性。它会抑制来回震荡,强化持续一致的下降方向。
—
1.3 AdaGrad:每个参数自适应学习率
AdaGrad 累积平方梯度:
更新:
其中:
表示当前梯度;
是历史平方梯度累积;
表示 element-wise multiplication;
是防止除零的小常数。
直觉:如果某个方向梯度长期很大,分母会变大,该方向步长变小;如果某个方向梯度较小,分母增长慢,相对步长更大。
问题:由于 (G_t) 不断累积,分母会越来越大,导致后期 step size 可能趋近于 0。
—
1.4 RMSProp:修复 AdaGrad 步长衰减过快
RMSProp 不再无限累积平方梯度,而是使用指数滑动平均:
更新:
其中:
是 decay rate。
它保留 AdaGrad 的 per-parameter adaptive learning rate,但避免历史太久的梯度永久压低学习率。
—
1.5 Adam:Momentum + RMSProp + Bias Correction
Adam 同时维护一阶矩和二阶矩:
因为 (m_0=0, v_0=0),初期估计偏小,所以要 bias correction:
最终更新:
常用超参数:
Adam 的本质:一阶矩 (m_t) 提供 momentum,二阶矩 (v_t) 提供 RMSProp/AdaGrad-style adaptive scaling。
—
2. RNN:为什么需要序列模型?
2.1 Vanilla Neural Network 的局限
普通神经网络通常是 one-to-one:
例如 image classification。问题是它不自然支持 variable-length input/output。
序列任务有多种形式:
| 任务类型 | 输入 | 输出 | 例子 | | ——————- | —- | —- | ——————————– | | one-to-one | 单个输入 | 单个输出 | image classification | | one-to-many | 单个输入 | 序列输出 | image captioning | | many-to-one | 序列输入 | 单个输出 | video classification | | many-to-many | 序列输入 | 序列输出 | machine translation | | synced many-to-many | 序列输入 | 每步输出 | frame-level video classification |
—
2.2 RNN 的核心思想:hidden state
RNN 的关键是有内部状态 (h_t)。每读入一个输入 (x_t),状态都会更新:
输出为:
符号解释:
是第 (t) 个输入向量;
是第 (t) 步 hidden state,保存历史信息;
是状态转移函数,参数为 (W);
是输出函数,参数为 (W_o);
是第 (t) 步输出。
Vanilla RNN / Elman RNN 常见形式是:
其中:
把输入映射到 hidden space;
把上一时刻 hidden state 映射到当前 hidden state;
把 hidden state 映射到输出 logits;
是 bias。
最重要的一点:同一组参数 (W) 在所有 time step 共享。
这就是 RNN 能处理任意长度序列的原因。
—
3. RNN 的计算图与任务类型
3.1 Many-to-many
输入:
状态递推:
输出:
总损失通常是每个 time step 的损失求和:
适用于 frame-level classification、language modeling 等。
—
3.2 Many-to-one
只使用最终 hidden state:
适用于 sentiment classification、video classification 等。
直觉:整个输入序列的信息被压缩到最后一个 (h_T)。
—
3.3 One-to-many
单个输入生成序列。例如 image captioning。
图像特征 (v) 可以作为初始信息注入 RNN:
其中:
是 image feature;
把图像特征映射进 hidden state。
然后每一步输出一个 token,并把上一步 token 作为下一步输入。
—
4. Character-level Language Model
以 vocabulary:
训练序列:
语言模型的目标是预测下一个字符:
RNN 每一步输出 logits:
经过 softmax 得到概率:
其中:
是 vocabulary size;
是第 (t) 步对第 (k) 个 token 的 logit。
训练时使用 teacher forcing:输入真实前缀,预测下一个字符。
测试时使用 sampling:
输入 <START>
模型输出下一个字符分布
sample 一个字符
把 sampled 字符再喂回模型
重复直到生成 <END> 或达到最大长度
重要直觉:RNN 不是每个 block 生成新 token,而是每个时间步通过最后输出层产生 token distribution;sample 出来的 token 再作为下一时间步输入。
—
5. Seq2Seq:Encoder-Decoder 架构
5.1 基本结构
Encoder 读取输入序列:
并生成 hidden states:
然后把整个输入压缩为一个 vector,例如:
其中:
可以是 encoder 的最后状态或所有 encoder states 的组合;
是 decoder 的初始 hidden state。
Decoder 生成输出序列:
其中:
是 context vector,早期 seq2seq 中通常就是 encoder 最终状态。
—
5.2 核心瓶颈:fixed-length context vector
问题是:
必须承载整个输入序列的所有信息。
当输入很长或输出很长时,单个向量会成为信息瓶颈。模型需要把“所有未来可能需要的信息”都压缩进一个固定维度向量。
这就是 attention 的动机。
—
6. RNN + Attention:解决 context bottleneck
6.1 从固定 context 到动态 context
Vanilla encoder-decoder 使用固定 context:
Attention 改成每个时间步都有不同 context:
核心思想:decoder 在生成每个词时,动态选择输入中最相关的部分。
例如生成 “person” 时看图像中的人;生成 “hat” 时看帽子区域。
—
6.2 图像 captioning 中的 attention
CNN 提取 spatial features:
其中:
是空间尺寸;
是每个空间位置的 feature dimension;
是位置 ((i,j)) 的视觉特征。
对 decoder 第 (t) 步,计算 alignment score:
其中:
是 decoder 上一步 hidden state;
通常是 MLP;
表示当前生成步骤和图像位置 ((i,j)) 的匹配程度。
用 softmax 归一化:
满足:
context vector:
直觉:(c_t) 是所有 spatial feature 的加权平均。权重越大,说明该位置对当前生成 token 越重要。
—
6.3 Soft attention vs hard attention
Soft attention:
是连续可微的,可以 end-to-end backpropagation。
Hard attention 是离散选择某一个区域:
然后:
由于采样不可微,通常需要 reinforcement learning / policy gradient。
课件重点是 soft attention,因为它端到端可训练,不需要 attention supervision。
—
7. NLP 中的 Attention:机器翻译
输入序列:
输出序列:
Encoder 产生每个输入位置的 hidden state:
Decoder 第 (t) 步计算对每个 source token 的 alignment:
归一化:
context:
decoder 输出:
直觉:翻译时不同 target word 对应不同 source word。Attention 可以自动学 alignment,而且不需要人工标注对齐关系。
—
8. General Attention Layer:从任务技巧到通用神经网络层
8.1 把图像 attention 抽象成向量集合 attention
输入向量:
query:
alignment:
attention weights:
output context:
注意:这个操作本身是 permutation invariant 的。也就是说,如果不加入位置信息,它不关心输入向量的顺序。
—
8.2 Dot-product attention
把 MLP alignment 换成点积:
进一步使用 scaled dot prod:
为什么要除以 ?
如果 (h) 和 (x_i) 的各维度近似独立且方差为 1,那么点积:
方差大约与 (D) 成正比。维度越大,logits 越大,softmax 越容易饱和,梯度变小。因此除以 稳定数值尺度。
—
8.3 多个 query
如果有多个 query:
则每个 query 产生一个 output:
其中:
索引 query/output position;
索引 input position。
—
9. Key-Value-Query:Attention 的核心抽象
课件指出:原始 input vector 同时用于 alignment 和 weighted sum,表达能力有限。于是引入不同的线性投影:
如果 query 也是从输入得到:
其中:
是 key projection matrix;
是 value projection matrix;
是 query projection matrix。
Attention 变成:
矩阵形式:
符号解释:
是输入序列;
是 queries;
是 keys;
是 values;
是所有 query 和 key 的 pairwise alignment score。
直觉:
query:我现在想找什么? key:每个输入位置有什么可被匹配的特征? value:真正被加权读取的信息内容。
—
10. Self-Attention
10.1 定义
Self-attention 的特点是:query、key、value 都来自同一组输入 (X)。
它让每个位置 (j) 都能 attend 到所有位置 (i)。
—
10.2 Self-attention 的优势
RNN 的信息传递路径是 sequential:
远距离信息必须经过很多步。
Self-attention 中任意两个位置直接交互:
路径长度为 1。
这使它更适合长距离依赖,并且所有 pairwise attention 可以并行计算。
—
10.3 Self-attention 的问题:没有顺序
Self-attention 本身是 permutation invariant / permutation equivariant。也就是说,输入顺序改变,输出也只是相应重排,模型本身不知道哪个 token 在前哪个在后。
因此语言或图像空间特征必须加入 positional encoding。
—
11. Positional Encoding
11.1 为什么需要位置编码?
输入 token embedding:
加上或拼接 positional encoding:
得到:
或课件中说的 concatenate:
position function:
设计目标:
第一,每个位置要有唯一编码。 第二,任意两个位置之间的距离关系应具有一致性。 第三,能泛化到比训练时更长的序列。 第四,值应有界且 deterministic。
—
11.2 Learned positional embedding
一种方法是学习 lookup table:
第 (t) 个位置编码:
优点:简单,灵活。 缺点:不能自然泛化到超过 的长度;位置之间的结构关系需要模型自己学。
—
11.3 Sinusoidal positional encoding
Transformer 原论文使用固定 sin/cos 编码:
其中:
是 token 位置;
是维度 index;
是 embedding dimension;
表示偶数维;
表示奇数维。
直觉:不同维度对应不同频率的正弦/余弦函数。低维或高频维度捕捉局部位置变化,高维或低频维度捕捉长距离变化。由于 sin/cos 是确定函数,因此可以 extrapolate 到更长位置。
—
12. Masked Self-Attention
普通 self-attention 允许每个位置看到所有位置。但语言生成是 autoregressive:
因此生成第 (t) 个 token 时不能看未来 token。
Masked self-attention 通过把未来位置的 alignment score 设置为:
实现遮蔽:
softmax 后:
所以未来 token 的 attention weight 为 0。
这是 Transformer decoder 中最关键的机制之一。
—
13. Multi-Head Attention
13.1 定义
Multi-“head” attention 并行运行多个 attention “head”:
然后 concatenate:
其中:
是 “head” 数量;
是输出投影矩阵。
—
13.2 为什么需要多头?
单个 attention “head” 只能在一个表示子空间里计算相关性。多个 “head” 可以学习不同关系:
一个 “head” 关注局部邻近词; 一个 “head” 关注主谓关系; 一个 “head” 关注长距离依赖; 一个 “head” 关注视觉区域之间的空间关系。
直觉:multi-“head” attention 是多个“不同视角”的 attention ensemble。
—
14. RNN vs Transformer
| 维度 | RNN | Transformer | | —— | ———————- | ———————————- | | 序列建模方式 | hidden state 递推 | pairwise attention | | 并行性 | 差,必须按时间步计算 | 强,所有位置可并行 | | 长距离依赖 | 路径长,容易衰减 | 任意位置直接交互 | | 顺序信息 | 天然有顺序 | 需要 positional encoding | | 内存开销 | 相对低 | attention matrix 是 (N times M),内存高 | | 适合任务 | 小模型、序列递推 | 大规模 NLP/CV、多模态 | | 主要瓶颈 | sequential computation | quadratic memory |
核心结论:Transformer 用更高 memory 换取更强并行性和更短依赖路径。
—
15. Transformer Encoder
15.1 Encoder 输入
输入一组向量:
加入 positional encoding:
然后送入 (N) 个 encoder blocks。Vaswani et al. 原始 Transformer 中:
—
15.2 Encoder block 结构
一个 encoder block 包含:
Input
↓
Add positional encoding
↓
Multi-"head" self-attention
↓
Residual connection
↓
LayerNorm
↓
MLP / Feed-forward network
↓
Residual connection
↓
LayerNorm
Output
数学形式:
其中:
是 block 输入;
是 attention sublayer 输出;
是 block 输出。
—
15.3 Encoder 中各组件的作用
Self-attention:唯一负责不同 token/vector 之间交互的模块。
MLP:对每个位置独立做非线性变换:
LayerNorm:对每个 token 的 feature dimension 做归一化。
BatchNorm vs LayerNorm:
| 方法 | 归一化维度 | 适合场景 | | ——— | —————————— | —————— | | BatchNorm | across batch,同一 feature 在不同样本间 | CNN 常见 | | LayerNorm | across features,同一样本内部 | RNN/Transformer 常见 |
Residual connection:缓解深层网络训练困难,使梯度更容易传播。
—
16. Transformer Decoder
16.1 Decoder 输入输出
Decoder 输入是已经生成的 target prefix:
输出是下一个 token 的 logits。
整体形式:
其中:
是 encoder 输出的 context vectors。
—
16.2 Decoder block 结构
一个 decoder block 包含:
Input target embeddings + positional encoding
↓
Masked multi-"head" self-attention
↓
Residual + LayerNorm
↓
Cross-attention over encoder outputs
↓
Residual + LayerNorm
↓
MLP
↓
Residual + LayerNorm
Output
数学形式:
其中:
是 encoder outputs;
来自 decoder 当前状态;
来自 encoder 输出。
重点:decoder 的第二个 attention 不是 self-attention,而是 encoder-decoder attention / cross-attention。
—
17. Image Captioning using Transformer
图像 captioning 可以用 CNN + Transformer:
第一步,CNN 提取 spatial features:
展平成序列:
第二步,Transformer encoder 编码图像特征:
第三步,Transformer decoder 根据前文 token 和图像 context 生成 caption:
这对应课件中的 image captioning using transformers。
进一步问题:是否还需要 CNN?
Vision Transformer 的思想是把图像切成 patch,把每个 patch 当成一个 token:
因此可能完全用 Transformer 从 pixels 到 language。
—
18. 本章方法论演进总结
| 阶段 | 方法 | 解决什么 | 失败点 | 下一步如何修复 | | – | ——————— | —————————- | —————————- | ———————— | | 1 | Vanilla NN/CNN | 固定输入输出任务 | 不适合 variable-length sequence | RNN 引入 hidden state | | 2 | RNN | 序列递推建模 | 长距离依赖弱,计算不能并行 | Seq2Seq 组织输入输出 | | 3 | Seq2Seq | sequence-to-sequence | fixed context bottleneck | Attention 每步动态读输入 | | 4 | RNN + Attention | 缓解 bottleneck,可学习 alignment | RNN decoder 仍 sequential | General attention 抽象化 | | 5 | Self-attention | 任意位置直接交互,可并行 | 无顺序信息 | Positional encoding | | 6 | Masked self-attention | 支持 autoregressive generation | 单头表达力有限 | Multi-“head” attention | | 7 | Transformer | 高并行、长依赖强 | (O(N^2)) memory 高 | 更大模型、更高效 attention、ViT 等 |
—
19. 期末高频考点速记
最重要公式:
最重要概念:
RNN 的参数在所有 time steps 共享。 Seq2Seq 的瓶颈是 fixed-length context vector。 Attention 的本质是根据 query 对 input values 做加权求和。 Self-attention 的 Q/K/V 来自同一输入。 Transformer 需要 positional encoding,因为 self-attention 本身不含顺序。 Decoder 必须用 mask 防止看到未来 token。 Encoder self-attention 看全部输入;decoder masked self-attention 只能看过去;decoder cross-attention 看 encoder outputs。