循环神经网络

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环神经网络相关的知识,希望对你有一定的参考价值。

参考技术A

花书中关于RNN的内容记录于 https://www.jianshu.com/p/206090600f13 。

在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。在生物神经网络中,神经元之间的连接关系要复杂的多。 前馈神经网络可以看作是一个复杂的函数,每次输入都是独立的,即网络的输出只依赖于当前的输入。但是在很多现实任务中,网络的输入不仅和当前时刻的输入相关,也和其过去一段时间的输出相关 。因此,前馈网络难以处理时序数据,比如视频、语音、文本等。时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变。因此,当处理这一类和时序相关的问题时,就需要一种能力更强的模型。

循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。 和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成等任务上。循环神经网络的参数学习可以通过 随时间反向传播算法 来学习。

为了处理这些时序数据并利用其历史信息,我们需要让网络具有短期记忆能力。而前馈网络是一个静态网络,不具备这种记忆能力。

一种简单的利用历史信息的方法是建立一个额外的延时单元,用来存储网络的历史信息(可以包括输入、输出、隐状态等)。比较有代表性的模型是延时神经网络。

延时神经网络是在前馈网络中的非输出层都添加一个延时器,记录最近几次神经元的输出。在第 个时刻,第 层神经元和第 层神经元的最近 次输出相关,即:

延时神经网络在时间维度上共享权值,以降低参数数量。因此对于序列输入来讲,延时神经网络就相当于卷积神经网络

自回归模型(Autoregressive Model,AR) 是统计学上常用的一类时间序列模型,用一个变量 的历史信息来预测自己:

其中 为超参数, 为参数, 为第 个时刻的噪声,方差 和时间无关。

有外部输入的非线性自回归模型(Nonlinear Autoregressive with ExogenousInputs Model,NARX) 是自回归模型的扩展,在每个时刻 都有一个外部输入 ,产生一个输出 。NARX通过一个延时器记录最近几次的外部输入和输出,第 个时刻的输出 为:

其中 表示非线性函数,可以是一个前馈网络, 和 为超参数。

循环神经网络通过使用带自反馈的神经元,能够处理任意长度的时序数据。

给定一个输入序列 ,循环神经网络通过下面
公式更新带反馈边的隐藏层的活性值 :

其中 , 为一个非线性函数,也可以是一个前馈网络。

从数学上讲,上式可以看成一个动力系统。动力系统(Dynamical System)是一个数学上的概念,指 系统状态按照一定的规律随时间变化的系统 。具体地讲,动力系统是使用一个函数来描述一个给定空间(如某个物理系统的状态空间)中所有点随时间的变化情况。因此, 隐藏层的活性值 在很多文献上也称为状态(State)或隐状态(Hidden States) 。理论上,循环神经网络可以近似任意的非线性动力系统。

简单循环网络(Simple Recurrent Network,SRN)是一个非常简单的循环神经网络,只有一个隐藏层的神经网络。

在一个两层的前馈神经网络中,连接存在相邻的层与层之间,隐藏层的节点之间是无连接的。而 简单循环网络增加了从隐藏层到隐藏层的反馈连接

假设在时刻 时,网络的输入为 ,隐藏层状态(即隐藏层神经元活性值) 不仅和当前时刻的输入 相关,也和上一个时刻的隐藏层状态 相关:

其中 为隐藏层的净输入, 是非线性激活函数,通常为Logistic函数或Tanh函数, 为状态-状态权重矩阵, 为状态-输入权重矩阵, 为偏置。上面两式也经常直接写为:

如果我们把每个时刻的状态都看作是前馈神经网络的一层的话,循环神经网络可以看作是在时间维度上权值共享的神经网络 。下图给出了按时间展开的循环神经网络。

由于循环神经网络具有短期记忆能力,相当于存储装置,因此其计算能力十分强大。 前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序。

定义一个完全连接的循环神经网络,其输入为 ,输出为 :

其中 为隐状态, 为非线性激活函数, 和 为网络参数。

这样一个完全连接的循环神经网络可以近似解决所有的可计算问题

