迁移学习的标度律(Scaling Laws for Transfer)

Danny Hernandez1 · Jared Kaplan2,3 · Tom Henighan2 · Sam McCandlish2 · OpenAI
通讯:dannyhernandez@gmail.com
工作完成于 OpenAI   约翰·霍普金斯大学(Johns Hopkins University)
摘要(Abstract)

我们在一种无监督的微调(fine-tuning)设置中研究分布之间迁移学习(transfer learning)的经验标度律(scaling laws)。当我们在固定大小的数据集上从头训练越来越大的神经网络时,它们最终会受限于数据而停止在性能(交叉熵损失)上的提升。当我们对在大型语言数据集上预训练(pre-trained)的模型做同样的事情时,性能增益的斜率只是减小而不会变为零。我们通过确定相同大小的 Transformer 在从头训练时需要多少数据才能达到同样的损失来计算从预训练中"迁移"的有效数据量。换句话说,我们关注数据单位,同时固定其他一切。我们发现,在低数据范围内,迁移的有效数据可以通过参数数量和微调数据集大小的幂律(power-law)得到很好的描述。我们相信这些幂律中的指数对应于模型的一般性(generality),以及分布之间(有向而非对称意义上的)接近度的度量。我们发现预训练实际上有效地倍增了微调数据集的大小。迁移和整体性能一样,在参数、数据和算力方面都是可预测地标度的。

1 引言(Introduction)

推动人工智能进步的有三大要素:算法创新 [HB20]、算力(compute) [AH18] 和数据。OpenAI Five 进行了超过一万年的 Dota 游戏,AlphaZero 进行了 1.4 亿局围棋,而 GPT-3 阅读了相当大一部分互联网内容 [OBB+19, SSS+17, BMR+20]。这些机器学习系统都是从零开始训练的(trained from-scratch),而人类则会"迁移"(transfer)过往的理解和经验,这也是我们能够以少得多的直接任务经验取得出色表现的部分原因。神经网络通常需要的直接经验量超过一个人一生所能经历的,这表明迁移所带来的样本效率(sample efficiency)提升或许是从数据角度进行刻画的重要途径。

最近在无监督和微调语言模型方面的进展使它们成为一个特别有趣的研究领域。无监督预训练在 [DL15] 中提升了下游任务的性能,并在 [PNI+18, HR18] 中带来了数据效率的提升。GPT-1 [RNSS18] 这一 Transformer 模型 [VSP+17] 的性能因预训练而得到提升。后续在小数据集上进行微调的工作不断刷新最先进的结果 [PNI+18, DCLT18, RSR+20]。这一系列成功表明,语言模型微调可以提供一个简单而有趣的设置来研究数据分布之间的迁移。

我们认为在低数据范围内刻画微调尤其重要,因为许多感兴趣的任务不会有足够大的、现成的数据集来从头训练大型模型(无论是数十亿数据点 [HNA+17, KMH+20, HKK+20],还是围棋那样的完美模拟器 [SHM+16])。在代码生成任务上微调语言模型对我们来说尤其有趣,因为文本和代码虽然有一些重叠,但是相当不同的分布。

我们的分析聚焦于在固定性能和模型大小时的数据单位。这种新颖的视角使我们能够用简单的方程 (1.1) 生成异常干净的拟合。在我们的低数据实验中,我们使用了从 40 万到 4 亿参数不等的模型规模,以及从约 105 到 5×109 字符(character)的微调数据集大小。

【图 1:40M 参数 Transformer 在 Python 上的性能对比——从头训练 vs 预训练+微调,展示有效数据 DT 的概念示意图】
图 1: 我们展示了 4000 万参数(40M)的 Transformer 模型在 Python 上的性能,分别包括从零开始在 Python 上训练,以及先在文本上预训练再在 Python 上微调。DT 是相同大小的从零开始训练的模型要达到与微调模型相同的 Python 损失所需的额外 Python 字符数。在所示的例子中,对于一个在 3×105 字符上微调的 4000 万参数 Transformer,DT 约为 DF 的 1000 倍。可用的微调数据越少,预训练带来的帮助就越大。从图中可以看出,在达到相同损失时,微调模型所需的微调数据比从头训练所需的全部数据要少得多;预训练"补充"了缺失的数据。

1.1 主要结果(Key Results)

