0%

BGE-M3

简要介绍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权重会低一些

欢迎关注我的其它发布渠道