GPT-2 124M 训练损失尖峰 | AI生成和翻译
======================================================================== GPT-2 124M github-code — 损失分析(步骤 262k–280k) ========================================================================
步骤 训练损失 验证损失 Δ 训练 备注 ------------------------------------------------------------------------ 262000 3.0952 3.0265 263000 3.3459 3.2922 +0.251 264000 3.6089 3.3886 +0.263 265000 3.8677 3.7542 +0.259 266000 3.9365 3.8930 +0.069 267000 5.0157 5.0602 +1.079 <<< 尖峰 268000 5.0102 5.1968 -0.005 <<< 尖峰 269000 4.6592 4.7792 -0.351 270000 4.2488 4.2854 -0.410 271000 3.9500 3.9416 -0.299 272000 3.7400 3.8020 -0.210 273000 3.6361 3.5530 -0.104 274000 3.4293 3.5930 -0.207 275000 3.5167 3.6213 +0.087 276000 3.6871 3.5147 +0.170 277000 3.7307 3.6379 +0.044 278000 3.4410 3.4339 -0.290 279000 4.4294 4.6838 +0.988 <<< 尖峰 280000 4.2341 4.3662 -0.195
已处理 tokens:~9.2B / 14B 计划(65.6%)
— 关键发现 —
-
损失在上升,而非下降(步骤 262k–266k) 在第一个尖峰之前,训练损失在短短 4000 步内从 3.10 攀升至 3.94。 增幅达 +27%。在训练的这一阶段(已完成 60% 以上),损失本应持平或缓慢下降。 在大尖峰出现之前,已经出了某种问题。
- 两个主要损失尖峰
- 尖峰1 在步骤 267k–268k:损失从 3.94 跃升至 5.02(+1.08)。 验证损失达到 5.20。这是 28% 的单步跳跃 —— 对于此刻的余弦 LR 调度来说极其异常。
- 尖峰2 在步骤 279k–280k:损失从 3.44 跃升至 4.43(+0.99)。 又是大约 29% 的跳跃。深度不及尖峰1,但模式相同。
-
尖峰之间的缓慢恢复 在尖峰1之后,损失用了约 10k 步(269k→278k)从 5.02 恢复至 3.44。 这浪费了大量计算资源 —— 大约 10,000 步 × 32,768 tokens = 3.28 亿 tokens 仅仅用于恢复。
-
最佳损失出现在此窗口的开始 最低验证损失为步骤 262k 处的 3.03。当前验证损失为 4.37 —— 模型在此窗口内变得更差,而非更好。
- 周期性暗示数据分片轮换 尖峰间隔约 12k 步(267k 和 279k)。如果数据集轮换分片,或各分片具有截然不同的分布 (例如不同语言、文件类型),那么当遇到“困难”或分布外的分片时,就可能解释周期性的损失冲击。
— 可能原因 —
a) 数据分布偏移:github-code 数据集可能包含代码特征(语言、文件类型、注释密度)差异巨大的分片。 当数据加载器切换到新分片时,模型突然面对分布外数据 → 损失尖峰。
b) 学习率可能对该阶段过高:在步骤 262k,采用从 6e-4 到 6e-5(427k 步)的余弦衰减, 学习率仍然约为 2.7e-4。这是峰值的 45% —— 对于训练中期来说相当激进。 尖峰1之前的损失上升表明模型在振荡。
c) 没有梯度范数裁剪的证据:如果 grad_clip=1.0 没有捕获来自困难分片的异常梯度, 优化器可能会超调。
— 建议 —
- 检查损失尖峰是否与数据加载器中的分片边界相关(每次评估时记录分片索引)。
- 考虑降低学习率,或切换到更温和的余弦调度。
- 如果模型持续出现尖峰,值得从步骤 262k 检查点(最佳验证损失)以更温和的学习率调度重新开始。
- 当前验证损失(4.37)比步骤 262k 的(3.03)更差 —— 最后的约 18k 步可能对模型质量产生了净负面影响。