Dataset Size 和 Loss 的关系
最大似然估计(MLE)
一切机器学习的本质都是最大似然估计:
-
模型下的理想真实世界的概率分布:$p(x|\theta)$
-
我们不知道真实世界的分布,所以我们要用样本估计似然函数 $L(\theta|x)$
-
现在 $x$ 已知,$\theta$ 未知,若对于两个参数 $\theta_1$ 和 $\theta_2$ 有
$$ L(\theta_1|x) = p(x|\theta_1) > p(x|\theta_2) = L(\theta_2|x) $$
那么意味着 $\theta=\theta_1$ 时,随机变量 $\theta_1$ 生成 $x$ 的概率大于当参数 $\theta=\theta_2$ 时。这也正是似然的意义所在,若观测数据为 $x$,那么 $\theta_1$ 是比 $\theta_2$ 更有可能为分布函数的参数。
-
在给定观测数据集 $X={x_n},n \in \mathbb{N}$ 时,真实世界最有可能的概率分布对应的参数 $\hat\theta$ 应该满足:
$$ L(\hat\theta|x) = p(x|\hat\theta) > p(x|\theta) = L(\theta|x), \theta \in \mathbb{\Theta} 且 \theta \ne \hat\theta $$
即:
$$ \hat\theta = \arg\max\limits_\theta L(\theta|x) $$
-
求解最大似然函数:
$$ \frac{\mathrm{d}}{\mathrm{d}\theta} L(\theta|x) = 0 $$
对这个方程数值求解的过程,对应的就是绝大部分机器学习算法中的梯度下降过程。
在测试集上评估的结果,我们预想的误差应当包含两部分:
- 似然函数 $L(\theta|x)$ 对真实世界概率分布描述能力不足,带来的误差;
- 通过 $X$ 估计 $\theta$ 时,样本本身的误差;
若假定我们可以通过梯度下降收敛(即上面最大似然函数的导数在 0 的一个很小的临域中),那么至少就是我们相信在观测数据集 $X$ 上,模型是正确的,那么评估的误差就更加明确的指向 $X$ 本身带来的误差。
Fisher 信息量
为了求解最大似然估计,我们常用的数值手段是:
假定观测数据集 $X$ 的真实世界概率对应的概率密度函数是 $f(x_i;\theta)$,定义似然函数:
$$ L(X;\theta) = \prod \limits^{n}_{i=1} f(x_i;\theta) $$
求解时,先对 $L(X|\theta)$ 取对数,再求导,这个函数定义为 Score function:
$$ S(X;\theta) = \sum \limits^n_{i=1} \frac{\partial \ln f(x_i;\theta)}{\partial\theta} $$
则 Fisher 信息量的定义就是这个 Score function 的二阶矩(second moment)
$$ I(\theta) = E[S(X;\theta)^2] $$
Fisher 信息量最重要的意义是:通过中心极限定理,弱大数定律,依概率一致收敛,以及 Slutsky 定理,可以证明 MLE 的渐进分布是正态分布 1,即:
- $\hat \theta \stackrel{P}{\longrightarrow} \theta_0$,其中 $\theta_0$ 是参数的真实值;
- $\sqrt{n}(\hat\theta - \theta_0) \stackrel{L}{\longrightarrow} N(0,I^{-1}(\theta))$ ;
数据量与误差的关系
花了大量篇幅描述了 最大似然 和 Fisher 信息量后,最终真正值得我们关注的结论却异常的简单:
$$ L(D) \propto D^{-0.5} $$
这个结论同计算均值时,数据样本带来的误差是完全一样的。
真实的机器学习条件下,我们的样本量的质量并不均匀,所以往往会优先使用更好的样本(小样本集不是大样本集的随机采样,而是精选),会导致观测数据集 $X$ 不能满足概率同分布,所以带来的结果是上述幂律关系中,实际的幂律值会小于 $0.5$。
理论上来说,如果我们能做到样本集随机采样,那样这个幂律就会更加接近 $0.5$,而如果样本集不能随机采样,某种意义上说,能否保持这种幂律关系是值得怀疑的。所以对于 OpenAI 和 Google 的 Scaling Law 的论文,在样本量同 Loss 的关系上,Google 的结果是更可信的。
哪怕依旧能维持幂律关系(维持幂律关系的数学基础是不存在的。。。),具体的数值也只能通过实际拟合来估计。因为这件事不是通用规律,只跟具体的训练数据集的分布有关,跟模型无关(前提条件是模型能在大数据下收敛,即满足大数定律、中心极限定律,并且模型可以拟合真实分布)。
Compute 和 Loss 的关系
控制论和 PID 算法
梯度下降法的数值计算过程,某种视角下可以理解成就是控制论下的控制算法——我如何根据真实信息来控制我的预期值离目标值更近。
直观而好用的方法就是 PID 算法:
$$ u(t) = K_pe(t) + K_i\int^t_0 e(\tau)\mathrm{d}\tau + K_d\frac{\mathrm{d}e(t)}{\mathrm{d}t} $$
当然,我们的梯度下降法原没有 PID 算法如此之精密,实际流程大概率只使用了 P 的部分,也就是对误差做补偿。在深度学习中,被称为反向传播。
单参数计算量与误差的关系
单目标的 PID(只省 P 过程了)算法,误差与计算量(迭代次数)之间的关系:
$$ L(C) \propto K_p^{C}=e^{\lambda C} $$
即,误差同计算量之间的关系是指数关系,不是幂律关系。
这一点在 Sorscher et al. (2022) 中有所体现,它的结论是:至少对于某些任务,损失可以随着数据集 2 大小呈指数级增长,而不是作为幂律。
总计算量与误差的关系
不同于优化问题中,我们会通过反复迭代的方式增加计算量,深度学习的计算量基本上是同模型规模和数据量正相关的。反过来意味着对单参数的优化迭代很少的固定步数就可以收敛,所以在通常数据量规模下,可以将单参数计算量带来的优化效果视作常数(都能优化到收敛)。
单参数计算量带来的优化效果视为常数(不会随计算量、节点数、数据量变化而变化),意味着计算本身同误差之间没有直接关联,总计算量与误差之间的关联体现的是数据量与误差的关系和节点数(结构)与误差的关系。
总计算量与数据量成正比,而数据量同优化效果之间的关联我们已经在前文完成了论述。下一步我们将分析节点数和误差之间的关系,或者其实更加精确的说,应当是在单参数误差不变的条件下,节点数的变化与总计算量之间的关系,是这个关系蕴含了总计算量与误差之间的关联。
Compute 和 Parameters 的关系
分形维度
具有自相似性的结构就是分形。而我们的深度学习计算就是典型的分形结构——当模型规模扩大时,主流的扩大的方式就是增加层数 3,这带来的就是自相似性。
而自相似性带来的重要性质就是,系统会具有分形维度,分形维度会使得系统规模扩大时,对应的全局属性并不是等比增加,而是幂律增加,幂律的指数就是其分形维度。
生物学中有重要的 $\frac{3}{4}$ 定律——生物随着重量的变大(原子数量的规模扩大),其相关的很多生物学特征,例如新陈代谢能力、血管长度、心跳、呼吸等等,并不与重量成正比,而是按照 $\frac{3}{4}$ 的幂律进行增长。 一个直观的理解,随着生物体长度增长,其体重会以幂律 $3$ 进行提升,而腿部的横截面则是幂律 $2$ 增长。所以生物的规模变大,就会带来腿部承受的压力不断变大,所以老鼠体型的动物的腿都很细,但大象规模的动物,腿都很粗;蚂蚁可以举起自身体重百倍的物品,但人只能举起和体重相仿的物品。这些都是因为规模变化带来的非线性,要求生物的动力学模型必须发生变化,而不能与小规模时一样。 类似的,在城市规模同城市中加油站、小超市、医院之类的城市核心建设之间,也存在着幂律增长的关系——相关幂律大约是 $0.85$。
对应的,深度学习模型中,在保证单参数误差不变的条件下,Parameters 规模的增加所需要的 Compute 计算量的增加不是等比的,而是幂律的,而且这个幂律应当是小于 $1$ 的。
换句话说,计算量同损失之间的关系是伴生关系——计算量本身同损失是没有直接关联的。带来损失变化的根本原因不是计算不足,而是模型表达能力以及数据本身蕴含的信息带来的。
但因为这里的结论中,计算量与参数数量也是幂律关系,由前文,数据同损失也是幂律关系,如果参数数量同损失同样是幂律关系的化,那么计算量与损失也可以用幂律关系来表示。
Parameters 与 Loss 之间的关系
这里要分析的是参数量增加为何能带来 Loss 的降低。这是因为 Parameters 的增加,可以提升模型的表达能力,可以更好的拟合目标函数。也就是说,一个模型距离真值的误差(Loss),除了因为 Dataset 自身的误差外,还有一部分是模型距离 Dataset 所描述的最大似然函数的误差。
这部分要是详尽分析起来会很复杂,幸好已经有一些这方面的研究:Sharma et al. (2020) 和 Bahri et al. (2021) 都对这个问题进行了很好的分析,其结果也有对应的实验支撑。
文章假定深度模型将数据映射到一个 $d$ 维数据流形上,增加的模型参数(无限数据的条件下)都会被模型用来将数据流形分割成更小的组件,然后模型将在数据流形的每个分量上进行独立的预测,以优化训练损失。
这样自然的,如果我们想让子区域的大小缩小 $2$ 倍,就需要增加 $2^d$ 倍的数据量或模型参数。进而就是直观的结论:
$$ L(P) \propto P^{-\frac{1}{d}} $$
即 Loss 与 参数量之间是幂律关系,其幂律值小于 $1$(因为有 $d>1$)。
总结
至此,关于 Scaling Law 的数学含义就已经基本都解释清楚了。
更重要的问题是,有了相关的理论支撑后,我们能做什么?哪些事情做不了。
基于多份数据融合的实验结果预测
这件事是不可行的。
一切机器学习的基础都是最大似然估计,而最大似然估计的基础假设就是独立同分布。两组分布不同的数据融合,一定会破坏原有的分布,至于不同比例下融合后形成怎样的分布,具有怎样的特性,在两份数据的分布都已知的条件下,是可以计算的。但对于我们自己的机器学习任务,原本就是要去学习数据的分布,这就决定了,不可能在不了解数据分布的条件下,估计融合后的数据分布。
类似的,多分不同分布的数据集怎么融合能更贴近测试集也是不可知的,只能试出来。由于测试集也不是真值,甚至测试集对真实世界的表达很可能还不如训练集,所以针对测试集做针对性调优是不值得的。
这部分的定量分析,其实可以借鉴 OpenAI 关于 Scaling Laws 的经典文章 Kaplan et al. (2020) 中尝试的方法:
当我们在与训练集分布不同的文本上评估模型时,其结果与训练验证集上的结果强烈相关,损失函数中有一个大致恒定的偏移量。换句话说,转移到不同的分布会带来一定的固定惩罚,但除此之外,其提升程度大致与训练集上的表现一致。
可以用类似这样的方法,通过多份不同分布的测试集效果打分情况,评估模型表现。
当然,实操方面其实也不复杂,就是多看几个测试集的结果,记录下来。如果模型优化后,在各个测试集上的提升是基本一致的,那就说明这次改进不是因为数据分布变化带来的,而是因为模型能力带来的。
判断最优的参数和模型数据量配比
这件事不是特别值得做。因为我们当前模型的优质数据不够多。所以提供的数据质量是不稳定的。小模型上得到的预测数据值,在大模型上操作时,肯定不能按预测量来操作,而是还需要进一步增加数据量。但是具体增加多少,因为我们对数据质量无法在训练前得到评估,所以是不可预测的。
这件事值得做的条件是:我们已经用一份数据训练了一个很大的模型,然后我们可以通过抽样的方法构建小模型,用大模型预测小模型需要多少数据量,这件事是可行的。
当然,如果只是一个预估值做参考,这件事倒是可以做一下。
注:这件事值得做的数学理论基础是:我们需要找到样本的精度和模型训练的流型精度一致的对应比例。这件事的前提条件是:模型得到充分训练,且 Loss 与 样本、模型精度是同一个数量级(Loss 就是当前的精度)。如果这个精度不一致,loss 会被更大的精度所制约。带来的影响是会增加一定的无效计算量。
理论上,这件事更应该用适合的停机算法来避免冗余的计算,而不是需要精准的预估精度。
尝试用更小的模型达到更优的效果
这件事价值不是特别大。
- 不需要知道具体的比例,我们也知道,哪怕对于小模型,喂更多的数据可以达到更好的效果。
- 小模型的表达能力是有限的,所以也不是喂更多的数据就一定可以提升效果。
于是哪怕做出了预估,也需要加好多限制条件,而实际应用场景也不多。
其他?
昨天看完后,原本想说 Scaling Law 是个显然的结果,其规律并不蕴含更深层次的信息。但后来仔细想了想,可能还是有很多细节值得仔细的表述一下,以免遗漏什么可能性,所以写了这个文档。
总得来说,我对于 Scaling Law 并没有想到更深的应用场景,它所能表达的大概也只是:更多的数据、更大的模型(更多的模型参数)可以更好的拟合真实的概率分布。这件事对于机器学习来说,是自然的结论。这个规律几乎不涉及具体的模型形式——几乎只要是机器学习都符合这个规律。
所以从第一性原理角度出发,它算是一个数学上给出定性的存在性定理:我们的机器学习是可以不断优化的。但它不蕴含如何能更好地做优化的信息。
-
这个定理的前置条件和证明过程这里就不赘述了,需要的话自己查一下。 ↩︎
-
大部分的训练,增加迭代次数的方式都伴随着提供更多的训练样本,若模型距离收敛所需要的迭代次数比较多,例如如果
学习律(本质上就是 PID 中的 $K_p$)比较小,模型距离理论上限比较远,这时误差项主要不是来源于数据自身的误差,而是来自梯度下降逼近的误差,那么这个指数关系就会比较显著,对应的表象就是误差同数据量之间是指数关系。 ↩︎ -
还可以增加每层的神经元数量(宽度),这种增加模式就不属于分层。类似于 Scaling Law 的规律,这种扩大的方式(形状变化)对于结果的影响不显著。当然,这件事是值得做实验,试一试少层数多神经元和多层数少神经元(参数总数一致)训练的结果是否一致。盲猜会有显著性能差异。 ↩︎