《神经网络与深度学习》-循环神经网络


  全前馈神经网络,信息单向传递,网络易学习,但能力被减弱。网络输出只依赖于当前的输入。输入输出维数固定。
  循环神经网络,具有短期记忆能力。其中的神经元可接收其他神经元的信息和本身的信息。输入输出可不固定。参数学习可通过随时间反向传播算法学习。输入序列较长时,错误信息向前传递过长,存在梯度爆炸梯度消失问题,即长程依赖问题,一种有效的改进方式:门控机制
  循环神经网络易拓展到更广义的记忆网络模型:递归神经网络图网络

1. 给网络增加记忆能力

  时序数据处理需要历史信息。前馈网络无记忆能力。介绍三种方法给网络增加记忆能力

1.1 延时神经网络

  延时神经网络通过在前馈网络的非输出层中都添加一个延时器,记录神经元的最近几次活性值,增加前馈网络的短期记忆能力。在 tt 时刻,第 ll 层神经元的活性值依赖于第 l1l-1层神经元的最近 KK 个时刻的活性值:

ht(l)=f(ht(l1),ht1(l1),,htK(l1)) \pmb{h}_t^{(l)} = f(\pmb{h}_t^{(l-1)},\pmb{h}_{t-1}^{(l-1)},\cdot\cdot\cdot,\pmb{h}_{t-K}^{(l-1)})

其中 ht(l)RMl\pmb{h}_t^{(l)} \in \mathbb{R}^{ \pmb{M}_l } 表示第 ll 层神经元在时刻 tt 的活性值,MlM_l 为第 ll 层神经元的数量。前馈神经网络的活性值:

a(l)=fl(W(l)a(l1)+b(l)) \pmb{a}^{(l)} = f_l(\pmb{W}^{(l)}\pmb{a}^{(l-1)} + \pmb{b}^{(l)})

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

自回归模型 (AutoRegressive Model,AR)统计学上的时间序列模型,用一个变量 yt\pmb{y}_t 的历史信息来预测自己:

yt=w0+k=1Kwkytk+ϵt \pmb{y}_t = w_0 + \sum_{k=1}^K w_k \pmb{y}_{t-k} + \epsilon_t

其中 KK 为超参数,w0,,wKw_0, \cdot\cdot\cdot, w_K 为可学习参数,ϵt\epsilon_t ~ N(0,σ2)N(0, \sigma^2) 为第 tt 个时刻的噪声,方差 σ2\sigma^2 与时间无关。

有外部输入的自回归模型 (Nonlinear AutoRegressive with Exogenous Inputs Model,NARX),在每个时刻 tt 都有一个外部输入 xt\pmb{x}_t, 产生一个输出 yt\pmb{y}_t, NARX 通过一个延时器记录最近 KxK_x次的外部输入和最近KyK_y次的输出,第 tt 个时刻的输出yt\pmb{y}_t为:

yt=f(xt,xt1,,xtKx,yt1,yt2,,ytKy) \pmb{y}_t = f(\pmb{x}_t,\pmb{x}_{t-1},\cdot\cdot\cdot,\pmb{x}_{t-K_x}, \pmb{y}_{t-1},\pmb{y}_{t-2},\cdot\cdot\cdot,\pmb{y}_{t-K_y})

其中 f()f(\cdot) 表示非线性函数,可以前馈网络,KxK_xKyK_y 为超参数。

1.3 循环神经网络

循环神经网络 (Recurrent Neural Network,RNN)通过使用带自反馈的神经元处理任意长度的时序数据。
  给定输入序列 x1:T=(x1,x2,...,xt,...,xT)\pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}),RNN 这样更新带反馈边的隐藏层的活性值 ht\pmb{h}_t

ht=f(ht1,xt) \pmb{h}_t = f(\pmb{h}_{t-1}, \pmb{x}_t)

其中h0=0\pmb{h}_0 = 0f()f(\cdot) 为非线性函数。可谓前馈网络。从数学上来说,该公式可看成动力系统,故隐藏层活性值 ht\pmb{h}_t 又被成为状态(State)或隐状态(Hidden State)。
在这里插入图片描述

