【问题标题】:Why replacing the softmax activation with linear activation when visualizing the features in deep network为什么在可视化深度网络中的特征时用线性激活代替 softmax 激活
【发布时间】:2018-04-24 22:34:01
【问题描述】:

keras-visdocumentation 中说:

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

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

【问题讨论】:

  • 这本笔记本的最后一节确实描述了原因,甚至显示了如果不这样做会发生什么情况的图片
  • @lejlot 是的,我看到了。但是,我仍然不明白“它是唯一依赖于层中其他节点输出的激活”。

标签: deep-learning keras


【解决方案1】:

当它说 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 时,梯度不是只考虑一个输出值,而是考虑所有的输出值。每个类的结果(激活前)都会影响所有其他结果(激活后)。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2017-10-12
    • 1970-01-01
    • 2018-03-24
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多