当前位置: 首页 > 科技观察

智能问答:基于BERT的语义模型

时间:2023-03-16 16:14:12 科技观察

作者|罗子健背景飞书智能问答用于员工服务场景。致力于以卡片的形式减少客服人力消耗,高效解决用户的知识探索需求。飞书智能问答将服务台和wiki中的问答对整合起来,形成问答知识库,在综合搜索服务台以一问一答的形式为用户提供知识。飞书作为企业级SaaS应用,对数据安全和服务稳定性要求极高,导致训练数据严重不足,严重依赖公共数据,无法使用业务数据。在模型迭代过程中,依赖公共数据也会导致模型训练数据和业务数据分布不一致。通过与多个试点服务台合作,在用户充分授权后,以无数据的方式进行培训。即模型可以看到数据,但人类无法通过任何方式获取明文数据。由于以上原因,我们的离线测试数据是人为构造的。因此,在计算AUC(AreaUnderCurve)值进行评估时,可能会与业务数据的分布不一致。只能作为验证模型性能的参考,不能作为优化迭代的技术指标。因此,通过用户的点击行为来证明模型的效果是否有所提升。在业务落地过程中,是否显示答案由模型计算出的相似度决定。控制显示答案的阈值会对点击率和印象率产生重大影响。因此,为避免Threshold值对指标的干扰,飞书问答采用SSR(SessionSuccessRate)作为评价模型效果的决定性指标。它的计算方式如下,其中total_search_number会记录用户提出的每一个问题,search_click_number会记录用户在每一个问题之后是否点击,以及点击的答案数。bot_solve_rate(BSR):用于评估机器人拦截的效果,机器人拦截的工单越多,消耗的人力就越少。飞书智能问答模型技术1.0版本的原始模型是SBERT(SentenceEmbeddingsusingSiameseBERT)模型(1),这是第一个应用于问答服务的模型,也是业界普遍使用的模型.其模型结构如下:Query和FAQQuestions输入孪生BERT进行训练,通过二元分类调整BERT的参数。我们可以将所有问题离线转化为向量,存入索引库。在推理时,将用户的Query转化为Embedding,调回索引库。通过余弦相似度计算向量的相似度,以下简称相似度。与交互式模型相比,该方案最大的优势是文本相似度的计算时间与Faq数量解耦,不会线性增加。改进后的2.0版本模型1.0版本的模型在representationlearning上的表现还是不够好,主要体现在即使是两个不太相似的句子,模型依然会给出比较高的分数,导致整体歧视低。2.0版本的模型认为通过加入两个句子之间的交互,进而获取更多的信息,可以更好的区分两个句子是否相似。并且引入人脸识别的思想,使得相似内容的分布更紧凑,不同内容类之间的距离更大,从而提高模型的辨别力。其结构如下:与1.0版本的模型相比,2.0版本更强调交互的重要性。在原有concat的基础上,增加了u*v作为特征,并增加了交互层(本质上是MLP层)进一步增强交互。此外,还引入了CosineAnnealingLR(2)和ArcMarinLoss(3)来优化训练过程。另外,根据Bert-Whitening(3)的实验揭示,在pooling过程中使用了多种pooling方法来寻找最优结果。CosineAnnealingLR余弦退火学习率可以通过缓减+骤增的方式,“逃离”局部最优空间,在模型即将达到局部最优时,进一步找回更好的局部最优解。下图来自CosineAnnealingLR的论文,其中默认是StepLR的衰减,其他都是余弦周期衰减,衰减为0时恢复最大值。余弦退火衰减方法相比传统的StepLR衰减,可以使模型更容易找到更好的局部最优解。下图模拟了StepLR和CosineAnnealingLR的梯度下降过程(4):同样,由于余弦退火模型会找到多个局部最优,所以训练时间也比传统的StepLRdecay长。另一方面,由于学习率的突然增加,损失会增加,所以训练过程中EarlyStopping的控制可以基于Steps而不是Epoches。在服务台落地场景中,不同服务台的语义空间明显不同,不同服务台的数据量(包括正反例比例)也有较大差异。模型中不可避免存在偏差,余弦退火可以在一定程度上解决这个问题。ArcMarinLoss使用了SBERT论文中受TripletLoss启发的Arcface损失函数,最早用于人脸识别。但是,TripletLoss依赖于三元组输入。建模型的时候没有这个条件获取数据,于是顺路找到了ArcMarginLoss:人脸识别最新的损失函数,在人脸识别领域已经达到了SOTA。在Softmax的基础上,加强了各种类型之间的距离。但是,我们不能像人脸识别一样把语义分成Group,对Group进行N分类。NLP相关问题远比人脸识别复杂,训练数据也像人脸识别一样难以获取。但是我们仍然可以通过二元分类来拆分相关/不相关这两个类别。实验结果根据AB实验结果,1.0版本模型和2.0版本模型的指标如下:Top1SSRTop10SSRTop1ClickRateBSR相对增幅+7.75%+6.43%+1.24%+3.55%其中,Top1SSR只考虑第一次点击的SSR,Top10SSR是点击次数前10的SSR。由于用户请求仅召回10个相似结果,因此Top10SSR是整体SSR。Top1ClickRate是指在点击的情况下,第一条消息被点击的概率,即Top1SSR/Top10SSR。从上表可以看出,整体SSR提升明显,Top1点击占比也略有提升。因此,2.0版本的模型从业务指标上明显优于1.0版本的模型。BSR作为业务方最为关注的指标,受用户行为和产品策略的影响较大。不过从AB实验也可以看出,新模式下机器人拦截的工单数量明显增加,可以减少下游客服人力的消耗。消融实验针对ArcMarginLoss的效果进行了消融实验。在其他条件不变的情况下,使用同样的人工测试集,使用ArcMarginLoss和CrossEntropyLoss进行模型训练。这里之所以使用AUC是为了观察:ArcMarginLossCrossEntropyLossAUC的值为0.9250.919。因此,通过消融实验可以看出,ArcMarginLoss虽然在测试集上略有提升,但提升并不明显。原因可能是用于人脸识别训练模型的ArcMarginLoss通常使用大量相似的图片作为标签进行训练,而本任务中的数据是两句话关系的0/1分类,从而导致与人脸识别目标不兼容。同样,不能产生更好的效果。基于ContrastiveLearning3.0和2.0版本的模型虽然缓解了分数相对集中的问题,但是仍然无法解决数据整体分布不均的问题(正负样本1:10),即数量正样本的数量远小于负样本,导致模型更倾向于学习负样本的内容。3.0版本的模型借鉴了ContrastiveLearning的思想,将二分类问题转化为N分类问题,负样本不再是多个Item,保证模型能够更好的学习到正样本的内容。在ContrastiveLearning的3.0版本模型中,参考了最新的论文SimCSE(5),将ContrastiveLearning的思想引入模型中进行训练。这个想法是使用两个dropout来获得同一个句子的不同表示并训练它们。如下图所示:在实际训练中,采用了SupervisedSimCSE的思想,将作为一对正样本输入到模型中。每个查询都是用其他问题作为负样本训练的,但不与其他查询交互(原文中不同的查询也是负样本)。例子如下,假设输入3对,标签如下:query1query2query3question1100question2010question3001通过BERT,可以将文本转化为embedding,计算相似度。按照上面构造标签的方法,使用CrossEntropyLoss计算更新参数。因此,ContrastiveLearning的目标函数可以表示为:其中sim是余弦相似度计算,是SentencePair。来自Momentumcontrast的原始SimCSEtrick使用CrossEntropyLoss直接获取损失值。但是由于超参数T的存在,余弦相似度的值被放大了,最终softmax之后的概率分布更加集中,趋向于相似度高的值,而相似度低的值的概率会趋近于0。因此,超参数T的取值会严重影响反向传播时梯度的大小,梯度会随着T的缩小而不断增加,使得实际的lr很大大于CrossEntropyLoss中定义的lr,导致模型训练收敛速度变慢。为了缓解这个问题,在Momentumcontrastive(6)中采用了loss_i=2*T*l_i的方法,本文将此方法作为loss进行训练。实验结果根据AB实验的结果,2.0版本和3.0版本的模型业务指标如下:Top1SSRTop8SSRTop1ClickRateBSR相对变化+7.10%+5.88%+1.19%+4.07%。top1SSR的版本与之前的数据存在一定的偏差。并且业务端发生了变化,总显示数从10个变成了8个,所以Top10SSR变成了Top8SSR。最后,BSR在这个AB实验中的性能与上面AB实验中的1.0版本模型相似,这是由于修改了传入机器人工单的统计口径。之前如果搜索显示问题,会直接跳转到机器人,记录为机器人解决问题。现在搜索直接显示答案,无需进入服务台。因此,部分工单被搜索端拦截,没有记录为机器人拦截,导致BSR下降,并非数据波动。不过与AB实验的结果相比,新模型的BSR仍然提升了4.07%,提升幅度明显。综上所述,该机型核心技术指标明显提升。不仅用户需求满足率提升了5.88%,回答排名第一的比例也提升了1.19%,典范效果全面提升。该模型得到改进,因为数据的组织方式不同。ContrastiveLearning只使用数据集中的正例,而使用同一批中的其他Questions作为负例,这意味着同一个query的负例数量远大于原始数据集。与2.0模型相比,该模型对所有正例都有更多的负例,可以更好地识别真正相似的句子。损失函数决定了不同的训练目标。2.0版本的损失函数只需要考虑两个句子之间的关系,而3.0版本的模型需要同时考虑一个batch中所有句子之间的关系,在batch_size=N的N个句子中找到正例。根据论文,BERT的各向异性(Anisotropy)可以通过ContrastiveLearning消除。具体来说,BERT的语义空间集中在一个狭窄的锥形区域,导致余弦相似度值明显变大,甚至两个完全不相关的句子也能得到相对较高的分数。Ethayarajh(6)和BohanLi(7)对预训练模型的嵌入研究证明了这一观点。这个问题可以通过使用ContrastiveLearning或者各种后处理(比如whitening(8),flow(9))来消除。高频词汇严重影响句子在BERT中的嵌入。少量的高频词汇决定了embedding的分布,导致BERT模型的表达能力变差。对比学习可以消除这种影响。根据论文ConSERT(10)的实验,证明高频词会严重影响embedding的表达,如图:ablationexperiment为了探究Loss和数据对模型的影响,消融实验使用与Contrastive相同的正负值样本和比例进行训练,训练方法如下:设置batch_size=32,然后按照Contrastive的思想得到余弦相似度矩阵学习,维度为[32,32]。基于对比学习生成标签矩阵,即[32,32]的单位矩阵。余弦矩阵和标签矩阵都转换为[32*32,1]矩阵。这种情况下,数据组织方式是完全一样的,只是损失函数和训练方式不同。按照上述方式进行训练,在离线测试集上进行AUC计算。简单来说,ContrastiveLearning从32个句子中找到最相似的一个,而CrossEntropyLoss进行32个二级分类。通过上述方法分别对ContrastiveLearning和CrossEntropyLoss这两个分类进行训练,结果如下:ContrastiveLearningN分类CrossEntropyLoss二分类AUC的值为0.9350.861通过进一步研究,发现二分类CrossEntropyLoss倾向于将文本的相似度标记为0,因此过多的负样本使得模型忽略了正样本的学习,仅通过判断label=0的情况就可以在训练集上达到98%的准确率。消化实验也证明损失函数对模型的训练有显着的影响。在负样本足够多的情况下,同样的数据组织方式下,ContrastiveLearning的效果优于CrossEntropyLoss。由于在实际业务中,正样本的数量远小于负样本,因此基于对比学习的训练方法更适合在业务中应用。