使用深度双向LSTM模型构造社区问答系统

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

author: 张俊林

关于社区问答系统的问题背景,我们在之前的“利用卷积神经网络构造社区问答系统”一文里已经说明得很清楚,本文就不再赘述,不清楚背景的读者可自行参照上文,我们这些相关的研发工作主要是为了开发畅捷通“会计家园”交流社区的相关功能。为了保持行文完整,简明叙述形式化描述的问题如下:

假设我们已知问答库如下:

其中,Qi是问答社区中的历史问题,Ai是Qi问题的精华答案;

现有社区用户提出的新问题:Qnew

我们需要学习映射函数:

意即对于新问题Qnew,我们希望通过学习系统找到社区中已经出现过的语义相同问题Qi,然后将对应的答案Ai推荐给用户。这样就达到了社区信息复用的目的。这个问题其实对于问答社区比如百度知道、知乎等都是存在的,解决问题的思路也完全可以复用到此类问答社区中。

除了上篇文章讲述的利用CNN来构造ML系统外,我们还尝试了使用RNN及其改进模型LSTM,本文主体内容即为使用深度双向LSTM构造社区问答系统的思路及效果。

|深度双向LSTM模型

图1 深度双向LSTM

深度双向LSTM模型的结构如图1所示。首先强调一下,这个结构也是一个解决对比两个句子相似性的通用RNN解决方案,不仅仅能够使用在问答社区,凡是涉及到对比两个句子或者实体关系的场合完全可以套用这个模型来解决,这点希望读者注意。

首先,因为我们面临的问题是对比两个问题Qi和Qj是否语义相同,那么对于RNN来说存在一个神经网络的输入层如何构造的难题。CNN解决这类问题就比较直观,一般一个输入套上一个CNN来抽取出句子特征,然后再套上MLP神经网络来表达两者之间的关系即可。RNN表达单个输入句子是非常直观的,但是直接表达两个句子之间的关系相对而言就没那么直观。一般可以如图1这么做,就是把两个问题Qi和Qj拼接起来,中间用一个特殊分隔符EOS分割,这里EOS不代表一个句子的结束,而是代表两个句子的分隔符号,这个也请读者注意。如此就构造出了RNN的输入层。

有了输入层,上面就好处理了。首先我们在输入层之上,套上一层双向LSTM层,LSTM是RNN的改进模型,相比RNN,能够更有效地处理句子中单词间的长距离影响;而双向LSTM就是在隐层同时有一个正向LSTM和反向LSTM,正向LSTM捕获了上文的特征信息,而反向LSTM捕获了下文的特征信息,这样相对单向LSTM来说能够捕获更多的特征信息,所以通常情况下双向LSTM表现比单向LSTM或者单向RNN要好。图1中输入层之上的那个BLSTM层就是这个第一层双向LSTM层神经网络。

我们可以把神经网络的深度不断拓展,就是在第一层BLSTM基础上,再叠加一层BLSTM,叠加方法就是把每个输入对应的BLSTM层的输出作为下一层BLSTM神经网络层相应节点的输入,因为两者完全是一一对应的,所以很好叠加这两层神经网络。如果你觉得有必要,完全可以如此不断叠加更深一层的BLSTM来构造多层深度的BLSTM神经网络。

在最后一层BLSTM神经网络之上,可以使用Mean Pooling机制来融合BLSTM各个节点的结果信息。所谓Mean Pooling,具体做法就是把BLSTM各个节点的输出结果求等权平均,首先把BLSTM各个输出内容叠加,这是pooling的含义,然后除以输入节点个数,这是mean的含义,Mean Pooling就是这个意思。

如何从物理意义上来理解Mean Pooling呢?这其实可以理解为在这一层,两个句子中每个单词都对最终分类结果进行投票,因为每个BLSTM的输出可以理解为这个输入单词看到了所有上文和所有下文(包含两个句子)后作出的两者是否语义相同的判断,而通过Mean Pooling层投出自己宝贵的一票。所以RNN场景下的Mean Pooling可以看作一种深度学习里的“民主党”投票机制。

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

通过以上方式,我们就通过输入层、多层BLSTM层、Mean Pooling层和输出层构造出一个通用的判断两个句子语义是否相同的深度学习系统。其实这个结构是非常通用的,除了判断两个句子关系,对于单句子分类明显也是可以套用这个结构的。

模型结构已经讲完,后面我们将进入实验部分,因为希望和CNN结果进行效果对比,我们先简单说明下两个同样可以用来解决社区问答问题的CNN结构,这两个结构在之前的“利用卷积神经网络构造社区问答系统”文中都有详细描述,这里不展开讲,只是列出结构图,以方便理解和对比模型。

|两个CNN模型结构

两个CNN模型结构参考图2和图3,图2这种结构是利用CNN判断多个输入句子关系的简单直接的结构,含义是先各自抽取每个句子的特征然后比较两者的关系。而图3这种结构的含义是先把两个句子之间的关系明确表达出来作为输入,然后再套上一个CNN模型来进行分类预测。

图2 CNN模型1

图3 CNN模型2

|实验结果及与两个CNN模型对比

在之前的文章“利用卷积神经网络构造社区问答系统”中我们使用自己构造的实验数据验证了CNN模型2的效果。之后,我们增加了训练数据的数量,以及加大了负例的难度,其实在这个社区问答问题中,负例的难度对于实验效果指标影响是比较大的。所谓难度,是指负例中两个句子间语义相关程度到底有多强,如果负例中两个句子语义相关程度越强,则分类难度越高。

至于模型,我们补充了CNN模型1,在新数据集合下测试了CNN模型2的效果,对于BLSTM来说,则做了双层BLSTM和单层BLSTM的实验,所以可以认为有四个模型参与效果对比。

