BGE-M3 算法详解:从模型架构到三种检索方式的数学原理

一、引言:什么是BGE-M3?

2024年1月30日,智源研究院(BAAI)发布了BGE家族的新成员------BGE-M3。BGE-M3是首个集多语言(Multi-Linguality)、多粒度(Multi-Granularity)、多功能(Multi-Functionality)三大技术特征于一体的语义向量模型-。

M3代表着三大核心能力:

  • Multi-Linguality(多语言) :支持超过100种工作语言

  • Multi-Granularity(多粒度) :输入长度最高可达8192个token

  • Multi-Functionality(多功能) :同时支持稠密检索、稀疏检索和多向量检索三种功能

BGE-M3基于XLM-RoBERTa架构,参数量达5.69亿(569M) ,隐藏层维度为1024-。其最引人注目的特性是:一次推理可以同时输出三种向量表示-,无需额外开销。

本文将深入剖析BGE-M3的模型架构、训练方法,以及三种检索方式的完整算法计算过程,并配以具体的数值示例。

二、模型架构与核心技术

2.1 整体架构

BGE-M3基于XLM-RoBERTa-large架构-,其核心创新包括:

  1. 扩展位置编码:将最大位置从512扩展到8192,支持长文档处理

  2. MCLS策略:通过多个CLS token增强长文本建模能力,无需额外微调

  3. 三头输出:在一次前向传播中同时输出稠密向量、稀疏向量和多向量三种表示

2.2 MCLS:长文本处理的创新策略

针对长文本微调面临的数据不足和计算资源限制问题-14,BGE-M3提出了MCLS(Multiple CLS) 方法。

核心思想 :在输入序列中每隔固定数量的token(实验中为每256个token)插入一个[CLS] token。每个CLS token从其相邻token捕获语义信息,最终通过对所有CLS token的隐藏状态求平均来获得文本的最终嵌入表示-。

2.3 前向传播的数学表示

三、稠密检索(Dense Retrieval)的算法计算过程

3.1 核心思想

稠密检索将整段文本压缩为单个稠密向量 ,通过向量相似度判断文本间的相关性。BGE-M3使用特殊token [CLS] 的归一化隐藏状态作为稠密向量表示-7

3.2 向量生成

3.3 相似度计算

3.4 具体计算示例

假设查询文本为"如何学习Python ",文档文本为"Python是一门适合初学者的编程语言"。

Step 1:分别编码

经过Transformer编码和CLS提取,得到两个1024维的原始向量(数值仅为示意):

  • 查询原始向量:hcl(s,q)​=0.82,−0.15,0.37,0.51,−0.23,...

  • 文档原始向量:hcl(s,p​)=0.79,−0.13,0.35,0.48,−0.20,...

Step 2:L2归一化

计算各自的模长并进行归一化(假设归一化后):

  • 查询稠密向量:eq​=0.65,−0.12,0.29,0.40,−0.18,...

  • 文档稠密向量:ep​=0.63,−0.10,0.28,0.38,−0.16,...

Step 3:计算点积

sdense​=0.65×0.63+(−0.12)×(−0.10)+0.29×0.28+0.40×0.38+(−0.18)×(−0.16)+...

假设计算结果为 sdense​=0.87,表明两段文本在语义上高度相关。

四、稀疏检索(Sparse Retrieval)的算法计算过程

4.1 核心思想

