作者/机构: Timo Schick, Jane Dwivedi-Yu, Roberto Dessì†, Roberta Raileanu, Maria Lomeli, Luke Zettlemoyer, Nicola Cancedda, Thomas Scialom (Meta AI Research; †Universitat Pompeu Fabra)

A1 主要贡献

核心问题: 大型语言模型(LLMs)虽然在许多自然语言处理任务上表现出色,但仍存在一些固有限制,即使通过进一步扩大模型规模也难以完全解决。这些限制包括:
1. 无法获取关于近期事件的最新信息,并因此倾向于产生幻觉。
2. 难以理解低资源语言。
3. 缺乏进行精确计算的数学能力。
4. 对时间流逝没有感知。

研究目标: 本文旨在通过赋予语言模型使用外部工具(如搜索引擎、计算器、日历等)的能力来克服上述限制。现有方法要么依赖大量的人工标注,要么将工具使用限制在特定的任务场景中。本文提出的Toolformer模型旨在满足以下两个期望:
1. 工具的使用应以自监督的方式学习,无需大量人工标注。
2. 语言模型应保持其通用性,并能自行决定何时、如何以及使用哪种工具。

核心创新点 (Toolformer):
本文提出了一种新颖的自监督学习方法,使语言模型能够教会自己使用工具。其核心思想是,让语言模型自身来生成一个包含大量API调用的增强数据集,并通过一个自监督的损失函数来筛选出那些真正有助于模型预测未来文本的API调用,最后在该增强数据集上对模型进行微调。

具体流程如下:
1. 生成潜在API调用:给定少量关于如何使用某个API的人工编写示例,利用大型语言模型的上下文学习能力,在一个庞大的语言建模数据集上标注出大量的潜在API调用。
2. 执行并过滤API调用:执行这些API调用以获得结果。然后,通过一个自监督的损失函数进行过滤,只保留那些能够显著降低模型在预测后续文本时困惑度的API调用。
3. 模型微调:将过滤后认为有用的API调用及其结果整合到原始文本中,形成一个增强数据集。最后,在这个新数据集上微调语言模型。

通过这种方式,Toolformer(基于6.7B参数的GPT-J模型)能够学会控制多种工具,并在各种下游任务的零样本(zero-shot)设置下取得了显著的性能提升,其表现通常优于规模远大于自身的GPT-3模型,同时没有牺牲其核心的语言建模能力。

A2 方法细节

API 调用表示

本文的目标是让一个语言模型 M 能够通过 API 调用来使用不同的工具。每个 API 的输入和输出都必须能够表示为文本序列,以便通过特殊标记将 API 调用无缝地插入到任何文本中。每个 API 调用表示为一个元组 $c = (a_c, i_c)$,其中 $a_c$ 是 API 的名称,$i_c$ 是对应的输入。给定一个 API 调用 $c$ 及其对应的结果 $r$,不包含和包含其结果的线性化序列分别表示为:


其中,“”、“”和“→”是特殊标记。例如,以下是将线性化的API调用插入到文本序列中的一些例子:

The New England Journal of Medicine is a registered trademark of [QA(“Who is the publisher of The New England Journal of Medicine?”) → Massachusetts Medical Society] the MMS.
Out of 1400 participants, 400 (or [Calculator(400 / 1400) → 0.29] 29%) passed the test.
The name derives from “la tortuga”, the Spanish word for [MT(“tortuga”) → turtle] turtle.

数据增强流程

给定一个纯文本数据集 $C = \{x_1, . . . , x_{|C|}\}$,本文首先将其转换为一个用 API 调用增强的数据集 $C^*$。这个过程分为三个步骤:首先,利用模型 M 的上下文学习能力采样大量潜在的 API 调用。然后,执行这些 API 调用,并检查获得的响应是否有助于预测未来的词元(token);这被用作一个过滤标准。过滤后,合并不同工具的 API 调用,得到增强的数据集 $C^*$,并在此数据集上对 M 本身进行微调。


