900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > NLP学习—16.对话系统及信息检索技术

NLP学习—16.对话系统及信息检索技术

时间:2022-07-24 17:54:04

相关推荐

NLP学习—16.对话系统及信息检索技术

文章目录

一、对话系统概述二、对话系统的分类及其对应得解决方案三、检索及倒排索引四、召回五、倒排索引的空间优化方法—Variable Byte Compression六、倒排索引搜索算法—Weak and(WAND)七、检索系统的评价指标

一、对话系统概述

对话系统在电商、银行等业务场景中应用很广。从框架方面,对话系统可以分为问答系统与多轮对话系统。

二、对话系统的分类及其对应得解决方案

对话系统的分类如下:

闲聊式对话系统

目前,市面上闲聊机器人的解决方案baseline是基于seq2seq+Attention;同时,加入一些可控性(基于输入内容给与回复),比如:加入情感与意图;当然,也可以加入历史信息(context)

闲聊式对话系统的关键技术:

其模型设计为

基于输入会识别情感,基于情感会进行embedding,融入到decoder中,帮助我们decoder。那么如何利用情感来控制decoder呢?下面有两种解决方案:

将训练集人每一句话人工标记情感(通过预训练情感模型来进行预测,人工打标针对机器不能识别的),训练时,decoder的第一个token加入情感标签,然后再进行生成;在预测时,通过意图识别做一个classification,识别是什么情感,然后在decoder的第一步输入的是情感。第二种解决方案是学习一个可以表征情感的embedding,在每一次做decoder时,每一个time step,将表征情感的embedding向量与context vector拼接后再与上一步的输出 y t − 1 y_{t-1} yt−1​输入到下一时间步。

检索式对话系统

人工整理QA对,存储到数据库中,

当你进行提问时,会将输入问题与数据库中的问题计算相似度,找到最相似问题,返回最相似问题对应的答案。

检索式对话系统的关键技术:

将输入问句进行文本表征

将输入句子进行分词,通过预训练模型(word2vec、bert、elmo、GPT)得到每一个token的embedding,针对一句话的embedding进行平均(加权平均)得到句子向量表征粗排recall—BM25

从数据库中得到候选问句(速度比较快,查全率);比如:从数据库(10000个问题)中找出100个相似问题,要求速度很快精排(ranking)

在候选问句的基础上进行精确匹配(查准率),从召回的数据中进行ranking,召回会利用简单的模型,要求速度快;精排会利用复杂的模型(word embedding)。精排后返回top3的问题,之后需要通过阈值(相似度大于0.5)或者分类模型来决定是否输出答案返回答案

检索系统(elastic search)

检索式对话系统—相似度计算

Jaccard相似度(求交集)Dot preduct(点乘)cosine similarity(余弦相似度)

余弦相似度与点乘相比,做了归一化,是计算文本相似度最常用的方式WMD(word Move Distance)

WMD (Word Mover’s Distance) 算法

在利用WMD计算两条文本的相似度时,会进行以下步骤:

利用word2vec将词编码成词向量去掉停用词计算出每个词在文本中所占权重,一般用词频来表示对于每个词,找到另一条文本中的词,确定移动多少到这个词上。如果两个词语义比较相近,可以全部移动或移动多一些。如果语义差异较大,可以少移动或者不移动。用词向量距离与移动的多少相乘就是两个词的转移代价保证全局的转移代价加和是最小的文本1的词需要全部移出,文本2的词需要全部移入
模型判断

将输入问题与最相似问题进行拼接,标签为1,其余的标签为0,通过神经网络模型,可以得到相似度

知识问答式对话系统

nl2sql:分类+抽取(命名实体)+槽填充

任务式对话系统

业界落地较多的是任务式对话系统,比如说订机票、订外卖、订闹钟等任务。

三、检索及倒排索引

检索(infomation retrieval)指的是从大规模非结构化数据的集合中找出满足用户信息需求的资料的过程。

如果事先通过非线性扫描方式,给文档建立文档关联矩阵(词项与文档的共现矩阵),当碰到更大数据集时,占用空间会非常的大,矩阵也非常系数,此时,就需要倒排索引倒排索引用来缩小计算搜索的范围。倒排索引针对每一个词项,存储所有包含这个词项的文档的列表,文档列表由文档的序列号docID来组成。应当使用可变长度的记录列表(动态数组或者链表),并且,每一个文档列表按照docID排列。倒排索引就是利用词项(key)与该词项对应的文档列表(value)来构建词项字典。

举个例子:

利用分离双指针寻找交集,时间复杂度为O(m+n)

四、召回

下面介绍BM25—基于字符级别的召回,当数量很大时,还需要倒排索引。BM25是一种用来评价搜索词和文档之间相关性的算法,它是一种基于概率检索模型提出的算法:有一个query和一批文档Ds,现在计算query和每篇文档D之间的相关性,先对query进行切分(分词),得到单词 q i q_i qi​,然后单词由3部分组成:

每个单词的权重

N表示所有文档的数目, n ( q i ) n(q_i) n(qi​)包含了单词 q i q_i qi​的文档数目。

I D F ( q i ) = l o g ( N − n ( q i ) + 0.5 n ( q i ) + 0.5 ) IDF(q_i)=log(\frac{N-n(q_i)+0.5}{n(q_i)+0.5}) IDF(qi​)=log(n(qi​)+0.5N−n(qi​)+0.5​)

