广告行业中那些趣事系列43:小布语音助手知识问答比赛优化实践

2022-05-05 13:50:47 浏览数 (1)

导读:本文是“数据拾光者”专栏的第四十三篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本篇主要分享了参加公司小布助手知识问答的比赛优化实践记录,对语音助手知识问答项目感兴趣的小伙伴可能有帮助。

摘要:本篇主要分享了参加公司小布助手知识问答的比赛优化实践记录。首先介绍了背景,通过官方提供的三个数据集介绍了赛题并抽象成NLP相关的任务;然后重点介绍了比赛过程中的优化实践记录以及效果提升情况,分别从无监督学习、有监督学习和两阶段模型来优化小布语音助手知识问答比赛。这里把自己参加比赛的各种尝试以及思考分享出来,对语音助手知识问答项目感兴趣的小伙伴可能有帮助。

下面主要按照如下思维导图进行学习分享:

01

背景介绍

最近公司组织HACK编程大赛,在算法赛道选了一道NLP相关的题目《小布语音助手知识问答》。因为之前没有做过类似的知识问答项目,相当于是一个学习的过程,所以把参加比赛的过程记录下来。

拿到题目之后需要先抽象成NLP相关的任务,简单来说就是根据用户的query去知识问答库里找语义最相近的标准问。关于赛题的进一步理解我们会结合官方提供的三个数据集进行详细说明。官方一共提供了三个数据集,第一个数据集是知识问答库,通常情况下知识问答库中会包括标准问和标准答,而本次比赛只需要找到标准问,所以就没有提供标准答。知识问答库数据集包括三个字段,分别是标准问、拓展问和测试用例,下面是数据展示:

图1 知识问答库数据展示

第一个字段是标准问,用户发送query请求后我们需要在这些标准问中寻找一个最能表达用户需求的问题,找到了这个问题(这里称为标准问)之后就会返回对应的标准答案从而完成语音助手服务;第二个字段是拓展问,拓展问是标准问更丰富的形式,带方括号的标准形式包括很多标准词;第三个字段则是测试用例,是标准问对应的用户搜索的query样例。

第二个数据集是标准词库,主要包含标准词和同义词,下面是数据展示:

图2 标准词库数据展示

第一个字段是标准词,上面知识问答库中拓展问中方括号词就是这里的标准词;第二个字段是同义词,是和标准词语义相同的词。

第三个数据集是验证集,包含用户query和对应的标准问两个字段,下面是数据展示:

图3 验证集数据展示

第一个字段用户搜索query就是小布语音助手的请求query;第二个字段是标准问,就是用户请求query对应的语义最相似的标准问。通过上面官方提供的三个数据集我们可以更加清楚的了解目标,就是构建一个模型可以根据用户搜索query去知识问答库中找到最相近的标准问,只要找到了标准问也就找到了对应的标准答,就可以很好的回答用户的问题,提供语音助手问答服务。

02

小布知识问答比赛优化实践

2.1 基于无监督学习的方案

刚开始拿到题目之后,认为这是一个语义相似度匹配任务,构建了一个基于BERT预训练模型 faiss的方案。整个方案分成两步,第一步是使用BERT系列预训练模型获取文本语义embedding向量,第二步则是基于faiss检索海量高维向量。这里第二步是为了提升检索相似文本的效率,最重要的是第一步获取高质量的语义向量embedding。

最初的v1版本是将标准问作为一个候选文本数据集,用验证集中的query和候选文本数据集去计算语义相似度,将相似度得分最高的作为模型预测的标准问,然后和验证集提供的标准问计算准确率。使用不同的预训练模型获取文本语义embedding得到的准确率如下图所示:

图4 v1版本不同预训练模型效果展示

BERT预训练模型方面先选择了一个roberta模型,准确率为15.25%;然后尝试了simbert模型,效果出乎意料的好,达到了32.4%;simcse是之前通过无监督的对比学习训练得到的模型,准确率仅为1.45%,效果比较差的原因可能是当时对比学习模型使用的训练数据主要是浏览器搜索场景中的数据,可能和当前小布助手知识问答任务并不匹配,因为时间有限就没有继续在对比学习上深究;剩下两个是公司提供的obert模型,准确率分别为19.95%和0.8%,差距非常大。通过v1版本的实验说明simbert在相似文本语义方面的效果是最好的

上面主要是从模型优化的角度,接下来尝试从样本的角度进行优化。因为v1版本的候选集只有标准问,所以v2版本考虑将拓展问和测试用例也加入到候选集中进行扩展,作为一种样本增强策略。先让用户搜索query去扩展之后的候选集中去计算语义相似度,然后将得到的结果映射回标准问中,最后和验证集的答案计算准确率。扩展之后的候选集如下所示:

