我认为深度学习的实践比理论学习更加重要,不仅是因为纸上得来终觉浅,而且还因为模型训练中有很多trick只有在实操中才能学习到。
在毕设过程中,有一次踩坑经历我记忆犹新。
我首先是搭建了一个lstm时序预测模型对股票涨跌进行预测,也就是我的标签是一个二分类,0或1,但是我采用的是回归预测。
针对这个模型,我就有了一个思考:对于二分类问题,采用分类和回归哪个更准确呢?其实它们的差别无非就在于loss function的选择以及model的输出大小上面。即:分类是采用交叉熵loss,model输入需要使用one-hot编码成01,10的形式,model的输出为2维,是对于每个类别的likelyhood(概率),例如【0.87,0.22】。(不一定相加为1,只有通过了softmax函数才会相加为1)。回归采用mse loss,model输出为一个值。
最开始,我认为肯定是采用分类更准确,毕竟分类问题当然要用分类解决,如果采用回归,预测值会在接近1和接近0之间横跳,误差特别大。
所以,我就将我的模型改为二分类。由于pytorch的交叉熵函数参数设定特别严格,target必须是longtensor,pred必须是floattensor。并且他们必须维度全部相同。我首先需要将训练集的标签全部进行编码,还要将model的输出进行各种转换。完成之后,发现精确度下降了约两倍。
后来通过查阅各种资料才发现,原来二分类就是应该采用MSE loss进行回归预测更好,这是因为:MSE loss在0和1附近的梯度比交叉熵损失函数更大,因此可以更快地收敛。
所以,在相同的迭代次数中,二分类采用MSE loss可以得到更好的性能。