OpenAI的Scaling Law论文笔记

OpenAI的Scaling Law论文笔记

这个论文其实叫Scaling Laws for Neural Language Models,是OpenAI在2020年发表的一篇文章。OpenAI作为当今最成功的一家公司,其成功我认为很大程度上就是对Scaling Law的坚信,这一篇论文是他们有关Scaling Law的一项理论成果,感觉还是很给人以启发的。昨天晚上我刚好看到OpenAI在日本地区的负责人提到,GPT-5会比GPT-4的计算多一百倍类似的话,说明Scaling Law还在生效,所以我觉得还是有必要回顾一下Scaling Law的。

摘要

这个摘要我感觉直接把本文的重要结论直接写出来了,感觉直接翻译一遍都不为过。

第一句:本文研究了在交叉熵上,语言模型的经验性扩展规律。这里强调了一个交叉熵。

第二句是一个比较重要的结论:模型损失随着模型大小、数据集大小以及用于训练的计算量呈幂律缩放,部分趋势跨越了七个数量级,说明七个数量级都有效。

第三句是一个有意思的发现:网络的宽度或深度等其他架构细节在相当大的范围内对性能影响不大。所以有人说如果相信Scaling Law的话,可能Autoregressive和Diffusion的model都会收敛到一块,不知道是不是因为这个发现。

第四句我感觉是一个指导性的话:作者首先发现了简单的公式可以描述过拟合与模型/数据集大小的关系以及训练速度与模型大小的关系。那么。这些关系使我们能够在固定计算预算下确定最佳分配方案

第五句就更是实践上的建议:较大的模型具有显著的样本效率(这个样本效率我理解就是固定的样本数,较大的模型损失降低的更快),因此,最优的计算效率训练方式是使用较大的模型,配合相对适中的数据量,并在远未达到收敛时停止训练

一、Introduction(这一章其实主要讲得是结论)

引言首先明确了这个论文是研究在Transformer结构下,语言模拟的Loss模型结构、数据集大小以及用于训练的计算量的关系,值得注意的是评价的标准是Loss。还提到了发现的趋势在七个数量级上都符合,其实直观看的话就是下图。第一个是用于训练的计算量 C C C,这个用于训练的计算量可能有一点点难以理解,大概就是单次正向传播模型所需的计算次数乘以计算时间的一个量,,所以单位是PF-days,PF是计算量,days是时间。第二个是数据集的大小,第三个是参数量,参数量这里强调了要除过embedding部分的参数量,后面也会有解释。反正都是可以看到一条下降的曲线的。(虽然作者拉伸了一下坐标轴,让它看起来是直线)。

在这里插入图片描述

1.1 一些结论

