文献分享:BGE-M3——打通三种方式的嵌入模型

文章目录

  • [1. \textbf{1. } 1. 背景与导论](#1. \textbf{1. } 1. 背景与导论)
    • [1.1. \textbf{1.1. } 1.1. 研究背景](#1.1. \textbf{1.1. } 1.1. 研究背景)
    • [1.2. \textbf{1.2. } 1.2. 本文的研究](#1.2. \textbf{1.2. } 1.2. 本文的研究)
    • [1.3. \textbf{1.3. } 1.3. 有关工作](#1.3. \textbf{1.3. } 1.3. 有关工作)
  • [2. M3-Embedding \textbf{2. M3-Embedding} 2. M3-Embedding](#2. M3-Embedding \textbf{2. M3-Embedding} 2. M3-Embedding)
    • [2.1. \textbf{2.1. } 2.1. 模型核心: 混合检索方式](#2.1. \textbf{2.1. } 2.1. 模型核心: 混合检索方式)
      • [2.1.1. \textbf{2.1.1. } 2.1.1. 三种不同的检索方式](#2.1.1. \textbf{2.1.1. } 2.1.1. 三种不同的检索方式)
        • [2.1.1.1. \textbf{2.1.1.1. } 2.1.1.1. 稠密检索](#2.1.1.1. \textbf{2.1.1.1. } 2.1.1.1. 稠密检索)
        • [2.1.1.2. \textbf{2.1.1.2. } 2.1.1.2. 词汇(稀疏)检索](#2.1.1.2. \textbf{2.1.1.2. } 2.1.1.2. 词汇(稀疏)检索)
        • [2.1.1.3. \textbf{2.1.1.3. } 2.1.1.3. 多向量检索](#2.1.1.3. \textbf{2.1.1.3. } 2.1.1.3. 多向量检索)
      • [2.1.1. \textbf{2.1.1. } 2.1.1. 三种检索方式的整合](#2.1.1. \textbf{2.1.1. } 2.1.1. 三种检索方式的整合)
    • [2.2. \textbf{2.2. } 2.2. 模型训练: 一种新的自蒸馏框架](#2.2. \textbf{2.2. } 2.2. 模型训练: 一种新的自蒸馏框架)
      • [2.2.1. \textbf{2.2.1. } 2.2.1. 训练数据: 多样化的数据策划](#2.2.1. \textbf{2.2.1. } 2.2.1. 训练数据: 多样化的数据策划)
      • [2.3.1. \textbf{2.3.1. } 2.3.1. 损失函数: L final ← L + L ′ 2 \boldsymbol{\mathcal{L}{\textbf {final}} \textbf{←} \cfrac{\mathcal{L}+\mathcal{L}^{\prime}}{2}} Lfinal←2L+L′](#2.3.1. \textbf{2.3.1. } 2.3.1. 损失函数: L final ← L + L ′ 2 \boldsymbol{\mathcal{L}{\textbf {final}} \textbf{←} \cfrac{\mathcal{L}+\mathcal{L}^{\prime}}{2}} Lfinal←2L+L′)
      • [2.3.2. \textbf{2.3.2. } 2.3.2. 训练流程: 自我蒸馏的优化](#2.3.2. \textbf{2.3.2. } 2.3.2. 训练流程: 自我蒸馏的优化)
    • [2.4. \textbf{2.4. } 2.4. 训练优化: 高效批处理](#2.4. \textbf{2.4. } 2.4. 训练优化: 高效批处理)
  • [3. \textbf{3. } 3. 实验验证](#3. \textbf{3. } 3. 实验验证)
    • [3.1. \textbf{3.1. } 3.1. 实验设置](#3.1. \textbf{3.1. } 3.1. 实验设置)
    • [3.2. \textbf{3.2. } 3.2. 实验结果](#3.2. \textbf{3.2. } 3.2. 实验结果)
      • [3.2.1. \textbf{3.2.1. } 3.2.1. 在不同任务上](#3.2.1. \textbf{3.2.1. } 3.2.1. 在不同任务上)
      • [3.2.2. \textbf{3.2.2. } 3.2.2. 消融实验](#3.2.2. \textbf{3.2.2. } 3.2.2. 消融实验)

原文章: BGE M3-Embedding \text{BGE M3-Embedding} BGE M3-Embedding

1. \textbf{1. } 1. 背景与导论

1.1. \textbf{1.1. } 1.1. 研究背景

1️⃣嵌入与检索

  1. 嵌入模型:一种深度学习模型,将文本转化为向量,以捕捉文本的意义信息

  2. 检索方法:密集 / \mathcal{/} /多向量 / \mathcal{/} /稀疏(词汇)

    模型 嵌入方式 相似度计算 模型实例
    密集检索 整一段编码为单个段落级稠密向量 两个向量间的点积计算 BERT \text{BERT} BERT
    多向量检索 整一段编码为多个词汇级稠密向量 两组向量间的复杂交互 ColBERT \text{ColBERT} ColBERT
    稀疏检索 整一段中词的重要性分布(词项权重) 词匹配得分 BM25 \text{BM25} BM25

2️⃣当前嵌入模型的局限:通用性不足

局限 描述
语言局限性 大多数模型针对英语开发,在其他语言上表现差
功能单一性 嵌入模型只针对单一检索功能训练
无法处理长文本 大多数模型只能处理短文本输入,缘于训练长文档检索器成本太高

1.2. \textbf{1.2. } 1.2. 本文的研究

1️⃣ M3-Embedding \text{M3-Embedding} M3-Embedding的功能:克服通用性不足的问题

功能 描述
多语言 支持 100 \text{100} 100多种语言,学习不同语言的共同语义空间,支持语言内 / / /跨语言的检索
多功能 能生成三种不同类型的嵌入,以同时支持密集检索 / \mathcal{/} /稀疏检索 / \mathcal{/} /多向量检索
多颗粒度 处理不同长度的输入,从细颗粒度的短输入 → \text{→} →最长 8192 \text{8192} 8192个 Token \text{Token} Token

2️⃣ M3-Embedding \text{M3-Embedding} M3-Embedding的训练:如何整合三种嵌入方式的不同训练目标

  1. 高效的数据策划:
    • 数据源:无监督数据 / / /监督数据 / / /合成数据
    • 目的:互为补充,应用在不同训练阶段
  2. 一种新的自我蒸馏框架:
    • 结构:<CLS>结构嵌入 → 用于 \xrightarrow{用于} 用于 密集检索,其它 Token \text{Token} Token嵌入 → 用于 \xrightarrow{用于} 用于 稀疏检索和多向量检索
    • 原理:整合不同检索功能产生的相关性分数为教师信号 → 知识蒸馏 \xrightarrow{知识蒸馏} 知识蒸馏 反馈给模型自己,不断增强循环
  3. 优化了批处理策略:实现大批量 + \text{+} +高吞吐的训练,以提高嵌入模型的区分能力

1.3. \textbf{1.3. } 1.3. 有关工作

1️⃣一般的文本嵌入

  1. 文本嵌入的进展:预训练模型(有效编码将数据的潜在语义),对比学习(负采样和知识蒸馏的运用)
  2. 文本嵌入的趋势:多功能的嵌入模型(统一支持多种场景),如 E5/BGE/SGPT/Contriever... \text{E5/BGE/SGPT/Contriever... } E5/BGE/SGPT/Contriever...

2️⃣ IR \text{IR} IR的文本嵌入:密集检索 / \mathcal{/} /多向量检索 / \mathcal{/} /稀疏(词汇)检索

3️⃣多语言的文本嵌入:

  1. 实现多文本嵌入:

    方向(思路) 模型
    多语言数据集 MIRACL/mMARCO/MKQA \text{MIRACL/mMARCO/MKQA} MIRACL/mMARCO/MKQA
    多语言编码器(预训练 ) mBERT/mT5/XLM-R \text{mBERT/mT5/XLM-R} mBERT/mT5/XLM-R
    多语言嵌入模型(微调后 ) mDPR/mContriever/mE5 \text{mDPR/mContriever/mE5} mDPR/mContriever/mE5
  2. 当前的挑战:其他语种与英语的固有差距,其它语种语料库稀少

2. M3-Embedding \textbf{2. M3-Embedding} 2. M3-Embedding

2.1. \textbf{2.1. } 2.1. 模型核心: 混合检索方式

2.1.1. \textbf{2.1.1. } 2.1.1. 三种不同的检索方式

2.1.1.1. \textbf{2.1.1.1. } 2.1.1.1. 稠密检索

1️⃣分词:保留<cls>标记

  1. 查询: q = q\text{=} q=<q-cls> <q-Token-1> <q-Token-2> ....
  2. 文档: p = p\text{=} p=<p-cls> <p-Token-1> <p-Token-2> ....

2️⃣嵌入:词级嵌入,但重点关注 H [ 0 ] \mathbf{H}_{\mathbf{}}[0] H[0]

  1. 查询: q → Encoder H q q\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}} qEncoder Hq,其中<q-cls> → Encoder H q [ 0 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}}[0] Encoder Hq[0],<q-Token-1> → Encoder H q [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{q}}[1] Encoder Hq[1] ...
  2. 文档: p → Encoder H p p\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}} pEncoder Hp,其中<p-cls> → Encoder H p [ 0 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}}[0] Encoder Hp[0],<p-Token-1> → Encoder H p [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{p}}[1] Encoder Hp[1] ...

3️⃣归一化:为方便计算内积

  1. 查询:<q-cls> → Norm Encoder norm ( H q [ 0 ] ) \xrightarrow[\text{Norm}]{\text{Encoder}}\text{norm}\left(\mathbf{H}_q[0]\right) Encoder Normnorm(Hq[0]),作为 q q q的最终嵌入表示
  2. 文档:<p-cls> → Norm Encoder norm ( H p [ 0 ] ) \xrightarrow[\text{Norm}]{\text{Encoder}}\text{norm}\left(\mathbf{H}_p[0]\right) Encoder Normnorm(Hp[0]),作为 p p p的最终嵌入表示

4️⃣相似度: s dense ← 内积 ⟨ e p , e q ⟩ s_{\text{dense}} \xleftarrow{内积} \langle e_p, e_q \rangle sdense内积 ⟨ep,eq⟩

2.1.1.2. \textbf{2.1.1.2. } 2.1.1.2. 词汇(稀疏)检索

1️⃣分词:可以不保留<cls>标记

  1. 查询: q = q\text{=} q=<q-Token-1> <q-Token-2> <q-Token-3> ....
  2. 文档: p = p\text{=} p=<p-Token-1> <p-Token-2> <q-Token-3> ....

2️⃣嵌入:词级嵌入

  1. 查询: q → Encoder H q q\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}} qEncoder Hq,其中<q-Token-1> → Encoder H q [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}}[1] Encoder Hq[1],<q-Token-2> → Encoder H q [ 2 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{q}}[2] Encoder Hq[2]...
  2. 文档: p → Encoder H p p\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}} pEncoder Hp,其中<p-Token-1> → Encoder H p [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}}[1] Encoder Hp[1],<q-Token-2> → Encoder H q [ 2 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{q}}[2] Encoder Hq[2]...

3️⃣权值:将所有嵌入映射为 W l e x T H q [ i ] \mathbf{W}_{\mathrm{lex}}^T \mathbf{H}_q[i] WlexTHq[i]标量,注意 Token \text{Token} Token相同时取权值最大值

  1. 查询:<q-Token-i> → Encoder H q [ i ] → ReLU激活函数 W lex 权重矩阵 w q i =ReLU ( W l e x T H q [ i ] ) \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}}[i]\xrightarrow[\text{ReLU}激活函数]{\mathbf{W}{\text{lex}}权重矩阵}w_{q_i}\text{=}\text{ReLU}\left(\mathbf{W}_{\mathrm{lex}}^T \mathbf{H}_q[i]\right) Encoder Hq[i]Wlex权重矩阵 ReLU激活函数wqi=ReLU(WlexTHq[i])
  2. 文档:<p-Token-i> → Encoder H p [ i ] → ReLU激活函数 W lex 权重矩阵 w p i =ReLU ( W l e x T H p [ i ] ) \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}}[i]\xrightarrow[\text{ReLU}激活函数]{\mathbf{W}{\text{lex}}权重矩阵}w_{p_i}\text{=}\text{ReLU}\left(\mathbf{W}_{\mathrm{lex}}^T \mathbf{H}_p[i]\right) Encoder Hp[i]Wlex权重矩阵 ReLU激活函数wpi=ReLU(WlexTHp[i])

4️⃣得分:先过滤得查询 q / p q/p q/p共同 Token \text{Token} Token,再将相同 Token \text{Token} Token的权值相乘相加 s lex ← ∑ t ∈ q ∩ p ( w q t × w p t ) \displaystyle{}s_{\text {lex}} \text{←} \sum_{t \in q \cap p}\left(w_{q_t} \text{×} w_{p_t}\right) slex←t∈q∩p∑(wqt×wpt)

2.1.1.3. \textbf{2.1.1.3. } 2.1.1.3. 多向量检索

1️⃣分词:可以不保留<cls>标记

  1. 查询: q = q\text{=} q=<q-Token-1> <q-Token-2> <q-Token-3> ....
  2. 文档: p = p\text{=} p=<p-Token-1> <p-Token-2> <q-Token-3> ....

2️⃣嵌入:词级嵌入

  1. 查询: q → Encoder H q q\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}} qEncoder Hq,其中<q-Token-1> → Encoder H q [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}}[1] Encoder Hq[1],<q-Token-2> → Encoder H q [ 2 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{q}}[2] Encoder Hq[2]...
  2. 文档: p → Encoder H p p\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}} pEncoder Hp,其中<p-Token-1> → Encoder H p [ 1 ] \xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}}[1] Encoder Hp[1],<q-Token-2> → Encoder H q [ 2 ] \xrightarrow{\text{Encoder}}\mathbf{H}_{\mathbf{q}}[2] Encoder Hq[2]...

