keras categorical_cross_entropy loss 是否考虑了不正确的分类

数据挖掘 喀拉斯 损失函数
2021-09-29 14:38:56

我在这里查看 keras 源,它使用以下方法计算交叉熵损失:

output /= tf.reduce_sum(output,
                        reduction_indices=len(output.get_shape()) - 1,
                        keep_dims=True)
# manual computation of crossentropy
epsilon = _to_tensor(_EPSILON, output.dtype.base_dtype)
output = tf.clip_by_value(output, epsilon, 1. - epsilon)
return - tf.reduce_sum(target * tf.log(output),
                       reduction_indices=len(output.get_shape()) - 1)

target 为真值数据,为0或1,输出为神经网络的输出。

所以看起来损失的形式是

Jy(y)=iyilog(yi)

在哪里 yi 是类的模型输出 i, 和 yi 是真实数据。

这是否意味着错误 yi=0不促成损失?为什么不是公式

Jy(y)=i(yilog(yi)+(1yi)log(1yi))

用过的?

1个回答

这是否意味着错误 yi=0 不促成损失?

那是对的。

然而,连接到错误神经元的各个权重仍然会由于错误而具有梯度,并且这些梯度会受到每个错误分类的大小的影响。这是由于 softmax 的工作原理:

y^i=ezijezj

(在哪里 zi是每个神经元的 pre-softmax 值,也就是logit )。. . 影响一个神经元转换前值的权重会影响所有神经元的转换后值。所以这些权重仍然会被调整以产生更低的zj 权重更新期间错误神经元的值。

为什么不是公式

Jy(y)=i(yilog(yi)+(1yi)log(1yi))

用过的?

目前尚不清楚为什么在选择单个类时,您会关心概率估计如何在不正确的类中分布,或者驱动不正确的值相等有什么好处。例如,如果y=[1,0,0,0] 然后使用建议的公式 Jy(y) 给出〜0.67 y=[0.7,0.1,0.1,0.1] 和 ~0.72 y=[0.73,0.26,0.05,0.05],但可以说第二个结果更好。

但是,在处理非独占类(输出将使用 sigmoid 而不是 softmax 激活)时,您将使用此损失。