经过参数调优,这四个模型在这个新的训练集和测试集下,具体实验结果如下:

CNN模型1             分类精度:89.47%

CNN模型2             分类精度:80.08%

双层BLSTM模型   分类精度:84.96%

单层BLSTM模型   分类精度:89.10%

可以看出,在这个问答社区问题里,CNN模型1和单层BLSTM效果接近,而双层BLSTM模型效果有下降,这也许跟实验数据规模不够大有一定关系,所以复杂模型的优势发挥不出来,而CNN模型2则效果相对差些,这也许说明了CNN模型2没有将两个句子的原始信息输入到模型里,而是直接将其关系作为输入,这种情况下存在信息损失的可能。

致谢:感谢畅捷通智能平台的沈磊、薛会萍、黄通文、桑海岩等同事在模型训练及训练数据的收集整理方面的工作。

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


时间: 2024-10-25 04:08:45

使用深度双向LSTM模型构造社区问答系统的相关文章

双向LSTM模型的tensorflow实现

来源:https://github.com/jiangxinyang227/NLP-Project/text_classifier import tensorflow as tf from .base import BaseModel class BiLstmAttenModel(BaseModel): def __init__(self, config, vocab_size, word_vectors): super(BiLstmAttenModel, self).__init__(conf

TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CRF 实现 sequence labeling  双向LSTM+CRF跑序列标注问题 源码下载 去年底样子一直在做NLP相关task,是个关于序列标注问题.这 sequence labeling属于NLP的经典问题了,开始尝试用HMM,哦不,用CRF做baseline,by the way, 用的CR

时间序列深度学习:状态 LSTM 模型预测太阳黑子

时间序列深度学习:状态 LSTM 模型预测太阳黑子 本文翻译自<Time Series Deep Learning: Forecasting Sunspots With Keras Stateful Lstm In R> 原文链接 由于数据科学机器学习和深度学习的发展,时间序列预测在预测准确性方面取得了显着进展.随着这些 ML/DL 工具的发展,企业和金融机构现在可以通过应用这些新技术来解决旧问题,从而更好地进行预测.在本文中,我们展示了使用称为 LSTM(长短期记忆)的特殊类型深度学习模型,

BERT论文翻译:用于语言理解的深度双向Transformer的预训练

Jacob Devlin Ming-Wei Chang Kenton Lee kristina Toutanova Google AI Language {jacobdevlin, mingweichang, kentonl, kristout}@google.com 摘要 本文介绍了一种新的语言表示模型BERT,意为“来自transformer的双向编码器表示”(Bidirectional Encoder Representations from Transformers).与最近的语言表示模

深度语义匹配模型-DSSM 及其变种

转自:http://ju.outofmemory.cn/entry/316660 感谢分享~ DSSM这篇paper发表在cikm2013,短小但是精炼,值得记录一下 ps:后来跟了几篇dssm的paper,一并记录在这里 DSSM DSSM的结构 DSSM 最大的卖点在检索场景下 使用点击数据来训练语义层次的匹配,简单的来说,传统检索场景下的匹配主要有: 字面匹配: TFIDF . BM25 等 使用 LSA 类模型进行语义匹配,但是效果不好 而DSSM训练出来之后,检索场景下用户输入quer

深度双向Transformer预训练【BERT第一作者分享】

目录 NLP中的预训练 语境表示 语境表示相关研究 存在的问题 BERT的解决方案 任务一:Masked LM 任务二:预测下一句 BERT 输入表示 模型结构--Transformer编码器 Transformer vs. LSTM 模型细节 在不同任务上进行微调 GLUE SQuAD 1.1 SQuAD 2.0 SWAG 分析 预训练的影响 方向与训练时间的影响 模型规模的影响 遮罩策略的影响 多语言BERT(机器翻译) 生成训练数据(机器阅读理解) 常见问题 结论 翻译自Jacob Dev

【收藏转】WCF后传系列(9):深度通道编程模型Part 2—实例篇

引言 从本质上说,WCF是一个通信服务框架,它允许我们使用不同的传输协议,使用不同的消息编码形式,跟不同的WS-*系列规范交互,而所有这些细节都是由通道堆栈来处理的.在<WCF专题系列(8):深度通道编程模型Part 1—设计篇>中,对于WCF中的通道模型有了深入的认识,本文中,我将通过实例来说明在通道模型中,服务端是如何接收消息,客户端是如何发送消息的. 服务端通道 本文将不使用WCF的编程模型,而直接利用通道模型来进行通信,这样有助于我们更进一步加深对服务端处理消息的认识,在服务端侦听并接

论文:利用深度强化学习模型定位新物体(VISUAL SEMANTIC NAVIGATION USING SCENE PRIORS)

这是一篇被ICLR 2019 接收的论文.论文讨论了如何利用场景先验知识 (scene priors)来定位一个新场景(novel scene)中未曾见过的物体(unseen objects).举例来说,在「厨房」这一场景中,有一张图片显示「苹果」在冰箱的储物架上,同为水果的物体,如「橙子」,会出现在场景的哪个位置呢?论文提出了用基于强化学习的方法来定位「橙子」. 论文:VISUAL SEMANTIC NAVIGATION USING SCENE PRIORS 论文作者:Wei Yang , X

PyTorch 模型构造

记录几种模型构造的方法: 继承Module类来构造模型 Module是所有神经网络模块的基类,通过继承它来得到我们需要的模型,通常我们需要重载Module类的__init__函数和forward函数. 实例 import torch.nn as nn import torch.nn.functional as F class Model(nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = nn.Co