多类别分类的一个trick
探讨一下在多类别分类场景,如翻译、生成、目标检测等场景下,使用log_softmax的效果优于softmax的原因。
假设词典大小为10,一个词的ID为9(即词典的最后一个词),使用交叉熵作为损失函数,我们给出两组向量:
a = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
b = [0.1, 0.1, 0.1, 0.1, 0.1, 0.05, 0.05, 0.1, 0.2, 0.1]
已知交叉熵损失函数定义如下:
l
o
s
s
=
∑
i
=
0
k
y
i
l
o
g
(
p
i
)
loss = \sum^{k}_{i=0}y_ilog(p_i)
loss=∑i=0kyilog(pi)
则根据公式,可分别计算得到:
CE(softmax(a), 9) = 2.3026
CE(log_softmax(a), 9) = 2.3026
CE(softmax(b), 9) = 2.3027
CE(log_softmax(b), 9) = 2.3033
则使用softmax操作的a,b向量在损失上相差-1e-4,而使用log_softmax在损失上相差-7e-4。
发现1:当类别概率预测错误时,CE(log_softmax(),)
会加大错误类别惩罚。
这还不明显,我们现在假设
b = [0, 0, 0, 0, 0, 0.05, 0.05, 0, 0.1, 0.8]
则文章来源:https://www.toymoban.com/news/detail-636298.html
CE(softmax(b), 9) = 2.2084
CE(log_softmax(b), 9) = 1.6365
此时,对比一下softmax操作之后损失之差为9.42e-2,log_softmax损失之差为0.6661。
发现2:使用CE(softmax(),)
即便预测概率分布很接近真实概率分布,在损失上下降也不是很明显(9.42e-2),但使用CE(log_softmax(),)
会有非常显著的损失下降(0.6661,约为softmax的7倍)。文章来源地址https://www.toymoban.com/news/detail-636298.html
到了这里,关于log_softmax比softmax更好?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!