第7.1节 RNN模型
各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。
本期推送内容目录如下,如果本期内容对你有所帮助,欢迎点赞、转发支持掌柜!
7.1 RNN模型 7.1.1 RNN动机 7.1.2 RNN原理 7.1.3 RNN计算示例 7.1.4 RNN类型 7.1.5 多层RNN 7.1.6 RNN示例代码 7.1.7 BPTT原理 7.1.8 小结 引用
7 循环神经网络
经过第3章和第4章内容的介绍,我们知道深度学习的本质可以总结为通过设计合理的网络结构来对输入进行特征提取,然后再利用提取得到的抽象特征完成后续下游任务。同时,在介绍卷积操作时笔者说到,卷积的核心思想是通过共享权重来实现对在相邻空间位置上具有依赖关系的数据进行特征提取,但现实情况中还存在一类在时间维度上具有前后依赖关系的数据,我们称这样的数据为时间序列(Time Serial )数据,也叫做时序数据,如音频信号、文本序列等。因此,在本章内容中笔者将介绍一种全新的网络结构——循环神经网络(Recurrent Neural Network, RNN)及其各类变体——来专门对时序数据进行特征提取。
7.1 RNN模型
在正式介绍循环神经网络之前,我们先简单看一下RNN模型背后的思想和动机,然后再介绍它的相关原理和使用场景。
7.1.1 RNN动机
尽管在图像处理中卷积神经网络有着广泛的应用,但是它却不适用于对时序类的数据进行特征提取,其原因在于对于时序数据来说当前时刻的状态信息往往会依赖于之前多个时刻的输出结果。例如在语言模型中,一个单词的含义往往会依赖于它前面出现的多个单词。因此我们便需要一种具备“记忆”功能的网络模型来对这类数据进行特征提取。基于这样的想法,1988年Paul J. Werbos等人首次提出了具有短期记忆能力网络模型循环神经网络,并同时提出了通过反向传播算法来求解模型的方法[1]。
7.1.2 RNN原理
循环神经网络是深度学习中一种典型的反馈神经网络,和前馈神经网络相比较反馈神经网络之所以具有一定的记忆功能,因为反馈神经网络在不同时刻的状态是根据历史所有时刻的信息及当前时刻的输入计算而来。在 RNN 中,神经元不仅可以接受到其他神经元的输出信息,也可以接受自己的输出信息从而形成一个具有环路的网络拓扑结构,因此RNN也成为了处理序列数据的重要工具之一。
图 7-1. RNN模型示意图
如图7-1(a)所示就是一种最基本的RNN网络结构,可以明显地看到其具有循环结构,而也恰好是这一“闭环”使得 RNN 具有了记忆功能,因为它将历史信息带入到了当前时刻的计算过程中。同时,图7-1(b)为RNN模型在时间维度展开的示意图,每一个时刻称之为一个记忆单元(Cell),其中和分别表示第个时刻模型的输入和输出,每个时刻在计算时共享同一组模型参数。此时可以看出,第时刻的输出不仅依赖于第时刻的输入同时也依赖于第时刻的输出结果,而这也揭示了循环神经网络天然地适合用于处理具有时序关系的数据。同时由图7-1可知,对于RNN模型来说其输入应该有3个维度,即批大小、时间步长和输入维度。
进一步,RNN模型的内部详细情况如图7-2所示。
图 7-2. RNN模型细节图
根据图7-2所示,RNN在沿时间维度展开时会先将上一时刻的输出和当先时刻输入分别进行一次线性变换并相加到一起,然后再经过一次非线性变换得到当前时刻的输出结果,具体计算过程如式(7.1)所示
其中的形状为[batch_size,input_size]
,的形状为[batch_size,hidden_size]
;分别为模型的3个权重参数,形状分别为 [input_size,hidden_size]
、[hidden_size,hidden_size]
和[hidden_size]
。同时,式(7.1)中的激活函数可以是Tanh或ReLU等,并且这里需要再次提醒的是这3个参数在每个时刻中共享。对于第1个时刻来说,通常其上一个时刻的输出将会被初始化为全0状态。
7.1.3 RNN计算示例
在清楚了RNN模型的相关原理后,我们来通过一个实际的示例来体会RNN的计算过程。假定现在某个序列样本一共有3个时刻,每个时刻为一个4维向量,即
同时设隐含状态的向量维度为2,初始状态,权重参数和分别为
根据式(7.1)~式(7.3)可得
进一步
同理可得。
到此便完成了3个时刻的迭代计算过程。上述完整计算示例代码可参见Code/Chapter07/C01_RNN/main.py文件。
为你认可的知识付费,欢迎订阅本专栏阅读更多优质内容!