当它说 softmax 是唯一依赖于其他输出的时候,那是因为 sofmax 的条件是所有输出总和为 1。
在那里使用术语“节点”是一个非常糟糕的选择,因为 keras 对“节点”有完全不同的定义(在 keras 中,节点是图中层进行计算的点)
常规激活:
所有其他激活单独作用于“每个”输出值。
假设您的输出形状为(None, 3)。每个样本有 3 个输出值。 (文档称这些“节点”)。
这些激活将获取 3 个输出中的每一个并单独转换它们。
activatedOutput[:,0] = functionOf(originalOutput[:,0])
activatedOutput[:,1] = functionOf(originalOutput[:,1])
activatedOutput[:,2] = functionOf(originalOutput[:,2])
虽然 keras 使用单个函数一次性完成所有操作,但从数学上讲,它们可以像这样分开。
Softmax 激活:
另一方面,Softmax 将确保 3 个输出值的总和为 1。
这意味着:所有 3 个值都参与了所有 3 个值的转换。我们不能像以前那样将激活分成 3 行:
activatedOutput[:,0] = functionOf(originalOutput[:,0],
originalOutput[:,1],
originalOutput[:,2])
activatedOutput[:,1] = functionOf(originalOutput[:,0],
originalOutput[:,1],
originalOutput[:,2])
activatedOutput[:,2] = functionOf(originalOutput[:,0],
originalOutput[:,1],
originalOutput[:,2])
#where the sum of the 3 outputs will always be 1:
assert activatedOutput.sum(axis=-1) == 1
比较:
为什么要避免使用 sofmax?
从你引用的那句话:
为了可视化最终密集层输出的激活,我们需要将 softmax 激活切换为线性因为输出节点的梯度将取决于所有其他节点的激活。
我们可以假设这种显着性可视化取决于特定输出值(文档称为“节点”)的梯度。
那么,当你使用 softmax 时,梯度不是只考虑一个输出值,而是考虑所有的输出值。每个类的结果(激活前)都会影响所有其他结果(激活后)。