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


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

1. 给网络增加记忆能力

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

1.1 延时神经网络

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

h t ( l ) = f ( h t ( l − 1 ) , h t − 1 ( l − 1 ) , ⋅ ⋅ ⋅ , h t − K ( l − 1 ) ) \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)}) hhht(l)=f(hhht(l1),hhht1(l1),,hhhtK(l1))

其中 h t ( l ) ∈ R M l \pmb{h}_t^{(l)} \in \mathbb{R}^{ \pmb{M}_l } hhht(l)RMMMl 表示第 l l l 层神经元在时刻 t t t 的活性值, M l M_l Ml 为第 l l l 层神经元的数量。前馈神经网络的活性值:

a ( l ) = f l ( W ( l ) a ( l − 1 ) + b ( l ) ) \pmb{a}^{(l)} = f_l(\pmb{W}^{(l)}\pmb{a}^{(l-1)} + \pmb{b}^{(l)}) aaa(l)=fl(WWW(l)aaa(l1)+bbb(l))

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

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

y t = w 0 + ∑ k = 1 K w k y t − k + ϵ t \pmb{y}_t = w_0 + \sum_{k=1}^K w_k \pmb{y}_{t-k} + \epsilon_t yyyt=w0+k=1Kwkyyytk+ϵt

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

有外部输入的自回归模型 (Nonlinear AutoRegressive with Exogenous Inputs Model,NARX),在每个时刻 t t t 都有一个外部输入 x t \pmb{x}_t xxxt, 产生一个输出 y t \pmb{y}_t yyyt, NARX 通过一个延时器记录最近 K x K_x Kx次的外部输入和最近 K y K_y Ky次的输出,第 t t t 个时刻的输出 y t \pmb{y}_t yyyt为:

y t = f ( x t , x t − 1 , ⋅ ⋅ ⋅ , x t − K x , y t − 1 , y t − 2 , ⋅ ⋅ ⋅ , y t − K y ) \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}) yyyt=f(xxxt,xxxt1,,xxxtKx,yyyt1,yyyt2,,yyytKy)

其中 f ( ⋅ ) f(\cdot) f() 表示非线性函数,可以前馈网络, K x K_x Kx K y K_y Ky 为超参数。

1.3 循环神经网络

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

h t = f ( h t − 1 , x t ) \pmb{h}_t = f(\pmb{h}_{t-1}, \pmb{x}_t) hhht=f(hhht1,xxxt)

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

2. 简单循环网络

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

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

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

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

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

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

2.1.2 图灵完备

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

3. 应用到机器学习

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

3.1 序列到类别模式

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

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

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

y ^ = g ( 1 T ∑ t = 1 T h t ) \hat{y} = g(\frac{1}{T}\sum_{t=1}^{T}\pmb{h}_t) y^=g(T1t=1Thhht)

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

3.2 同步的序列到序列模式

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

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

在这里插入图片描述

3.3 异步的序列到序列模式

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

4. 参数学习

   可用梯度下降学习RNN中的参数。以随机梯度下降为例。给定样本 ( x , y ) (\pmb{x}, \pmb{y}) (xxx,yyy) ,其中输入为 x 1 : T = ( x 1 , x 2 , . . . , x T ) \pmb{x}_{1:T} = (\pmb{x_1}, \pmb{x_2}, ..., \pmb{x_T}) xxx1:T=(x1x1x1,x2x2x2,...,xTxTxT),输出为 y 1 : T = ( y 1 , y 2 , . . . , x T ) \pmb{y}_{1:T} = (\pmb{y_1}, \pmb{y_2}, ... ,\pmb{x_T}) yyy1:T=(y1y1y1,y2y2y2,...,xTxTxT) 每个时刻t,都有一个监督信息 y t y_t yt ,定义时刻 t 的损失函数为:

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

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

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

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

∂ L ∂ U = ∑ t = 1 T ∂ L t ∂ U \frac{\partial{L}}{\partial{\pmb{U}}} = \sum_{t=1}^{T}\frac{\partial{L}_t}{\partial{\pmb{U}}} UUUL=t=1TUUULt

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

4.1 随时间反向传播算法

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

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

4.2 实时循环学习算法

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

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

5. 长程依赖问题

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

5.1 改进方案

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

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

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

h t = h t − 1 + g ( x t ; θ ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t; \theta) hhht=hhht1+g(xxxt;θ)

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

h t = h t − 1 + g ( x t , h t − 1 ; θ ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) hhht=hhht1+g(xxxt,hhht1;θ)

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

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

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

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

h t = h t − 1 + g ( x t , h t − 1 ; θ ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) hhht=hhht1+g(xxxt,hhht1;θ)

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

6.1 长短期记忆网络(LSTM)

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