图 2: 本文方法的关键步骤,以一个问答工具为例:给定一个输入文本 x,我们首先采样一个位置 i 和相应的 API 调用候选 c1, c2, . . . , ck。然后我们执行这些 API 调用,并过滤掉所有不能降低后续词元损失 Li 的调用。所有剩余的 API 调用都与原始文本交错,形成一个新的文本 x∗。

采样 API 调用

为每个 API 编写一个提示(Prompt)。该提示 $P(x)$ 鼓励语言模型为一个样本 $x = x_1, . . . , x_n$ 标注 API 调用。例如,一个问答工具的提示如下所示:

Your task is to add calls to a Question Answering API to a piece of text. The questions should help you get information required to complete the text. You can call the API by writing "[QA(question)]" where "question" is the question you want to ask. Here are some examples of API calls:

Input: Joe Biden was born in Scranton, Pennsylvania.
Output: Joe Biden was born in [QA("Where was Joe Biden born?")] Scranton, [QA("In which state is Scranton?")] Pennsylvania.

Input: Coca-Cola, or Coke, is a carbonated soft drink manufactured by the Coca-Cola Company.
Output: Coca-Cola, or [QA("What other name is Coca-Cola known by?")] Coke, is a carbonated soft drink manufactured by [QA("Who manufactures Coca-Cola?")] the Coca-Cola Company.

Input: x
Output:

采样调用位置和内容。首先,通过计算模型 M 在每个位置 $i \in \{1, . . . , n\}$ 生成 标记的概率 $p_i = p_M (\text{} | x_1, . . . , x_{i-1})$,来采样最多 $k$ 个候选的 API 调用位置。给定一个采样阈值 $\tau_s$,保留所有概率 $p_i > \tau_s$ 的位置 $I$;如果这样的位置超过 $k$ 个,则只保留概率最高的 $k$ 个。接着,对于每个位置 $i \in I$,以序列 $[P(x), x_1, . . . , x_{i-1}, \text{}]$ 作为前缀,并以 作为序列结束标记,从 M 中采样最多 $m$ 个 API 调用 $c_1^i , . . . , c_m^i$。

执行 API 调用

获取API调用的结果。下一步是执行所有由 M 生成的 API 调用,以获得相应的结果。这一步的具体操作完全取决于 API 本身——例如,可能涉及调用另一个神经网络、执行一个 Python 脚本或使用一个检索系统在大型语料库上进行搜索。每个 API 调用 $c_i$ 的响应必须是一个单一的文本序列 $r_i$。

过滤 API 调用

基于损失降低进行筛选。设 $i$ 是 API 调用 $c_i$ 在序列 $x = x_1, . . . , x_n$ 中的位置,而 $r_i$ 是来自 API 的响应。给定一个权重序列 $(w_j | j \in N)$,定义加权交叉熵损失 $L(z; x_i, . . . , x_n) = \sum_{j=i}^n w_{j-i+1} \cdot \log p_M(x_j | z, x_1, . . . , x_{j-1})$,它表示模型 M 在给定前缀 $z$ 的情况下,对词元 $x_i, . . . , x_n$ 的损失。本文比较了两种损失的实例化:
1. $L_i^+ = L(e(c_i, r_i); x_i, . . . , x_n)$:这是在将 API 调用及其结果作为前缀时,对所有词元 $x_i, . . . , x_n$ 的加权损失。
2. $L_i^- = \min(L(\epsilon; x_i, . . . , x_n), L(e(c_i, \epsilon); x_i, . . . , x_n))$:这是在 (i) 完全不进行 API 调用和 (ii) 进行 API 调用但不提供其响应这两种情况下所获得的最小损失,其中 $\epsilon$ 代表空序列。
直观上,如果提供一个 API 调用的输入和输出能让模型更容易地预测未来的词元(相比于完全不接收 API 调用,或只接收其输入),那么这个 API 调用对 M 来说就是有帮助的。因此,给定一个过滤阈值 $\tau_f$,本文只保留满足 $L_i^- - L_i^+ \ge \tau_f$ 的 API 调用,即添加 API 调用及其结果至少能将损失降低 $\tau_f$。