我们训练了一系列不同规模的 Transformer 语言模型,使用 3 种不同的数据集训练方式:

  • 从零开始在 Python 代码上训练;
  • 先在自然语言上预训练,再在 Python 代码上微调;
  • 先在自然语言和非 Python 代码的等比例混合上预训练,再在 Python 上微调。

我们变化网络规模和微调数据集的大小,并在留出的 Python 代码测试集上衡量性能。我们观察到以下关键结果:

有效迁移数据在低数据范围内很好地由幂律描述1:我们使用 DT 表示有效迁移数据(effective data transferred),即相同大小的、仅在 Python 上训练的模型,要达到在语言上预训练模型在 Python 上相同损失所需要的额外 Python 数据量。我们的符号在图 1 中以可视方式标示。方程 (1.1) 中的迁移标度律是本研究中许多关键见解和预测的核心。我们认为这个结果的简洁性非常耐人寻味:

DT = 有效迁移数据 = k·(DF)α·(N)β  (1.1)

其中 N 是非嵌入(non-embedding)模型参数的数量,DF 是微调数据分布的大小。k 是一个常数,αβ 是幂律指数。通过固定性能来测量预训练带来的"额外数据量",我们剥离了损失函数的具体形式,得到一个关于迁移的清晰、可解释的标度关系。

在本研究中,对于文本预训练后微调到 Python 的情形,我们拟合得到的指数约为 α ≈ 0.5、β ≈ 0.5 左右(具体数值取决于拟合方式,详见原文附录)。这意味着参数数量每翻一倍,迁移的有效数据就会按一个简单幂律增长;而微调数据每增加十倍,迁移的有效数据则按 α 比例放大。

【图 2:跨越 4 个数量级模型规模和 3 个数量级微调数据集大小的迁移标度律拟合散点图——横轴为模型参数 N,纵轴为有效迁移数据 DT,不同颜色的点代表不同的微调数据集大小 DF
图 2: 在低数据范围内,我们观察到一个跨越 4 个数量级的模型规模和 3 个数量级的微调数据集大小的良好拟合。拟合方程如上以 DT 的形式给出。直线代表不同 DF 下的对数线性拟合,可见在对数-对数坐标下点几乎完美地落在直线上,且平行性非常好——这正是幂律形式所预期的表现。

当数据成为限制因素时,预训练模型具有更好的标度律,因为斜率小于零: 图 3 显示,当我们以固定的 Python 数据量 DF 进行微调而增大模型规模时,从头训练的模型会遭遇瓶颈,而已经在语言上预训练的模型则继续改进。方程 (1.1)(1.2) 将这一现象量化。这一观察对实际部署有重要意义:在一个迁移目标数据集规模受限的场景下,模型规模的扩展在预训练存在时比没有预训练时更有价值。

【图 3:在不同模型规模和数据量下的损失曲线对比——展示从头训练(紫/蓝)vs 微调(绿)的标度律差异;横轴为参数数量 N,纵轴为损失 L】
图 3: 我们可以观察到从零开始训练的模型(紫色和蓝色曲线)出现大范围的平坦区域,完全受数据约束,增大参数不会带来任何收益——这是典型的数据受限行为;而微调的标度律(绿色曲线)在受数据限制时只表现出斜率的变化,而非完全的停滞。第 3.1 节给出了以数据集大小为 x 轴的这些图的变体。拟合按数据集大小进行,函数形式为幂律加常数。对此数据尝试进行全局幂律拟合可在附录 C 中找到。零样本(zero-shot)性能由黑色线给出。值得注意的是,零样本性能与最大微调模型的性能相当,这凸显了预训练带来的内在迁移价值。

忽略预训练成本,在低数据范围内微调模型在算力上更高效(图 4)。在利用已有的预训练模型(如 BERT 或 GPT-3 [DCLT18, BMR+20])时,忽略预训练成本是合理的。这是因为预训练模型可以重复用于多个下游任务,从而摊销预训练成本。

【图 4:算力高效前沿曲线对比——低数据范围内微调 vs 从头训练;横轴为训练算力 C,纵轴为损失 L】
图 4: 在低数据范围内,对于给定的训练算力,微调比从头训练获得更好的性能,并且更容易落在算力高效前沿(compute-efficient frontier)上。在固定 Python 数据量的情况下,随着模型规模增大,性能差距会显著扩大——这表明了预训练带来的"红利"随着模型规模的提升而增加。(3×108 字符的 Python 数据曲线)值得注意的是,从头训练的曲线在大多数训练算力区间都位于算力高效前沿之下,而微调曲线则与之接近或重合,这说明微调让训练算力的利用更加高效。

1.2 符号说明(Notation)

为方便阅读,我们列出本文使用的主要符号及其含义:

  • DE — 总有效数据(total effective data),即相同大小的、从头在 Python 上训练的模型,要达到预训练模型在 Python 上相同损失所需的 Python 字符数。它是迁移数据与微调数据的总和,即 DE = DT + DF
  • DF — 微调数据集大小(fine-tuning dataset size),以字符数为单位。这是直接用于微调目标分布的数据量。
  • DT — 有效迁移数据(effective data transferred),即相同大小的、从头在 Python 上训练的模型,要达到预训练模型在 Python 上相同损失所需的额外 Python 字符数。它是预训练"贡献"的有效数据量。
  • N — 模型参数的数量,不包括词表(vocabulary)和位置嵌入(positional embeddings)。这些嵌入参数通常很大但与模型表达能力的核心规律相关性较弱。
  • α, β — 有效迁移数据标度的幂律指数,分别对应 DFN 的依赖性。
  • k — 有效迁移数据标度的常数,整体反映了预训练分布相对于目标分布的"接近度"或"信息含量"。
  • L — 上下文内每个 token 的交叉熵损失(cross-entropy loss),以 nat(自然对数底 e 为底的信息量单位)为单位,在 token 上平均。这是衡量语言模型性能的标准指标。
  • C — 整篇论文中的算力(compute)单位是浮点运算数(FLOP)。算力是衡量训练成本的关键指标。
  • D(N) — 给定模型大小,要达到无限 Python 数据所能达到的性能的 99% 所需的数据量。这是刻画"无限数据范围"的关键阈值。
  • αN, αD — 来自 [KMH+20] 的损失 L 的幂律指数,分别对应参数和数据依赖。
  • DC, NC — 来自 [KMH+20] 的损失方程中的常数项。

2 实验设置(Experimental Setup)

在语言上预训练、在代码上微调、以及从零开始在代码上训练的模型,都训练至收敛到最优的早停止(early stopping)点,学习率(learning rate)和优化(optimization)参数与 [KMH+20] 中的类似。模型规模和数据集大小各跨越 4 个数量级。我们使用了 Adam 优化器 [KB14],批大小(batch size)为 256,序列长度为 2048 个 token,3000 步学习率预热(warmup),词表大小(vocabulary size)为 50257。所有模型均从头训练,不加载预训练权重——预训练和微调之间的区别仅在于训练数据的来源与组合方式。

预训练的文本模型在来自 [KMH+20] 的 WebText2、Common Crawl4 [RSR+20]、英文维基百科以及公开可用的 Internet Books 的混合数据上训练。文本使用 [RWC+19] 中描述的可逆分词器(reversible tokenizer)编码,总共 240 亿(2.4×1010)个字符。这一规模的数据量保证了预训练模型能够学习到丰富的语言统计规律。在 Python 上训练或微调的模型利用了来自公开 GitHub5 仓库的 220 亿(2.2×1010)字符数据集(31GB),其中 3% 的数据集被留出用于评估(held out for evaluation)。

模型架构方面,我们使用了标准的 Transformer decoder(即仅解码器、自回归)架构。模型规模通过变化层数、维度以及注意力头数进行缩放,从 40 万(400K)参数到 4 亿(400M)参数不等。所有训练运行使用相同的词表分词器,保证不同模型之间的一致性。

3 实验结果(Results)

在本节中,我们详细分析两类主要实验现象:模型规模标度(model size scaling)、数据标度(data scaling)和迁移(transfer)。这些是支撑我们标度律的核心数据。

3.1 僵化——预训练是否会损害性能?

预训练是否会损害微调模型的性能?我们将这种现象称为"僵化"(ossification),意指预训练可能会使模型权重僵化,以致在高数据范围内不能很好地适应微调分布。我们考察这个问题的原因是直觉上,当拥有大量下游数据时,从零训练可能反而比微调更优——因为微调模型可能受限于预训练学到的先验,无法完全适应下游分布。

下图展示了图 3 的一个变体,将数据集大小放在 x 轴上而不是作为线条颜色。为了建立直觉,从多个角度观察主要结果会很有帮助。在这幅图上更容易观察到,最小的从零开始训练的模型在大数据集上比微调模型在大数据集上的性能更好(紫色曲线)。这一现象表明,在高数据范围内僵化效应确实存在。

