递归神经网络

往期回顾

在前面的文章中,咱们介绍了循环神经网络,它能够用来处理包含序列结构的信息。然而,除此以外,信息每每还存在着诸如树结构、图结构等更复杂的结构。对于这种复杂的结构,循环神经网络就无能为力了。本文介绍一种更为强大、复杂的神经网络:递归神经网络 (Recursive Neural Network, RNN),以及它的训练算法BPTS (Back Propagation Through Structure)。顾名思义,递归神经网络(巧合的是,它的缩写和循环神经网络同样,也是RNN)能够处理诸如树、图这样的递归结构。在文章的最后,咱们将实现一个递归神经网络,并介绍它的几个应用场景。算法

递归神经网络是啥

由于神经网络的输入层单元个数是固定的,所以必须用循环或者递归的方式来处理长度可变的输入。循环神经网络实现了前者,经过将长度不定的输入分割为等长度的小块,而后再依次的输入到网络中,从而实现了神经网络对变长输入的处理。一个典型的例子是,当咱们处理一句话的时候,咱们能够把一句话看做是词组成的序列,而后,每次向循环神经网络输入一个词,如此循环直至整句话输入完毕,循环神经网络将产生对应的输出。如此,咱们就能处理任意长度的句子了。入下图所示:网络

然而,有时候把句子看作是词的序列是不够的,好比下面这句话『两个外语学院的学生』:ide

上图显示了这句话的两个不一样的语法解析树。能够看出来这句话有歧义,不一样的语法解析树则对应了不一样的意思。一个是『两个外语学院的/学生』,也就是学生可能有许多,但他们来自于两所外语学校;另外一个是『两个/外语学院的学生』,也就是只有两个学生,他们是外语学院的。为了可以让模型区分出两个不一样的意思,咱们的模型必须可以按照树结构去处理信息,而不是序列,这就是递归神经网络的做用。当面对按照树/图结构处理信息更有效的任务时,递归神经网络一般都会得到不错的结果。函数

递归神经网络能够把一个树/图结构信息编码为一个向量,也就是把信息映射到一个语义向量空间中。这个语义向量空间知足某类性质,好比语义类似的向量距离更近。也就是说,若是两句话(尽管内容不一样)它的意思是类似的,那么把它们分别编码后的两个向量的距离也相近;反之,若是两句话的意思大相径庭,那么编码后向量的距离则很远。以下图所示:性能

从上图咱们能够看到,递归神经网络将全部的词、句都映射到一个2维向量空间中。句子『the country of my birth』和句子『the place where I was born』的意思是很是接近的,因此表示它们的两个向量在向量空间中的距离很近。另外两个词『Germany』和『France』由于表示的都是地点,它们的向量与上面两句话的向量的距离,就比另外两个表示时间的词『Monday』和『Tuesday』的向量的距离近得多。这样,经过向量的距离,就获得了一种语义的表示。学习

上图还显示了天然语言可组合的性质:词能够组成句、句能够组成段落、段落能够组成篇章,而更高层的语义取决于底层的语义以及它们的组合方式。递归神经网络是一种表示学习,它能够将词、句、段、篇按照他们的语义映射到同一个向量空间中,也就是把可组合(树/图结构)的信息表示为一个个有意义的向量。好比上面这个例子,递归神经网络把句子"the country of my birth"表示为二维向量[1,5]。有了这个『编码器』以后,咱们就能够以这些有意义的向量为基础去完成更高级的任务(好比情感分析等)。以下图所示,递归神经网络在作情感分析时,能够比较好的处理否认句,这是赛过其余一些模型的:优化

在上图中,蓝色表示正面评价,红色表示负面评价。每一个节点是一个向量,这个向量表达了以它为根的子树的情感评价。好比"intelligent humor"是正面评价,而"care about cleverness wit or any other kind of intelligent humor"是中性评价。咱们能够看到,模型可以正确的处理doesn't的含义,将正面评价转变为负面评价。编码

