Skip to content

第5章 循环神经网络与序列模型

Chapter 5: Recurrent Neural Networks and Sequence Models

序列数据无处不在:文本、语音、时间序列、基因序列……RNN 是第一个真正为序列建模而设计的神经网络架构。 本章推导 RNN 的核(kernel /ˈkɜːrnl/)心机制——循环计算图与随时间反向传播(backpropagation /ˌbækprəpəˈɡeɪʃən/)(BPTT),并深入 LSTM 的门控机制如何解决长程依赖问题。最后,我们分析 RNN 的固有瓶颈,并以此为桥梁引出注意力(attention /əˈtenʃən/)机制(Attention),为后续 Transformer(/trænsˈfɔːrmər/) 的学习做好铺垫。

时间线:

  • 1982: Hopfield 提出 Hopfield 网络
  • 1990: Elman 提出简单循环网络(SRN)
  • 1997: Hochreiter & Schmidhuber 发表 LSTM

Sequential data is everywhere: text, speech, time series, gene sequences... RNN is the first neural architecture truly designed for sequence modeling. This chapter derives RNN's core mechanism — the recurrent computation graph and Backpropagation Through Time (BPTT) — and dives into how LSTM's gating mechanism solves long-term dependency problems. Finally, we analyze RNN's inherent bottleneck, building a bridge to the Attention mechanism that follows in Volume 5.

前置知识 (Prerequisites): 前馈神经网络基础(第4章第1-2节),矩阵求导(AI数学基础第3章),反向传播(第4章第3节) 依赖库 (Dependencies): torch>=2.1.0, numpyCode companion: code/rnn_lstm.py


目录 (Table of Contents)

  1. RNN 循环计算图 (RNN Recurrent Computation Graph)

  2. LSTM (Long Short-Term Memory)

  3. GRU (Gated Recurrent Unit)

  4. 编码器(encoder /ɪnˈkoʊdər/)-解码器(decoder /diːˈkoʊdər/)架构 (Encoder-Decoder Architecture)

  5. 为什么需要 Attention?

  6. 小结 (Summary)


1. RNN 循环计算图 (RNN Recurrent Computation Graph)

1.1 问题定义:为什么需要"循环"?

前馈网络(FNN)有一个根本性限制:输入长度必须固定

对于一条句子,例如 "I love neural networks",我们无法预先知道句子的长度。更重要的是,词与词之间有顺序依赖关系——"love" 的语义受到前面的 "I" 的影响。如果只是把每个词独立地送入一个全连接层,前后信息就被割裂了。

RNN 的解决方案:引入一个隐藏状态 (hidden state) ht,它在每个时间步更新,并携带过去的信息:

ht=f(ht1,xt)

1.2 RNN 基本公式

最简单的 RNN(有时称为 Elman RNN)定义如下:

隐藏状态更新 (Hidden State Update):

ht=tanh(Whhht1+Wxhxt+bh)

输出 (Output):

yt=Whyht+by

其中:

  • xtRd — 在时间步 t 的输入向量(如词嵌入(embedding /ɪmˈbedɪŋ/))
  • ht1Rdh — 上一个时间步的隐藏状态
  • htRdh — 当前时间步的隐藏状态
  • WhhRdh×dh循环权重矩阵(RNN 的核心——连接前后时间步)
  • WxhRdh×d — 输入权重矩阵
  • WhyRdy×dh — 输出权重矩阵
  • bh,by — 偏置项
  • tanh — 激活函数(将值压缩到 (1,1),给非线性以稳定梯度)

关键观察Whh 在所有时间步共享。这意味着无论序列多长,RNN 都在使用同一组参数(parameter /pəˈræmɪtər/)处理每一个时间步——这就是"循环"的含义。

1.3 展开的计算图 (Unrolled Graph)

将循环结构"展开"成时间维度的前馈图,有助于理解 RNN 的计算流:

        y_1         y_2         y_3         y_T
        ↑           ↑           ↑           ↑
        W_hy        W_hy        W_hy        W_hy
    ┌───┴───┐   ┌───┴───┐   ┌───┴───┐   ┌───┴───┐