模型微调

在增强数据集上进行微调。在对所有 API 进行采样和过滤后,最终将剩余的 API 调用合并并交错插入到原始输入中。对于一个输入文本 $x = x_1, . . . , x_n$ 及其在位置 $i$ 对应的 API 调用和结果 $(c_i, r_i)$,构造出新的序列 $x^* = x_{1:i-1}, e(c_i, r_i), x_{i:n}$。对包含多个 API 调用的文本也进行类似处理。对所有 $x \in C$ 进行此操作后,就得到了用 API 调用增强的新数据集 $C^*$。本文使用这个新数据集,通过标准的语言建模目标来微调 M。关键在于,除了插入的 API 调用外,增强数据集 $C^*$ 包含与原始数据集 $C$ 完全相同的文本内容,这使得模型 M 在微调过程中能够接触到相同的内容,从而不会损失其通用性和语言建模能力。由于 API 调用被精确地插入在那些能够帮助 M 预测未来词元的位置并带有相应的输入,因此在 $C^*$ 上的微调使语言模型能够纯粹基于自身的反馈来决定何时以及如何使用哪种工具。

推理过程

在生成时动态调用 API。在使用本文方法微调后的模型 M 生成文本时,执行常规的解码过程,直到 M 产生“→”标记,这表示它接下来期望获得一个 API 调用的响应。此时,中断解码过程,调用相应的 API 以获取响应,然后在插入响应和 标记后继续解码过程。

A3 使用的工具

本文探索了多种工具来解决常规语言模型的不同缺点。对这些工具的唯一限制是:(i) 它们的输入和输出都可以表示为文本序列;(ii) 我们能够获得一些关于其预期用途的演示。具体来说,本文探讨了以下五种工具:问答系统、维基百科搜索引擎、计算器、日历和机器翻译系统。

表 1: 本文使用的所有API的输入和输出示例。

问答系统: 第一个工具是一个基于另一个语言模型(Atlas【Izacard et al., 2022, Atlas: Few-shot learning with retrieval augmented language models】)的问答系统,可以回答简单的事实性问题。该模型在 Natural Questions 数据集【Kwiatkowski et al., 2019, Natural questions: A benchmark for question answering research】上进行了微调。

计算器: 第二个工具是一个可以执行简单数值计算的计算器,仅支持四种基本算术运算。结果总是四舍五入到两位小数。

维基百科搜索: 第三个工具是一个搜索引擎,给定一个搜索词,它会返回维基百科的简短文本片段。与问答工具相比,此搜索功能使模型能够获得关于某个主题更全面的信息,但需要模型自行提取相关部分。搜索引擎采用 BM25 检索器【Robertson et al., 1995, Okapi at trec-3】,索引了 KILT【Petroni et al., 2021, KILT: a benchmark for knowledge intensive language tasks】的维基百科转储数据。

机器翻译系统: 第四个工具是一个基于语言模型的机器翻译系统,可以将任何语言的短语翻译成英语。具体来说,本文使用了 6 亿参数的 NLLB 模型【Costa-jussà et al., 2022, No language left behind: Scaling human-centered machine translation】,该模型支持 200 种语言。源语言使用 fastText 分类器【Joulin et al., 2016, Fasttext. zip: Compressing text classification models】自动检测,目标语言始终设置为英语。

日历: 最后一个工具是一个日历 API,在被查询时返回当前日期,无需任何输入。这为需要时间感知的预测提供了时间背景。

A4 实验

