概念
正则化是一种用于控制模型复杂度并防止过拟合的技术,在机器学习和深度学习中广泛应用。它通过在损失函数中添加一项惩罚项来限制模型的参数,从而使模型更倾向于选择简单的参数配置。
理解
L1 正则化(L1 Regularization):也称为 Lasso 正则化,它在损失函数中添加参数的绝对值之和作为惩罚项。L1 正则化倾向于使某些参数变为零,从而实现特征选择和稀疏性。
L2 正则化(L2 Regularization):也称为 Ridge 正则化,它在损失函数中添加参数的平方和作为惩罚项。L2 正则化对参数的影响相对较小,但可以有效控制参数的大小。
弹性网正则化(Elastic Net Regularization):是 L1 和 L2 正则化的结合,它综合了两者的优势,同时可以应对特征相关性较高的情况。
正则化的数学形式通常表示为:
L1 正则化:Loss = 原始损失函数 + λ * ∑|θi|
L2 正则化:Loss = 原始损失函数 + λ * ∑θi^2
其中,λ 是正则化参数,用于调节正则化的强度,θi 是模型的参数。
在深度学习中,正则化方法通常通过在模型的层中添加正则化项来实现,例如在全连接层中添加 L1 或 L2 正则化。正则化可以帮助模型更好地泛化到未见过的数据,减少过拟合问题。
代码实现
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, regularizers
# 加载数据
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(-1, 28 * 28).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28 * 28).astype('float32') / 255.0
y_train = keras.utils.to_categorical(y_train, num_classes=10)
y_test = keras.utils.to_categorical(y_test, num_classes=10)
# 构建带 L2 正则化的神经网络模型
model = keras.Sequential([
layers.Input(shape=(784,)), # 输入层
layers.Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.01)), # 隐藏层,添加 L2 正则化
layers.Dense(10, activation='softmax') # 输出层
])
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, batch_size=64, epochs=10, validation_split=0.1)
# 评估模型
test_loss, test_accuracy = model.evaluate(x_test, y_test)
print("Test Loss:", test_loss)
print("Test Accuracy:", test_accuracy)