支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


一文了解Text Embedding模型:从text2vec、openai-text embedding到m3e、bge(下)

发布日期:2025-04-27 20:28:24 浏览次数: 1522 作者:海边的拾遗者
推荐语

深入探索BGE模型技术亮点与预训练策略。

核心内容:
1. BGE模型技术亮点:高效预训练与多任务场景下的通用能力
2. RetroMAE预训练算法:基于句子级别的句向量生成
3. 编码与重建:RetroMAE预训练步骤详解

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

点击上方“海边的拾遗者”,选择“星标”公众号

第一时间获取价值内容

图片

04

第四部分 bge模型:采用RetroMAE预训练算法

2023年8月2日,北京智源人工智能研究院发布的中英文语义向量模型BGE(hf地址:https://huggingface.co/BAAI/bge-large-zh,GitHub地址:https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md),以下是BGE的技术亮点

  1. 高效预训练和大规模文本微调;
  1. 在两个大规模语料集上采用了RetroMAE预训练算法,进一步增强了模型的语义表征能力;
  1. 通过负采样和难负样例挖掘,增强了语义向量的判别力;
  1. 借鉴Instruction Tuning的策略,增强了在多任务场景下的通用能力

4.1 RetroMAE的预训练步骤

目前主流的语言模型的预训练任务都是token级别的,比如MLM或者Seq2Seq,但是这种训练任务难以让模型获得一个高质量的基于句子级别的句向量,这限制了语言模型在检索任务上的潜力。针对这个弊端,目前有两者针对检索模型的预训练策略

  • 第一种是self-contrastive learning,这种方式往往受限于数据增强的质量,并且需要采用非常庞大数量的的负样本
  • 另一种基于anto-encoding,一种自重建方法,不受数据增强跟负样本采样策略的影响,基于这种方法的模型性能好坏有两个关键因素  其一是重建任务必须要对编码质量有足够的要求,其二是训练数据需要被充分利用到
基于此,研究人员提出了RetraoMAE(RetroMAE论文:https://arxiv.org/abs/2205.12035),它包括两个模块,其一是一个类似于BERT的编码器,用于生成句向量,其二是一个一层transformer的解码器,用于重建句子,如下图所示图片

4.1.1 编码Encoding

所谓编码,即Mask(EN)掉一小部分token然后通过BERT编码得到句子嵌入sentence embedding图片,具体步骤如下

  1. 给定一个句子输入X:Norwegian forest cat is a breed of dom-estic cat originating in northern Europe
  2. 随机Mask(EN)掉其中一小部分token后得到图片[M] forest cat is a breed of [M] cat originating in [M] Europe  这里通常会采用一定的mask比例(15%~30%),从而能保留句子原本大部分的信息
  3. 然后利用类似BERT的编码器图片对其进行编码,得到对应的的句子嵌入图片一般将[CLS]位置最后一层的隐状态作为句子嵌入」,如下公式所
图片
We apply a BERT like encoder with 12 layers and768 hidden-dimensions, which helps to capture thein-depth semantics of the sentence. Following the common practice, we select the [CLS] token’s finalhidden state as the sentence embedding.

4.1.2 解码Decoding

所谓解码,即Mask(DE)很大一部分token然后结合句子嵌入图片sentence embedding,让解码器重构原始句子
具体而言,即是联合以下两个部分,好让解码器在该两部分的基础上重构原始句子
  • 利用Mask(DE)后的文本输入图片[MI [M] cat is MI [M} of dom-estic [M] [M] in northern [M]  (这里采取了比encoder部分更加激进的mask比例,比如50%~70%)
  • 与上一节encoder生成的句子嵌入(sentence embedding)论文中对这一步骤的英文阐述是:The masked input is joined with the sentence embedding, based on which the original sentence is reconstructed by the decoder.图片
有个细节是,这里的Mask(DE)输入带上位置嵌入了,即句子嵌入[图片]和带有位置的掩码输入被组合成以下序列

[图片]  

 

其中,[图片],表示[图片]的嵌入,在[图片]的基础上增加了一个额外的位置嵌入p

接下来,通过优化以下目标,学习解码器[图片]来重构原始句子X

[图片]      

其中,CE是交叉熵损失

由于在解码器部分采用了极其简单的网络结构跟非常激进的mask比例,从而使得解码任务变得极具挑战性,迫使encoder去生成高质量的句向量才能最终准确地完成原文本重建

4.1.3 增强解码Enhanced Decoding

前面提及的解码策略有一种缺陷,就是训练信号只来源于被mask掉的token,而且每个mask掉的token都是基于同一个上下文重建的。于是研究人员提出了一种新的解码方法:Enhanced Decoding,具体做法如下

a) 首先生成两个不同的输入流H1(query)跟H2(context)

图片

其中图片是句子嵌入,图片是标记嵌入(在这个地方没有标记被掩码),图片是位置嵌入相当于 

图片是sentence embedding + Position embedding

图片为sentence embedding和token embedding + position embedding

b) 通过attention机制得到新的输出A
图片
这里的M是一个mask矩阵,第i个token所能看得到的其他token是通过抽样的方式决定的(当然要确保看不到自身token,而且都要看得见第一个token,也就是encoder所产出CLS句向量的信息)
其中一个和常规decoder不一样的地方是,H1作为Q,H2作为KV

H1中的每个token embedding去H2中查找比较重要的上下文:包括H2被采样到的 token,以及初始token embedding都能看到[这里的初始embedding就是sentence embedding],至于对角线上的因代表的各自自身,故看不到
为方便大家更好、更快的理解,我再举个例子,比如:
  • c)最终利用attention后的输出A跟H1一起过FNN(即resnet)去重建原文本,这里重建的目标不仅仅是被mask掉的token,而是全部token
