第6章 循环神经网络
经验是智慧之父,记忆是智慧之母.——谚语
在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力.在生物神经网络中,神经元之间的连接关系要复杂得多.前馈神经网络可以看作一个复杂的函数,每次输入都是独立的,即网络的输出 只依赖 于当前的输入.但是在很多现实任务中,网络的输出不仅和当前时刻的输入相关,也和其过去一段时间的输出相关.比如一个有限状态自动机,其下一个时刻的状态(输出)不仅仅和当前输入相关,也和当前状态(上一个时刻的输出)相关.此外,前馈网络难以处理时序数据,比如视频、语音、文本等.时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变.因此,当处理这一类和时序数据相关的问题时,就需要一种能力更强的模型.
循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络.在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构.
循环神经网络的参数学习可以通过随时间反向传播算法 来学习.随时间反向传播算法即按照时间的逆序将错误信息一步步地往前传递.
当输入序列比较长时,会存在梯度爆炸和消失问题,也称为长程依赖问题.为了解决这个问题,人们对循环神经网络进行了很多的改进,其中最有效的改进方式引入门控机制(Gating Mechanism).
此外,循环神经网络可以很容易地扩展到两种更广义的记忆网络模型:递归神经网络和图网络.
6.1 给网络增加记忆能力
为了处理这些时序数据并利用其历史信息, 我们需要让网络具有短期记忆能力.
一般来讲,我们可以通过以下三种方法来给网络增加短期记忆能力.
6.1.1 延时神经网络
加一个延时存储单元。在第t 个时刻,第𝑙 层神经元的活性值依赖于第𝑙 − 1 层神经元的最近𝐾 个时刻的活性值,
一种简单的利用历史信息的方法是建立一个额外的延时单元,用来存储网络的历史信息(可以包括输入、输出、隐状态等).比较有代表性的模型是延时神经网络
延时神经网络是在前馈网络中的非输出层都添加一个延时器,记录神经元的最近几次活性值.在第t 个时刻,第𝑙 层神经元的活性值依赖于第𝑙 − 1 层神经元的最近𝐾 个时刻的活性值,即
ht(l)=f(ht(l−1),ht−1(l−1),⋯,ht−k(l−1))
6.1.2 有外部输入的非线性自回归模型
自回归模型(AutoRegressive Model,AR)是统计学上常用的一类时间序列模型,用一个变量yt 的历史信息来预测自己.
yt=w0+k=1∑Kwkyt−k+ϵt
- 其中K为超参数
- w0,⋯,wK 为可学习参数
- ϵt∼N(0,σ2) 为第t个时刻的噪声,方差σ2和时间无关.
有外部输入的非线性自回归模型(Nonlinear AutoRegressive with Exogenous Inputs Model,NARX)是自回归模型的扩展,在每个时刻t 都有一个外部输入xt,产生一个输出yt.NARX通过一个延时器 记录 最近Kx 次的外部输入和最近Ky次的输出,第t 个时刻的输出𝒚𝑡 为
yt=f(xt,xt−1,⋯,xt−Kx,yt−1,yt−2,⋯,yt−Ky)
其中𝑓(⋅) 表示非线性函数,可以是一个前馈网络,Kx和Ky为超参数.
6.1.3 循环神经网络
循环神经网络(Recurrent Neural Network,RNN)通过使用带自反馈的神经元,能够处理任意长度的时序数据.
给定一个输入序列x1∶T=(x1,x2,⋯,xt,⋯,xT),循环神经网络通过下面公式更新 带反馈边的 隐藏层的活性值ht:
ht=f(ht−1,xt)
其中h0=0,𝑓(⋅) 为一个非线性函数,可以是一个前馈网络.
图6.1给出了循环神经网络的示例,其中“延时器” 为一个虚拟单元,记录神经元的最近一次(或几次)活性值.
循环神经网络可以看成一个动力系统.隐藏层的活性值ht在很多文献上也称为状态(State)或隐状态(Hidden State).
动力系统(Dynamical System)是一个数学上的概念,指系统状态按照一定的规律随时间变化的系统.具体地讲,动力系统是使用一个函数来描述一个给定空间(如某个物理系统的状态空间)中所有点随时间的变化情况.生活中很多现象(比如钟摆晃动、台球轨迹等)都可以动力系统来描述.
理论上,循环神经网络可以近似任意的非线性动力系统.前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序.
6.2 简单循环网络
简单循环网络一个非常简单的循环神经网络,只有一个隐藏层的神经网络.在一个两层的前馈神经网络中,连接存在于相邻的层与层之间,同一隐藏层的节点之间是无连接的.而简单循环网络增加了隐藏层之间的反馈连接.
令向量xt∈RM 表示在时刻t时网络的输入,ht∈RD 表示隐藏层状态(即隐藏层神经元活性值),则ht不仅和当前时刻的输入xt 相关,也和上一个时刻的隐藏层状态ht−1 相关.简单循环网络在时刻t的更新公式为
zt=Uht−1+Wxt+b,
ht=f(zt)
- 其中zt为隐藏层的净输入
- U∈RD×D为状态-状态权重矩阵
- W∈RD×M 为状态-输入权重矩阵
- b∈RD 为偏置向量
- f(⋅) 是非线性激活函数,通常为Logistic函数或Tanh 函数
上述公式通常表示为
ht=f(Uht−1+Wxt+b)
如果我们把每个时刻的状态都看作前馈神经网络的一层,循环神经网络可以看作在时间维度上权值共享的神经网络.图6.2给出了按时间展开的循环神经网络.
6.2.1 循环神经网络的计算能力
6.2.1.1 循环神经网络的通用近似定理
循环神经网络的拟合能力也十分强大.一个完全连接的循环网络是任何非线性动力系统的近似器.
6.2.1.2 图灵完备
图灵机是一种抽象的信息处理装置,可以用来解决所有的可计算问题
图灵完备(Turing Completeness)是指一种数据操作规则,比如一种计算机编程语言,可以实现图灵机(Turing Machine)的所有功能,解决所有的可计算问题.
因此,一个完全连接的循环神经网络可以近似解决所有的可计算问题.
6.3 应用到机器学习
循环神经网络可以应用到很多不同类型的机器学习任务.
根据这些任务的特点可以分为以下几种模式:
- 序列到类别模式
- 同步的序列到序列模式
- 异步的序列到序列模式
6.3.1 序列到类别模式
序列到类别模式主要用于序列数据的分类问题:输入为序列,输出为类别.比如在文本分类中,输入数据为单词的序列,输出为该文本的类别.
假设一个样本 x1∶T=(x1,⋯,xT) 为一个长度为T的序列,输出为一个类别 y∈(1,⋯,C).我们可以将样本x 按不同时刻输入到循环神经网络中,并得到不同时刻的隐藏状态h1,⋯,hT.我们可以将hT 看作整个序列的最终表示(或特征),并输入给分类器g(.) 进行分类(如图6.3a所示),即
除了将最后时刻的状态作为整个序列的表示之外,我们还可以对整个序列的所有状态进行平均,并用这个平均状态来作为整个序列的表示(如图6.3b所示),即
y^=g(T1t=1∑Tht)
6.3.2 同步的序列到序列模式
同步的序列到序列模式主要用于序列标注(Sequence Labeling)任务,即每一时刻都有输入和输出,输入序列和输出序列的长度相同.比如在词性标注(Part-of-Speech Tagging)中,每一个单词都需要标注其对应的词性标签.
在同步的序列到序列模式(如图6.4所示)中,输入为一个长度为T的序列x1∶T=(x1,⋯,xT),输出为序列y1∶T=(y1,⋯,yT).样本𝒙 按不同时刻输入到循环神经网络中,并得到不同时刻的隐状态h1,⋯,hT.每个时刻的隐状态ht代表了当前时刻和历史的信息,并输入给分类器g(.)得到当前时刻的标签y^t,即
6.3.3 异步的序列到序列模式
异步的序列到序列模式也称为编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要有严格的对应关系,也不需要保持相同的长度.比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列.
在异步的序列到序列模式中,输入为长度为T的序列x1∶T=(x1,⋯,xT),输出为长度为M的序列y1:M=(y1,...,yM).
异步的序列到序列模式一般通过先编码 后解码的方式来实现.
- 先将样本𝒙 按不同时刻 输入到一个循环神经网络(编码器)中,并得到其编码hT.
- 然后再使用另一个循环神经网络(解码器),得到输出序列y1∶M.为了建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型.
令f1(⋅)和f2(⋅) 分别为用作编码器和解码器的循环神经网络,则编码器-解码器模型可以写为
6.4 参数学习
循环神经网络的参数可以通过梯度下降方法来进行学习.
以随机梯度下降为例,给定一个训练样本(x,y),其中x1:T=(x1,...,xT)为长度是𝑇 的输入序列,𝑦1∶𝑇 = (𝑦1, ⋯ , 𝑦𝑇 ) 是长度为𝑇 的标签序列.即在每个时刻t,都有一个监督信息yt,我们定义时刻t的损失函数为
Lt=L(yt,g(ht))
- 其中g(ht)为第t时刻的输出,
- L为可微分的损失函数,比如交叉熵.
那么整个序列的损失函数为
L=t=1∑TLt
整个序列的损失函数L关于参数U的梯度为
δUδL=t=1∑TδUδLt
即每个时刻损失Lt对参数U的偏导数之和
在循环神经网络中主要有两种计算梯度的方式:
- 随时间反向传播(BPTT)算法
- 实时循环学习(RTRL)算法
6.4.1 随时间反向传播算法
随时间反向传播(BackPropagation Through Time,BPTT)算法的主要思想是通过类似前馈神经网络的错误反向传播算法来计算梯度.
BPTT 算法将循环神经网络看作一个展开的多层前馈网络,
- 其中“每一层”对应循环网络中的“每个时刻”(见图6.2).
- 这样,循环神经网络就可以按照前馈网络中的反向传播算法计算参数梯度.
- 在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是所有“展开层”的参数梯度之和.
6.4.1.1 计算偏导数δUδLt
因为参数U和隐藏层在每个时刻k(1≤k≤t) 的净输入zk=Uhk−1+Wxk+b有关,因此第t时刻的损失函数Lt关于参数ui,j的梯度为:
δui,jδLt=k=1∑tδui,jδ+ztδztδLt(6.31)
定义误差项δt,k=δzkδLt为第t时刻的损失对第k时刻隐藏神经层的净输入zk的导数,则当1≤k≤t时
下图给出了误差项 随时间进行反向传播算法的示例.
6.4.1.2 参数梯度
整个序列的损失函数L关于参数U的梯度
δUδL=t=1∑Tk=1∑tδt,khk−1T
同理可得,L关于权重W和偏置b的梯度为
δWδL=t=1∑Tk=1∑tδt,kxkT
δbδL=t=1∑Tk=1∑tδt,k
6.4.1.3 计算复杂度
在BPTT 算法中,参数的梯度需要在一个完整的**“前向”计算和“反向”计算**后才能得到并进行参数更新.
6.4.2 实时循环学习算法
与反向传播的BPTT 算法不同的是,实时循环学习(Real-Time Recurrent Learning,RTRL)是通过前向传播的方式来计算梯度
假设循环神经网络中第t+1时刻的状态ht+1为
ht+1=f(zt+1)=f(Uht+Wxt+1+b)
其关于参数ui,j的偏导数为
RTRL 算法从第1个时刻开始,除了计算循环神经网络的隐状态之外,还利用公式(6.45) 依次前向计算偏导数δui,jδh1、δui,jδh2
、δui,jδh3,…
这样,假设第t个时刻存在一个监督信息,其损失函数为Lt,就可以同时计算损失函数对ui,j的偏导数
δui,jLt=δui,jδhtδhtδLt
这样在第t时刻,可以实时地计算损失Lt关于参数U的梯度,并更新参数.参数W和b的梯度也可以同样按上述方法实时计算.
6.4.3 两种算法的比较
RTRL算法和BPTT算法都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则来计算梯度.
- 在循环神经网络中,一般网络输出维度远低于输入维度,因此BPTT 算法的计算量会更小,但是BPTT 算法需要保
存所有时刻的中间梯度,空间复杂度较高.
- RTRL 算法不需要梯度回传,因此非常适合用于需要在线学习或无限序列的任务中.
6.5 长程依赖问题
循环神经网络在学习过程中的主要问题是由于梯度消失或爆炸问题,很难建模长时间间隔(Long Range)的状态之间的依赖关系.
在BPTT 算法中,将公式(6.36)
展开得到
如果定义$ \gamma \cong ||diag(f’(\boldsymbol z _{\tau} )U^T||$,则
δt,k≅γt−kδt,t
- 若𝛾 > 1,当𝑡 − 𝑘 → ∞ 时,γt−k→∞.当间隔𝑡 − 𝑘 比较大时,梯度也变得很大,会造成系统不稳定,称为梯度爆炸问题(Gradient Exploding Problem).
- 相反,若𝛾 < 1,当𝑡 − 𝑘 → ∞ 时,γt−k→0.当间隔𝑡 − 𝑘 比较大时,梯度也变得非常小,会出现和深层前馈神经网络类似的梯度消失问题(Vanishing Gradient Problem)
要注意的是,在循环神经网络中的梯度消失不是说δUδLt的梯度消失了,而是δhkδLt的梯度消失了(当间隔t−k比较大时).也就是说,参数𝑼 的更新主要靠当前时刻t的几个相邻状态hk来更新,长距离的状态对参数U没有影响.
由于循环神经网络经常使用非线性激活函数为Logistic 函数或Tanh 函数作为非线性激活函数,其导数值都小于1,并且权重矩阵‖U‖也不会太大,因此如果时间间隔t−k过大,δt,k会趋向于0,因而经常会出现梯度消失问题.
虽然简单循环网络理论上可以建立长时间间隔的状态之间的依赖关系,但是由于梯度爆炸或消失问题,实际上只能学习到短期的依赖关系.
这样,如果时刻t的输出yt依赖于时刻k的输入xk,当间隔t−k比较大时,简单神经网络很难建模这种长距离的依赖关系,称为长程依赖问题(Long-Term Dependencies Problem).
6.5.1 改进方案
比较有效的方式是通过改进模型或优化方法来缓解循环网络的梯度爆炸和梯度消失问题.
6.5.1.1 梯度爆炸的改进
一般而言,循环网络的梯度爆炸问题比较容易解决,一般通过权重衰减或梯度截断来避免.
权重衰减是通过给参数增加l1或l2范数的正则化项来限制参数的取值范围,从而使得𝛾 ≤ 1.
梯度截断是另一种有效的启发式方法,当梯度的模大于一定阈值时,就将它截断成为一个较小的数.
6.5.1.2 梯度消失的改进
梯度消失是循环网络的主要问题.除了使用一些优化技巧外,更有效的方式就是改变模型
可以将ht=f(Uht−1+Wxt+b)中的U=I,同时令δht−1δht=I为单位矩阵,即
ht=ht−1+g(xt;θ)
- ht和ht−1之间为线性依赖关系,且权重系数为1,这样就不存在梯度爆炸或消失问题.
- 但是,这种改变也丢失了神经元在反馈边上的非线性激活的性质,因此也降低了模型的表示能力.
为了避免这个缺点,我们可以采用一种更加有效的改进策略:
ht=ht−1+g(xt;ht−1;θ)
这样ht和ht−1之间为既有线性关系,也有非线性关系,并且可以缓解梯度消失问题.
但这种改进依然存在两个问题:
- 梯度爆炸问题
- 记忆容量问题:随着ht不断累积存储新的输入信息,会发生饱和现象.假设g(.)为Logistic 函数,则随着时间t的增长,ht会变得越来越大,从而导致h变得饱和.也就是说,隐状态ht可以存储的信息是有限的,随着记忆单元存储的内容越来越多,其丢失的信息也越来越多.
logistic函数
6.6 基于门控的循环神经网络
为了改善循环神经网络的长程依赖问题, 一种非常好的解决方案是在公式(6.50)的基础上引入门控机制来控制信息的累积速度,包括有选择地加入新的信息,并有选择地遗忘之前累积的信息
主要介绍两种基于门控的循环神经网络:
- 长短期记忆网络(LSTM)
- 门控循环单元网络(GRU)
6.6.1 长短期记忆网络
在公式ht=ht−1+g(xt;ht−1;θ)的基础上,LSTM 网络主要改进在以下两个方面
6.6.1.1 新的内部状态
LSTM 网络引入一个新的内部状态(internal state)ct∈RD.内部状态ct通过下面公式计算:
ct=ft⊙ct−1+it⊙c^t
ht=ot⊙tanh(ct)
- 其中ft∈[0,1]D、it∈[0,1]D、ot∈[0,1]D为三个门(gate)来控制信息传递的路径。
- ⊙为向量元素乘积;
- ct−1为上一时刻的记忆单元;
- c^t∈RD是通过非线性函数得到的候选状态:c^t=tanh(Ucht−1+Wcxt+bc)
在每个时刻t,LSTM网络的内部状态ct记录了到当前时刻为止的历史信息.
6.6.1.2 门控机制
在数字电路中,门(gate)为一个二值变量{0,1},0 代表关闭状态,不许任何信息通过;1 代表开放状态,允许所有信息通过.
LSTM 网络引入门控机制(Gating Mechanism)来控制信息传递的路径.公式(6.51) 和公式(6.52) 中三个“门”分别为输入门it、遗忘门ft和输出门ot.这三个门的作用为
- 遗忘门ft控制上一个时刻的内部状态ct−1需要遗忘多少信息.
- 输入门it控制当前时刻的候选状态ct有多少信息需要保存.
- 输出门ot 控制当前时刻的内部状态ct有多少信息需要输出给外部状态ht.
例如:
- 当ft=0,it=1时,记忆单元将历史信息清空,并将候选状态向量c^t写入.
- 当ft=1,it=0时,记忆单元将复制上一时刻的内容,不写入新的信息.
LSTM 网络中的“门”是一种**“软”门**,取值在(0, 1) 之间,表示以一定的比例允许信息通过.
三个门的计算方式为:
it=σ(Uiht−1+Wixt+bi)
ft=σ(Ufht−1+Wfxt+bf)
ot=σ(Uoht−1+Woxt+bo)
- 其中𝜎(⋅) 为Logistic 函数,其输出区间为(0, 1),
- 𝒙𝑡 为当前时刻的输入,
- 𝒉𝑡−1 为上一时刻的外部状态.
下图给出了 LSTM 网络的循环单元结构,其计算过程为:
- 首先利用上一时刻的外部状态ht−1和当前时刻的输入xt,计算出三个门,以及候选状态c^t;
- 结合遗忘门ft和输入门it来更新记忆单元ct;
- 结合输出门it,将内部状态的信息传递给外部状态ht.
6.6.2 LSTM网络的各种变种
6.6.2.1 无遗忘门的LSTM 网络
最早提出的LSTM 网络是没有遗忘门的,其内部状态的更新为
ct=ct−1+it⊙c^t
记忆单元𝒄 会不断增大.当输入序列的长度非常大时,记忆单元的容量会饱和,从而大大降低LSTM 模型的性能.
6.6.2.2 peephole 连接
另外一种变体是三个门不但依赖于输入xt 和上一时刻的隐状态ht−1,也依赖于上一个时刻的记忆单元ct−1,即
it=σ(Uiht−1+Wixt+Vict−1+bi)
ft=σ(Ufht−1+Wfxt+Vfct−1+bf)
ot=σ(Uoht−1+Woxt+Voct−1+bo)
6.6.2.2 将输入门和遗忘门耦合
LSTM 网络中的输入门和遗忘门有些互补关系,因此同时用两个门比较冗余.为了减少LSTM 网络的计算复杂度,将这两门合并为一个门.令ft=1−it,内部状态的更新方式为
ct=(1−it)⊙ct−1+it⊙c^t
6.6.3 门控循环单元网络(Gated Recurrent Unit,GRU)
GRU 网络引入门控机制来控制信息更新的方式.和LSTM 不同,GRU 不引入额外的记忆单元,GRU 网络也是在公式ht=ht−1+g(xt,ht−1;θ)的基础上引入一个更新门(Update Gate)来控制当前状态需要从历史状态中保留多少信息,以及需要从候选状态中接受多少新信息,即
ht=zt⊙ht−1+(1−zt)⊙g(xt,ht−1;θ)
其中zt∈[0,1]D为更新门:
zt=σ(Wzxt+Uzht−1+bz)
在LSTM 网络中,输入门和遗忘门是互补关系,具有一定的冗余性.GRU 网络直接使用一个门来控制输入和遗忘之间的平衡.
- 当zt=0时,当前状态ht和前一时刻的状态ht−1之间为非线性函数关系;
- 当zt=0时,ht和ht−1之间为线性函数关系.
在GRU 网络中,函数$g(\boldsymbol x_t, \boldsymbol h_{t-1}; \theta) $的定义为
h^t=g(xt,ht−1;θ)=tanh(Whxt+Uh(rt⊙ht−1)+bn)
- 其中h^t表示当前时刻的候选状态
- rt∈[0,1]D为重置门:$\boldsymbol r_t =\sigma(W_r \boldsymbol x_t + U_r \boldsymbol h_{t-1} + \boldsymbol b_r) $
rt用来控制候选状态h^t的计算是否依赖上一时刻的状态h^t−1
- 当rt=0时,候选状态h^t=tanh(Whxt+bn),即只和当前输入xt相关,和历史状态无关.
- 当rt=1时,候选状态h^t=tanh(Whxt+Uhht−1+bn)和当前输入𝒙𝑡 以及历史状态𝒉𝑡−1 相关,和简单循环网络一致.
下图给出了GRU 网络的循环单元结构.
6.7 深层循环神经网络
如果将深度定义为网络中信息传递路径长度的话,循环神经网络可以看作**既“深”又“浅”**的网络.
- 一方面来说,如果我们把循环网络按时间展开,长时间间隔的状态之间的路径很长,循环网络可以看作一个非常深的网络.
- 从另一方面来说,如果同一时刻网络输入到输出之间的路径xt→yt,这个网络是非常浅的.
因此,我们可以增加循环神经网络的深度从而增强循环神经网络的能力.增加循环神经网络的深度主要是增加同一时刻网络输入到输出之间的路径xt→yt,
- 比如增加隐状态到输出ht→yt
- 以及输入到隐状态xt→ht之间的路径的深度
6.7.1 堆叠循环神经网络
一种常见的增加循环神经网络深度的做法是将多个循环网络堆叠起来,称为堆叠循环神经网络(Stacked Recurrent Neural Network,SRNN).
下图给出了按时间展开的堆叠循环神经网络.第l层网络的输入是第l−1层网络的输出.我们定义ht(l)为在时刻t时第l层的隐状态
ht(l)=f(U(l)ht−1(l)+W(l)ht(l−1)+b(l))
其中U(l)、W(l)和b(l)为权重矩阵和偏置向量,ht(0)=xt
6.7.2 双向循环神经网络
在有些任务中,一个时刻的输出不但和过去时刻的信息有关,也和后续时刻的信息有关.
比如给定一个句子,其中一个词的词性由它的上下文决定,即包含左右两边的信息.
因此,在这些任务中,我们可以增加一个按照时间的逆序来传递信息的网络层,来增强网络的能力.
双向循环神经网络(Bidirectional Recurrent Neural Network,Bi-RNN)由两层循环神经网络组成,它们的输入相同,只是信息传递的方向不同.
假设第1 层按时间顺序,第2 层按时间逆序,在时刻t时的隐状态定义为ht(1)和ht(2) ,则
ht(1)=f(U(1)ht−1(1)+W(1)xt+b(1))
ht(2)=f(U(2)ht+1(2)+W(2)xt+b(2))
ht=ht(1)⊕ht(2)
其中⊕为向量拼接操作.
下图给出了按时间展开的双向循环神经网络.
6.8 扩展到图结构
如果将循环神经网络 按时间展开,每个时刻的隐状态ht看作一个节点,那么这些节点构成一个链式结构,每个节点t都收到其父节点的消息(Message),更新自己的状态,并传递给其子节点.而链式结构是一种特殊的图结构,我们可以比较容易地将这种消息传递(Message Passing)的思想扩展到任意的图结构上.
6.8.1 递归神经网络
递归神经网络(Recursive Neural Network,RecNN)是循环神经网络在有向无循环图上的扩展
递归神经网络的一般结构为树状的层次结构,如图6.11a所示.
递归神经网络主要用来建模自然语言句子的语义[Socher et al., 2011, 2013].给定一个句子的语法结构(一般为树状结构),可以使用递归神经网络来按照句法的组合关系来合成一个句子的语义.句子中每个短语成分又可以分成一些子成分,即每个短语的语义都可以由它的子成分语义组合而来,并进而合成整句的语义.
对于一个节点hi,它可以接受来自父节点集合πi中所有节点的消息,并更新自己的状态.
hi=f(hπi)
- 其中hπi表示集合πi中所有节点状态的拼接
- f(.)是一个和节点位置无关的非线性函数,可以为一个单层的前馈神经网络
比如上图所示的递归神经网络具体可以写为
- 其中σ(.)表示非线性激活函数
- W和b是可学习的参数.
同样,输出层𝑦 可以为一个分类器
y=g(W′h3+b′)
同样,我们也可以用门控机制来改进递归神经网络中的长距离依赖问题,比如树结构的长短期记忆模型就是将LSTM 模型的思想应用到树结构的网络中,来实现更灵活的组合函数.
6.8.2 图神经网络
在实际应用中,很多数据是图结构的,比如知识图谱、社交网络、分子网络等.而前馈网络和反馈网络很难处理图结构的数据.
图神经网络(Graph Neural Network,GNN)是将消息传递的思想扩展到图结构数据上的神经网络.
对于一个任意的图结构G(v,ε),
- 其中𝒱 表示节点集合,ℰ 表示边集合.
- 每条边表示两个节点之间的依赖关系.
- 节点之间的连接可以是有向的,也可以是无向的.
- 图中每个节点𝑣 都用一组神经元来表示其状态𝒉(𝑣),初始状态可以为节点𝑣的输入特征𝒙(𝑣).
- 每个节点可以收到来自相邻节点的消息,并更新自己的状态.
mt(v)=u∈N(v)∑f(ht−1(v),ht−1(u),e(e,v))
ht(v)=g(ht−1(v),mt(v))
- 𝒩(𝑣) 表示节点𝑣 的邻居集合
- mt(v)表示在第t时刻节点v收到的信息
- e(u,v)为边e(u,v)上的特征.
在整个图更新T次后,可以通过一个读出函数(Readout Function)g(.)来得到整个网络的表示:
ot=g({hT(v)∣v∈V})