/* 版权声明:能够随意转载,转载时请标明文章原始出处和作者信息 .*/

author: 张俊林

除了序列标注问题外,句子对匹配(Sentence Pair Matching)问题也是NLP中非经常见的一类问题。所谓“句子对匹配”,就是说给定两个句子S1和S2。任务目标是推断这两个句子是否具备某种类型的关系。

假设形式化地对这个问题定义,能够理解例如以下:

意思是给定两个句子,须要学习一个映射函数。输入是两个句子对,经过映射函数变换,输出是任务分类标签集合中的某类标签。既然我们要讨论深度学习,那么这个映射函数F就是通过神经网络来进行映射的,而标签集合里的分类标签详细代表的含义跟任务相关。

典型的样例就是Paraphrase任务。即要推断两个句子是否语义等价。所以它的分类标签集合就是个{等价。不等价}的二值集合。除此外。还有非常多其他类型的任务都属于句子对匹配。比方问答系统。就是推断两个句子是否一个是问题一个是答案的关系。此类任务还有非常多,关键是看你怎么理解一个任务的目标。

今天我们主要讲讲假设利用RNN来构造这个映射函数F,那么神经网络的结构应该怎样设计?尽管标题说是“常见”,可是事实上讲这方面的文献非常之少。我把使用RNN解决句子对匹配的神经网络结构抽象成三类情况。这三类也是相对easy想到的结构。

当然,这里要注意,尽管我们这里说的是RNN。可是它代表了LSTM、GRU、多层深度网络等各种变体形式,为行文方便,在此统一用RNN来指代。

|RNN网络结构一

图1.  RNN网络结构一

图1展示了一个最easy想到的RNN网络,对于两个句子,分别套上一个RNN或者深层LSTM亦或双向深层LSTM等。每一个RNN的目的是抽取出这个句子的特征。然后将两个句子抽取出的特征拼接成更上层的MLP多层神经网络的输入层。经过MLP的隐层使得两个句子发生非线性映射关系,最后再通过SoftMax分类层给出最后的分类结果。

这样就通过两个RNN实现了对两个句子是否具备某种关系作出分类推断的决策,使用训练数据能够获得网络參数,之后就能够将这个神经网络用来对现实任务进行分类的工作。

|RNN网络结构二

图2  RNN网络结构二

图2展示了结构二的通用架构。就是把两个句子S和T拼接起来。中间用一个特殊分隔符EOS切割,这里EOS不代表一个句子的结束。而是代表两个句子的分隔符号。如此就构造出了RNN的输入层。之后能够套上双向以及深层网络结构,在最高一层RNN层的输出之上,套上一个Mean Pooling层。所谓Mean Pooling,详细做法就是把BLSTM各个节点的输出结果求等权平均。首先把BLSTM各个输出内容叠加,这是pooling的含义,然后除以输入节点个数,这是mean的含义,Mean Pooling就是这个意思。

怎样从物理意义上来理解Mean Pooling呢?这事实上能够理解为在这一层,两个句子中每一个单词都对终于分类结果进行投票。由于每一个BLSTM的输出能够理解为这个输入单词看到了全部上文和全部下文(包括两个句子)后作出的两者分类结果的推断,而通过Mean Pooling层投出自己宝贵的一票。

在Mean Pooling之上。我们还能够套上一层SoftMax层,这样就能够实现终于的分类目的。

通过以上方式。我们就通过输入层、多层BLSTM层、Mean Pooling层和输出层构造出一个通用的推断两个句子语义是否具备某种语义关系的RNN深度学习系统。

与网络结构一相比。最大的不同在于:网络结构一的两个RNN之间没有建立不论什么直接的联系,不管层级有多深。RNN在此仅仅是起到了提取各自句子特征的目的,而两个句子发生关系是在MLP神经网络结构里体现出的,也就是说网络结构一是在两个句子的总体特征之间建立起联系的。而网络结构二则在RNN层两个句子之间的单词之间就已经建立起了相互的关系。所以假设粗略地分析,感觉结构二应该能够捕获到的信息要多于结构一的那种架构所能捕获到的信息,当然,这个仅仅是直观感觉。

|RNN网络结构三

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图3 RNN网络结构三

图3展示了第三种RNN网络结构。

在输入层和RNN层结构与网络结构二是同样的,意思是在RNN层就使得两个句子之间单词发生相关关系,与网络结构二不同的在于分类层,不像网络结构二一样套上一个Mean Pooling层接收每一个单词的分类推断,而是在拼接后的最高层处BLSTM最后一个节点隐层之上(图3可能有些不准确。要注意这里是节点的隐层状态而非终于输出值)套上一个SoftMax分类层,由于这里最后一个节点的隐层神经元状态理论上把两个句子各自的语义表示以及两者之间的关系都编码在当中了。然后直接在这些信息基础上进行分类。

当然,假设是採用双向结构BiRNN或者BLSTM,能够将首节点和尾节点的隐层状态一起拼接来作为最后分类的基础中间值,由于对于双向结构来说,头节点也隐含了逆向的两者关系编码,其图结构例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图4 RNN网络结构三之双向结构