【图 5:以数据集大小为 x 轴的标度律——展示高数据范围内预训练可能减小有效数据集;不同颜色代表不同模型大小】
图 5: 在高数据范围内(紫色曲线),预训练实际上可能减少训练集大小。换句话说,在更大的数据集(>108)上从头训练 1M 参数模型(紫色)反而能获得更好的性能。这与低数据范围内的行为形成鲜明对比:在低数据范围内(<0.1 × D(N)),预训练带来巨大帮助;而在高数据范围内,预训练可能成为限制因素。

我们将 D(N) 定义为对于给定模型大小,达到无限数据所能产生性能的 99% 所需的数据量6。也就是说,0.99 × L(D(N)) = L(D → ∞),其中 L 是损失函数。然后我们使用 D(N) 的比例来参数化数据范围。我们将 D/D(N)<0.10 定义为低数据范围(low-data regime)。

在整项工作中,我们聚焦于数据受限范围,因为这是预训练最有实际用途的时候。当 D/D(N) 趋近 1.0 时,我们观察到预训练会减少我们的有效数据,而我们的小型微调模型即使在 10 倍或 100 倍 D(N) 的数据上训练,也无法达到从头训练模型的性能。这意味着对于小型模型,预训练权重中的某些特征可能阻碍它们对目标分布进行充分的"重新学习"。

【图 6:僵化现象展示图,左侧和右侧两种参数化版本——紫色曲线与橙色 D(N) 基线的平行性;横轴为有效数据 DE,纵轴为损失 L】
图 6: 在高数据范围内,预训练减少了小型模型的有效数据。右侧的图是左侧图的一种重新参数化。注:紫色曲线与橙色从头训练 D(N) 基线的平行性依赖于 D(N),而我们对此的拟合存在噪声,如附录 A 所示。即便存在这些噪声,曲线之间近似平行的关系表明,僵化效应的强度与预训练数据量的对数大致呈线性关系。

我们将这种现象称为僵化,因为可以认为预训练是一种特别糟糕的初始化(initialization),模型难以从中恢复。可能通过充分的调整/调参可以摆脱这种糟糕的初始化,但我们没有深入研究这个问题。完全有可能大型模型在此范围内会表现出不同的行为——具体来说,我们推测大型模型可能更擅长在保留预训练知识的同时吸收新数据,因此僵化效应可能会减弱或消失。

3.2 微调通常在算力上更高效(不计预训练算力)

当我们拥有的数据大约是图 4 中数据的 30 倍时,微调的算力高效前沿(compute-efficient frontier)与从头训练模型类似。然而,在微调时更容易落在算力高效前沿上。如图 7 所示,微调的训练曲线在训练的大部分时间内都与前沿相切,而从头训练的曲线只在一个相对狭窄的窗口内与前沿相切。这意味着微调对算力的利用在更广泛的训练阶段内都是高效的。

【图 7:100 亿字符 Python 数据集上的训练曲线(按算力量参数化)——展示微调曲线更贴合算力前沿;横轴为训练算力 C,纵轴为损失 L】
图 7: 我们展示了在 100 亿(1010)字符的 Python 数据集上训练的训练曲线,按训练所用的算力量进行参数化。绿色(微调)曲线在训练过程中更贴近算力高效前沿,这意味着在实际训练中,我们不太可能因算力投入过度而浪费计算资源。

然而,如第 3.1 节中最小模型所示,一旦我们拥有的数据达到或超过从头训练所需的数据量,微调的收敛性能就会显著变差,因此在算力上也更低效。这一观察强调了一个重要观点:在决定是否使用微调时,必须考虑数据范围的判断。

许多模型训练至收敛(持续使用算力直到性能增益停止),而不是按算力高效前沿(性能和算力的 Pareto 前沿)训练 [KMH+20]。在图 8 中,我们用单点(收敛算力)总结每条曲线,从而能够同时查看我们在不同大小数据集上训练的所有模型。这种"快照"视图让我们能够直接比较不同实验条件下的总成本。

【图 8:所有模型的收敛算力散点图——同色点表示相同大小模型在不同数据集上的结果;横轴为数据集大小 D,纵轴为收敛算力 C】
图 8: 同一颜色下的不同点都表示在不同大小数据集上训练至收敛的给定大小的模型。圆圈表示微调模型,方块表示从头训练模型;二者之间的位置对比直接揭示了在给定模型大小下,微调达到收敛所需的算力相对从头训练的比例关系。关于"最佳 epoch"的分析提供了另一种关于收敛算力成本的视角,见附录 G

