ScalingLens 是一套用于分析多模态大模型训练过程中模型内部参数变化、数据质量对模型行为影响的实验工具集。通过 Dev Loss 追踪、WeightWatcher 参数分析和数据退化实验,提供模型训练质量的多维度观测视角。
┌──────────────────────────────────────────────┐
│ 模型训练过程 │
└───────┬──────────────┬──────────────┬────────┘
│ │ │
┌─────────────▼──┐ ┌────────▼────────┐ ┌─▼────────────────┐
│ Dev Loss 追踪 │ │ 参数结构分析 │ │ 数据退化实验 │
│ │ │ │ │ │
│ • 不同ckpt的 │ │ • Model-level │ │ • 高频词替换 │
│ 验证损失曲线 │ │ alpha分布 │ │ • 数据重复50% │
│ • 跨模型对比 │ │ • Layer-level │ │ • 数据重复100% │
│ (Qwen/Blue) │ │ 权重分析 │ │ │
│ │ │ • 层间变化量 │ │ → 观察参数变化 │
└────────────────┘ │ • 与Base模型对比 │ └──────────────────┘
└──────────────────┘
在新的dev data上追踪不同模型/checkpoint的验证损失变化,用于:
- 观察BlueLM-0.6B训练过程中loss的下降趋势
- 对比BlueLM-3B与Qwen3-4B等开源模型的表现差异
支持的模型:
- BlueLM-0.6B(各checkpoint)
- BlueLM-3.0-3B-1225
- Qwen3-4B (Base/Instruct/Thinking)
代码:dev_loss/
利用 WeightWatcher 工具对模型权重矩阵进行幂律分析(alpha值),从多个层次观察参数质量:
- Model Level:整体alpha分布直方图,标注过拟合(alpha<2)和欠拟合(alpha>6)区域
- Layer Level(Language Model):逐层分析特定权重矩阵(v_proj、up_proj、mlp.fc1等)
- Layer Level(Vision Model):视觉编码器的对应分析(linear_fc1、attn.qkv等)
- 层间变化量:相邻层权重的均值差、方差差、L2范数比、有效秩差异、相关性
- 与Base模型对比:比较下游模型(InterVL3.5、AndesVL)与Qwen3 Base的参数差异
代码:parameter_visualization/
通过主动降低训练数据质量,观察其对模型参数结构的影响:
- 高频词替换:利用LLM将文本内容改写为简单语言,代码统一转为JavaScript(前50%数据退化)
- 数据重复50%:前50%数据使用1/10的原始数据重复10次
- 数据重复100%:从1200个shard中选120个,随机重复填满所有slot
代码:data_degradation/
对退化数据训练出的模型进行相同的WeightWatcher和层间变化分析,与Baseline训练结果进行对比,验证数据质量退化在参数层面的可观测性。
ScalingLens/
├── README.md # 本文档
├── yidan.md # 原始实验记录
├── dev_loss/ # Dev Loss验证
│ ├── val_0.6B.py # BlueLM-0.6B各ckpt验证
│ ├── val_3B.py # BlueLM-3B验证
│ ├── val_qwen.py # Qwen/InterVL/AndesVL验证
│ ├── utils.py # 通用loss计算工具
│ ├── val.sh # 启动脚本
│ └── plot.ipynb # 绘图notebook
├── parameter_visualization/ # 参数分析
│ ├── weight_watcher/ # WeightWatcher分析
│ │ ├── model_level.py # 模型级alpha分布
│ │ ├── visualization_qwen.py # Qwen系列逐层分析
│ │ ├── visualization_blue.py # BlueLM逐层分析
│ │ └── plot.ipynb # 绘图notebook
│ └── variation_statistic/ # 层间变化量分析
│ ├── visualization_qwen.py # Qwen系列层间变化
│ ├── visualization_blue.py # BlueLM层间变化
│ ├── cop_with_qwen.py # 与Qwen Base对比
│ └── plot.ipynb # 绘图notebook
├── data_degradation/ # 数据退化构造
│ ├── 01_data_degration.py # 高频词替换(LLM改写)
│ ├── 02_data_repeat_0.5.py # 50%数据重复
│ └── 03_data_repeat_1.0.py # 100%数据重复
└── samples/ # 输出结果样例
├── val_loss_sample.txt # 验证loss序列样例
└── ww_layer_sample.json # WeightWatcher分析结果样例
每个验证数据集对应一个文件,内容为各checkpoint的loss列表:
high_freq_cn: [4.086, 3.954, 3.916, 3.884, 3.877, 3.857, 3.844, ...]
每层输出一个JSON文件,包含幂律拟合结果:
{
"layer_id": 0,
"name": "Linear",
"M": 2560,
"N": 9728,
"alpha": 8.56,
"alpha_weighted": 15.82,
"entropy": 1.11,
"lambda_max": 70.57,
"log_norm": 4.22,
"log_spectral_norm": 1.85,
"matrix_rank": 2560,
"num_evals": 2560
}保存为 .npy 文件,包含各层间的统计量(均值差、方差差、L2范数比等)。
部分脚本依赖 blue.model.transformers.bluelm 包(BlueLM模型的配置和实现)。使用时需自行准备 BlueLM 模型代码并将路径加入 sys.path。如果仅分析开源模型(Qwen系列等),可忽略此依赖。