✋ 许多人都认为大模型的性能和模型的结构、大小、训练计算量、数据集大小有关,但是究竟这些因素如何影响大模型的最终性能?了解这些可以帮助更好地决定究竟投入那些资源来训练所需的模型
背景和内容#
OpenAI在2020年发布了《Scaling Laws for Neural Language Models》探讨Scaling Laws(缩放法则),在其中探讨了对于基于Transformerde的大模型的Training Loss与模型参数规模N,数据集大小D,计算量C之间的联系。
而在2022年四月谷歌DeepMind在文章《Training Compute-Optimal Large Language Models》中重新讨论了Scaling Laws,他们指出当前的大模型都明显缺乏足够的训练,在使用四倍的数据(相较于280B参数Gopher)训练70B的Chinchilla后取得了更好的成绩(SOTA average accuracy of 67.5% on the MMLU benchmark, 7% increasement)。
然而,在2023年二月由Thaddée Tyl发布的博客《Chinchilla’s Death》(Chinchilla之死)中,指出,只要训练足够长时间,小模型也能超过大模型。
Scaling Laws for Neural Language Models#
主要发现#
- 模型性能随模型大小N,数据大小D和计算量大小C的增加而提高,和模型形状(深度宽度)与自注意力头弱相关
- 在其他因素不受限的情况下,模型大小N、数据大小D、计算量大小C与性能存在幂律关系
- 同时扩大模型大小N和数据大小D可以提升模型性能,但是文章研究认为当模型大小增加8倍时,数据大小只需要增加5倍,这种情况下不会受到性能惩罚
- 由于训练曲线遵从幂律关系,损失与模型大小无关,因此我们可以大致预测后续训练的损失
- ?在迁移到另一个与训练集不同的数据集上时存在一个惩罚(更大的误差),但是这一个惩罚是恒定的,这意味着其他的提升是共通的
- 大模型相对于小模型有更高的样本效率(sample-effcient),达到相同的水平只需要使用更少的训练(Figure 2)和更少的数据(Figure 4)


- 收敛是低效的,在计算量大小C固定时,可以在模型没完全收敛之前停止训练来获取最佳性能(Figure 3)。论文给出参考关系为D∼C0.27

- 训练的理想batch size应该是训练的幂,并通过梯度噪音尺度(gradient noise scale)继续确定
Scaling Law 总结#
参数:
non-embedding parameters N
the dataset size D
optimally allocated compute budget Cmin
在其他两因素不受限的情况下,测试损失可以由以下公式预测:
- N受限
L(N)=(Nc/N)αN
αN∼0.076,Nc∼8.8×1013(non-embedding parameters)
- D受限(with early stopping)
L(D)=(Dc/D)αD
αD∼0.095,Dc∼5.4×1013(tokens)
- C受限
L(Cmin)=(Ccmin/Cmin)αmin
αCmin∼0.050,Ccmin∼3.1×108(PF-days)
公式含义:
在以上三个公式中,αN,αD,αCmin给出了当我们提升N,D,Cmin时性能提升的幂次。
举个例子,当我们将模型的参数量提升到两倍时,模型的损失将会减小,2−αN≈0.95,因此损失将会是此前的0.95倍。而NC,DC,CCmin的准确数字基于字典大小和tokenization因此没有实际意义,只代表数量级关系。
此外,文章还提到了batch size和loss的关系
Bcrit(L)=L1/aBB∗
B∗∼2⋅108tokens,αB∼0.21
根据此前公式(1)和公式(2)可以得出,当我们提升模型大小时,我们应相应地增加数据集的数量,可以根据计算得出D∝NαDαN∼N0.74。他们还发现一个结合(1)和(2)的公式来控制N和D的依赖以及控制过拟合:
L(N,D)=[(NNcαDαN+DDc)]αD
- 作者推测这个函数也能生成其他生成式任务的最大对数似然
训练的曲线也可以由训练step数得出,因此可以求得最佳训练step数
L(N,S)=(NNc)αN+(Smin(S)Sc)αS
Sc≈2.1×103,αS≈0.76
Smin(S) is the minimum possible number of optimization steps (parameter updates) estimated using Equation
在固定计算量C的情况下,又得出了以下关系公式
N∝CαCmin/αN,B∝CαCmin/αB,S∝CαCmin/αS,D=B⋅S
此处有
αCmin=1/(1/αS+1/αB+1/αN)
可得N∝Cmin0.73,B∝Cmin0.24, and S∝Cmin0.03,此处提出观点:
- 当计算量C预算提升的时候,应该主要将其用于更大的模型,而不是更多的训练时间和数据大小。
- 同时当模型变得更大时,他们变得更加sample efficient。
研究方法#
研究在数据集WebText2及其拓展(2.29×1010 tokens),tokenize方法为 byte-pair encoding,词汇大小nvocab=50257,性能指标(Loss)为在1024个token上下文的中的交叉熵损失。模型使用的是decoder-only的Transformer,同时训练了LSTM和其他类型的Transformer作为比对。
除特别说明外,模型的训练使用了Adam优化器和2.5×105步,batch size为512,上下文512 token。由于内存限制,最大的模型使用了Adafactor优化器。
除特别说明外,训练的学习率是一个3000步的热身和一个cosine decay余弦衰减到零。
模型的参数计算方法
为了计算模型参数和计算量,模型的超参数定义为:
| nlayer |
层数 number of layers |
| dmodel |
残差流的维度 dimension of the residual stream |
| dff |
前馈层(全连接)的维度 dimension of the intermediate feed-forward layer |
| dattn |
注意力输出的维度 dimension of the attention output |
| nheads |
每层注意力头数量 number of attention heads per layer |
| nctx |
上下文词元数量,除另说明外为1024 input context |
使用N代表模型的参数大小,这里定义为除去embedding的参数:
N≈2dmodelnlayer(2dattn+dff)=12nlayerdmodel2
dattn=dff/4=dmodel
这里省去了embedding层的nvocabdmodel和nctxdmodel参数,向前传递大概需要计算量C如下表示:
Cforward≈2N+2nlayernctxdmodel

实验结果#
实验变量:
- 模型大小(非嵌入参数从768个到15亿个不等)
- 数据集大小(从2200万到230亿个token)
- 形状(包括深度、宽度、注意力头和前馈维度)
- 上下文长度(1024,但也会尝试更短的上下文)
- 批量大小(219,但也会改变它以测量临界批量大小)


结论:
- 在非嵌入模型大小N固定的情况下模型的形状对性能的影响很小,调整很大也只影响几个百分点
- 如果计算嵌入的参数大小,那模型的性能和层数有较大关联(左图),但是如果去掉嵌入层的参数大小,则除了小于两层的模型,不同层数模型的性能基本在同一个趋势上(右图)。
- 在LSTM上同样适用,但是LSTM性能比Transformer差一点
- 幂律定理公式成立:
L(N)L(D)L(Cmin)≈(Nc/N)αN≈(Dc/D)αD≈(Ccmin/Cmin)αmin
Training Compute-Optimal Large Language Models#
[1] https://arxiv.org/pdf/2001.08361.pdf
[2] https://arxiv.org/pdf/2203.15556.pdf
[3] https://espadrine.github.io/blog/posts/chinchilla-s-death.html
[4] https://arxiv.org/pdf/2109.10686.pdf
[5] https://self-supervised.cs.jhu.edu/sp2023/files/17.retrieval-augmentation.pdf