本文档解释了循环神经网络 (RNN) 的架构和基本原理,它们是深度学习中序列建模的基础。RNN 是一种专门设计的神经网络,通过维护捕获先前时间步信息的内部状态(隐藏状态)来处理序列数据。本页重点介绍核心 RNN 架构、其数学公式和基本实现细节。
有关实现细节,请参阅 从零开始实现 RNN 和 简洁的 RNN 实现。有关处理长期依赖和梯度问题,请参阅 随时间反向传播。
RNN 的关键创新是引入了捕获和维护序列信息的隐藏状态。与标准的馈送网络不同,RNN 在不同时间步共享参数,并使用循环连接将信息向前传递。
基本 RNN 在时间步之间信息流
来源:chapter_recurrent-neural-networks/rnn.md73-113 chapter_recurrent-neural-networks/rnn.md125-135
此图中的
RNN 的核心在于其在时间步之间行为的两个关键方程
隐藏状态更新:在每个时间步 t,隐藏状态计算如下:
$$\mathbf{h}t = \phi(\mathbf{x}t \mathbf{W}{xh} + \mathbf{h}{t-1} \mathbf{W}_{hh} + \mathbf{b}_h)$$
输出计算:时间步 t 的输出计算如下:
$$\mathbf{o}_t = \mathbf{h}t \mathbf{W}{hq} + \mathbf{b}_q$$
其中
来源:chapter_recurrent-neural-networks/rnn.md85-96 chapter_recurrent-neural-networks/rnn.md111-120
此图显示了单个时间步的 RNN 详细架构,突出了参数矩阵和计算
RNN 单个时间步的计算图
来源:chapter_recurrent-neural-networks/rnn.md117-134 chapter_recurrent-neural-networks/rnn-scratch.md251-285
在 D2L.ai 代码库中,RNN 的实现包含以下关键组件
RNN 实现类结构
来源:chapter_recurrent-neural-networks/rnn-scratch.md220-249 chapter_recurrent-neural-networks/rnn-scratch.md322-339 chapter_recurrent-neural-networks/rnn-concise.md162-182
RNN 中的参数及其初始化对于正常运行至关重要
| 参数 | 形状 | 描述 | 初始化 |
|---|---|---|---|
| W_xh | (input_size, hidden_size) | 输入到隐藏层的权重 | 标准差小的正态分布 |
| W_hh | (hidden_size, hidden_size) | 隐藏到隐藏层的权重 | 标准差小的正态分布 |
| b_h | (1, hidden_size) | 隐藏层偏置 | 零 |
| W_hq | (hidden_size, output_size) | 隐藏层到输出层的权重 | 标准差小的正态分布 |
| b_q | (1, output_size) | 输出层偏置 | 零 |
来源:chapter_recurrent-neural-networks/rnn-scratch.md130-153 chapter_recurrent-neural-networks/rnn-scratch.md157-175
RNN 中的前向计算遵循每个时间步的一系列特定操作
RNN 前向传播序列图
来源:chapter_recurrent-neural-networks/rnn-scratch.md259-285 chapter_recurrent-neural-networks/rnn.md85-96
对于 RNN 中的文本数据,输入通常使用独热编码进行处理
文本输入处理
来源:chapter_recurrent-neural-networks/rnn-scratch.md60-75 chapter_recurrent-neural-networks/rnn-scratch.md95-104
当使用 RNN 进行预测(例如文本生成)时,网络在每个时间步的输出会成为未来时间步的输入的一部分
RNN 文本生成过程
来源:chapter_recurrent-neural-networks/rnn-scratch.md445-469 chapter_recurrent-neural-networks/rnn-scratch.md474-486
RNN 可以通过两种方式实现
从零开始实现(RNNModelScratch)会显式初始化和管理所有参数,并手动实现前向计算。
高级 API 实现(RNNModel)利用了深度学习框架内置的 RNN 层,只需处理输入处理和输出层。
高级实现更简洁高效,但对内部工作原理的可见性较低。
来源:chapter_recurrent-neural-networks/rnn-scratch.md322-339 chapter_recurrent-neural-networks/rnn-concise.md162-182
训练 RNN 的一个关键挑战是梯度爆炸或消失的可能性
RNN 中的梯度流和裁剪
来源: chapter_recurrent-neural-networks/rnn-scratch.md537-582 chapter_recurrent-neural-networks/bptt.md259-273
循环神经网络(RNN)在语言模型任务中通常使用困惑度(perplexity)来评估,它衡量模型预测样本的准确程度。
$$\text{Perplexity} = \exp\left(-\frac{1}{n} \sum_{t=1}^n \log P(x_t \mid x_{t-1}, \ldots, x_1)\right)$$
困惑度越低,模型的性能越好。
来源: chapter_recurrent-neural-networks/rnn.md234-297 chapter_recurrent-neural-networks/rnn-scratch.md655-668
循环神经网络是用于序列数据处理的基本架构,它们
虽然基础RNN功能强大,但在捕捉长期依赖方面存在局限性,这促使了像LSTM和GRU这样更高级架构的发展。
来源: chapter_recurrent-neural-networks/rnn.md302-308 chapter_recurrent-neural-networks/rnn-scratch.md970-977