BGE是由北京智源人工智能研究院提出的新的embedding模型。

BGE的训练主要由组成:

(1)通用文本上进行预训练;

(2)通用文本上finetinue(采用unlabeled数据);

(3)特定任务上finetinue(采用有labeled数据);

一、预训练

在预训练阶段,作者选择在Wudao数据集上进行,采用的模型架构为RetroMAE[2]。

RetroMAE的模型架构为非对称的encoder-decoder结构。为什么是非对称的呢?因为它的encoder部分是由bert组成(12层transformer的encoder),而它的decoder部分仅有由一层transformer的decoder构成。

在encoder阶段,对sentence进行15%~30%的mask,通过encoder得到句子向量的表示(也就是encoder的[CLS] token):
,在decoder部分,句子被进一步加大噪音,mask的比例为50%~70%,通过增加mask的比例来提升任务的复杂性。而整个预训练的任务则为:在encoder阶段,对被掩码的部分进行重构,也就是MLM(Masked Language Modeling),在decoder阶段对整个句子进行重构,整体loss函数为:
微信截图_20240807143152.png
微信截图_20240807143053.png

相比于transformer中的decoder结构,RetroMAE的作者在这一部分做了一些改进,在文章中称为enhanced-decoder。

微信截图_20240807143958.png

微信截图_20240807144034.png

二、通用文本上finetune

在这个阶段采用的是unlabled data,相信大家跟我一样感到很好奇,标签都没有,那怎么训练模型呢。其实这个unlabled data更准确的说采用的其实是伪标签,整理数据获得伪标签主要有2个步骤:1. 收集大量pair数据,如title-passage;2. 用text2vec-chinese计算文本的相似度,再卡阈值(paper中采用0.43作为阈值),过滤掉置信度比较低的pair;最后形成了100 million pairs这样庞大的数据集。
有了数据之后,模型训练,采用的是大名鼎鼎的对比学习方式:
微信截图_20240807143806.png

三、特定任务上finetinue

在下游任务上进行finetune会存在着一个问题:有些样本可能会互相矛盾,举个例子,一对pair在某个任务上是相似的,而在另一个任务上可能就不相似了。争对这个问题,作者提出了两点解决方案:1. 不同的任务加上不同的指令;2.进行难负例挖掘;最后再在进行改造后的数据集上进行finetune。

标签: none

添加新评论