检索式chatbot:word2vec/GloVe/fasttext

 

小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的超级火呀。从微软主打情感计算的小冰,到百度主打智能家庭(与车联网?)的DuerOS和UNIT,到渗透在阿里许多产品的全能型智能客服小蜜,以及腾讯的小微和搜狗的汪仔,更没必要说那些大佬坐镇的独角兽公司了,小夕深感以对话为主战场的NLP之风在工业界愈演愈烈,吓得小夕赶忙码了这篇文章。php

1. 扫盲

对话的概念很大,从输入形式上分为文本和语音,本文固然只考虑文本。从对话目的上分为任务型对话与非任务型/闲聊型对话。顾名思义,任务型对话就是为了解决任务而进行的对话,好比你让Siri帮你定闹钟、发短信等,而闲聊型对话固然就是human-to-human的正常聊天啦。本文就不讨论任务型对话了,有兴趣的同窗能够戳这里扫扫盲,本文聚焦在非任务型对话的多轮对话问题上。html

要完成对话的建模,目前主要分为检索式、生成式以及检索与生成融合的方式。顾名思义,检索式就是经过检索与匹配的方式从已有的大量candidate responses中找出最合适的那个做为response;生成式则是事先经过训练来把对话知识塞进模型中,推理的时候首先模型的encoder部分去读历史对话,而后模型中的decoder/语言模型部分直接生成相应的回复;检索与生成相结合的方法则玩法不少了,好比用生成模型来作检索模型的reranker用生成模型来做改写用生成模型生成的response来做为检索模型的一条response等。限于篇幅,本文只讲纯检索式的,其余的之后再说(maybe不会过久╮( ̄▽ ̄"")╭)。python

2. 检索式模型的套路

检索式对话的通常套路是首先构建一个由大量query-response pair构成的知识库(好比从豆瓣、贴吧等地方抽取),而后将对话中最后一次的回复做为query,经过经典的信息检索方式(倒排索引+TFIDF/BM25)做q-q匹配来召回若干相关的candidate responses。注意,这一步实在太粗糙了,彻底没有考虑语义,因此直接使用检索分数来挑选最优response显然是太过简单粗暴不靠谱。因此咱们还须要使用考虑语义的深度文本匹配模型来将历史对话与这些检索出来的candidate responses进行matching/reranking,从而挑选出一个更加合适的response。git

那么怎么进行文本的深度匹配呢?github

一个很简单的作法是直接把复述识别/天然语言推理/检索式问答这些相关领域的文本匹配模型直接拿来用,可是显然这样仅仅建模的是单轮对话,因而聊天机器人就变成了只有7秒记忆的金鱼╮(╯▽╰)╭,所以,建模多轮对话是很是有必要的。web

不过了解一下文本匹配模型是颇有帮助的。这方面今年COLING有一篇文章[6]总结的不错,把基于表示与基于交互的SOTA匹配模型都给详细总结对比了。面试

 

深度学习模型复现难?看看这篇句子对模型的复现论文

这是 PaperDaily 的第82篇文章算法

本期推荐的论文笔记来自 PaperWeekly 社区用户@zhkun本文是 COLING 2018 的 Best Reproduction Paper,文章对 sentence pair modeling 进行了比较全面的介绍,针对目前表现最好的几个模型进行了重现和对比,而且基本上实现了原文章中声明的效果,很是值得参考。express

关于做者:张琨,中国科学技术大学博士生,研究方向为天然语言处理。json

■ 论文 | Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering

■ 连接 | https://www.paperweekly.site/papers/2042

■ 做者 |Wuwei Lan / Wei Xu

论文介绍

这篇文章是 COLING 2018 的 Best Reproduction Paper,文章主要对现有的作句子对任务的最好的几个模型进行了重现,而且做者实现出来的效果和原文章声称的效果相差很少,这点仍是很厉害的,并且做者对语义理解的集中任务也作了相关梳理,文章简单易读,仍是很值得一看的。

任务

句子对建模是 NLP,NLU 中比较基础,并扮演着重要角色的任务,主要集中在语义理解,语义交互上,这也是我本身的一个研究方向,大体有这几类任务:

1. Semantic Textual Similarity (STS):判断两个句子的语义类似程度(measureing the degree of equivalence in the underlying semantics of paired snippets of text);

2. Natural Language Inference (NLI) :也叫 Recognizing Textual Entailment (RTE),判断两个句子在语义上是否存在推断关系,相对任务一更复杂一些,不只仅是考虑类似,并且也考虑了推理;

3. Paraphrase Identification (PI):判断两个句子是否表达一样的意思(identifing whether two sentences express the same meaning);

4. Question Answering (QA):主要是指选择出来最符合问题的答案,是在给定的答案中进行选择,而不是生成;

5. Machine Comprehension (MC):判断一个句子和一个段落之间的关系,从大段落中找出存在答案的小段落,对比的两个内容更加复杂一些。

论文模型

有了任务,做者选取了集中目前状况下最好的模型,由于原文中每一个模型可能只针对了某些任务进行了不少优化,那这些模型是否真的有效呢,做者考虑这些模型在全部的任务上进行比较,在介绍模型以前,做者首先介绍了句子对建模的通常框架:

通常框架

1. 输入层:适用预训练或者参与训练的词向量对输入中的每一个词进行向量表示,比较有名的 Word2Vec,GloVe,也能够使用子序列的方法,例如 character-level embedding;

2. 情境编码层:将句子所处的情境信息编码表示,从而更好的理解目标句子的语义,经常使用的例如 CNN,HighWay Network 等,若是是句子语义表示的方法,通常到这里就结束了,接下来会根据具体的任务直接使用这一层获得语义表示

3. 交互和注意力层:该层是可选的,句子语义表示有时候也会用到,但更多的是词匹配方法用到的,经过注意力机制建模两个句子在词层面的匹配对齐关系,从而在更细粒度上进行句子对建模,我的认为句子语义表示也会用到这些,只是句子语义表示最后会获得一个语义表示的向量,而词匹配的方法不必定获得句子语义的向量

4. 输出分类层:根据不一样的任务,使用 CNN,LSTM,MLP 等进行分类判断。

下图展现了一些句子语义表示的模型的基本框架:

 

有了这个通常的框架,接下来做者选取了集中目前最好的模型进行重现。

模型选择

1. InferSent[1]:BiLSTM+max-pooling;

2. SSE[2]:如图 1,和 InferSent 比较相似;

3. DecAtt[3]:词匹配模型的表明,利用注意力机制获得句子 1 中的每一个词和句子 2 中的全部词的紧密程度,而后用句子 2 中的全部词的隐层状态,作加权和表示句子 1 中的每一个词;

4. ESIM[4]:考虑了一些词自己的特征信息,和 DecAtt 比较相似;

5. PWIM[5]:在获得每一个词的隐层状态以后,经过不一样的类似度计算方法获得词对之间类似关系,最后利用 CNN 进行分类。

数据

为了更好的展现每一个数据的状况,在这里直接用下图展现做者使用到的数据集:

 

结果

直接上结果,上图是原文章中的结果,下图是做者重现的结果:

 

从结果上看,做者实现的效果仍是很厉害的,基本上跟原文章声明的不相上下,固然因为不是针对特定任务进行特别优化,全部效果仍是有一点点差的,但基本上能够认为是实现了原来的效果,并且做者也发现了一些有意思的现象,例如:表现最好的就是 ESIM,我的感受这里面加入了不少次自己的一些信息,例如近义词,反义词,上下位信息等,这些信息其实对句子语义理解十分重要。

以上就是这篇文章的总体介绍,做者完整实现了这些方法,并在不一样的数据集上进行验证,工做量仍是很大的,并且对句子对建模进行了比较完整的介绍,仍是颇有意思的。

引用

[1]. A. Conneau, D. Kiela, H. Schwenk, L. Barrault, A. Bordes, Supervised Learning of Universal Sentence Representations from Natural Language Inference Data

[2]. Shortcut-Stacked Sentence Encoders for Multi-Domain Inference, Yixin Nie and Mohit Bansal.

[3]. A Decomposable Attention Model for Natural Language Inference, AnkurP.Parikh, Oscar Täckstöm, Dipanjan Das, Jakob Uszkoreit

[4]. Enhanced LSTM for Natural Language Inference, Qian Chen, Xiaodan Zhu, Zhenhua Ling, Si Wei, Hui Jiang, Diana Inkpen

[5]. Hua He and Jimmy Lin. Pairwise Word Interaction Modeling with Deep Neural Networks for Semantic Similarity Measurement

  • 发表于: 2018-06-19
  • 原文连接:https://kuaibao.qq.com/s/20180619B0PABZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台账号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
 
 
 

 

 

NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)

有不少改进版的word2vec,可是目前仍是word2vec最流行,可是Glove也有不少在说起,笔者在本身实验的时候,发现Glove也仍是有不少优势以及能够深刻研究对比的地方的,因此对其进行了必定的学习。 
部分学习内容来源于小象学院,由寒小阳老师授课《深度学习二期课程》


高级词向量三部曲:

一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 
二、NLP︱高级词向量表达(二)——FastText(简述、学习笔记) 
三、NLP︱高级词向量表达(三)——WordRank(简述) 
四、其余NLP词表示方法paper:从符号到分布式表示NLP中词各类表示方法综述


1、理论简述

一、word2vec

word2vec:与通常的共现计数不一样,word2vec主要来预测单词周边的单词,在嵌入空间里类似度的维度能够用向量的减法来进行类别测试。

弊端:

  • 一、对每一个local context window单独训练,没有利用包含在global co-corrence矩阵中的统计信息
  • 二、多义词处理乏力,由于使用了惟一词向量

二、GloVe

GloVe和word2vec的思路类似(论文连接 
可是充分考虑了词的共现状况,比率远比原始几率更能区分词的含义。

这里写图片描述

这里写图片描述

这里写图片描述

GloVe综合了LSA、CBOW的优势,训练更快、对于大规模语料算法的扩展性也很好、在小语料或者小向量上性能表现也很好 
. 
.


2、测评

本节主要来自于52NLP的文章:斯坦福大学深度学习与天然语言处理第三讲:高级的词向量表示

. 
.

一、词向量测评方法

一直以来,如何测评词向量仍是一件比较头疼的事情。 
主要方法分为两种:内部测评(词类比)与外部测评(命名实体识别(NER))。 
词类比。经过评测模型在一些语义或语法类比问题上的余弦类似度距离的表现来评测词向量 
固然,在测评时候,会去除一些来自于搜索的输入词、干扰词、经常使用停用词等,让测评结果更加显著

  • 内部类比方式一:不一样的城市可能存在相同的名字

类比数据来源:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt

这里写图片描述

  • 内部类比方式二:形容词比较级

如下语法和语义例子来源于:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt 
这里写图片描述

  • 内部类比三:时态

词向量类比:如下语法和语义例子来源于:https://code.google.com/p/word2vec/source/browse/trunk/questions-words.txt 
这里写图片描述

  • 内部类比四:人名?
  • 外部测评:命名实体识别(NER):找到人名,地名和机构名 
    . 
    .

二、测评结果

一些测评方式可参考:Paper2:[Improving Word Representations via Global Context 
and Multiple Word 
Prototypes]

  • (1)内部测评

类比评测和超参数:

这里写图片描述

相关性评测结果: 
这里写图片描述

  • (2)外部测评

命名实体识别(NER):找到人名,地名和机构名 
这里写图片描述

. 
.

三、利用词向量解决歧义问题

也许你寄但愿于一个词向量能捕获全部的语义信息(例如run便是动车也是名词),可是什么样的词向量都不能很好地进行凸显。 
这篇论文有一些利用词向量的办法:Improving Word Representations Via Global Context And Multiple Word Prototypes(Huang et al. 2012) 
解决思路:对词窗口进行聚类,并对每一个单词词保留聚类标签,例如bank1, bank2等

这里写图片描述

. 
. 
.


3、Glove实现&R&python

一、Glove训练参数

本节主要来自于52NLP的文章:斯坦福大学深度学习与天然语言处理第三讲:高级的词向量表示

  • 最佳的向量维度:300左右,以后变化比较轻微 
  • 对于GloVe向量来讲最佳的窗口长度是8
  • 训练迭代次数。对于GloVe来讲确实有助于 
    这里写图片描述
  • 更多的数据有助于帮助提升训练精度 
    这里写图片描述

.

二、用R&python实现

python:python-glove(参考博客:glove入门实战

R:text2vec(参考博客:重磅︱R+NLP:text2vec包——New 文本分析生态系统 No.1(一,简介)


. 
.

4、相关应用

一、glove+LSTM:命名实体识别

用(Keras)实现,glove词向量来源: http://nlp.stanford.edu/data/glove.6B.zip

一开始输入的是7类golve词向量。The model is an LSTM over a convolutional layer which itself trains over a sequence of seven glove embedding vectors (three previous words, word for the current label, three following words).  
最后是softmax层进行分类。The last layer is a softmax over all output classes.

CV categorical accuracy and weighted F1 is about 98.2%. To assess the test set performance we are ensembling the model outputs from each CV fold and average over the predictions.

来源于github:https://github.com/thomasjungblut/ner-sequencelearning 
.

二、PAPER:词向量的擦除进行情感分类、错误稽查

Understanding Neural Networks Through Representation Erasure(arXiv: 1612.08220)

提出了一种通用的方法分析和解释了神经网络模型的决策——这种方法经过擦除输入表示的某些部分,好比将输入词向量的某些维、隐藏层的一些神经元或者输入的一些词。咱们提出了几种方法来分析这种擦除的影响,好比比较擦除先后模型的评估结果的差别,以及使用强化学习来选择要删除的最小输入词集合,使用于分类的神经网络模型的分类结果发生改变。 
在对多个 NLP 任务(包括语言特征分类、句子情感分析、文档级别的 sentiment aspect prediction)的综合分析中,咱们发现咱们提出的方法不只能提供神经网络模型决策的清晰解释,并且能够用来进行错误分析。

**分析揭示了 Word2Vec 和 Glove 产生的词向量之间存在一些明显的差别,同时也代表训练语料中的词频对产生的词的表达有很大的影响; 
在句子级别的情感分析上的实验代表情感词对情感分类结果影响显著,有意思的是还能找出来一些使模型误分类的词;** 
在文档级别的 aspect prediction 实验则清晰地揭示出文档中哪部分文本和特定的 aspect 是强关联的。同时这些实验都代表,双向 LSTM 的表达能力比经典 LSTM 强,经典 RNN 则最弱。



 

 



 

 

NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目实际上是有两部分组成的,一部分是这篇文章介绍的
fastText 文本分类(paper:A. Joulin, E. Grave, P. Bojanowski, T. Mikolov,
Bag of Tricks for Efficient Text
Classification(高效文本分类技巧)
),
另外一部分是词嵌入学习(paper:P.
Bojanowski*, E. Grave*, A. Joulin, T. Mikolov, Enriching Word Vectors
with Subword
Information
(使用子字信息丰富词汇向量))。
按论文来讲只有文本分类部分才是 fastText,但也有人把这两部分合在一块儿称为
fastText。笔者,在这即认为词嵌入学习属于FastText项目。
github连接:https://github.com/facebookresearch/fastText

.

高级词向量三部曲:

一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)
二、NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
三、NLP︱高级词向量表达(三)——WordRank(简述)
四、其余NLP词表示方法paper:从符号到分布式表示NLP中词各类表示方法综述


如何在python 很是简单训练FastText,可见笔者博客:

极简使用︱Gemsim-FastText 词向量训练以及OOV(out-of-word)问题有效解决


1、FastText架构

本节内容参考自:
一、开源中国社区 [http://www.oschina.net] 《Facebook 开源的快速文本分类器 FastTexT》
二、雷锋网文章:《比深度学习快几个数量级,详解Facebook最新开源工具——fastText

.

一、fastText 架构原理

fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。

fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不一样类别的几率。
序列中的词和词组组成特征向量,特征向量经过线性变换映射到中间层,中间层再映射到标签。
fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数
fastText 模型架构和 Word2Vec 中的 CBOW 模型很相似。不一样之处在于,fastText 预测标签,而 CBOW 模型预测中间词

这里写图片描述.
.
二、改善运算效率——softmax层级

对于有大量类别的数据集,fastText使用了一个分层分类器(而非扁平式架构)。不一样的类别被整合进树形结构中(想象下二叉树而非 list)。在某些文本分类任务中类别不少,计算线性分类器的复杂度高。为了改善运行时间,fastText 模型使用了层次 Softmax 技巧。层次 Softmax 技巧创建在哈弗曼编码的基础上,对标签进行编码,可以极大地缩小模型预测目标的数量。(参考博客
这里写图片描述

考虑到线性以及多种类别的对数模型,这大大减小了训练复杂性和测试文本分类器的时间。fastText 也利用了类别(class)不均衡这个事实(一些类别出现次数比其余的更多),经过使用 Huffman 算法创建用于表征类别的树形结构。所以,频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高。
这里写图片描述.
.
.


2、FastText的词向量表征

一、FastText的N-gram特征

经常使用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,所以 fastText 还加入了 N-gram 特征
“我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是同样的。
若是加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。固然,为了提升效率,咱们须要过滤掉低频的 N-gram

在 fastText 中一个低维度向量与每一个单词都相关。隐藏表征在不一样类别全部分类器中进行共享,使得文本信息在不一样类别中可以共同使用。这类表征被称为词袋(bag of words)(此处忽视词序)。在 fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对不少文本分类问题来讲十分重要。

举例来讲:fastText可以学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,而且可以将这些数值存在相关文档中。而后,当某个程序在提出一个用户请求(假设是“我女朋友如今在儿?”),它可以立刻在fastText生成的文档中进行查找而且理解用户想要问的是有关女性的问题。
.
.
二、FastText词向量优点

(1)适合大型数据+高效的训练速度:可以训练模型“在使用标准多核CPU的状况下10分钟内处理超过10亿个词汇”,特别是与深度模型对比,fastText能将训练时间由数天缩短到几秒钟。使用一个标准多核 CPU,获得了在10分钟内训练完超过10亿词汇量模型的结果。此外, fastText还能在五分钟内将50万个句子分红超过30万个类别。
(2)支持多语言表达:利用其语言形态结构,fastText可以被设计用来支持包括英语、德语、西班牙语、法语以及捷克语等多种语言。它还使用了一种简单高效的归入子字信息的方式,在用于像捷克语这样词态丰富的语言时,这种方式表现得很是好,这也证实了精心设计的字符 n-gram 特征是丰富词汇表征的重要来源。FastText的性能要比时下流行的word2vec工具明显好上很多,也比其余目前最早进的词态词汇表征要好。
这里写图片描述(3)fastText专一于文本分类,在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。FastText与基于深度学习方法的Char-CNN以及VDCNN对比:
FastText与基于深度学习方法的Char-CNN以及VDCNN对比 (4)比word2vec更考虑了类似性,好比 fastText 的词嵌入学习可以考虑 english-born 和 british-born 之间有相同的后缀,但 word2vec 却不能(具体参考paper)。
.
.

三、FastText词向量与word2vec对比

本节来源于博客:fasttext
FastText= word2vec中 cbow + h-softmax的灵活使用

灵活体如今两个方面:

  1. 模型的输出层:word2vec的输出层,对应的是每个term,计算某term的几率最大;而fasttext的输出层对应的是 分类的label。不过无论输出层对应的是什么内容,起对应的vector都不会被保留和使用;
  2. 模型的输入层:word2vec的输出层,是 context window 内的term;而fasttext 对应的整个sentence的内容,包括term,也包括 n-gram的内容;

二者本质的不一样,体如今 h-softmax的使用。
Wordvec的目的是获得词向量,该词向量 最终是在输入层获得,输出层对应的 h-softmax 也会生成一系列的向量,但最终都被抛弃,不会使用。
fasttext则充分利用了h-softmax的分类功能,遍历分类树的全部叶节点,找到几率最大的label(一个或者N个)

相关文章:Jupyter notebooks:Comparison of FastText and Word2Vec (感受值得一看)
.
.
.


3、FastText实现

github连接:https://github.com/facebookresearch/fastText
fastText基于Mac OS或者Linux系统构筑,使用 C++11 的特性。须要python 2.6 或者更高版本支持,以及numpy & scipy等软件支持。
FastText默认参数:

$ ./fasttext supervised
Empty input or output path.

The following arguments are mandatory:
  -input              training file path
  -output             output file path

The following arguments are optional:
  -lr                 learning rate [0.1]
  -lrUpdateRate       change the rate of updates for the learning rate [100]
  -dim                size of word vectors [100]
  -ws                 size of the context window [5]
  -epoch              number of epochs [5]
  -minCount           minimal number of word occurences [1]
  -minCountLabel      minimal number of label occurences [0]
  -neg                number of negatives sampled [5]
  -wordNgrams         max length of word ngram [1]
  -loss               loss function {ns, hs, softmax} [ns]
  -bucket             number of buckets [2000000]
  -minn               min length of char ngram [0]
  -maxn               max length of char ngram [0]
  -thread             number of threads [12]
  -t                  sampling threshold [0.0001]
  -label              labels prefix [__label__]
  -verbose            verbosity level [2]
  -pretrainedVectors  pretrained word vectors for supervised learning []
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Mikolov 在 fastTetxt 的论文中报告了两个实验,其中一个实验和 Tagspace 模型进行对比。实验是在 YFCC100M 数据集上进行的, YFCC100M 数据集包含将近 1 亿张图片以及摘要、标题和标签。实验使用摘要和标题去预测标签。Tagspace 模型是创建在 Wsabie 模型的基础上的。Wsabie 模型除了利用 CNN 抽取特征以外,还提出了一个带权近似配对排序 (Weighted Approximate-Rank Pairwise, WARP) 损失函数用于处理预测目标数量巨大的问题。
这里写图片描述上面就是实验结果,从实验结果来看 fastText 可以取得比 Tagspace 好的效果,并拥有无以伦比的训练测试速度。但严格来讲,这个实验对 Tagspace 有些不公平。YFCC100M 数据集是关于多标记分类的,即须要模型能从多个类别里预测出多个类。Tagspace 确实是作多标记分类的;但 fastText 只能作多类别分类,从多个类别里预测出一个类。而评价指标 prec@1 只评价一个预测结果,恰好可以评价多类别分类。

YFCC100M 数据: https://research.facebook.com/research/fasttext/


.
延伸一:重磅:facebook公开了90种语言的Pre-trained word vectors

https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md
可怕的facebook,用fasttext进行训练,使用默认参数,300维度

 

VDCNN

 

论文连接:Very Deep Convolutional Networks for Text Classification

代码:https://github.com/zonetrooper32/VDCNN

  • 问题提出

深度学习在NLP领域的应用基本被RNN/LSTM垄断,并且基本都是浅层网络(1层或2层),你们广泛认为加深网络深度并无太大意义。而在图像和语音领域则正趋向于使用更深层次的卷积神经网络。本文做者试图探究深层的卷积网络在NLP领域的效果。做者认为卷积网络之因此能在图像领域取得较好的效果是由于卷积操做擅长提取图像像素之间的结构关系,而文本信息也有相似的结构关系:上下词语、短语、句子之间,难点在于如何有效的学习句子的深层表示。

本文提出了一种新的架构-VDCNN, 它基于字符级别(character level),只利用小尺度的卷积核池化操做,包含了29个卷积层,在文本分类任务中的多个数据集上取得了state of art 的效果。

  • VDCNN架构

总体架构如Figure1所示,句子长度为 [公式] ,首先会通过lookup层,每一个字符映射为一个 [公式] 维的向量,所以文本被表示为一个大小为[公式] 的tensor。在本文中 [公式] 的长度固定为1024, [公式] 的大小固定为16。而后,网络会通过三次池化操做。每次池化以前是若干个"Convolutional Block"。滤波器数量遵循两个原则:

  1. 对于相同的输出特征图大小,图层有相同数量的滤波器;
  2. 若是特征图的大小被减半,过滤器的数量增长一倍。

论文说这样能够减小内存占用,还没想明白是为何。—— ??

 

三次池化操做,每次池化特征图的大小都会减半,因此滤波器的数量也会相应double。如Figure1所示,滤波器的数量有三个量级,分别是128,256,512。最终Convolutional Block的输出tensor大小为 [公式] ,其中 [公式] , [公式] 。在本文中 [公式] 的大小固定为1024,所以 [公式] 。而实际上 [公式] 的长度能够是不固定的,尤为在使用Attention的时候。

Convolutional Block的输出会通过一个k-max pooling变成固定维度为 [公式] 的tensor,而后通过三个全链接。本文中k的大小取值为8,全链接的神经元数量为2048。

这里的池化操做使用的 k-max pooling,通常的最大池化层是在提取的特征中只取最大的值做为保留值,其余值所有抛弃。CNN中采用Max Pooling操做有几个好处:首先,这个操做能够保证特征的位置与旋转不变性,由于不论这个强特征在哪一个位置出现,都会不考虑其出现位置而能把它提出来。对于图像处理来讲这种位置与旋转不变性是很好的特性,可是对于NLP来讲,这个特性其实并不必定是好事,由于在不少NLP的应用场合,特征的出现位置信息是很重要的,好比主语出现位置通常在句子头,宾语通常出如今句子尾等等,而有些强特征又会屡次出现这些位置,这些信息其实有时候对于分类任务来讲仍是很重要的,可是Max Pooling 基本把这些信息抛掉了。其次,位置信息在这一步彻底丢失。

而 k-max pooling 的意思是:原先的Max Pooling Over Time从Convolution层一系列特征值中只取最强的那个值,那么咱们思路能够扩展一下,k-max pooling能够取全部特征值中得分在Top –K的值,并保留这些特征值原始的前后顺序,就是说经过多保留一些特征信息供后续阶段使用。很明显,k-max pooling能够表达同一类特征出现屡次的情形,便可以表达某类特征的强度;另外,由于这些Top k特征值的相对顺序得以保留,因此应该说其保留了部分位置信息。

  • Convolutional Block

Convolutional Block的结构如Figure2所示,每一个Convolutional Block由两个卷积层构成,每一个卷积层后接了一个Temporal Batch Normalization,以及一个ReLU激活层。滤波器的大小固定为3,数量则遵循上文提到的两个原则。加深网络深度就是经过添加Convolutional Block的方式达到的。

Temporal Batch Normalization的原理和Batch Normalization是同样的,都是作了归一化处理,好处是下降了网络对学习率的敏感度,能够使用大学习率,而且有泛化的能力,不用替代了dropout。Temporal Batch Normalization和Batch Normalization的不一样在于:Batch Normalization是在空间位置上作归一化(对应特征图的每个像素),Temporal Batch Normalization是在时序位置上作归一化(对应特征图的每个时刻向量)。

  • 最优参数
  1. 一共69个token:“abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:’"/| #$%ˆ&*˜‘+=<>()[]{}”加上padding token,space, unknown token。
  2. embedding size:16
  3. 文本长度:1024
  4. batch size:128
  5. learning rate:0.01
  6. 动量:0.9
  • 实验结果分析

做者在深度为9,17,29,49的状况下作了实验。实验结果如Table5所示。

  1. VDCNN在大数据集上表现较好
  2. 加深网络深度能提升效果
  3. MaxPooling的效果要优于其余Pooling。此处说的pooling应该是指网络前三次pooling。
  4. VDCNN要比state of art的卷积网络要好(【Zhang】)。除了小数据集AG和Sogou,其余数据集上都要比【Zhang】效果更好。在AG和Sogou上虽然没有TFIDF方式好,可是已经很接近了。
  5. 对u与VDCNN,29层的网络取得了最好的效果,再加深效果就降低了,可是得以证实的是采用相似ResNet那样的Shortcut connections能够下降梯度消失带来的影响从而提高效果。文中设计了49层的神经网络,虽然这种快捷链接改善VDCNN的效果,可是他仍是没有达到它应该有的效果,可是这已是对VDCNN在NLP中的里程碑了。
 

 

NLP︱高级词向量表达(三)——WordRank(简述)

若是说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在类似词寻找方面表现地不错。 
其是经过Robust Ranking来进行词向量定义。

相关paper:WordRank: Learning Word Embeddings via Robust 
Ranking
 
相关博客:https://rare-technologies.com/wordrank-embedding-crowned-is-most-similar-to-king-not-word2vecs-canute/?from=singlemessage&isappinstalled=0#

查询king关键词,WordRank 、 word2vec、fastText三者效果对比: 
这里写图片描述WordRank 、fastText都相对比较精准“crowned”、“throne”,而不是word2vec的“Canute”


. 
.

一、wordRank,与 word2vec、fastText三者对比

来源博客:《WordRank embedding: “crowned” is most similar to “king”, not word2vec’s “Canute”》 
根据Ranking算法获得的wordRank,与 word2vec、fastText三者对比 
这里写图片描述在不一样的项目需求上,有着不一样的训练精度,句法表达上,fastText更好,而在单个词语的类似性等内容表达上wordRank是三者中最好的 
同时随着数据量的增长精度呈现增加的趋势。 
. 
.


二、wordRank,与 word2vec、GloVe三者对比

来源paper:WordRank: Learning Word Embeddings via Robust Ranking

  • (1)精度

这里写图片描述

左图使用数据:WS-353 word similarity benchmark 
右图使用数据:Google word analogy benchmark 
从两个数据集的效果来看,wordRank效果极佳

  • (2)词类比与词类似比较

这里写图片描述类似词的寻找方面极佳,词类比方面不一样数据集有不一样精度。

结论:

  • 1.在语义类比中三种模型在低频词语上表现相对较差,在高频词语上表现效果较好;——有没有后续文章专门研究如何提升低频词的效果??
  • 2.在语法类比中,FastText优于Word2Vec和WordRank 。FastText模型在低频词语上表现的至关好,可是当词频升高时,准确率迅速下降(——为何?),而WordRank和Word2Vec在不多出现和很频繁出现的词语上准确率较低(——为何?);
  • 3.FastText在综合类比中表现更好,最后一幅图说明总体类比结果与语法类比的结果比较类似,由于语法类比任务的数量远远多于语义类比,因此在综合结果中语法类比任务的结果占有更大的权重;
  • 四、WordRank在语义类比任务上效果优于其余两种模型,而FastText在语法类比上效果更好。值得一提的是,若是用WordRank模型生成两个集合(词集合和上下文集合),WordRank使用它们词向量的内积对他们之间的关系建模,内积和他们之间的关系是直接成比例的,若是该词和上下文越相关,内积就会越大

综上,WordRank更适合语义类比,FastText更适合不一样语料库下全部词频的语法类比。


.

高级词向量三部曲:

一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 
二、NLP︱高级词向量表达(二)——FastText(简述、学习笔记) 
三、NLP︱高级词向量表达(三)——WordRank(简述) 
四、其余NLP词表示方法paper:从符号到分布式表示NLP中词各类表示方法综述

 
   

 

文本分类相关的知识,因此在此作一个总结。

介绍

定义

  • 在给定的分类体系中,将文本分到指定的某个或某几个类别当中
    • 分类对象:短文本(句子/标题/商品评论)、长文本(文章)
  • 分类体系通常由人工构造
    • 政治、体育、军事
    • 正能量、负能量
    • 好评、中性、差评
  • 分类模式
    • binary:2类问题,属于或不属于
    • multi-class:多类问题
    • multi-label:多标签问题,一个文本能够属于多类

应用

  • 垃圾邮件的断定
    • 是垃圾邮件、不是垃圾邮件
  • 根据标题为图文视频打标签
    • 政治、体育、娱乐、暴力、涉黄……
  • 根据用户阅读内容创建画像标签
    • 娱乐、教育、医疗……

方法

  • 人工方法
    • 基于规则的特征匹配,容易理解(足球、联赛->体育)
    • 依赖专家系统,不一样人物须要专门构建特征规则。费时费力
    • 准确率不高
  • 机器学习方法
    • 特征工程+算法(Naive Bayes/SVM/LR/KNN……)
  • 深度学习方法
    • 词向量+模型(FastText/TextCNN/TextRNN/TextRCNN)

传统方法

分类流程

 

 

文本预处理

英文

  • 数据中非英文部分
    • html、json等格式,提取出文本数据
    • 文本泛化:数字、表情符号、网址……
  • 拼写检查更正
  • 词干提取(steming)、词形还原(lemmatization)
    • has/had/having->have am/is/are->is isn't->is not
  • 大写转小写
  • 去停用词
    • a, to, the, according, any...

中文

  • 数据中非中文部分
    • html、json等格式,提取出文本数据
    • 文本泛化:数字、英文、网址……
  • 中文编码问题
  • 中文分词
    • 结巴分词、nltk、SnowNLP……
  • 去停用词
    • 啊、哎、哎哟、可是、不如……
  • 词语替换
    • 俺->我,俺们->咱们,装13->装逼
    • 禾斗匕匕->科比,孬->很差,灰机->飞机
    • CEO->首席执行官,Tencent->腾讯

文本表示

将文本转换成计算机可理解的方式。一篇文档表示成向量,整个语料库表示成矩阵

[公式]

  • 词袋模型(Bag of Words,unigram)
    • 忽略其词序和语法,句法,将文本仅仅看作是一个词集合。若词集合共有NN个词,每一个文本表示为一个NN维向量,元素为0/1,表示该文本是否包含对应的词。( 0, 0, 0, 0, .... , 1, ... 0, 0, 0, 0)
    • 通常来讲词库量至少都是百万级别,所以词袋模型有个两个最大的问题:高纬度、高稀疏性
  • n-grams 词袋模型(Bag of n-grams)
    • 与词袋模型相似,考虑了局部的顺序信息,可是向量的维度过大,基本不采用。若是词集合大小为NN,则bi-gram的单词总数为N^2N2 向量空间模型
  • 向量空间模型(Vector Space Model)
    • 以词袋模型为基础,向量空间模型经过特征选择下降维度,经过特征权重计算增长稠密性。

特征权重计算

  • 布尔权重
    若是出现则为1,没出现则为0。就是词袋模型。

[公式]

  • TFIDF型权重(Boolean weighting)

TF:词频率

[公式]

TF*IDF: 词频率乘以逆文本频率

[公式]
TFC: TF*IDF的归一化,使得同一文本中的词语能够相互比较

[公式]

  • 基于熵概念的权重(Entropy weighting)
    idf的做用是惩罚在语料中出现较多的词语。可是若是某一特征(词语)在同类文档中大量出现时,应该赋予较高的权重。 [公式]

特征选择

特征选择是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其他的特征项,从而达到降维的目的

  • 基于DF
    • DF小于某个阈值的去掉(太少,没有表明性)
    • DF大于某个阈值的去掉(太多,没有区分度)
  • 基于熵 该值越大,说明分布越均匀,越有可能出如今较多的类别中(区分度差);该值越小,说明分布越倾斜,词可能出如今较少的类别中(区分度好)
    [公式]
  • 信息增益
    体现词项为整个分类所能提供的信息量(不考虑该词项的熵和考虑该词项后的熵的差值)
    [公式]
  • [公式] 统计量
    统计词项和类别之间的独立性。 [公式] 越大,二者独立性越小,相关性越大

[公式]

[公式]

[公式]

分类器
将文本用向量表示以后,可适用于大部分机器学习方法

  • 朴素贝叶斯
  • KNN方法
  • 决策树
  • 支持向量机
  • GBDT/XGBOOST

深度学习方法

利用词向量表示文本,将没歌词表达为nn维稠密,连续的实数向量。

  • fastText
    论文:Bag of Tricks for Efficient Text Classification

原理是把句子中全部的词进行lookup获得词向量以后,对向量进行平均(某种意义上能够理解为只有一个avg pooling特殊CNN)而后直接接 softmax 层预测label。在label比较多的时候,为了下降计算量,论文最后一层采用了层次softmax的方法,既根据label的频次创建哈夫曼树,每一个label对应一个哈夫曼编码,每一个哈夫曼树节点具备一个向量做为参数进行更新,预测的时候隐层输出与每一个哈夫曼树节点向量作点乘,根据结果决定向左右哪一个方向移动,最终落到某个label对应的节点上。
特色就是快,在效果和其余方法差很少的状况下,训练速度比其余方法快一个量级。

  • TextCNN
    论文:Convolutional Neural Networks for Sentence Classification

详细原理以下:

首先,对句子作padding或者截断,保证句子长度为固定值 [公式] ,单词embedding成 [公式] 维度的向量,这样句子被表示为(s,d)(s,d)大小的矩阵(类比图像中的像素)。而后通过有 filter_size=(2,3,4) 的一维卷积层,每一个filter_size 有两个输出 channel。第三层是一个1-max pooling层,这样不一样长度句子通过pooling层以后都能变成定长的表示了,最后接一层全链接的 softmax 层,输出每一个类别的几率。
重点1:卷积是一维卷积,只在ss方向上作卷积,不在dd方向上作卷积,既卷积核的宽度大小为dd。由于文本和图像不一样,文本的局部特征只存在于上下文单词之间,既所谓的n-gram。卷积核大小设置为(2,3,4)就是为了分别寻找2-gram,3-gram,4-gram特征。
重点2:这里的特征就是词向量,有静态(static)和非静态(non-static)方式。static方式采用好比word2vec预训练的词向量,训练过程不更新词向量,实质上属于迁移学习了,特别是数据量比较小的状况下,采用静态的词向量每每效果不错。non-static则是在训练过程当中更新词向量。推荐的方式是 non-static 中的 fine-tunning方式,它是以预训练(pre-train)的word2vec向量初始化词向量,训练过程当中调整词向量,能加速收敛,固然若是有充足的训练数据和资源,直接随机初始化词向量效果也是能够的。

  • TextRNN
    论文:Recurrent Neural Network for Text Classification with Multi-Task Learning 利用CNN进行文本分类,说到底仍是利用卷积核寻找n-gram特征。卷积核的大小是超参。而RNN基本是处理文本信息的标配了,由于RNN先天就是为处理时间序列而设计的,它经过先后时刻的输出连接保证了“记忆”的留存。但RNN循环机制过于简单,先后时刻的连接采用了最简单的f=activate(ws+b)f=activate(ws+b)的形式,这样在梯度反向传播时出现了时间上的连乘操做,从而致使了梯度消失和梯度爆炸的问题。RNN的 变种LSTM/GRU在必定程度上减缓了梯度消失和梯度爆炸问题,所以如今使用的其实要比RNN更多
    利用RNN作文本分类也比较好理解。对于英文,都是基于词的。对于中文,首先要肯定是基于字的仍是基于词的。若是是基于词,要先对句子进行分词。以后,每一个字/词对应RNN的一个时刻,隐层输出做为下一时刻的输入。最后时刻的隐层输出h_ThT​catch住整个句子的抽象特征,再接一个softmax进行分类。

 

  • TextRNN + Attention
    RNN虽然号称能保持长久“记忆”,但其实仍是没法“记住”太长久的东西。越靠后的字词对最终输出的影响越大,可是这和人类阅读文本的习惯是不同的。一句话中对文本意义影响最大一一定是句子中间的某几个重点词汇。Attention的提出就是为了应对这个问题。详细介绍Attention恐怕须要一小篇文章的篇幅,感兴趣的可 参考14年这篇paper NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE。具体原理不做介绍,你们能够看论文呀~
    Attention运用到文本分类当中,参考论文Hierarchical Attention Networks for Document Classification。论文为了对doc进行分类,将doc从两个层次进行特征提取,首先在word层面提取sentence特征,而后从sentence层面提取doc特征,而且每一个层次都运用了Attention。在此我类比到句子分类中,讲一下Attention是怎么运用的。
    假设RNN每一个时刻的输出为 [公式] ,在上文TextRNN中咱们已经提到,最后时刻的输出会用做softmax的输入,既 [公式] 。Attention层其实就是普通的一层,它接收 [公式] ​,获得一个相应score,并通过归一化以后表明当前词的重要性,既 [公式] , [公式] 。Attention向量是每一个时刻输出的加权平均,既 [公式] 。最终输出为 [公式] 。

 

利用前向和后向RNN获得每一个词的前向和后向上下文的表示:
[公式]

[公式]
这样词的表示就变成词向量和前向后向上下文向量concat起来的形式了,即:
[公式]
最后再接跟TextCNN相同卷积层,pooling层便可,惟一不一样的是卷积层 filter_size = 1就能够了,再也不须要更大 filter_size 得到更大视野,这里词的表示也能够只用双向RNN输出

  • VDCNN
    论文:Very Deep Convolutional Networks for Text Classification 上述提到的文本分类模型都是浅层模型,目前NLP领域的模型,不管是机器翻译、文本分类、序列标注等问题大都使用浅层模型。这篇论文探究的是深层模型在文本分类任务中的有效性,文中最优性能网络达到了29层。具体请见此处
编辑于 2018-07-20
 
   

 

基础比较差的同窗能够看这篇文章,从2013年的DSSM[9]开始入手,慢慢补。篇幅所限,加上这方面研究相对很充分了,小夕就不展开讲啦。因此话说回来,将多轮对话与候选回复进行匹配的正确方式是什么呢?

3. 论文串烧

一切还要从两年前的秋天提及,曾经,有一个少年。。。

算了算了,仍是正经点吧,要否则无法写了╮( ̄▽ ̄"")╭总之,小夕从众多鱼龙混杂的检索式多轮对话的论文里精选出以下4篇进行串烧(按时间顺序,从经典到state-of-art),包括:

  • EMNLP2016 百度天然语言处理部的xiangyang大佬  的Multi-view[1]
  • ACL2017 MSRA   大佬的SMN[2]
  • COLING2018 上交的DUA[3]
  • ACL2018 百度天然语言处理部xiangyang大佬和lilu女神的DAM[4]

不过不要怕,小夕的论文分享老是浅显易懂还带点萌( ̄∇ ̄)

必需要提的:Multi-view model

想一下,怎么才能从单轮q-r的匹配扩展到多轮呢?一个最最最简单的想法就是直接把多轮对话首尾链接变成一个长长的单轮╮( ̄▽ ̄"")╭好比这种:

如上图,首先将各轮的对话链接起来(这里在链接处插入一个"__SOS__"的token),而后这里用RNN系网络取最后时刻隐态的方法分别获得query和response的向量表示,进而将这俩向量经过[公式] 的方法获得匹配分值(M为网络参数),进而经过 [公式] 获得匹配几率(p为参数)。固然,其实这里本质上就是一个基于表示的文本匹配模型,因此彻底能够用更复杂的表示方法和匹配函数(如SSE模型[8])来完成这个过程。

聪明的童鞋确定能够想到,显然这种将长长的word embedding sequence直接塞进网络获得整个多轮对话的表示(context embedding)的作法未免太看得起神经网络对文本的表示能力了,所以做者提出,不只要在这个word-level上进行匹配,并且还要在一个更高的level上进行匹配,这个level称为utterance-level(即把对话中的每条文本(utterance)看做word)。

如上图的绿色->黄色->红色的部分,首先获得对话的每条文本(utterance)的向量表示(这里用的14年Kim提出的那个经典CNN),这样历史的多轮对话就变成了一个utterance embedding sequence。以后再经过一层Gated RNN(GRU、LSTM等)把无用的utterances中的噪声滤掉,进而取最后一个时刻的隐状态获得整个多轮对话(context)的context embedding啦。

拿到context embedding后,就能够跟以前word-level中的作法同样,获得对话与candidate response的匹配几率啦。最后,将word-level获得的匹配几率与utterance-level获得的匹配几率加起来就是最终的结果。

实验结果以下

能够看到utterance-level确实是明显比word-level work的,并且集成一下提高效果更显著。所以从这篇论文后的大部分论文也follow了这种对每条utterance分别进行处理(表示或交互),然后对utterance embedding sequence用Gated RNN进行过滤和获得context embedding的思路。

而到了2017年,文本匹配的研究明显变得更加成(花)熟(哨),各类花式attention带来了匹配效果的大幅度提高,这也标志着检索式多轮对话这方面的玩法也将变得丰(麻)富(烦)。

一次大大的进化:SMN model

若是说Multi-view模型在检索式多轮对话领域开了个好头,那么SMN则是将这个大框架往前推动了一大步。虽然表面上看Multi-view模型与SMN模型相去甚远,可是熟悉文本匹配的小伙伴应该有注意到,16年左右,基于交互的匹配模型开始代替基于表示的匹配模型成为主流[6],所以在Multi-view中内嵌的匹配模型是基于表示的,而到了17年的这个SMN模型则使用了前沿的基于交互的匹配方法。另外除了改变文本匹配的“派系”以外,SMN还有一个比较亮的操做是在作文本匹配的时候考虑了文本的不一样粒度 (granularity) 之间的匹配,这个操做也成为了后续一些paper的follow的点。

对文本匹配比较熟悉的同窗应该在AAAI2016看过这么一篇paper:

Text Matching as Image Recognition (参考文献[5])

如图,基本思想就是,使用传统的attention来计算出两个文本的word-level对齐矩阵/类似度矩阵后,将该矩阵当作一个图像,而后使用图像分类模型(如CNN)来获得更高level的类似度特征表示(好比phrase level, segment level等),进而最终获得全局的类似度匹配特征。这也是最先的几个交互式文本匹配模型之一。

SMN这篇paper就是采用了这个思想。给定一个candidate response,在生成word-level的每一个utterance的向量表示的时候,首先计算出历史上每一个utterance跟该response的对齐矩阵,而后对每一个对齐矩阵,均使用上面这种图像分类的思想生成high-level表征文本对类似度的特征向量做为该utterance的向量表示(utterance embedding)。

以后就是使用前面Multi-view中的作法,从这个utterance embedding sequence中获得整个对话的context embedding,最后将该context embedding和以前的word-level下获得的context embedding与response的向量去计算类似度了。

不过做者这里在计算对齐矩阵和获得context embedding的时候,用了更复杂一些的方法。如图

在计算对齐矩阵的时候,做者不只用了原始的word embedding,并且同时用了RNN系模型对文本encoding以后的隐状态(即编码过上下文信息的word embedding,能够看做phrase-level的"word embedding"了),这样就生成了两份对齐矩阵,而后这样将两份对齐矩阵做为两个channel丢进“图像分类模型”,从而保证了即便图像分类模型很浅,也能抽取出比较high-level的特征,获得高质量的utterance embedding。

另外,做者这里在获得最终的context embedding的时候,除了使用RNN最后一个隐状态的传统作法(记为 [公式] )外,做者还额外实验了对顶层各个time step的隐状态进行加权求(权重可训练)的方式( [公式] )以及更复杂的集成utterance自身表示的信息并使用self-attention的方式( [公式] ),实验结果代表,总的来看 [公式] 的方式稍好一些(不过考虑到额外引入的计算和存储开销,通常不值得这样作)。有兴趣的同窗能够去看原paper,这里就不展开讲啦。

从实验效果来看,SMN相比较以前的Multi-view有很大的提高,这也说明了:

  1. 在q-r匹配上,基于交互的模型相比基于表示的模型有更大的优点,这一点与检索式问答和NLI任务中的实验表现一致;
  2. 对文本进行多粒度表示是颇有必要的。

utterance也要深度encoding!DUA model

虽然看似SMN已经考虑很周到了,可是若是细想一下,其实SMN的建模方式仍是跟现实中人们的聊天习惯存在不小的gap的。其中一个方面就是,Multi-view和SMN都没有重视utterances之间的语义关系,仅仅是经过一层Gated RNN进行了软过滤和简单encoding。然而其实不少时候建模utterances之间的关系是颇有必要的,甚至对于过滤来讲也是很重要的信息,这也是DUA的motivation。咱们知道,其实聊天中不多从头至尾都是一个主题,好比下面的对话:

case1:

u1-> 路人甲:小夕,中秋节你去哪里玩儿啦?

u2-> 小夕:固然是去买买买呀~

u3-> 路人甲:你以前不是想去爬百望山嘛?没去嘛?

u4-> 小夕:想去呀,然鹅她们去玩儿都不带我(。 ́︿ ̀。)

u5-> 路人甲:你稍等下啊,我下楼取个快递

u6-> 小夕:去吧去吧,顺便帮我买个辣条!

u7-> 路人甲:好呀,要啥口味的?鸡肉味?

u8-> 小夕:这特喵的还分口味?

u9-> 路人甲:回来啦,对了,要否则下周我带你去吧?

u10-> 小夕:好呀好呀,喵喵喵~

 

这里若是把小夕看做是检索式chatbot,假如对话进行到第6步(u6),这时候最后一个utterance是u5,也就是“你稍等下啊,我下楼去取个快递”。显然,这时候其实至关于对话的话题发生了剧烈偏移,若是这时候小夕去跟一堆candidate responses作匹配的时候还去考虑u1-u4这些登山相关的utterances的话,显然就容易召回跟u5很不相关的回复。一样的道理,若是对话进行到u8,其实这时候真正有用的historical utterances是u6-u7;对话进行到u10的时候,有用的utterances又变成了u1-u4。

除此以外,对话中还容易夹杂一些相似于停用词的噪声,好比

case2:

u1-> 路人乙:小夕,明天约约约?

u2-> 小夕:。。。

u3-> 路人甲:哈哈

u4-> 小夕:应该木有时间

这里的u2和u3就是相似于停用词的“停用utterance”,因此对于这一类utterance,最好的办法就是忽略掉而不是让它们参与匹配。

怎么解决上述这两类问题呢?那就直接上这个让人看着灰常懵逼的DUA的模型图吧:

如图,这个图乍一看有点乱(其实画的确实不怎么样(做者应该不会看个人文章吧2333))

啊啊啊做者居然真的看我文章了QAQ论文做者在评论区出现的那一刻个人心情是复杂的!

论文里的公式标记也用的乱乱的(尤为第3.3节凭空冒出来的n弄得我懵逼了很久,究竟是不是3.1节的n,是的话这里貌似就不对了,若是不是,这里又表明啥);一些细节也没交代清楚(好比3.1的S究竟是个矩阵仍是向量,若是是向量,那么怎么获得的这个向量?是矩阵的话3.2节的聚合又不对了)。

超级感谢论文做者   的耐心解惑,一会儿清楚多啦。以下:
首先,3.3节的n与3.1节的n是相同的指代,若是做者以为指代相同的时候有什么问题的话,欢迎进一步交流。同时,很是抱歉咱们在3.1里把3.2中定义的东西用了进来,其中3.1节的S_k指的是3.2节中的S的每个组成部分,即,S_1, S_2,...,S_t,S_r。若是还有相关问题,欢迎随时来交流!

不过,其实这里的思想很明确,就是说,之前的paper呀,获得utterance embedding后就直接拿去RNN了,都没有像处理word embedding那样去好好作encoding,因此咱们这里对utterance embedding也一样要作深度的encoding

那么怎么作这个encoding呢?经过观察上面的俩cases能够发现,不少时候对话中是有hole的(好比上面case1中的u9的上一句话是u4,因此u5-u8造成了一个空洞),甚至可能不少个hole,因此这里作encoding的时候最合适的是使用self-attention而不是RNN更不是CNN。因此做者在这里先用了一层(加性)self-attention来把上下文编码进每一个utterance embedding:

这里 [公式] 是t时刻的utterance embedding(就是前面聚合操做以后的那个向量表示), [公式] [公式] 是其上下文(即所有时刻的utterance embedding,一共n个)。 经过这个encoding操做,一会儿每一个时刻的utterance都能跨越时间和空洞把本身的那一群小伙伴聚在一块儿啦。

然鹅显然self-attention丢失了utterance的顺序信息,所以做者这里又把encoding后的utterance embedding跟encoding前的utterance embedding拼接起来又过了一层Gated RNN:

Gated RNN(GRU、LSTM等)一方面能够按照时序进一步encoding,另外一方面里面的输入门也起到了filter的做用,正好能够在增强encoding的同时把无用的信息过滤掉。看,这样就完成了当时的motivation,最后的这个utterance embedding能够说干净合理的多了。整个模型的其余部分则跟SMN基本没区别。

从实验结果来看,DUA的性能确实比SMN有了进一步明显的提高。

state-of-the-art:DAM model

这篇是多轮对话领域可贵的好paper,可能xiangyang大佬太忙,都木有打打广告什么的╮( ̄▽ ̄"")╭。做者这里抛弃了以前的建模utterance embedding sequence的思路,而是把NLP不少领域的前沿操做优雅干净的整合为一个全新的框架来建模多轮对话问题,不只模型很是work,实验章节也对模型各个component的特色和有效性进行了充分的探索和论证,是继Multi-view和SMN以来多轮对话领域又一个不得不提的经典模型。

另外,遇到一张清晰漂亮的模型图不容易哇,就直接上图吧

ps:这张图这么少女心,我猜是lilu女神画的。

还记得前面说的SMN的一个亮点是作了两级粒度的文本表示嘛?那么很天然的就有了一个问题:两级就够了嘛?有没有必要设置更多级呢?若是有必要的话,那么怎么去表示和学习这更多级粒度的语义表示呢?

首先答案固然是确定的,17年的SSE文本匹配模型和今年特别火的ELMo[10]都说明了对文本的深层表示能够学习到更加高level的语义单元,然而咱们知道像SSE和ELMo这种堆多层RNN的作法会极大的增长模型的推理代价,这极大的限制了它们在工业界的应用。而堆多层CNN在文本里又不容易调work,须要精细的设计网络并借助一些tricks,所以很天然的作法就是使用Transformer[11] encoder来获得文本的多级表示啦(没看过transformer那篇paper的赶忙去补啦,作NLP哪能不知道transformer)。

因此如图,DAM首先就用transformer的encoder来获得了每一个utterance和response的多粒度文本表示(即图中的Representation部分),以后做者对每一个utterance-response pair的每一个粒度下的表示分别计算两个对齐矩阵(即图中的Matching部分)。

等下,怎么是俩对齐矩阵?除了传统的计算对齐矩阵的方式,还有新的玩法啦?

这里做者提出了一种更加深(隐)层(晦)的匹配方法,操做不难,可是为何会work仍是挺难以理解透彻的(虽然做者在5.2节已经有很努力的讲了)。总之,先来简单提一下传统的attention计算对齐矩阵的方式。

传统的方法无非就是把文本1中的word embedding sequence和文本2中的word embedding sequence进行词-词比较,这里的比较分为加性方法和乘性方法,基础差的同窗能够看下面这段复习一下。

注:词-词比较的方式分为加性和乘性,加性就是将要比较的两个word embedding进行相加(相加前能够先过一个线性变换甚至MLP)而后激活后跟一个虚拟的向量作内积(其实这个虚拟向量就是个可训练的同维度向量,我理解的它存在的意义就是对每一个维度的加法比较+激活后的结果进行scaling,毕竟维度不一样方差也可能不一样嘛),内积的结果就是对齐程度啦。乘性则容易理解一些,就是将两个word embedding直接进行相乘(准确说是内积)或中间夹一个可训练方阵(即 [公式] 的形式),内积的结果就是对齐的程度啦。不过要记得当维度很高时,乘性方式最好对结果作个归一化以避免进入softmax饱和区(参考Transformer)。

如上式,做者这里使用的是乘性的方式,这里的l就是指的第l级粒度, [公式] 是指的第i个utterance, [公式] 有 [公式] 个词,response有 [公式] 个词。这里就是说,对于每级语义粒度的每一个utterance,都是将其中的每一个词k去跟response中该粒度下的每一个词t去算内积,从而获得一个 [公式] 的对齐矩阵。

对于传统的attention,若是两个词在semantic或syntactic上离得近,就容易获得比较大的匹配值(如run和runs, do和what)。然而对于一些比较深层和隐晦的语义关系就很难直接匹配了(咱们不能强求前面的网络把各级粒度的语义单元的embedding都学的那么完美呀对吧),因此做者这里提出了一个更加间接和隐晦的attention方式,以下

这里的AttentiveModule的3个参数依次为attention的Query、Key和Value,不熟悉的同窗去复习Transformer,这里就不赘述啦。首先看公式8和9,这里先经过传统的attention来把utterance和response中的每一个词用对面文本的词加权表示,获得新的utterance的word embeding sequence表示和新的response的word embedding sequence表示,以后再用一层传统的attention来计算出一个对齐矩阵来做为第二个对齐矩阵。

显然这种方式将utterance中的词和response中的词之间的依赖关系(dependency information)也做为词的表示加入了对齐矩阵的计算,因此说是建模了更加深(复)层(杂)的语义关系。不过,做者在论文5.2节有提到这两种attention方式匹配文本的操做实际上是互补的,而且给出了一个case解释,然而小夕功力有限,努力理解了一下仍是没理解
╮( ̄▽ ̄"")╭但愿有看懂的小伙伴给小夕讲讲或者贴到评论区~

通过这么深层的匹配后,每一个utterance中的每一个词位都包含了2(L+1)维的匹配信息(L为Transformer encoder的层数,1为原始的word embedding,2为对齐矩阵的数量),做者这里又把utterances堆叠到一块儿,就造成了这个漂亮的3D粉色大立方体

因此这个大立方体的三个维度分别表明对话上下文中的每一个utterance、utterance中的每一个词(位)、response中的每一个词(位)。

以后,再经过一个两层的3D的卷积神经网络来从这个大立方体中抽取特征,获得匹配层的特征,最后的最后经过一个单层感知机获得该candidate response的匹配几率。

说了这么多,来看看实验结果吧~

能够看到实验结果很是漂亮(当前的state-of-art),尤为是 [公式] 这种比较有实际意义的指标(从10个candidates里召回top1)。并且DAM没有像DUA那样对utterance embedding sequence作深层encoding(这里直接用的3D conv抽特征了),可是实验结果明显比DUA好,能够说网络设计的很棒棒啦。

另外,做者这里也给出了去掉各个component后的性能状况:

好比对比DAM与倒数第二行能够看到,去掉那个复杂的深度注意力机制后,网络性能出现了明显的降低,说明论文中提出的这个“间接”的注意力机制确实能捕获到一些神奇的模式。

总结

最后小夕很是主观的总结一下这四个模型的亮点:

  • Multi-view提出了将utterance建模为一个语义单元来建模多轮对话问题;
  • SMN使用基于交互的匹配模型代替基于表示的匹配模型,并对文本进行多粒度表示;
  • DUA对utterance embedding进行深度的encoding来建模utterances之间的依赖关系;
  • DAM一方面对文本对进行多粒度表示并提出了一种深度attention的方法,另外一方面抛弃了以前建模utterance embedding sequence的思路,提出了一种将word-level和utterance-level的信息整合到一块儿,构建一个多通道的3D Image(其实把utterance当作单帧的图像,那这个大方块更像是一个视频),进而经过3D Image分类器完成匹配的新思路。

 

参考文献

[1] Multi-view Response Selection for Human-Computer Conversation, EMNLP2016
[2] Sequential Matching Network- A New Architecture for Multi-turn Response Selection in Retrieval-Based Chatbots, ACL2017
[3] Modeling Multi-turn Conversation with Deep Utterance Aggregation, COLING2018
[4] Multi-Turn Response Selection for Chatbots with Deep Attention Matching Network, 2018ACL
[5] Text Matching as Image Recognition, AAAI2016
[6] Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering, COLING2018
[7] Enhanced LSTM for Natural Language Inference, ACL2017
[8] Shortcut-Stacked Sentence Encoders for Multi-Domain Inference, Proceedings of the 2nd Workshop on Evaluating Vector Space Representations for NLP. 2017
[9] Learning Deep Structured Semantic Models for Web Search using Clickthrough Data, CIKM2013
[10] Deep contextualized word representations, NAACL2018
[11] Attention Is All You Need, NIPS2017

 


 

 

填槽与多轮对话 | AI产品经理须要了解的AI技术概念

hanniman  12031阅读 2017-10-13

​前言:本文做者@我偏笑,是咱们“AI产品经理大本营”成员,也是“AI研习小分队”的分享嘉宾之一(每4周分享一篇AI产品经理相关的学习心得总结);欢迎更多有兴趣“主动输出”的朋友们一块儿加入、共同进步:)

1-封面.jpeg

序言

以一周前的这条微博做为开始——

2微博.jpeg

一周前我讲:相对的,天然语言解析技术已经逐渐再也不成为各家广义智能助理产品的核心竞争力,识别用户意图以后所提供的服务开始成为对话机器人差别化的核心。

3对话系统的组成.jpeg

对于一个对话系统而言,我微博中所指的『后续服务』,就是上图中的 DST(对话状态维护)以及 Policy(动做候选排序),或者统一的称其为 DM(Dialogue Mannagement,对话管理)。也即,当接收到 NLU 模块的输出、其余场景及用户特征信息以后,判断系统应该跳转到什么状态,以及执行什么样的动做。

产品角度,DM 是对话机器人封闭域多轮对话体验的核心,正是一次次 DST + Policy 造成了人机间的多轮对话体验。(注:我我的倾向于将“识别用户意图以后,为了获取必要信息,与用户进行的有目的的多轮对话”称为封闭域多轮对话,区别于识别用户意图以前,为了利用上文信息,所采用的『上下文替换』、『主体补全』等技术,也即开放域多轮对话。下文提到的『多轮对话』,均指封闭域多轮对话。)

既然多轮对话在对话机器人类产品体验中扮演着如此重要的角色,我便开始思考:一个架构完备的多轮对话体系应该是什么样的。也即,多轮对话系统中,至少须要包含哪些模块,才能为用户提供一种与人人对话相去不远的人机对话体验。

 

1、多轮对话

多轮对话定义

我有个习惯,就是在构造一个复杂系统以前,先从纷繁的细节之中跳出,尝试抽象的描述整个系统,及系统中的各个模块,也即为它们『下定义』。这能帮助你在多种可行方案中作出选择,也即帮你明确:什么该作,什么不应作,什么该谁作

 

基于以上思想,我尝试先给出几个我我的对于多轮对话体系定义问题的回答——

基本定义:什么是多轮对话? (封闭域)多轮对话是一种,在人机对话中,初步明确用户意图以后,获取必要信息以最终获得明确用户指令的方式。多轮对话与一件事情的处理相对应。

补充说明1:所谓『必要信息』必定要经过与用户的对话获取吗? 不必定,即使是人与人之间的交流,对话自己所包含的信息也只占总传递信息量的小部分,更多信息来源于说话人的身份、当前的时间/地点等一系列场景信息。因此多轮对话的信息获取方式,也不该当只局限于用户所说的话。

补充说明2:多轮对话必定在形式上表现为与用户的屡次对话交互吗? 不必定,若是用户的话语中已经提供了充足的信息,或者其它来源的补充信息已足够将用户的初步意图转化为一条明确的用户指令,那就不会存在与用户的屡次对话交互。

以上,是针对多轮对话总体定义问题的回答,每一个模块的相关定义会在下文尝试给出。

 

2、槽

一、槽(slot)

基本定义:什么是槽? 槽是多轮对话过程当中将初步用户意图转化为明确用户指令所须要补全的信息。一个槽与一件事情的处理中所须要获取的一种信息相对应。

补充说明:多轮对话中的全部的槽位都须要被填充完整吗? 不必定,以以下对话为例——

我:『去萧山机场多少钱』 

出租车司机:『70』

对话中的『70』,应当被理解为70元人民币,而没必要再去追问:『你说的是人民币、美圆、日元仍是港币?』。这类信息应当以默认值的形式存在,也即槽有必填非必填之分,与上文所说的『信息未必须要经过与用户的对话获取』相对应。

 

二、词槽与接口槽

上文反复的提到,对话内容并非获取信息的惟一方式,用户身份以及当前场景也包含着大量值得被利用的隐含信息。因此,与此相对的,一个完备的多轮对话体系应当同时具有从用户话里以及话外获取信息的能力。

我我的将“利用用户话中关键词填写的槽”叫作词槽,“利用用户画像以及其余场景信息填写的槽”叫作接口槽

举个例子,我讲『我明天要坐火车去上海』。其中,分别将『明天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

 

三、槽组与槽位

我我的将“利用用户话中关键词填写的槽”叫作词槽,“利用用户画像以及其余场景信息填写的槽”叫作接口槽

举个例子,我讲『我后天要坐火车去上海』。其中,分别将『后天』、『上海』填入名为『出发时间』、『目的地』的词槽中,而我当前所在的位置,则填入到了名为『出发地』的接口槽中。

不知道上文错的如此离谱的结论,有没有引发你的注意:)

仔细读一遍上面举的例子,就会发现一个很严重的矛盾点:难道『出发地』这个槽不能由用户指定?用户彻底能够说『我后天要坐火车从北京去上海』,那它是词槽仍是接口槽?并且更进一步的,难道只能用『我当前所在的位置』来填入『出发地』这个槽中?好比,若是能读到个人日程表,发现我明天会去杭州,那是否是就应该用『杭州』而不是『我如今所在的位置』来填『出发地』这个槽了?

 

从中咱们能发现什么呢?同一个槽,可能会存在多种填槽方式

我将可能包含多种填槽方式的称为槽组,槽组下面可能存在任意多个槽位,也即任意多种填槽方式,而每一个槽位又都对应着『词槽』与『接口槽』两种槽位类型之一。

本质上来说,槽组(也即上文中提到的『槽』),对应着一种信息,而几乎不会有哪一种信息的获取方式只有一种。因此一个『槽』会同时对应多种填槽方式也就是天然而然的了。

依照上文,同一种信息会有多种获取方式,也即同一个槽组会对应多种填槽方式(槽位)。那不一样填槽方式之间必然会存在优先级的概念。

就如同上文『订票』的例子,『出发地』槽包含三种填写方式,一种词槽、两种接口槽,天然的,词槽的优先级最高,『日程表中隐含的出发地』次之,『我当前所在的位置』再次。

 

若是将其与前文提到过的必填/非必填结合起来,其填槽过程应当遵循如下步骤:

  • 尝试填写词槽

  • 若失败,尝试填写第一接口槽『用户日程表中隐含的出发地』

  • 若失败,尝试填写第二接口槽『用户当前所在位置』

  • 若失败,判断是否该槽必填

  • 若必填,反问用户,重填词槽 *若非必填,则针对该槽组的填槽过程结束

咱们须要知道,必填/非必填在逻辑上与槽组而不是槽位平级,只有信息才会分为必要/非必要,填槽方式不作这种区分。并且是否必填实际上与接口槽无关,只取决因而否须要与用户进行交互。

 

四、澄清话术

槽组(也即与一种信息)平级的概念还有一个,叫作澄清话术

澄清话术是对话机器人但愿获取某种信息时所使用的问句。好比『目的地』对应的澄清话术就是『您想从哪出发呢?』,『出发时间』对应的澄清话术就是『您想什么时间出发呢?』。

显而易见的,澄清话术与槽组而不是槽位平级。

 

五、槽的填写

上文讲到,一个槽组可能会有多个槽位,槽位存在词槽接口槽之分。

先说词槽。

词槽信息的抽取其实仍是有些麻烦的,不过这属于解析的问题,不在本文探讨的范围内,这里只是简单提一下,举两个例子:

  • 用户表达『不』,可能会有『不行』、『不是』、『算了』、『没有』等一系列说法。

  • 用户话中有多个符合条件的关键词,咱们整套多轮对话中有多个槽,每一个槽填一个仍是多个值?哪一个槽与哪一个词对应?

同义词典、规则、双向LSTM+CRF,各有各的方法。

 

再说接口槽。

接口槽与词槽相比,额外存在一个问题,就是:接口返回的结果就是用户须要的结果吗?

这里须要分红两种状况来讨论,一种是:咱们明确知道接口的返回值能够直接填入槽位(不是槽/槽组)中,不须要向用户确认

特别的,这里还要明确一点,即使是上述状况,也并不意味着当前槽/槽组只有该特定接口槽这一个槽位。有两种状况存在:一种是该槽组下只有这一个槽位,该接口的返回值直接填入槽位中,也至关于填入了槽/槽组中;或者该槽位下有多个槽位,接口槽的填入值并不必定最终做为槽/槽组的填入值。

另外一种是:咱们知道接口的返回值只能做为参考,须要用户的协助才能进行槽位的填写

这种状况下,须要提供选项,让用户最终决定该槽位的填入值,与词槽同样,这里一样须要处理单值/多值的问题。单值/多值在逻辑上与槽组平级。

 

此外,这里还要注意一个否定选项的问题,好比我对阿里小蜜说,我忘记密码了,它会经过接口拿到个人当前帐号,而后将其提供选项给我,问『你是忘记了哪一个帐号的密码?』,不过,除了我当前帐号以外,还有一个选项也被提供出来了,就是『不,不是这个帐号』。

这表明了一类问题的存在,用户的意图并不必定包含在接口的所有返回值之中。因此就必然会有这样一种相似『不要/不是/不』的选项,我将其叫作否定选项

用户选择否定选项后,即意味着该槽位的填写失败了,须要填入一个特殊值表明失败。用户选择否定选项的失败,能够与接口调用失败等其它意外状况合并处理,由于这都意味着该槽位填写失败,意味着该种信息获取方式未能成功获取信息

若是该槽组下只有这一个槽位,这个特殊的失败表征值就应看成为整个槽组的填入值,若是还有其余槽位值,则根据槽位间优先级最终肯定槽组填入值。

 

六、平级槽和依赖槽

上面说到底都在讲一个槽组的填写,也即一种信息的获取,但多轮对话的目的是将初步用户意图转化为明确用户指令,这其中所须要的信息一般都不仅有一种。

谈完了槽组与槽位之间的关系,接下来谈一下槽组与槽组之间的关系,也即信息与信息之间的关系。

 

为了便于理解,我先举两个例子来表明两种多轮对话中所包含的极端状况。

第一种:订车票,你须要知道用户出发的时间、地点、目的地、座位种类。这四个槽组之间,没有任何依赖关系。换言之,你只须要肯定好这四个槽组中必填槽组之间的澄清顺序,接收到用户问句后,对还未填充完成的必填槽组依次进行澄清便可。我将这四个槽组之间的关系称为平级槽关系

另外一种,不知道读者玩没玩过橙光,或者其它多结局的剧情类游戏。它们的特色是什么呢?每个选择都会有影响到后续剧情发展也即 每一个槽组的填写结果会影响其它槽组的填写。换言之,部分槽组依赖前序槽组的填写结果,在其依赖的前序槽组填写完成以前,该槽组都没法进行填写。我将槽组间的这种关系称为依赖槽关系

这种状况下,整个多轮对话过程就造成了一棵树,极端状况下,这棵树是的。树上的每一个节点放置着一个会对后续对话走向产生影响的槽组

 

槽关系的选择要根据实际业务场景来肯定。

若是错将平级槽采用依赖槽关系来管理,就会出现信息的丢失。好比 A、B、C,三者本为平级槽关系,但却将其用 A->B->C 的依赖槽关系来管理,那即使用户问句中包含填写 B、C 槽组的信息,也可能会因为 A 槽组的未填写而形成 B、C 槽组的填写失败。

若是错将依赖槽采用平级槽的关系来管理,就会出现信息的冗余,好比 A、B、C三者的关系为 A、A1->B、A2->C,那即使用户将值 A1 填入槽组 A 后,却仍然须要向用户询问本不须要的 C 槽组的填写信息。

上述两种状况属于全平级槽关系全依赖槽关系的特殊状况,在实际的业务场景中,这两种关系会是同时存在的,不一样槽组间,既有平级槽关系,又有依赖槽关系。

 

实际业务场景中,完整的多轮对话过程一般会以的形式存在,每一个节点存在一个或多个槽组,用于获取一种或多种信息,节点间的槽组为依赖关系,节点内的槽组为平级关系

上文将多轮对话定义为一件事情的处理,槽组/槽定义为一种信息的获取,槽位定义为信息的一种获取方式。这里我倾向于将多轮对话树结构中的一个节点定义为处理事情的一个步骤

一件事情的处理包含多个步骤,每一个步骤中须要补全一种或多种信息,每种信息存在一种或多种获取方式。

 

上述定义和组里算法大佬的定义有些分歧,不过谁让这是个人文章呢:)就按个人来。

 

七、填槽意义

结合上文,咱们须要了解到,填槽的意义有两个:做条件分支多轮对话做信息补全用户意图。换言之,填槽不只是补全用户意图的方式,并且前序槽位的填写还会起到指导后续信息补全走向的做用。

4.jpeg

 

八、准入条件

上文咱们讲到,完整的多轮对话过程一般会以的形式存在,树中包含多个节点,表明处理这件事情的一个步骤

而每一个节点,都应当有其特别的准入条件。树的根节点每每须要限制 NLU 模块的输出,也即明确什么样的用户意图将会由该棵多轮对话树来处理;树的中间及叶子节点每每须要根据前序槽组的填槽结果以及其余背景信息进行条件限制。(若是将全部信息,好比 NLU 模块输出,或是其余背景信息都看作前序槽组的填写结果,那就能获得统一的槽组-条件-槽组-条件······形式,槽组用于获取信息,条件用于信息限制

 

我尝试从两个角度来描述一套完备的准入条件体系。

一个是多条件的组织形式,准入条件在逻辑上应该支持条件间的与或非,百度的 UNIT 平台提供了一种相对成熟的组织形式,将准入条件总体划分为条件条件组,条件包含在条件组中,组内条件间是关系,条件组之间是关系(固然这里的且与或能够根据自身业务状况对调),条件自己支持关系。

一个是单条件的限制能力,准入条件应当同时支持对前序槽组填写值、填写方式、填写状态进行限制。也即须要有针对值的条件针对类型的条件针对状态的条件。简单的讲,状态就是『填了吗』,类型就是『谁填的』,值就是『填了什么』。

不一样业务场景下咱们会须要不一样角度的限制条件。好比,上文中提到填槽的意义包含两种:做条件分支多轮对话做信息补全用户意图,若是仅仅做信息,那咱们一般就只关心『填了吗』,只要填写完成就进行后续步骤,并不关系『谁填的』以及『填了什么』;可是若是槽组内的填入值会影响后续多轮对话走向,那咱们就倾向于经过槽组的填入方式填入值来做多轮对话的分支。

5准入条件.jpeg

 

3、答案系统、话题切换和状态切换

1)答案系统

先明确一个观点,多轮对话树的节点属于对话节点而不是答案节点同一份答案可能会出如今多个对话节点中

答案系统和多轮过程应当是解耦的,答案系统中的每份答案都应当设置好本身的触发条件。举个例子,若存在 ABC 三个槽,A=A一、B=B三、C=C1 提供答案一,A=A二、B=B一、C=C2 或 A=A三、B=B二、C=C1 提供答案二。

另外,答案的种类也不该仅局限于文本,富文本、接口、话题切换,均可以视为合理的答案形式。

 

2)话题切换

