1. ColXTR \textbf{1. ColXTR} 1. ColXTR原理
1.1. ColBERTv2 \textbf{1.1. ColBERTv2} 1.1. ColBERTv2概述
1.1.1. \textbf{1.1.1. } 1.1.1. 训练优化
1️⃣难负样本生成
- 初筛:基于 BM-25 \text{BM-25} BM-25找到可能的负样本
- 重排:使用 KL \text{KL} KL散度将大型交叉编码器蒸馏进 MiniLM \text{MiniLM} MiniLM,再用 MiniLM \text{MiniLM} MiniLM保留负样本中的难负样本
2️⃣高效训练结构
- 多元组结构:从原来的结构 ⟨ q , d + , d – ⟩ \langle q, {d}^+,{d}^\text{–}\rangle ⟨q,d+,d–⟩,变成 ⟨ q , d w ⟩ = ⟨ q , d 1 + , d 2 – , . . . , d w – ⟩ \langle q, \textbf{d}_{w}\rangle\text{=}\langle q, {d}^+_{1},{d}^\text{–}_{2},...,{d}^\text{–}_{w}\rangle ⟨q,dw⟩=⟨q,d1+,d2–,...,dw–⟩结构
- 批内负样本:除自身负样本外,还将批内其他查询的所有段落视为负样本,用来统一优化训练函数
3️⃣降噪训练优化:
- 样本刷新:定期用训练到一半的模型,重新生成训练样本
- 防过拟合:定期刷新训练样本,以防止陷入局部最优
1.1.2. \textbf{1.1.2. } 1.1.2. 整体流程
1️⃣残差压缩的原理
- 聚类:对全部段落全部向量的集合 { p j } \{p_j\} {pj}进行聚类,为每个向量 p j p_j pj分配了一个质心 C p j C_{p_j} Cpj
- 残差:就是 p j p_j pj与其质心 C p j C_{p_j} Cpj的距离 r = p j – C p j r\text{=}p_j\text{–}C_{p_j} r=pj–Cpj
- 压缩:将浮点数压缩为二进制表示,如[ r r r每个维度的连续分布 → 分割为 4 \xrightarrow{分割为}4 分割为4个离散状态] ⇔ 对应 2 \xLeftrightarrow{对应}2 对应 2个 bit \text{bit} bit所表示的四种状态
- 编码:将每个 p j p_j pj表示为质心 C p j + C_{p_j}\text{+} Cpj+压缩的残差,通过反向解压缩残差即可得到近似的 p j p_j pj
2️⃣离线索引流程
- 近似质心:抽取一部分段落 Token \text{Token} Token执行嵌入,再对部分的嵌入向量执行 n embeddings -Means \sqrt{n_{\text{embeddings}}}\text{-Means} nembeddings-Means聚类,得到 n embeddings \sqrt{n_{\text{embeddings}}} nembeddings个质心
- 压缩编码:对所有的段落进行全精度嵌入(但是不存储),基于上一步得到的质心进行残差压缩(此时才对残差编码进行存储)
- 倒排索引:构建质心 → \text{→} →质心所包含的嵌入的 ID \text{ID} ID的列表,存储到磁盘中
质心a -> 属于质心a的嵌入ID=a1, a2, a3, ... 质心b -> 属于质心b的嵌入ID=b1, b2, b3, ... 质心c -> 属于质心c的嵌入ID=c1, c2, c3, ...
3️⃣在线查询流程
- 查询嵌入:原始查询 Q → 预处理 ( 嵌入 ) BERT Q\xrightarrow[预处理(嵌入)]{\text{BERT}} QBERT预处理(嵌入)多向量表示 { q 1 , q 2 , … , q n } \{q_1, q_2, \dots, q_n\} {q1,q2,…,qn}
- 候选生成:查找与每个 q i q_i qi最近的 n probe ≥ 1 n_{\text{probe}}\text{≥}1 nprobe≥1个质心,收集每个质心下属的 { p j } \{p_j\} {pj}集合,再收集与 { p j } \{p_j\} {pj}有关的段落是为候选段落
- 初筛流程:解压 { p j } \{p_j\} {pj}中所有的向量,利用解压向量计算 Q Q Q与候选段落的近似距离,这个近似距离时则为一个下界
👉举个简单例子Q: {q1, q2, q3}P: {p1, p2, p3, p4} → {pj}集合中仅有{p1, p2, p3} 👉完整的距离计算Maxsim-1-full = Max{<q1,p1>,<q1,p2>,<q1,p3>,<q1,p4>}Maxsim-2-full = Max{<q2,p1>,<q2,p2>,<q2,p3>,<q2,p4>}Maxsim-3-full = Max{<q3,p1>,<q3,p2>,<q3,p3>,<q3,p4>} 👉近似的距离计算Maxsim-1-part = Max{<q1,p1>,<q1,p2>,<q1,p3>} ≤ Maxsim-1-fullMaxsim-2-part = Max{<q2,p1>,<q2,p2>,<q2,p3>} ≤ Maxsim-2-fullMaxsim-3-part = Max{<q3,p1>,<q3,p2>,<q3,p3>} ≤ Maxsim-3-full 👉所以一定是下界
- 重排流程:根据初筛结果选取若干最相似的段落,解压得到这些段落的全部向量,计算精确的相似度以得到最终结果
1.2. XTR \textbf{1.2. XTR} 1.2. XTR概述
1.2.1. \textbf{1.2.1. } 1.2.1. 研究的动机
1️⃣重新定义多向量相似度问题: ColBERT ( Q , P ) = 1 Z ∑ i = 1 n ∑ j = 1 m ( P ∘ A ) i j \displaystyle\text{ColBERT}(Q,P)\text{=}\frac{1}{Z} \sum_{i=1}^{n} \sum_{j=1}^{m}(\textbf{P}\text{∘}\textbf{A})_{ij} ColBERT(Q,P)=Z1i=1∑nj=1∑m(P∘A)ij
- 数据结构:
- 评分矩阵 S \textbf{S} S:令查询 Q = { q 1 , q 2 , … , q n } Q\text{=}\left\{q_{1},q_2,\ldots,q_{n}\right\} Q={q1,q2,…,qn}以及文档 P = { p 1 , p 2 , . . . , p m } P\text{=}\{p_1,p_2,...,p_m\} P={p1,p2,...,pm},记子内积为 s i j = q i ⊤ p j s_{ij}\text{=}{q}_{i}^{\top}{p}_{j} sij=qi⊤pj,由此构成 S ∈ R n × m \textbf{S}\text{∈}\mathbb{R}^{n\text{×}m} S∈Rn×m
- 对齐矩阵 A \textbf{A} A:让每个元素 a i j ∈ { 0 , 1 } a_{ij}\text{∈}\{0,1\} aij∈{0,1}来对 P \textbf{P} P中的元素进行不同强度的选择,由此构成 A ∈ R n × m \textbf{A}\text{∈}\mathbb{R}^{n\text{×}m} A∈Rn×m
- ColBERT \text{ColBERT} ColBERT版本,通过调整对齐矩阵 A \textbf{A} A,让其选择评分矩阵 S \textbf{S} S每行最大的一个值,最后除以 Z Z Z归一化
- 传统的训练方式:最大化批内正样本 P + ∈ P 1 : B = [ P 1 , … , P B ] {P}^{+}\text{∈}{P}_{1:B}\text{=}\left\lbrack{{P}_{1},\ldots ,{P}_{B}}\right\rbrack P+∈P1:B=[P1,…,PB]的得分,即最小化 L C E = – log e ColBERT ( Q , P b ) ∑ b = 1 B e ColBERT ( Q , P b ) {\mathcal{L}}_{\mathrm{{CE}}}\textbf{= }–\log\cfrac{e^{\text{ColBERT}\left( {Q,{P}_{b}}\right)}}{\displaystyle{}\sum_{{b\textbf{=}1}}^{B}e^{\text{ColBERT}\left( {Q,{P}_{b}}\right)}} LCE= –logb=1∑BeColBERT(Q,Pb)eColBERT(Q,Pb)
2️⃣传统 ColBERT \text{ColBERT} ColBERT的流程
![]()
- Token \text{Token} Token检索:用查询单向量集中每个 q i q_i qi检索 k ′ k^\prime k′个段落 Token \text{Token} Token,最多产生 n × k ′ n\text{×}k^\prime n×k′个候选 Token \text{Token} Token
- 收集向量:加载 n × k ′ n\text{×}k^\prime n×k′个候选 Token \text{Token} Token所属的段落,收集这些段落中所有的 Token \text{Token} Token向量
- 评分与重排:对这些段落应用全精度的 ColBERT \text{ColBERT} ColBERT非线性相似度以进行重排
3️⃣ XTR \text{XTR} XTR的动机
- 传统 ColBERT \text{ColBERT} ColBERT面临的问题
- 训练上:与推理不一致,传统 ColBERT \text{ColBERT} ColBERT的旨在优化最终 ColBERT \text{ColBERT} ColBERT评分,而推理过程旨在获得 Top- k \text{Top-}k Top-k的 Token \text{Token} Token
- 开销上:收集 Top- k \text{Top-}k Top-k候选段落的多有 Token \text{Token} Token空间开销巨大,由此后续精确距离的计算成本也巨大
- 泛化上: ColBERT \text{ColBERT} ColBERT的评分函数是非线性的,阻碍了使用 MIPS \text{MIPS} MIPS进行检索
- XTR \text{XTR} XTR的改进
- 训练阶段:重新设计了训练目标函数,使得模型能优先检索出最有价值的段落 Token \text{Token} Token
- 重排阶段:完全省去回溯(收集)步骤,直接只用检索到的段落 Token \text{Token} Token来构成
- 缺失补充:只考虑检索到的 Token \text{Token} Token难免漏掉相关的 Token \text{Token} Token,故 XTR \text{XTR} XTR还会对缺失 Token \text{Token} Token进行自动评分
1.2.2. \textbf{1.2.2. } 1.2.2. 模型训练
1️⃣批内 Token \text{Token} Token检索的训练策略
- 给定一个查询 Q = { q 1 , . . . , q n } Q\text{=}\{q_1,...,q_n\} Q={q1,...,qn}和一批共 B B B个段落向量 P ( i ) = { p 1 ( i ) , . . . , p m ( i ) } P^{(i)}\text{=}\{p_1^{(i)},...,p_m^{(i)}\} P(i)={p1(i),...,pm(i)}
- 为每个 q i q_i qi在所有的段落向量集中执行 Top-K \text{Top-K} Top-K搜索,将每个 q i q_i qi的 Top-K \text{Top-K} Top-K段落向量相应位设为 1 1 1
- 将矩阵按段落拆分,就得到了段落的对齐矩阵
- 将每行被激活的子相似度的最大值相加,再除以归一化参数 Z Z Z(即有几行有被激活的相似度),得到最终的相似度评分
- 零处理机制:当一个段落所有 Token \text{Token} Token都没有足够高相似度(对齐矩阵全 0 0 0),会将归一化参数 Z Z Z设为很小的一个数避免除以 0 0 0
2️⃣与传统 ColBERT \text{ColBERT} ColBERT训练的对比:还是回到原来的例子
- ColBERT \text{ColBERT} ColBERT:不论 P + P^+ P+被选择与否,都会被给予很高的得分,导致模型最终无法正确选出 P + P^+ P+
- XTR \text{XTR} XTR:极端情况如 P + P^+ P+的每个 Token \text{Token} Token都不是 q i q_i qi的 Top-K \text{Top-K} Top-K,导致 P + P^+ P+被打零分造成高损失,迫使模型调整以能正确选择 P + P^+ P+
1.2.3. \textbf{1.2.3. } 1.2.3. 推理阶段
1️⃣获取候选文档:
- MIPS \text{MIPS} MIPS检索:对所有 n n n个查询向量 q i q_i qi执行 Top- k ′ \text{Top-}k^\prime Top-k′检索,得到 k ′ k^\prime k′个最相似的段落 Token \text{Token} Token
- 回溯(但不收集):回溯这 n k ′ nk^\prime nk′个 Token \text{Token} Token所属的文档,确定 C C C个候选文档
2️⃣相似度填充:
- 排序:其检索 q i q_i qi的 Top- k \text{Top-}k Top-k为 p ( 1 ) , p ( 2 ) , . . . , p ( k ) p_{(1)},p_{(2)},...,p_{(k)} p(1),p(2),...,p(k),假设这些 Token \text{Token} Token与 q i q_i qi的相似度从高到低为 ⟨ q i , p ( 1 ) ⟩ , . . . , ⟨ q i , p ( k ) ⟩ \left\langle{q_i,p_{(1)}}\rangle,...,\langle{q_i,p_{(k)}}\right\rangle ⟨qi,p(1)⟩,...,⟨qi,p(k)⟩
- 填充:令被检索到的 Token \text{Token} Token中的相似度最低者为 m i = ⟨ q i , p ( k ) ⟩ m_i\text{=}\langle{q_i,p_{(k)}}\rangle mi=⟨qi,p(k)⟩,直接用 m i m_i mi去填充一切其它(未被检索到 Token \text{Token} Token)的相似度
- 评分:填充后再取每个段落相似度矩阵每行相似度的最大值相加,然后除以行数归一化,避免了某一行贡献的相似度为 0 0 0
1.3. ColXTR \textbf{1.3. ColXTR} 1.3. ColXTR原理
1️⃣ ColXTR \text{ColXTR} ColXTR概述:集成 ColBERTv2 \text{ColBERTv2} ColBERTv2的优化来增强 XTR \text{XTR} XTR
- 训练阶段:
- 保留 XTR \text{XTR} XTR训练目标:即仍然采用 Token \text{Token} Token检索级优化,而非段落级评分的优化
- 增加降维投影层:训练过程中引入降维投影,试图降低每个 Token \text{Token} Token的向量的维度
- 推理阶段:
- XTR \text{XTR} XTR:直接使用 ScaNN \text{ScaNN} ScaNN库存储精确的向量,不进行任何压缩,从而使得空间需求巨大
- ColXTR \text{ColXTR} ColXTR:引入了 ColBERTv2 \text{ColBERTv2} ColBERTv2的残差压缩机制,大幅降低存储需求
2️⃣ ColXTR \text{ColXTR} ColXTR索引:全盘采纳 ColBERTv2 \text{ColBERTv2} ColBERTv2的三阶段索引,并用 T5 \text{T5} T5编码器(和 Aligner \text{Aligner} Aligner一样)嵌入
- 近似质心:抽取一部分段落 Token \text{Token} Token执行嵌入,再对部分的嵌入向量执行 n embeddings -Means \sqrt{n_{\text{embeddings}}}\text{-Means} nembeddings-Means聚类,得到 n embeddings \sqrt{n_{\text{embeddings}}} nembeddings个质心
- 压缩编码:对所有的段落进行全精度嵌入(但是不存储),基于上一步得到的质心进行残差压缩(此时才对残差编码进行存储)
- 倒排索引:构建质心 → \text{→} →质心所包含的嵌入的 ID \text{ID} ID的列表,存储到磁盘中
质心a -> 属于质心a的嵌入ID=a1, a2, a3, ... 质心b -> 属于质心b的嵌入ID=b1, b2, b3, ... 质心c -> 属于质心c的嵌入ID=c1, c2, c3, ...
3️⃣ ColXTR \text{ColXTR} ColXTR查询:假设查询 Q Q Q被编码为多向量表示 { q 1 , q 2 , . . . , q n } \{q_1,q_2,...,q_n\} {q1,q2,...,qn}
- 候选生成:原始 XTR \text{XTR} XTR直接对 { p j } \{p_j\} {pj}进行 MIPS \text{MIPS} MIPS搜索生成候选段落, ColXTR \text{ColXTR} ColXTR先对质心进行 MIPS \text{MIPS} MIPS搜索,再倒排索引回候选段落
![]()
- 质心搜索:计算所有 q i q_i qi与所有质心 c j c_j cj的相似度,确定每个 q i q_i qi的 Top- k \text{Top-}k Top-k个质心,合并后得到候选质心集 { c j } \{c_j\} {cj}
- 倒排索引:通过倒排索引,将候选质心回溯得到与每个质心有关的段落嵌入,是为候选向量集 { p j } \{p_j\} {pj}
- 候选生成:找到所有与 { p j } \{p_j\} {pj}种向量有关的段落,从而构成候选段落集 { P 1 , P 2 , . . . , P N } \{P_1,P_2,...,P_N\} {P1,P2,...,PN}
- 内积计算:解压以获得 { p j } \{p_j\} {pj}中所有向量的全精度表示,让查询向量集 { q i } \{q_i\} {qi}和段落向量集 { p j } \{p_j\} {pj}中向量两两算内积 ⟨ q i , p j ⟩ \langle{q_i,p_j}\rangle ⟨qi,pj⟩
- 相似填充:用每行最小的相似度值,填充每行剩余的相似度值,最终输出每个候选段落每行最大值的平均(即为近似相似度)
- 段落重排:选取若干近似评分最高的段落,解压其所有的向量从而计算精确的相似度,即可得到精确的最相似段落
2. \textbf{2. } 2. 实验及结果
1️⃣实验设置
- 模型设置:在 MS-MARCO \text{MS-MARCO} MS-MARCO上对 T5-base \text{T5-base} T5-base编码器进行微调,并在顶层设置一个 768→128 \text{768→128} 768→128的投影层
- 训练设置:设置 XTR \text{XTR} XTR中训练的 k = 320 k\text{=}320 k=320,一批样本 48 \text{48} 48个(其中难负样本由 BM25 \text{BM25} BM25挖掘出),训练 50K \text{50K} 50K步
- 检索设置:让每个 q i q_i qi先探测 10 \text{10} 10个质心,对小索引设置倒排索引到 k = 500 k\text{=}500 k=500个 p j / p_j/ pj/大索引则 k = 10000 k\text{=}10000 k=10000个
2️⃣实验结果
- 性能上: ColXTR \text{ColXTR} ColXTR比 COlBERT \text{COlBERT} COlBERT和 XTR \text{XTR} XTR都要差,我不理解这篇文章为什么要重新训练 ColBERT \text{ColBERT} ColBERT,他妈性能当然比不过啊
- 开销上:你都他妈压缩了开销当然小啊,性能又打不过,这种文章还能发 COLING’25 \text{COLING'25} COLING’25奶奶的
3️⃣优化分析
- 这一部分内容也相当无聊
- 就是啊我们的优化,哎哟和 XTR \text{XTR} XTR一样降低了推理开销,那个和 ColBERTv2 \text{ColBERTv2} ColBERTv2一样降低了存储开销
- 所以 ColXTR \text{ColXTR} ColXTR性能连传统 ColBERT \text{ColBERT} ColBERT都不如,但我们就是牛逼