图片
  •   最终RetroMAE的损失由两部分相加得到,其一是encoder部分的MLM损失,其二是deocder部分自重建的交叉熵损失

最后,再总结一下RetroMAE 预训练步骤图片
  1. (A)编码阶段:将输入进行一定比例的mask操作,并编码为句子嵌入(绿色矩形)(A) Encoding: the input is moderately masked and encoded as the sentence embedding (the green rectangle)
  1. (B)解码阶段:对输入使用很高比例的mask操作,并与句子嵌入连接以恢复被mask的部分(阴影符号)(B) Decoding: the input is aggressively masked, and joined with the sentence embedding to reconstruct the masked tokens (the shadowed tokens).
  1. (C)增强编码阶段:基于每行的句子嵌入和可见上下文来重建所有输入符号;主对角线位置填充为-∞(灰色,因为其代表自身,故不可见),可见上下文的位置填充为0(蓝色)(C) Enhanced encoding: all input tokens are reconstructed based on the sentence embedding and the visible context in each row (defined in Eq. 7); the main diagonal positions are filled with −∞ (grey), and positions for the visible context are filled with 0 (blue).

4.2 bge模型的微调

  • 微调脚本:https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune
  • 数据格式

{"query"str"pos"List[str], "neg":List[str]}
  • 难负样本挖掘  

难负样本是一种广泛使用的提高句子嵌入质量的方法。可以按照以下方法挖掘难负样本

python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \--model_name_or_path BAAI/bge-base-en-v1.5 \--input_file toy_finetune_data.jsonl \--output_file toy_finetune_data_minedHN.jsonl \--range_for_sampling 2-200 \--use_gpu_for_searching
  • 训练
python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \--input_file toy_finetune_data.jsonl \--output_file toy_finetune_data_minedHN.jsonl \--range_for_sampling 2-200 \--use_gpu_for_searching
4.3 新一代通用语义向量模型BGE-M3

4.3.1 BGE-M3:多语言、多粒度、多功能

近日,智源发布了BGE家族新成员——通用语义向量模型BGE-M3(其开源仓库及技术报告模型链接)

  1. 多语言Multi-Linguality  支持超过100种语言,具备领先的多语言、跨语言检索能力

    具体而言,BGE-M3训练集包含100+种以上语言,既包含每种语言内部的语义匹配任务(Language X to Language X),又包含不同语言之间的语义匹配任务(Language X to Language Y)
      丰富且优质的训练数据帮助BGE-M3建立了出色的多语言检索(Multi-Lingual Retrieval)与跨语言检索能力(Cross-Lingual Retrieval)

2. 多粒度Multi-Granularity  全面且高质量地支撑“句子”、“段落”、“篇章”、“文档”等不同粒度的输入文本,最大输入长度为 8192

具体而言,BGE-M3目前可以处理最大长度为8192 的输入文本,极大地满足了社区对于长文档检索的需求。在训练BGE-M3时,智源研究员在现有长文本检索数据集的基础之上,通过模型合成的方式获取了大量文本长度分布多样化的训练数据
  与此同时,BGE-M3通过改进分批(batch)与缓存(cache)策略,使得训练过程具备足够高的吞吐量与负样本规模,从而确保了训练结果的质量。基于数据与算法双层面的优化处理,BGE-M3得以高质量的支持“句子”、“段落”、“篇章”、“文档”等不同粒度的输入文本