话题切换指用户与用户的对话从一个多轮过程切换至另外一个多轮过程,话题切换有主动切换被动切换之分。

上文提到的做为答案的话题切换,就能够理解为主动的话题切换

被动的话题切换是指,系统发现没法从用户的问句中抽取信息以继续当前的多轮对话,只好将其做为一条全新的问句从新进行解析和话题识别

话题切换,尤为是主动的话题切换会涉及到一个新问题:槽继承。举个例子——

我:『我明天要坐高铁从杭州到北京』 

我:『算了,仍是坐飞机吧』

这种状况下,机器人不该当重复询问『出发地』、『出发时间』和『目的地』。

 

除了槽继承,还有一个与之相对的问题叫作槽记忆,这一般适用在被动式的话题切换中。因为解析失误,或者其余缘由,使得用户跳出了原话题,当用户在必定时间内从新回到原话题时,不该让用户重复进行填槽,该技术已被用于阿里小蜜,不过他们彷佛称之为『多轮状态记忆』。

举个例子——

我:帮我订张从杭州到北京的机票。 

VPA:请问您但愿哪天出发呢? 

我:明天杭州下雨吗? 

VPA:明天杭州有雷阵雨。 

我:后天呢? 

VPA:后天杭州天气晴。 

我:机票订后天的。 