图5 v2版本扩展候选集

通过这种方式使得候选集更加丰富,然后使用v1实验中效果最好的simbert模型获取文本语义embedding,验证集上的准确率提升到了57.1%,说明样本增强是有效的。

这里有个小插曲,simbert还有优化版本simbert_v2,所以想尝试下simbert_v2能否带来效果提升。关于simbert和simbert_v2的简单说明可以通能过如下公式:

SimBERT=BERT UniLM 对比学习

SimBERT_v2=RoFormer UniLM 对比学习 BART 蒸馏

关于simbert的详细说明小伙伴可以看下我之前分享的一篇文章《广告行业中那些趣事系列30:实际业务超好用的SimBERT》。simbert_v2相比于simbert来说,使用了RoFormer作为预训练模型,同时添加了BART和蒸馏,关于simbert_v2的详细说明后续会出一篇文章进行详细说明。simbert_v2有6层和12层transformer版本,使用扩展之后的候选集v2,使用6层simbert_v2的准确率为6.9%,使用12层simbert_v2的准确率为36.75%,可以说在当前的任务中simbert_v2的效果并不如simbert。

因为v2版本通过扩展候选数据集可以有效提升验证集效果,所以想进一步扩展样本。这里v3版本使用simbert的生成能力,根据v2候选数据集生成相似文本用于进一步扩展候选数据集,在测试集上的准确率为54.76%,相比于v2测试集的57.1%来说效果有下降,说明生成更多的相似文本反而会降低测试集效果。

接下来重点分析了badcase,发现测试集中存在一些query的标准问为空的情况,这些query属于无效query。这部分无效query的预测效果很差,所以想通过卡相似度阈值来提升这部分无效query的预测准确率,具体做法是设置最大相似度得分阈值,当超过相似度得分阈值,则将该query的预测结果设置为无效query。通过卡最低相似度得分阈值测试集准确率提升到60.53%。相比于通过相似度阈值来识别无效query,我还尝试构建一个分类器去识别无效query,发现效果并不好。

为了更好的使用同义词数据集,将拓展问中的中括号的标准词用同义词替换从而增加了候选数据集,使用simbert模型同时设置最大相似度阈值的测试集效果为59.3%,可见通过同义词扩展候选数据集效果并没有提升。

2.2 基于有监督学习的方案

上面使用的模型主要是无监督学习的方式,接下来想通过有监督学习的方式构建模型。因为知识问答库中的标准问有760个,所以想构建一个多分类器去识别这760个类别的标准问。v4方案是直接构建一个全量的多分类器,在测试集上的准确率为54.75%。

这里发现很多标准问的训练语料数量差距非常大,可能存在样本不均衡的问题,v5版本的解决措施是将训练语料数量低于50的的类别合并为1类,最后对模型预测的测试集中这一类进行特殊处理,这里v5得到的测试集效果提升到64.11%,已经超过了无监督学习的最好方案。

2.3 基于无监督 有监督两阶段模型的方案

上面通过构建多分类器可以使得模型的效果大幅提升,测试集准确率提升到了64.11%,但是还有个问题,因为我们把训练语料低于50的统一映射为other类,那么模型预测这些类的时候并不会给出真正的标准问。这里构建了一种无监督学习和有监督学习相结合的两阶段方案来分别处理。对于训练语料大于50的类别通过多分类器模型去直接预测,而对于训练语料小于50的则通过相似文本匹配来预测标准问。通过这种方案测试集最终效果提升到了67.14%,超过初赛冠军的得分66.1%,到这里优化告一段落。

2.4 小布语音助手知识问答优化汇总

整体看下来,小布语音助手知识问答大赛大概经过以下五个阶段,前三个阶段主要是基于无监督学习的方式完成,分别是预训练模型优化、样本优化和卡相似度阈值优化,后两个阶段主要是基于有监督学习的方式来完成,分别是构建多分类器和构建两阶段模型,测试集准确率提升图如下所示:

图6 小布助手知识问答准确率提升

03

总结及反思

本篇主要分享了参加公司小布助手知识问答的比赛优化实践记录。首先介绍了背景,通过官方提供的三个数据集介绍了赛题并抽象成NLP相关的任务;然后重点介绍了比赛过程中的优化实践记录以及效果提升情况,分别从无监督学习、有监督学习和两阶段模型来优化小布语音助手知识问答比赛。这里把自己参加比赛的各种尝试以及思考分享出来,对语音助手知识问答项目感兴趣的小伙伴可能有帮助。

0 人点赞