简要介绍BGE(BAAI General Embedding)-M3的技术方案
结构
-
类BERT的encoder-only transformer,输出就是embedding而非文本
-
encoder后面加了三种head
-
dense:把[CLS]的embedding提出来,归一化就得了
[CLS]就是BERT里句首那个[CLS],只不过这里没用来分类而已
最早的bge就只有这个dense,没有把另外两种head加进来
-
sparse:每个token(当然除[CLS]外)逐个线性映射到一维然后relu,然后整理成和词表长度一致的稀疏向量(如果有重复token就只取最大值),这个稀疏向量就是sparse的embedding(paper里写的相似度计算本质上和直接拿这个稀疏向量乘是一样的)
-
multi-vector:先逐个token线性映射一次(维度相同),归一化后用ColBert的办法(每个query token和各个doc token的内积中的最大值能得到一个数,所有query token的这个数加起来就是相似度值)
-
-
以上得到的三种相似度加权求和就是总的相似度
训练
- pretrain
- RetroMAE,类似MLM,但有利于把语义压缩到[CLS]去(加了个小的decoder搞恢复,decoder上用一个较高的mask rate,然后让decoder搞重建)
- 这步相当于只有dense部分参与训练
- posttrain
- 针对检索部分进行优化,在单语语料(要用其他方式构造正负样本对)、检索对数据集、翻译对文本数据(多语言能力在这了)间搞对比训练
- 自知识蒸馏
- 主要目的是优化三种查询方式的协同性
- “自”的含义:三种查询方式互为师生(按paper的说法,既有已经在pretrain中训好的dense向另外两种匹配方式传递信号的功能,也有反过来优化dense的功能,不过这种说法有点抽象)
- 三种查询方式得到score的权重系数还是需要人工根据场景确定,默认dense和multi-vector等权,但sparse权重会低一些