跳转到内容

DRMM — 检索里的匹配是相关性不是语义相似

是什么

DRMM(Deep Relevance Matching Model)是一篇说”搜索的匹配跟聊天的匹配不是一回事”的论文。日常类比:

  • 聊天里你问”今天天气怎么样”,对方答”天空挺蓝的”——意思贴近,语义相似
  • 搜索里你查”埃博拉病毒症状”,文档里写一句”埃博拉病毒症状包括发热、出血”——你要的是这一句精确命中,整篇文章其它写什么不重要

DRMM 把这个差别叫 相关性匹配(relevance matching),不是 语义匹配(semantic matching)。它给搜索任务设计了一个专用网络结构:query 词与 doc 词逐对算相似度,再用直方图统计分布,喂前馈网络打分。

为什么重要

2014–2016 年深度学习刚进 NLP,业界把 NLU(理解、问答)那一套迁到检索:DSSM、ARC-I、ARC-II、MatchPyramid。指标却打不过老牌 BM25。原因没人说清。

DRMM 是第一篇明确指出”检索任务的匹配特性根本不同”的工作,并据此重新设计网络。它的影响:

  • 后续做 IR 神经模型必须先回答:“你建模的是 relevance 还是 semantic”
  • ColBERT 等 late-interaction 思路(query 词与 doc 词逐对交互)的精神祖宗
  • 让 IR 社区从”照搬 NLU 模型”回到”先看任务本质”

不理解这层,你看后面 KNRM、ColBERT、Conv-KNRM 全是技术细节堆砌。

核心要点

DRMM 把 检索 vs NLU 的差别拆成三条:

  1. 精确匹配信号最重要:query 里出现的词,doc 里原样出现,比”近义替换”价值大得多。BM25 只看精确匹配能赢这么多年不是偶然。

  2. query 词重要性不均:查”埃博拉 病毒”,“埃博拉”是核心,“病毒”是补充。NLU 里两个句子地位平等,IR 里 query 各词权重差异大。

  3. 多样匹配需求(diverse matching):长 doc 里只要任一段命中就够,不要求整篇都贴。NLU 任务(如 paraphrase)反过来——要求整体贴。

DRMM 的网络对应这三点:

  • 逐对相似度 + 直方图(对应第 1、3 点):每个 query 词与 doc 每个词算余弦相似度,得到一串数。把这串数按区间分桶(如 [1.0, 0.5, 0, -0.5, -1.0]),数每桶有几个。直方图保留信号强度的分布,且精确匹配(相似度=1)单独成一桶
  • term gating network(对应第 2 点):用 query 词的 IDF 或词向量学一个权重,告诉模型”哪个 query 词更重要”。
  • 加权求和:每个 query 词的直方图过同一个前馈网络得到一个分数,再按 gating 权重加权求和。

实践案例

案例 1:直方图为什么比 max-pooling 好

假设 query 词”埃博拉”与 doc 100 个词的余弦相似度是:

[1.0, 1.0, 0.3, 0.2, ..., 0.0, -0.1]
  • max-pooling:取最大值 1.0。但你不知道命中了几次——1 次还是 10 次?
  • avg-pooling:平均值 0.15。强信号被一堆 0 稀释。
  • 直方图:分桶后得 [2, 0, 95, 3, 0]——“2 次精确命中,95 个无关词”。这才是相关性的真实分布

案例 2:与 BM25 对比着看

BM25(q, d) = Σ over q_i in q IDF(q_i) × tf_score(q_i, d)
  • IDF(q_i):query 词重要性 → DRMM 的 term gating
  • tf_score(q_i, d):q_i 在 d 里出现强度 → DRMM 的直方图喂前馈网络
  • Σ:加权求和 → DRMM 的最后一步

DRMM 本质是深度版 BM25:保留 BM25 的”逐 query 词独立打分再求和”框架,把 tf 项换成可学习的非线性函数。

案例 3:对照 ARC-I(语义匹配模型)

ARC-I:query 编码成一个向量,doc 编码成一个向量,两个向量过 MLP 打分。问题:

  • doc 长达 1000 词,强行压成一个向量丢光局部命中
  • query 词权重隐含在向量里,模型很难学出”埃博拉 > 病毒”
  • 精确匹配信号被 word embedding 的”语义平滑”模糊掉

DRMM 不压缩 doc,逐词交互保留全部命中信号。

案例 4:直方图分桶到底怎么分

论文里给出三种分桶策略:

  • Count-based Histogram (CH):每桶数原始计数,比如桶 [0.5, 1.0) 里有 3 个相似度
  • Normalized Histogram (NH):CH 除以总词数,缓解长 doc 偏置
  • LogCount Histogram (LCH):CH 取 log,压一压数量级

实验里 LCH 最稳,原因是相关性”边际递减”——一个词命中 10 次 vs 100 次,区别没有 1 次 vs 10 次大。log 正好刻画这种递减。这是个任务先验喂给模型的小技巧。

踩过的坑

  1. 直方图不可微:分桶是离散操作,反向传播过不去。DRMM 的解法是”直方图固定,只学前馈网络”——直方图当输入特征,不当中间层。后续 KNRM 用 RBF 核做”软直方图”才让端到端可学。

  2. doc 长度归一化丢了:BM25 有 b 参数惩罚长 doc,DRMM 直方图统计的是绝对计数,长 doc 自然分桶里数多。论文用 normalized count 缓解但没彻底解决。

  3. term gating 弱:论文里 gating 用 IDF 或 query embedding 一层 softmax,比 BM25 的 IDF 复杂不了多少。后续 K-NRM 干脆把 gating 拿掉。

  4. 不学 query-doc 交互模式:直方图只看相似度分布,丢掉位置/顺序。MatchPyramid 保留位置但又掉进语义匹配陷阱。两边都难做对。

适用 vs 不适用场景

适用

  • ad-hoc 检索(一次性 query → 长文档):TREC Robust、ClueWeb 这类
  • 需要可解释性的检索(直方图就是”命中分布”,肉眼能读)
  • 重排阶段(rerank 第一阶段 BM25 召回的 top-1000)

不适用

  • 短文本对(query-query 相似度、QA pair)→ 用 BERT/Sentence-BERT
  • paraphrase / NLI 这类语义匹配 → 反过来,应该用 ARC-II / Decomposable Attention
  • 端到端可学的稠密检索 → 用 DPR / ColBERT,DRMM 直方图是阻碍
  • 大规模在线召回(百万级 doc 实时打分)→ DRMM 要逐词交互,太慢;适合 rerank 不适合召回

历史小故事(可跳过)

  • 2013 年:Microsoft 的 DSSM 用孪生塔做 query-doc 匹配,开了神经 IR 第一枪
  • 2014 年:ARC-I / ARC-II 把句子匹配迁到检索,指标却追不上 BM25
  • 2016 年:UMass 的 Croft 组(IR 老牌实验室)发表 DRMM,明确提出”relevance matching ≠ semantic matching”,重新设计网络
  • 2017 年:同组的 Xiong 等人把直方图换成 RBF 核,叫 K-NRM,让 DRMM 思路变得可端到端学
  • 2020 年:ColBERT 把”query 词与 doc 词逐对交互”思路推到 BERT 时代,但保留 DRMM 的核心精神——逐词交互不压缩

学到什么

  1. 任务本质决定网络结构——别看到 SOTA 就抄,先问”我的任务和它的任务匹配吗”
  2. NLU 和 IR 不是同一件事:semantic matching 看整体相似,relevance matching 看局部命中
  3. 直方图是个被低估的特征工程:在不可微但信息保留完整的场景里,比 pooling 强
  4. 深度模型不一定要端到端:DRMM 把直方图固定、只学打分网络,照样跑得动

延伸阅读

关联

  • bm25-okapi —— 经典 IR 词袋打分;DRMM 保留它”逐 query 词独立打分再求和”的骨架
  • okapi-bm25-1994 —— BM25 原始论文,DRMM 的精神基线
  • colbert-v2 —— 后续 late-interaction 模型,逐词交互思路的延续
  • anserini-2017 —— 神经 IR 的复现基线工具,DRMM 类工作都用它对比
  • bert —— BERT 来后,DRMM 的”非端到端”成了短板,但”任务本质决定结构”的思想没过时

反向链接

  • anserini-2017 —— Anserini — 把工业搜索引擎 Lucene 改造成学术 IR 实验台
  • bert —— BERT — 双向 Transformer 预训练
  • colbert-2020 —— ColBERT — 让 BERT 检索既准又能扛大规模
  • colbert-v2 —— ColBERTv2 — 让向量检索既精又能扛百万文档
  • knrm-2017 —— K-NRM — 用核函数把交互矩阵变成可微排序信号