小夕从7月份开始收到第一场面试邀请,到9月初基本结束了校招(面够了面够了T_T),深深的意识到今年的对话系统/chatbot方向是真的超级火呀。从微软主打情感计算的小冰,到百度主打智能家庭(与车联网?)的DuerOS和UNIT,到渗透在阿里许多产品的全能型智能客服小蜜,以及腾讯的小微和搜狗的汪仔,更没必要说那些大佬坐镇的独角兽公司了,小夕深感以对话为主战场的NLP之风在工业界愈演愈烈,吓得小夕赶忙码了这篇文章。php
对话的概念很大,从输入形式上分为文本和语音,本文固然只考虑文本。从对话目的上分为任务型对话与非任务型/闲聊型对话。顾名思义,任务型对话就是为了解决任务而进行的对话,好比你让Siri帮你定闹钟、发短信等,而闲聊型对话固然就是human-to-human的正常聊天啦。本文就不讨论任务型对话了,有兴趣的同窗能够戳这里扫扫盲,本文聚焦在非任务型对话的多轮对话问题上。html
要完成对话的建模,目前主要分为检索式、生成式以及检索与生成融合的方式。顾名思义,检索式就是经过检索与匹配的方式从已有的大量candidate responses中找出最合适的那个做为response;生成式则是事先经过训练来把对话知识塞进模型中,推理的时候首先模型的encoder部分去读历史对话,而后模型中的decoder/语言模型部分直接生成相应的回复;检索与生成相结合的方法则玩法不少了,好比用生成模型来作检索模型的reranker,用生成模型来做改写,用生成模型生成的response来做为检索模型的一条response等。限于篇幅,本文只讲纯检索式的,其余的之后再说(maybe不会过久╮( ̄▽ ̄"")╭)。python
检索式对话的通常套路是首先构建一个由大量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
同媒体快讯
相关快讯
|
|
NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)
高级词向量三部曲:一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 1、理论简述一、word2vecword2vec:与通常的共现计数不一样,word2vec主要来预测单词周边的单词,在嵌入空间里类似度的维度能够用向量的减法来进行类别测试。 弊端:
二、GloVe
GloVe综合了LSA、CBOW的优势,训练更快、对于大规模语料算法的扩展性也很好、在小语料或者小向量上性能表现也很好。 2、测评
. 一、词向量测评方法一直以来,如何测评词向量仍是一件比较头疼的事情。
类比数据来源: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):找到人名,地名和机构名 . 三、利用词向量解决歧义问题也许你寄但愿于一个词向量能捕获全部的语义信息(例如run便是动车也是名词),可是什么样的词向量都不能很好地进行凸显。 . 3、Glove实现&R&python一、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). 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) 提出了一种通用的方法分析和解释了神经网络模型的决策——这种方法经过擦除输入表示的某些部分,好比将输入词向量的某些维、隐藏层的一些神经元或者输入的一些词。咱们提出了几种方法来分析这种擦除的影响,好比比较擦除先后模型的评估结果的差别,以及使用强化学习来选择要删除的最小输入词集合,使用于分类的神经网络模型的分类结果发生改变。 **分析揭示了 Word2Vec 和 Glove 产生的词向量之间存在一些明显的差别,同时也代表训练语料中的词频对产生的词的表达有很大的影响;
|
NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
. 高级词向量三部曲:一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 如何在python 很是简单训练FastText,可见笔者博客:极简使用︱Gemsim-FastText 词向量训练以及OOV(out-of-word)问题有效解决 1、FastText架构
. 一、fastText 架构原理
fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不一样类别的几率。 |
|
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 的效果。
总体架构如Figure1所示,句子长度为
论文说这样能够减小内存占用,还没想明白是为何。—— ??
三次池化操做,每次池化特征图的大小都会减半,因此滤波器的数量也会相应double。如Figure1所示,滤波器的数量有三个量级,分别是128,256,512。最终Convolutional Block的输出tensor大小为 Convolutional Block的输出会通过一个k-max pooling变成固定维度为 这里的池化操做使用的 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的结构如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是在时序位置上作归一化(对应特征图的每个时刻向量)。
做者在深度为9,17,29,49的状况下作了实验。实验结果如Table5所示。
|
NLP︱高级词向量表达(三)——WordRank(简述)
查询king关键词,WordRank 、 word2vec、fastText三者效果对比: . 一、wordRank,与 word2vec、fastText三者对比来源博客:《WordRank embedding: “crowned” is most similar to “king”, not word2vec’s “Canute”》 二、wordRank,与 word2vec、GloVe三者对比来源paper:WordRank: Learning Word Embeddings via Robust Ranking
左图使用数据:WS-353 word similarity benchmark
结论:
综上,WordRank更适合语义类比,FastText更适合不一样语料库下全部词频的语法类比。 . 高级词向量三部曲:一、NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) |
|
文本分类相关的知识,因此在此作一个总结。 介绍 定义
应用
方法
传统方法分类流程
![]()
文本预处理英文
中文
文本表示将文本转换成计算机可理解的方式。一篇文档表示成向量,整个语料库表示成矩阵
特征权重计算
TF:词频率 TF*IDF: 词频率乘以逆文本频率
特征选择特征选择是根据某个评价指标独立的对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其他的特征项,从而达到降维的目的
![]() 分类器
深度学习方法利用词向量表示文本,将没歌词表达为nn维稠密,连续的实数向量。
![]() 原理是把句子中全部的词进行lookup获得词向量以后,对向量进行平均(某种意义上能够理解为只有一个avg pooling特殊CNN),而后直接接 softmax 层预测label。在label比较多的时候,为了下降计算量,论文最后一层采用了层次softmax的方法,既根据label的频次创建哈夫曼树,每一个label对应一个哈夫曼编码,每一个哈夫曼树节点具备一个向量做为参数进行更新,预测的时候隐层输出与每一个哈夫曼树节点向量作点乘,根据结果决定向左右哪一个方向移动,最终落到某个label对应的节点上。
![]() 详细原理以下: ![]() 首先,对句子作padding或者截断,保证句子长度为固定值
![]()
![]()
![]() 利用前向和后向RNN获得每一个词的前向和后向上下文的表示:
编辑于 2018-07-20
|
|
基础比较差的同窗能够看这篇文章,从2013年的DSSM[9]开始入手,慢慢补。篇幅所限,加上这方面研究相对很充分了,小夕就不展开讲啦。因此话说回来,将多轮对话与候选回复进行匹配的正确方式是什么呢?
一切还要从两年前的秋天提及,曾经,有一个少年。。。
算了算了,仍是正经点吧,要否则无法写了╮( ̄▽ ̄"")╭总之,小夕从众多鱼龙混杂的检索式多轮对话的论文里精选出以下4篇进行串烧(按时间顺序,从经典到state-of-art),包括:
不过不要怕,小夕的论文分享老是浅显易懂还带点萌( ̄∇ ̄)
想一下,怎么才能从单轮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带来了匹配效果的大幅度提高,这也标志着检索式多轮对话这方面的玩法也将变得丰(麻)富(烦)。
若是说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有很大的提高,这也说明了:
虽然看似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有了进一步明显的提高。
这篇是多轮对话领域可贵的好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与倒数第二行能够看到,去掉那个复杂的深度注意力机制后,网络性能出现了明显的降低,说明论文中提出的这个“间接”的注意力机制确实能捕获到一些神奇的模式。
最后小夕很是主观的总结一下这四个模型的亮点:
参考文献
[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研习小分队”的分享嘉宾之一(每4周分享一篇AI产品经理相关的学习心得总结);欢迎更多有兴趣“主动输出”的朋友们一块儿加入、共同进步:)
以一周前的这条微博做为开始——
一周前我讲:相对的,天然语言解析技术已经逐渐再也不成为各家广义智能助理产品的核心竞争力,识别用户意图以后所提供的服务开始成为对话机器人差别化的核心。
对于一个对话系统而言,我微博中所指的『后续服务』,就是上图中的 DST(对话状态维护)以及 Policy(动做候选排序),或者统一的称其为 DM(Dialogue Mannagement,对话管理)。也即,当接收到 NLU 模块的输出、其余场景及用户特征信息以后,判断系统应该跳转到什么状态,以及执行什么样的动做。
产品角度,DM 是对话机器人封闭域多轮对话体验的核心,正是一次次 DST + Policy 造成了人机间的多轮对话体验。(注:我我的倾向于将“识别用户意图以后,为了获取必要信息,与用户进行的有目的的多轮对话”称为封闭域多轮对话,区别于识别用户意图以前,为了利用上文信息,所采用的『上下文替换』、『主体补全』等技术,也即开放域多轮对话。下文提到的『多轮对话』,均指封闭域多轮对话。)
既然多轮对话在对话机器人类产品体验中扮演着如此重要的角色,我便开始思考:一个架构完备的多轮对话体系应该是什么样的。也即,多轮对话系统中,至少须要包含哪些模块,才能为用户提供一种与人人对话相去不远的人机对话体验。
多轮对话定义
我有个习惯,就是在构造一个复杂系统以前,先从纷繁的细节之中跳出,尝试抽象的描述整个系统,及系统中的各个模块,也即为它们『下定义』。这能帮助你在多种可行方案中作出选择,也即帮你明确:什么该作,什么不应作,什么该谁作。
基于以上思想,我尝试先给出几个我我的对于多轮对话体系定义问题的回答——
基本定义:什么是多轮对话? (封闭域)多轮对话是一种,在人机对话中,初步明确用户意图以后,获取必要信息以最终获得明确用户指令的方式。多轮对话与一件事情的处理相对应。
补充说明1:所谓『必要信息』必定要经过与用户的对话获取吗? 不必定,即使是人与人之间的交流,对话自己所包含的信息也只占总传递信息量的小部分,更多信息来源于说话人的身份、当前的时间/地点等一系列场景信息。因此多轮对话的信息获取方式,也不该当只局限于用户所说的话。
补充说明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 槽组的填写信息。
上述两种状况属于全平级槽关系与全依赖槽关系的特殊状况,在实际的业务场景中,这两种关系会是同时存在的,不一样槽组间,既有平级槽关系,又有依赖槽关系。
实际业务场景中,完整的多轮对话过程一般会以树的形式存在,每一个节点存在一个或多个槽组,用于获取一种或多种信息,节点间的槽组为依赖关系,节点内的槽组为平级关系。
上文将多轮对话定义为一件事情的处理,槽组/槽定义为一种信息的获取,槽位定义为信息的一种获取方式。这里我倾向于将多轮对话树结构中的一个节点定义为处理事情的一个步骤。
一件事情的处理包含多个步骤,每一个步骤中须要补全一种或多种信息,每种信息存在一种或多种获取方式。
上述定义和组里算法大佬的定义有些分歧,不过谁让这是个人文章呢:)就按个人来。
七、填槽意义
结合上文,咱们须要了解到,填槽的意义有两个:做条件分支多轮对话、做信息补全用户意图。换言之,填槽不只是补全用户意图的方式,并且前序槽位的填写还会起到指导后续信息补全走向的做用。
八、准入条件
上文咱们讲到,完整的多轮对话过程一般会以树的形式存在,树中包含多个节点,表明处理这件事情的一个步骤。
而每一个节点,都应当有其特别的准入条件。树的根节点每每须要限制 NLU 模块的输出,也即明确什么样的用户意图将会由该棵多轮对话树来处理;树的中间及叶子节点每每须要根据前序槽组的填槽结果以及其余背景信息进行条件限制。(若是将全部信息,好比 NLU 模块输出,或是其余背景信息都看作前序槽组的填写结果,那就能获得统一的槽组-条件-槽组-条件······形式,槽组用于获取信息,条件用于信息限制)
我尝试从两个角度来描述一套完备的准入条件体系。
一个是多条件的组织形式,准入条件在逻辑上应该支持条件间的与或非,百度的 UNIT 平台提供了一种相对成熟的组织形式,将准入条件总体划分为条件和条件组,条件包含在条件组中,组内条件间是且关系,条件组之间是或关系(固然这里的且与或能够根据自身业务状况对调),条件自己支持非关系。
一个是单条件的限制能力,准入条件应当同时支持对前序槽组填写值、填写方式、填写状态进行限制。也即须要有针对值的条件、针对类型的条件和针对状态的条件。简单的讲,状态就是『填了吗』,类型就是『谁填的』,值就是『填了什么』。
不一样业务场景下咱们会须要不一样角度的限制条件。好比,上文中提到填槽的意义包含两种:做条件分支多轮对话、做信息补全用户意图,若是仅仅做信息,那咱们一般就只关心『填了吗』,只要填写完成就进行后续步骤,并不关系『谁填的』以及『填了什么』;可是若是槽组内的填入值会影响后续多轮对话走向,那咱们就倾向于经过槽组的填入方式或填入值来做多轮对话的分支。
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万+。