☰
《M3-Embedding》汇报
2026/10/29 10:25:40 网站建设 项目流程

1. 任务

本周任务是汇报《M3-Embedding》的思想。

2. 《M3-Embedding》

现有文本嵌入模型的不足:

(1)语言问题:文本有很多种语言,需要为每种语言都训练一共模型吗?

(2)功能问题:有时候是关键词搜索(例如:八段锦的好处),有时候是一句话(例如:对他人的期待是不是欲望?),需要同时部署关键词检索和语义检索两套系统吗?(在原心法系统里面是7:3的比例混合)

(3)长度问题:有时候只需要检索一句话,有时候需要检索一份很长的文档。

M3-Embedding特点:

(1)多语言:支持100多种语言的检索,甚至能跨语言检索(比如用中文问题找英文答案)。

(2)多功能:同时具备三种检索能力:

  • 密集检索:理解语义,解决“一句话提问”的问题。

    • 在M3模型里:它使用[CLS]这个特殊标记的隐藏状态来代表整个句子的“感觉”(嵌入向量)。

  • 稀疏检索:理解关键词权重,解决“关键词提问”的问题。

    • 在M3模型里:模型会为每个Token输出一个权重,然后计算共同Token的加权和。

  • 多向量检索:进行更精细的匹配,用于对候选结果进行重新精准排序。

    • 在M3模型里:它使用所有输出Token的嵌入,进行精细的“晚期交互”匹配。

(3)多粒度:能处理从短句到长达8192个token(约5000-6000汉字)的长文档。

技术点:

(1)自知识蒸馏 :(让三种检索方法相互学习和协同,而不是独立工作。)

训练流程:

①预训练阶段:无监督的对比学习

输入:Query(查询)、Answer(答案/文档)

训练数据:12亿 对无监督的多语言数据。

过程与方法:

模型(图中的M3)接收查询和答案。

在这个阶段,训练目标相对单纯,主要是通过对比学习来优化密集检索的分数。

模型学习让正样本(匹配的Query-Answer对)的dense score(密集分数) 更接近,而负样本的分数更远离。

②微调:有监督的对比学习和自知识蒸馏

输入:同样是Query和Answer。

训练数据:标注数据(包括英文、中文和其他多语言的监督数据)、合成数据(为解决长文档检索任务而专门生成的数据)

自知识蒸馏:

  • 多功能并行计算:对于同一个输入,模型会同时计算出三种不同的相关性分数:dense score(密集检索分数)、lex score(稀疏检索分数)、multi-vec score(多向量检索分数)
  • 生成“教师信号”:将这三个分数通过加权融合,得到一个更强大、更稳健的Inter score(综合分数)。这个综合分数扮演了“教师”的角色。
  • 知识蒸馏:模型在训练时,不仅要让每个单独的分数(dense,lex,multi-vec)去拟合真实的数据标签,还要让它们去拟合这个更优秀的“教师信号”(Inter score)。

模型的总损失函数由两部分组成:

  • InfoNCE损失:让每个单独方法的分数能够正确区分正样本和负样本(即让正样本的分数高于负样本)。
  • 蒸馏损失:让每个单独方法的分数分布(经过softmax转换)接近综合分数的分布(也经过softmax)。这通常使用KL散度来实现。

在使用阶段,可以指定使用一种方式,也可以综合使用。无论选择哪种,模型在训练中被“蒸馏”过了,因此每个单独的功能都比独立训练时更强。

(2)高效批处理:

训练长文档的常见做法:

为了最大化利用GPU,①截取:传统的训练方法通常通过将输入序列截断至模型最大长度来维持较大的批次规模,但这会导致模型无法学习长距离依赖关系,从而丧失对长文档的理解能力;②填充:对于一个批次里所有不够长的序列,在末尾(或开头)添加一种特殊的、无意义的[PAD]标记,直到它们都和这个批次里最长的序列一样长,GPU内存被大量无用的[PAD]占据。

M3做法:

