10 多层感知机 + 代码实现 - 动手学深度学习v2

简单谈谈softmax函数。
在我看来,因为我们是要去拟合δ=[δ1, δ2, ..., δn],当然,我们理想的label是一个one hot编码,即类似于[0, 1, 0, ..., 0],其中仅有一个1。
我们当然是可以直接将预测结果的tensor去找到最大的索引作为其的分类。也即,如果预测结果为[0.9, 0.2, -0.1],随便编的一组数据,求和可以不为1,为任意数。其中很显然第一个索引值最大,我们就可以将其分类为第一类,但是值得一提的是,这样我们将无法很好的计算loss,因为这样的结果值具有太大的不确定性,他可以是1000,也可以是-1000000000,这将会对我们的loss造成很大的不便。
诚然,我们也可以选择argmax函数,去找到最大索引,然后将预测结果改为[1, 0, 0],但是这样仍然会造成一定的loss丢失,这对我们的梯度修改是不友好的。
于是我们这里引入了softmax函数。注意到softmax的解析式为 softmax(xi) = exp(xi) / ∑exp(xi),例如在上例中的,我们预测结果为
ans=[0.9, 0.2, -0.1],这样我们在进行exp(ans)之后会得到 res = [2.46, 1.22, 0.90],之后再直接调用 res / res.sum(),就可以轻松投影到目标区间,也即 [0.53, 0.26, 0.19],结果求和可能不为1啊,因为我进行了一定的截尾。通过这种行为,所有的值被约束在了0-1之间,loss的计算也便得更加便捷。
关于softmax与交叉熵
其实讲到这里应该还算明了了。在上一章节中就已经提到,我们softmax只是简单的处理了一下我们的预测结果,而并不是损失函数,甚至可以说是和损失函数没有任何关系。softmax,只是为了更加方便的去计算loss,而交叉熵CrossEntropy,才是我们的损失函数。
写于2023.2.27 17:31
如有错误,还望指正!