从‘过拟合’到‘稀疏解’:用Keras代码可视化L1/L2正则化如何塑造你的神经网络
在机器学习实践中,我们常常面临一个两难选择:模型需要足够复杂以捕捉数据中的模式,但又不能过于复杂以至于记住噪声而非规律。这种平衡的艺术,正是正则化技术大显身手的舞台。想象一下,你正在训练一个神经网络来识别手写数字,模型在训练集上表现完美,却在测试集上频频出错——这就是典型的过拟合现象。而L1和L2正则化就像两位风格迥异的雕塑家,用不同的方式修剪着神经网络的权重,使其保持优雅的简洁。
1. 构建可视化实验环境
1.1 创建可交互的二维数据集
为了直观展示正则化的效果,我们首先生成一个螺旋状的可视化数据集。这种非线性可分的数据结构能清晰展现决策边界的变化:
python复制import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
# 生成500个带噪声的半月形数据点
X, y = make_moons(n_samples=500, noise=0.2, random_state=42)
# 可视化数据集
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', edgecolors='k')
plt.title("Binary Classification Dataset")
plt.show()
1.2 设计对比实验的神经网络架构
我们构建一个具有明显过拟合倾向的深层网络,以便观察正则化的约束效果:
python复制from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l1, l2, l1_l2
def build_model(regularizer=None):
model = Sequential([
Dense(128, activation='relu', input_shape=(2,),
kernel_regularizer=regularizer),
