相似问生成和相似句检索能力 ::: simbert -> roformer-sim (simbertv2)

在这里插入图片描述

simbert

开源地址:https://github.com/ZhuiyiTechnology/simbert

UNILM:

UniLM是一个融合NLU和NLG能力的Transformer模型,由微软在去年5月份提出来的,今年2月份则升级到了v2版本。
UniLM的核心是通过特殊的Attention Mask来赋予模型具有Seq2Seq的能力
假如输入是“你想吃啥”,目标句子是“白切鸡”,那UNILM将这两个句子拼成一个:[CLS] 你 想 吃 啥 [SEP] 白 切 鸡 [SEP],然后接如图的Attention Mask:
在这里插入图片描述
在这里插入图片描述
Seq2Seq只能说明UniLM具有NLG的能力,那前面为什么说它同时具备NLU和NLG能力呢?
因为UniLM特殊的Attention Mask,所以[CLS] 你 想 吃 啥 [SEP]这6个token只在它们之间相互做Attention,而跟白 切 鸡 [SEP]完全没关系,这就意味着,尽管后面拼接了白 切 鸡 [SEP],但这不会影响到前6个编码向量。
由于这个特性,UniLM在输入的时候也随机加入一些[MASK],这样输入部分就可以做MLM任务,输出部分就可以做Seq2Seq任务,MLM增强了NLU能力,而Seq2Seq增强了NLG能力,一举两得。

SimBERT属于有监督训练,训练语料是自行收集到的相似句对,通过一句来预测另一句的相似句生成任务来构建Seq2Seq部分,如下图:
在这里插入图片描述
假设SENT_a和SENT_b是一组相似句,那么在同一个batch中,把[CLS] SENT_a [SEP] SENT_b [SEP]和[CLS] SENT_b [SEP] SENT_a [SEP]都加入训练,做一个相似句的生成任务,这是Seq2Seq部分。

另一方面,把整个batch内的[CLS]向量都拿出来,得到一个句向量矩阵V∈ℝb×d(b是batch_size,d是hidden_size),然后对d维度做l2归一化,得到Ṽ ,然后两两做内积,得到b×b的相似度矩阵Ṽ Ṽ ⊤,接着乘以一个scale(我们取了30),并mask掉对角线部分,最后每一行进行softmax,作为一个分类任务训练,每个样本的目标标签是它的相似句(至于自身已经被mask掉)。说白了,就是把batch内所有的非相似样本都当作负样本,借助softmax来增加相似样本的相似度,降低其余样本的相似度。

说到底,关键就是“[CLS]的向量事实上就代表着输入的句向量”,所以可以用它来做一些NLU相关的事情。最后的loss是Seq2Seq和相似句分类两部分loss之和。

roformer-sim (simbert v2)

开源地址:https://github.com/ZhuiyiTechnology/roformer-sim

RoFormer-Sim的训练语料包括两部分:
1、疑问类型相似句;[像SimBERT一样,通过收集百度知道的相似问句,然后通过规则进一步清洗]
2、通用类型相似句。[两种方案,一定程度上可以无监督地构建(伪)相似句对]。

方案1:基于“同一个问题的答案是相似的”思想,假如我们有现成的问答语料,该语料对于同一个问题有多个答案,那么我们可以将每个答案分句,然后用一个现成的相似度函数来比较答案之间的相似度,挑出相似度超过某个阈值的句对作为相似句对使用;

方案2:基于“同一篇章的句子是相似的”思想,它更加简单直接一点,就是将每个篇章分句,然后用一个现成的相似度函数两两计算相似度,挑出相似度超过某个阈值的句对作为相似句对使用,显然该方案的合理性更弱,所以它的阈值也更高。
“现成的相似度函数”,我们使用Jaccard相似度的一个变体,换言之只需要一个规则的、字符级别的相似度就好了,语义上的关联,则通过篇章内部的关联以及预训练模型本身的泛化能力来获得。

方案1,我们从几个阅读理解数据集中构建了约450万个(伪)相似句对;
方案2,我们从30多G的平行预料中构建了约470万个(伪)相似句对;而爬取的问句则达到了约3000万个相似句组(一组可以构成多对)。从这个角度看来,问句的数目是远超于一般句式的,所以我们按照1:1的方式从中采样,使得每种句式的样本都均衡。

训练方式
跟SimBERT基本一样,如下图所示。
稍微不同的是,为了增强模型的生成能力,在构造训练语料的时候,我们还随机地将输入句子的部分token替换为[MASK],这种预训练方法首先由BART提出。
而我们跟BART的区别在于:BART是“输入带噪声的句子,输出原句子”,我们是“输入带噪声的句子,输出原句子的一个相似句”,理论上我们的任务还更难。
在这里插入图片描述

由于进行了仿BART式训练,所以除了直接进行相似句生成外,我们还可以自行把某些部分mask掉,让模型自行发散扩充

增加一般句式的语料、引入仿BART式训练,这些改动都相对来说提升了生成模型的效果。
然而,我们意外地发现,检索模型(即句子编码模型)的效果却降低了。
估计的原因,可能是更多的语料、更大的噪声虽然加大了生成模型的难度,但对于对比学习来说,这些不同句式的或者带噪声的样本作为负样本,反而是难度降低了。比如,如果一个batch同时有疑问句和陈述句,那么模型可以简单地通过句式(而不是语义)就可以识别出不少负样本,从而降低了对语义的理解能力。
当然,SimBERT和RoFormer-Sim的本质定位都是相似句扩增模型,检索模型只是它的“副产品”,但我们仍然希望这个“副产品”能尽可能好一些。为此,我们在RoFormer-Sim训练完之后,进一步通过蒸馏的方式把SimBERT的检索效果转移到RoFormer-Sim上去,从而使得RoFormer-Sim的检索效果基本持平甚至优于SimBERT。
蒸馏的方式很简单,假如对于同一批句子,SimBERT出来的句向量为u1,u2,⋯,un,RoFormer-Sim出来的句向量为v1,v2,⋯,vn,那么就以
sim=λn2∑i=1n∑j=1n(cos(ui,uj)−cos(vi,vj))2(1)
为loss进行学习,这里λ=100。当然,为了防止模型“遗忘”掉生成模型,蒸馏的同时还要加上生成损失,即=sim+gen。base版的蒸馏不需要很多步,大致5000步左右就可以训练完成了。

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值