Autoregressive Search Engines: Generating Substrings as Document Identifiers
概
一种基于语言模型的高效的文档检索方式 (很不错的文章).
SEAL
-
SEAL 的思路很简单:
- 给定一个 query \(q\) (大概是对想要的文档的描述);
- 语言模型 LM 根据 query 生成一段文本 (这段文本存在于某篇文档中);
- 倘若通过上述方式得当的文档不唯一, 计算每个文档的 score 然后筛选出最合适的.
-
问题1: 如何保证 LM 生成的文本一定在某篇文档中呢? 由于文本的方法现在在自回归的语言模型中, 我们可以这样理解:
- 假设我们依旧生成一些 tokens \([t_1, t_2, \ldots, t_k]\) 且这些 tokens 连续地出现在一些文档中;
- 然后正常来说, 下一个 token 是这样选择的:\[t_{k+1} = \text{argmax}_{t \in \mathcal{T}} \: p(t|p, t_1, t_2,\ldots, t_k). \]这里 \(\mathcal{T}\) 表示所有的 tokens.
- 但是, 我们这里限制生成范围不是 \(\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]