Keras:内核和活动正则化器之间的区别

Posted

技术标签:

【中文标题】Keras:内核和活动正则化器之间的区别【英文标题】:Keras: Difference between Kernel and Activity regularizers 【发布时间】:2017-11-13 17:01:08 【问题描述】:

我注意到 weight_regularizer 在 Keras 中不再可用,取而代之的是 activitykernel 正则化器。 我想知道:

kernelactivity 正则化器之间的主要区别是什么? 我可以用 activity_regularizer 代替 weight_regularizer 吗?

【问题讨论】:

【参考方案1】:

活动正则化器作为网络输出的函数工作,主要用于正则化隐藏单元,而权重正则化器,顾名思义,作用于权重(例如,使它们衰减)。基本上,您可以将正则化损失表示为输出 (activity_regularizer) 或权重 (weight_regularizer) 的函数。

新的kernel_regularizer 替换了weight_regularizer - 尽管从文档中看不是很清楚。

来自kernel_regularizer的定义:

kernel_regularizer:正则化函数应用于 kernel 权重矩阵 (见正则化器)。

还有activity_regularizer

activity_regularizer:正则化函数应用于 层的输出(它的“激活”)。 (见正则化器)。

重要修改:请注意,activity_regularizer 中存在一个仅在 Keras 2.1.4 版本中修复(至少使用 TensorFlow 后端)。实际上,在旧版本中,活动正则化函数应用于层的输入,而不是应用于输出(层的实际激活,如预期的那样)。因此请注意,如果您使用的是旧版本的 Keras(2.1.4 之前),活动正则化可能无法按预期工作。

你可以在GitHub上看到提交

Five months ago François Chollet provided a fix to the activity regularizer, that was then included in Keras 2.1.4

【讨论】:

你完全确定kernel_regularizer替换weight_regularizer吗? 我发现很多使用 kernel_regularizer 的例子,但不是 activity_regularizer。你能评论一下 activity_regularizer 的用例吗? 为什么要正则化隐藏层的输出?是不是出于同样的原因,我们将输入标准化为范围 (-1, 1) 或 (0, 1)。那就是保持对后续层的输入更小以帮助 SGD 过程? @NagabhushanBaddi 看到这个答案:datascience.stackexchange.com/a/15195/32811 @FinncentPrice 我只能假设它曾经在那里,现在已经不存在了【参考方案2】:

这个答案有点晚,但对未来的读者很有用。 所以,正如他们所说,必要性是发明之母。我只在需要的时候才明白。 上面的答案并没有真正说明差异,因为它们最终都会影响权重,那么惩罚权重本身或层的输出有什么区别? 答案是这样的:我遇到过一个网络的权重很小很好的情况,范围在 [-0.3] 到 [+0.3] 之间。 所以,我真的不能惩罚他们,他们没有错。内核正则化器是无用的。但是,该层的输出是巨大的,以 100 为单位。 请记住,层的输入也很小,总是小于 1。但是这些小值与权重以产生大量输出的方式相互作用。在这里,我意识到我需要的是一个活动正则化器,而不是内核正则化器。有了这个,我正在惩罚那些大输出的层,我不在乎权重本身是否很小,我只是想阻止它达到这种状态,因为这会使我的 sigmoid 激活饱和并导致大量其他问题,比如消失梯度和停滞。

【讨论】:

真正直观。 Clipnorm 也有帮助。

以上是关于Keras:内核和活动正则化器之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何在分类损失和正则化器之间取得正确的平衡? [关闭]

带有softmax的活动正则化器?

正则化器导致“ValueError:Shapes must be equal rank”

输出keras中的损失/成本函数

Keras减少过拟合的秘诀——Dropout正则化

Keras 中的正则化策略