循环神经网络(Recurrent Neural Network,RNN) 是一种专门处理序列数据(如文本、语音、时间序列)的神经网络。
与传统的前馈神经网络不同,RNN 具有"记忆"能力,能够保存之前步骤的信息。
循环神经网络能够利用前一步的隐藏状态(Hidden State)来影响当前步骤的输出,从而捕捉序列中的时序依赖关系。
RNN 的核心思想
RNN 的核心在于 循环连接 (Recurrent Connection),即网络的输出不仅取决于当前输入,还取决于之前所有时间步的输入。这种结构使 RNN 能够处理任意长度的序列数据。
传统神经网络 :输入和输出是独立的(例如图像分类,单张图片之间无关联)。
RNN :通过 循环连接 (Recurrent Connection)将上一步的隐藏状态传递到下一步,形成"记忆"。
每一步的输入 = 当前数据 + 上一步的隐藏状态。
输出不仅依赖当前输入,还依赖之前所有步骤的上下文。
就像人阅读句子时,理解当前单词会依赖前面读过的内容(例如"他打开了__",你会预测"门"或"书")。
实例
RNN 的工作机制
RNN 在每个时间步 t 执行以下计算:
其中 f 和 g 通常是激活函数(如 tanh 或 softmax)。
RNN 的优缺点
优点 :
缺点 :
长短期记忆网络(LSTM)
LSTM(Long Short-Term Memory)是 RNN 的一种改进架构,专门设计来解决标准 RNN 的长期依赖问题。
2.1 LSTM 的核心结构
LSTM 引入了三个门控机制和一个记忆单元:
LSTM 如何解决长期依赖问题
门控循环单元(GRU)
GRU(Gated Recurrent Unit)是 LSTM 的简化版本,在保持相似性能的同时减少了参数数量。
GRU 的核心结构
GRU 合并了 LSTM 的某些组件:
GRU vs LSTM
双向 RNN(Bi-RNN)
双向 RNN 通过同时考虑过去和未来的上下文信息,增强了序列建模能力。
双向 RNN 架构
Bi-RNN 包含两个独立的 RNN 层:
最终输出是这两个方向输出的组合(通常为拼接或求和)。
双向 RNN 的应用场景
双向 LSTM/GRU
现代应用中,双向 RNN 通常使用 LSTM 或 GRU 作为基础单元:
实践练习
练习 1:实现简单 RNN
使用 Python 和 NumPy 实现一个能够处理字符级文本生成的简单 RNN。
练习 2:LSTM 情感分析
使用 Keras 构建一个基于 LSTM 的电影评论情感分类器。
练习 3:双向 GRU 命名实体识别
实现一个双向 GRU 模型,用于识别文本中的人名、地名等实体。
练习 4:比较实验
在同一数据集上比较 Vanilla RNN、LSTM 和 GRU 的性能差异。
总结与进阶学习
RNN 及其变体是处理序列数据的强大工具。要深入掌握: