一句话理解Scaling Law

Scaling Law揭示了模型性能随计算量、参数量和数据量呈幂律增长的定量关系,但实际工程中面临计算预算有限、数据质量不均、训练不稳定等约束,需要在这些变量之间找到最优平衡点。

1. Scaling Law的核心原理

1.1 三大Scaling Law

OpenAI在2020年提出的Scaling Law奠定了大模型训练的理论基础,论文"Scaling Laws for Neural Language Models"通过大量实验发现:模型损失随计算量、参数量和训练数据量的增加而呈现可预测的幂律下降关系。

$$ L(N, D) = \frac{A}{N^\alpha} + \frac{B}{D^\beta} + L_\infty $$

其中第一项 $\frac{A}{N^\alpha}$ 是模型容量带来的损失,第二项 $\frac{B}{D^\beta}$ 是数据量带来的损失,第三项 $L_\infty$ 是数据本身固有熵的下界——即使无限数据和无限参数也无法突破。

其中 $N$ 是参数量,$D$ 是数据量(tokens),$L_\infty$ 是不可避免的损失(数据固有熵),$A, B, \alpha, \beta$ 是通过实验拟合的常数。

Chinchilla Scaling Law(DeepMind, 2022)进一步修正:对于给定的计算预算 $C$,最优的模型大小和数据量满足

$$ N_{opt} \propto C^{0.5}, \quad D_{opt} \propto C^{0.5} $$

即计算预算翻倍时,模型大小和数据量应该各增加约1.4倍($\sqrt{2}$),而不是把全部预算都投到模型规模上。这个发现颠覆了此前"模型越大越好"的直觉——更大的模型如果没有足够的数据支撑,性能反而不如小模型+大数据。

1.2 Chinchilla最优分配

Chinchilla的核心贡献:之前的模型(包括GPT-3 175B)在训练数据量上都存在严重不足。GPT-3使用了300B tokens训练,按Chinchilla法则最优只需约130B tokens(约2.3倍过量参数)。Chinchilla(70B参数)用1.4T tokens训练,在相同计算预算下全面超越了GPT-3(175B参数)的表现。

对于VLA模型,纯Chinchilla法则需要修正——视觉编码器在前端增加了大量计算量(每张图像需要处理约196个patch),改变了整体的计算预算分布。一个70B VLA模型的经验参数和计算分配:

组件参数量计算占比
Vision Encoder1B-4B15-20%
Projector0.1-0.5B1-2%
LLM7B-70B78-84%

这说明视觉编码器的计算占比远高于其参数量所占的比例,因为图像的前向计算涉及大量的二维卷积和patch embedding操作,比文本token的embedding查找昂贵得多。这也是VLA模型训练效率低于纯LLM的原因之一。

1.3 计算预算下的最优决策

给定固定计算预算 $C$(以FLOPs计),团队需要决定模型大小和数据量的组合。实际决策矩阵:

预算 $C$推荐 $N_{opt}$推荐 $D_{opt}$典型配置
1e21 FLOPs400M22B tokens0.4B模型 + 22B数据
1e22 FLOPs1.5B85B tokens1.5B模型 + 85B数据
1e23 FLOPs7B400B tokens7B模型 + 400B数据
1e24 FLOPs40B2.2T tokens40B模型 + 2.2T数据

工程经验:大多数团队的预算处于1e22-1e23 FLOPs之间(对应数十到数百张GPU训练数周到数月)。Chinchilla法则是一个好的起点,但需要根据实际数据质量和训练稳定性微调。例如领域数据(Domain Data)更多的项目可以适当增加参数比,因为更有价值的数据可以支撑更大的模型而不至于过拟合。

1.4 Scaling Law的迁移性

Scaling Law的一个关键性质是迁移性:从小模型上拟合的 $\alpha, \beta$ 参数可以准确预测大模型的表现。这意味着可以用1B模型的实验来预测7B模型的表现。

实测迁移误差:

小模型→大模型Loss预测误差预算节约
0.1B → 1B<0.02~10×
1B → 7B<0.05~7×
7B → 70B<0.10~10×

预测公式:

$$ L_{large}(N_{large}, D) \approx L_{small}(N_{small}, D) - \frac{A}{N_{large}^\alpha} + \frac{A}{N_{small}^\alpha} $$

实操建议:在项目启动阶段先用小规模实验拟合scaling law参数,指导大规模训练的资源分配和预算规划。具体流程:先用1B模型在多组参数下训练少量步数拟合scaling law参数,再用7B模型验证(大约2周训练),最后决定是否用70B模型。这种方法可以将大规模训练的成本和风险降低10倍,避免盲目投入上百张GPU资源后才发现策略不对。

2. 数据混合配比

2.1 多源数据的挑战

VLA模型需要同时掌握语言理解、视觉感知和驾驶决策,训练数据来自多个来源:

  • WebData:互联网文本和图文对,量大但质量参差不齐
  • Domain Data:自动驾驶专属数据(路测场景描述、轨迹数据、控制日志)
  • Synthetic Data:仿真器生成的驾驶场景
  • Instruction Data:人工标注的指令-响应对

每种数据的质量和覆盖范围不同,简单等比例混合会带来次优结果——WebData过多会稀释领域能力,Domain Data过多则可能过拟合。Domain Data虽然量小但价值最高(路测数据直接对应部署场景),Synthetic Data量大但可能与真实场景有domain gap(仿真与现实之间的差异),需要谨慎配比。

2.2 Pareto前沿与最优配比

核心是找到Pareto最优面——在固定总数据量的情况下,如何分配各源数据比例使模型在目标任务上表现最好。

实验方法:对数据比例进行网格搜索或多目标优化。典型结果:

数据来源随机混合Pareto最优变化
WebData70%45%-25%
Domain Data15%35%+20%
Synthetic10%12%+2%
Instruction5%8%+3%

Domain Data从15%提升到35%,驾驶场景感知精度提升约12%,而WebData的减少几乎不影响语言能力。

2.3 数据质量分阶段过滤实践

在工程实践中,数据过滤通常分阶段进行以控制计算成本。第一阶段使用计算量小的方法(如困惑度过滤,只需一次前向传播即可评分)快速过滤明显低质量的数据(如乱码文本、模糊图像),通常可以过滤掉10-20%的数据。第二阶段使用计算量大的方法(如任务相关性评分、去重)精细筛选保留的数据。这种级联策略可以将整个过滤管道的计算成本降低5-10倍。

2.4 数据质量加权

不是所有数据点都具有相同的训练价值,低质量数据甚至可能损害模型性能。使用加权策略量化每个样本的训练价值:

$$ w_i = \frac{1}{1 + \exp(-\beta \cdot q_i)} $$

其中 $q_i$ 是数据质量分数,$\beta$ 控制加权陡峭程度。

常见质量评估方法:

方法评估维度效率精度
困惑度过滤语言模型拟合度
去重(MinHash)数据重复程度
任务相关性与目标任务相关
人工标注质量标注准确性最高

2.5 Domain Data的上采样

Domain Data稀缺但价值高。上采样策略:对Domain Data按照 $\gamma > 1$ 的倍率上采样。

经验法则:上采样率 $\gamma$ 不宜超过5-10倍,过度上采样会导致过拟合和语言能力退化。

$$ \text{Performance} \propto \log(\gamma), \quad \gamma < 10 $$

2.6 动态配比

固定配比不是最优选择,因为不同训练阶段模型对数据的需求不同。推荐策略:

  • 课程式调整:早期多WebData学习语言能力、世界知识等通用知识,后期增加Domain Data学习驾驶场景理解、轨迹预测等专有知识
  • 基于梯度相似度:根据各数据源梯度的方向和大小动态调整采样权重
ratio_web = 0.7 - 0.4 * (step / total_steps)  # 70%→30%
ratio_domain = 0.3 + 0.4 * (step / total_steps)  # 30%→70%

3. 训练曲线异常诊断

3.1 Loss Spike排查

Loss Spike是训练中最常见的问题,特征非常明显:loss从平稳状态突然跳高,幅度可能超过0.5,随后可能恢复也可能持续高位。对于VLA模型,loss spike可能出现在视觉编码器或语言模型的梯度上,两者表现不同。视觉编码器的spike通常更剧烈但恢复更快。

常见原因与优先级:学习率过高或warmup不足(60%),表现为所有batch loss同时升高;数据批次中存在异常样本(25%),表现为单一batch的loss跳变;数值不稳定如梯度爆炸(10%),表现为梯度范数同时飙升;分布式通信错误(5%),表现为特定rank的loss异常。

排查步骤:首先检查学习率曲线是否在spike附近有跳变,其次检查梯度范数是否超过阈值(可用torch.nn.utils.clip_grad_norm_调试),然后记录spike对应的具体数据样本便于定位问题数据,最后检查模型参数是否有NaN(往往是数值崩溃的最终信号)。建议在训练脚本中自动记录spike时的快照。

3.2 梯度爆炸

信号:$\lVert g \rVert_2 > 10 \times \text{历史均值}$

标准解决方案:使用梯度裁剪(torch.nn.utils.clip_grad_norm_)、将学习率降低到原来的1/5-1/10、检查loss函数中是否有除零或对数运算错误。

模型规模建议max_norm备注
<1B5.0较小模型容错更大
1B-7B1.0标准推荐
7B-70B0.5-1.0越大模型裁剪越保守
>70B0.5超大模型需更严格

3.3 NaN排查

系统性排查顺序(按出现频率从高到低):

  1. 检查输入数据是否包含NaN或inf(最常见来源,占50%以上)
  2. 检查模型初始化方法(过大或过小的初始值导致训练早期就出现NaN)
  3. 检查数值精度:bf16比fp16更稳定,fp16训练需要loss scaling配合
  4. 检查LayerNorm epsilon(建议>1e-5,过小的epsilon在低精度下容易导致除零)
def check_nan(module, grad_input, grad_output):
    for grad in grad_input:
        if grad is not None and torch.isnan(grad).any():
            raise RuntimeError("NaN detected")

3.4 Loss发散模式

模式特征根因方案
早期发散前10步loss不降反升LR过高/warmup不足降低LR/增加warmup
后期发散稳步下降后突然发散LR scheduler问题使用cosine decay
周期性发散每隔K步loss跳变数据顺序性问题shuffle数据
单调上涨loss持续上涨代码bug/梯度方向错检查loss计算

4. VLA模型数据预处理

4.1 与纯语言模型的差异

维度纯语言模型VLA模型
输入模态文本图像+文本+轨迹
序列长度2K-8K tokens4K-16K tokens
数据格式纯文本多模态对齐格式
预处理复杂度

4.2 图像预处理Pipeline

标准VLA图像处理流程包含5个步骤:加载解码(从JPEG/PNG读取为RGB tensor)→Resize(保持宽高比,常见分辨率224×224或336×336)→Normalize(使用ImageNet均值和方差归一化像素值到[0,1]范围)→Patch Embed(将图像切分为14×14的patches并投影为token序列)→位置编码(添加2D位置编码或RoPE表示空间位置信息)。

I/O是训练瓶颈。优化方案:

方法加速比复杂度
WebDataset格式2-3×
预解码为numpy3-5×
GPU解码(DALI)10-20×

4.3 Tokenization策略

策略优势适用
统一tokenizer简单实现快速原型
独立tokenizer精度高生产级VLA
分层次tokenization灵活性高超大VLA

轨迹数据的离散化tokenization:

def discretize_trajectory(traj, num_bins=256):
    x_bins = np.linspace(MIN_X, MAX_X, num_bins)
    y_bins = np.linspace(MIN_Y, MAX_Y, num_bins)
    tokens = [np.digitize(x, x_bins) * num_bins + np.digitize(y, y_bins)
              for x, y in traj]
    return tokens

5. Curriculum Learning

5.1 课程维度

维度简单→困难
场景复杂度直道→弯道→复杂路口
光照条件白天→黄昏→夜间
天气晴天→多云→雨/雪
交通密度无车→少量→拥堵

5.2 课程计划的实现

class CurriculumManager:
    def __init__(self, stages):
        self.stages = stages  # [(filter_fn, steps), ...]
    def get_filter(self, step):
        cum = 0
        for fn, s in self.stages:
            cum += s
            if step < cum: return fn
        return lambda x: True

一个典型的VLA课程计划示例(100K步训练):

阶段步数数据范围学习率
10-10K直道+白天+晴天1e-4 warmup
210K-30K+弯道+黄昏1e-4
330K-60K+夜间+多云5e-5
460K-80K+雨天+拥堵2e-5
580K-100K全量+困难上采样1e-5 cooldown