循环神经网络可以应用到很多不同类型的机器学习任务。根据这些任务的特点可以分为以下几种模式: 序列到类别模式、同步的序列到序列模式、异步的序列到序列模式

序列到类别模式主要用于序列数据的分类问题:输入为序列,输出为类别。比如在文本分类中,输入数据为单词的序列,输出为该文本的类别。

假设一个样本 为一个长度为 的序列,输出为一个类别 。我们可以将样本 按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态 。我们可以将 看作整个序列的最终表示(或特征),并输入给分类器 进行分类:

其中 可以是简单的线性分类器(比如Logistic 回归)或复杂的分类器(比如多层前馈神经网络)

除了将最后时刻的状态作为序列表示之外,我们还可以对整个序列的所有状态进行平均,并用这个平均状态来作为整个序列的表示:

同步的序列到序列模式 主要用于序列标注(Sequence Labeling)任务,即每一时刻都有输入和输出,输入序列和输出序列的长度相同 。比如词性标注(Partof-Speech Tagging)中,每一个单词都需要标注其对应的词性标签。

输入为序列 ,输出为序列 。样本 按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态 。每个时刻的隐状态 代表当前和历史的信息,并输入给分类器 得到当前时刻的标签 。

异步的序列到序列模式也称为 编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要有严格的对应关系,也不需要保持相同的长度。 比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列。

在异步的序列到序列模式中,输入为长度为 的序列 ,输出为长度为 的序列 。经常通过 先编码后解码 的方式来实现。先将样本 按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码 。然后再使用另一个循环神经网络(解码器)中,得到输出序列 。为了建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型。

其中 分别为用作编码器和解码器的循环神经网络, 为分类器, 为预测输出 的向量表示。

循环神经网络的参数可以通过梯度下降方法来进行学习。给定一个训练样本 ,其中 为长度是 的输入序列, 是长度为 的标签序列。即在每个时刻 ,都有一个监督信息 ,我们定义时刻 的损失函数为:

其中 为第 时刻的输出, 为可微分的损失函数,比如交叉熵。那么整个序列上损失函数为:

整个序列的损失函数 关于参数 的梯度为:

即每个时刻损失 对参数 的偏导数之和。

循环神经网络中存在一个递归调用的函数 ,因此其计算参数梯度的方式和前馈神经网络不太相同。在循环神经网络中主要有两种计算梯度的方式: 随时间反向传播(BPTT)和实时循环学习(RTRL)算法。

随时间反向传播(Backpropagation Through Time,BPTT) 算法的主要思想是通过类似前馈神经网络的错误反向传播算法来进行计算梯度。

BPTT算法将循环神经网络看作是一个展开的多层前馈网络,其中“每一层”对应循环网络中的“每个时刻”。在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是将所有“展开层”的参数梯度之和

因为参数 和隐藏层在每个时刻 的净输入 有关,因此第 时刻的损失函数 关于参数 的梯度为:

其中 表示“直接”偏导数,即公式 中保持 不变,对 求偏导数,得到:

其中 为第 时刻隐状态的第 维; 除了第 个值为 外,其余都为 的行向量。

定义误差项 为第 时刻的损失对第 时刻隐藏神经层的净输入 的导数,则:

从而:

写成矩阵形式为:

由此得到整个序列的损失函数 关于参数 的梯度:

同理可得, 关于权重 和偏置 的梯度为:

在BPTT算法中,参数的梯度需要在一个完整的“前向”计算和“反向”计算后才能得到并进行参数更新。如下图所示。

与反向传播的BPTT算法不同的是,实时循环学习(Real-Time Recurrent Learning)是通过前向传播的方式来计算梯度。

假设循环神经网络中第 时刻的状态 为:

其关于参数 的偏导数为:

RTRL算法从第1 个时刻开始,除了计算循环神经网络的隐状态之外,还依次前向计算偏导数 。

两种学习算法比较:

RTRL算法和BPTT算法都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则来计算梯度。 在循环神经网络中,一般网络输出维度远低于输入维度,因此BPTT算法的计算量会更小,但BPTT算法需要保存所有时刻的中间梯度,空间复杂度较高。RTRL算法不需要梯度回传,因此非常适合于需要在线学习或无限序列的任务中

循环神经网络在学习过程中的主要问题是由于 梯度消失或爆炸问题 ,很难建模长时间间隔(Long Range)的状态之间的依赖关系。

在BPTT算法中,我们有:

如果定义 ,则:

若 ,当 时, ,会造成系统不稳定,称为梯度爆炸问题;相反,若 ,当 时, ,会出现和深度前馈神经网络类似的梯度消失问题。

虽然简单循环网络理论上可以建立长时间间隔的状态之间的依赖关系,但是由于梯度爆炸或消失问题,实际上只能学习到短期的依赖关系。这样,如果t时刻的输出 依赖于 时刻的输入 ,当间隔 比较大时,简单神经网络很难建模这种长距离的依赖关系,称为 长程依赖问题(Long-Term dependencies Problem)

一般而言,循环网络的梯度爆炸问题比较容易解决,一般 通过权重衰减或梯度截断来避免。 权重衰减是通过给参数增加 或 范数的正则化项来限制参数的取值范围,从而使得 。梯度截断是另一种有效的启发式方法,当梯度的模大于一定阈值时,就将它截断成为一个较小的数。

梯度消失是循环网络的主要问题。除了使用一些优化技巧外,更有效的方式就是改变模型,比如让 ,同时使用 ,即:

其中 是一个非线性函数, 为参数。

上式中, 和 之间为线性依赖关系,且权重系数为1,这样就不存在梯度爆炸或消失问题。但是,这种改变也丢失了神经元在反馈边上的非线性激活的性质,因此也降低了模型的表示能力。

为了避免这个缺点,我们可以采用一种更加有效的改进策略:

这样 和 之间为既有线性关系,也有非线性关系,并且可以缓解梯度消失问题。但这种改进依然存在两个问题:

为了解决这两个问题,可以通过引入 门控机制 来进一步改进模型。

为了改善循环神经网络的长程依赖问题,一种非常好的解决方案是引入门控机制来控制信息的累积速度,包括 有选择地加入新的信息,并有选择地遗忘之前累积的信息 。这一类网络可以称为基于门控的循环神经网络(Gated RNN)。本节中,主要介绍两种基于门控的循环神经网络: 长短期记忆网络和门控循环单元网络。

长短期记忆(Long Short-Term Memory,LSTM)网络 是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。

在 基础上,LSTM网络主要改进在以下两个方面:

其中 和 三个门(gate)来控制信息传递的路径; 为向量元素乘积; 为上一时刻的记忆单元; 是通过非线性函数得到的候选状态:

在每个时刻 ,LSTM网络的内部状态 记录了到当前时刻为止的历史信息。

在数字电路中,门(Gate)为一个二值变量0, 1,0代表关闭状态,不许任何信息通过;1代表开放状态,允许所有信息通过。LSTM网络中的“门”是一种“软”门,取值在(0, 1) 之间,表示 以一定的比例运行信息通过 。LSTM网络中三个门的作用为:

(1)遗忘门 控制上一个时刻的内部状态 需要遗忘多少信息。
(2)输入门 控制当前时刻的候选状态 有多少信息需要保存。
(3)输出门

循环神经网络导读

循环神经网络导读

技术图片

 

    循环神经网络(Recurrent Neural Network)是一类以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接的递归神经网络。其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络。今天,小编带你认识常见的几种循环神经网络模型,主要内容来自Colah的博客,外加一些自己的总结,一起来学习吧~

 

循环神经网络 RNNs

    在阅读或思考的过程中,人类常常结合以前的信息得到结果。但是,普通的神经网络并不能做到这一点。这或许便是传统神经网络的主要缺点。循环神经网络可以做到这一点,通过循环,循环神经网络将当前步所学习到的信息传递下去,从而学会像人一样进行思考。

