大模型训练loss突然暴涨?不要慌...

前言

最近阅读了《A Theory on Adam Instability in Large-Scale Machine Learning 》这篇论文。

比较全面的阐述了 100B 以上的大模型预训练中出现 loss spike 的原因(loss 突然大幅度上涨),并介绍了一些可能的解决办法。

论文写的非常精彩,但整体上有点散和深,我尝试着站在工业立场上把它串一下。

1、突刺是什么

首先介绍一下什么是 loss spike: loss spike 指的是预训练过程中,尤其容易在大模型(100B 以上)预训练过程中出现的 loss 突然暴涨的情况。

如图所示模型训练过程中红框中突然上涨的 loss 尖峰 loss spike 的现象会导致一系列的问题发生。

譬如模型需要很长时间才能再次回到 spike 之前的状态(论文中称为 pre-explosion),或者更严重的就是 loss 再也无法 drop back down,即模型再也无法收敛。

PaLM 和 GLM130b 之前的解决办法是找到 loss spike 之前最近的 checkpoint,更换之后的训练样本来避免 loss spike 的出现。

2、突刺成因分析

这篇论文(以下称本文)对 loss spike 的出现原因做了十分详细的分析,最后认为预训练使用的 Adam 优化器是导致这个现象出现的重要原因之一。

首先回顾一下 Adam 优化器的结构(这里介绍的是较为传统的 Adam 优化器,现在 nlp 任务更偏向于使用带有正则化项的 Adamw 变体):

本文首先对 Adam 的有效性做了论述,其本质在于证明了 Adam 优化过程是对牛顿下降法(二阶导)的一个有效逼近。

因此在收敛速度上大幅度领先传统 SGD(一阶导),证明过程不做赘述,可以参考本文和 Adam 系列相关论文。

Adam 算法是牛顿下降法的一个迭代逼近:

一切显得十分完美,但是理想很丰满,现实很骨感,收敛过程并不是一帆风顺的。

非稳态

中间态

稳态

进入正态分布的稳态之后,理想的更新参数变化趋势应该是方差越来越小,所有更新参数逐渐向 0 靠近。

这应该是一个单向的过程,即稳定的单峰状态(unimodal)不会再次进入非稳定的双峰状态(bimodal),但事实并非如此,更新参数会再次进入非稳定的双峰状态。

本文在理论层面做了研究和解释,从中心极限定理(可以结合道尔顿板实验理解)出发,认为随机事件的叠加进入单峰的正态分布的必要条件之一是各个随机事件事件之间应该是相互独立的。

但是梯度变化以及更新参数的变化并不能特别好的满足独立性这一条件,而这一点恰恰是导致更新参数振荡,loss spike 出现以及 loss 不收敛的重要原因之一。

造成梯度变化不独立的原因:

  • 浅层参数长时间不更新‍

  • batch 太大,后期梯度更新趋于平稳

上述的理论有些晦涩,本文作者可能也了解这一点,之后开始直接点题,结合实验观察抛出了重要现象和结论。

本文作者对 loss spike 出现时模型的前后变化做了仔细拆解,发现下列一系列连续现象的出现导致了 loss spike:

3、突刺解法

本文最后提到了防止 loss spike 出现的一些方法:

另外假设我们能一次性加载所有样本进行训练(实际上不可能做到),是否还会出现 loss spike 的现象。‍

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

