除了序列标注问题,句子对匹配问题
也是NLP中非常常见的一类问题,即所谓的“句子对匹配”,即给定两个句子S1和S2,任务目标是判断两个句子是否具有某种类型的关系。如果正式定义这个问题,可以理解如下:
这意味着给定两个句子,需要学习一个映射函数,输入的是一对两句话,映射函数转换后,输出的是任务分类标签集合中的某种类型的标签。既然我们要讲的是深度学习,映射函数F就是由神经网络映射的,标签集中分类标签的具体含义与任务有关。
一个典型的例子是释义任务,它确定两个句子在语义上是否等效,因此它的分类标签集是 {等价,不等价} 的二进制集。另外,还有很多其他类型的任务属于句子对匹配,比如问答系统,就是判断两个句子是一问一是答关系,这样的任务还有很多,关键是看你如何理解一个任务的目标。
今天我们主要讲的是,如果用RNN来构造这个映射函数F,那么神经网络的结构应该怎么设计呢?虽然标题说“共同”,但关于这个主题的文献很少。我将使用RNN解决句子对匹配的神经网络结构抽象为三种类型的情况,这些情况也相对容易想到。当然,这里需要注意的是,虽然我们在这里谈论的是RNN,但它代表了LSTM、GRU和多层深度网络等各种变体,为了方便起见,这里使用RNN来指代它。
|RNN网络结构一
图1.RNN网络结构一
图 1 显示了一个最容易想到的 RNN 网络,对于两个句子,分别设置一个 RNN 或深度 LSTM
或双向深度LSTM等,每个RNN的目的是提取句子的特征,然后将两个句子提取的特征拼接到上层MLP多层神经网络的输入层中,通过MLP的隐藏层使两个句子产生非线性映射关系,最后通过SoftMax分类层给出最终的分类结果。
这样,通过两个RNN实现对两个句子是否具有一定关系做出分类判断的决策,并可以利用训练数据获得网络参数,然后利用神经网络对真实任务进行分类。
|RNN网络结构二
图2 RNN网络结构二
图 2 显示了结构 2 的通用体系结构。它是将两个句子S和T拼接起来匹的结构,中间用一个特殊的分隔符EOS将它们分开,其中EOS不代表一个句子的结尾,而是代表两个句子的分离符号,这样就构造了RNN的输入层。之后,您可以设置双向深度网络结构,并在最高 RNN 层的输出之上放置一个平均池化层。所谓均值池化,具体方法是将BLSTM每个节点的输出结果平均,先叠加BLSTM的输出内容,这就是池化的意义,然后除以输入节点的数量,这就是均值的意思,平均池就是意思。
如何从物理意义上理解平均池?这其实可以理解为,在这个层面上,两句话中的每一个词对最终的分类结果进行投票,因为每个BLSTM的输出可以理解为输入词在判断了两者的分类结果后,看到了上面所有和所有以下(包括两句话),并通过均值池层投下了自己有价值的一票。
在平均池之上,我们还可以放置一层 SoftMax 来实现最终的分类目的。通过
上述方式,我们构建了一个通用的RNN深度学习系统,用于通过输入层、多个BLSTM层、均值池层和输出层来判断两个句子的语义是否具有语义关系。
与网络结构一相比,最大的区别在于两者之间没有建立直接连接网络结构一的RNN,
无论层次结构有多深,RNN都只是起到提取各自句子特征的目的,两句话之间的关系体现在MLP神经网络结构中,即网络结构一在两句话的整体特征之间建立联系。网络结构二已经建立了RNN层两句话之间的相互关系,所以如果粗略分析的话,感觉结构二应该能够比结构一的结构能够捕捉到更多的信息,当然这只是一种直观的感觉。
|RNN网络结构三
图3 RNN网络结构三
图 3 显示了第三个 RNN 网络结构。输入层和RNN层结构与网络结构二相同,这意味着两句话之间的单词在RNN层是相关的,这与分类层中的网络结构二不同,不像网络结构二,后者设置了一个均值池层来接收每个单词的分类判断, 但在拼接后最高层的 BLSTM 最后一个节点隐藏层之上(图 3 可能有些不准确,注意这是节点的隐藏状态儿童教育网,不是最终输出值)来设置 SoftMax 分类层,因为这里最后一个节点的隐藏神经元状态理论上编码了两个句子的语义表示以及两者之间的关系, 然后直接根据这些信息进行分类。当然,如果使用双向结构BiRNN或BLSTM,可以将第一节点和尾节点的隐藏层状态拼接在一起作为最终分类的基本中间值,因为对于双向结构来说,头节点还暗示了两者之间关系的反向编码,图结构如下:
图4 三种双向结构的RNN网络结构
上面介绍了抽象出的三种典型RNN来解决网络结构的句子匹配问题,至于这三种结构哪一种会更好,或者三者相似,其实有文章要做,比如可以用几个分类任务,分别取三种架构,测试分析相应的效果, 并总结哪种结构更好,其实它有很大的出版价值,有兴趣的同学可以试试。
另外,很明显,如果你仔细想想,你其实可以想出很多新的RNN网络结构,而且很可能还没有提到文献,这里就不赘述了,以后有机会的时候匹的结构,我会分享几个我目前能想到的变体。