2. 简单循环网络

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

  假设向量 xtRM\pmb{x}_t \in \mathbb{R}^M 表示在时刻tt时网络的输入, htDM\pmb{h}_t \in \mathbb{D}^M 表示隐藏层状态(隐藏层神经元活性值), ht\pmb{h}_t和当前时刻输入xt\pmb{x}_t、上一时刻隐藏层状态ht1\pmb{h}_{t-1}相关。 SRN在t时刻更新公式为:
在这里插入图片描述
在这里插入图片描述
其中zt\pmb{z}_t 为隐藏层的净输入,URD×D\pmb{U} \in \mathbb{R}^{D \times D}状态-状态权重矩阵,WRD×D\pmb{W} \in \mathbb{R}^{D \times D}状态-输入权重矩阵,bRD\pmb{b} \in \mathbb{R}^{D}偏移向量, 其中 f()f(\cdot) 表示非线性函数,常为Logistic函数或Tanh函数。
  若把每个时刻的状态都看做前馈神经网络的一层,循环神经网络可看做在时间维度上权值共享的神经网络。按时间展开的循环神经网络:
在这里插入图片描述

2.1 循环神经网络的计算能力

  前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序。定义一个完全连接的循环神经网络。xt\pmb{x}_t 为输入, yt\pmb{y}_t 为输出, ht\pmb{h}_t 为隐状态, f()f(\cdot)为非线性激活函数, U\pmb{U}W\pmb{W}b\pmb{b}V\pmb{V}为网络参数:
在这里插入图片描述

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

  循环神经网络的拟合能力也十分强大。一个完全连接的循环网络是任何非线性动力系统的近似器。可用通用近似定理解释:
在这里插入图片描述

2.1.2 图灵完备

  图灵完备(Turing Completeness)是指一种数据操作规则,比如一种编程语言,可以实现图灵机(Turing Machine)的所有功能,解决所有的可计算问题。
在这里插入图片描述
  故一个完全连接循环神经网络可以近似解决所有的可计算问题。

3. 应用到机器学习

  循环神经网络可以应用到三种模式的机器学习任务::序列到类别模式、同步的序列到序列模式、异步的序列到序列模式。

3.1 序列到类别模式

  序列到类别模式主要用于序列数据的分类问题。比如文本分类任务,输入为单词序列,输出为该文本类别。
  假设输入序列 x1:T=(x1,x2,...,xt,...,xT)\pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}),输出为一个类别 yy \in {1, … , C}。可将样本 x\pmb{x} 按不同时刻输入到循环神经网络中,得到不同时刻的隐藏状态:h1\pmb{h}_1, ......, hT\pmb{h}_T。可将 hT\pmb{h}_T看做整个序列的最终表示或特征,输入分类器 g()g(\cdot)

y^=g(hT) \hat{y} = g(\pmb{h}_T)

也可以将整个序列的所有状态进行平均,做为整个序列的表示:

y^=g(1Tt=1Tht) \hat{y} = g(\frac{1}{T}\sum_{t=1}^{T}\pmb{h}_t)

  两种图示:
在这里插入图片描述

3.2 同步的序列到序列模式

  同步的序列到序列模式主要用于序列标注(Sequence Labeling)任务,即每一时刻都有输入输出,输入输出序列长度相同。比如在词性标注(Part-of-Speech Tagging)中,每一个单词需要标注其词性标签
  假设输入序列 x1:T=(x1,x2,...,xt,...,xT)\pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ... ,\pmb{x_t}, ..., \pmb{x_T}),输出序列为一个类别 y1:T=(y1,...,yT)y_{1:T} = (y_1, ... , y_T)。样本 x\pmb{x} 按不同时刻输入到循环神经网络中,得到不同时刻的隐含态 h1\pmb{h}_1, …, hT\pmb{h}_T 。每个时刻的隐含态 ht\pmb{h}_t 代表了当前时刻和历史的信息,作为输入:

y^t=g(ht),t[1,T] \hat{y}_t = g(\pmb{h}_t), \forall t \in [1, T]

在这里插入图片描述

