为什么在深度网络中可视化特征时,为什么用线性激活替换softmax激活

时间:2017-11-11 23:55:12

标签: deep-learning keras

keras-vis documentation中,它说:

  

为了在最终致密层输出上可视化激活,我们需要   从输出梯度开始,将softmax激活切换为线性   节点将取决于所有其他节点激活

我仍然不明白为什么我们需要切换softmax层以及这个和其他节点激活之间的关系。那么,我们为什么这样做呢?

1 个答案:

答案 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

<强>比较

enter image description here

为什么要避免使用sofmax?

从您引用的句子中:

  

为了显示最终密集层输出上的激活,我们需要将softmax激活切换为线性,因为输出节点的梯度将取决于所有其他节点激活

我们可以假设这种显着性可视化取决于特定输出值的渐变(doc正在调用&#34; node&#34;)。

然后,当您使用softmax时,渐变不仅仅考虑一个输出值,而是将它们全部放在一起。每个类的结果(激活之前)都会影响所有其他结果(激活后)。