单层神经网络梯度爆炸
问题在于数据维度,当将一维向量与二维目标同时放入交叉熵损失函数时,梯度出现爆炸。
这是广播机制导致的,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=1∑n(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=1∑n(yi−y^i)2替代loss函数,最终使用RMSE输出表现
Pytorch优化器与batch_size
关于Pytorch优化器是否将参数loss除以其长度(batch_size)查看源码后发现,否。
loss函数中多有’reduction’一项可以选择对loss的规约
Pandas 按索引查找并更改
使用inplace无效,需要重新赋值
标准化
避免抖动并加快模型收敛速度
增加前
问题确定
- 在是否使用pytorch包装区别的两个单隐藏层训练代码写两遍的过程中,我成功地因为不同原因梯度爆炸四次。每次都直接在loss函数左右加输出,然后干瞪眼。
- VScode突然就没有代码补全了,打开终端也不启动conda了,安装新的代码补全工具也不工作了!原来只是开启后需要加载一段时间,尤其ipynb文件更慢……
优雅
先学走,再学跑,其中摔跤不断