一、目录
- 定义
- 目标
- 案例实现
二、实现
-
定义
scaling law 通常是通过实验来观察和验证的,而不是通过直接的代码实现。这是因为 scaling law 描述的是模型性能与资源(如模型大小、数据量等)之间的经验性关系,而不是一个可以通过编程直接实现的算法或模型。然而,你可以通过编写代码来运行一系列实验,收集数据,并分析这些数据以验证 scaling law。
优点:
提前预测最终模型效果,知道每次训练的大概能到什么程度,要是不及预期可以根据预算再进行调整。
在小尺寸模型上做置信的实验,进行数据、算法策略验证,降低实验的时间、资源成本。
在真正的大规模预训练中,随时监测模型效果是否符合预期。 -
目标
1. 设计自己的模型参数符合压缩定律
2. 通过压缩定律,以及小模型,预测大模型的性能。
3. 缩放定律:C~6ND, 通过验证模型是否符合缩放定律,如果符合,则可以计算性能与参数量、 tokens数与参数量的关系。 -
案例实现
案例1 . scaling law实操1
首先准备充足的数据(例如1T),设计不同模型参数量的小模型(例如0.001B - 1B),独立训练每个模型,每个模型都训练到基本收敛(假设数据量充足)。根据训练中不同模型的参数和数据量的组合,收集计算量与模型性能的关系。然后可以进一步获得计算效率最优时,即同样计算量下性能最好的模型规模和数据大小的组合,模型大小与计算量的关系,以及数据大小与计算量的关系。
参考: https://blog.csdn.net/Kaiyuan_sjtu/article/details/134658019计算量 flops 模型参数(去除embedding) 数据大小(token)
实验流程:
1 . 确定目标模型结构以及参数:首先,需要确定我们要预训练的模型的结构,以及我们期望的模型的参数有多大。这里有一个非常重要的估算,就是浮点运算量(FLOPs)C 、模型参数N 以及训练的token数 D之间存在关系:C=6ND
transformer decoder:
-
确定不同参数的模型
确定了模型的框架以及期望训练的参数后,我们可以在多个比期望参数小的模型上做预训练,并且统计多个实验结果,如GPT3的图所示:随着训练的进行(计算量 C),小的模型出现收敛,大的模型loss也迅速下降。拟合小模型每条曲线的下降趋势(可能需要多次拟合),可以得到损失值L 与计算量C 的关系(幂次关系)。
图3 计算量与性能的平滑缩放。验证集交叉熵损失随着计算量的增加呈现出幂律趋势
训练统计完Loss、parameters、flops 三者之间的规律,可以总结出规律L=2.57C^(-0.048).
3. 验证Loss 与C 的关系。
需要制作两个图,拟合计算量Flops 、模型参数N, 以及计算量Flops 和训练的tokens数D 的关系。
如:拟合两图的关系。
图4 计算量与模型参数、训练tokens数的关系
这一步很重要,因为不是只得出类似上图3 L=2.57C^(-0.048). 就能证明自己得到的曲线满足Scaling Laws了。这就要用到C~6ND 这个公式了。因为我们知道,C~6ND 这个公式的成立和模型是否训练没有关系,即使模型没有被训练,也应该满足这个关系。 -
使用scaling law 定律
从图3和图4分别得到了模型性能与计算量的关系、计算量与模型大小的关系、计算量与训练的tokens之间的关系。那么现在我们有两个问题需要解决:- 预训练的模型在评估集上(验证集损失上)的性能是多少?
- 达到该性能至少需要多少tokens?
通过模型性能与计算量的关系以及模型大小与计算量的关系直接计算出模型大小与性能的关系。这样就可以直接通过具体的模型大小,得到模型在该规模下的具体性能(不考虑训练所需的tokens)
如果达到我们的期望,我们可以考虑第二个问题。我们可以通过模型性能与计算量的关系以及训练tokens数与计算量的关系直接计算出训练tokens数与性能的关系。案例2 . scaling law实操2