3.3 异步的序列到序列模式

  异步的序列到序列模式 又称编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需具有严格的对应关系,也不需相同长度。比如机器翻译任务中,输入为源语言单词序列,输出为目标语言单词序列。
   假设输入为 x1:T=(x1,x2,...,xT)\pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ..., \pmb{x_T}),输出为 y1:M=(y1,y2,...,xM)\pmb{y}_{1:M} = (\pmb{y_1}, \pmb{y_2}, ... ,\pmb{x_M}) 异步的序列到序列模式 一般通过先编码后解码的方式来实现。先将样本 xx 按不同时刻输入到一个RNN(编码器)中,得到其编码 hT\pmb{h}_T 。然后再使用另外一个RNN(解码器),得到输出序列 y^1:M\hat{y}_{1:M} ,为建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型:
在这里插入图片描述
其中 f1()f_1(\cdot)f2()f_2(\cdot) 分别作为编码器和解码器,g()g(\cdot) 为分类器,y^t\hat{\pmb{y}}_t 为预测输出 y^t\hat{y}_t 的向量表示。
   异步的序列到序列模式示例如下图,其中⟨𝐸𝑂𝑆⟩ 表示输入序列的结束,虚线表示将上一个时刻的输出作为下一个时刻的输入:
在这里插入图片描述

4. 参数学习

   可用梯度下降学习RNN中的参数。以随机梯度下降为例。给定样本 (x,y)(\pmb{x}, \pmb{y}) ,其中输入为 x1:T=(x1,x2,...,xT)\pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ..., \pmb{x_T}),输出为 y1:T=(y1,y2,...,xT)\pmb{y}_{1:T} = (\pmb{y_1}, \pmb{y_2}, ... ,\pmb{x_T}) 每个时刻t,都有一个监督信息yty_t ,定义时刻 t 的损失函数为:

Lt=L(yt,g(ht)) L_t = L(y_t, g(\pmb{h}_t))

其中 g(ht)g(\pmb{h}_t) 为 t 时刻的输出,L为可微分的损失函数,如交叉熵。整个序列的损失函数为:

Lt=t=1TLt L_t = \sum_{t=1}^{T}{L_t}

   整个序列的损失函数 L 为关于参数 U 的梯度为每个时刻损失 L_t 对参数U的偏导数之和:

LU=t=1TLtU \frac{\partial{L}}{\partial{\pmb{U}}} = \sum_{t=1}^{T}\frac{\partial{L}_t}{\partial{\pmb{U}}}

   RNN中存在提个递归调用的 f()f(\cdot) ,因此计算参数梯度的方式不同于计算前馈网络,主要有两种::随时间反向传播(BPTT)算法和实时循环学习(RTRL)算法.

4.1 随时间反向传播算法

  随时间反向传播算法类似前馈网络的错误反向传播算法
  BPTT 算法将RNN看做展开的多层前馈网络,其中的“每一层”对应RNN中的“每个时刻”:
在这里插入图片描述
这样,RNN就可按照前馈网络中的反向传播算法计算参数梯度。在展开的前馈网络中,所有层参数共享,参数的真实梯度是所有“展开层”的参数梯度之和。

计算偏导数LU\frac{\partial{L}}{\partial{\pmb{U}}} 先计算时刻 t 的损失对参数U的偏导 LU\frac{\partial{L}}{\partial{\pmb{U}}}
  参数 U 和隐藏层净输入 zk=Uhk1+Wxk+b\pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Wx_k} + b 有关,故 t 时刻的损失 LtL_t 关于参数 uiju_{ij} 的梯度为:
在这里插入图片描述
其中 +zkuij\frac{\partial^{+}z_k}{\partial{\pmb{u}_{ij}}} 表示直接偏导数zk=Uhk1+Wxk+b\pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Wx}_k + b 中保持 hk1\pmb{h}_{k-1} 不变,对 uiju_{ij} 进行求偏导,得到:
在这里插入图片描述
其中 [hk1]j[\pmb{h}_{k-1}]_j 为第 k-1 时刻隐状态的第 j 维;Ii(x)\mathbb{I}_i(x) 为除了第 i 行为 x 外,其余部分为 0 的行向量。
  定义误差项为第 t 时刻的损失对第 k 时刻隐藏神经层的净输入zk\pmb{z}_k 的导数,则当 1kt1 \leq k \leq t时:
