在此之前,先看一下ColBERT的架构,该架构包括:查询编码器、文档编码器和后期交互机制。
查询编码器
假设有一个查询 Q Q Q,其标记(token)为$ q1, q2, …, ql$,处理步骤如下:
- 将 Q Q Q转换为 BERT 使用的 WordPiece 标记 (一种子词分词方法)。
- 在序列开头添加一个特殊的[Q]标记,紧随 BERT 的[CLS]标记之后,用于标识查询的开始。
- 如果查询长度不足预设的$ N_q$个标记,用[mask]标记填充;若超过则截断。
- 将处理后的序列输入 BERT,然后通过CNN处理,最后进行归一化。
最终输出的查询嵌入向量集合 $E_q $可表示为:
E q : = N o r m a l i z e ( B E R T ( [ Q ] , q 0 , q 1 , … , q l , [ m a s k ] , [ m a s k ] , … , [ m a s k ] ) ) E_q:=Normalize(BERT([Q],q_0,q_1,\ldots,q_l,[mask],[mask],\ldots,[mask])) Eq:=Normalize(BERT([Q],q0,q1,…,ql,[mask],[mask],…,[mask]))
文档编码器
对于包含标记 d 1 , d 2 , . . . , d n d_1, d_2, ..., d_n d1,d2,...,dn 的文档$ D $,处理步骤类似:
- 在序列开头添加[D]标记,标识文档开始。
- 无需填充,直接输入 BERT 进行处理。
文档嵌入向量集合 Ed 可表示为:
E d : = F i l t e r ( N o r m a l i z e ( B E R T ( [ D ] , d 0 , d 1 , … , d n ) ) ) E_d:=Filter(Normalize(BERT([D],d_0,d_1,\ldots,d_n))) Ed:=Filter(Normalize(BERT([D],d0,d1,…,dn)))
Filter用于去除与标点符号对应的嵌入,从而提升分析速度。这里的查询填充策略(论文中称为"查询增强")确保了所有查询长度一致,有利于批量处理。而[Q]和[D]标记则帮助模型区分输入类型,提高了处理效率。
后期交互机制
“交互”是指通过比较查询和文档的向量表示来评估它们之间的相关性。“后期交互”表示这种比较发生在查询和文档已经被独立编码之后。这种方法与BERT之类的“早期交互”模型不同——早期交互中查询和文档的Embedding在较早的阶段相互作用,通常是在编码之前或期间。
ColBERT采用了一种后期交互机制,使得查询和文档的表示可以用于预计算。然后,在末尾使用简化的交互步骤来计算已编码的向量列表之间的相似性。与早期交互方法相比,后期交互可以加快检索时间和降低计算需求,适用于需要高效处理大量文档的场景。
编码器将查询和文档转换为token级别的embedding列表 E q E_q Eq 和$ E_d 。然后,后期交互阶段使用针对每个 。然后,后期交互阶段使用针对每个 。然后,后期交互阶段使用针对每个E_q 中的向量,找与其产生最大内积的 中的向量,找与其产生最大内积的 中的向量,找与其产生最大内积的E_d$中的向量(即为向量之间的相似性),并将所有分数求和的最大相似性 (MaxSim) 计算。MaxSim的计算结果就反映了查询与文档之间的相关性分数,表示为 S q , d S_{q,d} Sq,d 。
S q , d : = ∑ i ∈ [ ∣ E q ∣ ] max j ∈ [ ∣ E d ∣ ] E q i ⋅ E d j T S_{q,d}:=\sum_{i\in[|E_q|]}\max_{j\in[|E_d|]}E_{q_i}\cdot E_{d_j}^T Sq,d:=i∈[∣Eq∣]∑j∈[∣Ed∣]maxEqi⋅EdjT
这种方法的独特价值在于能够对查询与文档token embedding之间进行详细、细粒度的比较,有效捕捉查询和文档中长度不同的短语或句子之间的相似性。这尤其适合需要精确匹配文本片段的应用场景,可以提高搜索或匹配过程的整体准确性。