C:\ProgramData\miniconda3\envs\torch\python.exe D:\桌面\CosTaylorFormer\train.py Patches shape after stacking: (10249, 21, 21, 200) Patches shape after stacking: (10249, 21, 21, 200) 🚀 开始训练 CosTaylorFormer... Epoch [1/150], Loss: 43.4528, Val OA: 31.25% Epoch [2/150], Loss: 42.4664 Epoch [3/150], Loss: 41.5278 Epoch [4/150], Loss: 40.5920 Epoch [5/150], Loss: 39.6803, Val OA: 1020.83% Epoch [6/150], Loss: 38.8169 Epoch [7/150], Loss: 37.9496 Epoch [8/150], Loss: 37.1224 Epoch [9/150], Loss: 36.3114 Epoch [10/150], Loss: 35.5241, Val OA: 2406.25% Epoch [11/150], Loss: 34.7522 Epoch [12/150], Loss: 34.0080 Epoch [13/150], Loss: 33.2869 Epoch [14/150], Loss: 32.5787 Epoch [15/150], Loss: 31.9104, Val OA: 4145.83% Epoch [16/150], Loss: 31.2306 Epoch [17/150], Loss: 30.6192 Epoch [18/150], Loss: 29.9916 Epoch [19/150], Loss: 29.4030 Epoch [20/150], Loss: 28.8199, Val OA: 4895.83% Epoch [21/150], Loss: 28.2722 Epoch [22/150], Loss: 27.7486 Epoch [23/150], Loss: 27.2229 Epoch [24/150], Loss: 26.7177 Epoch [25/150], Loss: 26.2442, Val OA: 5270.83% Epoch [26/150], Loss: 25.7638 Epoch [27/150], Loss: 25.3142 Epoch [28/150], Loss: 24.8809 Epoch [29/150], Loss: 24.4743 Epoch [30/150], Loss: 24.0535, Val OA: 5468.75% Epoch [31/150], Loss: 23.6630 Epoch [32/150], Loss: 23.2800 Epoch [33/150], Loss: 22.9065 Epoch [34/150], Loss: 22.5728 Epoch [35/150], Loss: 22.2058, Val OA: 5687.50% Epoch [36/150], Loss: 21.8748 Epoch [37/150], Loss: 21.5574 Epoch [38/150], Loss: 21.2399 Epoch [39/150], Loss: 20.9557 Epoch [40/150], Loss: 20.6562, Val OA: 6156.25% Epoch [41/150], Loss: 20.3785 Epoch [42/150], Loss: 20.1045 Epoch [43/150], Loss: 19.8239 Epoch [44/150], Loss: 19.5790 Epoch [45/150], Loss: 19.3215, Val OA: 6593.75% Epoch [46/150], Loss: 19.0662 Epoch [47/150], Loss: 18.8424 Epoch [48/150], Loss: 18.6226 Epoch [49/150], Loss: 18.4087 Epoch [50/150], Loss: 18.1944, Val OA: 6927.08% Epoch [51/150], Loss: 17.9813 Epoch [52/150], Loss: 17.7701 Epoch [53/150], Loss: 17.5636 Epoch [54/150], Loss: 17.3885 Epoch [55/150], Loss: 17.1832, Val OA: 7135.42% Epoch [56/150], Loss: 17.0115 Epoch [57/150], Loss: 16.8442 Epoch [58/150], Loss: 16.6584 Epoch [59/150], Loss: 16.4863 Epoch [60/150], Loss: 16.3243, Val OA: 7427.08% Epoch [61/150], Loss: 16.1752 Epoch [62/150], Loss: 15.9966 Epoch [63/150], Loss: 15.8674 Epoch [64/150], Loss: 15.7077 Epoch [65/150], Loss: 15.5647, Val OA: 7625.00% Epoch [66/150], Loss: 15.4333 Epoch [67/150], Loss: 15.2749 Epoch [68/150], Loss: 15.1445 Epoch [69/150], Loss: 15.0284 Epoch [70/150], Loss: 14.8942, Val OA: 7843.75% Epoch [71/150], Loss: 14.7634 Epoch [72/150], Loss: 14.6415 Epoch [73/150], Loss: 14.5019 Epoch [74/150], Loss: 14.3930 Epoch [75/150], Loss: 14.2826, Val OA: 8062.50% Epoch [76/150], Loss: 14.1672 Epoch [77/150], Loss: 14.0549 Epoch [78/150], Loss: 13.9452 Epoch [79/150], Loss: 13.8205 Epoch [80/150], Loss: 13.7275, Val OA: 8250.00% Epoch [81/150], Loss: 13.6212 Epoch [82/150], Loss: 13.5156 Epoch [83/150], Loss: 13.4269 Epoch [84/150], Loss: 13.3015 Epoch [85/150], Loss: 13.2046, Val OA: 8302.08% Epoch [86/150], Loss: 13.1294 Epoch [87/150], Loss: 13.0532 Epoch [88/150], Loss: 12.9528 Epoch [89/150], Loss: 12.8686 Epoch [90/150], Loss: 12.7616, Val OA: 8364.58% Epoch [91/150], Loss: 12.6967 Epoch [92/150], Loss: 12.5890 Epoch [93/150], Loss: 12.5213 Epoch [94/150], Loss: 12.4448 Epoch [95/150], Loss: 12.3607, Val OA: 8364.58% Epoch [96/150], Loss: 12.2936 Epoch [97/150], Loss: 12.1998 Epoch [98/150], Loss: 12.1368 Epoch [99/150], Loss: 12.0504 Epoch [100/150], Loss: 11.9830, Val OA: 8354.17% Epoch [101/150], Loss: 11.8981 Epoch [102/150], Loss: 11.8172 Epoch [103/150], Loss: 11.7494 Epoch [104/150], Loss: 11.7126 Epoch [105/150], Loss: 11.6203, Val OA: 8406.25% Epoch [106/150], Loss: 11.5700 Epoch [107/150], Loss: 11.4807 Epoch [108/150], Loss: 11.4201 Epoch [109/150], Loss: 11.3679 Epoch [110/150], Loss: 11.3072, Val OA: 8447.92% Epoch [111/150], Loss: 11.2429 Epoch [112/150], Loss: 11.1852 Epoch [113/150], Loss: 11.1204 Epoch [114/150], Loss: 11.0569 Epoch [115/150], Loss: 11.0017, Val OA: 8510.42% Epoch [116/150], Loss: 10.9446 Epoch [117/150], Loss: 10.8780 Epoch [118/150], Loss: 10.8137 Epoch [119/150], Loss: 10.7751 Epoch [120/150], Loss: 10.7354, Val OA: 8541.67% Epoch [121/150], Loss: 10.6473 Epoch [122/150], Loss: 10.6103 Epoch [123/150], Loss: 10.5542 Epoch [124/150], Loss: 10.5102 Epoch [125/150], Loss: 10.4589, Val OA: 8604.17% Epoch [126/150], Loss: 10.3976 Epoch [127/150], Loss: 10.3562 Epoch [128/150], Loss: 10.3088 Epoch [129/150], Loss: 10.2636 Epoch [130/150], Loss: 10.2125, Val OA: 8625.00% Epoch [131/150], Loss: 10.1692 Epoch [132/150], Loss: 10.1154 Epoch [133/150], Loss: 10.0641 Epoch [134/150], Loss: 10.0517 Epoch [135/150], Loss: 9.9831, Val OA: 8666.67% Epoch [136/150], Loss: 9.9327 Epoch [137/150], Loss: 9.8981 Epoch [138/150], Loss: 9.8534 Epoch [139/150], Loss: 9.8104 Epoch [140/150], Loss: 9.7675, Val OA: 8677.08% Epoch [141/150], Loss: 9.7208 Epoch [142/150], Loss: 9.6769 Epoch [143/150], Loss: 9.6388 Epoch [144/150], Loss: 9.5997 Epoch [145/150], Loss: 9.5792, Val OA: 8677.08% Epoch [146/150], Loss: 9.5295 Epoch [147/150], Loss: 9.4855 Epoch [148/150], Loss: 9.4389 Epoch [149/150], Loss: 9.4027 Epoch [150/150], Loss: 9.3762, Val OA: 8708.33% ✅ 最佳验证集 OA: 8708.33%这咋能到8000%?有问题把
最新发布
07-03
<think>好的,用户现在的问题是FNN模型中验证集loss突然增大,从0.008到0.01,想要了解原因分析。首先,我需要回顾之前的对话历史,确保回答的一致性。用户之前提到了训练集和验证集的loss差异,我的回答涵盖了数据分布、过拟合、数据泄露和评估方式差异等因素。现在用户的问题是验证集loss突然增大,虽然幅度不大,但需要详细分析可能的原因。 接下来,我需要参考用户提供的站内引用,但根据用户说明,这些引用可能不是真实需求,需要结合之前的上下文。引用1提到过采样处理不平衡数据,引用2是模型训练结果,引用3是sigmoid函数的说明。这些可能与当前问题关联不大,但需要确认是否有潜在联系。例如,如果验证集数据分布突然变化,或者模型在处理某些类别时表现变差,但用户的问题是关于loss突然上升,而不是准确率,所以可能和数据或训练过程有关。 用户当前的问题是关于验证集loss突然增大,可能的原因包括过拟合、学习率问题、数据分布变化、梯度异常等。需要结合之前的回答中的解决方案,比如数据检查、模型正则化、学习率调整等。同时,要考虑到可能的突发噪声或数据泄露,比如验证集中的某些样本出现异常。 另外,用户提到的loss从0.008到0.01,虽然变化不大,但需要判断是否在正常波动范围内。可能需要建议用户监控多个epoch的趋势,而不仅仅是单次变化。此外,检查验证集是否被正确预处理,比如是否应用了与训练集相同的标准化参数,或者是否有数据增强导致的差异。 还需要考虑模型训练中的其他因素,比如是否在训练过程中修改了超参数,如batch size或优化器设置。引用2中的batch_size=128,可能影响训练稳定性,但用户的问题是关于验证loss的变化,需要确认是否有相关调整。 最后,确保回答结构清晰,分点列出可能的原因和解决方案,并参考之前的建议,如使用早停法、学习率调度器等。同时,生成相关问题,帮助用户深入理解可能的问题点。</think>### FNN模型验证集loss突然增大原因分析及解决方案 #### 一、核心原因分析 1. **过拟合临界点显现** - 当模型开始记忆训练数据中的噪声时,泛化能力下降: $$ \Delta \mathcal{L}_{\text{val}} = \mathcal{L}_{\text{val}}^{(t)} - \mathcal{L}_{\text{val}}^{(t-1)} > 0 $$ - 此时训练loss可能仍在下降但验证loss反向上升[^1] 2. **学习率不适应阶段** - 固定学习率在训练后期容易引发震荡: $$ w_{t+1} = w_t - \eta \nabla \mathcal{L}(w_t) $$ - 当接近最优解时需降低学习率(如从$10^{-3}$调整为$10^{-4}$) 3. **数据分布突变** - 验证集突然出现训练集未覆盖的特征组合(如极端值输入): $$ \exists x_{\text{val}} \notin [\min(X_{\text{train}}), \max(X_{\text{train}})] $$ 4. **梯度异常** - 梯度爆炸/消失导致参数更新异常: $$ ||\nabla_w \mathcal{L}||_2 > 10^3 \ (\text{爆炸}) \quad \text{或} \quad ||\nabla_w \mathcal{L}||_2 < 10^{-5} \ (\text{消失}) $$ #### 二、诊断流程 ```python # 梯度监控示例(PyTorch) for name, param in model.named_parameters(): if param.grad is not None: grad_norm = torch.norm(param.grad).item() print(f"{name}梯度范数: {grad_norm:.4f}") if grad_norm > 1000: # 爆炸阈值 print(">> 检测到梯度爆炸") elif grad_norm < 1e-5: # 消失阈值 print(">> 检测到梯度消失") # 验证集异常样本检测 from scipy import stats z_scores = stats.zscore(X_val) outliers = np.where(np.abs(z_scores) > 3) # 3σ原则 print(f"异常样本索引: {outliers[0]}") ``` #### 三、解决方案 1. **动态学习率调整** ```python # 余弦退火调度器 scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, T_max=50, eta_min=1e-6) # 梯度裁剪 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) ``` 2. **增强数据一致性** ```python # 验证集特征分布检测 import seaborn as sns plt.figure(figsize=(12,6)) plt.subplot(1,2,1) sns.distplot(X_train[:,0], label='Train') sns.distplot(X_val[:,0], label='Validation') plt.title("特征分布对比") ``` 3. **模型稳定性增强** ```python # 添加SWA(随机权重平均) from torch.optim.swa_utils import AveragedModel, SWALR swa_model = AveragedModel(model) swa_scheduler = SWALR(optimizer, swa_lr=1e-6) # 在训练后期启用 if epoch > 50: optimizer.step() swa_model.update_parameters(model) swa_scheduler.step() ``` 4. **早停法优化** ```python # 动态阈值早停 best_loss = 0.008 tolerance = 0.002 # 允许波动范围 if val_loss > best_loss + tolerance: print(f"早停触发: {val_loss:.4f} > {best_loss + tolerance:.4f}") break ``` #### 四、进阶验证方法 1. **敏感性分析** $$ S = \frac{\partial \mathcal{L}_{\text{val}}}{\partial \epsilon} \bigg|_{\epsilon=0} $$ - 通过添加微小扰动$\epsilon$观察loss变化率 2. **特征重要性分析** ```python # 使用SHAP值分析 import shap explainer = shap.DeepExplainer(model, X_train[:100]) shap_values = explainer.shap_values(X_val) shap.summary_plot(shap_values, X_val) ``` 3. **权重动态监测** ```python # 记录权重变化 for name, param in model.named_parameters(): if 'weight' in name: plt.figure() plt.hist(param.detach().cpu().numpy().flatten(), bins=50) plt.title(f"{name}权重分布") ``` --相关问题--: 1. 如何在PyTorch中实现梯度裁剪? 2. 什么是SWA(随机权重平均)技术?如何应用在FNN中? 3. 怎样用SHAP值解释FNN模型的预测结果? 4. 如何设置动态早停法的合理阈值?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值