3️⃣嵌入后:投影到权值 + \text{+} +归一化

  1. 查询: q → Encoder H q → 权重 W m u l T ( W m u l T H q ) → 归一化 norm ( W m u l T H q ) q\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{q}}\xrightarrow{权重\mathbf{W}{\mathrm{mul}}^T}\left(\mathbf{W}_{\mathrm{mul}}^T \mathbf{H}q\right)\xrightarrow{归一化}\text{norm}\left(\mathbf{W}{\mathrm{mul}}^T \mathbf{H}_q\right) qEncoder Hq权重WmulT (WmulTHq)归一化 norm(WmulTHq)
  2. 文档: p → Encoder H p → 权重 W m u l T ( W m u l T H p ) → 归一化 norm ( W m u l T H p ) p\xrightarrow{\text{Encoder}}\mathbf{H}{\mathbf{p}}\xrightarrow{权重\mathbf{W}{\mathrm{mul}}^T}\left(\mathbf{W}_{\mathrm{mul}}^T \mathbf{H}p\right)\xrightarrow{归一化}\text{norm}\left(\mathbf{W}{\mathrm{mul}}^T \mathbf{H}_p\right) pEncoder Hp权重WmulT (WmulTHp)归一化 norm(WmulTHp)

4️⃣得分:就是 ColBERT \text{ColBERT} ColBERT的后期交互, s m u l ← 1 N ∑ i = 1 N max ⁡ j = 1 M { E q [ i ] × E p T [ j ] } \displaystyle{}s_{m u l} \text{ ←} \frac{1}{N} \sum_{i=1}^N \max _{j=1}^M \left\{E_q[i] \text{×} E_p^T[j]\right\} smul ←N1i=1∑Nj=1maxM{Eq[i]×EpT[j]}