实验环境

  • 数据集: 使用 CCNet【Wenzek et al., 2020, CCNet: Extracting high quality monolingual datasets from web crawl data】的一个子集作为语言建模数据集 $C$。为了降低标注成本,对某些 API 使用了启发式规则来筛选出更有可能从 API 调用中受益的文本子集(例如,对于计算器工具,只考虑包含至少三个数字的文本)。最终生成的带有 API 调用的数据集 $C^*$ 的统计数据如表2所示。
    表 2: 对于不同的过滤阈值 τf,C∗ 中带有 API 调用的示例数量。
  • 模型架构:
    • 基础模型:GPT-J【Wang and Komatsuzaki, 2021, GPTJ-6B: A 6 Billion Parameter Autoregressive Language Model】,一个拥有 67 亿参数的模型。
    • 基线模型:
      • GPT-J (原始模型)
      • GPT-J + CC (在不含 API 调用的 CCNet 子集上微调)
      • Toolformer (在含 API 调用的 CCNet 子集 $C^*$ 上微调)
      • Toolformer (disabled) (推理时禁用 API 调用)
      • 更大规模的模型作对比:OPT (66B)【Zhang et al., 2022, Opt: Open pretrained transformer language models】和 GPT-3 (175B)【Brown et al., 2020, Language models are few-shot learners】。
  • 硬件配置: 8块 NVIDIA A100 40GB GPUs。
  • 软件配置: 使用 DeepSpeed 的 ZeRO-3 进行模型微调,精度为 BF16。学习率为 $1 \cdot 10^{-5}$,批处理大小为 128,前10%的训练步数使用线性预热。

实验结果

所有实验均在零样本(zero-shot)设置下进行,即只通过自然语言指令来要求模型解决任务,而不提供任何上下文示例。

推理策略:实验采用了一种修改后的解码策略。模型不仅在 <API> 是最可能的词元时生成它,而是在它位于 top-k (k=10) 最可能词元之列时就生成它,以鼓励模型使用工具。同时,每个输入最多只允许一次 API 调用。

LAMA (事实知识探测)
- 实验内容: 在 LAMA 基准测试的 SQuAD、Google-RE 和 T-REx 子集上评估模型补全缺失事实的能力。为避免不公平,此任务中禁用了维基百科搜索 API。
- 实验结果: 如表3所示,Toolformer 显著优于所有基线模型,包括规模远大于它的 OPT (66B) 和 GPT-3 (175B)。这得益于模型在 98.1% 的案例中自主决定使用问答工具来获取所需信息。
表 3: LAMA 子集上的结果。Toolformer 对大多数示例使用问答工具,明显优于所有同等规模的基线模型,并取得了与 GPT-3 (175B) 相当的结果。

数学推理任务
- 实验内容: 在 ASDiv、SVAMP 和 MAWPS 等数学推理基准上进行评估。
- 实验结果: 如表4所示,即使在禁用 API 调用的情况下,Toolformer 也表现出了一定的数学能力提升。在启用 API 调用后,其性能在所有任务上都翻了一倍以上,并且明显优于 OPT 和 GPT-3。模型在 97.9% 的案例中选择使用计算器工具。
表 4: 需要数学推理的各种基准测试的结果。Toolformer 对大多数示例使用计算器工具,明显优于 OPT (66B) 和 GPT-3 (175B)。

问答任务
- 实验内容: 在 Web Questions、Natural Questions 和 TriviaQA 数据集上进行评估。此任务中禁用了问答工具。
- 实验结果: 如表5所示,Toolformer 再次超越了所有基于 GPT-J 的模型,主要依赖维基百科搜索 API (99.3%)。然而,其性能仍落后于 GPT-3 (175B),原因可能是所用搜索引擎较为简单且缺乏交互能力。
表 5: 各种问答数据集的结果。Toolformer 对大多数示例使用维基百科搜索工具,明显优于同等规模的基线模型,但不及 GPT-3 (175B)。

