Skip to content

RNN 循环神经网络

普通神经网络的问题

普通神经网络处理序列数据时,每个词独立处理,没有记忆,没有上下文:

输入                神经网络              输出
"我"   ──────────▶ [ 黑盒 ] ──────────▶ ?
"爱"   ──────────▶ [ 黑盒 ] ──────────▶ ?
"吃"   ──────────▶ [ 黑盒 ] ──────────▶ ?
"饭"   ──────────▶ [ 黑盒 ] ──────────▶ ?

网络不知道"吃"前面是"爱"

RNN 的解法:加一个"记忆"

           ┌─────────────────────────────────┐
           │          隐藏状态 h(记忆)        │
           └──┬──────────┬──────────┬────────┘
              │          │          │
              ▼          ▼          ▼
时间步:       t=1        t=2        t=3
输入:        "我"       "爱"       "吃"
              │          │          │
              ▼          ▼          ▼
           ┌─────┐    ┌─────┐    ┌─────┐
           │ RNN │───▶│ RNN │───▶│ RNN │───▶ 输出
           └─────┘    └─────┘    └─────┘
              h1  ──▶    h2  ──▶    h3

h1 = f("我")
h2 = f("爱" + h1)        ← h2 记住了"我爱"
h3 = f("吃" + h2)        ← h3 记住了"我爱吃"

每一步的输出,都会作为下一步的输入之一,状态在时间上流动

同一个 RNN 单元在时间轴上反复使用(权重共享),不是三个不同的网络。

RNN 的问题:梯度消失

"我昨天在北京的一家很有名的餐厅里 .... 吃了 [?]"

到"吃了"这里,早期的"餐厅"信息经过太多步骤后逐渐稀释消失。
这就是梯度消失问题。

RNN 家族

RNN
 ├── LSTM(Long Short-Term Memory)
 │     加了"遗忘门"和"记忆门",能选择性记住/忘记
 │     解决了长距离依赖问题

 └── GRU(Gated Recurrent Unit)
       LSTM 的简化版,更轻量

现在还用吗?

2017 年前 RNN/LSTM 是 NLP 主流。Transformer 出现后,因为能一次看全部词、彻底解决长距离依赖,逐渐取代了 RNN。

现在的 GPT、Claude 都是 Transformer,不是 RNN。但理解 RNN 是理解 Transformer 注意力机制的基础。

Built with VitePress