前言
循环神经网络(Recurrent Neural Network,RNN)是用于处理序列化数据的神经网络。常用的序列化数据有股票市场价格、音频和视频数据、DNA 序列、传感器数据、自然语言文本等。在循环神经网络中,数据的输出结果与数据的序列关系有关。具体的表现形式为网络会对前面的信息进行记忆,并应用于当前输出结果。例如,预测句子中的下一个单词是什么时,由于句子中前后单词并不是相互独立的,所以需要用到前面的多个序列单词。本文主要讲解 RNN 结构及实现、双向 RNN 结构及实现、长短时记忆(Long Short-Term Memory,LTSM)结构及实现、门控循环单元(Gated Recurrent Unit,GRU)结构及实现。
RNN 结构及实现
循环神经网络结构如图-1 所示。
循环神经网络结构主要有一对多关系、多对一关系、多对多关系,如图 2 所示。One to many 结构用于图像生成文字场景,根据输入图像内容输出该图像的文字描述。Many to one 结构用来处理序列数据的分类问题,例如,输入一个句子判断其情感倾向。Many to many 结构用来处理输入序列数据中每个数据的分类,例如中文分词,中文实体识别等场景。如果 many to many 结构中不限制输入序列和输出序列的长度,通常用来处理机器翻译、文本摘要生成、阅读理解、语音识别等场景。
在 TensorFlow 中,循环神经网络单元可用 BasicRNNCell 定义实现,如下所示。其中,hidden_units 为隐藏神经元的数量。
TensorFlow 中循环神经网络的实现有两类,一类是静态 RNN(Static RNN),另一类是动态 RNN(Dynamic RNN)。Static RNN 是按照时间序列长度展开后的图,序列长度需要和图的拓扑结构保持一致。这样,每个 batch data 中的序列长度是一致,为最大的序列长度。Dynamic RNN 主要思想为通过循环语句,动态生成网络的拓扑结构。这样,不同 batch data 中序列的最大长度可以是不一样的,但同一个 batch data 内部的序列长度仍然是一样的。在动态 RNN 结构中,不需要让所有 batch data 的序列长度都填充到序列的最大长度,减少了训练数据的存储空间。Dynamic RNN 的 TensorFlow 模型程序用例,如下所示。
双向 RNN 结构及实现
双向 RNN(Bi-directional RNN,BRNN)用于解决序列数据中,序列的输出结果不仅与前面的序列数据有关,还于后面的序列数据有关。例如,根据上下文信息预测一个句子中间缺失的单词是什么;根据上下文信息预测一个句子中每个单词的类别。双向 RNN 结构将两个 RNN 上下叠加在一起,如图 3 所示。
LSTM 结构及实现
在反向传播算法中,BasicRNNCell 神经元的梯度会呈指数倍数的衰减,梯度倾向于消失。这样,BasicRNNCell 很难处理数据长期依赖的问题,很难处理长度超过 10 的序列数据。为了解决梯度消失问题,提出了长短期记忆(Long Short Term Memory,LSTM)单元,通过门的开关实现序列数据上的记忆功能。当误差从输出层反向传播回来时,使用 LSTM 单元记忆下来,LSTM 可以记住较长时间内的序列信息。LSTM 模块架构,如图 4 所示。
LSTM 通过门的结构选择性地让神经元中的信息通过,实现数据信息的记忆或遗忘功能。门结构由 sigmoid 激活函数实现。sigmoid 激活函数的输出值为[0, 1]间的数字,表示神经元可以通过多少数据信息。sigmoid 输出值为 0 时,表示门完全关闭,神经元数据信息全部不能通过。sigmoid 输出值为 1 时,表示门全部开启,神经元所有信息都可以通过。LSTM RNN 的 TensorFlow 程序用例如下所示。
GRU 结构及实现
门控循环单元(Gated Recurrent Unit,GRU)同样用于解决循环神经网络中梯度消失问题,属于 LSTM 的一种变体结构。LSTM 有三个门控制结构(输入门、遗忘门和输出门),结构比较复杂。GRU 结构中只有两个门,分为更新门 z_t 和重置门 r_t,直接将单元的隐藏状态传递给下个单元,比 LSTM 模型更加简单、参数更少及更容易收敛。重置门主要用于处理序列数据中短期的记忆关系。更新门主要用于处理序列数据中长期的记忆关系。GRU 门控循环单元结构,如图 5 所示。
总结
本文主要讲解处理序列数据的循环神经网络模型,包含 RNN 架构及实现、双向 RNN 架构及实现、LSTM 架构及实现、GRU 架构及实现。RNN 的网络结构主要有多对多关系、多对一关系和一对多关系。RNN 单元用 BasicRNNCell 定义,RNN 可用静态 RNN 接口和动态 RNN 接口实现。双向 RNN 结构将两个 RNN 上下叠加在一起,主要用于解决序列数据中,序列的输出结果与上下文环境信息有关。
LSTM 单元主要用于解决循环神经网络中梯度消失的问题,通过门的开关实现长序列数据上的记忆功能,主要包含输入门、遗忘门和输出门。GRU 属于 LSTM 的一种变体结构,可直接将单元的隐藏状态传递给下个单元,比 LSTM 模型更加简单、更容易收敛。
作者简介:武维(微信:allawnweiwu),博士,现为 IBM 架构师。主要从事深度学习模型、平台的研发工作。
另外本文作者曾在 InfoQ 平台上发表了一系列的 TensorFlow 文章,我们将这些文章集结成书,具体可以翻阅:《深度学习利器:TensorFlow程序设计》。
评论