训练至收敛时:

  1. 在小数据集下,预训练模型比从头训练模型在算力上更高效。这意味着微调可以让小模型在保持甚至超过从头训练性能的同时,使用显著更少的算力。
  2. 对于任何给定的数据集大小,与从头训练相比,微调时更容易落在算力高效前沿上。这一特性使得微调在实际工程中更具吸引力,因为它减少了对算力精确调度(schedule)的依赖。

4 神经标度律(Neural Scaling Laws)

幂律可能源于多种多样的来源 [THK18]——复杂系统中广泛存在的尺度不变性、临界现象、以及数据流形的内在维度等,都可能产生幂律依赖。神经网络中可预测的标度趋势最早在 [HNA+17] 中得到研究,他们发现语言识别、机器翻译等任务上的损失与模型大小、数据量呈可预测的幂律关系。最接近我们方法的工作是 [RRBS19, KMH+20, HKK+20]。我们的关注点是迁移如何随算力、数据和参数标度,而不是从头训练时性能如何基于这些因素标度。

从历史脉络看,神经标度律的研究始于对训练损失与训练数据量之间关系的经验观察。当我们将模型大小、数据量和算力视为三个独立变量时,损失可以分解为两部分:一部分仅依赖于模型与数据的"信息瓶颈",另一部分则反映计算量的限制。[KMH+20] 给出了一个简洁的参数化形式,他们发现幂律指数在多个数量级范围内都成立。这一发现引发了后续大量的研究,将标度律推广到不同的模态(视觉、音频等)和不同的任务设置中。

我们的工作扩展了这一框架,首次系统地研究预训练带来的迁移如何参与标度律。核心发现是,迁移本身是可测量的(以有效数据 DT 为单位),且其大小以简单幂律依赖于模型规模和微调数据集。这一结果不仅在理论上统一了迁移与标度律的视角,也在实践上提供了一种原则性的方法来预测微调模型的表现。

5 相关工作(Related Work)

幂律可能源于多种多样的来源 [THK18]。神经网络中可预测的标度趋势最早在 [HNA+17] 中得到研究。最接近我们方法的工作是 [RRBS19, KMH+20, HKK+20]。我们的关注点是迁移如何随算力、数据和参数标度,而不是从头训练时性能如何基于这些因素标度。

迁移学习和元学习(meta-learning)在研究界众多模态下都得到了大量关注。我们将回顾一些启发我们的工作,但不会做全面的文献综述。以下是该领域的两篇最新文献综述:[TSK+18, Wen18]。迁移学习的发展可以分为三个主要阶段:第一阶段以特征迁移为代表(如预训练的视觉特征),第二阶段以参数迁移为代表(如微调预训练网络),第三阶段则关注分布之间的可量化关系——这正是本研究所在的位置。

我们在引言中讨论了语言模型的预训练。在图像数据集(如 Instagram 和 ImageNet)上的预训练同样在整体性能和数据效率上取得了提升 [MGR+18, HGD19]。CLIP 通过从带字幕图像的迁移展示了令人印象深刻的能力,在 ImageNet 等数据集上的零样本准确率可与 ResNet-50 相比 [RKH+21, DDS+09, HBB+21]。这些工作表明,跨模态和跨任务的迁移在现代深度学习中扮演着核心角色。

过去在小样本学习(few-shot learning)方面的工作是我们研究迁移的部分动机。[LST15] 通过概率程序归纳展示了生成手写字符的小样本学习,与人类在该任务上的小样本学习能力相当——这一对比说明人类在迁移方面相对于早期机器学习系统有压倒性优势。[FAL17] 表明设计易于微调的模型(MAML)可以提升小样本性能。[BMR+20] 利用现有基准表明,大型模型可以在 SuperGLUE [WPN+19] 等任务上产生有意义的迁移/小样本学习。

另一项激发我们研究迁移的重要工作是用于机械手解魔方的仿真到真实(sim-to-real)迁移训练 [OAA+19],在这种设置中微调数据远贵于预训练数据——这与自然语言处理中的情形类似,但在机器人领域更极端,因为真实机器人数据非常昂贵。我们感兴趣的另一种衡量泛化的方法是不断提出越来越困难的语言基准 [HBB+21],这有助于追踪模型泛化能力的边界。