2.1.1. \textbf{2.1.1. } 2.1.1. 三种检索方式的整合

1️⃣集成方法

  1. 分立:用三种不同的方法,分别单独就行检索,得到三个检索结果 s dense / s lex / s mul s_{\text {dense}}/s_{\text {lex}}/s_{\text {mul}} sdense/slex/smul
  2. 整合:最终得分 s rank ← w 1 s dense + w 2 s lex + w 3 s mul s_{\text {rank}} \leftarrow w_1 s_{\text {dense}}\text{+}w_2 s_{\text {lex}}\text{+}w_3 s_{\text {mul}} srank←w1sdense+w2slex+w3smul,三个系数由不同下游场景确定

2️⃣集成表示: d y ← f n ∗ ( q x , D y ) d^y \leftarrow \mathrm{fn}^*\left(q^x, D^y\right) dy←fn∗(qx,Dy)

参数 含义
q x q^x qx 由语言 x x x给出的查询 q q q
D y D^y Dy 由语言 y y y组成的语料库 D D D
fn ∗ \text{fn}^* fn∗ 可以是密集检索 / / /词汇检索 / / /多向量检索中的任何一种函数,或者组合
d y d^y dy 由语言 x x x给出的查询 q q q,在由语言 y y y组成的语料库 D D D中,采取 fn ∗ \text{fn}^* fn∗方式检索,所得的结果