多语言问答
- 实验内容: 在 MLQA 基准上进行评估,问题为非英语,但上下文为英语。
- 实验结果: 如表6所示,使用 API 调用(主要是机器翻译工具)一致地提升了 Toolformer 的性能。但它并未总能超越原始的 GPT-J,因为在 CCNet 上的微调有时会因数据分布偏移而损害某些语言的性能。
表 6: MLQA 在西班牙语 (Es)、德语 (De)、印地语 (Hi)、越南语 (Vi)、中文 (Zh) 和阿拉伯语 (Ar) 上的结果。尽管使用机器翻译工具翻译问题对所有语言都有帮助,但在 CCNet 上进一步预训练会降低性能;因此,Toolformer 并不总是优于 GPT-J。最后两行对应于上下文和问题都为英语的模型。

时间感知任务
- 实验内容: 在 TEMPLAMA 和新构建的 DATESET 数据集上进行评估。
- 实验结果: 如表7所示,Toolformer 在两个数据集上均优于基线。在 TEMPLAMA 上,性能提升主要来自维基百科搜索和问答工具,而非日历工具。但在 DATESET 上,性能的显著提升完全归功于日历工具的使用(54.8% 的案例)。
表 7: 时间数据集上的结果。Toolformer 优于所有基线模型,但在 TEMPLAMA 上未使用日历工具。

语言建模能力
- 实验内容: 在 WikiText 和一个留存的 CCNet 子集上评估模型的困惑度(Perplexity)。
- 实验结果: 如表8所示,与在纯文本数据集 C 上微调相比,在增强数据集 C* 上微调并未导致语言建模性能下降(在推理时禁用 API 调用)。这表明 Toolformer 在学习使用工具的同时,保留了其核心的语言建模能力。
表 8: 不同模型在 WikiText 和我们的 CCNet 验证子集上的困惑度。在不使用任何 API 调用的情况下,添加 API 调用不会带来语言建模困惑度的成本。

模型规模的影响 (Scaling Laws)
- 实验内容: 在不同规模的 GPT-2 模型(124M 至 1.6B)和 GPT-J 上应用 Toolformer 方法。
- 实验结果: 如图4所示,模型利用工具的能力在参数量达到约 775M 时才开始显现。对于较小的模型,工具的帮助不大。随着模型规模的增长,模型本身解决任务的能力和利用工具的能力同时增强,即使对于最大的模型,使用和不使用 API 调用之间的性能差距依然很大。


图 4: 在LAMA、我们的数学基准和QA基准上,使用我们的方法微调的不同大小的GPT-2模型和GPT-J的平均性能,包括使用和不使用API调用的情况。虽然API调用对最小的模型没有帮助,但较大的模型学会了如何很好地利用它们。即使对于更大的模型,使用和不使用API调用的模型预测之间的差距仍然很大。

A5 结论

本文引入了 Toolformer,一个通过自监督学习方式掌握如何通过简单 API 调用使用搜索、计算、翻译等多种工具的语言模型。该方法通过在一个包含大量采样 API 调用的数据集上进行微调实现,这些 API 调用都经过了筛选,以确保它们能降低对未来词元的预测困惑度。实验证明,Toolformer 显著提升了一个 6.7B 参数 GPT-J 模型的零样本性能,使其在一系列下游任务上甚至能够超越规模远大于它的 GPT-3 模型。

局限性:
1. 无法链式使用工具: 当前方法无法将一个工具的输出作为另一个工具的输入。
2. 缺乏交互性: 模型无法与工具进行交互,例如,在搜索引擎中浏览多个结果或优化搜索查询。
3. 对输入敏感: 模型在决定是否调用 API 时,对输入的具体措辞较为敏感。
4. 样本效率低: 对于某些工具(如计算器),生成有用的 API 调用样本效率很低。
5. 未考虑计算成本: 模型在决策时没有考虑调用 API 所带来的计算成本。

A6 附录