h t = h t − 1 + g ( x t , h t − 1 ; θ ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) hhht=hhht1+g(xxxt,hhht1;θ)

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

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

  • f t ∈ [ 0 , 1 ] D \pmb{f}_t \in [0,1]^D ffft[0,1]D为遗忘门,控制上一个时刻的内部状态 c t − 1 \pmb{c}_{t-1} ccct1 需要遗忘多少信息。
  • i t ∈ [ 0 , 1 ] D \pmb{i}_t \in [0,1]^D iiit[0,1]D为输入门,控制当前时刻的候选状态 c ^ t \hat{\pmb{c}}_t ccc^t 需要保存多少信息。
  • o t ∈ [ 0 , 1 ] D \pmb{o}_t \in [0,1]^D ooot[0,1]D为输出门,控制当前时刻的内部状态 c t \pmb{c}_t ccct 有多少信息需要输出给外部状态 h t \pmb{h}_t hhht

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

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

  1. 利用上一时刻的外部状态 h t − 1 \pmb{h}_{t-1} hhht1 和当前时刻的输入 x t \pmb{x}_t xxxt ,计算出三个门 f t \pmb{f}_t ffft i t \pmb{i}_t iiit o t \pmb{o}_t ooot,和候选状态 c ^ t \pmb{\hat{c}}_t c^c^c^t
  2. 结合遗忘门 f t \pmb{f}_t ffft、输入门 i t \pmb{i}_t iiit 更新记忆单元 c t \pmb{c}_t ccct
  3. 结合输出门 o t \pmb{o}_t ooot ,将内部状态的信息传递给外部状态 h t \pmb{h}_{t} hhht

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

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

6.2 LSTM网络的各种变体

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

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

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

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

6.3 门控循环单元网络

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

h t = h t − 1 + g ( x t , h t − 1 ; θ ) \pmb{h}_t = \pmb{h}_{t-1} + g(\pmb{x}_t, \pmb{h}_{t-1}; \theta) hhht=hhht1+g(xxxt,hhht1;θ)

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

h t = z t ⨀ h t − 1 + ( 1 − z t ) ⨀ g ( x t , h t − 1 ; θ ) z t = σ ( W z x t + U z h t − 1 + b z ) \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) hhht=zzzthhht1+(1zzzt)g(xxxt,hhht1;θ)zzzt=σ(WWWzxxxt+UUUzhhht1+bbbz)

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

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

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

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

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

  • r t = 0 \pmb{r}_t = 0 rrrt=0时,候选状态 h ^ t = t a n h ( W c x t + b ) \pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{b} ) h^th^th^t=tanh(WWWcxxxt+bbb) 只和当前输入 x t \pmb{x}_t xxxt 相关,和历史状态无关。
  • r t = 1 \pmb{r}_t = 1 rrrt=1时,候选状态 h ^ t = t a n h ( W c x t + U h h t − 1 + b ) \pmb{\hat{h}_t} = tanh(\pmb{W}_c\pmb{x}_t + \pmb{U}_h\pmb{h}_{t-1} +\pmb{b} ) h^th^th^t=tanh(WWWcxxxt+UUUhhhht1+bbb) 和当前输入 x t \pmb{x}_t xxxt 、历史状态 h t − 1 \pmb{h}_{t-1} hhht1 相关,和简单RNN一致。

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

h t = z t ⨀ h t − 1 + ( 1 − z t ) ⨀ h ^ t \pmb{h}_t = \pmb{z}_t \bigodot \pmb{h}_{t-1} + (1-\pmb{z}_t) \bigodot \pmb{\hat{h}}_t hhht=zzzthhht1+(1zzzt)h^h^h^t

  • z t = 0 , r = 1 \pmb{z}_t = 0,\pmb{r} = 1 zzzt=0rrr=1 时,GRU退化为简单RNN;
  • z t = 0 , r = 0 \pmb{z}_t = 0,\pmb{r} = 0 zzzt=0rrr=0 时,当前状态 h t \pmb{h}_t hhht 和当前输入 x t \pmb{x}_t xxxt 相关,和历史状态 h t − 1 \pmb{h}_{t-1} hhht1 无关;
  • z t = 1 \pmb{z}_t = 1 zzzt=1 时,当前状态 h t = h t − 1 \pmb{h}_{t} = \pmb{h}_{t-1} hhht=hhht1,和当前输入 x t \pmb{x}_t xxxt 无关。

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

7. 深层循环神经网络

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

7.1 堆叠循环神经网络

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

其中 U ( l ) \pmb{U}^{(l)} UUU(l) W ( l ) \pmb{W}^{(l)} WWW(l) b ( l ) \pmb{b}^{(l)} bbb(l) 为权重矩阵和偏置向量, h t ( 0 ) = x t \pmb{h}_t^{(0)} = \pmb{x}_t hhht(0)=xxxt

7.2 双向循环神经网络

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

8. 拓展到图结构

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

8.1 递归神经网络

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

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

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

8.2 图神经网络

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值