3. 多功能Multi-Functionality  一站式集成了稠密检索、稀疏检索、多向量检索三种检索功能

具体而言,不同于传统的语义向量模型,BGE-M3既可以借助特殊token [CLS]的输出向量用以来完成稠密检索(Dense Retrieval)任务
  又可以利用其他一般性token的输出向量用以支持稀疏检索(Sparse Retrieval)与多向量检索(Multi-vector Retrieval)
  
  三种检索功能的高度集成使得BGE-M3可以一站式服务不同的现实场景,如语义搜索、关键字搜索、重排序
  同时,无需使用多个模型进行多个推理,BGE-M3一次推理就可以得到多个不同模式的输出,无需额外开销,并能高效支持混合检索,联合三种检索模式可获得更加精准的检索结果

4.3.2 训练数据

在训练数据上,包括

  1. 未标记语料库的弱监督数据  通过提取Wikipedia、S2ORC、xP3、mC4和CC-News等各种多语言语料库中的丰富语义结构(如标题-正文、标题-摘要、指令-输出等)来进行整理  为了学习用于跨语言语义匹配的统一嵌入空间,从两个翻译数据集MTP、NLLB中进行处理,总共收集了194种语言的12亿个文本对和2655个跨语言对应
  1. 标记语料库的微调数据  对于英语,包括八个数据集,包括HotpotQA、TriviaQA、NQ、MSMARCO、COLIEE、PubMedQA以及SimCSE收集的NLI数据  对于中文,包括七个数据集,包括DuReader、mMARCO-ZH、T2-Ranking、LawGPT1、CmedQAv2和LeCaRDv2  对于其他语言,利用来自MIRACL的训练数据
合成的多语言微调数据  另外,为了缓解长文档检索任务的性能,通过生成合成数据方式进行处理,并引入额外的多语言微调数据(记为MultiLongDoc)  具体实现时,从Wiki和MC4数据集中抽取长篇文章,并从中随机选择段落。然后,使用GPT-3.5根据这些段落生成问题,生成的问题和抽样文章构成微调数据的新文本对  这里采用的prompt为:
“You are a curious AI assistant, please generate one specific and valuable question based on the following text.
The generated question should revolve around the core content of this text, and avoid using pronouns (e.g., ”this”). Note that you should generate only one question, without including additional content:”
最终得到的数据分布如下:图片

4.3.3 混合检索与模型训练

如BGE模型一致,BGE-M3模型训练分为三个阶段:

  1. RetroMAE预训练,在105种语言的网页数据和wiki数据上进行,提供一个可以支持8192长度和面向表示任务的基座模型
  1. 无监督对比学习,在194种单语言和1390种翻译对数据共1.1B的文本对上进行的大规模对比学习
  1. 多检索方式统一优化,在高质量多样化的数据上进行多功能检索优化,使模型具备多种检索能力

4.3.3.1 混合检索

从形式上看,在给定一个x表示的查询q时,从语料库[图片]中检索出以y表示的文档[图片]
其中

[图片]属于密集检索、稀疏/词汇检索或多维检索中的任何一种函数
y可以是另一种语言,也可以是与x相同的语言

M3-Embedding统一了嵌入模型的所有三种常见检索功能,即稠密检索、词性(稀疏)检索和多向量检索

sdense,密集检索  
可以根据文本编码器将输入查询q转换成隐藏状态图片,继而
→使用特殊标记"[CLS]"的归一化隐藏状态来表示查询q的嵌入:图片
→使用图片来表示段落p的嵌入  

故,查询和段落之间的相关性得分是通过两个嵌入式eqep之间的内积来衡量:图片

  • slex,在词汇检索上,输出嵌入式也用于估算每个词条的重要性  

    而估算词的重要程度,可以方便词汇检索  具体而言,对于查询中的每个术语t(一个术语对应一个token),术语权重的计算公式为如下:图片

  其中图片是将隐藏状态映射到浮点数的矩阵  如果一个术语t在查询中出现多次,只保留其最大权重,用同样的方法计算段落中每个术语的权重  在估算术语权重的基础上,查询和段落之间的相关性得分由查询和段落中共存术语(表示为图片,也就是交集)的联合重要性计算得出(Based on the estimation term weights, the relevance score between query and passage is computed by the joint importance of the co-existed terms (denoted as q ∩ p) with in the query and passage):

图片
  • smul,在多向量检索上,作为密集检索的扩展  利用整个输出嵌入来表示查询/和段落,并根据Col-Bert使用后期交互来计算细粒度相关性得分
