文章目录
- scaling law
- 一个token的计算量
- 幂律关系
- 幂律规律
- 实际指导
scaling law
幂律法则:对大模型数据量、参数量、算力之间的最优分配
- 不仅仅是对语言大模型,对主要基于tranformer的多模态大模型基本都有效
对于Decoder-only结构模型(GPT架构),计算量C(Flops),模型参数量N(除去Embedding部分),数据大小D(tokens数),三者的关系为 C ≈ 6 N D C≈6ND C≈6ND
- decoedr层数: l l l
- attention隐层维度: d d d
- attention feedforward层维度: d f f d_{ff} dff,一般来说 d f f = 4 ∗ d d_{ff}=4*d dff=4∗d
- 模型参数量N,忽略embedding,norm和bias
- transformer每层包括self-attention和MLP两部分
- self-attention参数为 W Q , Q K , W V , W O W_Q,Q_K,W_V,W_O WQ,QK,WV,WO,每个矩阵的维度均为 R d × d R^{d×d} Rd×d,整体参数量是 4 d 2 4d^2 4d2
- MLP的参数为 W 1 ∈ R d × d f f , W 2 ∈ R d f f × d W_1 \in R^{d×d_{ff}}, W_2 \in R^{d_{ff}×d} W1∈Rd×dff,W2∈Rdff×d,整体参数量是 2 ∗ d ∗ d f f = 2 ∗ d ∗ 4 d = 8 d 2 2*d*d_{ff}=2*d*4d=8d^2 2∗d∗dff=2∗d∗4d=8d2
- 故每层的参数量为 4 d 2 + 8 d 2 = 12 d 2 4d^2+8d^2=12d^2 4d2+8d2=12d2,全部的 l l l层的参数量为 12 l d 2 12ld^2 12ld2,即 N = 12 l d 2 N=12ld^2 N=12ld2
- transformer每层包括self-attention和MLP两部分
一个token的计算量
- 前向
- 一个参数对应于两次浮点运算:一次乘法、一次加法,即计算量为2N次计算量
- 反向
- 反向求导需要对w和x分别求导,故计算量是前两的两倍,即4N
- 最终的计算量是6N
一个token的计算量是6N,那么D个tokens的计算量就是6ND
以模型的损失L作为性能的判断标准,L越小,模型性能越强
幂律关系
- D与L的幂律关系
- 限制训练数据D大小,在比较大的语言模型上训练,使用早停策略停止训练的实际(一旦测试及损失停止下降就停止训练)。换句话说,只限制了数据集大小D,模型参数N和计算量C没有限制。模型性能L和D由如下的幂律关系
- 数据集不断增大,L越来越小,但D增大到一定程度时,L降低的效果就不会明显
L ( D ) = ( D c D ) α D L(D)=(\frac{D_c}{D})^{\alpha_D} L(D)=(DDc)αD
- N与L的幂律关系
- 在不限制数据集的情况下,训练具有不同参数量的大语言模型,直至测试及损失达到收敛。换句话说,只限制了模型参数量N,而数据集D和计算量C没有收到限制。模型性能L和N之间存在如下的幂律关系。( N c 、 α N N_c、\alpha_N Nc、αN均为常数。需要注意的是模型参数量N不包含静态编码的矩阵 W e m b W_{emb} Wemb)
- 模型参数不断增大,L越来越小,但N增大到一定程度时,L降低的效果就不会明显
L ( N ) = ( N c N ) α N L(N)=(\frac{N_c}{N})^{\alpha_N} L(N)=(NNc)αN
- 基于预算、时间、能源等各方面考虑,计算量C肯定是有一个大致的固定值的,C=6ND,为了获得最好的性能,就要衡量N和D分别是多少
- C与L的幂律关系
- 在计算量C受限的情况下,通过关系是 C ≈ 6 N B C≈6NB C≈6NB,可以遍历不同参数量大小的模型,参数学习迭代 6 N B \frac{6}{NB} NB6次后停止。在这个过程中,保持批量大小B不变;然后可以悬着效果最好的一个模型。接着就得到了模型性能L和C之间的幂律关系,其中 C c , α C C_c,\alpha_C Cc,αC均为常数
L ( C ) = ( C r C ) α C L(C)=(\frac{C_r}{C})^{\alpha_C} L(C)=(CCr)αC
幂律规律
上图中左侧时模型测试集损失与算力log的曲线图,右侧是具体的数据
- 计算量是 1 × 1 0 20 1×10^{20} 1×1020时,性能最强即损失最小的模型量N约为1B
- 计算量是 1 × 1 0 21 1×10^{21} 1×1021时,性能最强即损失最小的模型量N约为3B
- 计算量是 1 × 1 0 22 1×10^{22} 1×1022时,性能最强即损失最小的模型量N约为10B
- 总结规律时当计算量或算力扩大十倍时,性能最强模型的参数量约扩大三倍;即当计算量是 1 × 1 0 23 1×10^{23} 1×1023时,性能最强即损失最小的模型量N约为30B。(此规律仅限于基于transformer结构的模型)
- 当确定了算力C,性能最强模型的参数量N,那么训练所需的数据量D也可以估计个大概
- 基于此规律,可以以小算力的情况下进行实现,将内部涉及的参数规律求解出来,然后再在大算力上进行扩展训练
模型在不同数据集的测试集上的损失存在差别,但整体都时呈现上述分析的幂律关系的
不同模型架构可能也符合幂律关系,如上图中的LSTMs,同样参数量时,transformers的性能比LSTMs更好
实际指导
同样参数量,模型的越深比越宽性能更好
固定住计算量,随着计算量的增大,对应的最优模型参数量也越来越大,对应的最优数据量也越来越大,在对数域看就是成线性关系。当在小计算量配置下通过实现获得了上图中的右侧的两张线型图,就可以指导大模型训练过程
- 假设当前收集到了1.4T tokens的数据,就能通过上图中最右侧图反推出所需的计算量,进而就可以通过上述图中间的图推出应该训练参数量多大的模型
- 对应计算量C、模型参数量N和数据量D,其中知道了一个值,就能反推出另外两个值
上图中当计算量扩大10倍时,不同公司对数据和模型的分配有区别
- openai是数据扩大1.8倍,模型扩大5.5倍
- deepmain是数据和模型都扩大3.16倍
- 原因是模型架构有差别,如激活函数、位置编码、数据质量等差异
- 上述的最优算力分配((性价比最优)是指在训练的时候,计算量固定时,对应的最优的模型大小和数据大小;如果不固定计算量,在固定的参数量N固定,数据量D持续增大,即计算量C持续增大时,模型的测试集损失也会逐渐降低的,只是性价比变低了
- 假设同样的计算量,性价比最优的配比是用1T的数据训练一个20B的模型,但其实也能使用3T的数据训练一个7B的模型,这样做的原因有二
- 一是便于推理时能部署模型的显卡型号更多,如果时20B或更大的50B的模型,其性能最好,但服务开发时并没有合适的显卡进行部署
- 二是模型过大,推理的效率很低,速度很慢
- 对于openai,因为其不开源,并且有大显存的卡进行部署,所以其可以进尽可能遵循scaling law的指导训练对应尺寸的模型
- Meta开源的LLaMa系列模型因为其开源性质,就要考虑开源社区的开发者能用手头的显卡进行部署的问题,所以其观点是,给定模型的目标性能后,并不需要用最优的计算效率在最快的实践训练好模型,而应该在更大规模的数据上,训练一个相对更小模型,这样模型在推理阶段的成本更低
- 根据scaling law,10B模型只需要200B的数据,但LLaMa作者发现,7B的模型性能在1T的数据训练后性能还能提升
- LLaMa就是以训练的低效换取推理时的高效
- 假设同样的计算量,性价比最优的配比是用1T的数据训练一个20B的模型,但其实也能使用3T的数据训练一个7B的模型,这样做的原因有二
幂律规律有失灵的情况,即大模型中的涌现,前期算力增加,模型性能是按上述分析的规律逐渐提高,但是当算力提高到一定程度后,模型性能会突然陡增,目前来话,幂律规律只在涌现发生前有效,当具体算力提升到多少会发生涌现,目前还不知道,只能通过实践后统计发现,但一定会发生涌现