Autoregressive Search Engines: Generating Substrings as Document Identifiers

Bevilacqua M., Ottaviano G., Lewis P., Yih W., Riedel S. and Petroni F. Autoregressive search engines: generating substrings as document identifiers. NIPS, 2022.

一种基于语言模型的高效的文档检索方式 (很不错的文章).

SEAL

  • SEAL 的思路很简单:

    1. 给定一个 query \(q\) (大概是对想要的文档的描述);
    2. 语言模型 LM 根据 query 生成一段文本 (这段文本存在于某篇文档中);
    3. 倘若通过上述方式得当的文档不唯一, 计算每个文档的 score 然后筛选出最合适的.
  • 问题1: 如何保证 LM 生成的文本一定在某篇文档中呢? 由于文本的方法现在在自回归的语言模型中, 我们可以这样理解:

    1. 假设我们依旧生成一些 tokens \([t_1, t_2, \ldots, t_k]\) 且这些 tokens 连续地出现在一些文档中;
    2. 然后正常来说, 下一个 token 是这样选择的:

      \[t_{k+1} = \text{argmax}_{t \in \mathcal{T}} \: p(t|p, t_1, t_2,\ldots, t_k). \]

      这里 \(\mathcal{T}\) 表示所有的 tokens.
    3. 但是, 我们这里限制生成范围不是 \(\mathcal{T}\) 而是

      \[\mathcal{T}_{k+1} := \{t \in \mathcal{T}: [t_1, t_2, \ldots, t_{k}, t] \in d, \quad \exist \: d \in \mathcal{D} \}, \]

      \(d \in \mathcal{D}\) 为某篇文档.
  • 问题2: 那么如何快速构建 \(\mathcal{T}_{k+1}\) 呢? 作者是借助 FM-index 实现的 (特别的是, 这里基本的元素不是单一的字符, 而是通过分词模型得到的片段).

  • 上面举了一个例子, 用 token 作为生成的基本单元, 其实作者在实际中是一次性生成多个 (比如 10 个) 作为一组成为 ngrams. 但是这里面就会有一个问题, 我们知道:

    \[p(t_k,t_{k-1}, \ldots, t_1|q) = \prod_{i=1}^k p(t_i|p, t_{i-1},\ldots, t_1), \]

    所以 ngrams 的长度越长概率就会越低.

  • 所以, 为了平衡长度的问题, 作者实际上给每个 ngram 打分是通过如下方式纠正的 (作者说是来自于 BM25 这一分词模型中的灵感, 我没有去看):

    \[w(n, q) = \max(0, \log \frac{p(n|q)(1 - p(n))}{p(n)(1 - p(n|q))}). \]

  • 问题3: 显然, 倘若两篇文章有相同的片段的时候, 且 LM 恰好产生的就是这样的片段, 那么我们检索出来的文章就不唯一, 故作者实际上会同时考虑多个 ngrams, 然后根据如下方式进行一个综合的打分:

    \[W(d, q) = \sum_{n \in K^{(d)}} w(n, q)^{\alpha} \cdot \text{cover}(n, K^{(d)}). \]

    但是, 说实话, 我想不清楚这一块应该怎么实现 (也暂时不想去看源代码).

  • 注: 显然, 没有是需要训练的.

代码

[official]

posted @ 2023-10-29 19:31  馒头and花卷  阅读(78)  评论(0编辑  收藏  举报