稀疏检索生成一个高维稀疏向量 ,维度等于模型词表大小(BGE-M3词表约为250,002-20。向量中绝大多数位置的值为0,只有文本中出现的token对应的维度有非零权重-。BGE-M3通过神经网络学习权重,而非依赖BM25的统计公式。

4.2 Token级权重计算

BGE-M3在编码器输出之上添加了一个线性层ReLU激活函数来生成稀疏嵌入。

ReLU的作用:将所有负数置为0,这是向量"稀疏"的根本来源。正数表示该token与词表中某个词存在正相关关系,负数或零则被过滤掉。

4.3 最大池化聚合(Max Pooling)

4.4 相似度计算

4.5 具体计算示例

以文本"苹果公司发布了新款iPhone"为例。

Step 1:分词与编码

分词结果:["苹果", "公司", "发布", "了", "新款", "iPhone"]

经过Transformer编码后,每个token获得隐藏状态 ℎi​。

Step 2:线性变换与ReLU激活

假设词表大小简化为10(实际为250,002),每个token经过线性层+ReLU后生成10维的权重向量:

Token 词0 (苹果) 词1 (公司) 词2 (iPhone) 词3 (发布) 词4 (新款) 词5-9
苹果 2.1 0.0 0.8 0.0 0.0 0.0
公司 0.0 1.5 0.0 0.4 0.0 0.0
发布 0.0 0.0 0.0 1.2 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0
新款 0.0 0.0 0.0 0.0 0.9 0.0
iPhone 0.0 0.0 2.1 0.0 0.0 0.0

Step 3:最大池化聚合

对词表中每个词,取所有token中的最大值:

  • 词"苹果"(ID=0):max(2.1,0.0,0.0,0.0,0.0,0.0)=2.1

  • 词"公司"(ID=1):max(0.0,1.5,0.0,0.0,0.0,0.0)=1.5

  • 词"iPhone"(ID=2):max(0.8,0.0,0.0,0.0,0.0,2.1)=2.1

  • 词"发布"(ID=3):max(0.0,0.4,1.2,0.0,0.0,0.0)=1.2

  • 词"新款"(ID=4):max(0.0,0.0,0.0,0.0,0.9,0.0)=0.9

  • 其他词(ID=5-9):全部为0

Step 4:最终稀疏向量

以键值对字典形式表示:

python 复制代码
sparse_vec = {
    0: 2.1,   # "苹果"
    1: 1.5,   # "公司"
    2: 2.1,   # "iPhone"
    3: 1.2,   # "发布"
    4: 0.9    # "新款"
}

这个向量中绝大多数位置为0,只有少数位置有非零权重。

Step 5:相似度计算

假设查询为"苹果iPhone ",其稀疏向量为 {0: 1.8, 2: 2.0},则查询与文档的稀疏相似度为:

五、多向量检索(Multi-Vector / ColBERT风格)的算法计算过程

5.1 核心思想

多向量检索为文本中的每个token生成一个独立的向量 ,形成 N×d 的向量矩阵。这避免了传统稠密检索将整段文本压缩为单个向量带来的"信息瓶颈"问题。在计算相似度时,采用延迟交互(Late Interaction)MaxSim算法,实现token级别的精细匹配。

5.2 多向量生成

BGE-M3复用底层Transformer的参数,通过一个轻量级投影头将每个token的隐藏状态映射为独立的token向量:

5.3 晚期交互与MaxSim算法

5.4 具体计算示例

假设查询 q= ["cat", "dog"](2个token),文档 p= ["a", "cute", "cat"](3个token)。向量维度简化为4维。

Step 1:分别编码生成多向量矩阵

Token 维度0 维度1 维度2 维度3
cat (q₁) 0.9 0.1 0.3 0.2
dog (q₂) 0.2 0.8 0.1 0.4
Token 维度0 维度1 维度2 维度3
a (p₁) 0.1 0.2 0.8 0.1
cute (p₂) 0.3 0.4 0.2 0.7
cat (p₃) 0.8 0.1 0.3 0.2

Step 2:计算相似度矩阵(2×3)

相似度 p₁ ("a") p₂ ("cute") p₃ ("cat")
q₁ ("cat") 0.1×0.1+0.1×0.2+0.3×0.8+0.2×0.1 = 0.27 0.1×0.3+0.1×0.4+0.3×0.2+0.2×0.7 = 0.27 0.1×0.8+0.1×0.1+0.3×0.3+0.2×0.2 = 0.22
q₂ ("dog") 0.2×0.1+0.8×0.2+0.1×0.8+0.4×0.1 = 0.30 0.2×0.3+0.8×0.4+0.1×0.2+0.4×0.7 = 0.68 0.2×0.8+0.8×0.1+0.1×0.3+0.4×0.2 = 0.35

Step 3:应用MaxSim

  • 对于 q₁("cat"),最大相似度为 max(0.27,0.27,0.22)=0.27

  • 对于 q₂("dog"),最大相似度为 max(0.30,0.68,0.35)=0.68

Step 4:汇总得分

这个分数体现了查询中的每个词都在文档中找到了它最相关的匹配-25

六、三种检索方式的对比与总结

在实际评测中,采用三种方式联合检索的BGE-M3(ALL)在三项评测中全面领先,而BGE-M3(Dense)稠密检索在多语言、跨语言检索中具有明显优势。

七、训练方法与数据

7.1 训练数据

BGE-M3的训练数据来自三个来源:

1. 无监督数据(Unsupervised Data) :从Wikipedia、S2ORC、xP3、mC4和CC-News等多语言语料库中提取。通过提取丰富的语义结构(如标题-正文、标题-摘要等)来构建文本对。无监督数据规模达到1.2亿文本对 ,覆盖194种语言2655种跨语言对应关系

2. 微调数据(Fine-tuning Data) :来自标注语料库的高质量数据。英语数据集包括HotpotQA、TriviaQA、NQ、MS MARCO等;中文数据集包括DuReader、T2-Ranking、NLI-zh等。

3. 合成数据(Synthetic Data) :为解决长文档检索任务中数据不足的问题,从Wikipedia和MC4数据集中随机选择长文章,使用GPT-3.5生成问题,构成新的文本对。

7.2 训练流程

BGE-M3的训练分为多个阶段:

第一阶段:使用大量无监督数据对文本编码器进行预训练,其中仅训练稠密检索的基本形式。

第二阶段 :应用自知识蒸馏(Self-Knowledge Distillation) ,使用标注和合成数据对模型进行微调,建立三种检索功能。自知识蒸馏将不同检索功能的相关性分数整合为教师信号,以增强训练质量。基于集成学习原理,这些异构预测器可以组合成更强的预测器。

7.3 Efficient Batching策略

为了确保嵌入的区分性,BGE-M3优化了批处理策略:

  • 训练数据按序列长度分组进行预处理,显著减少序列填充

  • 通过梯度检查点(Gradient Checkpointing)和跨GPU广播进一步划分小批量

  • 在长度为8192时,启用split-batch可使batch size增长超过20倍

八、混合检索的实际应用

BGE-M3的多功能性为混合检索 提供了天然支持。官方推荐在RAG系统中使用 "混合检索 + 重排序" 的pipeline:

第一棒(粗筛) :使用计算高效的稠密检索或稀疏检索,从海量文档中快速召回Top-K个候选集。

第二棒(精排) :将Top-K候选文档送入多向量(ColBERT)模块进行细粒度的晚期交互重排序。

最终的综合相关性分数为:

由于多向量方法的计算成本较高,通常先用稠密或稀疏方法检索候选结果,再用多向量方法进行重排序-7

九、代码示例

使用FlagEmbedding库可以轻松调用BGE-M3的全部三种功能:

python 复制代码
from FlagEmbedding import BGEM3FlagModel

# 加载模型,GPU推理建议开启use_fp16
model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)