上面介绍了抽象出的三种典型RNN解决句子对匹配问题的网络结构,至于说这三个结构哪个会更好。或者还是三者差点儿相同。事实上这里面是有文章可作的,比方你能够用若干个分类任务,分别採取三个架构,測试并分析相应的效果,得出哪个结构更好的结论,事实上是具有非常大的发表价值的,有兴趣的同学能够试试看。

另外,非常明显。你细致一想,事实上是能够想出非常多新型RNN网络结构的。并且非常可能眼下还没有文献提到过。这里不细谈了,以后有机会我会把我眼下能想到的几个变体分享出来。

扫一扫关注微信号:“布洛卡区” 。深度学习在自然语言处理等智能应用的技术研讨与科普公众号。

使用RNN解决句子对匹配问题的常见网络结构的更多相关文章

  1. 转:使用RNN解决NLP中序列标注问题的通用优化思路

    http://blog.csdn.net/malefactor/article/details/50725480 /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author ...

  2. 解决webpack不能匹配post请求的问题

    解决webpack不能匹配post请求的问题 webpack的dev-server只能匹配get请求,在本地做本地数据的时候会很不方便. 可以使用如下两种办法解决: 1.在webpack.config ...

  3. ES中文分词器之精确短语匹配(解决了match_phrase匹配不全的问题)

    分词器选择 调研了几种分词器,例如IK分词器,ansj分词器,mmseg分词器,发现IK的分词效果最好.举个例子: 词:<<是的>><span>哈<\span ...

  4. hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)

    /** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...

  5. 【js数据结构】栈解决括号不匹配问题

    栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...

  6. Python读取JSON数据,并解决字符集不匹配问题

    今天来谈一谈Python解析JSON数据,并写入到本地文件的一个小例子. – 思路如下 从一个返回JSON天气数据的网站获取到目标JSON数据串 使用Python解析出需要的部分 写入到本地文件,供其 ...

  7. Druid Spring Boot Starter 从配置到简单运行 -解决zone不匹配 -解决dataSource加载失败

    Druid Spring Boot Starter 中文 | English Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池 ...

  8. 《Convolutional Neural Network Architectures for Matching Natural Language Sentences》句子匹配

    模型结构与原理 1. 基于CNN的句子建模 这篇论文主要针对的是句子匹配(Sentence Matching)的问题,但是基础问题仍然是句子建模.首先,文中提出了一种基于CNN的句子建模网络,如下图: ...

  9. solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题

    一.Solr Multivalue field属性positionIncrementGap理解 分类:Lucene 2014-01-22 10:39阅读(3596)评论(0) 参考:http://ro ...

随机推荐

  1. canvas使用自定义字体没有效果

    字体样式没有显示主要是因为字体还没有加载完成~ css @font-face { font-family: myFont; src: local('sen.ttf'), url("sen.t ...

  2. C#对象初始化的探讨

    最近在弄MQ的性能监测数据埋点,无疑中用到一个Nstatsd的客户端,看到里面写过里面一种嵌套类的写法.代码如下: 客户端Client是一个密封的类,并且构造函数私有访问.然后又用一个嵌套类Curre ...

  3. 查询SYS_ORG_TB树的层级

    WITH N(SYS_ORG_ID,SYS_ORG_NAME,LEVEL) AS( AS LEVEL FROM SYS_ORG_TB WHERE SYS_ORG_UPID IS NULL UNION ...

  4. EmpireofCode文档翻译 https://empireofcode.com/game/

    In Campaign mode, you can check your strategies on already defeated bases. You will not lose your tr ...

  5. POJ 3522 Slim Span (Kruskal枚举最小边)

    题意: 求出最小生成树中最大边与最小边差距的最小值. 分析: 排序,枚举最小边, 用最小边构造最小生成树, 没法构造了就退出 #include <stdio.h> #include < ...

  6. 在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”

    (有一些图片我是直接从个人的CSDN博客上复制来的) 最近一个多月来,我曾经多次尝试在Ubuntu 16.04 LTS上使用g++和gcc(这俩好像合起来叫MinGW?)来编译C/C++代码,但是在解 ...

  7. Java学习之File类理解

    File类是io包中唯一代表磁盘文件本身的对象.File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建.删除.重命名文件等.File类的对象主要用来获取文件本身的一些 ...

  8. metadata的使用以及简单的orm模式

    使用sqllite3和metadata简单的封装了个简单的orm #!/usr/bim/python #-*-coding: utf-8 -*- import threading import sql ...

  9. 大数据学习——linux常用命令(三)

    三 文件操作 1创建文件 touch somefile.txt 创建一个空文件somefile.txt > 重定向操作符 echo "woshiwoa"> some.t ...

  10. C#窗体学生成绩管理系统

    c#学生成绩管理系统 实现用户登录.注册 所有成绩查询.个人成绩查询 管理员审核.添加.删除用户 项目源码GIT:https://github.com/soulsjie/StuScoreMa.git