一、这一课要解决什么问题?
神经网络如何处理有顺序的数据,并利用前面已经出现的信息?比如说我 喜欢 学习 人工智能,或者一个句子,它都有一个特点,它们是有顺序的。我们今天就需要尝试解决这个问题。
二、为什么需要 RNN?
因为普通的前馈神经网络会把每次输入当成相互独立的数据,无法自然地保存"之前发生了什么";而文本、语音、时间序列等数据具有前后依赖关系,因此我们需要 RNN,通过 Hidden State 把过去的信息传递到当前时刻。简单来说RNN = 给神经网络增加"历史状态"
三、什么叫"序列数据"?
序列数据就是数据的顺序具有意义,改变顺序后,数据表达的含义可能发生变化。比如说I like vscode 变成 vscode like I。显然是不行的。数据+顺序=信息
常见的序列数据
文本
语音
音乐
股票价格
传感器数据
用户行为
时间序列
四、普通神经网络为什么不能很好地处理序列?
因为普通前馈神经网络的每次输入之间没有状态传递机制。处理完一个输入后,它不会自动把这个输入的信息传递给下一次输入。
五、RNN 怎么解决?
RNN 会维护一个 Hidden State,并把上一时刻的 Hidden State 传递给下一时刻。
RNN:
x₁ → RNN → h₁
↓(普通的没有)
x₂ → RNN → h₂
↓(普通的没有)
x₃ → RNN → h₃
什么是 Hidden State?
Hidden State 是 RNN 在当前时刻保存的内部状态,它携带了一部分过去输入的信息,并会参与下一时刻的计算
RNN 最核心的公式

- xt 当前时刻的输入
- ht−1 之前记住的信息(上一时刻的 Hidden State)
- Wx 当前输入应该产生多大的影响(权重)
- Wh 过去的信息应该产生多大的影响(Hidden State 对应的权重)
- b 和普通神经网络里的 Bias 一样 (偏置)
- tanh 对计算结果进行非线性变换,并把结果压缩到 −1,1(激活函数)
新的记忆 = 当前输入的信息 + 过去记忆的信息,然后经过非线性变换。
十三、为什么说 RNN "有记忆"?
因为上一时刻的 Hidden State 会作为下一时刻的输入之一,因此之前的信息可以通过 Hidden State 继续参与后续计算。
虽然说它是有记忆的,但是它能够记住无限长的历史吗?答案是不行的,普通 RNN 在处理很长的序列时容易出现梯度消失和梯度爆炸,因此很难学习长期依赖。
Long-Term Dependency就是两个信息相差很远的意思
七、RNN 的整个训练过程
从根源来说RNN到底还是
Forward
↓
Loss
↓
Backward
↓
Gradient
↓
Optimizer
↓
参数更新
eg:
x₁ → RNN → h₁
↓
x₂ → RNN → h₂
↓
x₃ → RNN → h₃
↓
x₄ → RNN → h₄
↓
Output
↓
Loss
↓
h₄
↓
h₃
↓
h₂
↓
h₁
这个叫做Backpropagation Through Time,所有时间步共享同一套参数,看起来不同的RNN,实际上只是同一个 RNN 在不同时间点重复使用。
CNN 和 RNN的区别
RNN 优点:
- 能够处理序列
- 能够利用历史信息
- 参数共享
缺点: - 长期依赖困难
- 无法很好记住很久以前的信息
- 计算难以完全并行,存在顺序依赖(这也是后来 Transformer 能够大幅改变 NLP 的重要原因之一)
| CNN | RNN | |
|---|---|---|
| 主要处理 | 空间数据 | 序列数据 |
| 典型数据 | 图片 | 文本、时间序列 |
| 关注关系 | 空间局部关系 | 时间/顺序关系 |
| 核心机制 | 卷积 | Hidden State |
| 参数共享 | 空间位置共享 | 时间步共享 |
CNN 核心流程
