问题在于数据维度,当将一维向量与二维目标同时放入交叉熵损失函数时,梯度出现爆炸。 这是广播机制导致的,pytorch自动将一维向量看作横向量,而非将其与模型输出结果按行联系起来
L2范数规约可将模型参数减小,但当模型期望参数为一个较大的数(1挺大)时,会干扰模型的表现。
损失函数存在log函数计算时,当输入过小,容易逼近负无穷区,此时梯度爆炸,可将输入参数下限调整为1。 调整后,不再出现上述原因导致的梯度爆炸,但当起始参数过小、第一轮循环结果过小时,梯度为零,模型不更新,并在之后的所有循环保持为零。
使用模拟的简单数据(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优化器是否将参数loss除以其长度(batch_size)查看源码后发现,否。 loss函数中多有’reduction’一项可以选择对loss的规约
使用inplace无效,需要重新赋值
避免抖动并加快模型收敛速度 增加前
先学走,再学跑,其中摔跤不断