h_0→│ h_1  │→→→│ h_2  │→→→│ h_3  │→⋯→│ h_T  │
    └───┬───┘   └───┬───┘   └───┬───┘   └───┬───┘
        ↑           ↑           ↑           ↑
       x_1         x_2         x_3         x_T

图 5.1: RNN 展开后的计算图。注意 Whh 在所有时间步是同一个矩阵——虚箭头代表循环连接,展开后变成从左到右的实心传递。

展开后的视角:RNN 等价于一个极深的"前馈"网络,其深度等于序列长度 T。每一层的权重都相同(参数共享)。这使得 BPTT 在概念上就是普通 BP 在展开图上的直接应用。

1.4 随时间反向传播 (BPTT)

BPTT (Backpropagation Through Time) 就是在展开后的计算图上应用反向传播

损失函数

定义在 T 个时间步上的总损失为每个时间步损失的累加:

L=t=1TLt(yt,y^t)

以 MSE 为例:Lt=12yty^t22

Why 的梯度

Why 直接影响输出 yt,梯度可以直接从每个时间步反向传播回来:

LWhy=t=1TLtWhy=t=1TLtythtT

Whh 的梯度(关键)

Whh 的梯度需要沿时间方向传播,因为 ht 依赖于 ht1。考虑一个具体时间步 tWhh 的影响:

LtWhh=k=1tLthththkhkWhh

核心在于 hthk — 这是从时间 k 到时间 t 的梯度链:

hthk=j=k+1thjhj1=j=k+1tdiag(1hj2)Whh

其中 diag(1hj2) 来自 tanh 的导数:ddxtanh(x)=1tanh2(x)

最终,对 Whh 的梯度是所有路径的总和:

LWhh=t=1Tk=1tLtht(j=k+1thjhj1)hkWhh
🔍 完整演算:BPTT 梯度链 — 3 步标量 RNN 手算

📐 公式

随时间反向传播(BPTT)中,损失 Lt 对循环权重 Whh 的梯度为:

LtWhh=k=1tLtht(j=k+1thjhj1)hkWhh

其中梯度链的核心传递因子为:

hjhj1=diag(1hj2)Whh

对标量 RNN(dh=1),上式简化为:

hjhj1=(1hj2)Whh

📖 参数含义

符号名称含义
Lt时间步 t 的损失模型预测与真实值的误差
Whh循环权重矩阵控制隐藏状态在时间步间的传递
hj时间步 j 的隐藏状态RNN 的"记忆"载体
hj/hj1梯度传递因子衡量误差信号在相邻时间步的衰减或放大
1hj2tanh 的导数值域 (0,1]hj=0 时取最大值 1

📝 公式来源

从 RNN 前向公式 ht=tanh(Whhht1+Wxhxt+bh) 出发,对 ht1 求导:

htht1=ht1tanh(Whhht1+其它项)

由链式法则和 tanh(x)=1tanh2(x)

htht1=(1ht2)Whh

当时间步跨度 tk 较大时,梯度需连乘 tk 个这样的因子——这正是梯度消失/爆炸的数学根源。


✏️ 手算演示

考虑一个标量 RNN(输入维度 d=1,隐藏维度 dh=1),给定参数与输入序列:

Whh=0.5,Wxh=1.0,bh=0.0,h0=0.0x1=1.0,x2=0.5,x3=0.2

Step 1: 前向传播

h1=tanh(0.5×0.0+1.0×1.0)=tanh(1.000)=0.7616h2=tanh(0.5×0.7616+1.0×0.5)=tanh(0.8808)=0.7064h3=tanh(0.5×0.7064+1.0×(0.2))=tanh(0.1532)=0.1520

Step 2: 计算相邻时间步的梯度传递因子

h2h1=(1h22)×Whh=(10.70642)×0.5=(10.4990)×0.5=0.2505h3h2=(1h32)×Whh=(10.15202)×0.5=(10.0231)×0.5=0.4885

