使用 logit 的 Softmax 交叉熵的数学和 Tensorflow 实现之间的区别

数据挖掘 张量流 损失函数
2022-03-10 06:54:54

带有 logits 的 Softmax 交叉熵可以定义为:

ai=ezijezj

l=iyilog(ai)

在哪里l是实际损失。

但是,当您深入研究C++ TensorflowSoftmaxCrossEntropyWithLogits操作实现时,他们使用的确切公式被描述为:

l=jyj((zjmax(z))log(iezimax(z)))

那个部分:zmax(z)- 完全理解 - 它只是有助于避免下溢/溢出的标准化。

但:

  • 他们的实施实际Softmax在哪里?

  • 为什么从每个zj他们减去log(iezimax(z))在乘以之前yj?

注意:有人可能会争辩说,我提供的代码只是 Tensorflow 的CrossEntropyWithLogits操作实现,但实际SoftmaxCrossEntropyWithLogits操作 - 另外仅检查维度并且不执行任何更多计算。

1个回答

据我了解,softmax 函数zi是(谁)给的ai. 然后,只需承担您定义的损失,您就可以准确地返回已实施的公式。然而,正如您所提到的,它的写下方式是为了避免下溢/上溢。

例如,假设您要计算以下内容:

A=log(i=14exp(zi)), 和zi=(1000.5,2000.5,3000.5,4000.5)

显然,如果你只是直接输入公式,你会得到一个下溢错误。相反,如果您通过采用max(zi),同样的公式可以写成:

A=maxi(zi)+log(i=14exp(zimaxi(zi)))

现在的区别在于表达式是“数值稳定的”,我们看到A1000.5

因此,让我们使 softmax 数值稳定: 这是为损失实现的表达式(只需乘以上求和)。

log(ai)=zilog(jezj)=zimaxj(zj)log(jezjmaxj(zj))
yii