kernel_constraint=max_norm(3)是什么意思?

15
在我正在工作的教程中(下面给出链接),作者将基线神经网络结构概述如下:
卷积输入层,32个特征映射,大小为3×3,使用整流器激活函数和最大规范权重约束设置为3。
model.add(Conv2D(32, (3, 3), input_shape=(3, 32, 32), padding='same', activation='relu', kernel_constraint=maxnorm(3)))

什么是 max norm 的权重约束,它对 Conv 层有什么影响?(我们正在使用 Keras。)

https://machinelearningmastery.com/object-recognition-convolutional-neural-networks-keras-deep-learning-library/

谢谢!

1个回答

28

“max_norm”这个权重限制是什么意思?

maxnorm(m)会检查你的权重矩阵的L2范数是否超过了设定值m,如果超过了,那么就将整个权重矩阵按比例缩小,使得其L2范数等于m

你可以在 class MaxNorm(Constraint) 中的Keras代码TensorFlow代码中查找相关信息。

def __call__(self, w):
    norms = K.sqrt(K.sum(K.square(w), axis=self.axis, keepdims=True))
    desired = K.clip(norms, 0, self.max_value)
    w *= (desired / (K.epsilon() + norms))
    return w
此外,maxnorm 还有一个 axis 参数,计算沿着哪个轴的范数。在您的示例中,您没有指定轴,因此计算整个权重矩阵的范数。例如,如果您想约束每个卷积滤波器的范数,假设您使用 tf 维度排序,则权重矩阵将具有形状 (rows, cols, input_depth, output_depth)。在 axis=[0, 1, 2] 上计算范数会将每个过滤器约束为给定的范数。

为什么要这样做?

直接约束权重矩阵是另一种正则化方法。如果使用简单的 L2 正则化项,则会通过损失函数惩罚高权重。使用此约束,您可以直接进行正则化。正如在 keras 代码中链接的那样,这似乎与 dropout 层的组合特别有效。更多信息请参见本文中的第5.1章节。


1
这取决于你计划做什么。使用通道最后维度排序的卷积层,axis = [0, 1, 2] 规范化每个卷积滤波器,因为权重矩阵的 [:, : , :, i] 是第 i 个滤波器。仅使用 [0, 1] 约束每个平面的滤波器权重,例如在第一层中,R、G 和 B 通道的权重将分别被规范化。 - McLawrence
你能给我一些提示,如何仅将约束应用于权重矩阵的一部分?例如,仅使用keras对奇数列向量w_ij进行约束? - Cecilia
@Cecilia。如果实现仍然相同,我认为这是不可能的。您需要实现自己的版本,在其中以不同的方式计算范数。 - McLawrence
@McLawrence,你提供的链接中的作者使用了max_norm约束,同时强调C常数是一个需要在验证集上进行调整的超参数。你能否给出一个不会影响模型表现的C常数值,就像relu激活函数一样? - bit_scientist
回答上述问题,我评论自己,论文的附录A.3指出常数c的范围为3到4。 - bit_scientist
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接