循环神经网络(Recurrent Neural Network, RNN)是一类在序列数据分析中常用的人工神经网络。与传统的前馈神经网络不同,RNN具有记忆功能,可以处理输入数据的序列关系。RNN的核心思想是引入循环结构,使得网络在处理每个序列元素时都能考虑前面的信息。这使得RNN在自然语言处理、语音识别、时间序列预测等任务中表现出色。
然而,传统的RNN也存在一些问题,例如难以处理长序列、梯度消失和梯度爆炸等。为了解决这些问题,出现了一些改进的循环神经网络结构,如长短时记忆网络(LSTM)和门控循环单元(GRU)。这些结构在一定程度上缓解了RNN的限制,使得网络能够更好地捕捉长序列的信息和建模序列之间的依赖关系。
我们先回顾一下有隐含层的多层感知机。设隐含层的激活函数为 f 。给定一个小批量样本 X ∈ ℝ n×d ,其中批量大小为 n ,输入维度为 d ,则隐含层的输出 H ∈ ℝ n× h 通过式(2.6)计算:
其中, W xh ∈ ℝ d×h 是隐含层权重参数, b h ∈ ℝ 1×h 是偏置参数, h 是隐藏单元的数目。将隐藏变量 H 用作输出层的输入。输出层由式(2.7)给出:
其中, m 是输出个数, O ∈ ℝ n×m 是输出变量, W hm ∈ ℝ h×m 是权重参数, b m ∈ ℝ 1×m 是输出层的偏置参数。如果是分类问题,我们可以用sigmoid或softmax函数来计算输出类别的概率分布。以上运算过程可用图2-34表示。
图2-34 多层感知机的运算过程
其中,*表示内积,[ n , d ]表示形状大小。
有隐含状态的循环神经网络的结构如图2-35所示。
图2-35 有隐含状态的循环神经网络的结构
每个时间步的详细处理逻辑如图2-36所示。
图2-36 循环神经网络每个时间步的详细处理逻辑
假设矩阵 X 、 W x h 、 H 和 W hh 的大小分别为(2,3)、(3,4)、(2,4)和(4,4)。我们将 X 乘以 W x h ,将 H 乘以 W hh ,然后将这两个乘法的结果相加,最后利用广播机制加上偏移量 b h (1,4),得到一个大小为(2,4)的 H t 矩阵。
假设矩阵 W hm 和 b m 的大小分别为(4,2)、(1,2),可得大小为(2,2)的 O t 矩阵。具体实现过程如下:
运行结果如下:
当然,也可以先对矩阵进行拼接,再进行运算,结果是一样的。
沿列(axis=1)拼接矩阵 X 和 H ,得到形状为(2,7)的矩阵[ X , H ],沿行(axis=0)拼接矩阵 W xh 和 W hh ,得到形状为(7,4)的矩阵 。再将这两个拼接的矩阵相乘,最后与 b h 相加,我们得到与上面形状相同的(2,4)的输出矩阵。
运行结果如下:
前面我们介绍了语言模型,如果使用 N 元语法实现,会非常麻烦,效率也不高。语言模型的输入一般为序列数据,而处理序列数据是循环神经网络的强项之一。那么,如何使用循环神经网络构建语言模型呢?
为简化起见,假设文本序列“知识就是力量”分词后为[“知”,“识”,“就”,“是”,“力”,“量”],把这个列表作为输入,时间步长为6,使用循环神经网络就可构建一个语言模型,如图2-37所示。
其中,每个时间步输出的激活函数为softmax,利用交叉熵损失计算模型输出(预测值)和标签之间的误差。
图2-37 使用循环网络构建语言模型示意图
循环神经网络也与卷积神经网络一样,可以横向拓展(增加时间步或序列长度),也可以纵向拓展成多层循环神经网络,如图2-38所示。
图2-38 多层循环神经网络结构
1.LSTM
目前最流行的一种解决RNN的短时记忆问题的方案称为长短时记忆网络(Long Short-Term Memory, LSTM)。LSTM最早由Hochreiter和Schmidhuber(1997)提出,它能够有效解决信息的长期依赖,避免梯度消失或爆炸。事实上,LSTM就是专门为解决长期依赖问题而设计的。与传统RNN相比,LSTM在结构上的独特之处是它精巧地设计了循环体结构。LSTM用两个门来控制单元状态 c 的内容:一个是遗忘门,它决定了上一时刻的单元状态 c t -1 有多少保留到当前时刻 c t ;另一个是输入门,它决定了当前时刻网络的输入 x t 有多少保存到单元状态 c t 。LSTM用输出门来控制单元状态 c t 有多少输出到LSTM的当前输出值 h t 。LSTM的循环体结构如图2-39所示。
图2-39 LSTM架构图
2.GRU
LSTM有效地克服了传统RNN的一些不足,较好地解决了梯度消失、长期依赖等问题。不过,LSTM也有一些不足,如结构比较复杂、计算复杂度较高。后来,人们在LSTM的基础上又推出其他变种,如目前非常流行的GRU(Gated Recurrent Unit,门控循环单元)。
图2-40为GRU架构图,图中小圆圈表示向量的点积。GRU对LSTM做了很多简化,因此,计算效率更高,占用内存也相对较少,在实际使用中,二者差异不大。GRU在LSTM的基础上做了两个大改动。
1)将输入门、遗忘门、输出门变为两个门:更新门(Update Gate) z t 和重置门(Reset Gate) r t 。
2)将单元状态与输出合并为一个状态: h t 。
图2-40 GRU架构