1. 为什么需要RNN和LSTM?
在传统的神经网络结构中,每个输入都是独立处理的,这意味着网络无法记住之前看到的信息。这种架构在处理序列数据(如时间序列、自然语言等)时存在明显缺陷。举个例子,当你在阅读这句话时,理解"这句话"的含义依赖于对前面词语的记忆。
循环神经网络(RNN)的诞生就是为了解决这个问题。它的核心思想是引入"记忆"机制——网络不仅处理当前输入,还会考虑之前所有输入的信息。这种特性使得RNN特别适合处理以下场景:
- 自然语言处理(文本生成、机器翻译)
- 语音识别
- 时间序列预测(股票价格、天气数据)
- 视频分析
注意:虽然理论上RNN可以记住任意长度的序列,但实际训练中会遇到梯度消失或梯度爆炸问题,这使得它难以学习长期依赖关系。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RNN基础结构与工作原理
2.1 基本RNN单元解析
一个最简单的RNN单元可以用以下公式表示:
code复制h_t = tanh(W_{hh}h_{t-1} + W_{xh}x_t + b_h)
y_t = W_{hy}h_t + b_y
其中:
- h_t是当前时间步的隐藏状态
- x_t是当前输入
- y_t是当前输出
- W和b是可训练参数
用Python代码实现一个简单的RNN单元:
python复制import numpy as np
# 定义RNN参数
W_hh = np.random.randn(hidden_size, hidden_size) * 0.01
W_xh = np.random.randn(input_size, hidden_size) * 0.01
W_hy = np.random.randn(hidden_size, output_size) * 0.01
b_h = np.zeros((hidden_size, 1))
b_y = np.zeros((output_size, 1))
def rnn_step(x, h_prev):
h_next = np.tanh(np.dot(W_hh, h_prev) + np.dot(W_xh, x) + b_h)
y = np.dot(W_hy, h_next) + b_y
return h_next, y
2.2 RNN的展开计算图
理解RNN的关键是掌握其"展开"形式。假设我们有一个长度为3的序列,RNN的计算过程可以表示为:
code复制h1 = tanh(W_hh*h0 + W_xh*x1 + b_h)
y1 = W_hy*h1 + b_y
h2 = tanh(W_hh*h1 + W_xh*x2 + b_h)
y2 = W_hy*h2 + b_y
h3 = tanh(W_hh*h2 + W_xh*x3 + b_h)
y3 = W_hy*h3 + b_y
这种展开形式清晰地展示了信息是如何在时间步之间传递的。在实际应用中,我们通常使用深度学习框架提供的RNN层,它们已经优化了这种展开计算过程。
3. 从RNN到LSTM的进化
3.1 RNN的长期依赖问题
虽然R
