循环神经网络(RNN)与序列数据处理实战
1.1 本章学习目标与重点
学习目标:掌握循环神经网络的核心原理、经典变体结构,以及在文本序列任务中的实战开发流程。
学习重点:理解 RNN 的循环计算机制,学会使用 TensorFlow/Keras 搭建基础 RNN 与 LSTM 模型,完成文本分类任务。
1.2 循环神经网络核心原理
1.2.1 为什么需要 RNN
传统的前馈神经网络(如 CNN、全连接网络)的输入和输出往往是相互独立的,它们难以处理序列数据中隐含的上下文关联。而自然语言、语音信号或时间序列等现实数据,其核心特征在于当前时刻的信息与之前时刻紧密相关。
循环神经网络通过引入隐藏状态来存储历史信息,从而有效捕捉序列数据的上下文依赖关系。
1.2.2 RNN 的循环计算机制
RNN 的核心是一个带有自连接的神经元结构——循环核。它在每个时间步接收输入数据和上一时刻的隐藏状态,计算当前输出和新隐藏状态。
计算过程主要包含三个步骤:
- 初始化隐藏状态 $h_0$,通常设为全零向量。
- 对每个时间步 $t$,计算当前隐藏状态:$h_t = \tanh(W_{xh}x_t + W_{hh}h_{t-1} + b_h)$。
- 根据隐藏状态计算当前时间步输出:$y_t = W_{hy}h_t + b_y$。
⚠️ 注意:基础 RNN 存在梯度消失或梯度爆炸问题,难以捕捉长序列依赖,因此实际应用中更多使用其变体模型。
import tensorflow as tf
from tensorflow.keras.layers import SimpleRNN
# 定义基础 RNN 层
# units: 隐藏状态维度,return_sequences: 是否返回所有时间步输出
rnn_layer = SimpleRNN(units=64, return_sequences=True, input_shape=(10, 20))
# 模拟输入:批次大小 32,序列长度 10,每个时间步特征维度 20
input_seq = tf.random.normal(shape=(32, 10, 20))
# 执行 RNN 计算
output_seq = rnn_layer(input_seq)
print("RNN 输出形状:", output_seq.shape) # 输出形状 (32, 10, 64)