Step 3: 计算远距离梯度链(h1h3,跨越 2 步)

h3h1=h3h2×h2h1=0.4885×0.2505=0.1224

结果:仅跨越 2 步,梯度就衰减到了约 12%。若序列长度 T=100(这在 NLP 中很常见),梯度必然消失到 0。

Step 4: 代入不同 Whh 观察影响

Whhh2/h1h3/h2h3/h1(2 步累积)
0.50.25050.48850.1224 — ✅ 梯度消失
0.90.45090.87920.3965 — ⚠️ 长序列仍会消失
2.01.00201.95381.9581 — ❌ 梯度爆炸

梯度爆炸验证(Whh=2.0):

h2h1=(10.70642)×2.0=0.5010×2.0=1.002h3h2=(10.15202)×2.0=0.9769×2.0=1.954h3h1=1.002×1.954=1.958

经过 20 步,梯度将达到约 1.00220×1.954192.5×105,完全不可训练。


🌍 实际意义

  • 梯度消失是 vanilla RNN 无法学习长程依赖的根本原因:理论分析(Bengio et al., 1994)表明,vanilla RNN 在实践中很难捕捉超过 5—10 步的依赖关系。
  • 梯度爆炸导致训练不稳定(NaN 损失),实际解决方案是梯度裁剪(Gradient Clipping)——将梯度模长限制在阈值以内,详见 §1.5。
  • LSTM 的核心贡献就是通过加性细胞状态替代乘性梯度路径,从根本上解决梯度消失问题(详见 §2.6)。

1.5 梯度消失与梯度爆炸

从上面的推导,我们得到:

hjhj1=diag(1hj2)Whh

这是一个连乘结构。假设我们定义矩阵谱范数 Whh2

  • 如果 Whh2<1:连乘项 hjhj10tk 很大时 ⟹ 梯度消失 (Vanishing Gradient)
  • 如果 Whh2>1:连乘项 hjhj1tk 很大时 ⟹ 梯度爆炸 (Exploding Gradient)

为什么这是致命问题?

梯度消失意味着距离较远的时间步对当前参数的更新几乎没有贡献。RNN 无法学习"长程依赖"——例如在句子 "I grew up in France... I speak French" 中,最后一个词需要记忆前面的 "France"。如果距离太远,梯度消失使得这种学习几乎不可能。

梯度爆炸意味着参数更新过大,训练不稳定(NaN 损失)。解决办法:梯度裁剪 (Gradient Clipping) — 将梯度的模控制在阈值以内。

if g>threshold: gthresholdgg

核心洞察: 梯度消失的根本原因是连乘结构。LSTM 的核心贡献就是通过加性的细胞状态来替代乘性的梯度传递路径。


2. LSTM (Long Short-Term Memory)

LSTM 由 Hochreiter & Schmidhuber 于 1997 年提出,后来经过多次改进(尤其是 forget gate 的加入)。它是解决 RNN 梯度消失问题最具影响力的方案。

2.1 核心思想:信息高速公路

LSTM 引入了一个新的内部状态——细胞状态 (Cell State) Ct,作为信息传递的"高速公路"。与 ht 不同,Ct 上的信息流受到精心设计的三个门的调控:

                    ┌──────────────────────────────────────┐
                    │           LSTM Cell                   │
                    │                                      │
    h_{t-1} ────────┼─────────────────────────────────┐    │
                    │                ┌─────┐           │    │
                    │    ┌─────┐     │tanh │     ┌───┐ │    │
    x_t ────────────┼────┤σ    │     │    │      │σ  │ │    │
                    │    │     │────▶│    │─────▶│   │─┼────┤───▶ h_t
                    │    │forget     │input│      │output │    │
                    │    └─────┘     │    │      │   │ │    │
                    │                └─────┘      └───┘ │    │
                    │                   │              │ │    │
                    │         ┌─────┐   │              │ │    │
                    │         │ σ   │  │              │ │    │
                    │         │     │──┘              │ │    │
                    │         │input gate             │ │    │
                    │         └─────┘                  │    │
                    │                                  │    │
                    │  C_{t-1} ────────────⊕───────────┘    │
                    │                         │             │
                    │                         └────▶ C_t    │
                    └──────────────────────────────────────┘