5.3 自动课程发现

基于loss的自动课程:$p_i \propto \text{loss}_i^\gamma$,$\gamma$ 通常取0.5-2.0。核心思想是让模型更多看到当前还学不好的样本——高loss样本获得更高采样权重,但随着训练进行,这些样本的loss下降后,采样权重也相应降低,从而实现自动化的渐进式学习。

5.4 课程学习效果

策略复杂场景ADE收敛步数
随机顺序0.38m100K
手工课程0.32m85K
自动课程0.30m80K
混合策略0.29m75K

课程学习在VLA模型训练中效果显著:复杂场景(夜间+雨天+拥堵路口)的轨迹预测精度提升约24%,收敛所需步数从100K减少到75K。同时训练过程更加稳定,loss spike频率降低约40%,模型在困难场景上的泛化能力明显改善。这证明"先易后难"的学习顺序对VLA这类多模态模型尤其有效,也说明合理的课程设计可以直接转化为可量化的工程收益。

6. 数据Pipeline工程

6.1 数据加载架构

推荐VLA训练的数据加载架构,旨在处理海量多模态数据的同时最小化GPU空闲时间:

[[](WSo3r/kNeFrS]/S(SD)/DA[LI)][(ArBruofwf/ePra]rq(uReitn)gBuffer)[](GPU)

6.2 数据混洗与去重

全局混洗(在每个epoch开始时打乱所有数据)可以避免周期性bias,防止模型学到数据排序中的假关联。局部混洗(在数据加载buffer内打乱)保证最近N个样本的随机性,减少相邻样本的相关性。两者结合效果最佳。

去重粒度方法查重率开销
文本精确Hash100%
文本模糊MinHash80-95%
图像精确Perceptual Hash90%
场景级3D相似度70-85%

6.3 预处理策略

推荐混合离线+在线预处理方案,在训练吞吐和存储成本之间取得平衡。离线预处理减少训练时I/O压力,在线处理保留在训练中调整参数的灵活性。

处理步骤离线/在线原因
图像解码离线(存为numpy)主要I/O瓶颈
Resize+Normalize在线(GPU/DALI)计算快,省存储
Tokenization离线计算量大
轨迹离散化离线计算量大

总结

Scaling Law和数据策略是大模型训练工程的两个核心支柱,前者回答"训练多少数据和参数最合适",后者回答"用什么数据来训练最好",两者结合直接影响最终模型效果和资源利用效率。关键要点:

  1. Scaling Law给出计算预算、模型大小、数据量之间的定量关系,是训练策略制定的理论基础。Chinchilla法则指出预算下最优参数和数据量各占 $\sqrt{C}$ 比例。小模型实验可预测大模型表现,迁移误差<0.1。
  2. 数据配比需要找到Pareto最优面。Domain Data(自动驾驶领域数据)推荐占30-40%,比通用WebData有更高的边际价值。
  3. 训练诊断:Loss Spike(约60%因学习率问题,包括warmup过快和cosine decay过激)、梯度爆炸(建议裁剪阈值1.0并配合梯度范数监控)、NaN(从输入数据和模型初始化开始系统性排查,先确认数据中没有异常值)。
  4. Curriculum Learning按易到难组织训练数据,包括手工课程和自动课程两种方式,可提升复杂场景精度24%,加速收敛25%,并大幅降低训练不稳定性。
  5. 数据Pipeline的I/O优化是VLA训练的关键瓶颈,推荐混合离线+在线预处理方案。图像解码和Tokenization等重计算任务离线进行,Resize等轻计算保留在线以节省存储成本。

问题:大模型训练中计算预算有限、数据配比不当、训练不稳定等因素导致模型效果不佳,尤其是在VLA多模态场景下各组件(视觉编码器、语言模型)的训练需求和收敛速度差异较大,训练数据来源多样但质量参差 → 方法:基于Scaling Law确定最优参数和数据量配比 + Pareto最优数据混合策略 + Curriculum Learning按易到难组织训练 + 训练异常诊断系统 → 结果:固定预算下模型性能提升15-25%,训练收敛速度加快20-30%,训练稳定性显著提升(loss spike减少约50%)。