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

cyb*_*ric 4 deep-learning keras

keras-vis 文档中是这样说的:

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

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

Dan*_*ler 5

当它说 softmax 是唯一依赖于其他输出的时候,那是因为 sofmax 有一个条件,即所有输出总和为 1。

在那里使用术语“节点”是一个非常糟糕的选择,因为 keras 对“节点”有完全不同的定义(在 keras 中,节点是图中的一个点,层在其中进行计算)

定期激活:

所有其他激活单独作用于“每个”输出值。

假设您的输出形状为(None, 3). 每个样本有 3 个输出值。(文档称这些“节点”)。

这些激活将获取 3 个输出中的每一个并单独转换它们。

activatedOutput[:,0] = functionOf(originalOutput[:,0])    
activatedOutput[:,1] = functionOf(originalOutput[:,1])
activatedOutput[:,2] = functionOf(originalOutput[:,2])   
Run Code Online (Sandbox Code Playgroud)

尽管 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
Run Code Online (Sandbox Code Playgroud)

比较:

在此处输入图片说明


为什么要避免 sofmax?

从你引用的句子中:

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

我们可以假设这种显着性可视化取决于特定输出值(文档称之为“节点”)的梯度

然后,当您使用 softmax 时,梯度不是只考虑一个输出值,而是将它们全部考虑在内。每个类的结果(激活前)影响所有其他结果(激活后)。