锥不锉(一)基本训练错误总结

it2026-04-15  1

单层神经网络梯度爆炸

问题在于数据维度,当将一维向量与二维目标同时放入交叉熵损失函数时,梯度出现爆炸。 这是广播机制导致的,pytorch自动将一维向量看作横向量,而非将其与模型输出结果按行联系起来

L2范数归约后模型表现下降n个数量级

L2范数规约可将模型参数减小,但当模型期望参数为一个较大的数(1挺大)时,会干扰模型的表现。

Log损失函数

损失函数存在log函数计算时,当输入过小,容易逼近负无穷区,此时梯度爆炸,可将输入参数下限调整为1。 调整后,不再出现上述原因导致的梯度爆炸,但当起始参数过小、第一轮循环结果过小时,梯度为零,模型不更新,并在之后的所有循环保持为零。

demo数据

使用模拟的简单数据(100x200)时,即使训练轮数较大(cpu跑200就挺大了…),学习率依旧是重要的参数,可以影响结果数个数量级的表现

李代桃僵

R M S E = 1 n ∑ i = 1 n ( log ⁡ ( y i ) − log ⁡ ( y ^ i ) ) 2 . RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^n\left(\log(y_i)-\log(\hat y_i)\right)^2}. RMSE=n1i=1n(log(yi)log(y^i))2 .作为目标函数时,可以使用 M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n}\sum_{i=1}^n(y_i-\hat y_i)^2 MSE=n1i=1n(yiy^i)2替代loss函数,最终使用RMSE输出表现

Pytorch优化器与batch_size

关于Pytorch优化器是否将参数loss除以其长度(batch_size)查看源码后发现,否。 loss函数中多有’reduction’一项可以选择对loss的规约

Pandas 按索引查找并更改

使用inplace无效,需要重新赋值

标准化

避免抖动并加快模型收敛速度 增加前

问题确定

在是否使用pytorch包装区别的两个单隐藏层训练代码写两遍的过程中,我成功地因为不同原因梯度爆炸四次。每次都直接在loss函数左右加输出,然后干瞪眼。VScode突然就没有代码补全了,打开终端也不启动conda了,安装新的代码补全工具也不工作了!原来只是开启后需要加载一段时间,尤其ipynb文件更慢……

优雅

先学走,再学跑,其中摔跤不断

最新回复(0)