我正在使用带有Softmax的交叉熵作为神经网络的损失函数。 我写的交叉熵函数如下:
def CrossEntropy(calculated,desired):
sum=0
n=len(calculated)
for i in range(0,n):
sum+=(desired[i] * math.log(calculated[i])) + ((1-desired[i])* math.log(1-calculated[i]))
crossentropy=(-1)*sum/n
return crossentropy
现在,让我们假设期望的输出为[1,0,0,0] ,并且我们正在针对两个计算出的输出进行测试,即a = [0.1,0.9,0.1,0.1 ] 和 b = [0.1,0.1,0.1,0.9] 。 问题是对于这两个计算出的输出,函数将返回完全相同的交叉熵值。那么,神经网络如何得知哪个输出是正确的?
答案 0 :(得分:0)
这是可以预期的,因为在两种calculated
情况下,您具有数据对称性。
在您的示例中,所需的输出为[1, 0, 0, 0]
。因此,真正的阶级是头等舱。但是,在a
和b
中,您对第一类的预测都是相同的(0.1)。同样,对于其他类别(真实负数-第二,第三和第四类别),您也具有这种数据对称性(对于损失计算,类别2和类别4同样重要)。
a -> 0.9,0.1,0.1
^
| |
V
b -> 0.1,0.1,0.9
因此,您的损失与预期相同。
如果删除此对称性,则会得到不同的交叉熵损失。请参阅以下示例:
# The first two are from your examples.
print CrossEntropy(calculated=[0.1,0.9,0.1,0.1], desired=[1, 0, 0, 0])
print CrossEntropy(calculated=[0.1,0.1,0.1,0.9], desired=[1, 0, 0, 0])
# below we have prediction for the last class as 0.75 thus break the data symmetry.
print CrossEntropy(calculated=[0.1,0.1,0.1,0.75], desired=[1, 0, 0, 0])
# below we have prediction for the true class as 0.45.
print CrossEntropy(calculated=[0.45,0.1,0.1,0.9], desired=[1, 0, 0, 0])
result:
1.20397280433
1.20397280433
0.974900121357
0.827953455132