2.2. \textbf{2.2. } 2.2. 模型训练: 一种新的自蒸馏框架

2.2.1. \textbf{2.2.1. } 2.2.1. 训练数据: 多样化的数据策划

1️⃣大规模预训练数据:源于无标签语料库的无监督数据,一般为简单清洗后的"标题-正文"结构文本

  1. 普通的:维基百科 /S2ORC/xP3/mC4/CC-News/MTP \text{/S2ORC/xP3/mC4/CC-News/MTP} /S2ORC/xP3/mC4/CC-News/MTP
  2. 特殊的:翻译数据集的平行句子 NLLB/CCMatrix \text{NLLB/CCMatrix} NLLB/CCMatrix,用于学习跨语言的统一嵌入

2️⃣中规模微调数据:源于有标签语料库的监督数据

语种 来源
英文 HotpotQA/TriviaQA/NQ/MS MARCO.... \text{HotpotQA/TriviaQA/NQ/MS MARCO.... } HotpotQA/TriviaQA/NQ/MS MARCO....
中文 DuReader/mMARCO-ZH/T2-Ranking/CMedQAv2.... \text{DuReader/mMARCO-ZH/T2-Ranking/CMedQAv2.... } DuReader/mMARCO-ZH/T2-Ranking/CMedQAv2....
其它 Mr. TyDi/MIRACL \text{Mr. TyDi/MIRACL} Mr. TyDi/MIRACL

