REALM 精读笔记:把"检索"做进预训练的开山之作
论文基本信息
| 项目 | 内容 |
|---|---|
| 论文标题 | REALM: Retrieval-Augmented Language Model Pre-Training |
| arXiv 编号 | 2002.08909 |
| 发表会议 | ICML 2020 |
| 作者机构 | Google Research(Kelvin Guu, Kenton Lee, Zora Tung, Panupong Pasupat, Ming-Wei Chang) |
| 发布时间 | 2020 年 2 月 |
| 核心贡献 | 首次将"检索"操作融入语言模型预训练阶段,用掩码语言建模(MLM)信号无监督训练检索器 |
阅读地图
本文按以下顺序展开精读,建议新手依次阅读:
- Abstract:了解 REALM 是什么、解决什么问题、结果如何
- Introduction:理解为何要把检索做进预训练(动机)
- Section 2 REALM 方法(核心,重点阅读):
- 2.1 生成式建模框架:REALM 如何形式化"检索 + 预测"
- 2.2 知识检索器(Knowledge Retriever):如何用向量内积找文档
- 2.3 知识增强编码器(Knowledge-Augmented Encoder):如何利用检索到的文档做预测
- 2.4 预训练:如何用 MLM 信号训练检索器(最难理解,本文重点讲解)
- 2.5 显著跨度遮蔽(Salient Span Masking)与异步 MIPS 索引刷新 - Section 4 实验:Open-domain QA 结果,与 T5、ORQA 对比
- REALM 与 RAG 的关系:总结区别与联系
术语速查(首次出现必看)
| 术语 | 全称 | 一句话解释 |
|---|---|---|
| MLM | Masked Language Modeling,掩码语言建模 | BERT 式预训练目标:随机遮掉一些词,让模型猜出被遮掉的词 |
| MIPS | Maximum Inner Product Search,最大内积搜索 | 在海量向量中快速找出与查询向量内积最大(即最相似)的 Top-K 向量的算法 |
| Latent Variable | 隐变量 | 模型内部没有直接观察到的中间变量;此处"检索了哪篇文档"就是隐变量 |
| Open-domain QA | 开放域问答 | 回答问题时不预先指定知识来源,需要模型自己从整个知识库(如全维基百科)找答案 |
| ORQA | Open-Retrieval Question Answering | REALM 之前的工作,也用了隐变量检索,但只在微调阶段训练检索器 |
| RAG | Retrieval-Augmented Generation | Facebook 2020 年提出的检索增强生成框架,在结构上与 REALM 相似,但侧重生成式问答 |
Abstract 精读
原文
"Language model pre-training has been shown to capture a surprising amount of world knowledge, crucial for NLP tasks such as question answering. However, this knowledge is stored implicitly in the parameters of a neural network, requiring ever-larger networks to cover more facts. To capture knowledge in a more modular and interpretable way, we augment language model pre-training with a latent knowledge retriever, which allows the model to retrieve and attend over documents from a large corpus such as Wikipedia, used during pre-training, fine-tuning and inference. For the first time, we show how to pre-train such a knowledge retriever in an unsupervised manner, using masked language modeling as the learning signal, and backpropagating through a retrieval step that considers millions of documents. We demonstrate the effectiveness of Retrieval-Augmented Language Model pre-training (REALM) on the challenging task of Open-domain Question Answering (Open-QA). We compare against state-of-the-art models for both explicit and implicit knowledge storage on three popular Open-QA benchmarks, and find that we outperform all previous methods by a significant margin (4–16% absolute accuracy), while also providing qualitative benefits such as interpretability and modularity."
翻译
语言模型预训练已被证明能够捕捉到大量世界知识,这对问答等 NLP 任务至关重要。然而,这些知识被隐式地存储在神经网络的参数中,若要涵盖更多事实则需要越来越大的网络。为了以更模块化、更可解释的方式存储知识,我们用一个隐式知识检索器来增强语言模型预训练,使模型能够在预训练、微调和推理阶段,检索并注意到来自大型语料库(如维基百科)中的相关文档。我们首次展示了如何以无监督方式预训练这样的知识检索器,以掩码语言建模作为学习信号,并通过涉及数百万文档的检索步骤进行反向传播。我们在开放域问答(Open-QA)这一极具挑战性的任务上验证了检索增强语言模型预训练(REALM)的有效性,并在三个流行的 Open-QA 基准上与当前最优方法进行比较,发现我们以显著优势(4–16% 绝对精度提升)超越所有之前的方法,同时还提供了可解释性、模块化等定性优势。
新手讲解
核心问题:知识放在哪里?
想象 BERT、GPT 这样的大模型就像一个"死记硬背"的学霸:把教科书里所有知识全部背进脑子里。这样做的坏处很明显——
- 大脑(参数)的容量有限,知识越多,需要的"大脑"越大;
- 知识更新了(比如某国换了总统),整个模型就得重新训练;
- 模型用了哪些知识来回答问题?完全看不出来(不可解释)。
REALM 的思路:学生+图书馆
REALM 的思路是:与其让模型把所有知识背下来,不如给它一座"图书馆"(维基百科),让它学会查资料。回答问题时,先去图书馆找几篇相关文章,再基于这些文章给出答案。
关键创新点在于:REALM 在预训练阶段就教会模型去查图书馆,而不是先预训练、再在下游任务上加个检索头。用考试打比方就是:REALM 是从小就培养"查阅资料"的能力,而不是先把所有知识背完再临时学怎么用字典。
Section 1 Introduction 精读
原文(核心段落)
"We propose Retrieval-Augmented Language Model pre-training (REALM). Unlike previous approaches, the retriever is trained using performance-based signals from unsupervised text: a retrieval that improves the language model's perplexity is helpful, and one that does not is unhelpful. This requires backpropagating through a retrieval step that considers millions of documents."
翻译
我们提出了检索增强语言模型预训练(REALM)。与之前的方法不同,检索器使用来自无监督文本的基于性能的信号来训练:能够降低语言模型困惑度的检索是有用的,反之则是无用的。这需要通过涉及数百万文档的检索步骤进行反向传播。
新手讲解
什么叫"基于性能的信号"?
REALM 的训练信号来自 MLM(掩码语言建模):把句子里某个词盖住,让模型猜这个词。检索器的评价标准就是:"你检索到的文档,有没有帮助模型猜对那个被遮住的词?"
如果检索到的文档让模型猜对了(困惑度下降),就给检索器正奖励;如果检索到的文档没帮上忙,就给负信号。这就是"无监督训练检索器"——不需要人工标注"哪篇文章和这道题相关",完全靠语言建模的预测准确度来评判。
为什么"反向传播通过数百万文档"是个难题?
正常的反向传播是:计算损失 → 求梯度 → 更新参数。但这里,模型要从数百万篇文章中选出最有用的,而每篇文章都需要独立计算一个嵌入向量(embedding)。如果暴力计算,每次训练迭代都要处理数百万个向量,计算量极大。REALM 用 MIPS(最大内积搜索)和异步索引刷新来解决这个问题(详见后面章节)。
原文(动机段落)
"We demonstrate the value of REALM on the task of Open-domain Question Answering (Open-QA), which requires systems to answer questions using a large corpus of documents... Tasks that require recalling and reasoning over factual information are well suited to benefit from explicit knowledge retrieval."
翻译
我们在开放域问答(Open-QA)任务上展示了 REALM 的价值,该任务要求系统使用大型文档语料库来回答问题……需要调用和推理事实信息的任务非常适合从显式知识检索中获益。
新手讲解
为什么选 Open-QA 作为验证任务?因为这类问题(比如"迈克尔·乔丹是哪年出生的?")答案是确定的事实,需要模型从海量知识中精确检索,而不能靠语言逻辑推理"猜"出来。这正是 REALM"显式检索"的用武之地。
Section 2 REALM 方法全部段落精读
2.1 生成式建模框架(Generative Process)
原文
"REALM decomposes p(y|x) as a two step process: first retrieve, then predict. Given an input x, we first retrieve a document z from a knowledge corpus Z, and then use z to predict y:
p(y|x) = Σ_{z∈Z} p(y|z,x) · p(z|x)
where Z is a large corpus (e.g. Wikipedia). This marginalizes over all possible documents z ∈ Z weighted by the probability of retrieval p(z|x)."
翻译
REALM 将 p(y|x) 分解为两步:先检索,再预测。给定输入 x,我们首先从知识语料库 Z 中检索文档 z,然后用 z 来预测 y:
p(y|x) = Σ_{z∈Z} p(y|z,x) · p(z|x)
其中 Z 是一个大型语料库(如维基百科)。这个公式对所有可能的文档 z∈Z 进行边际化(marginalization),每篇文档的权重是其被检索到的概率 p(z|x)。
新手讲解
这个公式到底在说什么?
用一个超简单的例子来理解。假设问题 x = "谁写了《哈姆雷特》?",答案 y = "莎士比亚"。语料库 Z 有三篇文章:
- 文章 A:"《哈姆雷特》是莎士比亚创作的悲剧" → 非常相关,p(A|x) = 0.8
- 文章 B:"戏剧发展简史" → 有点相关,p(B|x) = 0.15
- 文章 C:"量子力学基础" → 完全不相关,p(C|x) = 0.05
然后分别算,给定每篇文章,答案是"莎士比亚"的概率:
- p(y="莎士比亚" | A, x) = 0.95(文章 A 直接说了答案)
- p(y="莎士比亚" | B, x) = 0.3(文章 B 有些提示)
- p(y="莎士比亚" | C, x) = 0.01(文章 C 完全没帮助)
最终答案的概率 = 0.8×0.95 + 0.15×0.3 + 0.05×0.01 ≈ 0.806
这就是"边际化"(marginalization):把所有文档的贡献加权求和。
为什么叫"隐变量"(Latent Variable)?
因为"检索了哪篇文档 z"这个过程在最终结果里看不到——我们只看到问题 x 和答案 y,中间选了哪篇文章是"隐藏"的。这种"中间有个看不见的决策步骤"的建模方式,在统计学里就叫隐变量模型。
实际计算时不可能遍历所有文档
维基百科有几百万篇文章,真的对所有文章求和太慢。REALM 的近似方法是:只对 Top-K 篇(K=8,预训练时)概率最高的文档求和,其余的概率极低可以忽略。
2.2 知识检索器(Knowledge Retriever)
原文
"The retriever uses a dense inner product model to compute p(z|x). Specifically, the relevance score between a query x and a document z is defined as:
f(x,z) = Embed_input(x)^T · Embed_doc(z)
where Embed_input and Embed_doc are embedding functions that map input and document to d-dimensional vectors.
p(z|x) = exp f(x,z) / Σ_{z'} exp f(x,z')
Both embedding functions use BERT-style Transformers. Specifically:
Embed_input(x) = W_input · BERT_CLS( join(x) )
Embed_doc(z) = W_doc · BERT_CLS( join(z_title, z_body) )where join(·) denotes [CLS] x [SEP] formatted input, and BERT_CLS(·) indicates the [CLS] token's output vector."
翻译
检索器使用稠密内积模型来计算 p(z|x)。具体而言,查询 x 和文档 z 之间的相关性得分定义为:
f(x,z) = Embed_input(x)^T · Embed_doc(z)
其中 Embed_input 和 Embed_doc 是将输入和文档分别映射到 d 维向量的嵌入函数。
p(z|x) = exp f(x,z) / Σ_{z'} exp f(x,z')
两个嵌入函数都使用 BERT 风格的 Transformer。具体地:
- Embed_input(x) = W_input · BERT_CLS( [CLS] x [SEP] )
- Embed_doc(z) = W_doc · BERT_CLS( [CLS] z_title [SEP] z_body [SEP] )
其中 [CLS] token 的输出向量作为序列的整体表示,再通过线性变换 W_input / W_doc 投影到嵌入空间。
新手讲解
稠密向量检索是什么?
传统的关键词搜索(BM25、TF-IDF)是"词语匹配"——检查问题里的词有没有出现在文章里。稠密检索(Dense Retrieval)完全不同:把问题和文章都压缩成一个固定长度的向量(比如 128 维),然后用向量点积(内积)来衡量相关程度。点积越大,说明两个向量方向越相近,内容越相关。
查询向量 q = [0.8, 0.1, 0.5, ...] ← 问题经过BERT编码
文章向量 d = [0.7, 0.2, 0.4, ...] ← 文章经过BERT编码
相关性分数 f = q · d = 0.8×0.7 + 0.1×0.2 + 0.5×0.4 + ...
为什么要分两个 BERT(Embed_input 和 Embed_doc)?
问题和文档的"语义结构"不一样——问题通常是短句,文档有标题+正文。用两套独立的参数(W_input 和 W_doc 是两个不同的线性变换矩阵)让模型分别学习如何表示问题和文档,效果更好。
p(z|x) 的 Softmax 是什么意思?
Softmax 把所有文档的得分转化成概率分布,保证所有文档的概率加起来等于 1。得分高的文档被检索到的概率大,得分低的文档概率趋近于 0。
MIPS 是什么,为什么需要它?
维基百科有 1300 多万个文档块(288 个词片/块)。如果每次都要把查询向量和全部 1300 万个文档向量做内积,速度极慢。MIPS(Maximum Inner Product Search,最大内积搜索)是一种近似算法,利用特殊的索引结构(如 FAISS)可以在毫秒级时间内找到内积最大的 Top-K 个文档,而不需要暴力遍历全部向量。
类比:图书馆有 1000 万本书,你不能一本本翻目录,但可以先找到相关的书架,再在书架上找,大大缩短时间——MIPS 就是这个"智能目录"。
2.3 知识增强编码器(Knowledge-Augmented Encoder)
原文
"Given the input x and a retrieved document z, the knowledge-augmented encoder defines p(y|z,x). We join x and z into a single sequence fed to a Transformer (distinct from the ones used in the retriever), which allows us to perform rich cross-attention between x and z before predicting y.
For masked language modeling, the model predicts each masked token y_j:
p(y_j|z,x) ∝ exp( w_j^T · BERT_MASK(j)( join(x, z_body) ) )
For Open-QA, we extract a span from the retrieved document z. We find all candidate spans s within z that match the answer y, and compute:
p(y|z,x) ∝ Σ_{s∈S(z,y)} exp( MLP( [h_START(s); h_END(s)] ) )
where h_START(s) and h_END(s) are the Transformer output vectors at the start and end tokens of span s."
翻译
给定输入 x 和检索到的文档 z,知识增强编码器定义 p(y|z,x)。我们将 x 和 z 拼接成一个序列,输入给一个(与检索器独立的)Transformer,从而在预测 y 之前让 x 和 z 之间进行充分的交叉注意力(cross-attention)。
预训练(MLM)时,模型预测每个被遮住的词 y_j:
p(y_j|z,x) ∝ exp( w_j^T · BERT_MASK(j)( [CLS] x [SEP] z_body [SEP] ) )
Open-QA 微调时,模型从检索到的文档 z 中抽取答案片段:
p(y|z,x) ∝ Σ_{s∈S(z,y)} exp( MLP( [h_START(s); h_END(s)] ) )
其中 h_START(s) 和 h_END(s) 是答案片段 s 的首尾 token 在 Transformer 中对应的输出向量。
新手讲解
两个任务,同一个编码器
知识增强编码器要干两件事:
-
预训练时(MLM):给定问题+文档,猜被遮住的词。比如:
- 输入:"[CLS] The capital of France is [MASK]. [SEP] Paris is located in northern France... [SEP]"
- 编码器看到了文档里有"Paris is located",就能猜出 [MASK] = "Paris" -
微调做 Open-QA 时:给定问题+文档,找到答案在文档中的位置(答案片段,即 span)。比如:
- 问题:"Who wrote Hamlet?"
- 文档:"Hamlet is a tragedy written by William Shakespeare."
- 模型需要找到"William Shakespeare"这个片段的起止位置
为什么要把 x 和 z 拼成一个序列?
因为 Transformer 的注意力机制(attention)可以让问题的每个词"关注"文档的每个词,从而深度理解"这篇文章的哪部分回答了我的问题"。如果分开处理,就失去了这种交互能力。
MLP([h_START; h_END]) 是什么?
这是答案片段的评分函数。h_START 是答案开始位置的隐藏状态向量,h_END 是答案结束位置的隐藏状态向量,把它们拼在一起,用一个小型全连接网络(MLP)打分,分数越高说明这个片段越可能是答案。
2.4 预训练:如何用 MLM 无监督训练检索器
原文
"The training objective for REALM pre-training is to maximize the log-likelihood log p(y|x) over all pre-training examples (x,y)—which is the same as standard BERT MLM pre-training. The key difference is that computing p(y|x) involves marginalizing over Z, which makes it non-trivial to compute and differentiate.
To train the retriever, we need to compute the gradient of log p(y|x) with respect to the retriever parameters θ. The key insight is that the gradient can be written as:
∇ log p(y|x) = Σ_z r(z) · ∇ log p(z|x)
where r(z) = [p(y|z,x)/p(y|x) − 1] · p(z|x)
This means: if a document z is more helpful than average in predicting y (i.e., p(y|z,x) > p(y|x)), it receives positive gradient update; otherwise, it is discouraged."
翻译
REALM 预训练的目标函数是在所有预训练样本 (x,y) 上最大化对数似然 log p(y|x)——这与标准 BERT 的 MLM 预训练目标相同。关键区别在于,计算 p(y|x) 需要对所有文档 Z 做边际化,这使得计算和求导都变得复杂。
为了训练检索器,我们需要对检索器参数 θ 求 log p(y|x) 的梯度。关键洞察是,梯度可以写为:
∇ log p(y|x) = Σ_z r(z) · ∇ log p(z|x)
其中 r(z) = [p(y|z,x)/p(y|x) − 1] · p(z|x)
这意味着:如果文档 z 在预测 y 时比平均水平更有帮助(即 p(y|z,x) > p(y|x)),则检索器会被鼓励更多地检索 z;反之,检索器会被抑制。
新手讲解
这是整篇论文最核心、最难理解的部分,我们一步步拆解。
第一步:目标是什么?
预训练时,输入 x 是一个带 [MASK] 的句子,y 是被遮住的词(比如"Paris")。我们希望最大化 log p(y|x),即"模型正确猜出 Paris 的概率"尽量大。
第二步:p(y|x) 怎么算?
p(y|x) = Σ_z p(y|z,x) · p(z|x)
这是一个加权平均:对每篇文档,先算"给了这篇文档,猜对的概率",再乘以"选到这篇文档的概率",全部加起来。
第三步:梯度怎么传给检索器?
梯度公式 r(z) = [p(y|z,x)/p(y|x) − 1] · p(z|x) 有一个非常优美的直觉:
- r(z) > 0 的条件:p(y|z,x)/p(y|x) > 1,即这篇文档让答对的概率高于平均水平
→ 梯度正向,检索器学会更多检索这类文档 - r(z) < 0 的条件:p(y|z,x)/p(y|x) < 1,即这篇文档让答对的概率低于平均水平
→ 梯度负向,检索器学会减少检索这类无用文档
类比:这就像一个"强化学习"的信号——检索器检索出的文档"有用"就得奖励,"没用"就受惩罚,但全程不需要人工标注哪篇文档是相关的。
第四步:实际计算时的近似
边际化对全部文档求和太慢,所以实际只对 Top-K 文档求和:
- 预训练时 K=8
- 推理时 K=5
其余文档的 p(z|x) 极小,忽略不计。
这就是 REALM 的核心创新:
- 标准 BERT:参数存知识,越学越"肥"
- REALM:检索器+编码器分工,检索器知道"去哪找",编码器知道"怎么用",两者在预训练时联合优化
2.5 异步 MIPS 索引刷新(Asynchronous MIPS Refresh)
原文
"In order to compute p(z|x) using MIPS, we need to pre-compute Embed_doc(z) for all documents z in the corpus. As we update the retriever parameters θ, these pre-computed embeddings become stale. We handle this by asynchronously refreshing the index: the trainer sends the index builder a snapshot of parameters θ', and the index builder rebuilds the document index in the background. As soon as the new index is ready, it is passed back to the trainer. With this setup, the MIPS index is re-built approximately every 500 training steps."
翻译
为了使用 MIPS 计算 p(z|x),我们需要预先计算语料库中所有文档 z 的 Embed_doc(z)。随着检索器参数 θ 不断更新,这些预计算的嵌入向量会变得"过时"(stale)。我们通过异步刷新索引来解决这个问题:训练器将当前参数快照 θ' 发送给索引构建器,索引构建器在后台重建文档索引。一旦新索引准备好,就传回给训练器。在这种设置下,MIPS 索引大约每 500 个训练步骤重建一次。
新手讲解
为什么索引会"过时"?
MIPS 检索需要预先把所有文档都编码成向量,存进索引。但是在预训练过程中,编码器的参数(权重)一直在更新,这意味着同一篇文档的"向量表示"会不断变化。如果索引里存的还是旧参数算出来的向量,检索结果就会不准确——就像用上个月的地图导航,很多路可能已经变了。
为什么不能每步都刷新?
重建全部 1300 万文档的向量索引需要大量计算时间,不可能每个训练步都做。异步刷新的思路是:训练和索引构建并行进行:
主训练进程:参数更新 → 参数更新 → ... → 获取新索引 → 继续更新
后台进程: 收到参数快照 → 重建索引 → 发送回主进程
每 500 步刷新一次,虽然在这 500 步内索引稍微"陈旧",但实验证明这在可接受范围内(详见消融实验)。
实验验证的重要性
论文消融实验表明:如果把刷新频率降低 30 倍(大约每 15000 步才刷新一次),NaturalQuestions-Open 上的精度从 38.2% 骤降到 28.7%(相差近 10 个百分点)。说明索引不能太陈旧,必须保持一定的刷新频率。
2.6 显著跨度遮蔽(Salient Span Masking)
原文
"During REALM pre-training, we use salient span masking: we mask salient spans such as named entities and dates, which are more likely to require world knowledge. Specifically, we use a BERT-based tagger trained on CoNLL-2003 data to identify named entities, and use regular expressions to identify dates. We then randomly sample one of these salient spans to mask."
翻译
在 REALM 预训练期间,我们使用显著跨度遮蔽:我们遮蔽命名实体和日期等显著片段,这些片段更可能需要世界知识。具体地,我们使用在 CoNLL-2003 数据上训练的 BERT 实体标注器来识别命名实体,并用正则表达式识别日期。然后随机抽样其中一个显著片段进行遮蔽。
新手讲解
为什么要专门遮住"命名实体"和"日期"?
普通 BERT 的随机遮蔽可能遮住"的""了""是"这样的虚词——模型根本不需要检索外部知识就能猜对(靠语法规律就够了)。而 REALM 想让检索器学到"什么时候该去查资料",所以要专门遮住需要知识才能猜对的词:
- "北京是 [MASK] 的首都" → 遮住"中国",模型需要知识才能答对
- "莎士比亚生于 [MASK] 年" → 遮住"1564",模型需要查资料
遮住这类词,检索器才有动力去找有用的文档,而不是仅靠上下文语法推理。
消融实验数据
| 遮蔽策略 | NQ dev 精度 |
|---|---|
| 显著跨度遮蔽(REALM) | 38.2% |
| 随机片段遮蔽 | 35.3% |
| 随机均匀遮蔽(BERT默认) | 32.3% |
显著跨度遮蔽带来约 6% 的绝对提升,说明"遮什么"对检索器的训练质量至关重要。
2.7 空文档(Null Document)与冷启动初始化
原文
"Null document: Since retrieval may not always be necessary, we add a null document ∅ to Z. This allows the model to perform conditional prediction p(y|∅, x) when no documents need to be retrieved.
Warm-starting with the Inverse Cloze Task (ICT): If the retriever is randomly initialized, it will retrieve random documents and the knowledge-augmented encoder will learn to ignore them. To avoid this cold-start problem, we warm-start the retriever using the Inverse Cloze Task (ICT), where given a sentence, the model is trained to retrieve the document it came from."
翻译
空文档:由于检索并非总是必要的,我们在 Z 中加入一个空文档 ∅。这允许模型在不需要检索任何文档时执行条件预测 p(y|∅, x)。
用逆填空任务(ICT)热启动:如果检索器被随机初始化,它会检索到随机文档,知识增强编码器就会学会忽略检索结果(因为检索结果通常没用)。为了避免这种冷启动问题,我们用逆填空任务(ICT)对检索器进行热启动:给定一个句子,训练模型去检索该句子原本所在的文档。
新手讲解
为什么需要空文档?
不是每道题都需要查外部资料。比如"2 + 2 = ?",根本不需要去检索维基百科。如果强制每次都检索文档,有时候反而会引入噪声。空文档就像一个"不查资料"的选项,让模型自己决定是否需要检索。
冷启动问题是什么?
设想检索器一开始是随机初始化的——随机参数产生随机向量,随机向量检索出来的是随机文档(基本都是乱的、无关的)。编码器发现检索结果从来没用,就会"学会"忽略检索结果,只靠输入本身作预测。这样检索器就永远学不到有用的东西了,形成恶性循环。
ICT 是如何解决这个问题的?
逆填空任务(Inverse Cloze Task):
- 正常填空:给定文档,预测句子里被遮住的词
- 逆填空:给定一个句子,预测这个句子来自哪篇文档
通过 ICT,检索器在正式预训练前就学会了"根据一段文字找到相关文档"的基本能力,从而有一个合理的初始状态(而不是随机乱猜)。这样预训练一开始,检索就能找到相对相关的文档,编码器才有动力使用检索结果。
Section 4 实验结果精读(Open-domain QA)
4.1 实验设置
数据集
| 数据集 | 简介 | 训练集大小 | 测试集大小 |
|---|---|---|---|
| NaturalQuestions-Open (NQ) | 来自真实 Google 搜索的问题,答案是维基百科中的短文本片段 | 79,168 | 3,610 |
| WebQuestions (WQ) | 来自 Google 搜索推荐的问题 | 3,417 | 2,032 |
| CuratedTrec (CT) | 来自搜索引擎用户查询 | 1,125 | 694 |
知识语料库
- Wikipedia:维基百科文章切分为 288 个词片段(word-pieces)的块,共约 1300 万个文档块
- CC-News:Common Crawl 新闻文章,用于与 Wikipedia 对比
基线方法
| 方法类型 | 代表模型 | 核心思路 |
|---|---|---|
| 生成式(参数知识) | T5-11B | 把问题直接喂给 T5,靠模型参数里存储的知识生成答案 |
| 检索 + 抽取(稀疏检索) | DrQA、BM25+Reader | 用关键词搜索找文档,再从文档中抽取答案片段 |
| 检索 + 抽取(隐变量检索) | ORQA | 用可学习的检索器,但只在微调阶段训练检索器 |
4.2 主要结果
原文
"Table 1 shows the main results. REALM outperforms all previous approaches on all three datasets. The improvement over ORQA is particularly notable, since ORQA uses an identical fine-tuning setup—the gains come purely from REALM's pre-training. Compared to T5-11B (which has 30× more parameters), REALM achieves comparable or better results while using far fewer retrieval candidates (5 vs. 20–80)."
翻译
表1 展示了主要结果。REALM 在三个数据集上均超越了所有先前方法。与 ORQA 相比的提升尤为显著,因为 ORQA 使用完全相同的微调设置——提升完全来自 REALM 的预训练阶段。与 T5-11B(参数量是 REALM 的 30 倍)相比,REALM 在使用更少检索候选文档(5 篇 vs. 20–80 篇)的情况下实现了相当或更好的结果。
核心数据表格
| 模型 | NaturalQuestions-Open | WebQuestions | CuratedTrec |
|---|---|---|---|
| DrQA(稀疏检索) | 29.8% | - | - |
| ORQA(隐变量检索,无REALM预训练) | 33.3% | 36.4% | 30.1% |
| T5-11B(纯生成,参数存知识) | 34.5% | 37.4% | - |
| REALM(Wikipedia) | 39.2% | 40.2% | 46.8% |
| REALM(CC-News) | 40.4% | 40.7% | 42.9% |
新手讲解
几个关键对比
-
REALM vs ORQA(最公平的比较):
- 两者使用完全相同的微调流程,唯一区别是预训练方式
- REALM 在 NQ 上比 ORQA 高出约 6 个百分点(39.2% vs 33.3%)
- 结论:把检索做进预训练阶段,带来了真实的性能提升 -
REALM vs T5-11B(大卫战歌利亚):
- T5-11B 有 110 亿参数,是 REALM 的约 30 倍
- REALM 只检索 5 篇文档,T5-11B 不检索任何文档(靠参数存知识)
- REALM 在 NQ 上超越 T5-11B(39.2% vs 34.5%)
- 结论:显式检索比扩大参数量更高效 -
REALM(Wikipedia) vs REALM(CC-News):
- CC-News 版本在 NQ 和 WQ 上略优,但 CuratedTrec 上略差
- 说明知识语料库的质量和领域对结果有影响
4.3 消融实验(关键组件的重要性)
数据
| 实验条件 | NQ dev 精度 |
|---|---|
| 完整 REALM(最优设置) | 38.2% |
| 只有 REALM 检索器 + 普通编码器 | 37.4% |
| 普通检索器 + 只有 REALM 编码器 | 35.3% |
| 两者均无 REALM 预训练(等同ORQA) | 33.2% |
| 随机片段遮蔽(替换显著跨度遮蔽) | 35.3% |
| 随机均匀遮蔽(BERT默认) | 32.3% |
| 索引刷新频率降低30倍 | 28.7% |
新手讲解
消融实验的意义
消融实验(Ablation Study)就是"逐一去掉某个组件,看性能下降多少",从而判断每个组件有多重要。
从数据可以看出:
- 检索器和编码器都从 REALM 预训练中受益,去掉任何一个都会下降
- 两者联合预训练的效果(38.2%)优于单独预训练任一组件的效果,说明两者有协同效应
- 显著跨度遮蔽非常关键(38.2% vs 32.3%,差 6 个点)
- 索引刷新频率也很关键(38.2% vs 28.7%,差近 10 个点),说明陈旧的索引会严重损害检索质量
REALM 与 RAG 的关系
两篇论文的定位
| 维度 | REALM(2020.02, Google) | RAG(2020.05, Facebook) |
|---|---|---|
| 论文全称 | Retrieval-Augmented Language Model Pre-Training | Retrieval-Augmented Generation for Knowledge-Intensive NLP |
| 核心侧重 | 把检索做进预训练阶段 | 把检索做进生成式问答(seq2seq) |
| 检索器训练 | 预训练阶段就训练检索器(MLM信号) | 端到端微调时才训练检索器 |
| 生成方式 | 抽取式(从文档片段中抽取答案span) | 生成式(用seq2seq模型生成答案文本) |
| 预训练语料库 | Wikipedia 文档块(1300万个288词片段) | Wikipedia 文档块(相同数据集) |
| 检索器架构 | 双塔 BERT(DPR 风格) | 双塔 BERT(DPR,事实上两者共享检索架构思路) |
| 任务范围 | 专注 Open-domain QA | 覆盖更广的知识密集型NLP任务 |
| 历史地位 | 首个将检索融入预训练的工作 | 将检索+生成推广到更通用场景 |
核心区别
REALM 是"预训练即检索":
- 预训练时就让检索器参与训练
- 模型在学习语言知识的同时就学会了"何时查、查什么"
- 知识检索能力内置在预训练模型里,微调时检索器已经很强
RAG 是"微调时引入检索":
- 预训练用标准语言模型(BART/T5),不涉及检索
- 在下游任务微调时引入检索组件
- 更灵活(可以换不同的预训练模型),但检索能力需要靠微调数据来建立
对后续工作的影响
REALM 和 RAG 共同开创了"检索增强"这一范式,直接影响了:
- DPR(Dense Passage Retrieval,2020.04):标准化了双塔密集检索器的训练方式
- FiD(Fusion-in-Decoder,2020.07):把多篇检索文档分别编码,在解码器中融合
- Atlas(2022.08):将 REALM 的预训练检索思路扩展到更大规模
- 当代 RAG 应用:ChatPDF、企业知识库等产品背后的核心技术原型
总结:REALM 的核心贡献
五个关键创新
- 预训练即检索:首次在预训练阶段就引入可学习的检索器,而不是仅在下游微调时使用
- MLM 作为检索训练信号:无需人工标注相关文档,完全用掩码预测的准确性来评价检索质量
- 可微分检索:通过 MIPS + 梯度近似,实现了检索步骤的端到端反向传播
- 异步索引刷新:解决了"嵌入向量随训练变化导致 MIPS 索引过时"这一工程难题
- 显著跨度遮蔽:让预训练任务聚焦于真正需要世界知识的预测,大幅提升检索器质量
一句话理解 REALM
REALM 让语言模型在"读书"(预训练)的过程中就养成了"查字典"(检索)的习惯,而不是等到考试(下游任务)才临时学怎么用字典。
可略过的章节
- Section 5 相关工作:讨论与早期知识增强 LM、检索式 QA、记忆网络等工作的关系,可选读
- 附录:包含超参数设置、数据集详情、更多实验对比;实现时参考,精读可略过
精读完成 | 覆盖章节:Abstract / Introduction / Section 2 全部(2.1~2.7)/ Section 4 实验结果与消融分析 | 约 8500 字