在这里插入图片描述
由以上可得到:
在这里插入图片描述
其矩阵形式:
在这里插入图片描述
参数梯度 得到整个序列的损失函数 L 关于参数 U、权重W、偏置b 的梯度:
在这里插入图片描述
在这里插入图片描述
计算复杂度 在BPTT 算法中,参数的梯度需要在一个完整的“前向”计算和“反向”计算后才能得到并进行参数更新。

4.2 实时循环学习算法

  与反向传播的BPTT不同,实时循环学习(Real-Time Recurrent earning,RTRL)是通过前向传播的方式来计算梯度。
  假设RNN的第 t+1t+1时刻的状态 ht+1\pmb{h}_{t+1} 为:
在这里插入图片描述
其中关于参数 uiju_{ij} 的偏导数为:
在这里插入图片描述
  RTRL算法从第1个时刻开始,计算RNN的隐状态,同时一次向前计算偏导数 h1uij\frac{\partial h_1}{\partial{\pmb{u}_{ij}}}h2uij\frac{\partial h_2}{\partial{\pmb{u}_{ij}}}h3uij\frac{\partial h_3}{\partial{\pmb{u}_{ij}}},…这样第 t 时刻,可以实时计算损失 L_t 关于参数 U 的梯度,并更新参数。参数WWbb的梯度同理。

RTRL和BPTT算法比较 两者都是基于梯度下降算法,分别通过前向模式和后向模式利用链式法则计算梯度。RNN中,一般网络输出维数原低于输入维度,因此BPTT算法计算量更小,但要保存所有时刻的中间梯度,空间复杂度高。RTRL不需要梯度回传,适合在线学习和无限序列任务。

5. 长程依赖问题

  RNN在学习过程中主要的问题是梯度消失或梯度爆炸。很难建模长时间间隔的状态之间的依赖关系。
  将BPTT中的误差项展开:
在这里插入图片描述
得到:
在这里插入图片描述
再定义:
在这里插入图片描述
得到:
在这里插入图片描述
  若 γ>1\gamma > 1, 当 tkt-k \rightarrow \infty 时,γtk\gamma^{t-k} \rightarrow \infty。当间隔 tkt - k 比较大时,梯度也变得很大,会造成系统不稳定,即梯度爆炸问题。
  若 γ<1\gamma < 1, 当 tkt-k \rightarrow \infty 时,γtk0\gamma^{t-k} \rightarrow 0。当间隔 tkt - k 比较大时,梯度也变得很小,会出现和深层前馈网络类似的梯度爆炸问题。
注意:
在这里插入图片描述
  RNN常使用Logistic或Tanh函数作为非线性激活函数,其导数值都小于1,权重矩阵 U||\pmb{U}|| 不会太大,故若时间间隔 tkt - k 过大,δt,k\delta_{t,k} 会趋于0,故出现梯度消失问题。
  RNN理论上可以建立长时间间隔的状态之间的依赖关系,但由于梯度爆炸或消失问题,实际上只能学到短期的依赖关系。这样,如时刻 t 的输出 yty_t 依赖于时刻 k 的输入 xk\pmb{x}_k,当间隔 tkt-k 较大时,简单RNN难建模长距离依赖关系,成为长程依赖问题