图 5.2: LSTM 细胞内部结构示意图。三条"门"控制信息的流入、保持和流出。细胞状态 Ct 如同传送带贯穿整个链式结构,只有少量的线性交互。

2.2 遗忘门 (Forget Gate)

功能:决定从旧细胞状态 Ct1 中丢弃哪些信息。

为什么需要? 当网络进入新的上下文时,旧信息可能不再相关。例如在 "她开始阅读一本书... 她合上了它" 中,"阅读"的动词形态完成后,关于"正在阅读"的信息应该被遗忘门清除。

公式:

ft=σ(Wf[ht1,xt]+bf)

其中 [ht1,xt]Rdh+d 是将隐藏状态和输入拼接后的向量,WfRdh×(dh+d)

输出 ft(0,1)dh 是一个逐元素的掩码 —— 值为 0 表示"完全遗忘",1 表示"完全保留"。

2.3 输入门 (Input Gate)

功能:决定在细胞状态中存储哪些新信息。

为什么需要? 不是所有的新输入都值得被记住。输入门充当"筛选器",让重要的新信息进入细胞状态。

输入门由两部分组成:

a) 输入门控制信号(决定更新哪些值):

it=σ(Wi[ht1,xt]+bi)

b) 候选细胞状态(生成新的候选值):

C~t=tanh(WC[ht1,xt]+bC)

这里 tanh 将候选值压缩到 (1,1) 范围,it 控制哪些候选值被采纳。

2.4 细胞状态更新 (Cell State Update)

这是 LSTM 中最关键的一步:

Ct=ftCt1+itC~t

其中 表示逐元素乘法 (Hadamard Product)

直观理解

  • ftCt1 — 遗忘门决定保留多少旧记忆
  • itC~t — 输入门决定写入多少新信息
  • 两者相加得到新的细胞状态

核心洞察:从 Ct1Ct 的梯度路径是 加法 而非乘法。即使遗忘门接近 1,梯度也能完好无损地沿 Ct 路径向后传播。

2.5 输出门 (Output Gate)

功能:基于细胞状态 Ct 生成当前时间步的隐藏状态 ht(输出给上层和下一时间步)。

公式:

ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)

tanh(Ct) 将细胞状态压缩到 (1,1)ot 控制输出哪些部分。

2.6 为什么 LSTM 能缓解梯度消失?

这是本章最重要的问题之一。让我们比较 RNN 和 LSTM 的梯度路径。

RNN 的梯度路径(纯乘性):

htht1=diag(1ht2)Whh

这是一个矩阵乘法。链式法则使得远距离的梯度趋于 0(或无穷大)。

LSTM 的梯度路径(加性为主):

考虑从 CtCt1 的梯度:

Ct=ftCt1+itC~tCtCt1=diag(ft)+(其他项,来自 it,C~t 对 Ct1 的依赖)

关键观察

  1. 主导项 diag(ft):细胞状态的梯度通过遗忘门直接向后传递,这是一个逐元素缩放而非矩阵乘法。
  2. ft1 时,梯度项 1,远距离梯度信号几乎无损传递。
  3. 加法结构Ct 的更新是加法(Ct1+Δ),而非乘法(WCt1),梯度不会在每一步被压缩。

即使 ft 变小(忘记旧信息),梯度路径也可以通过输入门 it 获得新的通路。

简洁表述:RNN 的误差信号在时间上必须连续穿越 Whh 矩阵(乘性),而 LSTM 的误差信号可以选择一条"高速公路"——通过 Ct 路径的加法捷径,几乎无损地传播到远处。

2.7 完整 LSTM 前向传播总结

将以上所有公式汇总:

ft=σ(Wf[ht1,xt]+bf)(遗忘门)it=σ(Wi[ht1,xt]+bi)(输入门)C~t=tanh(WC[ht1,xt]+bC)(候选细胞)Ct=ftCt1+itC~t(细胞状态更新)ot=σ(Wo[ht1,xt]+bo)(输出门)ht=ottanh(Ct)(隐藏状态输出)