3️⃣小规模合成数据:本文额外生成的数据集,称之为 MultiLongDoc \text{MultiLongDoc} MultiLongDoc

  1. 来源:抽取长篇文章的随机段落 → \text{→} →用 ChatGPT \text{ChatGPT} ChatGPT生成段落的对应问题 → \text{→} →将二者整合成文本对
  2. 目的:缓解长文档检索任务的不足

2.3.1. \textbf{2.3.1. } 2.3.1. 损失函数: L final ← L + L ′ 2 \boldsymbol{\mathcal{L}_{\textbf {final}} \textbf{←} \cfrac{\mathcal{L}+\mathcal{L}^{\prime}}{2}} Lfinal←2L+L′

1️⃣基础损失函数 L \mathcal{L} L:基于集成学习原理,直接将不同模型的预测结果加权合并

  1. 原始损失: InfoNCE \text{InfoNCE} InfoNCE损失函数 L s ( ⋅ ) = − log ⁡ exp ⁡ ( s ( q , p ∗ ) τ ) ∑ p ∈ { p ∗ , P ′ } exp ⁡ ( s ( q , p ) τ ) \mathcal{L}{s(\cdot)}=-\log \cfrac{\exp (\cfrac{s(q, p^*)}{\tau})}{\displaystyle{}\sum{p \in\{p^*, P^{\prime}\}} \exp (\cfrac{s(q, p)}{\tau})} Ls(⋅)=−logp∈{p∗,P′}∑exp(τs(q,p))exp(τs(q,p∗))

    参数 含义
    p ∗ p^* p∗ 查询 q q q的正样本,即与查询最相关的段落或文档
    P ′ P' P′ 查询 q q q的负样本,包含与查询不相关的段落或文档
    s ( q , p ) s(q, p) s(q,p)和 s ( ⋅ ) s(\cdot) s(⋅) 查询 q q q和段落 p p p之间的相似度得分,可以通过 s dense / s lex / s mul s_{\text{dense}}/s_{\text{lex}}/s_{\text{mul}} sdense/slex/smul任一个得到
    τ \tau τ 温度参数,控制得分的平滑度
  2. L \mathcal{L} L的构成:

    • 得分的线性加权: s inter ← w 1 s dense + w 2 s lex + w 3 s mul s_{\text {inter}} \leftarrow w_1 s_{\text {dense}}\text{+}w_2 s_{\text {lex}}\text{+}w_3 s_{\text {mul}} sinter←w1sdense+w2slex+w3smul
    • 损失的线性加权: L ← λ 1 L dense + λ 2 L lex + λ 3 L mul + L inter 4 \mathcal{L} \leftarrow \cfrac{\lambda_1 \mathcal{L}{\text {dense}}\text{+}\lambda_2 \mathcal{L}{\text {lex}}\text{+}\lambda_3 \mathcal{L}{\text {mul}}\text{+}\mathcal{L}{\text {inter}}}{4} L←4λ1Ldense+λ2Llex+λ3Lmul+Linter
  3. 一些思考:

    • 问题:不同检索方法的训练目标相互冲突 ,对 L dense / L lex / L mul \mathcal{L}{\text {dense}}/\mathcal{L}{\text {lex}}/\mathcal{L}_{\text {mul}} Ldense/Llex/Lmul分别优化再加和行不通
    • 解决:通过对 s inter s_{\text{inter}} sinter进行蒸馏,以统一优化目标