5.1 改进方案

  为避免梯度爆炸或梯度消失,一种直接方式:选取合适参数,使用非饱和激活函数,尽量使 diag(f(z))UT1diag(f^{'}(\pmb{z})) \pmb{U}^T \approx1。这种方式依赖于人工调参经验,限制模型的广泛应用。一种有效方式:通过改进模型优化方法

梯度爆炸 RNN的梯度爆炸更易解决,常通过权重衰减梯度截断
  权重衰减通过给参数增加 l1l1l2l2 范数的正则化,来限制参数取值范围,从而使 γ1\gamma \leq 1 。梯度截断是另一种有效的启发式方法,梯度的模大于阈值时,将其截断为及较小的数。

梯度消失 RNN的主要问题。解决方式:一是用优化技巧;二是改变模型(更有效),如让 U=I\pmb{U} = \pmb{I} ,同时令 htht1=I\frac{\partial \pmb{h}_t}{\partial \pmb{h}_{t-1}} = \pmb{I} 为单位矩阵,即:

ht=ht1+g(xt;θ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t; \theta)

  其中 hth_tht1h_{t-1} 之间为线性依赖关系,权重系数为1,不存在梯度爆炸或消失问题,但是,丢失了神经元在反馈边上的非线性激活的性质,故降低了模型的表示能力。更有效的改进策略:

ht=ht1+g(xt,ht1;θ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)

  这样 hth_tht1h_{t-1} 既有线性关系,也有非线性关系,并可缓解梯度消失问题。仍存在问题:

  • 梯度爆炸:令 zk=Uhk1+Uxk+b\pmb{z}_k = \pmb{Uh}_{k-1} + \pmb{Ux}_k + \pmb{b}kk 时刻 g()g(\cdot) 的输入,在误差项计算中: 在这里插入图片描述
    梯度可能过大,存在梯度爆炸问题。
  • 记忆容量:随着 ht\pmb{h}_t不断累积存储新的输入信息,会发生饱和。 假设 g()g(\cdot) 为 Logistic 函数,则随着时间 t 的增长,ht\pmb{h}_t 会变得大,从而导致 h\pmb{h} 变得饱和。即隐状态ht\pmb{h}_t可存储信息有限,随着记忆单元存储内容增多,其丢失信息也增多。
      利用门控机制改进模型,解决这两个问题。

6. 基于门控的循环神经网络

  为改善RNN的长程依赖问题,在公式:

ht=ht1+g(xt,ht1;θ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)

上引入门控机制来控制信息积累速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息。这类网络叫做 基于门控的循环神经网络 (Gated RNN)。

6.1 长短期记忆网络(LSTM)

  长短期记忆网络(Long Short-Term Memory Network,LSTM)是RNN的一变体,可有效解决RNN的梯度爆炸或梯度消失问题。在以下公式上,进行两方面的改进:

ht=ht1+g(xt,ht1;θ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)

新的内部状态 LSTM引入新的内部状态(internal state)ctRD\pmb{c}_t \in \mathbb{R}^D 专门进行线性的循环信息传递,同时非线性地输出信息给隐藏层的外部状态 htRD\pmb{h}_t \in \mathbb{R}^D。内部状态 ct\pmb{c}_t 这样计算:
在这里插入图片描述
其中 ft[0,1]D\pmb{f}_t \in [0,1]^Dit[0,1]D\pmb{i}_t \in [0,1]^Dot[0,1]D\pmb{o}_t \in [0,1]^D为三个门(gate)来控制信息传递的路径;\bigodot 为向量元素乘积;ct1\pmb{c}_{t-1}为上一个时刻的记忆单元;c^tRD\hat{\pmb{c}}_t \in \mathbb{R}^D 是通过非线性函数得到的候选状态
在这里插入图片描述
在每个时刻 t ,LSTM 网络的内部状态 ct\pmb{c}_t 记录了到当前时刻为止的历史信息。

门控机制 数字电路中,门为二值变量 {0,1},0代表关闭,不需信息通过。LSTM引入门控机制(Gating Mechanism),控制信息传递的路径。公式:
在这里插入图片描述
中有三个门:ft[0,1]D\pmb{f}_t \in [0,1]^D为遗忘门、it[0,1]D\pmb{i}_t \in [0,1]^D为输入门、ot[0,1]D\pmb{o}_t \in [0,1]^D 为输出门。三个门的作用:

  • ft[0,1]D\pmb{f}_t \in [0,1]^D为遗忘门,控制上一个时刻的内部状态 ct1\pmb{c}_{t-1} 需要遗忘多少信息。
  • it[0,1]D\pmb{i}_t \in [0,1]^D为输入门,控制当前时刻的候选状态 c^t\hat{\pmb{c}}_t 需要保存多少信息。
  • ot[0,1]D\pmb{o}_t \in [0,1]^D为输出门,控制当前时刻的内部状态 ct\pmb{c}_t 有多少信息需要输出给外部状态 ht\pmb{h}_t

  当 ft=0it=1\pmb{f}_t = 0,\pmb{i}_t = 1 时,记忆单元将历史信息清空,将候选状态写入,但此时记忆单元 ct\pmb{c}_t 依然和上一时刻的历史信息相关。
  当 ft=1it=0\pmb{f}_t = 1,\pmb{i}_t = 0 时,记忆单元将复制上一时刻的内容,不写入新的信息。
  LSTM的“门”是“软门”,取值在 (0,1) 之间,并以一定的比例通过信息,三种门的计算如下,其中 σ()\sigma(\cdot) 为 Logistic函数,其输出区间为 (0,1),xt\pmb{x}_t 为当前时刻的输入,ht1\pmb{h}_{t-1} 为上一时刻的外部状态:
在这里插入图片描述

  LSTM的循环单元结构如图:
在这里插入图片描述
其计算过程为:

  1. 利用上一时刻的外部状态 ht1\pmb{h}_{t-1} 和当前时刻的输入 xt\pmb{x}_t ,计算出三个门ft\pmb{f}_tit\pmb{i}_tot\pmb{o}_t,和候选状态c^t\pmb{\hat{c}}_t
  2. 结合遗忘门 ft\pmb{f}_t、输入门 it\pmb{i}_t 更新记忆单元 ct\pmb{c}_t
  3. 结合输出门 ot\pmb{o}_t ,将内部状态的信息传递给外部状态 ht\pmb{h}_{t}

  通过LSTM循环单元,整个网络可以建立较长距离的时序依赖关系。给出以上LSTM循环单元公式的简洁描述:
在这里插入图片描述
其中 xtRM\pmb{x}_t \in \mathbb{R}^M 为当前时刻的输入,WR4D×(D+M)\pmb{W} \in \mathbb{R}^{4D \times (D+M)}bR4D\pmb{b} \in \mathbb{R}^{4D} 是网络参数。

记忆 循环神经网络的隐状态 hh 存储了历史信息,可以看做是一种 记忆
  在简单RNN中,隐状态 hh 每个时刻都会被重写,看做短期记忆(Short-Term Memory)。
  在神经网络中,长期记忆(Long-Term Memory)可看做是网络参数,隐含从训练数据中学到的经验,更新周期远慢于短期记忆
  而在LSTM中,记忆单元 cc 可以在某个时刻捕捉到某个关键信息,并有能力将此关键信息保存一定的时间。记忆单元cc 中保存信息的生命周期要长于短期记忆 hh ,短于长期记忆,因此称为长短期记忆(Long Short-Term Memory)。
在这里插入图片描述

6.2 LSTM网络的各种变体

  主流的LSTM用三个门动态控制内部状态遗忘历史信息、输出信息、输入信息的数量。对门控机制修改,得到LSTM变体。

无遗忘门的LSTM 最早的LSTM是没有遗忘门的,内部状态的更新为:
在这里插入图片描述
记忆单元 cc 会不断增大。输入序列很长时,记忆单元容量饱和,大大降低LSTM的性能。

peephole 连接 三种门不但依赖于输入 xt\pmb{x}_t 和上一个时刻的隐状态 ht1\pmb{h}_{t-1},也依赖于上一个时刻的记忆单元 ct1\pmb{c}_{t-1}:
在这里插入图片描述
其中 ViVfVo\pmb{V}_i、\pmb{V}_f、\pmb{V}_o 为对角矩阵。

耦合输入门和遗忘门 LSTM的输入门和输出门有些互补关系,同时使用两个门较冗余,为减少LSTM的计算复杂度,将输入门输出门合并,令 ft=1it\pmb{f}_t = 1 - \pmb{i}_t ,内部状态更新方式:
在这里插入图片描述

6.3 门控循环单元网络

   门控循环单元(Gated Recurrent Unit,GRU)网络比LSTM更简单。
   GRU网络引入门控机制控制信息更新方式,不同LSTM,GRU不引入额外的记忆单元,在公式:

ht=ht1+g(xt,ht1;θ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)

上,引入一个更新门控制当前状态需从历史状态中保留多少信息,需从候选状态中接受多少新信息:

ht=ztht1+(1zt)g(xt,ht1;θ)zt=σ(Wzxt+Uzht1+bz) \pmb{h}_t = \pmb{z}_t \bigodot \pmb{h}_{t-1} + (1-\pmb{z}_t) \bigodot g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) \\ \pmb{z}_t = \sigma(\pmb{W}_z \pmb{x}_t + \pmb{U}_z \pmb{h}_{t-1} + \pmb{b}_z)

其中 zt[0,1]D\pmb{z}_t \in [0,1]^D 为更新门。在LSTM中,输入输出互补,具有冗余性,GRU用更新门平衡输入和遗忘之间的平衡:

  • zt=0\pmb{z}_t = 0时,当前状态 ht\pmb{h}_t 和前一时刻的状态ht1\pmb{h}_{t-1} 之间为非线性函数关系;
  • zt=1\pmb{z}_t = 1时, ht\pmb{h}_tht1\pmb{h}_{t-1} 之间为线性函数关系。

  在GRU中,函数 g(xt,ht1;θ)g(\pmb{x}_t, \pmb{h}_{t-1}; \theta)的定义为:
在这里插入图片描述

其中 h^t\pmb{\hat{h}_t} 表示当前时刻的候选状态, rt[0,1]D\pmb{r}_t \in [0,1]^D 为重置门:
在这里插入图片描述

用来控制候选状态 h^t\pmb{\hat{h}_t} 的计算是否依赖上一个时刻的状态 ht1\pmb{h}_{t-1}

  • rt=0\pmb{r}_t = 0时,候选状态 h^t=tanh(Wcxt+b)\pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{b} ) 只和当前输入 xt\pmb{x}_t 相关,和历史状态无关。
  • rt=1\pmb{r}_t = 1时,候选状态 h^t=tanh(Wcxt+Uhht1+b)\pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{U}_h\pmb{h}_{t-1} +\pmb{b} ) 和当前输入 xt\pmb{x}_t 、历史状态 ht1\pmb{h}_{t-1} 相关,和简单RNN一致。

  综上,GRU网络的状态更新方式为:

ht=ztht1+(1zt)h^t \pmb{h}_t = \pmb{z}_t \bigodot \pmb{h}_{t-1} + (1-\pmb{z}_t) \bigodot \pmb{\hat{h}}_t

  • zt=0r=1\pmb{z}_t = 0,\pmb{r} = 1 时,GRU退化为简单RNN;
  • zt=0r=0\pmb{z}_t = 0,\pmb{r} = 0 时,当前状态 ht\pmb{h}_t 和当前输入 xt\pmb{x}_t 相关,和历史状态ht1\pmb{h}_{t-1} 无关;
  • zt=1\pmb{z}_t = 1 时,当前状态 ht=ht1\pmb{h}_{t} = \pmb{h}_{t-1},和当前输入 xt\pmb{x}_t 无关。

  GRU网络的循环单元结构:
在这里插入图片描述

7. 深层循环神经网络

  如果将深度定义为网络中中信息传递路径长度的话,RNN可以看作是既“深”又“浅”的网络。因为,把RNN按时间展开,长时间间隔的状态之间的路径很长,RNN可以看作是一个非常深的网络;而果同一时刻网络输入到输出之间的路径xtyt\pmb{x}_t → \pmb{y}_t,这个RNN网络是非常浅的。
  故,可增加RNN的深度来增强RNN的能力,即增加同一时刻网络输入到输出的路径xtyt\pmb{x}_t → \pmb{y}_t,比如增加隐状态到输出的路径 htyt\pmb{h}_t → \pmb{y}_t,以及输入xtht\pmb{x}_t → \pmb{h}_t到隐状态的路径深度。