输入维度:xtRd,隐藏状态:htRdh,细胞状态:CtRdh

参数数量:LSTM 有 4 组权重矩阵(Wf,Wi,WC,Wo)+ 4 组偏置,每组大小为 WRdh×(dh+d)bRdh

参数量=4×[dh×(dh+d)+dh]
🔍 完整演算:LSTM 门控计算 — 2 步标量 LSTM 手算与梯度对比

📐 公式

LSTM 前向传播的完整公式组:

ft=σ(Wf[ht1,xt]+bf)it=σ(Wi[ht1,xt]+bi)C~t=tanh(WC[ht1,xt]+bC)Ct=ftCt1+itC~tot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)

其中 σ(x)=1/(1+ex) 为 sigmoid 函数,输出值域 (0,1)


📖 参数含义

符号名称含义
ft遗忘门控制保留 Ct1 的比例,值域 (0,1)
it输入门控制写入新信息的比例,值域 (0,1)
C~t候选细胞状态可能写入细胞的新信息,值域 (1,1)
Ct细胞状态LSTM 的"记忆线",信息传递主干道
ot输出门控制从 Ct 输出到 ht 的比例,值域 (0,1)
ht隐藏状态LSTM 的输出(给上层和下一时间步)
Hadamard 积逐元素乘法

📝 公式来源

LSTM 的设计动机源于解决 RNN 梯度消失问题。核心思想是用加性的细胞状态更新 Ct=ftCt1+itC~t 替代 RNN 的乘性隐藏状态更新 ht=tanh(Whhht1+)

梯度从 CtCt1 的传递为 Ct/Ct1=diag(ft)+(其它项),主导项 diag(ft) 是逐元素缩放而非矩阵乘法——当 ft1 时,梯度几乎无损。


✏️ 手算演示

考虑一个标量 LSTM(d=dh=1),给定参数:

Wf=[0.1,0.9],bf=0.5(遗忘门偏向"记住")Wi=[0.3,0.7],bi=0.2(输入门偏向"筛选")WC=[0.2,0.8],bC=0.1(候选细胞)Wo=[0.4,0.6],bo=0.0(输出门)

初始状态:h0=0.0C0=0.0

输入序列:x1=1.0(重要信息),x2=0.0(中性输入)

Step 1: 时间步 t=1

f1=σ(0.1×0.0+0.9×1.0+0.5)=σ(1.400)=0.802i1=σ(0.3×0.0+0.7×1.00.2)=σ(0.500)=0.622C~1=tanh(0.2×0.0+0.8×1.0+0.1)=tanh(0.900)=0.716C1=0.802×0.0+0.622×0.716=0.445o1=σ(0.4×0.0+0.6×1.0+0.0)=σ(0.600)=0.646h1=0.646×tanh(0.445)=0.646×0.418=0.270

Step 2: 时间步 t=2

f2=σ(0.1×0.270+0.9×0.0+0.5)=σ(0.527)=0.629i2=σ(0.3×0.270+0.7×0.00.2)=σ(0.119)=0.470C~2=tanh(0.2×0.270+0.8×0.0+0.1)=tanh(0.154)=0.153C2=0.629×0.445+0.470×0.153=0.280+0.072=0.352o2=σ(0.4×0.270+0.6×0.0+0.0)=σ(0.108)=0.527h2=0.527×tanh(0.352)=0.527×0.338=0.178

关键观察:信息保留

C1=0.445 中有 62.9%f2=0.629)被保留到了 C2。即使 x2=0.0 不携带新信息,细胞状态仍保留了 C2=0.352C179%),远未被"清零"。

梯度对比:LSTM vs Vanilla RNN

考虑从时间步 2 到时间步 1 的梯度传播:

架构梯度传递因子10 步累积
LSTMC2/C1f20.6290.629100.010
Vanilla RNNh2/h1=(1h22)Whh0.4340.434100.0002