尽管递归神经网络具备更为强大的表示能力,可是在实际应用中并不太流行。其中一个主要缘由是,递归神经网络的输入是树/图结构,而这种结构须要花费不少人工去标注。想象一下,若是咱们用循环神经网络处理句子,那么咱们能够直接把句子做为输入。然而,若是咱们用递归神经网络处理句子,咱们就必须把每一个句子标注为语法解析树的形式,这无疑要花费很是大的精力。不少时候,相对于递归神经网络可以带来的性能提高,这个投入是不太划算的。atom

咱们已经基本了解了递归神经网络是作什么用的,接下来,咱们将探讨它的算法细节。spa

递归神经网络的前向计算

接下来,咱们详细介绍一下递归神经网络是如何处理树/图结构的信息的。在这里,咱们以处理树型信息为例进行介绍。

递归神经网络的输入是两个子节点(也能够是多个),输出就是将这两个子节点编码后产生的父节点,父节点的维度和每一个子节点是相同的。以下图所示:

c1 c2 分别是表示两个子节点的向量, p 是表示父节点的向量。子节点和父节点组成一个全链接神经网络,也就是子节点的每一个神经元都和父节点的每一个神经元两两相连。咱们用矩阵 W 表示这些链接上的权重,它的维度将是 d×2d ,其中, d 表示每一个节点的维度。父节点的计算公式能够写成:

p=tanh(W[c1c2]+b)(1)

在上式中,tanh是激活函数(固然也能够用其它的激活函数), b 是偏置项,它也是一个维度为 d 的向量。若是读过前面的文章,相信你们已经很是熟悉这些计算了,在此不作过多的解释了。

而后,咱们把产生的父节点的向量和其余子节点的向量再次做为网络的输入,再次产生它们的父节点。如此递归下去,直至整棵树处理完毕。最终,咱们将获得根节点的向量,咱们能够认为它是对整棵树的表示,这样咱们就实现了把树映射为一个向量。在下图中,咱们使用递归神经网络处理一棵树,最终获得的向量 p3 ,就是对整棵树的表示:

举个例子,咱们使用递归神将网络将『两个外语学校的学生』映射为一个向量,以下图所示:

最后获得的向量 p3 就是对整个句子『两个外语学校的学生』的表示。因为整个结构是递归的,不只仅是根节点,事实上每一个节点都是以其为根的子树的表示。好比,在左边的这棵树中,向量 p2 是短语『外语学院的学生』的表示,而向量 p1 是短语『外语学院的』的表示。

式1就是递归神经网络的前向计算算法。它和全链接神经网络的计算没有什么区别,只是在输入的过程当中须要根据输入的树结构依次输入每一个子节点。

须要特别注意的是,递归神经网络的权重 W 和偏置项 b 在全部的节点都是共享的。

递归神经网络的训练

递归神经网络的训练算法和循环神经网络相似,二者不一样之处在于,前者须要将残差 δ 从根节点反向传播到各个子节点,然后者是将残差 δ 从当前时刻 tk 反向传播到初始时刻 t1

下面,咱们介绍适用于递归神经网络的训练算法,也就是BPTS算法。

偏差项的传递

首先,咱们先推导将偏差从父节点传递到子节点的公式,以下图:

定义 δp 为偏差函数E相对于父节点 p 的加权输入 netp 的导数,即:

δp=defEnetp

netp 是父节点的加权输入,则

netp=W[c1c2]+b

在上述式子里, netp c1 c2 都是向量,而 W 是矩阵。为了看清楚它们的关系,咱们将其展开:

netp1netp2...netpn=wp1c11wp2c11...wpnc11wp1c12wp2c12wpnc12.........wp1c1nwp2c1nwpnc1nwp1c21wp2c21wpnc21wp1c22wp2c22wpnc22.........wp1c2nwp2c2nwpnc2nc11c12...c1nc21c22...c2n+b1b2...bn(1)

在上面的公式中, pi 表示父节点p的第i个份量; c1i 表示 c1 子节点的第i个份量; c2i 表示 c2 子节点的第i个份量; wpicjk 表示子节点 cj 的第k个份量到父节点p的第i个份量的的权重。根据上面展开后的矩阵乘法形式,咱们不难看出,对于子节点 cjk 来讲,它会影响父节点全部的份量。所以,咱们求偏差函数E对 cjk 的导数时,必须用到全导数公式,也就是:

Ecjk=iEnetpinetpicjk=iδpiwpicjk(2)(3)

有了上式,咱们就能够把它表示为矩阵形式,从而获得一个向量化表达:

Ecj=Ujδp(4)

其中,矩阵 Uj 是从矩阵W中提取部分元素组成的矩阵。其单元为:

ujik=wpkcji

上式看上去可能会让人晕菜,从下图,咱们能够直观的看到 Uj 究竟是啥。首先咱们把W矩阵拆分为两个矩阵 W1 W2 ,以下图所示:

显然,子矩阵 W1 W2 分别对应子节点 c1 c2 的到父节点 p 权重。则矩阵 Uj 为:

Uj=WTj

也就是说,将偏差项反向传递到相应子节点 cj 的矩阵 Uj 就是其对应权重矩阵 Wj 的转置。

如今,咱们设 netcj 是子节点 cj 的加权输入, f 是子节点c的激活函数,则:

cj=f(netcj)(5)

这样,咱们获得:

δcj=Enetcj=Ecjcjnetcj=WTjδpf(netcj)(6)(7)(8)

若是咱们将不一样子节点 cj 对应的偏差项 δcj 链接成一个向量 δc=[δc1δc2] 。那么,上式能够写成:

δc=WTδpf(netc)(2)

式2就是将偏差项从父节点传递到其子节点的公式。注意,上式中的 netc 也是将两个子节点的加权输入 netc1 netc2 连在一块儿的向量。

有了传递一层的公式,咱们就不难写出逐层传递的公式。

上图是在树型结构中反向传递偏差项的全景图,反复应用式2,在已知 δ(3)p 的状况下,咱们不难算出 δ(1)p 为:

δ(2)δ(2)pδ(1)δ(1)p=WTδ(3)pf(net(2))=[δ(2)]p=WTδ(2)pf(net(1))=[δ(1)]p(9)(10)(11)(12)

在上面的公式中, δ(2)=[δ(2)cδ(2)p] [δ(2)]p 表示取向量 δ(2) 属于节点p的部分。

权重梯度的计算

根据加权输入的计算公式:

net(l)p=Wc(l)+b

其中, net(l)p 表示第l层的父节点的加权输入, c(l) 表示第l层的子节点。 W 是权重矩阵, b 是偏置项。将其展开可得:

netlpj=iwjicli+bj

那么,咱们能够求得偏差函数在第l层对权重的梯度为:

Ew(l)ji=Enet(l)pjnet(l)pjw(l)ji=δ(l)pjc(l)i(13)(14)

上式是针对一个权重项 wji 的公式,如今须要把它扩展为对全部的权重项的公式。咱们能够把上式写成矩阵的形式(在下面的公式中,m=2n):

EW(l)=Ew(l)11Ew(l)21...Ew(l)n1Ew(l)12Ew(l)22Ew(l)n2.........Ew(l)1mEw(l)2mEw(l)nm=δ(l)p1cl1δ(l)p2cl1...δ(l)pncl1δ(l)p1cl2δ(l)p2cl2δ(l)pnlcl2.........δlp1c(l)mδlp2c(l)mδlpnc(l)m=δ(l)(c(l))T(3)(15)(16)(17)

式3就是第l层权重项的梯度计算公式。咱们知道,因为权重 W 是在全部层共享的,因此和循环神经网络同样,递归神经网络的最终的权重梯度是各个层权重梯度之和。即:

EW=lEW(l)(4)

由于循环神经网络的证实过程已经在零基础入门深度学习(4) - 卷积神经网络一文中给出,所以,递归神经网络『为何最终梯度是各层梯度之和』的证实就留给读者自行完成啦。

接下来,咱们求偏置项 b 的梯度计算公式。先计算偏差函数对第l层偏置项 b(l) 的梯度:

Eb(l)j=Enet(l)pjnet(l)pjb(l)j=δ(l)pj(18)(19)

把上式扩展为矩阵的形式:

Eb(l)=Eb
相关文章
相关标签/搜索