2️⃣蒸馏损失 L ′ \mathcal{L}^{\prime} L′:基于自蒸馏的框架

  1. 原始损失:一种改进的交叉熵

    损失 损失公式
    L dense ′ \mathcal{L}_{\text{dense}}^{\prime} Ldense′ − ( Softmax ( s inter ) ) × log ⁡ ( Softmax ( s dense ) ) -\left(\text{Softmax}\left(s_{\text{inter}}\right)\right) \text{×} \log \left(\text{Softmax}\left(s_{\text{dense}}\right)\right) −(Softmax(sinter))×log(Softmax(sdense))
    L lex ′ \mathcal{L}_{\text{lex}}^{\prime} Llex′ − ( Softmax ( s inter ) ) × log ⁡ ( Softmax ( s lex ) ) -\left(\text{Softmax}\left(s_{\text{inter}}\right)\right) \text{×} \log \left(\text{Softmax}\left(s_{\text{lex}}\right)\right) −(Softmax(sinter))×log(Softmax(slex))
    L mul ′ \mathcal{L}_{\text{mul}}^{\prime} Lmul′ − ( Softmax ( s inter ) ) × log ⁡ ( Softmax ( s mul ) ) -\left(\text{Softmax}\left(s_{\text{inter}}\right)\right) \text{×} \log \left(\text{Softmax}\left(s_{\text{mul}}\right)\right) −(Softmax(sinter))×log(Softmax(smul))
  2. 蒸馏框架:将综合得分 s inter s_{\text{inter}} sinter作为教师模型,每种方法的得分 s dense / s lex / s mul \mathcal{s}{\text {dense}}/\mathcal{s}{\text {lex}}/\mathcal{s}_{\text {mul}} sdense/slex/smul作为学生模型

  3. L ′ \mathcal{L}^{\prime} L′的构成: L ′ ← λ 1 ⋅ L dense ′ + λ 2 ⋅ L lex ′ + λ 3 ⋅ L mul ′ 3 \mathcal{L}^{\prime} \leftarrow \cfrac{\lambda_1 \cdot \mathcal{L}{\text {dense}}^{\prime}\text{+}\lambda_2 \cdot \mathcal{L}{\text {lex}}^{\prime}\text{+}\lambda_3 \cdot \mathcal{L}_{\text {mul}}^{\prime}}{3} L′←3λ1⋅Ldense′+λ2⋅Llex′+λ3⋅Lmul′

2.3.2. \textbf{2.3.2. } 2.3.2. 训练流程: 自我蒸馏的优化

1️⃣第一阶段:无监督的预训练,让嵌入模型具备基本智能

  1. 预训练数据:收集的非监督数据
  2. 预训练模型:用 RetroMAE \text{RetroMAE} RetroMAE方法调整过的 XLM-RoBERTa \text{XLM-RoBERTa} XLM-RoBERTa模型
  3. 预训练流程:反复执行稠密检索 → \text{→} →根据检索结果通过对比学习调整参数,不断重复这一过程
    • 稠密检索:即预训练任务,在此处还不涉及其它检索方法
    • 对比学习:即预训练策略,通过区分正负样本对的相似度,学习嵌入的表示方法

2️⃣第二阶段:使用自知识蒸馏进行微调,嵌入模型被微调以建立三种检索功能

  1. 权重参数: w 1 = 1 , w 2 = 0.3 , w 3 = 1 , λ 1 = 1 , λ 2 = 0.1 , λ 3 = 1 w_1=1, w_2=0.3, w_3=1, \lambda_1=1, \lambda_2=0.1, \lambda_3=1 w1=1,w2=0.3,w3=1,λ1=1,λ2=0.1,λ3=1
    • 由于 W lex \mathbf{W}{\text{lex}} Wlex是随机初始化的,所以一开始 s lex s{\text{lex}} slex准确率很低,故有意降低其权重
  2. 微调数据:收集的标注数据 + \text{+} +合成数据
  3. 微调策略: ANCE \text{ANCE} ANCE方法,即通过 ANN \text{ANN} ANN加速寻找正负样本对

