对神经网络使用单独的正则化方法是否更好(L2/L1 & Dropout)

数据挖掘 机器学习 神经网络 深度学习 正则化
2022-03-09 23:22:46

我一直在探索不同的正则化方法,并观察到最常见的方法是使用 Dropout Layers 或 L1/L2 正则化。我已经看到了许多关于组合或单独的正则化方法是否有意义的争论。

就我而言,我已经实现/集成了两种方法(组合和单独)。为此,我在实际组合时看到了有希望的结果,因为它帮助我不总是完全过度拟合我的模型,同时总体上提高了我的模型的 r2 分数。

问题:

将 L1/L2 正则化与 Dropout 层结合使用更好,还是单独使用它们更好?

示例代码:

def model_build(x_train):
    # Define Inputs for ANN
    input_layer = Input(shape = (x_train.shape[1],), name = "Input")
    #Create Hidden ANN Layers
    dense_layer = BatchNormalization(name = "Normalization")(input_layer)  
    dense_layer = Dense(128, name = "First_Layer", activation = 'relu', kernel_regularizer=regularizers.l1(0.01))(dense_layer)
    #dense_layer = Dropout(0.08)(dense_layer)
    dense_layer = Dense(128, name = "Second_Layer", activation = 'relu',  kernel_regularizer=regularizers.l1(0.00))(dense_layer)
    #dense_layer = Dropout(0.05)(dense_layer)

    #Apply Output Layers
    output = Dense(1, name = "Output")(dense_layer)

    # Create an Interpretation Model (Accepts the inputs from branch and has single output)
    model = Model(inputs = input_layer, outputs = output)

    # Compile the Model
    model.compile(loss='mse', optimizer = Adam(lr = 0.01), metrics = ['mse'])
    #model.compile(loss='mse', optimizer=AdaBound(lr=0.001, final_lr=0.1), metrics = ['mse'])
1个回答

我不确定是否会有一种正式的方式来显示在哪种情况下哪个是最好的,因为它取决于许多因素,例如您的数据集、您的 ANN 架构 - 简单地尝试不同的组合可能是最好的。

值得注意的是,Dropout * 实际上所做的不仅仅是正则化,它使模型更加健壮,允许它尝试不同的节点进行预测。

至于L1/L2,它只是通过惩罚较高的权重来减少过度拟合。