在keras-vis
documentation中,它说:
为了在最终致密层输出上可视化激活,我们需要 从输出梯度开始,将softmax激活切换为线性 节点将取决于所有其他节点激活
我仍然不明白为什么我们需要切换softmax层以及这个和其他节点激活之间的关系。那么,我们为什么这样做呢?
答案 0 :(得分:4)
当说softmax是唯一取决于其他输出时,因为sofmax的条件是所有输出总和为1.
使用术语"节点"这是一个非常糟糕的选择,因为keras对" node"的定义完全不同。 (在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激活切换为线性,因为输出节点的梯度将取决于所有其他节点激活。
我们可以假设这种显着性可视化取决于特定输出值的渐变(doc正在调用&#34; node&#34;)。
然后,当您使用softmax时,渐变不仅仅考虑一个输出值,而是将它们全部放在一起。每个类的结果(激活之前)都会影响所有其他结果(激活后)。