2.4. \textbf{2.4. } 2.4. 训练优化: 高效批处理

1️⃣所面临的问题

  1. 一般模型的训练:一方面保持批足够大(含足够多批内负样本),另一方面对太长的输入直接截断
  2. BGE-M3 \text{BGE-M3} BGE-M3的训练:万万不可直接截断长输入,不然就丧失队长序列的学习能力

2️⃣解决方法:优化的批处理

  1. 分组:训练数据按序列长度分到不同小组(如图中 128/1024/4096... \text{128/1024/4096...} 128/1024/4096...)

  2. 采样:训练实例从同一组 中抽取一部分作为训练的 Batch \text{Batch} Batch进入 GPU \text{GPU} GPU,这一过程有如下两种优化

    • 负载平衡:不同 GPU \text{GPU} GPU采样数据时都保持固定随机种子,使得抽到每批数据(句子)长短分布一致

      txt 复制代码
      👉不固定随机种子:
         GPU1: 可能随机抽到很多长序列 -> 负载重(计算慢) -> 执行计算
         GPU2: 可能随机抽到很多短序列 -> 负载重(计算慢) -> 空闲等待
    • 填充优化:一批数据进入到 GPU \text{GPU} GPU仍需填充至最长,但由于分组 + + +平衡策略,实际填充数很低

  3. 拆分:对序列长度较长的 Batch \text{Batch} Batch(如图中右边的 4096/8192... \text{4096/8192...} 4096/8192...),再分割成子批

    • 流程(附录 B.3 \text{B.3} B.3):启用梯度检查点 → \text{→} →分子批 → \text{→} →逐个处理子批得到嵌入 → \text{→} →合并得到原始批的嵌入
  4. 广播: GPU \text{GPU} GPU会将自己的嵌入结果广播给其它 GPU \text{GPU} GPU,以扩大批内负样本

    txt 复制代码
    广播前: 
      GPU1处理: [A1, A2, A3]
      GPU2处理: [B1, B2, B3]
    广播后:
      GPU1获得: [A1, A2, A3, B1, B2, B3]
      GPU2获得: [A1, A2, A3, B1, B2, B3]

3. \textbf{3. } 3. 实验验证

3.1. \textbf{3.1. } 3.1. 实验设置

1️⃣实验配置

  1. 数据集: MIRACL \text{MIRACL} MIRACL(包含 18 \text{18} 18种语言)
  2. 评估指标: nDCG@10 \text{nDCG@10} nDCG@10,其越高表明相关文档被排到了越靠前的位置

2️⃣检索实现

  1. 单独的:

    检索方式 目的 索引构建 检索任务
    Dense \text{Dense} Dense 生成语料库嵌入 Faiss \text{Faiss} Faiss库 检索 Top-1000 \text{Top-1000} Top-1000
    Sparse \text{Sparse} Sparse 生成语料库权重 Lucene \text{Lucene} Lucene 检索 Top-1000 \text{Top-1000} Top-1000
  2. 整合的:

    检索方式 检索内容 重排依据(任务 1&2 \textbf{1\&2} 1&2) 重排依据(任务 3 \textbf{3} 3)
    D+S \text{D+S} D+S 并合各自 Top-1000 \text{Top-1000} Top-1000 s dense + 0.3 s lex s_{\text {dense}}\text{+}0.3s_{\text {lex}} sdense+0.3slex 0.2 s dense + 0.8 s lex 0.2s_{\text {dense}}\text{+}0.8s_{\text {lex}} 0.2sdense+0.8slex
    Multi-vec \text{Multi-vec} Multi-vec Dense \text{Dense} Dense的 Top-200 \text{Top-200} Top-200 s mul s_{\text {mul}} smul s mul s_{\text {mul}} smul
    All \text{All} All Dense \text{Dense} Dense的 Top-200 \text{Top-200} Top-200 s dense + 0.3 s lex + s mul s_{\text {dense}}\text{+}0.3 s_{\text {lex}}\text{+}s_{\text {mul}} sdense+0.3slex+smul 0.15 s dense + 0.5 s lex + 0.35 s mul 0.15s_{\text {dense}}\text{+}0.5 s_{\text {lex}}\text{+}0.35s_{\text {mul}} 0.15sdense+0.5slex+0.35smul

