2023年11月

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。

一、环境安装

在 pip install -r requirements.txt 时候报错:

 ERROR: Failed building wheel for pyaudio
Successfully built python_speech_features
Failed to build pyaudio
ERROR: Could not build wheels for pyaudio, which is required to install pyproject.toml-based projects

解决办法:

conda install -c conda-forge portaudio
pip install pyaudio

参考:
https://blog.csdn.net/jiaoyangwm/article/details/133743405
https://codeantenna.com/a/5jP2RktVnp
https://blog.csdn.net/matt45m/article/details/134046424