7.1 堆叠循环神经网络

  常见的简单做法,将多个RNN堆叠起来,称为堆叠循环神经网络(Stacked Recurrent Neural Network,SRNN)。一个堆叠的简单循环网络(Stacked SRN) 也称为循环多层感知器(Recurrent Multi-Layer Perceptron,RMLP)。按时间展开的SRNN如下:
在这里插入图片描述
ll 层网络的输入是 l1l-1 层网络的输出。定义,ht(l)\pmb{h}_t^{(l)} 为在时刻 tt 时第 ll 层的隐状态:
在这里插入图片描述

其中U(l)\pmb{U}^{(l)}W(l)\pmb{W}^{(l)}b(l)\pmb{b}^{(l)} 为权重矩阵和偏置向量,ht(0)=xt\pmb{h}_t^{(0)} = \pmb{x}_t

7.2 双向循环神经网络

  特定任务中,一个时刻的输出不但和过去时刻的信息有关,也和后续时刻的信息有关。比如给定句子,其中一个词的词性由它的上下文决定。因此,在这些任务中,可以增加一个按时间的逆序来传递信息的网络层,以增强网络的能力。
  双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN)由两层循环神经网络组成,他们的输入相同,只是信息传递的方向不同。
  假设第1 层按时间顺序,第2 层按时间逆序,在时刻tt时的隐状态定义为 ht(1)\pmb{h}_t^{(1)}ht(2)\pmb{h}_t^{(2)} ,则:
