趋近智
当模型过度学习训练数据(包括其中的噪声和特定模式)时,会导致在新数据上的性能不佳。正则化 (regularization)方法旨在通过限制模型的复杂性来解决此问题,促使模型学习更普遍的模式。三种常见方式是:L1、L2 和 Dropout。
L1和L2正则化通过在模型的损失函数 (loss function)中加入一个惩罚项来起作用。此惩罚项依据网络权重的数值大小()。思路是,权重过大的模型通常更复杂,且易于过拟合 (overfitting),因为大权重可能导致输入微小变化时输出产生剧烈变化。通过惩罚大权重,我们鼓励模型找到更简洁且泛化能力更好的解决方案。
修改后的损失函数如下所示:
这里, (lambda) 是正则化强度超参数 (parameter) (hyperparameter)。较大的 会施加更强的惩罚。
L1正则化添加的惩罚项与权重的绝对值成正比:
L1正则化一个显著效果是它促使稀疏性。它倾向于将一些权重推至精确的零,通过消除不重要输入的影响,有效地执行一种自动特征选择。
L2正则化添加的惩罚项与权重的平方成正比:
L2正则化在深度学习 (deep learning)中通常比L1更常见。它促使权重小且分布,防止任何单个权重变得过大,但它通常不会强制权重变为零。这通常被称为“权重衰减”,因为在梯度下降 (gradient descent)过程中,它会添加一个将权重推向零的项。
你可以使用kernel_regularizer、bias_regularizer和activity_regularizer参数轻松地为Keras层添加L1或L2正则化惩罚。kernel_regularizer对层的主要权重(即核)进行惩罚,而bias_regularizer对偏置 (bias)项进行惩罚。activity_regularizer对层的输出(激活)进行惩罚,这不太常见。
以下是在Dense层中添加L2正则化的示例:
import os
import torch # 导入torch,以备他处需要时确认其可用性
# 将Keras后端设置为PyTorch(必须在导入Keras之前完成)
os.environ["KERAS_BACKEND"] = "torch"
# 现在导入Keras组件
import keras
from keras import layers
from keras import regularizers
# L2正则化示例
model = keras.Sequential([
layers.Dense(
64,
activation='relu',
kernel_regularizer=regularizers.l2(0.001), # 对权重应用L2惩罚
input_shape=(784,)
),
layers.Dense(
10,
activation='softmax',
kernel_regularizer=regularizers.l2(0.001) # 这里也应用L2惩罚
)])
# 你也可以使用L1或L1/L2组合
# regularizers.l1(0.01)
# regularizers.l1_l2(l1=0.01, l2=0.001)
# 照常编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
# --- 可选:验证后端并运行快速测试 ---
print(f"\nKeras后端已确认: {keras.backend.backend()}")
import numpy as np
print("正在使用虚拟数据运行快速测试步骤...")
(x_test, y_test) = (np.random.rand(10, 784).astype(np.float32),
keras.utils.to_categorical(np.random.randint(10, size=10), num_classes=10))
loss, acc = model.evaluate(x_test, y_test, verbose=0)
print(f"测试评估完成 (损失: {loss:.4f}, 准确度: {acc:.4f})")
传递给regularizers.l1()、regularizers.l2()或regularizers.l1_l2()的值是正则化因子 。选择合适的值通常需要尝试,并且通常通过超参数调整来确定。值通常在0.1到0.0001之间。
Dropout是一种不同但非常有效的正则化 (regularization)方法,专为神经网络 (neural network)开发。Dropout不是修改损失函数 (loss function),而是在训练期间修改网络本身。
在每个训练步骤中,对于应用了Dropout的给定层,其一部分输出单元(神经元)会被随机地暂时“舍弃”——这意味着它们的输出被设为零。要舍弃的单元比例由dropout率决定,这是一个通常设置为0.1到0.5之间的超参数 (parameter) (hyperparameter)。
Dropout示意图。在不同的训练步骤中,不同的神经元(显示为灰色虚线)会被随机停用。
为什么这样做有效?
在推断阶段(评估或预测时),dropout被关闭,所有神经元都被使用。然而,为了弥补比训练时更多的神经元处于活跃状态这一事实,dropout层的输出通常会按等于dropout率的因子进行缩放(或者等效地,训练期间激活值被放大——这被称为“倒置dropout”,是常见的实现方式)。
Dropout在Keras中通过Dropout层实现。你可以在要正则化其输出的层之间插入它。
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(128, activation='relu', input_shape=(784,)),
layers.Dropout(0.3), # 应用30%的dropout率
layers.Dense(64, activation='relu'),
layers.Dropout(0.3), # 再次应用dropout
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
Dropout层的参数是dropout率(要舍弃的单元比例)。一种常见做法是在激活函数 (activation function)之后应用dropout,通常在网络中更密集的区域。最佳比率通常需要调整。
结合使用不同方法也很常见,例如在同一网络中同时使用L2权重 (weight)正则化和Dropout。正则化强度(L1/L2的 ,dropout率)是重要的超参数 (parameter) (hyperparameter),通常需要根据验证集性能进行调整。
通过应用这些方法,你可以显著减少过拟合 (overfitting),并构建在新数据上泛化能力更好的模型,这是机器学习 (machine learning)中的一个重要目标。
这部分内容有帮助吗?
Dropout层、其用法和参数,用于实现Dropout正则化。© 2026 ApX Machine LearningAI伦理与透明度•