一句话理解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 Encoder | 1B-4B | 15-20% |
| Projector | 0.1-0.5B | 1-2% |
| LLM | 7B-70B | 78-84% |
这说明视觉编码器的计算占比远高于其参数量所占的比例,因为图像的前向计算涉及大量的二维卷积和patch embedding操作,比文本token的embedding查找昂贵得多。这也是VLA模型训练效率低于纯LLM的原因之一。
1.3 计算预算下的最优决策
给定固定计算预算 $C$(以FLOPs计),团队需要决定模型大小和数据量的组合。实际决策矩阵:
| 预算 $C$ | 推荐 $N_{opt}$ | 推荐 $D_{opt}$ | 典型配置 |
|---|---|---|---|
| 1e21 FLOPs | 400M | 22B tokens | 0.4B模型 + 22B数据 |
| 1e22 FLOPs | 1.5B | 85B tokens | 1.5B模型 + 85B数据 |
| 1e23 FLOPs | 7B | 400B tokens | 7B模型 + 400B数据 |
| 1e24 FLOPs | 40B | 2.2T tokens | 40B模型 + 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最优 | 变化 |
|---|---|---|---|
| WebData | 70% | 45% | -25% |
| Domain Data | 15% | 35% | +20% |
| Synthetic | 10% | 12% | +2% |
| Instruction | 5% | 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 | 备注 |
|---|---|---|
| <1B | 5.0 | 较小模型容错更大 |
| 1B-7B | 1.0 | 标准推荐 |
| 7B-70B | 0.5-1.0 | 越大模型裁剪越保守 |
| >70B | 0.5 | 超大模型需更严格 |
3.3 NaN排查
系统性排查顺序(按出现频率从高到低):
- 检查输入数据是否包含NaN或inf(最常见来源,占50%以上)
- 检查模型初始化方法(过大或过小的初始值导致训练早期就出现NaN)
- 检查数值精度:bf16比fp16更稳定,fp16训练需要loss scaling配合
- 检查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 tokens | 4K-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× | 低 |
| 预解码为numpy | 3-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步训练):
| 阶段 | 步数 | 数据范围 | 学习率 |
|---|---|---|---|
| 1 | 0-10K | 直道+白天+晴天 | 1e-4 warmup |
| 2 | 10K-30K | +弯道+黄昏 | 1e-4 |
| 3 | 30K-60K | +夜间+多云 | 5e-5 |
| 4 | 60K-80K | +雨天+拥堵 | 2e-5 |
| 5 | 80K-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.38m | 100K |
| 手工课程 | 0.32m | 85K |
| 自动课程 | 0.30m | 80K |
| 混合策略 | 0.29m | 75K |
课程学习在VLA模型训练中效果显著:复杂场景(夜间+雨天+拥堵路口)的轨迹预测精度提升约24%,收敛所需步数从100K减少到75K。同时训练过程更加稳定,loss spike频率降低约40%,模型在困难场景上的泛化能力明显改善。这证明"先易后难"的学习顺序对VLA这类多模态模型尤其有效,也说明合理的课程设计可以直接转化为可量化的工程收益。
6. 数据Pipeline工程
6.1 数据加载架构
推荐VLA训练的数据加载架构,旨在处理海量多模态数据的同时最小化GPU空闲时间:
6.2 数据混洗与去重
全局混洗(在每个epoch开始时打乱所有数据)可以避免周期性bias,防止模型学到数据排序中的假关联。局部混洗(在数据加载buffer内打乱)保证最近N个样本的随机性,减少相邻样本的相关性。两者结合效果最佳。
| 去重粒度 | 方法 | 查重率 | 开销 |
|---|---|---|---|
| 文本精确 | Hash | 100% | 低 |
| 文本模糊 | MinHash | 80-95% | 中 |
| 图像精确 | Perceptual Hash | 90% | 低 |
| 场景级 | 3D相似度 | 70-85% | 高 |
6.3 预处理策略
推荐混合离线+在线预处理方案,在训练吞吐和存储成本之间取得平衡。离线预处理减少训练时I/O压力,在线处理保留在训练中调整参数的灵活性。
| 处理步骤 | 离线/在线 | 原因 |
|---|---|---|
| 图像解码 | 离线(存为numpy) | 主要I/O瓶颈 |
| Resize+Normalize | 在线(GPU/DALI) | 计算快,省存储 |
| Tokenization | 离线 | 计算量大 |
| 轨迹离散化 | 离线 | 计算量大 |
总结
Scaling Law和数据策略是大模型训练工程的两个核心支柱,前者回答"训练多少数据和参数最合适",后者回答"用什么数据来训练最好",两者结合直接影响最终模型效果和资源利用效率。关键要点:
- Scaling Law给出计算预算、模型大小、数据量之间的定量关系,是训练策略制定的理论基础。Chinchilla法则指出预算下最优参数和数据量各占 $\sqrt{C}$ 比例。小模型实验可预测大模型表现,迁移误差<0.1。
- 数据配比需要找到Pareto最优面。Domain Data(自动驾驶领域数据)推荐占30-40%,比通用WebData有更高的边际价值。
- 训练诊断:Loss Spike(约60%因学习率问题,包括warmup过快和cosine decay过激)、梯度爆炸(建议裁剪阈值1.0并配合梯度范数监控)、NaN(从输入数据和模型初始化开始系统性排查,先确认数据中没有异常值)。
- Curriculum Learning按易到难组织训练数据,包括手工课程和自动课程两种方式,可提升复杂场景精度24%,加速收敛25%,并大幅降低训练不稳定性。
- 数据Pipeline的I/O优化是VLA训练的关键瓶颈,推荐混合离线+在线预处理方案。图像解码和Tokenization等重计算任务离线进行,Resize等轻计算保留在线以节省存储成本。
问题:大模型训练中计算预算有限、数据配比不当、训练不稳定等因素导致模型效果不佳,尤其是在VLA多模态场景下各组件(视觉编码器、语言模型)的训练需求和收敛速度差异较大,训练数据来源多样但质量参差 → 方法:基于Scaling Law确定最优参数和数据量配比 + Pareto最优数据混合策略 + Curriculum Learning按易到难组织训练 + 训练异常诊断系统 → 结果:固定预算下模型性能提升15-25%,训练收敛速度加快20-30%,训练稳定性显著提升(loss spike减少约50%)。