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