①基于序列长度的动态分组批处理:

模型在训练前,先将训练数据按其token长度分组。(例如,0-500, 500-1000, ..., 7000-8192)。在训练过程中,是同组批处理,每个训练批次内的所有样本均从同一长度分组中抽取。GPU可以同时处理更多有意义的文本数据,而不是无用的填充符。

② 分批次编码与梯度检查点

对于处理超长序列(如8192 tokens)的批次,即使经过长度分组,其内存占用量依然可能超出单张GPU的容量。

为此,模型进一步将单个批次划分为若干个更小的子批次。(分批次编码)

在前向传播过程中,系统性地只保留子批次的输入和输出,而舍弃中间激活值。在反向传播时,根据需要重新计算这些中间结果。这种以计算时间换取内存空间的方法,使得在有限资源下处理极长序列成为可能。(梯度检查点)

③分布式环境下的嵌入广播

在分布式训练中,将所有GPU上计算出的文档嵌入向量进行广播共享。对于模型训练中的“对比学习”来说,这相当于为每个查询提供了海量的、来自全局的负样本(每个查询都能够以整个分布式批次中的所有其他文档作为负样本)。模型能更好地学会区分相关和不相关的文档,从而学得更精准、更强大。

(3)数据集

①无监督数据(构建通用语义空间基础):从维基百科、新闻、学术论文等海量文本中,自动挖掘出“标题-正文”、“指令-输出”等文本对。规模高达12亿对,覆盖194种语言。这是模型获得广博知识的基础。

②有监督数据:

  • 英语:集成MS MARCO、Natural Questions、HotpotQA等8个数据集,侧重于开放域问答与自然语言推理。

  • 中文:整合DuReader、T2-Ranking、LawGPT等7个数据集,覆盖通用与垂直领域(如法律、医疗)。

  • 其他语言:引入MIRACL和Mr. TyDi等基准的多语言训练数据。
    这些高质量的正负样本对直接指导模型学习复杂的语义匹配模式,是塑造其多功能(特别是密集检索和多向量检索)精准度的关键。

③合成数据:为了解决“长文档问答”数据少的问题,从Wikipedia、Wudao、mC4等语料中采样长文档,并随机选取其中的段落,利用大型语言模型(如GPT-3.5)根据段落内容自动生成相关问题。由此构成的(生成长文档,生成问题)配对,形成了一个名为MultiLongDoc的新数据集。该数据集直接为模型提供了长上下文与查询间的关系样本,是模型获得多粒度中长文档理解与检索能力的重要补充。

3.RetroMAE:一种面向检索任务的掩码自编码预训练新范式

BGE的训练过程分为两阶段,第一阶段是主要采用RetroMAE方法的预训练过程,第二阶段就是利用对比学习的微调过程,跟之前的方法不同之处在于,微调时会在检索任务中为query单独添加对应的instruction。具体的训练过程可以见https://huggingface.co/BAAI/bge-base-en。

