浅谈torch中的softmax与CrossEntropy
首先是softmax函数,我认为我在之前的文章
已经较为清楚的阐述,故这里不再重复赘述。
在上文中,我较为清晰的说明了,softmax函数只是为了将我们的预测结果,表达成一种合适的结果,去拟合one-hot编码。
但是对于这种向量标签,我们并不能很好的去定义其损失函数(误差函数)。
我们理所当然应该想到均方误差函数,但实际上,均方误差函数(MSE),对于标量标签确实能起到一个非常好的效果。
而对于一个向量标签,我们选择了一个能实现与之同等效果的CrossEntropy函数,也即交叉熵损失函数。

如上图所示,其中 为正确的标签,而
为预测标签(经过softmax处理后)。
该损失函数在计算上具有非常明显的便利性,即仅考虑正确标签下对应的损失。例如,我们不妨令 = [0, 1, 0],
= [0.3, 0.1, 0.6], 那么此时的
,
即仅考虑到了正确标签下的损失。
而其优越性不仅表现在此处,其导函数更是有非常优异的性质,即:

其中 为未经softmax处理前得到的预测标签。
换言之,
如下图所示:

毫无疑问,y_pred.grad == softmax(y_pred) - one_hot(y),这是成立的。(不成立可能是精度误差导致的,看图中明显成立)。
而观察y_pred.grad,对于y[1]这个样本,我们明显可以看出,其梯度是正在减少前两项的权值,而增大最后一项的权值,以努力实现正确归类至第三类,这是符合我们预期的。
故,CrossEntropy函数确实是在朝着我们的目标去实现。