了解Keras中的正则化

20

我试图理解为什么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'])

我本以为在Dense层中的正则化参数是不必要的,因此我认为可以将最后一行写得更加简洁:

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

这显然是错误的语法,但我希望有人能为我详细解释一下为什么要这样定义规则化,并且在我使用层级规则化时实际上发生了什么。

我还不明白在什么情况下我会使用三种规则化选项中的每一种或所有选项:(kernel_regularizer, activity_regularizer, bias_regularizer)?


可以考虑查看这里。它可能会给你一些初始的见解。 - Tristhal
1
我发现上面的评论中提供的链接对于这个问题并没有帮助。 - Eduardo Reis
1个回答

26

让我们分解一下你问题中的各个组成部分:

  1. 你对正则化的期望可能符合前馈网络的情况,在这种情况下正则化项应用于整个网络的权重。但是当你混合RNN和CNN等不同类型的网络时,情况并非总是如此,因此Keras选择提供细粒度控制。也许为了方便设置,可以将模型级别的正则化添加到API中以应用于所有权重。

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

  3. 现在在Keras中,你通常可以将正则化应用于三个不同的东西,例如在Dense层中。每个层都有不同的内核(kernel),例如循环等,所以针对该问题,让我们看看您感兴趣的部分,但大体相同的方法适用于所有层:

    1. kernel:这适用于层的实际权重,对于Dense层,它是Wx+b中的W
    2. bias:这是权重的偏置向量,因此你可以为其应用不同的正则化器,例如Wx+b中的b
    3. activity: 应用于输出向量中的y,即y = f(Wx + b)中的y

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