在前面的文章中,咱们介绍了循环神经网络,它能够用来处理包含序列结构的信息。然而,除此以外,信息每每还存在着诸如树结构、图结构等更复杂的结构。对于这种复杂的结构,循环神经网络就无能为力了。本文介绍一种更为强大、复杂的神经网络:递归神经网络 (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
接下来,咱们详细介绍一下递归神经网络是如何处理树/图结构的信息的。在这里,咱们以处理树型信息为例进行介绍。
递归神经网络的输入是两个子节点(也能够是多个),输出就是将这两个子节点编码后产生的父节点,父节点的维度和每一个子节点是相同的。以下图所示:
在上式中,tanh是激活函数(固然也能够用其它的激活函数),
而后,咱们把产生的父节点的向量和其余子节点的向量再次做为网络的输入,再次产生它们的父节点。如此递归下去,直至整棵树处理完毕。最终,咱们将获得根节点的向量,咱们能够认为它是对整棵树的表示,这样咱们就实现了把树映射为一个向量。在下图中,咱们使用递归神经网络处理一棵树,最终获得的向量
举个例子,咱们使用递归神将网络将『两个外语学校的学生』映射为一个向量,以下图所示:
最后获得的向量
式1就是递归神经网络的前向计算算法。它和全链接神经网络的计算没有什么区别,只是在输入的过程当中须要根据输入的树结构依次输入每一个子节点。
须要特别注意的是,递归神经网络的权重
递归神经网络的训练算法和循环神经网络相似,二者不一样之处在于,前者须要将残差
下面,咱们介绍适用于递归神经网络的训练算法,也就是BPTS算法。
首先,咱们先推导将偏差从父节点传递到子节点的公式,以下图:
定义
设
在上述式子里,
在上面的公式中,
有了上式,咱们就能够把它表示为矩阵形式,从而获得一个向量化表达:
其中,矩阵
上式看上去可能会让人晕菜,从下图,咱们能够直观的看到
显然,子矩阵
也就是说,将偏差项反向传递到相应子节点
如今,咱们设
这样,咱们获得:
若是咱们将不一样子节点
式2就是将偏差项从父节点传递到其子节点的公式。注意,上式中的
有了传递一层的公式,咱们就不难写出逐层传递的公式。
上图是在树型结构中反向传递偏差项的全景图,反复应用式2,在已知
在上面的公式中,
根据加权输入的计算公式:
其中,
那么,咱们能够求得偏差函数在第l层对权重的梯度为:
上式是针对一个权重项
式3就是第l层权重项的梯度计算公式。咱们知道,因为权重
由于循环神经网络的证实过程已经在零基础入门深度学习(4) - 卷积神经网络一文中给出,所以,递归神经网络『为何最终梯度是各层梯度之和』的证实就留给读者自行完成啦。
接下来,咱们求偏置项
把上式扩展为矩阵的形式: