检索式chatbot:

 

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

1. 扫盲

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

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

2. 检索式模型的套路

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

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

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

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

 

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

这是 PaperDaily 的第82篇文章

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

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

■ 论文 | 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 等进行分类判断。

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

 

检索式chatbot:_第1张图片

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

模型选择

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 进行分类。

数据

为了更好的展示每个数据的情况,在这里直接用下图展示作者使用到的数据集:

 

检索式chatbot:_第2张图片

结果

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

 

检索式chatbot:_第3张图片
检索式chatbot:_第4张图片

从结果上看,作者实现的效果还是很厉害的,基本上跟原文章声明的不相上下,当然由于不是针对特定任务进行特别优化,所有效果还是有一点点差的,但基本上可以认为是实现了原来的效果,而且作者也发现了一些有意思的现象,例如:表现最好的就是 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
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 下一篇:Python爬虫之40行代码爬取金庸所有武侠小说
 

同媒体快讯

  • 多篇经典论文解读

    2019-10-03
  • DeepMind论文解读:让机器更深入地理解文本

    2019-10-03
  • 上海交大提出多模态框架“EmotionMeter”,更精准地识别人类情绪

    2019-10-03
  • 入坑AI却不知道该读什么?这15篇最新论文给你答案

    2019-10-03
  • 如何实现少样本学习?先让神经网络get√视觉比较能力

    2018-05-02
  • 本周 Github 精选:13 款炼丹利器,有开源工具包也有超大数据集

    2018-04-28
 

相关快讯

  • 如何用OpenCV、Python和深度学习实现面部识别?

    2018-07-02
  • 深度学习的卷积算法指南1卷积和池化简介

    2018-06-19
  • 《Relation Networks for Object Detection》论文笔记

    2018-06-12
  • C+OpenCV基于距离变换与分水岭的图像分割

    2018-06-07
  • 深度学习图像识别项目(中):Keras和卷积神经网络(CNN

    2018-05-11
  • 全连接神经网络(下)

    2019-10-03

 

 

 

 

 

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

有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的学习。 
部分学习内容来源于小象学院,由寒小阳老师授课《深度学习二期课程》


高级词向量三部曲:

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


一、理论简述

1、word2vec

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

弊端:

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

2、GloVe

GloVe和word2vec的思路相似(论文链接) 
但是充分考虑了词的共现情况,比率远比原始概率更能区分词的含义。

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


二、测评

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

. 
.

1、词向量测评方法

一直以来,如何测评词向量还是一件比较头疼的事情。 
主要方法分为两种:内部测评(词类比)与外部测评(命名实体识别(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):找到人名,地名和机构名 
    . 
    .

2、测评结果

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

  • (1)内部测评

类比评测和超参数:

相关性评测结果: 

  • (2)外部测评

命名实体识别(NER):找到人名,地名和机构名 

. 
.

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

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

. 
. 
.


三、Glove实现&R&python

1、Glove训练参数

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

  • 最佳的向量维度:300左右,之后变化比较轻微 
  • 对于GloVe向量来说最佳的窗口长度是8
  • 训练迭代次数。对于GloVe来说确实有助于 
  • 更多的数据有助于帮助提高训练精度 

.

2、用R&python实现

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

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


. 
.

四、相关应用

1、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 
.

2、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

.

高级词向量三部曲:

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


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

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


一、FastText架构

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

.

1、fastText 架构原理

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

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

.
.
2、改善运算效率——softmax层级

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

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


二、FastText的词向量表征

1、FastText的N-gram特征

常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征
“我 爱 她” 这句话中的词袋模型特征是 “我”,“爱”, “她”。这些特征和句子 “她 爱 我” 的特征是一样的。
如果加入 2-Ngram,第一句话的特征还有 “我-爱” 和 “爱-她”,这两句话 “我 爱 她” 和 “她 爱 我” 就能区别开来了。当然,为了提高效率,我们需要过滤掉低频的 N-gram

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

举例来说:fastText能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在fastText生成的文档中进行查找并且理解用户想要问的是有关女性的问题。
.
.
2、FastText词向量优势

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

3、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 (感觉值得一看)
.
.
.


三、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

代码:

  • 问题提出

深度学习在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特征值的相对顺序得以保留,所以应该说其保留了部分位置信息。

检索式chatbot:_第5张图片

  • 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是在时序位置上做归一化(对应特征图的每一个时刻向量)。

检索式chatbot:_第6张图片

  • 最优参数
  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”


. 
.

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

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


2、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在综合类比中表现更好,最后一幅图说明整体类比结果与语法类比的结果比较相似,因为语法类比任务的数量远远多于语义类比,所以在综合结果中语法类比任务的结果占有更大的权重;
  • 4、WordRank在语义类比任务上效果优于其他两种模型,而FastText在语法类比上效果更好。值得一提的是,如果用WordRank模型生成两个集合(词集合和上下文集合),WordRank使用它们词向量的内积对他们之间的关系建模,内积和他们之间的关系是直接成比例的,如果该词和上下文越相关,内积就会越大

综上,WordRank更适合语义类比,FastText更适合不同语料库下所有词频的语法类比。


.

高级词向量三部曲:

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

 
   

 

文本分类相关的知识,所以在此做一个总结。

介绍

定义

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

应用

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

方法

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

传统方法

分类流程

 

检索式chatbot:_第7张图片

 

文本预处理

英文

  • 数据中非英文部分
    • 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大于某个阈值的去掉(太多,没有区分度)
  • 基于熵 该值越大,说明分布越均匀,越有可能出现在较多的类别中(区分度差);该值越小,说明分布越倾斜,词可能出现在较少的类别中(区分度好)
  • 信息增益
    体现词项为整个分类所能提供的信息量(不考虑该词项的熵和考虑该词项后的熵的差值)
  •  统计量
    统计词项和类别之间的独立性。  越大,两者独立性越小,相关性越大
检索式chatbot:_第8张图片

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

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

深度学习方法

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

  • fastText
    论文:Bag of Tricks for Efficient Text Classification
检索式chatbot:_第9张图片

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

  • TextCNN
    论文:Convolutional Neural Networks for Sentence Classification
检索式chatbot:_第10张图片

详细原理如下:

首先,对句子做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向量是每个时刻输出的加权平均,既  。最终输出为  。

 

  • TextRCNN
    参考的是中科院15年发表在AAAI上的这篇文章 Recurrent Convolutional Neural Networks for Text Classification

利用前向和后向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大佬 
    pkpk
    的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)。

检索式chatbot:_第11张图片

如上图的绿色->黄色->红色的部分,首先得到对话的每条文本(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])