(Vanilla RNN 的 Whh 设为 0.5,与 LSTM 遗忘门处于相近量级)

LSTM 经过 10 步仍保留约 1% 的梯度信号,而 RNN 的梯度已几乎完全消失(0.02%)。这正是 LSTM 能学习长程依赖(如"France French"跨越 10+ 词)的根本原因。


🌍 实际意义

  • LSTM 解决了 NLP 中长距离依赖的核心难题:机器翻译中的性别一致、代词的远距离指代、情感分析中的转折词等。
  • ft 的可学习性使 LSTM 能根据上下文动态决定"记忆多久",这比固定衰减的 RNN 灵活得多。
  • 1997 年提出至今,LSTM 仍是时间序列预测、语音识别等领域的强力基线模型。

3. GRU (Gated Recurrent Unit)

GRU 由 Cho et al. 于 2014 年提出,是 LSTM 的简化变体。

3.1 GRU 的设计动机

LSTM 有三个门和一个独立的细胞状态。GRU 观察到:

  • 遗忘门和输入门常常是互补的(忘记旧信息 = 留出空间给新信息)
  • 细胞状态 Ct 和隐藏状态 ht 可以合并

于是 GRU 将门减少到两个,合并了细胞状态和隐藏状态。

3.2 GRU 公式推导

重置门 (Reset Gate) rt:控制忽略过去隐藏状态的程度。

rt=σ(Wr[ht1,xt]+br)

更新门 (Update Gate) zt:控制从过去的隐藏状态中保留多少信息,类似于 LSTM 中遗忘门和输入门的组合。

zt=σ(Wz[ht1,xt]+bz)

候选隐藏状态:使用重置门来"重置"旧状态。

h~t=tanh(Wh[rtht1,xt]+bh)

注意这里 rtht1 — 当 rt 接近 0 时,GRU 忽略过去的隐藏状态,就像从头开始。

最终隐藏状态:更新门 zt 在新旧之间做插值。

ht=(1zt)ht1+zth~t

直观理解:这是可学习的加权平均zt 接近 0 时保留更多旧信息(类似遗忘门 = 1),接近 1 时接受更多新信息(类似遗忘门 = 0,输入门 = 1)。

3.3 LSTM vs GRU

特性LSTMGRU
门数量3 (f, i, o)2 (r, z)
内部状态细胞状态 Ct + 隐藏状态 ht只有隐藏状态 ht
参数量4(dh(dh+d)+dh)3(dh(dh+d)+dh)
表达能力理论上更灵活(独立控制遗忘/写入/输出)更简洁,参数量少约 25%
实际表现长序列任务稍优许多任务上与 LSTM 持平
训练速度稍慢稍快

经验法则:如果数据量很大,LSTM 的额外参数可能带来精度提升;如果计算资源受限或追求快速迭代,GRU 是不错的选择。


4. 编码器-解码器架构 (Encoder-Decoder Architecture)

4.1 固定维度的上下文向量

编码器-解码器(Encoder-Decoder)架构由 Cho et al. 和 Sutskever et al. 在 2014 年独立提出。也称为 Seq2Seq (Sequence-to-Sequence)

基本结构

    编码器 (Encoder)             解码器 (Decoder)

    x_1 → [RNN]                  y_1 → [RNN] → y_1_pred
    x_2 → [RNN]                  y_2 → [RNN] → y_2_pred
    ...          ↘            ↗  ...
    x_T → [RNN] → [context] → [RNN] → y_T_pred

              固定维度向量
           (通常取 h_T 或某种聚合)

流程

  1. 编码:将输入序列 {x1,x2,...,xT} 依次送入 RNN 编码器,最终得到上下文向量 c
htenc=RNNenc(ht1enc,xt),c=hTenc
  1. 解码:基于上下文向量 c 和已生成的输出,逐个时间步生成目标序列 {y1,y2,...,yT}
htdec=RNNdec(ht1dec,[yt1,c])ytpred=softmax(Wyhtdec+by)