6 局限性(Limitations)

尽管我们的结果在多个数量级上表现出惊人的可预测性,本研究仍有以下重要局限性:

  1. 模型未针对微调或代码进行调参。我们使用了为在自然语言上从头训练而调好的超参数 [KMH+20]。我们对较大模型在小数据集上微调进行了少量学习率扫描,没有看到使用其他学习率带来的改善。但我们的扫描并不全面。更系统的微调超参数搜索可能进一步改善微调性能,从而影响迁移系数的具体数值。
  2. 模型未针对小数据集进行调参。对于小数据集,训练在预热(warmup)阶段结束之前就停止了,因此学习率调度可能会干扰结果。这意味着我们报告的小数据集迁移效果可能是学习率调度不匹配造成的下界。
  3. 我们只在 Python 上微调时测量了迁移。尚不清楚对于广泛的分布对是否能观察到类似的幂律拟合。我们的方法是否对其他下游任务(如问答、摘要、翻译)同样有效,是未来工作的关键问题。
  4. 我们只在无监督设置中测量了分布之间的迁移。这些发现在多大程度上能推广到监督或强化学习设置尚不清楚。监督学习中的标签信息可能改变迁移的本质;强化学习中的奖励信号则可能引入不同的迁移模式。
  5. 我们没有像 [KMH+20] 中那样为从头训练的结果找到一个好的封闭形式模型。尽管我们相信更仔细的调参可以产生与他们的结果一致的此类模型。如果我们有这样的结果,我们预期可以为微调模型的整体性能生成一个封闭形式方程,而不是依赖我们定义中的相对性能。
  6. 我们只在 Transformer 上测量了性能。这些标度律是否同样适用于其他架构(如 LSTM、状态空间模型、卷积网络)是一个悬而未决的问题。架构变化可能影响幂律指数的具体数值。
  7. 方程 3.1 和 3.2 不能处理零样本情况。除非我们对零样本情况使用近似(即在 1 个字符上微调)。这一近似在数学上略显粗糙,但在实践中与零样本性能相当接近。
  8. 我们没有探索以更廉价的方式进行测量的可能性。无论是通过上下文(in-context)学习还是通过 KL 散度(KL divergence)等代理度量,我们都未尝试。这些替代方法可能让标度律的测量变得更加廉价和易于推广到更多场景。

7 结论(Conclusion)

我们已经证明迁移可以在广泛规模范围内的语言模型内被度量,并且它是可预测地标度的。我们用来度量迁移的单位——数据——是直观的,给定预训练模型,我们的方法可以在低数据范围内廉价地进行这样的测量。我们相信我们的方法是一种新颖且有用的方式来理解作为机器学习要素之一的数据以及 AI 系统的通用性。我们已经为微调生成了标度律,这最近成为一个广泛关注的课题。这些结果有助于预测规模化微调模型的性能、算力和数据需求。

更广泛地说,我们的工作展示了"以数据为单位思考"是一种有价值的分析视角。它将原本模糊的"迁移"概念转化为可测量的标度关系,使得我们可以像处理数据本身一样处理迁移。这为未来研究开辟了几个方向:

我们相信,理解数据(包括迁移带来的"虚拟数据")如何与模型规模和算力共同作用,是构建更强大 AI 系统的关键一步。

附录 A 数据范围(Data Regime)

为清晰定义实验中的"低数据范围",我们需要估计 D(N),即达到无限 Python 数据所能产生的性能 99% 所需的数据量。D(N) 大致定义了"无限数据范围"作为模型大小的函数。我们将 DF ≤ 10% 的 D(N) 视为低数据范围。

【图 9:Python 数据需求估计——横轴为模型参数 N,纵轴为达到 99% 性能所需的数据量 D(N)】
图 9: 估计 Python 数据需求曲线。D(N) 随模型规模增长,符合幂律 D(N)Nα 的预期,但带有明显噪声。

D(N) 是通过确定图 3 中具有数据集特定比例的曲线与完整数据集曲线相交的位置来计算的。相交定义为从头训练达到 99% 性能,微调达到 95% 性能。差异是基于最终拟合和微调相交看起来相对更嘈杂的主观判断做出的。这一阈值的设定反映了对微调模型性能上限的更保守估计。

附录 B 补充方程(Supplementary equations)

总有效数据 DE、迁移有效数据 DT 和微调数据集 DF 之间的关系在图 1 中可视化展示。为清晰起见,下面也以方程形式给出:

总有效数据 = DE = DT + DF  (B.1)

在图 2 中,纵轴是迁移有效数据的占比(fraction)。基于方程 (1.1)(B.1),我们给出其显式方程:

迁移有效数据占比 = DT / (DF + DT) = k(DF)α−1(N)β / [1 + k(DF)α−1(N)β]  (B.2)

这一方程在形式上是一个 logistic 函数:当 N 较大时(分子远大于 1),占比趋近 1;当 N 较小时(分子远小于 1),占比趋近 0。中间过渡区由常数 k 和指数 αβ 共同决定。

附录 C 为方程 1.2 生成拟合(Generating fit for Equation 1.2)

我们按 DF 分组的数据的良好拟合显示在图 10 的左侧。

【图 10:当我们注意到左侧单独拟合的直线非常好时……】
图 10: 当我们注意到左侧单独拟合的直线在对数-对数坐标下非常直时,我们尝试构造一个全局拟合。

我们寻求为我们的实验找到一个全局拟合,目标是产生更多见解并增强预测能力。最终起作用的方法是对拟合进行再拟合。我们注意到图 10 右侧的 logit 拟合都具有大致相同的指数。因此我们尝试将以下方程拟合到这些拟合上:

迁移有效数据占比 = DT / (DF + DT) = 1 / [1 + (N*/N)0.38]  (C.1)

N* 的拟合随后被用来生成图 2 左侧所示的全局拟合,对应方程 (1.1)。此拟合对每个我们微调过的数据集大小 DF 给予相同权重。类似的方法用于生成方程右侧的拟合。

在迁移有效数据占比的对数逻辑轴上发现这些漂亮的直线之前,我们尝试在数据中寻找其他规律性。我们单独绘制了有效数据。

【图 11:初步绘制有效数据——在对数空间中得到略有噪声但有规律的直线】
图 11: 初步绘制有效数据是有希望的,因为它似乎在对数空间中得到了一些带有噪声但有规律的直线。

我们还在 DT/DF 中寻找模式。当我们用 D(N)DT/DF 进行归一化(如图 6 所示)时,结果相对有希望。然而,一旦我们看到 DT/DE 在 logit 轴上绘制时的漂亮直线,我们便完全专注于这条分析线。

【图 12:上述模型在 5.5×109 Python 字符上微调;横轴为训练步数,纵轴为损失】
图 12: 上述模型在 5.5×109 Python 字符上微调。曲线展示了从头训练与微调在学习动态上的差异。

附录 D 图 3,包括中等数据范围(Figure 3, including medium data regime)

从下面的图 13 可以看出,方程 3.2 给出的拟合在这些分布的迁移中,在中等数据范围 D(N) > 0.10 时表现不佳。

【图 13:一旦离开低数据范围,模型拟合就不再好;横轴为参数 N,纵轴为损失】
图 13: 一旦离开低数据范围,我们对这些模型就不再获得良好的拟合。对于仅在文本上预训练的模型,拟合的崩溃程度没有那么大。我们仍然只显示 DT > 0 的点。

我们推测在高数据范围内行为不那么规则(不再能拟合为直线),原因有两个:

  1. 通过插值估计有效数据在高数据范围内是病态的(poorly conditioned)。图 3 中高数据范围内的曲线几乎彼此重叠,因此模型性能的微小变化可能会产生很大的影响。
  2. 正如我们在第 6.4 节中讨论的那样,我们认为在高数据范围内调参(tuning)更为重要,而我们所做的调参相对较少。

附录 E 尝试为从头开始的 Python 运行生成全局拟合

我们尝试为从头开始的 Python 运行拟合全局幂律,正如 [KMH+20] 对语言模型所做的那样,以及 [HKK+20] 对更多模态所做的。具体来说,我们尝试将 [KMH+20] 的方程 1.5 拟合到图 3 左侧所示的运行中:

L ≈ [ (NC/N)αN/αD + DC/D ]αD  (E.1)
【图 14:对从头开始的 Python 模型拟合未能足够好到作为微调额外拟合的基础】
图 14: 上述对在 Python 上从头训练的模型的拟合不够好,无法用作微调的统一标度律的基础。

在我们看来,更仔细地调参这些实验似乎可能在此处生成良好拟合,但拟合质量太差,无法作为统一标度律的基础。也可能是 (E.1) 的修改版本([RRBS19] 中提出的那种)会更合适。我们所说的"统一标度律"是指对在 Python 上微调的函数 L(N, DF),其系数与 L(N, D) 拟合相同——如图 (E.1) 所示针对从零开始训练的 Python 模型。