检索式chatbot:_第12张图片

如图,基本思想就是,使用传统的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的时候,用了更复杂一些的方法。如图

检索式chatbot:_第13张图片

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

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

检索式chatbot:_第14张图片

从实验效果来看,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的模型图吧:

检索式chatbot:_第15张图片

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

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

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

超级感谢论文作者 
NowOrNever
 的耐心解惑,一下子清楚多啦。如下:
首先,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:

检索式chatbot:_第16张图片

这里  是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基本没区别。

检索式chatbot:_第17张图片

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

state-of-the-art:DAM model

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

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

检索式chatbot:_第18张图片

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方式,如下

检索式chatbot:_第19张图片

这里的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粉色大立方体

检索式chatbot:_第20张图片

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

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

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

检索式chatbot:_第21张图片

可以看到实验结果非常漂亮(当前的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产品经理相关的学习心得总结);欢迎更多有兴趣“主动输出”的朋友们一起加入、共同进步:)

检索式chatbot:_第22张图片

序言

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

检索式chatbot:_第23张图片

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

检索式chatbot:_第24张图片

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

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

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

 

一、多轮对话

多轮对话定义

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

 

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

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

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

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

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

 

二、槽

1、槽(slot)

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

补充说明:多轮对话中的所有的槽位都需要被填充完整吗? 不一定,以如下对话为例——

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

出租车司机:『70』

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

 

2、词槽与接口槽

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

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

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

 

3、槽组与槽位

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

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

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

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

 

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

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

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

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

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

 

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

  • 尝试填写词槽

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

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

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

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

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

 

4、澄清话术

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

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

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

 

5、槽的填写

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

先说词槽。

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

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

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

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

 

再说接口槽。

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

这里需要分成两种情况来讨论,一种是:我们明确知道接口的返回值可以直接填入槽位(不是槽/槽组)中,不需要向用户确认

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

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

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

 

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

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

用户选择否认选项后,即意味着该槽位的填写失败了,需要填入一个特殊值代表失败。用户选择否认选项的失败,可以与接口调用失败等其它意外情况合并处理,因为这都意味着该槽位填写失败,意味着该种信息获取方式未能成功获取信息

如果该槽组下只有这一个槽位,这个特殊的失败表征值就应当作为整个槽组的填入值,如果还有其他槽位值,则根据槽位间优先级最终确定槽组填入值。

 

6、平级槽和依赖槽

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

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

 

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

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

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

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

 

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

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

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

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

 

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

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

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

 

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

 

7、填槽意义

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

检索式chatbot:_第25张图片

 

8、准入条件

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

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

 

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

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

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

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

检索式chatbot:_第26张图片

 

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

1)答案系统

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

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

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

 

2)话题切换

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

上文提到的作为答案的话题切换,就可以理解为主动的话题切换

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

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

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

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

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

 

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

举个例子——

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

VPA:请问您希望哪天出发呢? 

我:明天杭州下雨吗? 

VPA:明天杭州有雷阵雨。 

我:后天呢? 

VPA:后天杭州天气晴。 

我:机票订后天的。 

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

 

3、状态切换

我们还需要思考这样一个问题,既然话题可以切换,也即一个多轮过程可以切换到另一个多轮过程,那多轮过程中的对话状态是否可以切换?

我举两个例子——

第一个:

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

VPA:请问你想去哪呢? 

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

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

我:上海。

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

 

第二个:

我:我想买个杯子。 

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

我:换一换。 

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

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

 

结语

就先这么多吧:)

 

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

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

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

 

 


 

 

 

 

你可能感兴趣的:(检索式chatbot:)