文章目录
- [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️⃣嵌入与检索
嵌入模型:一种深度学习模型,将文本转化为向量,以捕捉文本的意义信息
检索方法:密集 / \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的训练:如何整合三种嵌入方式的不同训练目标
- 高效的数据策划:
- 数据源:无监督数据 / / /监督数据 / / /合成数据
- 目的:互为补充,应用在不同训练阶段
- 一种新的自我蒸馏框架:
- 结构:
<CLS>
结构嵌入 → 用于 \xrightarrow{用于} 用于 密集检索,其它 Token \text{Token} Token嵌入 → 用于 \xrightarrow{用于} 用于 稀疏检索和多向量检索- 原理:整合不同检索功能产生的相关性分数为教师信号 → 知识蒸馏 \xrightarrow{知识蒸馏} 知识蒸馏 反馈给模型自己,不断增强循环
- 优化了批处理策略:实现大批量 + \text{+} +高吞吐的训练,以提高嵌入模型的区分能力
1.3. \textbf{1.3. } 1.3. 有关工作
1️⃣一般的文本嵌入
- 文本嵌入的进展:预训练模型(有效编码将数据的潜在语义),对比学习(负采样和知识蒸馏的运用)
- 文本嵌入的趋势:多功能的嵌入模型(统一支持多种场景),如 E5/BGE/SGPT/Contriever... \text{E5/BGE/SGPT/Contriever... } E5/BGE/SGPT/Contriever...
2️⃣ IR \text{IR} IR的文本嵌入:密集检索 / \mathcal{/} /多向量检索 / \mathcal{/} /稀疏(词汇)检索
3️⃣多语言的文本嵌入:
实现多文本嵌入:
方向(思路) 模型 多语言数据集 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. 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>
标记
- 查询: q = q\text{=} q=
<q-cls> <q-Token-1> <q-Token-2> ....
- 文档: p = p\text{=} p=
<p-cls> <p-Token-1> <p-Token-2> ....
2️⃣嵌入:词级嵌入,但重点关注 H [ 0 ] \mathbf{H}_{\mathbf{}}[0] H[0]
- 查询: 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] ...- 文档: 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️⃣归一化:为方便计算内积
- 查询:
<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的最终嵌入表示- 文档:
<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>
标记
- 查询: q = q\text{=} q=
<q-Token-1> <q-Token-2> <q-Token-3> ....
- 文档: p = p\text{=} p=
<p-Token-1> <p-Token-2> <q-Token-3> ....
2️⃣嵌入:词级嵌入
- 查询: 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]...- 文档: 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相同时取权值最大值
- 查询:
<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])- 文档:
<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>
标记
- 查询: q = q\text{=} q=
<q-Token-1> <q-Token-2> <q-Token-3> ....
- 文档: p = p\text{=} p=
<p-Token-1> <p-Token-2> <q-Token-3> ....
2️⃣嵌入:词级嵌入
- 查询: 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]...- 文档: 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{+} +归一化
- 查询: 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)
- 文档: 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️⃣集成方法
- 分立:用三种不同的方法,分别单独就行检索,得到三个检索结果 s dense / s lex / s mul s_{\text {dense}}/s_{\text {lex}}/s_{\text {mul}} sdense/slex/smul
- 整合:最终得分 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️⃣大规模预训练数据:源于无标签语料库的无监督数据,一般为简单清洗后的"标题-正文"结构文本
- 普通的:维基百科 /S2ORC/xP3/mC4/CC-News/MTP \text{/S2ORC/xP3/mC4/CC-News/MTP} /S2ORC/xP3/mC4/CC-News/MTP
- 特殊的:翻译数据集的平行句子 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
- 来源:抽取长篇文章的随机段落 → \text{→} →用 ChatGPT \text{ChatGPT} ChatGPT生成段落的对应问题 → \text{→} →将二者整合成文本对
- 目的:缓解长文档检索任务的不足
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:基于集成学习原理,直接将不同模型的预测结果加权合并
原始损失: 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 τ 温度参数,控制得分的平滑度 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
一些思考:
- 问题:不同检索方法的训练目标相互冲突 ,对 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′:基于自蒸馏的框架
原始损失:一种改进的交叉熵
损失 损失公式 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)) 蒸馏框架:将综合得分 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作为学生模型
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️⃣第一阶段:无监督的预训练,让嵌入模型具备基本智能
- 预训练数据:收集的非监督数据
- 预训练模型:用 RetroMAE \text{RetroMAE} RetroMAE方法调整过的 XLM-RoBERTa \text{XLM-RoBERTa} XLM-RoBERTa模型
- 预训练流程:反复执行稠密检索 → \text{→} →根据检索结果通过对比学习调整参数,不断重复这一过程
- 稠密检索:即预训练任务,在此处还不涉及其它检索方法
- 对比学习:即预训练策略,通过区分正负样本对的相似度,学习嵌入的表示方法
2️⃣第二阶段:使用自知识蒸馏进行微调,嵌入模型被微调以建立三种检索功能
- 权重参数: 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准确率很低,故有意降低其权重
- 微调数据:收集的标注数据 + \text{+} +合成数据
- 微调策略: ANCE \text{ANCE} ANCE方法,即通过 ANN \text{ANN} ANN加速寻找正负样本对
2.4. \textbf{2.4. } 2.4. 训练优化: 高效批处理
1️⃣所面临的问题
- 一般模型的训练:一方面保持批足够大(含足够多批内负样本),另一方面对太长的输入直接截断
- BGE-M3 \text{BGE-M3} BGE-M3的训练:万万不可直接截断长输入,不然就丧失队长序列的学习能力
2️⃣解决方法:优化的批处理
分组:训练数据按序列长度分到不同小组(如图中 128/1024/4096... \text{128/1024/4096...} 128/1024/4096...)
采样:训练实例从同一组 中抽取一部分作为训练的 Batch \text{Batch} Batch进入 GPU \text{GPU} GPU,这一过程有如下两种优化
负载平衡:不同 GPU \text{GPU} GPU采样数据时都保持固定随机种子,使得抽到每批数据(句子)长短分布一致
txt👉不固定随机种子: GPU1: 可能随机抽到很多长序列 -> 负载重(计算慢) -> 执行计算 GPU2: 可能随机抽到很多短序列 -> 负载重(计算慢) -> 空闲等待
填充优化:一批数据进入到 GPU \text{GPU} GPU仍需填充至最长,但由于分组 + + +平衡策略,实际填充数很低
拆分:对序列长度较长的 Batch \text{Batch} Batch(如图中右边的 4096/8192... \text{4096/8192...} 4096/8192...),再分割成子批
- 流程(附录 B.3 \text{B.3} B.3):启用梯度检查点 → \text{→} →分子批 → \text{→} →逐个处理子批得到嵌入 → \text{→} →合并得到原始批的嵌入
广播: 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️⃣实验配置
- 数据集: MIRACL \text{MIRACL} MIRACL(包含 18 \text{18} 18种语言)
- 评估指标: nDCG@10 \text{nDCG@10} nDCG@10,其越高表明相关文档被排到了越靠前的位置
2️⃣检索实现
单独的:
检索方式 目的 索引构建 检索任务 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 整合的:
检索方式 检索内容 重排依据(任务 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:多语言检索
- 基准:词汇检索( 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)
- 结果: Dense \text{Dense} Dense(性能最优 + \text{+} +在语言以外语言提升更大), Sparse \text{Sparse} Sparse(碾压 BM25 \text{BM25} BM25), ALL \text{ALL} ALL(效果最佳)
2️⃣任务 2 2 2:跨语言检索
- 数据:采用 MKQA \text{MKQA} MKQA基准数据集,用非英语检索英文维基百科
- 结果: 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:长文档检索
- 数据: MLDR \text{MLDR} MLDR(多语言长文档), NarrativeQA \text{NarrativeQA} NarrativeQA(英语长文档), JinaEmbeddingv2 \text{JinaEmbeddingv2} JinaEmbeddingv2(额外基准)
- 结果:在 MLDR \text{MLDR} MLDR上, Sparse/MutiVec \text{Sparse/MutiVec} Sparse/MutiVec效果突出,但还是 ALL \text{ALL} ALL得分最高
- 消融:去除长文档的限制, Dense \text{Dense} Dense依旧超越很多基准
3.2.2. \textbf{3.2.2. } 3.2.2. 消融实验
1️⃣实验 1 1 1:自我知识蒸馏的消融
- 消融方式:禁用自知识蒸馏,每种检索方式独立训练,然后再整合
- 实验结果:所有自蒸馏的 Dense/Sparse/MultiVec \text{Dense/Sparse/MultiVec} Dense/Sparse/MultiVec效果,都比消融整合模型好
2️⃣实验 2 2 2:多阶段训练的消融
消融方式:
模型 XLM-RoBERTa \textbf{XLM-RoBERTa} XLM-RoBERTa模型 RetroMAE \textbf{RetroMAE} RetroMAE调整 无监督数据预训练 1 \text{1} 1 ✅ ❌ ❌ 2 \text{2} 2 ✅ ✅ ❌ 3 \text{3} 3 ✅ ✅ ✅ 结果: RetroMAE \text{RetroMAE} RetroMAE显著提高了检索性能,无监督训练进一步提高了嵌入模型的质量