A. API 细节

采样与过滤参数。默认情况下,采样 API 调用位置的概率阈值 $\tau_s = 0.05$,过滤 API 调用的损失降低阈值 $\tau_f = 1.0$。每个文本最多保留 $k=5$ 个候选位置,每个位置最多采样 $m=5$ 个 API 调用。对于计算器和机器翻译工具,由于启发式过滤导致数据较少,参数放宽为 $\tau_s = 0.0$, $k=20$,$m=10$,并且 $\tau_f = 0.5$。

工具实现细节
- 问答系统: 数据生成阶段使用 Atlas-large,推理阶段使用更大的 Atlas-xxl。
- 计算器: 基于一个简单的 Python 脚本,只支持 "+", "−", "∗", "/" 运算。为了提高采样效率,只在满足特定启发式规则的文档上进行采样(例如,包含特定数学模式或至少三个数字)。
- 日历: 在创建数据集 $C^*$ 时,假设文档的创建日期为日历应返回的日期,该日期从文档的 URL 中提取。
- 机器翻译: 训练和推理都使用 600M 参数的 NLLB 模型。为提高效率,只在包含非英语文本块的段落中生成 API 调用。

各工具使用的提示 (Prompts)
- 问答系统 Prompt:

Your task is to add calls to a Question Answering API to a piece of text.
The questions should help you get
information required to complete the text. You can call the API by writing "[QA(question)]" where "question" is the question you want to ask. Here are some examples of API calls:
Input: Joe Biden was born in Scranton, Pennsylvania.
Output: Joe Biden was born in [QA("Where was Joe Biden born?")] Scranton,
[QA("In which state is Scranton?")]
Pennsylvania. Input: Coca-Cola, or Coke, is a
carbonated soft drink manufactured by the Coca-Cola Company.
Output: Coca-Cola, or [QA("What other name is Coca-Cola known by?")] Coke, is a carbonated soft drink manufactured by [QA("Who manufactures Coca-Cola?")] the Coca-Cola Company.
Input: x Output:
  • 计算器 Prompt:
Your task is to add calls to a Calculator API to a piece of text.
The calls should help you get
information required to complete the text. You can call the API by writing "[Calculator(expression)]" where
"expression" is the expression to be computed. Here are some examples of API calls:
Input: The number in the next term is 18 + 12 x 3 = 54.
Output: The number in the next term is 18 + 12 x 3 = [Calculator(18 + 12 * 3)] 54. Input: The population is 658,893 people. This is 11.4% of the national average of 5,763,868 people.
Output: The population is 658,893 people. This is 11.4% of the national average of [Calculator(658,893 / 11.4%)] 5,763,868 people. Input: A total of 252 qualifying matches were played, and 723 goals were scored (an average of 2.87 per match). This is three times less than the 2169 goals
last year.
Output: A total of 252 qualifying
matches were played, and 723 goals were scored (an average of [Calculator(723 / 252)] 2.87 per match). This is twenty goals more than the [Calculator(723 - 20)] 703 goals last year.
Input: I went to Paris in 1994 and stayed there until 2011, so in total, it was 17 years. Output: I went to Paris in 1994 and stayed there until 2011, so in total, it was [Calculator(2011 - 1994)] 17 years.
Input: From this, we have 4 * 30 minutes = 120 minutes.
Output: From this, we have 4 * 30
minutes = [Calculator(4 * 30)] 120
minutes.
Input: x Output:
  • 维基百科搜索 Prompt:
