循环神经网络与序列数据处理实战
传统前馈神经网络在处理序列数据时存在局限,无法捕捉上下文关联。循环神经网络(RNN)通过引入隐藏状态存储历史信息,有效解决了这一问题。本文将深入探讨 RNN 原理、经典变体 LSTM 及 GRU,并通过 TensorFlow/Keras 完成基于 IMDB 数据集的文本分类实战。
为什么需要 RNN
自然语言、语音和时间序列等数据具有强烈的时序依赖。当前时刻的信息往往与之前时刻紧密相关。RNN 的核心在于其循环结构,每个时间步不仅接收当前输入,还结合上一时刻的隐藏状态进行计算。
RNN 的计算机制
RNN 在每一个时间步 $t$ 执行以下操作:
- 初始化隐藏状态 $h_0$,通常设为全零向量。
- 计算当前隐藏状态:$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)
长短期记忆网络(LSTM)
为了解决梯度问题,LSTM 引入了门控机制,包括遗忘门、输入门和输出门,配合细胞状态实现信息的选择性记忆。
LSTM 的门控机制
- 遗忘门:决定丢弃哪些旧信息,输出 0~1 之间的值。
- 输入门:筛选新信息并更新细胞状态。
- 输出门:控制当前细胞状态中哪些信息作为隐藏状态输出。
from tensorflow.keras.layers import LSTM
# 定义 LSTM 层
lstm_layer = LSTM(units=128, return_sequences=False, return_state=True, input_shape=(10, ))
output, final_hidden_state, final_cell_state = lstm_layer(input_seq)
(, output.shape)