4.2 编码器-解码器的信息瓶颈

核心问题:无论输入序列多长,编码器必须将全部信息压缩到一个固定维度的向量 c 中。

这个 c 的维度 dh 通常远小于输入序列包含的信息量(比如 dh=256 却要编码包含几十个词的句子)。这造成了严重的信息瓶颈

  • 对于短句(如 "Hello world"),256 维向量可能够用
  • 对于长句(如 "The man who gave a speech about... yesterday finally..."),256 维向量几乎不可能保留所有细节
  • 解码器在每个时间步都看到同一个 c,没有机制去"关注"输入序列特定位置的信息

直觉类比:这就像你闭着眼睛听别人复述整篇论文的内容摘要,然后要求你逐字写出全文——摘要中丢失的细节无法被恢复。


5. 为什么需要 Attention?

5.1 从瓶颈到查阅

Attention 机制的核心思想非常直观:

在解码的每一步,不依赖单一的上下文向量,而是"查阅"编码器的所有隐藏状态,动态选择相关信息。

5.2 Attention 的直觉

让我们用类比来理解(不涉及 Attention 的具体计算——那将在 Vol 5 第 1 章展开):

无 Attention(RNN Encoder-Decoder):

你参观一座博物馆,在入口处被迫写下一段描述整座博物馆的文字,然后进入各个展厅时只能依靠这段文字来回忆展品。显然,你不可能在入口描述所有细节。

有 Attention:

在每一个展厅,你直接看向当前展品,并翻阅之前写下的笔记,找到与当前展品最相关的记录。你本质上是在有选择地查阅所有信息源。

核心列表对比:

特性RNN (无 Attention)Transformer (有 Attention)
信息传递通过固定向量 c 传递整个序列动态选择相关位置的信息
长程依赖困难(梯度消失)直连(任意两个位置步长 = 1)
并行化必须串行(后一步依赖前一步的 ht可以完全并行
瓶颈上下文向量维度固定无信息瓶颈

Attention 的完整公式将在《第 6 卷 Transformer》第 1 章中给出。 本章的 core 结论是:RNN 的循环结构(串行、乘性梯度路径、固定上下文向量)是其所有固有局限的根源,而 Attention 正是针对这些局限的直接回应。


6. 小结 (Summary)

  1. RNN 通过隐藏状态 ht=tanh(Whhht1+Wxhxt+bh) 实现序列建模,但 BPTT 的连乘梯度路径导致梯度消失/爆炸。

  2. LSTM 引入细胞状态 Ct 和三个门(遗忘、输入、输出),通过加法梯度路径使梯度能无损传播到远处,有效缓解了梯度消失。

  3. GRU 是 LSTM 的简化变体,将门减为 2 个(更新门、重置门),合并了细胞状态和隐藏状态,参数量减少约 25%。

  4. 编码器-解码器架构将变长序列压缩到固定维度的上下文向量,存在严重的信息瓶颈。

  5. RNN 的局限(串行计算、梯度消失、信息瓶颈)是通往 Attention 机制的直接动机——Attention 将在 Transformer 架构中彻底替代循环结构。


进一步阅读 (Further Reading):

  • Hochreiter & Schmidhuber (1997). "Long Short-Term Memory." Neural Computation. — LSTM 原始论文
  • Cho et al. (2014). "Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation." — GRU 与 Seq2Seq
  • Sutskever, Vinyals & Le (2014). "Sequence to Sequence Learning with Neural Networks." — Seq2Seq 经典
  • Bengio, Simard & Frasconi (1994). "Learning long-term dependencies with gradient descent is difficult." — 梯度消失的理论分析
  • Olah (2015). "Understanding LSTM Networks." — 可视化 LSTM 的优秀博文

参考文献 (References)

  1. Hochreiter, S. & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735–1780.
  2. Cho, K. et al. (2014). Learning phrase representations using RNN encoder-decoder. EMNLP.
  3. Sutskever, I., Vinyals, O. & Le, Q. V. (2014). Sequence to sequence learning with neural networks. NeurIPS.