什么是 maxnorm 约束?它在卷积神经网络中有何用处?

机器算法验证 神经网络 正则化 卷积神经网络 优化
2022-01-27 15:36:46

这是一个使用它的 keras 代码示例:

from keras.constraints import max_norm

model.add(Convolution2D(32, 3, 3, input_shape=(3, 32, 32), 
                        border_mode='same', activation='relu', kernel_constraint=max_norm(3)))
2个回答

来自http://cs231n.github.io/neural-networks-2/#reg

最大范数约束。另一种形式的正则化是对每个神经元的权重向量的大小强制一个绝对上限,并使用投影梯度下降来强制约束。在实践中,这对应于正常执行参数更新,然后通过钳位权重向量来执行约束w每个神经元满足w2<c.的典型值是 3 或 4 的数量级。有些人报告使用这种形式的正则化时有所改进。它的一个吸引人的特性是,即使学习率设置得太高,网络也不会“爆炸”,因为更新总是有界的。c

我发现McLawrence另一个问题中的回答非常有帮助。转载如下:

权重约束有max_norm什么作用?

maxnorm(m)如果您的权重的 L2-Norm 超过m,则将整个权重矩阵缩放一个因子,将规范降低到m正如您可以在keras 代码中找到的那样class MaxNorm(Constraint)

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 章