RetroMAE方法,该方法出自于于EMNLP2022(Conference on Empirical Methods in Natural Language Processing,是自然语言处理(NLP)领域的顶级国际会议之一。)的文章(https://arxiv.org/pdf/2205.12035),是一种基于自动编码的方法,可以为检索模型提供了一个强力的初始化模型。

解决问题:传统的预训练模型(如BERT)专注于词元级任务,其句子级别的表示能力不足,直接用于密集检索效果受限,需要大量标注数据和复杂的微调策略,才能在检索任务上表现良好。

RetroMAE的解决方案:通过高难度重建逼迫编码器学习全局语义。

RetroMAE核心:三个关键设计:

  • 新颖MAE流程:对输入句子进行两次独立掩码,分别用于编码和解码。
  • 不对称结构:强大的全尺寸BERT编码器(12层,768隐藏维)+ 极简的单层Transformer解码器。
  • 不对称掩码:编码器轻度掩码(15% - 30%),解码器重度掩码(50% - 70%)。

效果:在多个权威检索基准(如BEIR、MS MARCO)上取得了领先的零样本和有监督检索性能,且方法简单,无需负采样或数据增强。

训练过程:

步骤:

(1)不对称双重掩码

编码器端轻度掩码,让编码器看到大部分完整信息,以便生成一个初步的、质量尚可的句子嵌入。(~X_enc)

解码器端重度掩码,极大增加重建任务的难度,使解码器严重依赖句子嵌入。(~X_dec)

(2)编码与解码

编码器处理~X_enc,输出句子嵌入h~X。

解码器:将句子嵌入h~X和 被重度掩码的~X_dec的嵌入序列进行拼接,输入给解码器。解码器根据这两个来预测被养马的位置原本是什么词。

解码器单靠重度掩码的~X_dec的嵌入序列很难推测出原本的句子是什么词,必须在h~X中找线索,如果h~X高质量的编码了一个包含全局语义的嵌入,那么解码器就可以推测出原来位置的词。

通过这种“高难度重建”任务,编码器被训练必须将尽可能多的全局、抽象语义注到h~X中,否则解码任务将失败。这直接优化了编码器生成句子嵌入的能力。

RetroMAE模型的预训练流程:

  1. Encoder(编码器)部分:

    • 输入句子是:"Norwegian forest cat is a breed of domestic cat originating in northern Europe"

    • 经过轻度掩码(Moderate Masking)后,得到编码器的输入:"[M] forest cat is a breed of [M] cat originating in [M] Europe"

      • 这里掩码了三个词:"Norwegian"、"domestic"、"northern"

    • 编码器是一个全尺寸的BERT模型,它处理这个被部分掩码的句子,并生成一个句子嵌入(Sentence Embedding)。这个句子嵌入是对整个句子语义的概括表示。

  2. Decoder(解码器)部分:

    • 同样的原始句子经过重度掩码(Aggressive Masking)后,得到解码器的输入:"[M] [M] cat is [M] [M] of domestic [M] [M] in northern [M]"

      • 这里掩码了更多的词,包括:"Norwegian"、"forest"、"a"、"breed"、"cat"、"originating"、"Europe"

    • 解码器是一个单层的Transformer,它的输入是编码器产生的句子嵌入和这个被重度掩码的句子。

  3. 重建目标:

    • 解码器的任务是基于句子嵌入和被重度掩码的输入,通过掩码语言模型(MLM)的方式重建出原始句子。

    • 图中显示,解码器成功重建了原始句子:"Norwegian forest cat is a breed of domestic cat originating in northern Europe"

核心思想:

  • 通过这种不对称的设计(编码器轻度掩码,解码器重度掩码),模型被迫在解码器只能看到少量词汇的情况下,依靠编码器产生的句子嵌入来重建整个句子。这就要求编码器必须生成高质量的句子嵌入,其中包含足够的信息来支持重建。

  • 这种训练方式使得编码器学习到的句子嵌入能够很好地捕捉句子的全局语义,从而有利于下游的检索任务。

注意:图中的“Mask (EN)”和“Mask (DE)”分别指编码器和解码器的掩码操作。EN和DE可能分别代表Encoder和Decoder。

通过这种设计,编码器学会将整个句子的语义信息压缩到句子嵌入中,这正是密集检索任务需要的核心能力——生成能够准确反映语义的向量表示。

技术增强:增强解码

传统的MLM只计算15%掩码位置的损失,数据利用效率低下。RetroMAE的增强解码解决了这个问题。

  • 核心思想:为序列中的每一个词元(包括非掩码词元)都创建一个重建任务,并且每个词元重建时使用的上下文都略有不同。

  • 技术实现:

    1. 双流输入:

      • 查询流(H1):一串相同的句子嵌入h~X,每个位置加上了不同的位置编码。[h~X+p0, h~X+p1, ..., h~X+pN]。用于作为重建每个词元的“提问者”。

      • 上下文流(H2):完整的令牌嵌入序列(包括所有未被掩码的原始词)。[h~X, e_The, e_rapid, ..., e_society]。作为重建时可参考的“知识库”。

    2. 位置特定的注意力掩码(M):

      • 这是一个预先定义好的矩阵,控制着在重建第i个词元时,能“看到”哪些位置的上下文。

      • 规则:重建x_i时,除了不能看自己(x_i的位置),可以从上下文流中随机采样一部分其他位置的词元作为上下文。

      • 例子:在重建第1个词"The"时,注意力掩码可能允许它看到{h~X, rapid, intelligence, transforming}。而在重建第3个词"development"时,掩码可能允许它看到{h~X, The, artificial, society}。

  • 效果:

    • 100%数据利用率:我们为句子里的每一个词(包括标点)都进行了一次重建,并计算了损失。而基础解码只重建被掩码的50%的词。

    • 上下文多样化:每个词元都在一个略微不同的“视角”下被重建,这迫使句子嵌入h~X必须是一个信息高度密集且鲁棒的表示,能够应对各种不同的“查询”。

训练过程:

RetroMAE预训练工作流的三个核心阶段,展示了从编码到增强解码的完整过程:

(A)编码

(B)解码(基础版)

(C)增强解码:

例子:假设我们的句子是:[x1, x2, x3, x4]="猫 喜欢 鱼 。"

(1)H1(查询流):[h_X+p0, h_X+p1, h_X+p2, h_X+p3, h_X+p4]

  • 这里全是h_X,但每个都加了一个独特的位置编码(p0, p1...)。

  • 可以理解为:h_X带着5个不同的问题来了:

    • h_X+p0: “第一个位置应该是什么词?”

    • h_X+p1: “第二个位置应该是什么词?”

H2(上下文流):[h_X, e_猫, e_喜欢, e_鱼, e_。]

  • h_X: 编码器生成的句子嵌入(“中心思想”,比如“这是一个关于猫的喜好的陈述”)

  • e_猫,e_喜欢...:每个词原本的嵌入向量(没有被掩码)

(2)生成掩码矩阵M:规定了在回答某个问题时,能看哪些部分。

(假设)规则:在重建第i个词时,除了不看自己,随机其他的词。

  • 第一行(猜“猫”):h_X+p0被允许查阅h_X、“喜欢”(第2个词。但它不能看“猫”(自己)和“鱼”还有“。”。

  • 第二行(猜“喜欢”):h_X+p1被允许查阅h_X、“猫”和“鱼”。不能看“喜欢”和“。”。

  • 主对角线永远是灰色:因为永远不能看自己。

(3)单层Transformer解码器开始工作,它拿着规则表,开始逐个位置进行推理。

①重建第一个词 (x1="猫")

  • 答题卡:h_X+p0(问:第一个词是?)

  • 允许看的线索:h_X(中心思想) +e_喜欢(第二个词)

  • 推理过程:

    • h_X:中心思想是“猫的喜好”。

    • e_喜欢:后面跟着一个表示“喜好”的词。

    • 综合判断:在“喜好”前面,最可能的主语是“猫”。输出:预测“猫”的概率最高。

  • 计算损失:比较预测结果和真实的“猫”,算出损失1。

②重建第二个词 (x2="喜欢")

  • 答题卡:h_X+p1(问:第二个词是?)

  • 允许看的线索:h_X(中心思想) +e_猫(第一个词) +e_鱼(第三个词)

  • 推理过程:

    • h_X:中心思想是“猫的喜好”。

    • e_猫:前面是“猫”。

    • e_鱼:后面是“鱼”。

    • 综合判断:连接“猫”和“鱼”,表达“喜好”关系的词,最可能是“喜欢”。输出:预测“喜欢”。

  • 计算损失:比较预测结果和真实的“喜欢”,算出损失2。

......

就按这样的过程把所有词都重构出来。

总体工作流程:

4. 小结

关于M3之前的其他模型,还是专注于密集检索和单语言。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询