博客园  :: 首页  :: 新随笔  :: 管理

循环神经网络

Posted on 2021-02-02 16:43  wsg_blog  阅读(573)  评论(0编辑  收藏  举报

神经网络与深度学习-邱锡鹏》读书笔记

 

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

循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构,和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成任务上,循环神经网络的参数学习可以通过随时间反向传播算法来学习,随时间反向传播算法即按照时间的逆序将错误信息一步步地往前传递,当输入序列比较长时,会存在梯度爆炸和消失问题,也称为长程依赖问题。为了解决这个问题,人们对循环神经网络进行了很多的改进,其中最有效的改进方式引入门控机制(Gating Mechanism)。

此外,循环神经网络可以很容易地扩展到两种更广义的记忆网络模型:递归神经网络和图网络。

给网络增加记忆能力

为了处理这些时序数据并利用其历史消息,我们需要让网络具有短期记忆能力,而前馈网络是一种静态网络,不具备这种能力。一般来讲,我们可以通过以下三种方法来给网络增加短期记忆能力。

延时神经网络(Time Delay Neural Network,TDNN):一种简单的利用历史信息的方法是建立一个额外的延时单元,用来存储网络的历史信息(可以包括输入、输出、隐状态等),比较有代表性的模型是延时神经网络(Time Delay Neural Network,TDNN),延时神经网络是在前馈网络中的非输出层都添加一个延时器,记录神经元的最近几次活性值。在第t个时刻,第l层神经元的活性值依赖于第l-1层神经元的最近K个时刻的活性值,那是怎么做到的呢,其实看一下下面的公式就清楚了:

$h_t^{(l)} = f \big( h_t^{(l-1)},h_{t-1}^{(l-1)},···,h_{t-K}^{(l-1)} \big) $

 其中$h_t^{l} \in \mathbb{M_l}$表示第l层神经元在时刻t的活性值,$M_l$为第l层神经元的数量,通过延时器,前馈网络就具有了短期记忆的能力。

有外部输入的非线性自回归模型:

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

$y_t= \omega_0 + \sum_{k=1}^{K} \omega_{k}y_{t-k}+\epsilon_{t}$

其中K为超参数,$\omega_0,···,\omega_k$为可学习参数,$\epsilon_{t} \sim \mathcal{N}(0,\sigma^{2}) $ 为第t个时刻的噪音,方差$\sigma^{2}$和时间无关。

   有外部输入的非线性自回归模型(Nonlinear AutoRegressive with Exogenous Inputs Model,NARX)是自回归模型的扩展,在每个时刻t都有一个外部输入$x_t$,产生一个输出$y_t$,NARX通过一个延时器记录最近$K_x$词的外部输入和最近$K_y$次的输出,第t个时刻输出$y_t$为

$y_t=f(x_t,x_{t-1},···,x_{t-K_x},y_{t-1},y_{t-2},···,y_{t-K_y})$

 其中$f(·)$表示非线性函数,可以是一个前馈网络,$K_x$和$K_y$为超参数。

 

循环神经网络

  循环神经网络(Recurrent Neural Network,RNN) 通过使用带自反馈的神经元,能够处理任意长度的时序数据。给定一个输入序列$x_{1:T} (x_1,x_2,...,x_t,...,x_T)$,循环神经网络通过下面公式更新带反馈边的隐藏层的活性值$h_t$:

$h_t=f(h_{t-1}, x_t)$ 

其中$h_0=0,f(·)$为一个非线性函数,可以是一个前馈网络。

  下图给出了循环神经网络的示例,其中“延时器”为一个虚拟单元,记录神经元的最近一次(或几次)活性值。 

从数学上讲,公式(6.4)可以看成一个动力系统,因此,隐藏层的活性值$h_t$在很多文献上也称为状态(State)或隐状态(Hidden State)

由于循环神经网络具有短期记忆能力,相当于存储装置,因此其计算能力十分强大。理论上,循环神经网络可以近似任意的非线性动力系统(参见第6.2.1节)。前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序(持怀疑态度)。 

 

简单循环网络(Simple Recurrent Network, SRN):

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

令向量$x_t \in \mathcal{R}^M$ 表示在时刻t时网络的输入,$h_t \in \mathcal{R}^D$表示隐藏层状态(即隐藏层神经元活性值),则$h_t$不仅和当前时刻的输入$x_t$相关,也和上一时刻的隐藏层状态$h_{t-1}$相关,简单循环网络在时刻t的更新公式为

$z_t = Uh_{t-1} + Wx_t +b$,

$h_t = f(z_t)$

其中$z_t$为隐藏层的净输入,$U \in mathcal{R}^{D \times D}$ 为状态-状态权重矩阵,$W \in mathcal{R}^(D \times M)$ 为状态-输入权重矩阵,$b \in \mathcal{R}^D$ 为偏置向量,$f(·)$是非线性激活函数,通常为Logistic函数或Tanh函数。

$h_t=f(Uh_{t-1} + Wx_t + b)$ 

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

 循环神经网络的计算能力

我们先定义一个完全连接的循环神经网络,其输入为$x_t$,输出为$y_t$

$h_t=f(Uh_{t-1} + Wx_t + b)$

$y_t=Vh_t$

其中h为隐状态,$f(·)$为非线形激活函数,$U、W、b和V$为网络参数。

循环神经网络的通用近似定理

循环神经网络的拟合能力也十分强大,一个完全连接的循环网络是任何非线性动力系统的近似器。 

  如果一个完全连接的循环神经网络有足够数量的sigmoid型隐藏神经元,它可以以任意的准确率去近似任何一个非线动力系统

$s_t = g(s_t-1, x_t)$

$y_t = o(s_t)$

其中$s_t$为每个时刻的隐状态,$x_t$是外部输入,$g(·)$是可测的状态转换函数,o(·)是连续输出函数,并且对状态空间的紧致性没有限制。

证明(1)根据通用近似定理,两层的前馈神经网络可以近似任意有界闭集上的任意连续函数,因此,动力系统的两个函数可以用两层的全连接前馈网络近似。

  首先,非线形动力系统的状态转换函数$s_t = g(s_{t-1}, x_t)$可以由一个两层的神经网络$s_t = Cf(As_{t-1} + Bx_t + b)$来近似,可以分解为

...

循环神经网络应用到机器学习

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

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

  假设一个样本$x_{1:T}=(x_1,···,x_T)$为一个长度为T的序列,输出为一个类别$y \in {1,···,C}$,我们可以将样本x按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态$h_1,···,h_T$ 我们可以将$h_T$看作整个序列的最终表示(或特征),并输入给分类器$g(·)$进行分类,即

$\widehat y = g(h_t)$

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

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

$\widehat y = g\Big( \frac{1}{T} \sum_{i=1}^T h_t \Big)$

 

 同步的序列到序列模式

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

$x_{1:T} = (x_1,..,x_T)$,输出为$y_{1:T} = (y_1,...,y_T)$. 样本$x$按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态$h_1,...,h_T$.,每个时刻的隐状态$h_t$代表了当前时刻和历史的信息,并输入给分类器

$g(\centerdot)$得到当前时刻的标签 $\widehat y_t = g(h_t), \forall _t \in [1,T]$.

 异步的序列到序列模式

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

在异步的序列到序列模式中,输入为长度为T的序列 $x_{1:T} = (x_1,...,x_T)$,输出为长度为M的序列y_{1:M} = (y_1,...,y_M).异步的序列到序列模式一般通过先编码后解码的方式来实现。先将样本$x$按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码$h_T$,然后再使用另一个循环神经网络(解码器),得到输出序列$ \widehat y_{1:M} = (y_1,...,y_M)$.异步的序列到序列模式一般通过先编码后解码的烦事来实现。先将样本$x$按不同时刻输入到一个循环神经网络(解码器),得到输出序列$\widehat y_{1:M}$.为了建立输出序列之间的依赖关系,在解码器中通常使用非线形的自回归模型。令f_1(\centerdot)和f_2(\centerdot)分别为用作编码器和解码器的循环神经网络,则编码器-解码器模型可以写为

$h_t = f_1(h_{t-1}, x_t), \forall _t \in [1,T]$

$h_{T+t} = f_2(h_{T+t-1}, \widehat y_{t-1}),  \forall _t \in [1,M]$

$\widehat y_t = g(h_{T+t})$

其中g(\centerdot)为分类器,$\widehat y_t$为预测输出$\widehat y_t 的向量表示$。在解码器通常采用自回归模型,每个时刻的输入为上一时刻的预测结果$\widehat y_(t-1)$

下图给出了异步的序列到序列模式示例,其中<EOS>表示输入序列的结束,虚线表示将上一个时刻的输出作为下一个时刻的输入。

 

 循环神经网络长程依赖问题

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

基于门控的循环神经网络 

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

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