附录 F 应对文本数据集中存在少量 Python 的潜在担忧

我们进行了额外的实验,以表明第 6.2 节中讨论的大部分零样本迁移是来自从文本到 Python 的"迁移"的结果。我们较大模型的零样本性能与我们预期的大致相当——大约相当于在大小约为我们文本数据集 0.3% 的 Python 量上从头训练的性能。我们没有试图测量测试数据集中的 Python 量,而是在预训练中加入了一个已知的 Python 量 0.3%。如果我们仅仅测量自然语言数据集中的 Python 量,我们会预期有效的 Python 数据量增加 2 倍。然而,将 0.3% 混合进去实际上将有效 Python 数据量增加了 4.5 倍。通过这个实验,我们得出结论:在前面图表中测量到的大部分确实是"迁移"——从文本分布到 Python 分布——而不是预训练分布中未受控的 Python 量。

这个实验设计的关键在于对比"将 Python 混入预训练"与"在 Python 上预训练"的效果差异。如果预训练性能提升主要是由于偶然接触了 Python,那么引入 0.3% 的 Python 应当导致有效数据量大致翻倍(因为 Python 量从原本的 ~0.15% 增加到 0.45%)。但实际上我们观察到 4.5 倍的提升,远超简单的线性外推。这一结果表明,迁移机制比简单的"预训练数据中的目标分布含量"要微妙得多——它涉及模型对分布之间共享结构的某种抽象。

附录 G 最佳 epoch 的分析

对于微调来说,一个重要的实践问题是需要训练多长时间网络性能才会饱和。简短的回答是:如果数据集相当大,那么所需时间与从头训练大致相同——代码任务 1-10 个 epoch,其中 epoch 数通常随模型大小和数据增加而减少。

【图 15:在大量数据上微调所需的 epoch 数与从头训练大致相同,而在少量数据上微调则需要 2-5 倍更少的 epoch】
图 15: 在大量数据上微调所需的 epoch 数与从头训练大致相同,而在少量数据上微调则需要 2-5 倍更少的 epoch。用 D(N) 进行参数化使模式显得更清晰。

如果微调数据集很小,只需训练它并在明显过拟合(overfit)时进行早停止即可。对于我们最小的数据集(100,000 个 token),它比从头训练少需要 2-5 倍的 epoch。Z 形曲线有点令人惊讶,其形状与 [NKB+19] 中观察到的有些相似。另一个限制是,对于少量数据,大部分学习发生在预热(warmup)期间,因此学习率调度会干扰最佳 epoch 数。这意味着在小数据实验中,最佳 epoch 的测量具有较大的不确定性。

值得注意的是,在低数据范围内,最佳 epoch 数随数据集大小的减少而增加,这反映了在小数据集上过拟合风险增大、需要更仔细的早停止的事实。在高数据范围内,最佳 epoch 数趋于一个由模型架构决定的下界值——这是收敛的自然表现。

致谢(Acknowledgments)

我们感谢 Dario Amodei、Jacob Steinhardt、Wojciech Zaremba、Alec Radford、Tom Brown、Alex Ray、Paul Christiano、Amanda Askell、Yura Burda、Ilya Sutskever、Jacob Hilton、Matthias Plappert 和 Jakub Pachocki 对本工作的反馈以及诸多有益的讨论。他们在不同阶段的讨论和批评极大地改善了我们的实验设计和表述。

作者贡献(Contributions)

Danny Hernandez 领导了该项目。他完成了大部分实验、分析和写作工作。他负责设计实验方案、运行所有微调实验、进行数据分析并撰写论文初稿。

Jared Kaplan 直接为分析做出了贡献,并从项目构思阶段就担任顾问。他在标度律的数学形式化、实验设计的严格性、以及结果解读方面提供了关键的智力指导。

Tom Henighan 维护了底层代码库,并合作解决了出现的工程难题。他的工作包括训练基础设施的搭建、bug 修复,以及与 Danny 一起调试训练过程中出现的各种数值稳定性问题。

Sam McCandlish 监督了这项工作。除了帮助规划项目并就方向提供建议外,他还生成了数据集,合作解决了出现的工程难题,并直接为分析做出了贡献。他在论文的科学方向和实用性之间取得了关键的平衡。

参考文献(References)