基于深度学习的短文本相似度学习与行业测评
文本相似度计算作为 NLP 的热点研究方向之一,在搜索推荐、智能客服、闲聊等领域得到的广泛的应用。在不同的应用领域,也存在着一定的差异,例如在搜索领域大多是计算 query 与 document 的相似度;而在智能客服、聊天领域更注重的是 query 与 query 之间的匹配,即短文本之间的相似度计算。
不同的文本长度,相似度的计算方案也存在差异,长文本匹配更多注重文本的关键词或者主题的匹配,业界使用的较多的算法如:TF-IDF、LSA、LDA;而短文本匹配更多的是句子整体的语义一致性,业界较为主流的算法有:word2vec、esim、abcnn、bert 等深度模型。
相比于长文本的相似度计算,短文本的相似度计算存在更大的挑战。其一,短文本可以利用的上下文信息有限,语义刻画不够全面;其二,短文本通常情况下,口语化程度更高,存在缺省的可能性更大;第三,短文本更注重文本整体语义的匹配,对文本的语序、句式等更为敏感。
不同文本相似度算法的得分分布不一致,无法通过评分来对算法进行评估。因此对于不同的算法方案,可以设定特定的得分门限,得分高于门限,可判断为语义相同;否则,判断为语义不同。对于一个给定标签的数据集,可以通过准确率来衡量相似度计算的效果。常用的中文评估语料有:LCQMC、BQ Corpus、PAWS-X (中文)、afqmc 等。
1. 主流方案
业界常用的短文本相似度计算方案大致可以分为两类:监督学习与无监督学习,通常情况下,监督学习效果相对较好。在没有足够的训练数据需要冷启动的情况下,可优先考虑使用无监督学习来进行上线。
1.1 无监督学习
最简单有效的无监督学习方案就是预训练的方式,使用 word2vec 或者 bert 等预训练模型,对任务领域内的无标签数据进行预训练。使用得到的预训练模型,获取每个词以及句子的语义表示,用于相似度的计算。
Word2vec 是 nlp 领域一个划时代的产物,将 word 的表征从离散的 one-hot 的方式转化成连续的 embedding 的形式,不仅降低了计算维度,各个任务上的效果也取得了质的飞跃。Word2vec 通过对大规模语料来进行语言模型(language model)的建模,使得语义相近的 word,在 embedding 的表示上,也具有很强的相关性。
通过 cbow 或者 max-pooling 的方式,使用句子中每个词的 word embedding 计算得到 sentence embedding,可以使得语义相似的句子在 sentence embedding 的表示上也具备较高的相关性,相比于传统的 TF-IDF 等相似度计算具有更好的泛化性。但是 cbow 的方式来计算 sentence embedding,句子中所有 word 使用相同的权重,无法准确获取句子中的 keyword,导致语义计算的准确率有限,难以达到上线标准。
虽然 Word2vec 提供了一定的泛化性,但其最大的弱点是在不同的语境下,同一个 word 的表征完全相同,无法满足丰富的语言变化。gpt、bert 等大规模预训练模型的出现,彻底解决了这个问题,做到了 word 的表征与上下文相关,同时也不断刷新了各个领域任务的榜单。
但实验证明直接使用 bert 输出的 token embedding 来计算句子的 sentence embedding,无论使用 cbow 的方式对所有 token embedding 求平均或者直接使用[CLS] token 的 embedding 来表示,语义计算的效果都不佳,甚至不如 GloVe。究其原因,在 bert 的预训练过程中,高频词之间共现概率更大,MLM 任务训练使得它们之间语义表征更加接近,而低频词之间的分布更为稀疏。语义空间分布的不均匀,导致低频词周围中存在很多语义的“hole”,由于这些“hole”的存在,导致语义计算的相似度存在偏差。
为了解决 bert 语义空间不均匀的问题,CMU 与字节跳动合作的 bert-flow 提出将 bert 的语义空间映射到一个标准的高斯隐空间,由于标准高斯分布满足各向同性,区域内不存在“hole”,不会破坏语义空间的连续性。
Bert-flow 的训练过程就是学习一个可逆的映射 f,把服从高斯分布的变量 z 映射到 BERT 编码的 u,那
就可以把 u 映射到均匀的高斯分布,这时我们最大化从高斯分布中产生 BERT 表示的概率,就学习到了这个映射:
实验表明,通过 bert-flow 的方式来进行语义表征与相似度计算的效果,要远远优于 word2vec 以及直接使用 bert 的方式。
1.2 监督学习
Bert-flow 的出现使得无监督学习在文本相似度计算方面取得了较大进步,但是在特定任务上相比于监督学习,效果还存在一定的差距。监督学习常用的相似度计算模型大致可以分为两类:语义表征模型,语义交互式模型。语义表征模型常用于海量 query 召回,交互式模型更多使用于语义排序阶段。
DSSM 是搜索领域最常用的语义表征模型之一,而在短文本匹配领域,使用最多的网络结构是孪生网络,常用的孪生网络包括:siamese cbow,siamese cnn,siamese lstm 等。孪生网络训练时,所有 query 使用相同模型来进行语义表征,通过余弦相似度等方式来计算 query 间的相似度,不断最大化正样本之间的相关性,抑制负样本之间的相关性。预测时,每个 query 通过语义模型单独获取语义向量,用来计算 query 之间的相似度得分。由于 query 语义表征仅与本身有关,因此在进行 query 检索时,可以提前对语料库中 query 构建语义索引,大大提升系统的检索效率。
相比于语义表征模型,交互式语义模型具有更好的匹配效果,模型结构往往也更加复杂,常用的交互式语义模型有 ABCNN、ESIM 等。交互式模型在计算 query 之间的语义相似度时,不仅对单个 query 的语义特征进行建模,还需要 query 之间的交互特征。交互式模型通常使用二分类的任务来进行训练,当模型输入的两个 query 语义一致,label 为“1”,反之,label 为“0”。在预测时,可通过 logits 来作为置信度判断。
大规模预训练模型的出现,也横扫了文本相似度任务的各项榜单。Bert 将 lcqmc 数据集的 SOTA 带到了 86%的水平。随后,Roberta、albert、ernie 等新的预训练模型层出不穷,也不断刷新着匹配准确率的 SOTA 水平。
2. 业务应用
在语义问答的业务中,通常会使用召回+排序的算法架构,在我们的闲聊业务中,我们也使用了类似的架构。使用 siamese cnn 语义表征模型来进行语义召回,用蒸馏后的 transformer 语义交互模型来做排序。
在语义表征模型的 loss 构建上,我们参考了人脸识别领域的损失函数设计。这个两个任务在本质上是相似的,人脸识别是将人脸图片用向量表示,而文本检索式将文本用向量来进行表示,都期望正样本之间有足够高的相关性,负样本之间足够好区分。
在使用 Siamese cnn 进行语义建模时,我们使用了 1 个标准 query,1 个正样本,5 个负样本(尝试过其他负样本数量,在我们的数据上效果不如 5 个负样本),训练过程其实是在这 6 个样本中,识别出对应正样本的位置,因此可将其转化为分类任务来进行训练,每个正负样本分别对应一个类别。使用每个样本与标准 query 之间的相似度,来作为对应类别的 logits,对 logits 进行归一化并构建 loss 函数。传统的 softmax 归一化构建的分类边界使得类别之间可分,为了更好的语义表征效果,需要使得类内更加汇聚,类间更加分散。ASoftmax、AMSoftmax、ArcFace 等归一化方式,提出将所有 query 映射到一个球面,query 之间的相似度通过他们之间的夹角来计算,夹角越小相似度越高,通过在角度域添加 margin 的方式,使得类内更汇聚,类间更可分,达到更好的语义表征效果。
我们对比了 softmax、Asoftmax、AMSoftmax、Arcface 等不同归一化方式,其中,Softmax 没有添加任何 margin,ASoftmax 通过倍角的方式在角度域添加 margin,AMSoftmax 则是在余弦域添加 margin,而 Arcface 则是直接在角度域添加固定 margin。
我们使用 30W 的语料库来构建索引,使用 12900 条线上 query(语料库中不包含完全相同的 query)来进行召回测试,使用相同的向量索引工具,对比发现 AMSoftmax、Arcface 召回效果上有很大提升,在我们的业务中得到了应用。
在排序模型方面,我们尝试了 ABCNN、ESIM、transformer 等交互式语义模型,但效果相比于 bert 等预训练模型,还存在一定的差距。我们团队自研的预训练模型 Xbert,在与 Roberta large 同规模的情况下,融入了自研知识图谱数据,添加了 WWM(whole word MLM)、DAE、Entity MLM 等任务,使用 LAMB 优化器进行优化。我们使用 XBert 在业务数据上进行了测试,相比于同规模的 Roberta large 准确率有接近 0.9%的提升。为了满足上线需求,我们参考 tiny bert 的方式,用 Xbert 蒸馏了一个 4 层的 transformer model 用于线上推断。
我们在内部的问答数据集上对不同排序方案做了的效果对比,使用 12900 条线上用户真实 query,进行全链路的效果对比测试。用语义召回 top1 的准确率来评估语义表征模型的效果,并且通过消歧模块进一步提升应答准确率;测试排序模型效果时,我们使用了多路召回,共召回 30 个候选,使用排序模型对候选排序,选择排序后的 top1 作为最终答案。若经过消歧模块,所有候选均被消歧掉,或排序后的 top1 候选排序得分不满足应答门限时,则该 query 系统无应答。因此,我们使用应答率与应答准确率来作为系统最终的评测指标,来评估不同方案的效果。
为了测试自研的 Xbert 在公开的语义相似度数据集上的效果,在 lcqmc 数据集上,单模型准确率 88.96%,较 Roberta large 单模型 87.9%的准确率,提升了 1%;通过使用正样本之间的传递性以及负样本采样的方式,来进行数据增强以及 FGM 对抗训练的方式,准确率提升至 89.23%;通过 ensemble 的方式,将准确率进一步提升至 90.47%。通过相同的方式,在 bq_corpus 上达到了 87.17%,在 paws-x 任务上达到了 88%,在 afqmc 数据集上也达到了 77.234%,在百度举办的千言文本相似度比赛中完成登顶。
3. 总结与展望
短文本相似度在我们的闲聊领域得到了应用,使用语义表征学习来进行召回+交互模型排序的算法架构,在保证系统性能的前提下,取得了不错的业务效果。在语义表征模型上,我们使用人脸识别领域的 loss 来提升召回效果;在语义排序方面,我们也利用了大规模预训练模型以及模型蒸馏,来进一步提升业务效果。在大规模预训练语言模型方面,我们积极探索与改进,相比于现有开源预训练模型,我们的 Xbert 在业务上以及公开数据集上的评测效果,都有了进一步的提升。
在今后的工作中,我们会利用好预训练模型这个核武器,在我们 Xbert 的基础上努力优化突破,将文本的相似度匹配任务带新的台阶。在解决单轮相似度匹配的情况下,我们也会继续探索结合上下文的多轮匹配以及多轮生成等任务,来进一步提升我们闲聊业务的体验。
版权声明: 本文为 InfoQ 作者【OPPO小布助手】的原创文章。
原文链接:【http://xie.infoq.cn/article/07eff33a2d2aebc0f9a0922ad】。文章转载请联系作者。
评论