最后,由于嵌入模型的多功能性,检索过程可以采用混合过程
  1. 首先,候选结果可以由每种方法单独检索(多向量方法由于成本高,可以免去这一步骤)
  1. 然后,根据综合相关性得分对最终检索结果重新排序:srank←sdense+slex+smul

4.3.3.2 模型训练

嵌入模型经过训练,可以区分正样本和负样本。对于每一种检索方法,它都有望为查询的正样本分配一个更高的分数,因此,进行训练过程是为了最小化In-foNCE损失,如下表示
图片
其中
  • 图片分别代表查询q的正样本和负样本
  • s(-)是{sdense(-)、slex(-)、smul(-)} 中的任意一个函数,不过,不同检索方法的预测结果可以整合为一个更准确的相关性得分,因为它们具有异质性。在最简单的形式中,整合可以是不同预测得分的总和:sinter ←sdense+slex+smul
在知识蒸馏阶段,以总得分sinter为教师模型监督信号,其中的任何一个得分作为学生模型
将每种检索方法的损失函数修改为:
图片

进一步对修正后的损失函数进行积分和归一化处理:

图片
最后使用线性组合推导出自我知识蒸馏的最终损失函数

图片

整个训练过程是一个两阶段的工作流程,如下所示:
首先,使用弱监督数据对文本编码器进行预训练,其中只有密集检索是以对比学习的基本形式进行训练的
其次,自我知识蒸馏应用于第二阶段,在此阶段对嵌入模型进行微调,以建立三种检索功能。在这一阶段中,将使用标注数据和合成数据,并根据ANCE方法为每个查询引入硬负样本

4.3.4 三大关键技术:自学习蒸馏、训练效率优化、长文本优化等

  • 自学习蒸馏  
    人类可以利用多种不同的方式计算结果,矫正误差。模型也可以,通过联合多种检索方式的输出,可以取得比单检索模式更好的效果  因此,BGE-M3使用了一种自激励蒸馏方法来提高检索性能。具体来说,合并三种检索模式的输出,得到新的文本相似度分数,将其作为激励信号,让各单模式学习该信号,以提高单检索模式的效果
  • 训练效率优化  

由于引入了大量文本长度差异极大的训练数据,常规的对比学习训练方法的效率非常低下  一方面,长文本会消耗相当多的显存,大大的限制了训练时的batch size  其次,短文本不得不填充至更长的长度以对齐同一批次的长文本,这样就引入了大量无意义的计算  此外,训练数据的长度差异容易使得不同GPU之间的计算负荷分布不均并引发相互等待,造成不必要的训练延时  

为了解决这些问题,我们优化了训练流程,如下图所示图片
→首先,根据长度对文本数据进行分组,并从每组中采样数据,确保一个batch内文本长度相对相似,从而减少填充。同时,数据程序会首先从组内采样足够的数据,然后分配给各机器,保证不同机器的计算开销尽可能相近  

→为了减少文本建模时的显存消耗,我们将一批数据分成多个小批。对于每个小批,我们利用模型编码文本,收集输出的向量同时丢弃所有前向传播中的中间状态,最后汇总向量计算损失。通过这种方式,可以显著增加训练的batch size(且当建模长文本或者向量模型很大时,都可以采用此来扩大batch size)

长文本优化  

目前,开源社区缺少用于文档级检索的开源数据集。为此,我们借助大语言模型生产了一份包括13种语言的长文档检索数据。另外,由于缺乏长文本数据或计算资源,实际情况下长文本微调不一定可以进行  在这种情况下,我们提出了一种简单而有效的方法:MCLS(Multiple CLS)来增强模型的能力,而无需对长文本进行微调,如下图所示
图片
  • MCLS方法旨在利用多个CLS token来联合捕获长文本的语义  具体来说,我们为每个固定数量的token插入一个cls token,每个cls token可以从相邻的token获取语义信息。最后,通过对所有cls token的最后隐藏状态求平均值来获得最终的文本嵌入(In MCLS,we insert a cls token for every fixed number of tokens, and the final text embedding is obtained by averaging the last hidden states of all cls tokens.)


说个正事哈



由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方海边的拾遗者”,进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心图片



投稿或交流学习,备注:昵称-学校(公司)-方向,目前群人数过多,只能通过助手拉入技术交流群。

图片

记得备注呦


方向有很多:面试内推、机器学习、深度学习,python,推荐算法,广告算法,搜索算法,多模态,大模型等


推荐两个专辑给大家:   

专辑 | 机器学习算法原理及实现

专辑 | 面试心得及经验分享


更多精彩推荐,请关注我们
图片

~我们的征途是星辰大海~

图片


来都来了,喜欢的话就请分享点赞爱心三连再走吧~~~



图片

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询