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


原文章: 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) slextqp(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=1Nj=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}} srankw1sdense+w2slex+w3smul,三个系数由不同下游场景确定

2️⃣集成表示: d y ← f n ∗ ( q x , D y ) d^y \leftarrow \mathrm{fn}^*\left(q^x, D^y\right) dyfn(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}} Lfinal2L+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}} sinterw1sdense+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} L4λ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} L3λ1Ldense+λ2Llex+λ3Lmul

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

image-20250105191622155image-20250105191656146

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️⃣解决方法:优化的批处理

image-2024874
  1. 分组:训练数据按序列长度分到不同小组(如图中 128/1024/4096... \text{128/1024/4096...} 128/1024/4096...)
  2. 采样:训练实例从同一组中抽取一部分作为训练的 Batch \text{Batch} Batch进入 GPU \text{GPU} GPU,这一过程有如下两种优化
    • 负载平衡:不同 GPU \text{GPU} GPU采样数据时都保持固定随机种子,使得抽到每批数据(句子)长短分布一致
      👉不固定随机种子: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,以扩大批内负样本
    广播前: 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显著提高了检索性能,无监督训练进一步提高了嵌入模型的质量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop•FinalShell连接VMware免密登录

听说这是目录哦 FinalShell连接VMware&#x1f324;️解决重连失效FinalShell的使用 免密登录⛈️能量站&#x1f61a; FinalShell连接VMware&#x1f324;️ 保持虚拟机的开机状态&#xff0c;打开FinalShell&#xff0c;如果虚拟机关机或者挂起&#xff0c;连接就会断开。 …

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片&#xff0c;并简单绘图。听上去似乎不难&#xff0c;但是实际操作下来&#xff0c;却不是非常的容易的。本文较为详细的描述了这个过程&#xff0c;供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现

目录 1 三种多头编码&#xff08;MHE&#xff09;实现1.1 多头乘积&#xff08;MHP&#xff09;1.2 多头级联&#xff08;MHC&#xff09;1.3 多头采样&#xff08;MHS&#xff09;1.4 标签分解策略 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者…

docker中使用Dockerfile设置Volume挂载点

关于在docker中如何使用Volume&#xff0c;可以参考文章&#xff1a; docker中使用Volume完成数据共享-CSDN博客 如果想在生成docker镜像的时候设置好挂载点&#xff0c;而不是在运行镜像生成容器时生成。 下面以自建一个tomcat镜像为例&#xff0c;演示如何在生成镜像时设置…

springboot548二手物品交易boot代码(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统二手物品交易信息管理难度大&#xff0c;容错率低&#x…

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…

Mac iTerm2集成DeepSeek AI

1. 去deepseek官网申请api key&#xff0c;DeepSeek 2. 安装iTerm2 AI Plugin插件&#xff0c;https://iterm2.com/ai-plugin.html&#xff0c;插件解压后直接放到和iTerms相同的位置&#xff0c;默认就在/Applications 下 3. 配置iTerm2 4. 重启iTerm2,使用快捷键呼出AI对话…

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

电脑里msvcr120.dll文件丢失怎样修复?

电脑里msvcr120.dll文件丢失的修复指南 在电脑的日常使用中&#xff0c;我们可能会遇到各种各样的系统文件丢失问题&#xff0c;其中msvcr120.dll文件的丢失就是较为常见的一种。作为一名在软件开发领域深耕多年的从业者&#xff0c;我将为大家详细解析msvcr120.dll文件的重要…

今日头条ip属地根据什么显示?不准确怎么办

在今日头条这样的社交媒体平台上&#xff0c;用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而&#xff0c;不少用户发现自己的IP属地显示与实际位置不符&#xff0c;这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据&#xff0c;并提供解决IP属…

【Rust自学】10.3. trait Pt.1:trait的定义、约束与实现

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 题外话&#xff1a;trait的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整个第10章全都是Rust的重难点&#xff01;&#x…

大白话拆解——多线程中关于死锁的一切(七)(已完结)

前言&#xff1a; 25年初&#xff0c;这个时候好多小伙伴都在备战期末 小编明天还有一科考试&#xff0c;日更一篇&#xff0c;今天这篇一定会对小白非常有用的&#xff01;&#xff01;&#xff01; 因为我们会把案例到用代码实现的全过程思路呈现出来&#xff01;&#xff…

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…

《数据结构》期末考试测试题【中】

《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为&#xff1f;22. 单链表的存储密度比1&#xff1f;23.单链表的那些操作的效率受链表长度的影响&#xff1f;24.顺序表中某元素的地址为&#xff1f;25.m叉树第K层的结点数为&#xff1f;26. 在双向循环链表某节点…

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…

螺栓松动丢失腐蚀生锈检测数据集VOC+YOLO格式504张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;504 标注数量(xml文件个数)&#xff1a;504 标注数量(txt文件个数)&#xff1a;504 标注…

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…

如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取&#xff1f;2. 示例&#xff1a;使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取&#xff1f; 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…