Keras:内核和活动正则化器之间的区别
Posted
技术标签:
【中文标题】Keras:内核和活动正则化器之间的区别【英文标题】:Keras: Difference between Kernel and Activity regularizers 【发布时间】:2017-11-13 17:01:08 【问题描述】:我注意到 weight_regularizer 在 Keras 中不再可用,取而代之的是 activity 和 kernel 正则化器。 我想知道:
kernel 和 activity 正则化器之间的主要区别是什么? 我可以用 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:内核和活动正则化器之间的区别的主要内容,如果未能解决你的问题,请参考以下文章