# 编码文本,同时返回三种向量
sentences = [
    "BGE M3 is an embedding model supporting dense retrieval, "
    "lexical matching and multi-vector interaction."
]
output = model.encode(
    sentences,
    return_dense=True,       # 稠密向量
    return_sparse=True,      # 稀疏向量(词汇权重)
    return_colbert_vecs=True # 多向量(ColBERT风格)
)

# 输出包含三种表示
print(output.keys())
# dict_keys(['dense_vecs', 'lexical_weights', 'colbert_vecs'])

# 访问稀疏向量(词汇权重)
sparse_weights = output['lexical_weights']
print(sparse_weights)
# 输出类似: {12345: 2.1, 67890: 1.5, ...}

十、总结

BGE-M3通过一次推理同时输出稠密向量、稀疏向量和多向量三种表示,实现了对语义理解、精确关键词匹配和细粒度交互的统一支持-。其核心创新可概括为:

  1. 多语言:支持100+种语言,在MIRACL和MKQA等基准上达到新的SOTA

  2. 多粒度:通过MCLS策略支持最长8192 token的输入

  3. 多功能:一站式集成稠密、稀疏、多向量三种检索方式

在算法层面,三种检索方式各有其数学原理和适用场景,通过混合检索可以充分发挥各自的优势。BGE-M3为RAG系统提供了一个真正意义上的通用语义向量模型底座,目前已向社区全面开源并支持免费商用许可。

相关推荐
Brilliantwxx1 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归2 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing3 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习3 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
thesky1234564 小时前
27届大模型面试准备(四十六):多模态生成式架构——扩散与自回归的统一
大模型·文生图·diffusion·扩散模型·dit·自回归生成·多模态生成
一只小小的芙厨4 小时前
基础数论总结
笔记·学习·算法
夜不会漫长5 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng6 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背6 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline