使用 kernel_constraint NonNeg 时,线性激活和 ReLU 激活的行为是否相同?

Do linear activation and ReLU activation behave the same when using kernel_constraint NonNeg?

最近,我在 Keras 中使用内核约束来限制训练期间的梯度。对于我的用例(回归),我发现 NonNeg 约束非常有用。

根据我的理解,NonNeg-class 将梯度限制为仅正值(大概使用绝对梯度)。因此,我想知道在添加 NonNeg 约束时,使用线性激活 layers.Dense(1, activation = "linear", kernel_constraint = "non_neg") 激活层与 ReLU 激活 layers.Dense(1, activation = "relu", kernel_constraint = "non_neg") 激活层之间是否存在任何差异。你有什么见解吗?

一个kernel_constraint影响层的权重。它通过在每个梯度步骤后将约束函数应用于权重来工作。 NonNeg,尤其是将所有负权重设置为 0( 使用绝对值)。因此:

  • 它根本不影响梯度,除非权重 >= 0 会对梯度产生任何影响。
  • 它实际上也不“尊重”梯度——如果 gradient-based 优化将权重推到 < 0 的值,约束将直接将其设置为 0。
  • 它与 ReLU 激活不同,因为 relu 将 activations 设置为 >= 0,这再次完全不同于具有权重 and/or 梯度 >= 0.

你可以说的一件事是:如果你的输入都是 >= 0,并且你通过 kernel_constraint=NoneNeg 将权重限制为 >= 0,那么层输出必然是 >= 0 并且relu 确实没有效果,所以你可以使用线性激活。

这取决于层的输入。 (注意:这个约束只影响图层的“权重”,不影响梯度)

因此,如果您“只有正权重”,将会发生以下情况:

  • 如果输入为正:

    • 输出将为正(正 x 正 = 正)
    • ReLU 永远不会做它的工作,它将等同于线性
  • 如果输入可以为负数:

    • 输出可以为负(正 x 负 = 负)
    • ReLU 会完成它的工作,它与线性不同

所以,如果你像这样堆叠两层:

  • 具有“ReLU”或“sigmoid”的第一层(仅正输出)
  • 具有 NonNeg 约束的下一层

第二层总是有积极的结果,因此 ReLU 不会像第二层那样工作。

如果用 NonNeg 和 ReLU 堆叠整个模型,只有第一层会正确利用 ReLU(并且仅当输入数据可以为负数时)。


好奇这个内核约束是如何工作的:

  • Keras 计算梯度
  • Keras 为权重添加梯度
  • 如果这之后权重变成负数
    • 使权重为 0

当然,梯度仍然可以是负数。如果梯度只能是正的,最终你的权重会增长到无穷大。内核约束不会以任何方式改变梯度。