在这里插入图片描述
其中\bigoplus 为向量拼接操作。
在这里插入图片描述

8. 拓展到图结构

  如果将RNN按时间展开,每个时刻的隐状态ht\pmb{h}_t看作一个节点,那么这些节点构成一个链式结构,每个节点tt都收到其父节点的消息(Message),更新自己的状态,并传递给其子节点。而链式结构是一种特殊的图结构,我们可以比较容易地将这种消息传递(Message Passing)的思想扩展到任意的图结构上。

8.1 递归神经网络

  递归神经网络(Recursive Neural Network,RecNN)是RNN在有向无循环图上的拓展,常为树桩层次结构:
在这里插入图片描述
  三个隐藏层 h1\pmb{h}_1h2\pmb{h}_2h3\pmb{h}_3,其中h1\pmb{h}_1由两个输入层x1\pmb{x}_1x2\pmb{x}_2计算得到。
  对一个节点hi\pmb{h}_i,他可以接受来自父节点集合 πi\pi_i 中所有节点的消息,并更新自己的状态:

hi=f(hπi) \pmb{h}_i = f(\pmb{h}_{\pi_i})

其中hπi\pmb{h}_{\pi_i}表示集合 πi\pi_i中所有节点状态的拼接,ff 是一个和节点位置无关的非线性函数,可以为一个单层的前馈神经网络。递归神经网络一般结构可以写成:
在这里插入图片描述
  当递归神经网络的结构退化为线性序列结构(图b),递归神经网络等价于简单RNN。
  递归神经网络主要用来建模自然语言句子的语义。
  同样,可用门控机制来改进递归神经网络中的长距离依赖问题,比如树结构的长短期记忆模型(Tree-Structured LSTM),就是将LSTM模型的思想应用到树结构的网络中,来实现更灵活的组合函数。

8.2 图神经网络

  实际中很多数据是图结构的,比如知识图谱、社交网络、分子网络等。而前馈网络和反馈网络很难处理图结构的数据。图神经网络(Graph Neural Network,GNN)是将消息传递的思想扩展到图结构数据上的神经网络,可用来处理图数据。
  对一个任意的图结构 G(V,ϵ)G(V,\epsilon) 。图中每个节点 v 都用一组神经元来表示状态 h(v)\pmb{h}^{(v)},初始状态可以为节点 v 的输入特征 x(v)\pmb{x}^{(v)}。每个节点可收到来自相邻节点的消息,并更新自己的状态:
在这里插入图片描述
其中 N(v)N(v) 表示节点 v 的邻居,mt(v)\pmb{m}_t^{(v)}表示在第 t 时刻节点 v 收到的信息,e(u,v)\pmb{e}^{(u,v)} 为边e(u,v)e^{(u,v)}上的特征。
  该公式是同步的更新方式,所有结构同时接受信息并更新自己的状态。对有向图,异步更新更有效,如RNN或递归神经网络。整个图更新后T此后,可通过一个读出函数 gg 来得到整个网络的表示:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章