解构Scaling Law:优化、架构、数据的三重奏
原文链接 | 2026-07-29 | 苏剑林
训练一个大型的神经网络,最终效果会受到非常多因素的影响,换个优化器,换个模型架构,或者换一个训练集,结果都可能截然不同。在工程实践中,我们将调试这些因素的经验结果,戏称为“炼丹”。但如何从经验上升到规律,更准确、定量地描述它们之间的关系呢?如果能搞清楚这个问题,我们的炼丹将会更有底气。
“Scaling Law”便试图以一种相对定量的方式来回答这个问题。自OpenAI在2020年的奠基性工作(Kaplan Law)以来,Scaling Law已成为深度学习最可靠的经验规律之一,它可以用来预估模型性能、指导超参数选择、判断某个改动的有效性等。为此,也有不少工作,试图对Scaling Law做进一步的更贴近本质的解读。
本文也来分享笔者对Scaling Law的一些理解。
准备篇#
后文会反复遇到“在某个约束下,求幂律组合的最小值”这类问题,所以我们这一篇先准备两个基础结论。
异幂不等式#
首先是一个使用次数最多的不等式,设\(a,b,p,q,x > 0\),那么
\[\begin{equation}a x^p + b x^{-q} \geq (p+q)\left(\frac{a^{q}b^{p}}{p^{p}q^{q}}\right)^{\frac{1}{p+q}}\end{equation}\]
取等号的条件是
\[\begin{equation}x=\left(\frac{bq}{ap}\right)^{\frac{1}{p+q}}\end{equation}\]
它是简单不等式\(x + x^{-1} \geq 2\)的推广,可以通过求导或者加权AM-GM不等式来证明。下面演示后者,加权AM-GM不等式为\(w_1 x_1 + w_2 x_2 \geq (w_1 + w_2)(x_1^{w_1} x_2^{w_2})^{\frac{1}{w_1+w_2}}\),于是我们有
\[\begin{equation}a x^p + b x^{-q} = q \cdot \frac{a x^p}{q} + p \cdot \frac{b x^{-q}}{p} \geq (q+p)\left[\left(\frac{a x^p}{q}\right)^q \left(\frac{b x^{-q}}{p}\right)^p\right]^{\frac{1}{p+q}} = (p+q)\left(\frac{a^{q}b^{p}}{p^{p}q^{q}}\right)^{\frac{1}{p+q}}\end{equation}\]
等号成立的条件为\(\frac{a x^p}{q} = \frac{b x^{-q}}{p}\),即\(x=\left(\frac{bq}{ap}\right)^{\frac{1}{p+q}}\)。为了方便使用,我们称这个不等式结论为“异幂不等式”,它的主要特点是有两项指数异号的幂函数。更有趣的是,最小值点和最小值本身依然还是幂律,这是后续一系列推导的基石之一。
最优配比率#
异幂不等式是固定乘积(\((x^p)^q(x^{-q})^p=1\))后,求两项幂律之和的最小值,还有一些场景(比如求参数量的最优配比)需要我们要固定它们的“和”来求最小值。具体来说,设\(a,b,p,q,x,y > 0\),我们要求
\[\begin{equation}\min_{x,y} a x^{-p} + b y^{-q}\qquad\text{s.t.}\qquad x+y=1\end{equation}\]
很遗憾,这个问题没有初等的解析解,但数值求解是没有问题的。不难看出最小值一定是存在的,将\(y=1-x\)代入,然后求导得\(bq(1-x)^{-q-1}-apx^{-p-1}\),令它等于零得
\[\begin{equation}\frac{x^{p+1}}{(1-x)^{q+1}} = \frac{ap}{bq}\end{equation}\]
左端在\((0, 1)\)内关于\(x\)显然是单调递增的,并且\(x\to 1\)时,左端趋于\(\infty\),当\(x\to 0\)时,左端趋于0。由介值定理可知它在\((0, 1)\)内存在唯一解,直接二分法即可求得。
思想篇#
一个模型的训练过程,可以形式化为
在给定数据\(\mathcal{D}\)、架构\(\mathcal{A}\)和优化器\(\mathcal{O}\)之下,最小化损失函数\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O})\)。
这里\(\mathcal{E}\)表示某个理想分布,也可以将它想象为一个无比巨大的测试集,而我们能构建的任意训练集\(\mathcal{D}\),都是它的一个子集,或者说一个采样结果;\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O})\)则表示在这些条件之下,模型在理想分布\(\mathcal{E}\)上能达到的损失值。
三重分解#
我们考虑如下分解
\[\begin{equation}\begin{aligned} L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) &\,= \underbrace{L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\mathcal{O})}_{\text{数据}} \\ &\,\qquad + \underbrace{L(\mathcal{D}|\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\infty)}_{\text{优化}} \\ &\,\qquad\qquad + \underbrace{L(\mathcal{D}|\mathcal{A},\infty) - L(\mathcal{D}|\infty,\infty)}_{\text{架构}} \\ &\,\qquad\qquad\qquad + L(\mathcal{D}|\infty,\infty) \\ \end{aligned}\end{equation}\]
这个分解看上去将问题复杂化了,但实际上它将当前训练状态到理想目标的距离,分解成了层层递进的三步。在“越多越好”的常规假设下,每个括号都是非负的,因此它相当于把总差距写成三段各自可解释的距离之和,尽可能解耦了各个变量对损失函数的影响,使我们可以更合理地推测它们之间的依赖关系。
现在我们就来逐一解释式中每一项的含义。
数据误差#
第一层分解是
\[\begin{equation}L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) = \Big[L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\mathcal{O})\Big] + L(\mathcal{D}|\mathcal{A},\mathcal{O})\end{equation}\]
其中\(L(\mathcal{D}|\mathcal{A},\mathcal{O})\)代表着给定架构\(\mathcal{A}\)和优化器\(\mathcal{O}\)下,模型在训练集\(\mathcal{D}\)上的损失值。
注意,根据定义,\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O})\)代表模型在理想分布\(\mathcal{E}\)下的损失,这是我们的终极目标。然而,\(\mathcal{E}\)在训练过程中是不可触碰的,我们只能跟训练集\(\mathcal{D}\)打交道,所以只能得到训练损失\(L(\mathcal{D}|\mathcal{A},\mathcal{O})\),然后设法通过\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\mathcal{O})\)来描述它们之间的差距。
这一项通常也叫“泛化误差”,其关键影响因素是数据——比如数据的数量、质量、多样性,等等。此外,架构\(\mathcal{A}\)、优化器\(\mathcal{O}\)也可能改变泛化误差,具体要考虑哪些变量,取决于我们的分析目标。
优化误差#
第二层分解是
\[\begin{equation}L(\mathcal{D}|\mathcal{A},\mathcal{O}) = \Big[L(\mathcal{D}|\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\infty)\Big] + L(\mathcal{D}|\mathcal{A},\infty)\end{equation}\]
其中\(L(\mathcal{D}|\mathcal{A},\infty)\)代表把优化推到极致——比如有一个完美的超级优化器,或者把训练步数与调参次数都推向无穷——时,训练集上能达到的理想损失。
所以,\(L(\mathcal{D}|\mathcal{A},\infty)\)代表了优化器的天花板,而\(L(\mathcal{D}|\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\infty)\)则表示实践优化器与这个天花板的距离,它衡量的是优化器是否足够好——比如学习率是否合适、训练步数够不够、批大小是否足够稳定梯度,等等。
架构误差#
第三层分解是
\[\begin{equation}L(\mathcal{D}|\mathcal{A},\infty) = \Big[L(\mathcal{D}|\mathcal{A},\infty) - L(\mathcal{D}|\infty,\infty)\Big] + L(\mathcal{D}|\infty,\infty)\end{equation}\]
其中\(L(\mathcal{D}|\infty,\infty)\)代表优化和架构都推到极致——任意优秀的优化器、任意强大的模型——时,训练集上能达到的最理想损失。
所以,\(L(\mathcal{D}|\infty,\infty)\)是当前这份数据自身决定的理论极限,而\(L(\mathcal{D}|\mathcal{A},\infty) - L(\mathcal{D}|\infty,\infty)\)则表示实践模型与其理论极限的效果差距,它衡量的是架构是否足够好——参数量够不够、深度宽度够不够、残差还有没有改进空间,等等。
优化篇#
这一节我们先来探讨优化差距\(F_{\text{opt}} = L(\mathcal{D}|\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\infty)\)。给定优化器(比如Adam或Muon)后,我们主要关心学习率\(\eta\)、批大小\(B\)和训练步数\(T\)这三个核心参数的影响。当然,理论上可以把其他参数如动量还有其他细节都考虑进去,但这里我们主要考虑这三个参数。
关系分析#
首先,一个合理的假设是“训得越多,效果越好”,这里训得越多包括“步数越多”以及“学习率越大”两重含义,或者我们可以直观地认为,\(T\eta\)才是模型走过的“路程”,走的路程越长,效果越好,于是可以猜测有一项贡献是\(\alpha_1 (T\eta)^{-\gamma_1}\)。
另一方面,训练效果也会受到噪声影响,合理的假设是噪声越大效果越差。噪声来源于两方面,一是批大小\(B\),它越小噪声越大,二是学习率,它代表着训练过程的不光滑程度,它越大也意味着噪声越大,所以我们猜测还有另外一项\(\alpha_2 B^{-\gamma_2} + \alpha_3\eta^{\gamma_3}\)。
将这两部分加起来得到
\[\begin{equation}F_{\text{opt}} \sim \alpha_1 (T\eta)^{-\gamma_1} + \alpha_2 B^{-\gamma_2} + \alpha_3\eta^{\gamma_3}\label{eq:optimizer-law}\end{equation}\]
我们也可以将训练过程分为两阶段来理解上式:训练初期,噪声是次要的,\(\alpha_1 (T\eta)^{-\gamma_1}\)这一项让损失函数先快速降下来,随后,噪声开始逐渐发挥作用,模型开始在目标点附近震荡,类似螺旋下降的轨迹。
这个形式跟2503.12645、2603.15958所用的一致。值得指出的是,这两篇工作并不是实验拟合,而是直接对SignSGD、Muon等类型的优化器的收敛性做理论分析得出,结论是\(\gamma_1=\gamma_3=1,\gamma_2=1/2\)。在后面的推导中,我们可以代入这几个数值进行简单验算。
最优学习率#
式\(\eqref{eq:optimizer-law}\)里边有6个参数,直接拿去拟合的话,需要打非常多的点,成本会非常高。同时也非常容易出现过拟合问题。对此,我们可以利用最优参数假设,进一步简化形式。
首先,根据异幂不等式,可以求得让右端最小的最优学习率是
\[\begin{equation}\eta^* = \left(\frac{\gamma_1\alpha_1 T^{-\gamma_1}}{\gamma_3\alpha_3}\right)^{\frac{1}{\gamma_1+\gamma_3}} \sim T^{-\frac{\gamma_1}{\gamma_1+\gamma_3}}\end{equation}\]
相应的最小值是
\[\begin{equation}F_{\text{opt}}^* = \underbrace{(\gamma_1+\gamma_3)\left(\frac{(\alpha_1 T^{-\gamma_1})^{\gamma_3} \alpha_3^{\gamma_1}}{\gamma_1^{\gamma_1} \gamma_3^{\gamma_3}}\right)^{\frac{1}{\gamma_1+\gamma_3}}}_{\sim T^{-\frac{\gamma_1\gamma_3}{\gamma_1+\gamma_3}}} + \alpha_2 B^{-\gamma_2}\end{equation}\]
这告诉我们两个结果:1、存在某个\(0 < c < 1\),使得最优学习率反比于\(T^c\);2、假设我们总能为每个配置找到最优学习率,那么优化误差的渐近规律可简化成\(\tilde{\alpha}_1 T^{-\tilde{\gamma}_1} + \alpha_2 B^{-\gamma_2}\)的形式,参数降低至4个,这正是2607.01487提议使用的解耦形式,而2605.09154从带噪二次型出发推导,也得出将\(B,T\)分开建模的结论。
最优批大小#
现在从最优学习率的假设出发,优化误差设为
\[\begin{equation}F_{\text{opt}} \sim \tilde{\alpha}_1 T^{-\tilde{\gamma}_1} + \alpha_2 B^{-\gamma_2}\end{equation}\]
记\(K = B T\),它表示训练过程中所学过的样本数,注意我们没限制Multi-Epoch,所以不排除某些样本会被重复学习多次的可能。如果固定\(K\),那么右端变成\(\tilde{\alpha}_1 (B / K)^{\tilde{\gamma}_1} + \alpha_2 B^{-\gamma_2}\),继续由异幂不等式可以求得最小值为
\[\begin{equation}F_{\text{opt}}^* = (\tilde{\gamma}_1 + \gamma_2) \left(\frac{(\tilde{\alpha}_1 K^{-\tilde{\gamma}_1})^{\gamma_2} \alpha_2^{\tilde{\gamma}_1}}{\tilde{\gamma}_1^{\tilde{\gamma}_1} \gamma_2^{\gamma_2}}\right)^{\frac{1}{\tilde{\gamma}_1+\gamma_2}} \;\sim\; K^{-\frac{\tilde{\gamma}_1 \gamma_2}{\tilde{\gamma}_1+\gamma_2}}\end{equation}\]
等号在
\[\begin{equation}B^* = \left(\frac{\alpha_2 \gamma_2 K^{\tilde{\gamma}_1}}{\tilde{\alpha}_1 \tilde{\gamma}_1}\right)^{\frac{1}{\tilde{\gamma}_1 + \gamma_2}} \sim K^{\frac{\tilde{\gamma}_1}{\tilde{\gamma}_1+\gamma_2}}\end{equation}\]
这同样有两个结论:给定总训练样本数\(K\)下,最优批大小\(B^*\)正比于\(K^c\),其中\(c\in(0, 1)\);而在最优批大小下,Scaling Law简化成\(\hat{\alpha}_1 K^{-\hat{\gamma}_1}\),这正是经典的Scaling Law形式。
小结一下#
现在我们可以总结一下:优化器一般的Scaling Law是\(\alpha_1 (T\eta)^{-\gamma_1} + \alpha_2 B^{-\gamma_2} + \alpha_3\eta^{\gamma_3}\),如果假设总在最优学习率下跑,那么可以简化成\(\tilde{\alpha}_1 T^{-\tilde{\gamma}_1} + \alpha_2 B^{-\gamma_2}\),如果进一步给定训练样本数\(K\),假设总能找到最优批大小,那么简化成\(\hat{\alpha}_1 K^{-\hat{\gamma}_1}\)。
而对于最优参数,最优批大小则正比于\(K\)的某个不大于1的幂,这跟Step Law吻合;最优学习率反比于\(T\)的某个不大于1的幂,按照\(T^*=K/B^*\)换算,最优学习率也反比于\(K\)的某个不大于1的幂,这跟Microsoft Law吻合,但跟Step Law相反。
如果代入前面提到的理论值\(\gamma_1=\gamma_3=1,\gamma_2=1/2\),那么有\(\tilde{\gamma}_1 = 1/2\),继而得\(B^*\sim K^{1/2}\),这跟Step Law给出的\(B^*\sim K^{0.571}\)还是比较接近的;此外还有\(\eta^* \sim T^{-1/2}\),按照\(T^*=K/B^*\)换算得\(\eta^* \sim K^{-1/4}\),这跟Microsoft Law的\(\eta^* \sim K^{-0.32}\)也相差不远。最后还有\(F_{\text{opt}}^*\sim K^{-1/4}\),这跟Chinchilla Law给出的\(\sim K^{-0.28}\)也很接近。
架构篇#
接着我们转到模型差距\(F_{\text{arch}} = L(\mathcal{D}|\mathcal{A},\infty) - L(\mathcal{D}|\infty,\infty)\),这是单纯讨论架构\(\mathcal{A}\)对损失函数的贡献,经典变量包括参数量\(N\)、宽度\(W\)、深度\(H\)等,同时架构变量的引入又会反过来影响优化差距的变化规律,我们尽可能将这些内容都捋一捋。
模型参数#
在固定整体架构的前提下,模型的主要变量就是参数量\(N\)了,假设参数量越大,效果越好,那么可以合理认为
\[\begin{equation}F_{\text{arch}} \sim \alpha_4 N^{-\gamma_4} \label{eq:arch-law-N}\end{equation}\]
这是Scaling Law对参数量最朴素的假设,跟Kaplan Law、Chinchilla Law等一致,其中Kaplan Law给出的结果是\(\gamma_4=0.076\),而Chinchilla Law给出的拟合结果是\(\gamma_4 = 0.34\),目前普遍认为Chinchilla Law在训练规模变大时更加准确。
这里有个争议点是,参数量\(N\)的统计要不要包含Embedding,主流做法是不计入,但这在小规模时可能会有较大偏差,这可能是Kaplan Law和Chinchilla Law结果差异的原因之一(Kaplan实验的年代,训练规模普遍不大),论文2406.12907对此做了详细的分析。如何更准确地考虑Embedding的贡献,可以参考后面的“记忆之层”一节。
除了把整个架构压缩成一个参数量\(N\)外,我们可以做得更精细一点,比如,可以分开宽度\(W\)和深度\(H\),研究模型是“高瘦”还是“矮胖”好:
\[\begin{equation}F_{\text{arch}}\sim \alpha_W W^{-\gamma_W} + \alpha_H H^{-\gamma_H}\end{equation}\]
根据模型参数量大致上\(N\sim W^2 H\),那么就可以在固定参数量下,求出最优宽度、高度以及对应的\(F_{\text{arch}}^*\):
\[\begin{equation}W^* \sim N^{\frac{\gamma_H}{\gamma_W+2\gamma_H}},\qquad H^* \sim N^{\frac{\gamma_W}{\gamma_W+2\gamma_H}},\qquad F_{\text{arch}}^* \sim N^{-\frac{\gamma_W\gamma_H}{\gamma_W+2\gamma_H}}\end{equation}\]
论文2606.25008从理论出发(2505.10465、2602.05970)提出\(\gamma_W=\gamma_H=1\),代入得
\[\begin{equation}W^* \sim N^{1/3},\qquad H^* \sim N^{1/3},\qquad F_{\text{arch}}^* \sim N^{-1/3}\end{equation}\]
最终的\(F_{\text{arch}}^* \sim N^{-1/3}\)跟Chinchilla Law还是很接近的。
优化规律#
同时,参数量的变化也会影响优化过程。在式\(\eqref{eq:optimizer-law}\)中,三个系数\(\alpha_1,\alpha_2,\alpha_3\)被视为常数,那是在假设给定架构\(\mathcal{A}\)的前提下,现在我们引入了参数量\(N\),那么\(\alpha_1,\alpha_2,\alpha_3\)自然也是\(N\)的函数了。
我们同样分两部分来理解:一方面,参数量越大,模型能力越强,损失函数下降也越快,所以\(\alpha_1\)我们换成\(\alpha_1 N^{-\gamma_5}\);另一边,参数量越大,模型越复杂,带来的噪声也越大,所以\(\alpha_2,\alpha_3\)我们分别换成\(\alpha_2 N^{\gamma_6}\)和\(\alpha_3 N^{\gamma_7}\),于是
\[\begin{equation}F_{\text{opt}} \sim \alpha_1 N^{-\gamma_5}(T\eta)^{-\gamma_1} + \alpha_2 N^{\gamma_6} B^{-\gamma_2} + \alpha_3 N^{\gamma_7}\eta^{\gamma_3}\end{equation}\]
这里有一个自然的问题:为什么只考虑\(\alpha_1,\alpha_2,\alpha_3\)随\(N\)的变化,不考虑指数\(\gamma_1,\gamma_2,\gamma_3\)的变化呢?这个问题我们放到“幂律篇”讨论。现在重复“优化篇”的计算,我们可以得到
\[\begin{gather}\eta^* \sim T^{-\frac{\gamma_1}{\gamma_1+\gamma_3}} \cdot N^{-\frac{\gamma_5+\gamma_7}{\gamma_1+\gamma_3}} \sim K^{-\frac{\gamma_1\gamma_2}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \cdot N^{\frac{\gamma_1\gamma_6-\gamma_7(\gamma_1+\gamma_2)-\gamma_5\gamma_2}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \\ B^* \sim K^{\frac{\gamma_1\gamma_3}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \cdot N^{\frac{\gamma_6(\gamma_1+\gamma_3)+\gamma_5\gamma_3-\gamma_7\gamma_1}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \\ F_{\text{opt}}^* \sim K^{-\frac{\gamma_1\gamma_2\gamma_3}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \cdot N^{\frac{\gamma_1\gamma_2\gamma_7+\gamma_1\gamma_3\gamma_6-\gamma_2\gamma_3\gamma_5}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \end{gather}\]
如果我们认同Kaplan Law、Chinchilla Law和Step Law等结果,那么\(B^*\)和\(F_{\text{opt}}^*\)就跟\(N\)无关,通过让这两项\(N\)的指数为0,可以解得
\[\begin{equation}\gamma_3\gamma_5 = \gamma_1\gamma_7, \qquad \gamma_6 = 0\end{equation}\]
代入各式后,发现只新增了一个\(\gamma_7\)参数:
\[\begin{gather}F_{\text{opt}}\sim \alpha_1 N^{-\frac{\gamma_1\gamma_7}{\gamma_3}}(T\eta)^{-\gamma_1} + \alpha_2 B^{-\gamma_2} + \alpha_3 N^{\gamma_7}\eta^{\gamma_3} \\ \eta^* \sim T^{-\frac{\gamma_1}{\gamma_1+\gamma_3}} \cdot N^{-\frac{\gamma_7}{\gamma_3}} \sim K^{-\frac{\gamma_1\gamma_2}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \cdot N^{-\frac{\gamma_7}{\gamma_3}} \\ B^* \sim K^{\frac{\gamma_1\gamma_3}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \\ F_{\text{opt}}^* \sim K^{-\frac{\gamma_1\gamma_2\gamma_3}{\gamma_1\gamma_3+\gamma_2(\gamma_1+\gamma_3)}} \end{gather}\]
有趣的是,\(\eta^*\)的形式正好跟Microsoft Law一致,即跟\(K\)和\(N\)都负相关,这并不是平凡的,因为我们只假设了\(B^*\)和\(F_{\text{opt}}^*\)跟\(N\)无关,对\(\eta^*\)并无假设。最后代入理论值\(\gamma_1=\gamma_3=1,\gamma_2=1/2\),得
\[\begin{equation} \eta^* \sim K^{-1/4} N^{-\gamma_7},\qquad B^* \sim K^{1/2},\qquad F_{\text{opt}}^* \sim K^{-1/4} \end{equation}\]
至于\(\gamma_7\),Microsoft Law给出\(0.23\),Step Law则给出\(0.713\),考虑到这两个Law对\(K\)的依赖完全相反,所以它们在这个指数上有明显差异是正常的。理论大体上更偏向Microsoft Law一些,从一些凸优化结果观察,\(N^{\gamma_7}\)跟全体参数的梯度的标准差有关,所以猜测它在\(0\sim 0.5\)之间,结合Microsoft Law,我们可以拍一个\(1/4\)。
给定算力#
综合\(F_{\text{opt}}^*\)和\(F_{\text{arch}}\),我们有
\[\begin{equation}F_{\text{opt}}^* + F_{\text{arch}} \sim \hat{\alpha}_1 K^{-\hat{\gamma}_1} + \alpha_4 N^{-\gamma_4}\end{equation}\]
对于稠密模型来说,模型的每一步计算量基本上跟参数量\(N\)成正比,\(K\)是训练过程中学习过的样本数,它也跟训练的计算量成正比,所以训练过程消耗的总的计算成本为\(C\sim NK\),标准架构的比例系数大致是\(6\),包括\(2NK\)的前向传播和\(4NK\)的反向传播。
在实际训练中,算力通常是有限的,我们希望在固定的算力预算\(C\)下实现最大的智能,那么就需要在约束\(NK \sim C\)下求最优的\(K^*\)和\(N^*\)。把\(K \sim C/N\)代入上式(常数因子吸收进系数),得到
\[\begin{equation}F_{\text{opt}}^* + F_{\text{arch}} \sim \hat{\alpha}_1 C^{-\hat{\gamma}_1} N^{\hat{\gamma}_1} + \alpha_4 N^{-\gamma_4}\end{equation}\]
这又一次是异幂不等式的形状,直接套用公式,得到
\[\begin{equation}N^* \sim C^{\frac{\hat{\gamma}_1}{\hat{\gamma}_1+\gamma_4}}, \qquad K^* \sim C^{\frac{\gamma_4}{\hat{\gamma}_1+\gamma_4}}, \qquad F^* \sim C^{-\frac{\hat{\gamma}_1\gamma_4}{\hat{\gamma}_1+\gamma_4}}\end{equation}\]
如果代入前面的理论值\(\hat{\gamma}_1=1/4\)和\(\gamma_4=1/3\),那么
\[\begin{equation}N^* \sim C^{3/7}, \qquad K^* \sim C^{4/7}, \qquad F^* \sim C^{-1/7}\end{equation}\]
这跟Chinchilla Law的核心结论很接近:最优模型规模与最优数据量应大致等比例扩展(论文的拟合结果是\(N^* \sim C^{0.46}, \qquad K^* \sim C^{0.54}\))。最后,将\(N^*\)和\(K^*\)的表达式代入到上一节的\(\eta^*\sim K^{-1/4} N^{-\gamma_7}\)和\(B^*\sim K^{1/2}\),得到
\[\begin{equation}\eta^*\sim C^{-(1+3\gamma_7)/7}, \qquad B^*\sim C^{2/7}\end{equation}\]
其中\(B^*\sim C^{2/7}\)倒是跟DeepSeek Law的\(B^*\sim C^{0.3271}\)相差不多,但DeepSeek Law给出\(\eta^*\sim C^{-0.1250}\),而这里即便代入\(\gamma_7=1/4\)也只能得到\(\eta^*\sim C^{-1/4}\),还是差得有点远。这样看来,各家的结果在最优批大小上是比较一致的,但最优学习率上分歧比较大,这可能跟具体的优化设置和学习率Schedule等比较相关。
稀疏架构#
刚才我们说“计算量大致正比于参数量\(N\)”,这是在Dense模型下成立的,假设模型核心运算是Linear层,\(a\times b\)的输入与\(b\times c\)的参数相乘,计算量是\(\mathcal{O}(abc)\),参数量是\(bc\),大家都正比于\(bc\),从而参数量即计算量。但近年来大家也致力于研究参数量和计算量解耦的架构,比如MoE。
MoE自然是目前当之无愧的主流架构了,几乎每一个开源的大型模型都是MoE,它一个重要的新参数是稀疏度\(S\),它可以定义为总参数量与激活参数量之比,或者总Expert数与激活Expert数之比。从理论上来看,MoE理论计算量大致上只取决于激活参数量,也就是说增加稀疏度\(S\)理论上不增加计算量,但损失可以降,所以增加稀疏度总是划算的。
将稀疏度纳入到Scaling Law中的一个简单方案是:
\[\begin{equation}F_{\text{arch}} \sim \alpha_4 N_{act}^{-\gamma_{act}} N_{total}^{-\gamma_{total}} = \alpha_4 N_{act}^{-(\gamma_{act}+\gamma_{total})} S^{-\gamma_{total}}\label{eq:arch-law-N-act-total}\end{equation}\]
其中\(N_{act},N_{total}\)分别是激活参数量和总参数量,\(S=N_{total}/N_{act}\),相似的形式也出现在2501.12370。如果从式\(\eqref{eq:arch-law-N}\)看,这相当于同样假设\(S\)只以幂律的方式影响系数\(\alpha_4\),但不影响指数\(\gamma_4\)。从上式中,我们还能导出“等效参数量”的概念:
\[\begin{equation}N_{eff} = N_{act}^{\frac{\gamma_{act}}{\gamma_{act}+\gamma_{total}}} N_{total}^{\frac{\gamma_{total}}{\gamma_{act}+\gamma_{total}}},\qquad F_{\text{arch}} \sim \alpha_4 N_{act}^{-\gamma_{act}} N_{total}^{-\gamma_{total}} = \alpha_4 N_{eff}^{-(\gamma_{act}+\gamma_{total})}\end{equation}\]
即激活参数量为\(N_{act}\)、总参数量为\(N_{total}\)的MoE模型,等效于一个参数量为\(N_{eff}\)的Dense模型。该概念源自2202.01169提出的Effective Parameter Count,后来Ling Law将它进一步拓展成“效率杠杆”,并探究了其变化规律。
然而,计算量只正比于激活参数量\(N_{act}\),这意味着我们可以让\(N_{eff}\)不变的同时让\(N_{act}\to 0\),换言之将计算量降到近乎零但效果不变,但这看起来不大现实。因此,合理猜测\(F_{\text{arch}}\)应当多一项关于\(N_{act}\)的惩罚项,来保证一定的激活参数:
\[\begin{equation}F_{\text{arch}} \sim \alpha_4 N_{act}^{-\gamma_{act}} N_{total}^{-\gamma_{total}} + \alpha_8 N_{act}^{-\gamma_8}\label{eq:arch-law-moe}\end{equation}\]
建模稀疏度的工作还包括2309.08520、2501.12370、2502.05172等,它们所设的Scaling Law形式各不相同。除稀疏度外,Expert的颗粒度(由2402.07871首次建模)、Shared Expert对效果也有一定影响,2509.23678将这些因素都糅合成了一个非常庞大的形式来实验拟合。
当然,“任意增加稀疏度都划算”仅仅是理论上的,实践中还要考虑路由开销、推理效率等问题,增加稀疏度并不是完全免费的,需要算法和Infra的共同设计。
记忆之层#
除了MoE外,解耦参数量和计算量的途径还包括稀疏型的Memory层,经典的比如PKM、UltraMem等,而新兴起的比如Over-Encoding、Engram等都可以归入此类。
事实上,这类工作也可以看成是MoE的另一个极端:它们的“Expert”简化为没有任何计算的可训练向量,然后基于可训练Router(Pointer)或N-gram Hash来选出要激活的“Expert”。从这个角度看,它们的Scaling Law应该跟MoE类似,比如一个Dense模型配上若干Memory层后,Scaling Law应该同样呈现式\(\eqref{eq:arch-law-moe}\)的样子。
如果MoE和Memory这两类不同的稀疏型设计同时使用,那么Scaling Law应该长什么样呢?我们先定义几个记号\(N_{act}, N_{moe}, N_{mem}, N_{total}\),分别代表“激活参数量(只统计产生计算量的参数,即Dense部分加激活Expert)”、“去掉Memory后的总参数量”、“去掉未激活Expert之后的总参数量”、“总参数量”,它们成立恒等式
\[\begin{equation}N_{moe} + N_{mem} = N_{total} + N_{act}\label{eq:N-id}\end{equation}\]
如果猜测MoE和Memory的作用是互补的,那么它们的Scaling Law可能是加性的,即
\[\begin{equation}F_{\text{arch}} \sim \alpha_{4a} N_{act}^{-\gamma_{act}} N_{moe}^{-\gamma_{moe}} + \alpha_{4b} N_{act}^{-\gamma_{act}} N_{mem}^{-\gamma_{mem}} + \alpha_8 N_{act}^{-\gamma_8}\end{equation}\]
这里还引申出一个新的优化问题:如果我们必须固定激活参数量\(N_{act}\)(计算瓶颈)和总参数量\(N_{total}\)(内存瓶颈),那么该如何分配MoE和Memory的参数呢?根据恒等式\(\eqref{eq:N-id}\),此时\(N_{moe} + N_{mem}\)就是一个常数,要在该约束下最小化上述。设\(N_{moe} = \lambda(N_{total} + N_{act})\),代入到上式后,问题就变成了“最优配比率”一节介绍的和约束最小化问题,可以数值求解出来。
也就是说,并不是将全部参数都分配到MoE或Memory最好,而是存在一个最优配比,这跟Engram的发现类似。
小结一下#
跟优化篇类似,本篇也是先根据经验作出幂律假设,然后主要使用异幂不等式进行优化计算。
量化模型的最简单变量是总参数量\(N\),更细致一点则可以分别考虑宽度\(W\)和深度\(H\)。模型的变化,也会引起优化误差的变化,所以我们也简单讨论了各个优化参数与参数量的联合作用。在Dense模型的假设下,参数量本身也代表着计算量,而优化器的训练步数\(T\)和批大小\(B\)也跟计算量正相关,那么我们还可以探究在固定总预算\(C\)时,如何确定最优的参数量以及对应的优化器参数。
如果进一步细化,模型架构的变量就更多了,比如MoE架构会有“激活参数”和“总参数”的区别,诸如Engram等Memory设计也类似,而当它们一起出现时,又会出现参数的最优分配问题,诸如MHC、AttnRes等残差改进我们也还没提及,等等。总之,模型这一块能考虑的变量非常之多,这里就只能简单带过了。
数据篇#
最后我们转到数据差距\(F_{\text{data}} = L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O}) - L(\mathcal{D}|\mathcal{A},\mathcal{O})\)。根据定义,这一项需要我们关注在理想分布\(\mathcal{E}\)上的效果,但我们又说理想分布理论上是不可触达的,既然如此,那该怎么测量呢?
事实上,也没有什么好办法,我们只能选一个没有训练过的、我们认为足够有代表性的数据集作为测试集,以它算出来的测试损失作为\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O})\)的近似。所以,跟benchmark类似,测试集的建设也尤为重要,它代表着我们对理想目标的理解和描述的准确程度。
数据大小#
数据核心超参数是训练集的大小\(D\),我们认为训练集越大,泛化性能越好(即“见多识广”),所以贡献一项\(\alpha_9 D^{-\gamma_9}\)。
每一步的数据是从训练集中均匀随机采样的,那么\(K/D\)就是平均每个样本被训练的次数,也就是训练的Epoch数,我们认为Multi-Epoch越严重,泛化性能越差,所以贡献一项\(\alpha_{10} (K/D)^{\gamma_{10}}\),于是一个基本形式是
\[\begin{equation}F_{\text{data}} \sim \alpha_9 D^{-\gamma_9} + \alpha_{10} (K/D)^{\gamma_{10}}\end{equation}\]
大多数Scaling Law工作,都是在Single-Epoch假设下,将\(K\)和\(D\)视为同一个,本文把它们区分开来,为的就是能考虑Multi-Epoch的影响。
最近的论文《Prescriptive Scaling Laws for Data Constrained Training》中也引入了类似的幂律,但将\(K/D\)换成了\(K/D-1\),并同时考虑了模型参数量的影响,大致上认为模型参数量越大,越容易过拟合,所以越不应该Multi-Epoch训练,因此让\(\alpha_{10}\)跟\(N\)正相关,这些改动我们也可以按需调整。
另一方面,《Scaling Data-Constrained Language Models》等文章,则通过引入“价值衰减”的概念,将Multi-Epoch后的数据量折算成“有效数据量”,从而修正Scaling Law,但笔者感觉没有区分\(K\)和\(D\)才需要这一项,我们已经区分了\(K\)和\(D\),只需要直接对Multi-Epoch带来的过拟合风险进行惩罚。
最优轮数#
把优化误差与数据误差合在一起(固定\(D\)、\(N\),并假设总在最优超参数下训练),结果是:
\[\begin{equation}F_{\text{opt}}^* + F_{\text{data}} \sim \hat{\alpha}_1 K^{-\hat{\gamma}_1} + \alpha_{10} (K/D)^{\gamma_{10}} \end{equation}\]
这可以清晰看出:训得越多,优化误差越小,但数据重复越严重、泛化误差越大。于是再次根据异幂不等式,可以求得\(K\)的最优值
\[\begin{equation}K^* = \left(\frac{\hat{\alpha}_1 \hat{\gamma}_1}{\alpha_{10} \gamma_{10}} D^{\gamma_{10}}\right)^{\frac{1}{\hat{\gamma}_1+\gamma_{10}}} \sim D^{\frac{\gamma_{10}}{\hat{\gamma}_1+\gamma_{10}}} \qquad \frac{K^*}{D} \sim D^{-\frac{\hat{\gamma}_1}{\hat{\gamma}_1+\gamma_{10}}}\end{equation}\]
这提供了关于Multi-Epoch的缩放规律,结论是:数据越少,反而应该训更多轮;数据越多,最优Epoch数越小,结论跟2511.13421正好相反。一个可能的改进方案是将\(\alpha_{10} (K/D)^{\gamma_{10}}\)一般化为\(\alpha_{10} K^{\gamma_{10}} D^{-\gamma_{11}}\),此时有
\[\begin{equation}K^* = \left(\frac{\hat{\alpha}_1 \hat{\gamma}_1}{\alpha_{10} \gamma_{10}} D^{\gamma_{11}}\right)^{\frac{1}{\hat{\gamma}_1+\gamma_{10}}} \sim D^{\frac{\gamma_{11}}{\hat{\gamma}_1+\gamma_{10}}} \qquad \frac{K^*}{D} \sim D^{\frac{\gamma_{11}-\hat{\gamma}_1-\gamma_{10}}{\hat{\gamma}_1+\gamma_{10}}}\end{equation}\]
这样一来,最优Epoch数随数据增加而增加/减少都有可能出现。
但即便换成\(\alpha_{10} K^{\gamma_{10}} D^{-\gamma_{11}}\),这里也还存在一些不合理的地方,比如当\(K\to\infty\)时它也是趋于无穷的,但根据经验,即便我们不断训练下去,测试集损失也不应该无穷大。不过,如果只在小范围内拟合(假设Multi-Epoch数不可能太多),那么幂律假设依然可能给出实践能用的结果。
延伸思考#
除了数据量\(D\)这一核心参数外,还有很多工作对数据的组成做了细致的区分,比如领域配比(2403.16952、2507.09404、2603.19149、2605.12715、2606.08167)、质量高低(2510.03313)、模态配比(2607.22043)等,这些工作五花八门,不好提炼出统一的形式,所以就不一一展开了。
相比优化和架构,数据侧的Scaling Law确实给人一种“凌乱”和“模糊”的感觉。原因不难理解:优化器的变量(\(\eta,B,T\))和架构的变量(\(N,W,H,S\))都是比较明确的数字,而数据这一块,除了数据量\(D\)是能比较准确量化外,像专业领域、质量、模态等维度,本来就没有太明确的边界,也无法用单一标量去准确刻画。
此外,从\(L(\mathcal{E}|\mathcal{D},\mathcal{A},\mathcal{O})\)这一记号可以看出,\(\mathcal{D},\mathcal{A},\mathcal{O}\)都是它的条件,也就是说,优化器变量和架构变量的变化原则上也会对数据侧的Scaling Law产生影响,各种变量相互作用,这使得我们很难能在一个“干净”的设置下,清晰地研究数据的依赖规律。
更要命的是,如果我们仔细思考,会发现“Data Scaling Law”这个命题本身就让人疑惑:为了公平测量效果,我们需要先准备一个足够有代表性的测试集,然后“装作”不知道测试集的样子,试图去研究训练数据上的“Scaling Law”,使得测试集的效果尽可能好,这个流程不管怎么看都挺莫名其妙。
小结一下#
这一节我们简单介绍了数据差距的Scaling Law,主要引入了数据量\(D\)这一参数,考虑了数据量增加带来的正面作用,以及对Multi-Epoch带来过拟合风险,并跟优化误差结合在一块,推导了最优Epoch数的结果。但总的来说,数据侧的Scaling Law还有很多让人迷惑的地方,亟待深入思考。
幂律篇#
到目前为止,我们所有的变化规律都假设成了“幂律”的和或积的形式,然后通过“异幂不等式”推出一些最优选择。现在回过头来看,有两个问题值得思考一下:1、为什么我们要假设变化规律是幂律形式?2、当我们引入其他条件时,为什么只考虑幂律的系数变化,而不考虑指数变化?
幂律之问#
为什么是幂律?有很多研究人员试图提出更“本质”的解释,但笔者感觉很多尝试都只是将一个假设换成另一个假设,并无实质变化,比如《基于量子化假设推导模型的尺度定律(Scaling Law)》。
笔者认为,最直接的解释是:当我们确定一个变量的依赖关系是单调递减、并且只关心渐近行为时,能选择的函数其实不多,一般就是幂函数和指数函数两类。指数函数衰减得太快——用分布的语言说,它是“短尾”的——这意味着某种资源稍加投入,收益就迅速触顶,这与我们对现实世界的“体感”不符;而幂函数则是“长尾”的,它衰减得更慢,更能描述“持续投入、持续改善”的现象。
说得更哲学一些,如果这个世界是指数函数主导的,那就太无趣了:各种东西很快就达到天花板,各种投入很快失去意义。正因为是幂律主导,Scale Up的故事才生动起来。
另一个视角是,幂律等价于“无标度性”:\(f(\lambda x)=\lambda^{-\gamma} f(x)\),函数在任何尺度下看起来都一样,而“Scaling”这个词的本义恰恰是跨尺度的规律——能担当这个角色的初等函数,似乎就只有幂律了。从实用的角度看:幂律在 log-log 坐标下是一条直线,这让它更容易拟合和可视化,以及“异幂不等式”的存在、它的最小值点和最小值本身依然还是幂律,这些都是它能成为“经验规律”的重要原因。
当然,幂律并不是唯一的答案,“数据篇”里便有论文用指数函数描述Multi-Epoch的价值衰减。只能说,幂律是大多数情况下都可以首先尝试的基本规律,如果遇到特别难以拟合的问题,我们可以再考虑作出调整。又或者说,如果我们要外推的区间并不大,那可能更重要的是函数的单调性,而不同的函数形式之间区别可能并没有那么大。
系数之问#
第二个问题首次出现在“架构篇”,我们假设条件的变化,顶多对幂律的系数产生影响,比如架构的变化只对优化误差幂律的系数产生影响,MoE稀疏度的变化只对架构误差的幂律产生影响,而保持指数不变,这是出于什么考虑?有什么更本质的道理在里边?
首先是数学上的务实:如果指数也随条件变化,那么幂律形式本身就被破坏了——结果不再是幂律,异幂不等式也不再适用,整个框架会失去最简单的可操作性。只让系数变化,是保持形式不变的前提下最小的推广,是一个值得首先尝试的假设形式。
其次是物理上的类比:在统计物理中,相变的临界指数是普适的,同一普适类里的不同材料共享同一组指数,材料细节只改变非普适的前置因子。类似地,Scaling Law的指数也理解为问题本身的“难度”——它由数据分布与任务决定;而系数则是解决方案的“工程水平”——它随优化器、架构的改进而变化,而这本质上是在同一个问题上做得更好,因此改变的应当是幂律前面的系数,而不是指数。
反过来想,如果某项有限的工程改进真能改变指数,那么在渐近意义下,它带来的相对优势会随着规模增长而无界放大——有限的投入换来无界的相对收益,这相当于凭空出现指数级进步,通常是不现实的。除非这项改进改变了问题本身,但那已经不是“同一问题上的工程改进”,而是换了一个问题。
当然,这更多是笔者基于简洁性与自洽性的一个猜想,算是开放问题,欢迎讨论。
总结篇#
看完这篇博客,可能有读者的感受是“好像什么都说了,又好像什么都没说。”——我们没有证明任何定理,只是写下了一个三重分解,以及凭经验写下了一堆幂律假设,然后利用最优化方法做了一些基本的分析。
我们试图以这种方式,找出各种Scaling Law结果的共性,理清楚它们的相互作用机理。幸运的是,本文也确实得到了一些启发式的结果,但限于笔者水平,多数内容只能做出粗浅的介绍,尤其是“数据篇”,笔者的理解还停留在非常肤浅的阶段。
整个推导流程走下来,个人感觉有种物理中的“量纲分析”的味道:它不像第一性原理推导那样严密,而是先凭直觉和单调性猜出各项的幂律形式,进一步推导最优解的规律,最后再对照经典结果,进行简化或修正。
希望本文的视角,能为读者理解和运用Scaling Law提供一点帮助。