背景
1)语言模型(language model,简称LM),是对语句的概率分布的建模。通俗来讲,就是判断一个语言序列是否是正常语句,即是否是“人话”。作为query理解的重要基础模块,主要应用于不完整query的识别、低质query打压等任务上。
语言模型建模:该任务就是预测每一个位置的词对应的下一个词是什么,最后将每个位置的概率输出相乘,从而对query质量进行打分。
2)对比学习是近年来比较火的自监督训练方式,最早用于CV领域。随着SimCSE模型问世,对比学习也在nlp领域受到较大关注,并取得不错的效果。
3)目前对比学习主要在NLU任务上进行改造,还没有在语言模型任务上进行改造的工作。因此本文尝试着将对比学习用于语言模型训练任务中。
方案
原训练方案的缺点
从图1中可以看出,“北”对应的正标签为“京”,其余为负标签。“京”对应的正标签为“气”, 其余为负标签。该方法会有以下几个问题:
- 负标签不够准确:以“北”为例,他的正标签是“京”。而负标签是词表中除了“京”以外的其他词,但这些所谓的负标签并不完全都是真正的负标签。比如“北海天气很好”也是个正常的句子,因此“海”也可以是“北”的正标签,而不是负标签。
- 负标签不够有区分度:以“天”为例,他的正标签是“气”,负标签包含一系列其他字,如“安”、“汽”、“坛”等,但这里面“汽”应该比其他两次字更负向,因为“北京天安门”、“北京天坛”都是正常的句子,而“北京天汽”的“汽”应该是错别字
现方案
针对「负标签不够准确」和「负标签不够有区分度」的问题,我们从「数据增强」和「损失函数改造」两个方面进行优化。
数据构造
首先针对「query不完整」的问题,设计了“随机位置删除”和“随机个数删除”的数据增强方式。“随机位置删除”表示可以从query的任意位置开始删除。“随机个数删除”表示可以删除任意字数。
例子如:比如完整query是“北京天气”,删除了最后一个位置的字后,query就是“北京天”。因此“天”对应的正标签就是“气”,负标签是“[eos]”。
其次针对「query错别字」的问题,设计了“错别字替换”的数据增强方式。利用开源和公司积累的错别字词表,人工构造一批负标签。比如query“悬梁刺股的故事”, 那么“刺”的正标签为“股”。而错别字词表中刚好有“悬梁刺骨->悬梁刺股”,那么我们可以将“骨”作为“刺”的负标签,进行额外信号增强。当然当前错别字词表不可能覆盖所有的样本,所以也可以通过形近字和同音字来构建负样本,比如“脉搏跳动很快”,“脉”的负样本可以是“博”、“薄”等,只要是同音就可以。
这样构造的负标签置信度是比较高。因为在上下文语境中,几乎不可能出现同音字或同形字替换后,语义还是通顺的。比如“北京天气”,任何“qi”字(除了“气”)进行替换,都是语义不通顺的。
损失函数改造
我们设计的损失函数主要包含三部分:
- 语言模型loss:这是个多分类的loss,类别大小对应词表的大小,记住lm_loss。
以“北京天气”为例,lm_loss = P(京|北) * P(天|北,京) * P(气|北,京,天) * P([eos]|北,京,天,气)。其中分母的相加次数对应类别大小(也即词表的大小) - 删除loss:这是个多分类的loss,类别大小可以自己设定(取决于我们构造了几个负标签),记做del_loss。比如“北京天气”,删除掉“气”,且我们只构造一个负标签“天->[eos]”,那么就是一个二分类任务,正标签为“天->气”。那么del_loss就表示为:
同时通过这种方式,我们可以实现loss的横向对比,具体看图2输出层的双箭头。
- 替换loss:这是个多分类的loss,类别大小可以自己设定(取决于我们构造了几个负标签),记做sub_loss。比如“北京天气”,替换“气”为“汽”,那么我们只构造一个负标签“天->汽”,那么就是一个二分类任务,正标签为“天->气”。那么sub_loss就表示为:
总loss为:total_loss = lm_loss + del_loss * scale1 + sub_loss * scale2
其中,scale1,scale2为放大系数,放大系数的作用,主要是保证这三个loss的数值都在同一个量级上。
总结
通过“数据增强”和“损失函数改造”这两个模块,实现了对比学习的机制,把句法不完整和错别字信息显式的告诉模型,因此模型能更有效的捕捉到这些特征。
效果
使用3个测试集:
- 测试集1:在query尾部随机删除一个字;
- 测试集2:在query尾部随机删除一个词;
- 测试集3:线上真实句法不完整的case
评价标准:若原始query评分高于加噪query则预测正确,否则预测错误。
具体case:
可以看到con_lm(对比学习+lm)的模型效果是远好于base model。同时通过具体case也可以看到对比学习确实是起到作用。