首页 > 解决方案 > 理解 Keras 中的正则化

问题描述

我试图理解为什么 Keras 中的正则化语法看起来是这样的。

粗略地说,正则化是通过向与模型权重的某些函数成比例的损失函数添加惩罚项来减少过度拟合的方法。因此,我希望将正则化定义为模型损失函数规范的一部分。

然而,在 Keras 中,正则化是在每层的基础上定义的。例如,考虑这个正则化 DNN 模型:

input = Input(name='the_input', shape=(None, input_shape))
x = Dense(units = 250, activation='tanh', name='dense_1', kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
x = Dense(units = 28, name='dense_2',kernel_regularizer=l2, bias_regularizer=l2, activity_regularizer=l2)(x)
y_pred = Activation('softmax', name='softmax')(x)
mymodel= Model(inputs=input, outputs=y_pred)
mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

我原以为不需要密集层中的正则化参数,我可以把最后一行写得更像:

mymodel.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'], regularization='l2')

这显然是错误的语法,但我希望有人能为我详细说明为什么以这种方式定义正则化以及当我使用层级正则化时实际发生了什么。

我不明白的另一件事是在什么情况下我会使用三个正则化选项中的每一个或全部:(kernel_regularizer, activity_regularizer, bias_regularizer)

标签: pythonkeras

解决方案


让我们分解您问题的组成部分:

  1. 您对正则化的期望可能与前馈网络一致,是的,惩罚项应用于整个网络的权重。但是,当您将 RNN 与 CNN 等混合使用时,情况不一定如此,因此 Keras 选择提供细粒度控制。也许为了便于设置,可以将模型级别的正则化添加到所有权重的 API。

  2. 当您使用层正则化时,基Layer类实际上正则化项添加到损失中,这在训练时会惩罚相应层的权重等。

  3. 现在在 Keras 中,您通常可以将正则化应用于 3 种不同的事物,就像在Dense层中一样。每个层都有不同的内核,例如循环等,所以对于这个问题,让我们看看您感兴趣的那些,但大致相同的内容适用于所有层:

    1. kernel:这适用于层的实际权重,在 Dense 中它是Wx +bW。
    2. 偏差:这是权重的偏差向量,因此您可以为其应用不同的正则化器,即Wx+b的b 。
    3. activity:应用于输出向量,y in y = f(Wx + b)

推荐阅读