相关性分数R:单词和Doc之间的相关性,最后对于每个单词的分数求和,得到query和文档之间的分数

R ( q i , d ) = f i ( k 1 + 1 ) f i + K q f i ( k 2 + 1 ) q f i + k 2 R(q_i,d)=\frac{f_i(k_1+1)}{f_i+K}\frac{qf_i(k_2+1)}{qf_i+k_2} R(qi​,d)=fi​+Kfi​(k1​+1)​qfi​+k2​qfi​(k2​+1)​

K = k 1 ( 1 − b + b d l a v g d l ) K=k_1(1-b+b\frac{dl}{avg\ dl}) K=k1​(1−b+bavgdldl​)

k 1 , k 2 , b k_1,k_2,b k1​,k2​,b均为超参数

f i f_i fi​表示 q i q_i qi​出现在多少个文档中

q f i qf_i qfi​表示 q i q_i qi​在这个query中的次数

d l dl dl表示的是当前doc的长度

a v g d l avg\ dl avgdl表示的是平均长度

S c o r e ( Q , d ) = ∑ n W i R ( q i , d ) Score(Q,d)=\sum^{n}W_iR(q_i,d) Score(Q,d)=∑n​Wi​R(qi​,d)

返回 t o p K top K topK的Doc。

基于字符级别的召回也存在问题,当出现新词时,就不会有匹配,此时需要基于向量级别的召回。

下面介绍SIF—基于向量级别的召回。Smooth Inverse Frequency是一种基于向量的检索。在介绍SIF前,需要先理解平均词向量与TFIDF加权平均词向量。

平均词向量就是将句子中所有词的word embedding相加取平均,得到的向量就当做最终的sentence embedding。这种方法的缺点是认为句子中的所有词对于表达句子含义同样重要。

TFIDF加权平均词向量就是对每个词按照tfidf进行打分,然后进行加权平均,得到最终的句子表示。

SIF加权平均词向量主要是对上述两种方法进行了改进。SIF算法包括两步,第一步是对句子中所有的词向量进行加权平均,得到平均向量 v s v_s vs​;第二步是移出(减去) v s v_s vs​在所有句子向量组成的矩阵的第一个主成分(principal component / singular vector)上的投影。

第一步主要是对TFIDF加权平均词向量表示句子的方法进行改进。论文提出了一种平滑倒词频 (smooth inverse frequency, SIF)方法用于计算每个词的加权系数,具体地,词 w w w的权重为 a / ( a + p ( w ) ) a/(a+p(w)) a/(a+p(w)),其中 a a a为平滑参数, p ( w ) p(w) p(w)为(估计的)词频。直观理解SIF,就是说频率越低的词在当前句子出现了,说明它在句子中的重要性更大,也就是加权系数更大。事实上,如果把一个句子认为是一篇文档并且假设该句中不出现重复的词(TF=1),那么TFIDF将演变成SIF,即未平滑的倒词频。但是相较于TFIDF这种经验式公式,论文通过理论证明为SIF提供理论依据。第二步,个人的直观理解是移出所有句子的共有信息,因此保留下来的句子向量更能够表示本身并与其它句子向量产生差距。

算法伪代码如下:

五、倒排索引的空间优化方法—Variable Byte Compression

为什么要压缩?

节省磁盘空间提高内存的利用率

提高速度加快数据从磁盘到内存的传输速度

读取压缩数据然后解压缩比直接读取未压缩数据快

Variable Byte原理是根据数据的大小用不同个数的字节来存储,即可变长度的编码

六、倒排索引搜索算法—Weak and(WAND)

在query比较长时,涉及到WAND算法。

利用最大堆来存储

将query进行分词 q i q_i qi​得到每个 q i q_i qi​的Max contribution得到每个 q i q_i qi​的倒排索引利用指针遍历Doc,计算query对Doc的最大贡献,如果最大贡献比存下来的都小,则抛弃,否则,计算query与Doc的相似度,然后入堆(仍然有可能比最小值还小)

七、检索系统的评价指标

AUC

AUC表示ROC曲线下方的面积,计算AUC前,需要利用混淆矩阵来计算ROC,计算ROC需要两个变量 T P R TPR TPR、 F P R FPR FPR,然后绘制ROC曲线,横轴FPR,纵轴TPR, 这是在实际建模中经常使用的衡量分类模型的效果的指标

T P R = T P T P + F N F P R = F P F P + T N TPR=\frac{TP}{TP+FN}\\FPR=\frac{FP}{FP+TN} TPR=TP+FNTP​FPR=FP+TNFP​

伪阳性率(FPR) :判定为正例却不是真正例的概率

真阳性率(TPR) :判定为正例也是真正例的概率PR曲线

纵坐标查准率,即精确率(Precision),精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。

p r e c i s i o n = T P T P + F P precision=\frac{TP}{TP+FP} precision=TP+FPTP​

横坐标查全率,即召回率(Recall),召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。

r e c a l l = T P T P + F N recall=\frac{TP}{TP+FN} recall=TP+FNTP​

精确率与召回率其实就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。

AUC和PR的区别:

负例增加了10倍,ROC曲线没有改变,而PR曲线则变了很多。作者认为这是ROC曲线的优点,即具有鲁棒性,在类别分布发生明显改变的情况下依然能客观地识别出较好的分类器。在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。

ROC-Curve和PR-Curve的应用场景如下:

ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。

APMAPNDCG

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。