Your task is to complete a given piece of text. You can use a Wikipedia Search API to look up information. You can do so by writing "[WikiSearch(term)]" where "term" is the search term you want to look up. Here are some examples of API calls: Input: The colors on the flag of Ghana have the following meanings: red is for the blood of martyrs, green for forests, and gold for mineral wealth. Output: The colors on the flag of Ghana have the following meanings: red is for [WikiSearch("Ghana flag red meaning")] the blood of martyrs, green for forests, and gold for mineral wealth.
Input: But what are the risks during production of nanomaterials? Some
nanomaterials may give rise to various kinds of lung damage. Output: But what are the risks during production of nanomaterials? [WikiSearch("nanomaterial production risks")] Some nanomaterials may give rise to various kinds of lung damage.
Input: Metformin is the first-line drug for patients with type 2 diabetes and obesity.
Output: Metformin is the first-line drug for [WikiSearch("Metformin first-line drug")] patients with type 2 diabetes and obesity.
Input: x Output:
  • 机器翻译 Prompt:
Your task is to complete a given piece of text by using a Machine Translation API.
You can do so by writing "[MT(text)]" where text is the text to be translated into English.
Here are some examples:
Input: He has published one book: O homem suprimido (“The Supressed Man”) Output: He has published one book: O homem suprimido [MT(O homem suprimido)] (“The Supressed Man”)
Input: In Morris de Jonge’s Jeschuah, der klassische jüdische Mann, there is a description of a Jewish writer Output: In Morris de Jonge’s Jeschuah, der klassische jüdische Mann [MT(der klassische jüdische Mann)], there is a description of a Jewish writer
Input: 南 京 淳 县 住 和 城 乡 建 设 城 市 新高 房 局区 设 计 a plane of reference Gaochun isone of seven districts of the provincialcapital Nanjing
Output: [MT(南京 淳县住 和城乡建设 城市新高 房 局区 设 计)] a plane of reference Gaochun isone of seven districts of the provincialcapital Nanjing
Input: x Output:
  • 日历 Prompt:
Your task is to add calls to a Calendar API to a piece of text. The API calls should help you get information required to complete the text. You can call the API by writing "[Calendar()]" Here are some examples of API calls:
Input: Today is the first Friday of the year.
Output: Today is the first [Calendar()] Friday of the year. Input: The president of the United
States is Joe Biden.
Output: The president of the United
States is [Calendar()] Joe Biden.
Input: The current day of the week is Wednesday.
Output: The current day of the week is [Calendar()] Wednesday.
Input: The number of days from now until Christmas is 30.
Output: The number of days from now
until Christmas is [Calendar()] 30.
Input: The store is never open on the weekend, so today it is closed.
Output: The store is never open on the weekend, so today [Calendar()] it is closed.
Input: x Output:

B. Toolformer 训练

每个 API 最多使用 2.5 万个样本。最大序列长度为 1024。有效批处理大小为 128。所有模型都使用 DeepSpeed 的 ZeRO-3 进行训练。硬件为 8 块 NVIDIA A100 40GB GPUs,使用 BF16 精度。训练最多 2000 步,每 500 步在一个包含 1000 个样本的小型 CCNet 开发集上评估困惑度,并选择表现最好的检查点。

C. 零样本提示

  • LAMA 和 TEMPLAMA: Please complete the following text so that it is factually correct: x.
  • 数学基准: x q The answer is. (其中 x 是上下文,q 是问题)
  • 问答任务 (包括 DATESET): Answer the following question: q
  • 多语言问答: Your task is to answer a question based on the following paragraph: x Now answer the following question in English: q.

D. DATESET

DATESET 是通过首先随机选择 500 个“当前日期”来创建的。对于每个当前日期,在四年范围内随机选择另一个相对过去/未来的日期,并使用这两个日期来填充表 11 中的查询模板。例如,使用第一个模板的一个查询可能是:“2020 年 8 月 14 日是几天前?”如果调用,日历工具将返回假定的当前日期(例如,“今天是 2020 年 11 月 20 日,星期日”)。


表 11: 用于创建 DATESET 的模板,其中 current_date 是随机选择的。对于每个 current_date,会生成一个随机的 past_date 和 future_date,并用于填充每个模板(如果相关)。模板中使用了美国的联邦假日(例如,感恩节)。