VPA:好的,已帮你预约后天从杭州到北京的机票。

 

三、状态切换

咱们还须要思考这样一个问题,既然话题能够切换,也即一个多轮过程能够切换到另外一个多轮过程,那多轮过程当中的对话状态是否能够切换?

我举两个例子——

第一个:

我:帮我订张机票,从杭州出发。

VPA:请问你想去哪呢? 

我:(发现明天杭州有雷阵雨)换出发地。 

VPA:请问你想从哪出发呢? 

我:上海。

多轮对话应当容许回到前序节点

 

第二个:

我:我想买个杯子。 

VPA:如下是为您推荐的杯子。(展现结果一) 

我:换一换。 

VPA:如下是为您推荐的杯子。(展现结果二)

多轮对话应当容许重复进入同一节点

 

结语

就先这么多吧:)

 

注,饭团“AI产品经理大本营” ,是黄钊hanniman创建的、行业内第一个“AI产品经理成长交流社区”,经过天天干货分享、每个月线下交流、每季职位内推等方式,帮助你们完成“AI产品经理成长的实操路径”。

---------------------

做者:黄钊hanniman,图灵机器人-人才战略官,前腾讯产品经理,5年AI实战经验,8年互联网背景,微信公众号/知乎/在行ID“hanniman”,饭团“AI产品经理大本营”,分享人工智能相关原创干货,200页PPT《人工智能产品经理的新起点》被业内普遍好评,下载量1万+。

相关文章
相关标签/搜索