为什么 TensorFlow 文档不鼓励使用 softmax 作为最后一层的激活?

人工智能 张量流 目标函数 软最大
2021-10-21 07:57:31

tensorflow 状态的初学者 colab 示例

注意:可以将其tf.nn.softmax作为网络最后一层的激活函数烘焙。虽然这可以使模型输出更直接可解释,但不鼓励这种方法,因为在使用 softmax 输出时,不可能为所有模型提供精确且数值稳定的损失计算。

那么,我的问题是,为什么?不可能提供精确且数值稳定的损失计算是什么意思

2个回答

这是因为梯度计算:自动微分将计算每个模块的梯度,如果你有一个独立crossentropy的模块,那么整体损失将是不稳定的(~1/x,因此对于小的输入值它会发散)而如果你使用一个softmax + crossentropy模块-in-one,然后它变得数值稳定(yp)

DeepMind 2016 年在 UCL 的 Simon Osindero 讲座的幻灯片:

行政长官

CE+Softmax

这也是我偶然发现的一个问题,感谢ted的解释,很有帮助,我会尽量详细说明。我们还是用 DeepMind 的 Simon Osindero 的幻灯片 左边我们看的灰色块只是一个交叉熵操作,输入x(一个向量)可以是前一层的 softmax 输出(不是中性网络的输入),并且y(标量)是交叉熵的结果x. 为了将梯度传播回去,我们需要计算梯度dy/dxi,即pi/xi对于每个元素x. 正如我们所知,softmax 函数将 logits 缩放到 [0,1] 范围内,因此如果在一个训练步骤中,中性网络变得超级自信并预测其中一个概率xi为 0 那么我们在计算中有一个数值问题dy/dxi.

而在另一种情况下,我们采用 logits 并一次计算 softmax 和交叉熵(XentLogits 函数),我们没有这个问题。因为 XentLogits 的导数是dy/dxi=ypi,更详细的推导可以在这里找到。