3.2. \textbf{3.2. } 3.2. 实验结果

3.2.1. \textbf{3.2.1. } 3.2.1. 在不同任务上

1️⃣任务 1 1 1:多语言检索

  1. 基准:词汇检索( BM25 \text{BM25} BM25),密集检索( mDPR/mCont./mE5/E5-7b \text{mDPR/mCont./mE5/E5-7b} mDPR/mCont./mE5/E5-7b),其它( Text-Emb.-L3 \text{Text-Emb.-L3} Text-Emb.-L3)
  2. 结果: Dense \text{Dense} Dense(性能最优 + \text{+} +在语言以外语言提升更大), Sparse \text{Sparse} Sparse(碾压 BM25 \text{BM25} BM25), ALL \text{ALL} ALL(效果最佳)

2️⃣任务 2 2 2:跨语言检索

  1. 数据:采用 MKQA \text{MKQA} MKQA基准数据集,用非英语检索英文维基百科
  2. 结果: Dense \text{Dense} Dense就已超过基准,从 Dense+Sparse \text{Dense+Sparse} Dense+Sparse到 ALL \text{ALL} ALL性能进一步提升
    • 但 Sparse \text{Sparse} Sparse的性能不行:源于 Spaese \text{Spaese} Spaese主要基于词分布,而跨语言背景下,共同词汇有限
    • 在小语种上表现优异:归功于广泛的无监督训练

3️⃣任务 3 3 3:长文档检索

  1. 数据: MLDR \text{MLDR} MLDR(多语言长文档), NarrativeQA \text{NarrativeQA} NarrativeQA(英语长文档), JinaEmbeddingv2 \text{JinaEmbeddingv2} JinaEmbeddingv2(额外基准)
  2. 结果:在 MLDR \text{MLDR} MLDR上, Sparse/MutiVec \text{Sparse/MutiVec} Sparse/MutiVec效果突出,但还是 ALL \text{ALL} ALL得分最高
  3. 消融:去除长文档的限制, Dense \text{Dense} Dense依旧超越很多基准

3.2.2. \textbf{3.2.2. } 3.2.2. 消融实验

1️⃣实验 1 1 1:自我知识蒸馏的消融

  1. 消融方式:禁用自知识蒸馏,每种检索方式独立训练,然后再整合
  2. 实验结果:所有自蒸馏的 Dense/Sparse/MultiVec \text{Dense/Sparse/MultiVec} Dense/Sparse/MultiVec效果,都比消融整合模型好

2️⃣实验 2 2 2:多阶段训练的消融

  1. 消融方式:

    模型 XLM-RoBERTa \textbf{XLM-RoBERTa} XLM-RoBERTa模型 RetroMAE \textbf{RetroMAE} RetroMAE调整 无监督数据预训练
    1 \text{1} 1
    2 \text{2} 2
    3 \text{3} 3
  2. 结果: RetroMAE \text{RetroMAE} RetroMAE显著提高了检索性能,无监督训练进一步提高了嵌入模型的质量

相关推荐
SQingL1 小时前
NLP三大特征抽取器(CNN/RNN/TF)
rnn·自然语言处理·cnn
风虎云龙科研服务器1 小时前
深度学习GPU服务器推荐:打造高效运算平台
服务器·人工智能·深度学习
石臻臻的杂货铺1 小时前
OpenAI CEO 奥特曼发长文《反思》
人工智能·chatgpt
想要入门的程序猿2 小时前
Qt菜单栏、工具栏、状态栏(右键)
开发语言·数据库·qt
说私域3 小时前
社群团购平台的运营模式革新:以开源AI智能名片链动2+1模式商城小程序为例
人工智能·小程序
键盘上的蚂蚁-3 小时前
Python 语言结合 Flask 框架来实现一个基础的代购商品管理
jvm·数据库·oracle
说私域3 小时前
移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析
人工智能·小程序
cxr8283 小时前
智能体(Agent)如何具备自我决策能力的机理与实现方法
人工智能·自然语言处理
WBingJ3 小时前
机器学习基础-支持向量机SVM
人工智能·机器学习·支持向量机
代码欢乐豆3 小时前
MongoDB的部署和操作
数据库·mongodb