Internet-augmented language models through few-shot prompting for open-domain question answering阅读笔记

发布时间 2023-10-18 18:10:30作者: Alouette29

Internet-augmented language models through few-shot prompting for open-domain question answering

 

其实我没怎么正经读过论文,尤其是带实验的,我目前认真读过的(大部头)也就是一些LLM的综述。记录这个文档主要是防止自己读着读着玩手机去了/注意力不集中了跑路了/没记录困惑导致最后困惑过多还完全不记得具体有哪些。而且我读论文的风格和做英语阅读/翻译一样的,我也不知道这样好不好。

那就先读着,按读的顺序写碎碎念,有什么不懂的有什么问题的都写;读完后整体勘误(把我的错误理解这样划掉,然后换个颜色纠正;最后整理出本文的motivation、method、dataset、experiment、conclusion等等。原文内容经过我理解而说的就用正常字,差不多只做了翻译处理的就用红字,介于两者之间的意译就用蓝字。所以红字部分的可信度更高,除非是我理解和翻译出错。并且我个人不喜欢在非必要的地方夹杂英文,所以我夹杂的英文要么是约定俗成的术语,要么是表述清晰的必要。

这是2022.3.10放到arxiv的一篇文章,在谷歌学术可以看到目前为止总共81引用。4个作者都是DeepMind的研究员。

 

实况碎碎念

摘要

LLM有few-shot的能力,也就是自己内部已经有足够的知识,所以少量外界的专业指导(prompt)就可以使它学会你要教它的特定领域的内容。本文利用这种能力来克服一些关于事实性和时效性信息的挑战。因为有时候大模型出现幻觉(hallucination)会说胡话,不符合事实性;ChatGPT为例,所涉及的知识只到2021也不会上网,不符合时效性。

半参数模型就是根据检索到的外部evidence作为依据,受到半参数模型的影响,我们用few-shot prompting的方法去学习一个条件语言模型,它基于Google搜索返回的信息,这些信息非常广泛而且实时更新。本文的方法不涉及学习新参数或者微调,所以适合任何LM,提供了一个强baseline。在open-domain QA上,LM conditioned on the web超过了同等规模甚至更大的closed-book LM。这不废话吗!开卷闭卷考试能一样吗,肯定是开卷的人答得好啊!

我们发现增加推理时模型的计算,也就是用多个检索到的evidence生成多个答案,再做一次reranking,就可以缓解更小的few-shotLM的性能下降。总之,重点不是卷巨大模型,而是找到更有效利用模型的方法,包括但不限于更好的prompt,或者增加推理时计算。

读完摘要的感觉是害怕这篇的想法太简单了,不过总之问题不大,正好适合我入手。而且因为简单所以通用,如果还效果好就更好了。

 

6. Discussion

没错我直接来看看结论部分,result看了前面实验才能看懂,有很多定量的东西,先来看看定性的描述,大概了解这篇工作的定位。

我们这个方法很直接,它的核心在于结合了这两个:LLM强大的few-shot能力,和SOTA的检索模型(比如Google Search)。尽管方法简单,但是在open-domain QA上提高模型的真实性,非常有效,而且对大中小模型都有提升,很多时候更小的open-book model可以超过更大的few-shot closed-book model。根据检索到的evidence生成多个答案再reranking可以进一步提升。我们的方法提供了强大的baseline,可以应用于各种各样的LM。

上面这段话基本和摘要一样。这里再次提到泛用性,我觉得主要是LLM参数量太大,训练和微调都非常慢且烧钱,但是prompt就不用改变参数所以不用烧这个钱,所以可以应用于各种各样的LM。

主流观点把增加模型参数看做提升few-shot能力的主要途径,然而这个研究表明,推理类型的干预(更有效地利用few-shot能力、增加推理时计算)有很大收益。所以这可能会减缓大模型的竞争,转而去寻找更有效利用现有模型的方式。

这基本也和摘要一样。

 

Limitations

LLM仍然比不过微调过的(甚至更小的)模型,本工作缩小了在open-domain QA任务上的差距,却还是落后于in-domain的微调模型。

我查了一下in-domain是什么意思,在Quora得到了回答,翻译如下:

Assume you have two datasets: Dataset A (text data from newspapers) and Dataset B (text data from Wikipedia).

Now, we train a Machine Learning Model using the newspaper dataset (i.e. Dataset A). After training, we can feed the two datasets into our newly trained model to create predictions. If we use Dataset A as input, it is called in-domain data and on the other hand, if we use Dataset B as input, it is called out-domain data.

Open-domain data is something that is not limited to a single domain. For example, a new Dataset C that is a mixture of Dataset A and Dataset B.

假设你有数据集A(来自报纸的文本数据)和B(来自Wikipedia的文本数据),用数据集A训练一个ML模型。输入数据来用这个模型进行预测,如果输入A就是in-domain data,输入B就是out-domain data,open-domain data就更加随意,比如把A和B混合起来作为输入。

也就是说,LLM是通用的,而在某个特定领域任务上它比不过那个领域专门训练的模型(训练数据和实际使用时候的输入数据都是这个领域的),哪怕那个专门的模型比LLM规模更小。

对于推理任务,我们的干预只能提高最大规模的那部分模型。对更小的模型无法提升推理能力,并且说到这里,我还不知道该如何衡量一个模型的推理能力?用什么标准、做什么实验,之类的。

并且我们虽然考虑了广泛的QA数据集,但是目前的实验只捕获了很小一部分简单的用户交互,而用户交互恰恰是很看重真实性的。也就是在实际生活使用场景,实验还是做得有所不足。

 

最后的总结段也是大差不差,就跳过了,该说的在摘要和本节都说到了。

 

1. Introduction

LLM有强大的生成能力,更大的规模使得few-shot learning变成了LM的一种决定性的新范式。(描述了各种发展和成功)但是仍然存在一个致命短板就是幻觉,可能是因为检索到的错误知识保存在模型参数里了,可能是模型拥有的知识不完整或者过时。解决LLM真实性问题需要flexible和robust的方法,以便迁移到不同的领域和任务上。

(然后给出了半参数模型的那篇论文,把摘要差不多的意思重复了一下)

现有工作主要都用的Wikipedia的,(列出了一篇试图突破Wikipedia的工作),不过这篇侧重于微调,把搜索引擎中别的知识也融合进去,我们的工作侧重few-shot learning。所以这篇用到的数据集是比较多样化的,涵盖了整个web信息。

为了测试有效性,使用了single-hop,multi-hop,文本生成和文本分类任务。对于文本生成,我的方法比closed-book few-shot的方法提升了15%-30%,并且竟然在复杂的multi-hop任务也取得了提升(但是提升就没那么大了),尽管这种任务很容易受到更多retrieval error的影响。在各种任务上都有效,而且成果比较显著。

(然后又是一些摘要和Discussion中说过的话)

 

半参数模型:使用外部检索到的evidence进行微调,以适应额外的输入。(但是我们的工作不用微调,更泛用)

用web作为知识源:传统的基于Wikipedia构建benchmark,但是现在的新趋势是用整个web作为知识源,支持更丰富多样的数据集,用于fact checking。而且Piktus发现虽然从整个web(包含更多错误和噪声,且比Wikipedia大了一个数量级)构建benchmark有困难,但是有实质性收益。(列举了一些别的工作)但是要么他们优化目标不太一样,要么使用的技术更加intensive,比如微调和强化学习,而我们的方法更加轻量级。

 

3. Few-shot prompting for Internet-augmented Language Models

方法分三步,首先根据问题去检索相关文档,然后根据这些检索到的evidence去进行few-shot prompting,最后生成多个candidate answer,在rerank之后找到最好的回答。

我有点好奇他们是如何处理用时问题的,因为这么多环节,如何保证用户不会等太久呢,Limitation的部分也没有提到这个,估计是用时其实不长或者干脆忽略了这个问题。

 

3.1 Retrieve: Google Search for document retrieval

给定一个q,通过Google Search(调用API一字不差地搜索这个q)搜到一组相关文档D,对每个问题检索到top 20 urls,解析抽取clean text最终组合成D。虽然直接使用q而没有做query rewrite之类的工作,作为第一步这也是足够的,因为搜索引擎自己会做query rewrite。然而对于更复杂的multi-hop问题它就不够了,需要用更复杂的learning to search方法。

D中的文档长度平均2056词,所以直接处理这样的长文本比较难,可能超过输入最大长度;而且文本越长,仅仅用few-shot从噪声中识别有用的相关信息就越困难。先要缩短文档长度,具体做法是把所有文档6句一段进行切分段落,然后embed q,用TF-IDF计算余弦相似度,把这些段落按相关性排序,只用更相关的那些段。

总之,用Google Search可以让我们访问到多样的、实时增长的信息,而不是限定在静态的QA task常用的Wikipedia snapshot范围内。而且把Google Search和DPR(在Wikipedia上预训练的)对比,发现Google Search和web内容可以提升表现。具体地说,我们用基于Wikipedia的NQ数据集得到\(\langle question,answer\rangle\)元组,在Google中使用question原本的样子作为query,计算回答的recall@20,而且把搜索结果限定在Wikipedia上(query末尾加上“site:wikipedia.org”),而DPR就用论文发表的表现数据。它们的recall@20分别是86.5%和79.4%,而如果Google Search可以访问整个web,结果会更好(92.4%)。

数据(知识)范围一样的情况下用Google更厉害,如果允许Google完全开大,更厉害。这里还有一个注,说DPR报告的数字是passage level的,而Google Search我们报告的是document level的。

但是访问整个web可能会有“in the wild”的问题(相较而言Wikipedia的内容更加经过审核),这可能会引发安全问题,比如错误信息、有害内容等。虽然在这个方面不理想,但是使用现有的搜索引擎而非构建web文档的自定义索引,可以减小很多困难,因为系统可以继承搜索引擎底层已有的安全措施。

虽然整个网络鱼龙混杂,可能会出现安全问题,但是让我们相信搜索引擎已经做了相关净化工作,所以我们用它就没问题了!

 

3.2. Prompt: Few-shot prompting for conditioning on evidence

给定一个问题q和一组检索到的段落P,用few-shot prompting把预训练LM限定在这些段落上。其实出现过的“限定在……上”原文都是“condition……on”,我不知道这么翻译是否合适,或者翻译为“条件化在……上”?好像更怪。这个过程就是传统的(闭卷)QA用的k-shot方法,即只考虑\(\langle question,answer\rangle\)元组,用evidence扩展它,得到prompt。虽然我们没有广泛调查优化prompt的方法,但是确实发现,把question和evidence交换,在本文的实验中结果都比较不好。出现了,一些玄学因素!反正形成prompt的格式形如:

Evidence: ...
Question: ...
Answer: ...

交换的意思是位置交换吗,也就是交换前顺序应该是Q,E,A?

我们假设这是LM试图从更长的上下文整合信息的体现,进一步表现提高可以通过为prompt选择in-context examples,这些例子基于和question的相似度查找的。也就是多给prompt在现有的文本中找到和question这个问题相似的例子,有了例子就可以进一步写出更好的prompt。

在这个k-shot中设定k=15,但是由于evidence文本长度不一样、模型可接受的输入序列长度也不一样,有效的size可能会更小,可能没到prompt的开始位置就被截断了。

 

3.3. Rerank: Increasing inference-time compute via answer reranking

已经有工作证明通过扩大参数量增加模型的training-time compute可以在多个few-shot任务中表现更好,在本工作中试图求证增加inference-time compute是否能表现更好。增加inference-time compute有多种方式,这里选择了生成多个answer然后rerank,rerank用的打分函数是QA task的不同概率分解。这最后一句不太懂,“分解”为什么可以作为“打分函数”,后面再看吧。

我从后面回来了,其实就是不同的\(p\)的建模方式,就是下面分的那三点指出的两种不同公式,或者混用。

在检索返回的段落集合P中,选取前n=50段,分别使用每个evidence段落生成prompt,并且对每个evidence生成候选答案。对于分类任务,对每个段落生成一个分类标签。总之,这个过程不仅允许我们考虑更多可能的candidates,而且有助于克服潜在的检索错误,因为考虑更多的段落自然会增加recall。嗯,recall的分母(总共的正确回答的数量)是固定的,随着这个过程,分子(生成的正确回答的数量)是递增的。不过等一下……开放域问答,文本生成,就好像主观题一样,这该怎么界定“总共的正确回答的数量”啊?是retrieval recall!那没事了!搜的越多对的(包含ground truth的)越多。

给定答案\(a_i\),对于限定在检索到的段落\(p_i\)的问题\(q\),用以下方法估计答案的可能性:

  • 直接推理,选择最大化\(p(a|q)\)的answer,被叫做RAG
  • noisy channel inference,选择最大化\(p(a_i,q|p_i)\)的answer
  • Product-of-Experts(PoE),把所有直接和noisy channel的推断都结合起来

对所有模型,使用10%的数据作为validation set来优化插值概率权重。插值就是把多个LM的预测结果结合起来的意思。所有的概率都是LM算的,用k-shot prompt产生对应的分布(k=15)。也就是使用了15个实例来指导模型生成概率分布。例外是直接从QA系统得到的答案概率\(p(a_i|q,p_i)\),还有TF-IDF计算的passage和question的归一化余弦相似度\(p_{tfidf}(p_i|q)\),因为passage较长,使用prompting方法得到可靠的概率估计是比较困难的。

 

Experimental Setup

Datasets

用了3个QA数据集:single-hop的NQ,multi-hop的HotpotQA和StrategyQA;1个fact-checking数据集,single-hop的FEVER。选择这些数据集可以让我们考虑文本生成任务(NQ,HotpotQA)和分类任务(2-way for StrategyQA,3-way for FEVER)的混合,也是single-hop和multi-hop的混合。好像在摘要或者前面见到过这个说明。

数据表示为\(\langle q,A,G\rangle\),q是question,A是所有候选答案的集合,G是数据集标注的gold evidence,single-hop的是一个doc,multi-hop的是两个doc。对于few-shot learning,用3.2中的格式,对每个数据集都创建了15-shot prompt,这里evidence用的都是G中的。

 

Evaluation metrics

对于文本生成用exact match,对于分类用accuracy。

这张表其实是5.Results部分的,但是我既然已经看到了,就仔细看了一下。

open-book的普遍胜过closed-book的,Gold evidence的情况在这里作为上界,目标就是缩小我们的模型表现和这个之间的差距。

为了更好地理解retrieval和接下来的QA表现的联系,这里加入了retrieval score。对于文本生成,这个score是限定在P上的answer recall。对于分类,由于答案的形式是分类标签,所以转而计算P中段落和G中evidence的normalized word overlap(去掉stopwords)取P中所有overlap中最大的那个。

 

Language Models

所有实验都使用了2800亿参数的GOPHER模型,并且为了回答关于参数量影响的问题,我们也用了同系列更小的模型。更小的模型能输入的长度也更小,所以也影响了k-shot中k的值(会更小)。所有的模型都在MassiveText的300 billion token上训练过。对于生成任务,我们用了nucleus decoding,参数:probability cut-off是0.8,temperature是1。虽然我不知道什么是necleus decoding但是我已经懒得查了。

懒不了一点,还是转头问了一下new bing……

Nucleus sampling是一种用于自然语言生成的解码策略,也称为top-p采样。它是一种基于概率的方法,可以在保持生成文本多样性的同时,控制生成文本的质量。在Nucleus采样中,每个时间步的解码词的概率分布满足80/20原则或长尾分布,即头部的几个词的出现概率已经占据了绝大部分概率空间,这部分核心词被称为nucleus。在采样时,只有nucleus中的词被考虑在内,直到它们的累积概率超过了预先定义的阈值p。这种方法可以避免生成低质量或重复文本,并且可以在保持多样性的同时提高生成文本的质量。

半懂不懂,不想细究,继续……

 

Open-domain question answering models

这部分描述开放域问答系统,用于评估我们第三部分的方法。所有系统都会用上述的LM和15-shot prompting。

我们的open-book model(简记为OB),基于给定的evidence生成答案,\(OB_{Google}\)就是基于Google检索到的段落。对每个question的50个evidence段落,每个段落生成4个候选答案,所以总共200个答案。选择的答案是使得定义好的打分函数\(f(a^\prime,p,q)\)最高的答案。\(OB_{Google}^{a|q,p}\)的打分函数就是\(p(a|q,p)\)\(OB_{Google}^{Noisy\ Channel}\)\(OB_{Google}^{RAG}\)\(OB_{Google}^{PoE}\)分别对应3.3中说明的Noisy channel、direct inference和PoE factorizations。

为了更好地评估few-shot prompting的表现,我们还设计了一个oracle retrieval system,记为\(OB_{Gold}\),把passage范围限定在Gold。还有一个参照组是closed-book的,记为CB。为了公平比较CB和OB,都只取50个回答,选择概率最高的那个。

 

Results

5.1. Conditioning a large-scale language model on Google search results

首先从Gopher-280B(这篇文章考虑范围内最好的模型)开始,考察用了Google的(\(OB_{Google}^{a|q,p}\))和closed-book版本的(CB)相比是否有进步,结果如下表:

(然而由于排版我已经看到这张表了……)

如果用上面说的对比,NQ上的进步尤其明显,达到30%。

对于Google的搜索结果(后两列),由于是直接用的未经改写的question搜索,所以搜索质量很依赖于问题的复杂度,NQ的就更简单,HotpotQA的更复杂。

StrategyQA上的进步是最小的(6%),因为这里面的问答最复杂,还要结合一些non-trivial的事实。所以对于复杂问题,就需要引入learning to search方法,把复杂query拆解为更多简单的sub-queries。虽然本篇工作没涉及。

关于打分函数的选择,PoE总是胜过\(a|p,q\)

 

Effect of different scoring functions

PoE最好(真的这么简单粗暴一句话了事?)

 

5.2. Scaling analysis of open- and closed-book models

到这儿已经不想一句句读了,最重要的就两个点。

第一,NQ和HotpotQA上的7B OB模型表现就超过了280B CB模型(实际上在NQ上面1B的OB都可以打败280B CB!)所以让模型学会检索增强是非常值得的,不用烧钱训练模型堆参数,还效果喜人。

第二,在FEVER和StrategyQA上,OB相比CB的提升没另外两个数据集上那么明显,因为这俩含有推理任务,而模型本身推理能力不足是无法用few-shot来弥补的。

 

再后面两个大家有缘自己愿意看的话就直接看原文吧,反正就是细节分析,这里其实这篇工作的全貌已经差不多了。(多少有点虎头蛇尾了吧!但是无所谓!反正我后来读懂了但是已经懒得细细逐句梳理一遍了!)

 

读完整理

这篇工作用了非常轻量级的方法,通过利用LLM的few-shot learning的能力,用检索增强的方法让模型从CB变OB,发现很小的OB可以超过更大的CB,所以作者呼吁我们不要卷大模型的参数量了,把重心转移到寻找更有效的利用现有LLM的方法,从而提高性能。