我想使用Pytorch训练多分类器。
遵循Pytorch官方文档,该文档显示了如何nn.CrossEntropyLoss()
在最后一层type之后使用a nn.Linear(84, 10)
。
但是,我记得这是Softmax所做的。
这让我感到困惑。
我在Pytorch论坛上找到了该线程,该线程可能回答了所有这些问题,但是我无法将其编译为有效且可读的Pytorch代码。
我假定的答案:
我认为,至少从实际角度出发,了解softmax和交叉熵非常重要。一旦掌握了这两个概念,就应该清楚如何在ML上下文中“正确”使用它们。
交叉熵是比较两个概率分布的函数。从实践的角度来看,进入交叉熵的正式动机可能不值得,尽管如果您有兴趣的话,我会推荐Cover和Thomas撰写的《信息论元素》作为入门文章。这个概念很早就引入了(我相信第2章)。这是我在研究生院使用的介绍性文字,我认为它做得很好(当然,我也有一位出色的老师)。
要注意的关键是,交叉熵是一个函数,它以两个概率分布(q和p)作为输入,并在q和p相等时返回最小的值。q代表估计分布,p代表真实分布。
在ML分类的情况下,我们知道训练数据的实际标签,因此,真实/目标分布p的真实标签概率为1,其他位置为0,即p是一个热向量。
另一方面,估计分布(模型的输出)q通常包含一些不确定性,因此q中任何类别的概率将在0和1之间。通过训练系统以最小化交叉熵,我们告诉系统我们希望它尝试使估计的分布尽可能接近真实分布。因此,您的模型认为最可能的类别是与q的最大值对应的类别。
同样,有一些复杂的统计方法可以解释softmax,我们在这里将不讨论。从实践的角度来看,关键是softmax是一个函数,该函数将无界值列表作为输入,并在保持相对顺序的情况下输出有效的概率质量函数。强调有关相对顺序的第二点很重要。这意味着softmax输入中的最大元素对应于softmax输出中的最大元素。
考虑一个被训练为最小化交叉熵的softmax激活模型。在这种情况下,在softmax之前,模型的目标是为正确的标签生成尽可能高的值,为不正确的标签生成尽可能低的值。
PyTorch中CrossEntropyLoss的定义是softmax和交叉熵的组合。特别
CrossEntropyLoss(x,y):= H(one_hot(y),softmax(x))
请注意,one_hot是一个采用索引y并将其扩展为单热向量的函数。
等效地,您可以将CrossEntropyLoss公式化为LogSoftmax和负对数可能性损失(即PyTorch中的NLLLoss)
LogSoftmax(x):= ln(softmax(x))
CrossEntropyLoss(x,y):= NLLLoss(LogSoftmax(x),y)
由于softmax的幂运算,与分阶段计算相比,有些计算“技巧”使直接使用CrossEntropyLoss更加稳定(更准确,更不可能获得NaN)。
根据以上讨论,您问题的答案是
就像医生说的那样。
将softmax应用于网络的输出以推断每个类的概率。如果目标只是找到相对排序或最高概率类,则只需将argsort或argmax直接应用于输出(因为softmax保持相对排序)。
通常,出于上述稳定性原因,您不想训练输出软最大输出的网络。
就是说,如果由于某种原因绝对需要,您将获取输出日志并将其提供给NLLLoss
criterion = nn.NLLLoss()
...
x = model(data) # assuming the output of the model is softmax activated
loss = criterion(torch.log(x), y)
从数学上讲,这等效于对不使用softmax激活的模型使用CrossEntropyLoss 。
criterion = nn.CrossEntropyLoss()
...
x = model(data) # assuming the output of the model is NOT softmax activated
loss = criterion(x, y)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句