技术图片

    上图即是循环神经网络的一个示例。可以看到,同普通的神经网络相似,其同样具有输入输出层以及隐层。但是,循环神经网络会结合当前步的输入技术图片 以及上一步网络所给出的 hidden state 技术图片, 计算出当前时间步的 技术图片,并将技术图片作为输入输出到下一时间步的循环神经网络之中。同时,网络的其他部分会根据当前的状态技术图片计算出当前步的输出技术图片.

给出计算公式为:

 

技术图片

 

技术图片

 

    为了便于理解,我们可以将循环神经网络视作一系列共享权值的网络,并将其展开。

 

技术图片

 

    展开之后,可以感觉到循环神经网络似乎天然与序列有某种联系,似乎循环神经网络就是为了序列而出现的。

 

LSTMs

    但是,RNN 仍然具有其局限性。很多时候,人类做出推理时仅需根据最新得到的信息即可得到结果。然而,不可避免的是,有些推理可能需要较长时间以前的信息进行辅助。

 

技术图片

 

    在这种情况之下,RNN对于要学习的东西便无能为力了。理论上,RNN 是可以学习到这样的长时依赖的。然而,RNN 并没有在时间上学习到这种长时依赖。因而,在RNN 的基础上提出了LSTM, 用以学习这种情况。LSTM 被设计解决上文所述的长时依赖问题,但是,在实际中,记住信息似乎是LSTM的本能,而不是挣扎着学会的能力。

    LSTMs 全称:Long Short Term Memory networks, 是一种特殊的 RNN 网络,能够学习到序列问题中的长时依赖。同普通的RNN 相似,LSTM同样是链式的结构。相较于RNN, LSTM的重复单元发生了变化。LSTM 的隐层不在只是简简单单的一层,而是通过特殊方式联结在一起的4层隐层。

 

技术图片

 

    首先需要谈到的是LSTMs 的Core Idea之一cell state. Cell State 就像传送带一样,穿越整个链式网络,仅仅存在少量的线性互动。这使得信息非常容易从网络的浅层传递到网络的深层。

技术图片

    其次需要谈到的是LSTMs 网络中的门gates. 正是通过一些特定门的实现,LSTMs 才能实现对 Cell State 进行修改。

 

  1. 首先需要决定遗忘技术图片 中多少的内容,通过sigmoid 层计算遗忘门技术图片

    技术图片

  2. 接下来向cell state中加入当前步所学习到的内容,这将分为两部分:一是通过 sigmoid 层计算输入门技术图片, 二是通过 tanh 层计算候选cell state 技术图片. 接下来便是结合遗忘门与输入门,得到新的cell state 技术图片

    技术图片

  3. 技术图片

  4. 最终,我们需要决定输出的内容技术图片,通过学习输出门 决定接下来需要输出的内容。

    技术图片

 

LSTMs 的变种

    第二节中介绍的 LSTMs 是普通的LSTM. 并不是所有的LSTM 结构均如上所述。 事实上,很多论文中提到的 LSTM 架构会有一些小小的差异。下面是几种LSTM的变体:

 

  • 添加了 peephole connections 的 LSTM:

技术图片

    这种 LSTM在计算遗忘、输入、输出门时,将cell state 添加到考虑之中。

 

  • 遗忘门和输入门互补的 LSTM:

 

技术图片    

    该版本中,遗忘门与输入门的和为1,因而只需计算遗忘门即可,无需再次计算和学习输入门。

 

  • Gated Recurrent Unit, GRU: 

技术图片

    GRU 舍弃了遗忘门和输入门,将其合并为一个更新门。并且,GRU同样合并了cell state 和hidden state, 以及一些其它的变化。相较于普通的LSTMs, GRU更加简单,并且也逐渐流行起来

 

技术图片

 

 

公众号ID:gakki0103希望大家多多支持我的公众号,扫码关注,我们一起学习,一起进步~

 

以上是关于循环神经网络的主要内容,如果未能解决你的问题,请参考以下文章

浅谈LSTM循环神经网络

循环神经网络(RNN)简介

循环神经网络

循环神经网络导读

循环神经网络(RNN)的应用

几种常见的循环神经网络结构RNN、LSTM、GRU