RoFormer-Sim模型融合了检索和生成于一体的模型。在roformer-sim之前作者也提出了一种类似的模型BERTSIM,roformer-sim是对 SimBERT 相关技术进一步整合和优化,可以用来作为句向量的一个比较高的 baseline,也可以用来实现相似问句的自动生成,可以作为辅助数据扩增工具使用。
roformer-smi和bert-smi的区别如下所示:
SimBERT = BERT + UniLM + 对比学习 RoFormer-Sim = Roformer + UniLM + 对比学习 + BART + 蒸馏 \text {SimBERT} = \text{BERT}+ \text{UniLM} + \text{对比学习} \\ \, \\ \text {RoFormer-Sim} = \text{Roformer}+ \text{UniLM} + \text{对比学习}+\text{BART}+\text{蒸馏} SimBERT=BERT+UniLM+对比学习RoFormer-Sim=Roformer+UniLM+对比学习+BART+蒸馏
Roformer模型是transformer的升级版,它的主要改动是应用了作者构思的“旋转式位置编码(Rotary Position Embedding,RoPE)”代替transformer中的绝对位置编码,这是一种配合 Attention 机制能达到“绝对位置编码的方式实现相对位置编码”的设计。
一般来说,绝对位置编码具有实现简单、计算速度快等优点,而相对位置编码则直接地体现了相对位置信号,跟我们的直观理解吻合,实际性能往往也更好。 于是roformer就集各家之所长,提出通过绝对位置编码的方式实现相对位置编码的旋转式位置编码。
因此roformer的出发点就是通过绝对位置编码的方式实现相对位置编码,为了达到这个目的,假设通过下述运算来给 q , k q, k q,k 添加绝对位置信息
q ~ m = f ( q , m ) , k ~ n = f ( k , n ) ( 2 − 1 ) \tilde{\boldsymbol{q}}_{m}=\boldsymbol{f}(\boldsymbol{q}, m), \quad \tilde{\boldsymbol{k}}_{n}=\boldsymbol{f}(\boldsymbol{k}, n) \,\,\,\,\,\,\, (2-1) q~m=f(q,m),k~n=f(k,n)(2−1)
也就是说,分别为 q , k q, k q,k 设计操作 f ( ⋅ , m ) 和 f ( ⋅ , n ) f(·, m) 和f(·, n) f(⋅,m)和f(⋅,n),使得经过该操作后, q ^ m \hat q_{m} q^m k ^ n \hat k_{n} k^n 就带有了位置 m, n 的绝对位置信息。Attention 的核心运算是内积,所以我们希望的内积的结果带有相对位置信息,因此假设存在恒等关系
⟨ f ( q , m ) , f ( k , n ) ⟩ = g ( q , k , m − n ) \langle\boldsymbol{f}(\boldsymbol{q}, m), \boldsymbol{f}(\boldsymbol{k}, n)\rangle=g(\boldsymbol{q}, \boldsymbol{k}, m-n) ⟨f(q,m),f(k,n)⟩=g(q,k,m−n)
因此,目标就成为求出该恒等式的一个(尽可能简单的)解 f f f。求解过程还需要一些初始条件,显然我们可以合理地设 f ( q , 0 ) = q f(q, 0)=q f(q,0)=q, f ( k , 0 ) = k f(k, 0) = k f(k,0)=k 。
具体求解过程可以参考Transformer升级之路:博采众长的旋转式位置编码,得到解 f f f后,就可以用式(2-1)进行计算 q , k q, k q,k,然后进行self-attention计算的时候就带有相对位置信息了。
Roformer-Sim 的主体框架是Roformer模型,除此之外,RoFormer-Sim 用到了更多的训练数据,且不同于 SimBERT 仅仅局限于疑问句,RoFormer-Sim 可以用来做一般句子的相似句生成,适用场景更大。其他训练细节还包括 RoFormer-Sim 用了更大的 batch_size 和 maxlen 等。
SimBERT 和 RoFormer-Sim 的关键之处,都是在于训练语料的构建。RoFormer-Sim 的训练语料包括两部分
对于疑问类相似句,还是像 SimBERT 一样,通过收集百度知道的相似问句,然后通过规则进一步清洗;
对于通用类相似句,没有现成的地方可以搜集,于是提出了两种方案来无监督地构建相似句对。
第一个方案是基于“同一个问题的答案是相似的”思想,假如我们有现成的问答语料,该语料对于同一个问题有多个答案,那么我们可以将每个答案分句,然后用一个现成的相似度函数来比较答案之间的相似度,挑出相似度超过某个阈值的句对作为相似句对使用;
第二个方案则是基于“同一篇章的句子是相似的”思想,它更加简单直接一点,就是将每个篇章分句,然后用一个现成的相似度函数两两计算相似度,挑出相似度超过某个阈值的句对作为相似句对使用,显然该方案的合理性更弱,所以它的阈值也更高。
相似度函数是直接使用 Jaccard 相似度的一个变体,换言之只需要一个规则的、字符级别的相似度就好了,语义上的关联,则通过篇章内部的关联以及预训练模型本身的泛化能力来获得。通过第一个方案,从几个阅读理解数据集中构建了约 450 万个(伪)相似句对;通过第二个方案,从 30 多 G 的平行预料中构建了约 470 万个(伪)相似句对;而爬取的问句则达到了约 3000 万个相似句组(一组可以构成多对)。从这个角度看来,问句的数目是远超于一般句式的,所以我们按照 1:1 的方式从中采样,使得每种句式的样本都均衡。
RoFormer-Sim 的训练方式跟 SimBERT 基本一样,如下图所示。稍微不同的是,为了增强模型的生成能力,在构造训练语料的时候,我们还随机地将输入句子的部分 token 替换为[MASK],这种预训练方法首先由 BART 提出。而我们跟 BART 的区别在于:BART 是“输入带噪声的句子,输出原句子”,我们是“输入带噪声的句子,输出原句子的一个相似句”,理论上我们的任务还更难。
增加一般句式的语料、引入仿 BART 式训练,这些改动都相对来说提升了生成模型的效果。然而,检索模型(即句子编码模型)的效果却降低了。估计可能是更多的语料、更大的噪声虽然加大了生成模型的难度,但对于对比学习来说,这些不同句式的或者带噪声的样本作为负样本,反而是难度降低了。比如,如果一个 batch 同时有疑问句和陈述句,那么模型可以简单地通过句式(而不是语义)就可以识别出不少负样本,从而降低了对语义的理解能力。
当然,SimBERT 和 RoFormer-Sim 的本质定位都是相似句扩增模型,检索模型只是它的“副产品”,但仍然希望这个“副产品”能尽可能好一些。为此,在 RoFormer-Sim 训练完之后,进一步通过蒸馏的方式把 SimBERT 的检索效果转移到 RoFormer-Sim 上去,从而使得 RoFormer-Sim 的检索效果基本持平甚至优于 SimBERT。蒸馏的方式很简单,假如对于同一批句子,SimBERT 出来的句向量为 u 1 , u 2 , . . . , u n u_1, u_2, ..., u_n u1,u2,...,un,RoFormer-Sim 出来的句向量为 v 1 , v 2 , . . . , v n v_1, v_2, ... , v_n v1,v2,...,vn ,那么就以:
L s i m = λ n 2 ∑ i = 1 n ∑ j = 1 n ( cos ( u i , u j ) − cos ( v i , v j ) ) 2 \mathcal{L}_{\mathrm{sim}}=\frac{\lambda}{n^{2}} \sum_{i=1}^{n} \sum_{j=1}^{n}\left(\cos \left(u_{i}, u_{j}\right)-\cos \left(v_{i}, v_{j}\right)\right)^{2} Lsim=n2λi=1∑nj=1∑n(cos(ui,uj)−cos(vi,vj))2
当然,为了防止模型“遗忘”掉生成模型,蒸馏的同时还要加上生成损失, L = L s i m + L g e n L = L_{sim}+L_{gen} L=Lsim+Lgen
Roformer-Sim以Roformer为主体框架,使用大量的相似对语句进行训练,来进行似句扩增,同时检索模型作为他的副产品也获得非常好的效果。在训练的时候有两个任务:生成任务和检索任务,在生成任务中效仿BART,输入带噪声的句子,输出原句子的一个相似句,在检索任务中通过蒸馏的方式把 SimBERT 的检索效果转移到 RoFormer-Sim 上
Transformer升级之路:博采众长的旋转式位置编码
SimBERTv2来了!融合检索和生成的RoFormer-Sim模型