• 基于对比学习的NN语言模型训练方法


    背景

    1)语言模型(language model,简称LM),是对语句的概率分布的建模。通俗来讲,就是判断一个语言序列是否是正常语句,即是否是“人话”。作为query理解的重要基础模块,主要应用于不完整query的识别、低质query打压等任务上。

    语言模型建模:该任务就是预测每一个位置的词对应的下一个词是什么,最后将每个位置的概率输出相乘,从而对query质量进行打分。
    图1:语言模型建模方式

    2)对比学习是近年来比较火的自监督训练方式,最早用于CV领域。随着SimCSE模型问世,对比学习也在nlp领域受到较大关注,并取得不错的效果。

    3)目前对比学习主要在NLU任务上进行改造,还没有在语言模型任务上进行改造的工作。因此本文尝试着将对比学习用于语言模型训练任务中。

    方案

    原训练方案的缺点

    从图1中可以看出,“北”对应的正标签为“京”,其余为负标签。“京”对应的正标签为“气”, 其余为负标签。该方法会有以下几个问题:

    1. 负标签不够准确:以“北”为例,他的正标签是“京”。而负标签是词表中除了“京”以外的其他词,但这些所谓的负标签并不完全都是真正的负标签。比如“北海天气很好”也是个正常的句子,因此“海”也可以是“北”的正标签,而不是负标签。
    2. 负标签不够有区分度:以“天”为例,他的正标签是“气”,负标签包含一系列其他字,如“安”、“汽”、“坛”等,但这里面“汽”应该比其他两次字更负向,因为“北京天安门”、“北京天坛”都是正常的句子,而“北京天汽”的“汽”应该是错别字

    现方案

    针对「负标签不够准确」和「负标签不够有区分度」的问题,我们从「数据增强」和「损失函数改造」两个方面进行优化。

    数据构造

    首先针对「query不完整」的问题,设计了“随机位置删除”和“随机个数删除”的数据增强方式。“随机位置删除”表示可以从query的任意位置开始删除。“随机个数删除”表示可以删除任意字数。
    例子如:比如完整query是“北京天气”,删除了最后一个位置的字后,query就是“北京天”。因此“天”对应的正标签就是“气”,负标签是“[eos]”。

    图2:随机删除后的lstm建模方式,其中输出层的红色字体为正标签,绿色字体为我们构造的“删除”负标签
    其次针对「query错别字」的问题,设计了“错别字替换”的数据增强方式。利用开源和公司积累的错别字词表,人工构造一批负标签。比如query“悬梁刺股的故事”, 那么“刺”的正标签为“股”。而错别字词表中刚好有“悬梁刺骨->悬梁刺股”,那么我们可以将“骨”作为“刺”的负标签,进行额外信号增强。当然当前错别字词表不可能覆盖所有的样本,所以也可以通过形近字和同音字来构建负样本,比如“脉搏跳动很快”,“脉”的负样本可以是“博”、“薄”等,只要是同音就可以。
    图3:错别字替换后的lstm建模方式,其中输出层的红色字体为正标签,绿色字体为我们构造的“替换”负标签
    这样构造的负标签置信度是比较高。因为在上下文语境中,几乎不可能出现同音字或同形字替换后,语义还是通顺的。比如“北京天气”,任何“qi”字(除了“气”)进行替换,都是语义不通顺的。

    损失函数改造

    我们设计的损失函数主要包含三部分:

    1. 语言模型loss:这是个多分类的loss,类别大小对应词表的大小,记住lm_loss。
      以“北京天气”为例,lm_loss = P(京|北) * P(天|北,京) * P(气|北,京,天) * P([eos]|北,京,天,气)。其中分母的相加次数对应类别大小(也即词表的大小)在这里插入图片描述
    2. 删除loss:这是个多分类的loss,类别大小可以自己设定(取决于我们构造了几个负标签),记做del_loss。比如“北京天气”,删除掉“气”,且我们只构造一个负标签“天->[eos]”,那么就是一个二分类任务,正标签为“天->气”。那么del_loss就表示为:在这里插入图片描述同时通过这种方式,我们可以实现loss的横向对比,具体看图2输出层的双箭头。
    3. 替换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:具体case
    可以看到con_lm(对比学习+lm)的模型效果是远好于base model。同时通过具体case也可以看到对比学习确实是起到作用。

  • 相关阅读:
    阿里云代理商:阿里云跨分部抵销前营收267.6亿元,跨分部抵销后营收207.57亿元,抵销后营收环比增长达17.37%。
    js查询月份开始和结束日期
    生成随机数的若干种方法
    【编码】PHP中文路径问题详解
    VSCode远程连接服务器报错:Could not establish connection to
    hisat2 建立索引 序列比对rnaseq上游分析linux
    诚迈科技发布OpenHarmony发行版鸿诚志远HongZOS
    Vue的基础语法-常用v-on、v-if、v-bind等指令的细节(最详细)
    SpringBoot+Vue项目校园商铺系统
    lt基站学习总结
  • 原文地址:https://blog.csdn.net/asrgreek/article/details/126142353