接着作者给出了一系列重要的总结,有时一些我觉得直接翻译也不为过的话:

  1. 性能取决于规模,而模型形状的影响较弱:模型性能主要依赖于三个因素的规模:模型参数数量 N N N(不包括嵌入层)、数据集大小 D D D 和用于训练的计算量 C C C。在合理范围内,其他架构超参数(例如深度与宽度的比值)对性能的影响非常小。
  2. 平滑的幂律关系:模型性能与三个规模因子 N N N、$ D 、 、 C$ 分别呈现幂律关系(在另外两个因素可以认为是无限的),趋势跨度超过六个数量级(见上图)。而且没有发现这些趋势在高端规模下的任何偏离迹象,尽管性能最终在接近零损失之前必然会趋于平稳。
  3. 过拟合的普遍性:只要同时扩大模型参数数量 N N N 和数据集大小 D D D,性能会持续改善,但如果只增加 N N N D D D,而另一个保持不变,则会进入收益递减的状态。性能损失与比率 N 0.74 / D N^{0.74}/D N0.74/D 有关,也就是说每当模型大小增加8倍时,我们只需要将数据集增加大约5倍,以避免性能损失。
  4. 训练的普遍性:训练曲线遵循可预测的幂律关系,其参数大致独立于模型大小。通过外推训练曲线的早期部分,我们可以粗略预测如果训练更长时间可能会达到的损失。
  5. 迁移性能与测试性能同步提升:当在与训练数据分布不同的文本上评估模型时,结果与在训练验证集上的表现高度相关,并且损失存在一个大致恒定的偏移量——换句话说,迁移到不同的数据分布会产生一个固定的惩罚,但除此之外,性能会大致与在训练集上的表现同步提升。
  6. 样本效率:大模型比小模型具有更高的样本效率,能够通过较少的优化步骤和较少的数据点达到相同的性能水平。
  7. 收敛效率低下:在固定的计算预算 C C C 下,最佳性能是通过训练非常大的模型,并在远未收敛之前停止训练来实现的。因此,最大限度的计算效率训练比预期的要高效得多,因为数据需求的增长非常缓慢,约为 D ∼ C 0.27 D \sim C^{0.27} DC0.27
  8. 最优批次大小:理想的批次大小大致是损失的幂次函数,并且可以通过测量梯度噪声规模来确定(这个我有一点点不太理解啥叫梯度噪声规模)。对于我们能训练的最大模型,在收敛时批次大小大约是100万到200万个token。(

所以作者在给出这些总结之后给了一句定性的话,我觉得也是OpenAI现在很重要的摇钱树:综上所述,这些结果表明,只要我们适当增加模型大小、数据量和计算量,语言模型的性能会平滑且可预测地提升。我们预计,未来更大的语言模型将比现有模型具有更好的表现,并且具备更高的样本效率。

1.2 Scaling Law在数学上的形式化

这一小部分作者就是讲Scaling Law的形式化,其实是。首先是一个量为变量,其他两个量都视为无限或最佳的时候,有:
L ( N ) = ( N c N ) α N        L ( D ) = ( D c D ) α D       L ( C min ) = ( C min c C min ) α min L(N) = \left(\frac{N_c}{N}\right)^{\alpha_N} \ \ \ \ \ \ L(D) = \left(\frac{D_c}{D}\right)^{\alpha_D} \ \ \ \ \ L(C_{\text{min}}) = \left(\frac{C_{\text{min}}^c}{C_{\text{min}}}\right)^{\alpha_{\text{min}}} L(N)=(NNc)αN      L(D)=(DDc)αD     L(Cmin)=(CminCminc)αmin
其中使用的是 C min C_\text{min} Cmin而不是 C C C的原因是,计算资源的分配似乎也会一定程度上影响结果,例如batch size的大小,不过这个batch size的大小在大多数实验中是固定的,只有在某些特殊标记的时候会单独说明,所以不用在这里特别纠结。

作者还说了8个数量级的 C min C_\text{min} Cmin,6个数量级的 N N N,和2个数量级上的 D D D,这个公式都成立。通过这个公式,就可以指导性的来预测大语言模型的损失的性能。比如说通过这个公式可以估计,大模型参数量*2,Loss会乘以95%。

作者提到了最优的Batch size也其实是按照L呈幂律分布的一个值,如下
B crit ( L ) = B ∗ L 1 / α B B_{\text{crit}}(L) = \frac {B_*} {L^{1/\alpha_B}} Bcrit(L)=L1/αBB
事实上,关于N和D的scaling law还可以合并为
L ( N , D ) = [ ( N c N ) α N α D + D c D ] α D L(N, D) = \left[ \left(\frac{N_c}{N}\right)^{\frac {\alpha_N} {\alpha_D}} + \frac{D_c}{D} \right]^{\alpha_D} L(N,D)=[(NNc)αDαN+DDc]αD
当然,在给定优化次数的时候,也有相应的公式
L ( N , S ) = ( N c N ) α N + ( S c S min ( S ) ) α S L(N, S) = \left(\frac{N_c}{N}\right)^{\alpha_N} + \left(\frac{S_c}{S_{\text{min}}(S)}\right)^{\alpha_S} L(N,S)=(NNc)αN+(Smin(S)Sc)αS
当在固定计算预算 $ C_{\text{min}}$下进行训练时,最优的模型参数量,Batch size大小,以及优化次数,也有如下关系:
N ∝ C min α C min / α N , B ∝ C min α C min / α B , S ∝ C min α C min / α S , D = B × S N \propto C_{\text{min}}^{\alpha_C^{\text{min}}/\alpha_N}, \quad B \propto C_{\text{min}}^{\alpha_C^{\text{min}}/\alpha_B}, \quad S \propto C_{\text{min}}^{\alpha_C^{\text{min}}/\alpha_S}, \quad D = B \times S NCminαCmin/αN,BCminαCmin/αB,SCminαCmin/αS,D=B×S
其中
α C min = 1 1 / α S + 1 / α B + 1 / α N \alpha_C^{\text{min}} = \frac{1}{1/\alpha_S + 1/\alpha_B + 1/\alpha_N} αCmin=1/αS+1/αB+1/αN1
这里也给出了个结论,就是因为 C min α C min / α N C_{\text{min}}^{\alpha_C^{\text{min}}/\alpha_N} CminαCmin/αN较大,所以在计算量增加的时候,应该先去增加模型大小,也是在这里提出了摘要中的结论:较大的模型具有显著的样本效率,因此,最优的计算效率训练方式是使用较大的模型,配合相对适中的数据量,并在远未达到收敛时停止训练

二、背景知识

这里写了一些有关实验设置的关键信息。

首先作者使用的数据集是WebText2这个数据集,vocabulary size 是 50257(好大啊),优化目标是交叉熵,context长度是1024,优化器是Adam,总共优化 2.5 × 1 0 5 2.5\times10^5 2.5×105步,batchsize是512,(这里还提到最大的模型,即1B的模型是使用Adafactor训练的),这里还提到了发现收敛有学习率的调度器关系不大,所以作者用了一个前3000步linear warmup,后面不断衰减到0的学习率优化器。

数据集也有一些具体的描述,包括了20.3M个不同的文档,有96GB的文本,即 1.62 × 1 0 10 1.62\times 10^{10} 1.62×1010个词,最后得到了 2.29 × 1 0 10 2.29\times 10^{10} 2.29×1010个token,只保留了 6.6 × 1 0 8 6.6\times 10^8 6.6×108个token作为测试集。

三、基础的幂律分布

3.1 Transformer的形状与超参数独立性

大概就是实验说明了Transformer模型的性能在保持非嵌入参数总数N固定的情况下,对形状参数(如层数 $ n_{\text{layer}} $、注意力头数 $ n_{\text{heads}} $、前馈网络维度 $ d_{\text{ff}} $的依赖性非常弱。

3.2 非嵌入参数数量N对性能的影响

在这里插入图片描述

作者对从小型模型(例如,$ n_{\text{layer}} = 2 $, $ d_{\text{model}} = 128 )到包含数十亿参数的大型模型(例如, )到包含数十亿参数的大型模型(例如, )到包含数十亿参数的大型模型(例如, n_{\text{layer}} = 207 $, $ d_{\text{model}} = 768 $)的各种模型进行了训练,观察了其在WebText2数据集上的性能。

首先发现的是并没有出现overfitting,还挺好。然后得到了上面Scaling Law有关模型大小的第一个公式$L(N) = \left(\frac{N_c}{N}\right)^{\alpha_N} $

这里作者提到了为什么要使用非嵌入参数量而不是全部的参数量,因为发现用了全部的参数量之后,好像会看起来和模型深度有关系,而不是和参数量,如上图。去掉了嵌入层之后,发现就没有这个问题了。这里还提到在不削弱模型性能的前提下,embedding层可以变得更小。

这里还提到了一个前面提到的结论,迁移性能与测试性能同步提升:当在与训练数据分布不同的文本上评估模型时,结果与在训练验证集上的表现高度相关,并且损失存在一个大致恒定的偏移量——换句话说,迁移到不同的数据分布会产生一个固定的惩罚,但除此之外,性能会大致与在训练集上的表现同步提升。

3.3 数据集大小和计算量的影响

为了研究数据集大小对测试损失的影响,作者在固定了模型大小 $ (n_{\text{layer}} = 36, d_{\text{model}} = 1280) $,然后在WebText2数据集的不同子集上进行训练。在测试损失不再下降时停止训练。然后可以得到scaling law的第二个公式:
L ( D ) ≈ ( D c D ) α D L(D) \approx \left(\frac{D_c}{D}\right)^{\alpha_D} L(D)(DDc)αD
由于用于训练的非嵌入计算量 $ C $ 可以估算为 $ C = 6NBS $,其中 $ B $ 是批次大小,$ S $ 是参数更新的次数,前面的6倍系数代表前向传播和反向传播的计算量。对于给定的计算量 $ C $,我们可以通过扫描不同的模型大小 $ N $ 来找到每个步骤 $ S $ 的最佳模型。但是需要主要的是,批次大小 $ B $ 对所有模型保持固定,因此这些结果并不完全最优。反正也是得到了第三个公式:
L ( C ) ≈ ( C c C ) α C L(C) \approx \left(\frac{C_c}{C}\right)^{\alpha_C} L(C)(CCc)αC

四、数据与模型大小的Scaling Law

4.1 关于L(N,D)的Scaling Law

很显然的,关于N和D的scaling law可以进行合并为下式,N趋于无穷的时候就是关于D的Scaling Law,D趋于无穷的时候就是关于N的Scaling Law。作者花了一个比较长的篇幅来解释为什么不是别的形式,这里就不再细讲了。
L ( N , D ) = [ ( N c N ) α N α D + D c D ] α D L(N, D) = \left[ \left(\frac{N_c}{N}\right)^{\frac {\alpha_N} {\alpha_D}} + \frac{D_c}{D} \right]^{\alpha_D} L(N,D)=[(NNc)αDαN+DDc]αD

4.2 关于过拟合的讨论

这一段我觉得在实践上具有较强的指导意义!

作者定义了一个衡量拟合程度的指标
δ L ( N , D ) ≡ L ( N , D ) L ( N , ∞ ) − 1 \delta L(N, D) \equiv \frac{L(N, D)}{L(N, \infty)} - 1 δL(N,D)L(N,)L(N,D)1
接着,作者提到损失的随机波动大约为0.02。这意味着,为了在训练时避免过拟合到达这个阈值(即损失随机波动为0.02),数据集大小需要满足以下条件:(下面这个条件,没有给推导过程就就直接给了,我估计是 δ L ( N , D ) < = 0.02 \delta L(N, D) <=0.02 δL(N,D)<=0.02,然后算出来:
D ≳ ( 5 × 1 0 3 ) × N 0.74 D \gtrsim (5 \times 10^3) \times N^{0.74} D(5×103)×N0.74
这一关系表明,小于 1 0 9 10^9 109 个参数的模型可以在220亿token的WebText2数据集上训练时不发生显著的过拟合,但对于最大的模型,可能会遇到轻微的过拟合。更广泛地讲,这一公式显示数据集大小随着模型大小的增加而以亚线性速度增长,以避免过拟合。

五、训练时间与模型大小的Scaling Law

5.1 在训练时对于 B c r i t ( L ) B_{\text crit}(L) Bcrit(L)的调整

作者在这里提到了一个概念,关键batch size。就是对于batch size有一个说法就是batch size较大时可以减少训练的步数(因为好几个一起训练了),batch size较小时可以更有效利用资源(就是不会好几个一起合并着反向传播了我的理解是)。所以batch size有一个关键的平衡的值。接着经过一番推导和实验,作者发现关键batch size只和loss有关,公式为:
B crit ( L ) ≈ B ∗ L 1 / α B B_{\text{crit}}(L) \approx \frac{B^*}{L^{1/\alpha_B}} Bcrit(L)L1/αBB
接着作者推到了两个有意思的量,这两个量非常难理解,反复看了好多遍才明白。

第一个量衡量的是在以batchsize为 2 19 2^{19} 219进行训练S轮在一个远大于 B crit B_{\text{crit}} Bcrit的batchsize B下训练的轮数的关系,根据之前我们的讨论,在一个远大于 B crit B_{\text{crit}} Bcrit的batchsize B下训练的轮数的关系,会使得轮数尽可能的少,所以这个量是$S_{\text{min}}(S) $,有
S min ( S ) = S 1 + B crit ( L ) / B S_\text{min}(S) = \frac {S} {1+B_\text{crit}(L)/B} Smin(S)=1+Bcrit(L)/BS
第二个量衡量的最少的计算资源 C min ( C ) C_\text{min}(C) Cmin(C),这次是在一个远小于 B crit B_{\text{crit}} Bcrit的batchsize B下训练的轮数的关系。有
C min ( C ) = C 1 + B / B crit ( L ) C_\text{min}(C) = \frac {C} {1+B/B_\text{crit}(L)} Cmin(C)=1+B/Bcrit(L)C

5.2 $L(N, S_{\text{min}}) $ 的结果和模型规模与计算量的性能

作者在这里给出了有关 L ( N , S min ) L(N, S_{\text{min}}) L(N,Smin)的scaling law
L ( N , S min ) = ( N c N ) α N + ( S c S min ) α S L(N, S_{\text{min}}) = \left( \frac{N_c}{N} \right)^{\alpha_N} + \left( \frac{S_c}{S_{\text{min}}} \right)^{\alpha_S} L(N,Smin)=(NNc)αN+(SminSc)αS
其实这里更有趣的是画了一个有趣的图,即下图。左边的是我觉得很有趣的,颜色一样的线代表计算量恒定,可以看到test loss是随着模型大小先变低再变高。右边的图因为step固定,所以模型越大,优化效果越好,也是合理的。

在这里插入图片描述

5.3 Early Stop的理论下界

当数据有限的时候,为了避免过拟合,会使用早停策略。作者在这里给出了一个达到损失 L L L的最少步数,为
S stop ( N , D ) ≳ S c ( L ( N , D ) − L ( N , ∞ ) 1 / α S ) 1 / α S S_{\text{stop}}(N, D) \gtrsim S_c \left( \frac{L(N, D) - L(N, \infty)}{1/\alpha_S} \right)^{1/\alpha_S} Sstop(N,D)Sc(1/αSL(N,D)L(N,))1/αS

六、计算资源的最佳分配

这一章我觉得是一个比较practical的建议了。

6.1 最佳表现与分配

6.1部分其实就讨论了一个简单的问题,在给定计算资源 C min C_\text{min} Cmin时,最优的模型大小是多少,然后发现了模型大小与计算资源的关系是
N ( C min ) ∝ C min 0.73 N(C_\text{min}) \propto C_{\text{min}}^{0.73} N(Cmin)Cmin0.73
同时发现,最优的步数随计算资源增加却几乎不变。
S ( C min ) ∝ C min 0.03 S(C_\text{min}) \propto C_{\text{min}}^{0.03} S(Cmin)Cmin0.03
所以为了取得一个良好的Loss,在有限的计算资源的时候该怎么做呢,作者的建议是增加模型大小,同时增加Batch size,保持训练步数几乎不怎么增加。

6.2 好像是从另外一个角度推了上面的公式,就不讲了

6.3 矛盾和猜想

6.3 是正文的最后一个部分,倒是给出了很多很启发的猜想,也是我觉得逐句翻译都不为过的一段。

第一段先说,Scaling Law这种趋势在无限扩展的情况下是不现实的。因为自然语言本身的熵是有限的。

第二段提出了一个假设:Scaling Law在某个点失效后,这个点代表的可能是Transformer Language Model达到了性能极限。

接着最后进行了一些推导后提出了一个假设,或者可能甚至是结论:在达到某个Loss后,就会用完所有自然语言的素材。当然这个Loss还可以给语言的熵提供一个估计。

八、总结

总结里写了很多之前的内容,就不重复了。

在总结的最后一段,2020年的作者,提出了一个伟大的展望,Our results strongly suggest that larger models will continue to perform better, and will also be much more sample efficient than has been previously appreciated.,模型的结果暗示更大规模的模型会持续的表现更好,而且会更加的sample efficient。OpenAI也确实借助Scaling Law不断的成功。但是在2024年的现在,似乎大家都遇到了一些瓶颈,不知道是scaling law失效了,还是什么问题,那该怎么解决这个问题呢?我觉得,请看2024年OpenAI秋季发布会,我猜他们会告诉我们答案的。

Scaling Law(扩展定律)是指在计算机科学和计算机工程领域中,用于描述系统性能随着资源规模的增加而变化的规律。它是一种经验法则,用于预测系统在不同规模下的性能表现。 根据Amdahl's Law(阿姆达尔定律)和Gustafson's Law(古斯塔夫森定律),Scaling Law可以分为两种不同的模型: 1. Amdahl's Law(阿姆达尔定律):该定律由Gene Amdahl提出,用于描述在系统中存在串行部分时,系统性能的上限。根据阿姆达尔定律,当我们增加系统中可并行执行的部分的比例时,系统的加速比将受到串行部分的限制。公式表示为: Speedup = 1 / [(1 - P) + (P / N)] 其中,P表示可并行执行的部分所占比例,N表示处理器的数量。该定律表明,无论我们如何增加处理器数量,如果串行部分的比例不变,系统的加速比将受到限制。 2. Gustafson's Law(古斯塔夫森定律):该定律由John L. Gustafson提出,与阿姆达尔定律相反,它假设问题规模会随着系统资源的增加而增加。根据古斯塔夫森定律,当我们增加系统中的资源(如处理器数量)时,问题规模也会相应增加,从而保持相同的执行时间。公式表示为: Speedup = N + (1 - N) * P 其中,N表示处理器的数量,P表示可并行执行的部分所占比例。该定律表明,通过增加系统资源,我们可以处理更大规模的问题,并在相同的时间内完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值