【机器学习】一文彻底搞懂正则化(Regularization)

摘要: 本文旨在用最通俗易懂的语言,全面解析机器学习中至关重要的一个概念——正则化(Regularization)。我们将从“过拟合”这一常见问题入手,探讨为什么需要正则化,然后深入剖析两种最主流的正则化技术:L1 正则化 (Lasso) 和 L2 正则化 (Ridge),并通过直观的数学解释和 Python 代码实例,让您彻底明白它们的原理、区别和应用场景。

关键词: 机器学习, 正则化, 过拟合, L1, L2, Lasso, Ridge

1 问题的根源:过拟合”(Overfitting)

想象一下,你正在教一个机器人学生学习识别猫。你只给了它 10 张猫的照片作为“训练数据”。这个机器人非常“聪明”,它把这 10 张照片的所有细节,包括背景里的花瓶、墙上的纹路、甚至是照片上的噪点都背得滚瓜烂熟。

结果就是,当你用这 10 张照片考它时,它能达到 100% 的准确率。但当你拿一张新的、它从未见过的猫的照片(测试数据)给它看时,它就傻眼了,因为它发现新照片里的背景和细节跟它背下来的完全不一样。

这就是 过拟合 (Overfitting)

过拟合:指模型在训练集上表现优异,但在未见过的数据(测试集)上表现糟糕的现象。其本质是模型过于复杂,把训练数据中的噪声和偶然特征也当作了普适规律来学习。

如下图所示,从左到右依次是在曲线拟合问题中的欠拟合、较好的拟合与过拟合的现象。在最右边的图中,黄色的线很努力地去穿过每一个训练数据点,但它显然不是一个好的模型,因为它波动极大,无法预测新数据点。中间的图中的黄色的线虽然没有完美穿过所有点,但它捕捉到了数据的整体趋势,泛化能力更强。

曲线拟合问题中的欠拟合、较好的拟合与过拟合现象

在分类问题等其他问题中,也存在类似的欠拟合、较好的拟合与过拟合现象。
分类问题中的欠拟合、较好的拟合与过拟合现象

(此处可以参见:一篇文章完全搞懂正则化(Regularization)

2 什么是正则化 (Regularization)?

为了解决过拟合问题,我们需要限制模型的复杂程度,让它不要去学习那些无关紧要的细节。这种“约束”或“惩罚”机制,就是 正则化 (Regularization)

正则化的核心思想是:在模型的损失函数(Loss Function)中,加入一个代表模型复杂度的惩罚项(Penalty Term)

我们知道,模型的训练目标是最小化损失函数,比如均方误差(MSE)。
原始损失函数: L o r i g i n a l = Error(y,  y ˆ ) L_{original} = \text{Error(y, ŷ)} Loriginal=Error(y, yˆ)

加入了正则化之后,新的损失函数变为:
L n e w = L o r i g i n a l + Penalty L_{new} = L_{original} + \text{Penalty} Lnew=Loriginal+Penalty

这个惩罚项会对模型中过大的参数(权重)进行惩罚。如果一个模型的参数(权重)普遍很大,意味着模型可能非常复杂,每个特征的微小变动都可能对结果产生巨大影响,这正是过拟合的特征。

通过最小化新的损失函数,我们不仅要让模型更好地拟合数据(最小化 L o r i g i n a l L_{original} Loriginal),还要让模型的参数尽可能地小(最小化 Penalty \text{Penalty} Penalty),从而在两者之间取得一个平衡。

3 两种常见的正则化方法:L2 正则化 (Ridge) vs L1 正则化 (Lasso)

最常见的两种正则化方法就是 L1 和 L2 正则化,它们的区别在于惩罚项的计算方式不同。

3.1 L2 正则化 (岭回归)

L2 正则化使用的惩罚项是所有参数(权重)平方和的倍数。对于一个模型的权重向量 w = ( w 1 , w 2 , . . . , w n ) w = (w_1, w_2, ..., w_n) w=(w1,w2,...,wn),其 L2 惩罚项如下:

Penalty L 2 = λ ∑ i = 1 n w i 2 \text{Penalty}_{L2} = \lambda \sum_{i=1}^{n} w_i^2 PenaltyL2=λi=1nwi2

这里的 l a m b d a \\lambda lambda(Lambda)是一个超参数,用来控制正则化的强度。 l a m b d a \\lambda lambda 越大,惩罚越重,模型参数会被压缩得越小。

特点

  • 平滑权重:L2 正则化倾向于让所有参数都变小,但不会变为绝对的 0。它会让权重分布更加平滑,防止任何一个特征的权重变得过大。
  • 应用广泛:因其稳定和高效的特性,L2 正z则化是防止过拟合最常用的手段之一。在線性回歸中,使用L2 正則化的模型被稱為岭回归 (Ridge Regression)

3.2 L1 正则化 (Lasso回归)

L1 正则化使用的惩罚项是所有参数(权重)绝对值之和的倍数。

Penalty L 1 = λ ∑ i = 1 n ∣ w i ∣ \text{Penalty}_{L1} = \lambda \sum_{i=1}^{n} |w_i| PenaltyL1=λi=1nwi

特点

  • 稀疏性与特征选择:L1 正则化最显著的特点是它能够产生稀疏解 (Sparse Solution)。也就是说,它会将一些不那么重要的特征的权重直接压缩到精确的 0
  • 自动特征选择:由于L1能将某些特征的权重变为0,这等同于从模型中剔除了这些特征。因此,L1 正则化可以被看作是一种自动进行特征选择的方法,非常适用于特征数量庞大的场景。
  • 在线性回归中,使用L1 正则化的模型被称为 Lasso 回归 (Least Absolute Shrinkage and Selection Operator)

4 L1正则化 vs L2正则化:一张图看懂核心区别

我们可以用一张经典的图来直观理解为什么 L1 能产生稀疏解而 L2 不能。

如下图所示,把参数空间 ( w 1 , w 2 ) (w_1,w_2) (w1,w2)看作一个平面,蓝色的圆是原始损失函数 L o r i g i n a l L_{original} Loriginal 的等高线(这是一个平方损失函数),中心点是该损失函数的最小值;而黄色的区域是正则化项的“约束边界”。

L1与L2正则化的损失函数修改后的图示

  • L2 的约束边界是一个圆形 ∑ w i 2 ≤ C \sum w_i^2 \le C wi2C)。等高线与圆形相切的点,很难恰好落在坐标轴上。这意味着 w 1 w_1 w1 w 2 w_2 w2 通常都不会是 0。
  • L1 的约束边界是一个菱形 ∑ ∣ w i ∣ ≤ C \sum |w_i| \le C wiC)。由于菱形有尖锐的“角”,等高线与它相切的点,有很大概率会落在角上,也就是坐标轴上。一旦落在坐标轴上,就意味着某个权重(如 w 1 w_1 w1)为 0。
特性 L1 正则化 (Lasso) L2 正则化 (Ridge)
惩罚项 权重的绝对值之和 权重的平方和
权重影响 使不重要的权重变为精确的0 使所有权重都趋近于0,但很难为0
模型稀疏性 (产生稀疏模型)
主要作用 特征选择和防止过拟合 防止过拟合
数学性质 不易求解(绝对值不易求导) 容易求解(平方项易求导)
    1. 什么是稀疏模型 (Sparse Model)?
      稀疏模型指的是一个模型中,大部分的参数(或称权重、系数)都为零

想象一个线性模型,它的预测公式是: y = w 1 x 1 + w 2 x 2 + w 3 x 3 + ⋯ + w 100 x 100 + b y = w_1 x_1 + w_2 x_2 + w_3 x_3 + \dots + w_{100} x_{100} + b y=w1x1+w2x2+w3x3++w100x100+b 这里有100个特征( x 1 x_1 x1 x 100 x_{100} x100)和它们对应的100个权重( w 1 w_1 w1 w 100 w_{100} w100)。
一个非稀疏(稠密)模型,可能所有100个权重都是非零值,比如 w 1 = 0.1 , w 2 = − 0.05 , … , w 100 = 0.23 w_1=0.1, w_2=-0.05, \dots, w_{100}=0.23 w1=0.1,w2=0.05,,w100=0.23
一个稀疏模型,可能其中90个权重都变成了精确的零,只有10个权重有值。

稀疏模型的好处:

自动特征选择:如果一个特征对应的权重 w i w_i wi 为零,就意味着这个特征 x i x_i xi 对模型的最终预测没有任何贡献,相当于被模型自动“过滤”掉了。这在处理有成千上万个特征的数据集时非常有用。
模型更简单:权重为零的特征可以被忽略,使得模型更简单、计算更快、更容易解释。
可能减少过拟合:通过剔除不重要的特征,模型只关注于核心特征,有助于提高在未知数据上的泛化能力。

    1. 为什么 L1 正则化容易产生稀疏模型?
      这背后最直观的解释来自于几何图形优化过程

(1)从图形的角度看:
我们知道,正则化的目标是最小化“原始损失 + 惩罚项”。 Minimize ( Loss o r i g i n a l + λ ⋅ Penalty ) \text{Minimize} \left( \text{Loss}_{original} + \lambda \cdot \text{Penalty} \right) Minimize(Lossoriginal+λPenalty)

L1 惩罚项: λ ∑ ∣ w i ∣ \lambda \sum |w_i| λwi
L2 惩罚项: λ ∑ w i 2 \lambda \sum w_i^2 λwi2

现在,我们把这个问题想象成一个寻宝游戏。假设只有两个权重 w 1 w_1 w1 w 2 w_2 w2

  1. 宝藏地点(原始损失): 原始损失函数的最小值点,就像地图上的宝藏位置。在下图中,宝藏就在那些同心椭圆(等高线)的中心( β ^ \hat{\beta} β^ 点)。模型在不受任何限制时,会直奔这个中心点。
  2. 规则区域(惩罚项): 正则化给模型设定了一个“活动范围”,这个范围由惩罚项决定。
    • L1 正则化的约束边界是 ∣ w 1 ∣ + ∣ w 2 ∣ ≤ C |w_1| + |w_2| ≤ C w1+w2C,它在二维平面上形成一个菱形(或旋转的正方形)。
    • L2 正则化的约束边界是 w 1 2 + w 2 2 ≤ C w_1^2 + w_2^2 ≤ C w12+w22C,它形成一个圆形
  3. 寻找最佳平衡点: 模型的最终解,是椭圆等高线惩罚项的边界首次相交的那个点。
  • L1 正则化 (菱形)
    由于菱形有尖锐的角,并且这些角恰好位于坐标轴上
    当损失函数的椭圆从中心点(宝藏位置)开始向外扩张时,它有极大的概率会首先碰到菱形的某个角。
    当交点在角上时(例如,在 w 1 w_1 w1 轴或 w 2 w_2 w2 轴上),其中一个坐标必然为零。例如,如果交点在 w 2 w_2 w2 轴上,那么 w 1 w_1 w1 的值就是 0。
    这就意味着,L1 正则化倾向于将某些不那么重要的参数直接“压”到零,从而产生了稀疏模型。

  • L2 正z则化 (圆形)
    圆形的边界是平滑的,没有任何尖角。当椭圆等高线与圆形边界相交时,这个交点可以位于圆周上的任意位置。
    相交的点几乎不可能恰好落在坐标轴上(除非原始损失的最小值点本身就在坐标轴上)。
    因此,L2 正则化只会让权重 w _ 1 w\_1 w_1 w _ 2 w\_2 w_2 都变小,但很难让它们中的任何一个精确地变为零。它起到的作用是“权重衰减”(Weight Decay),而不是特征选择。

(2)从导数的角度看:
L2 惩罚 w i w_i wi 的导数是 2 λ w i 2\lambda w_i 2λwi。当 w i w_i wi 趋近于0时,这个导数也趋近于0。这意味着,当权重已经很小时,L2对它的惩罚力度也变得很小,没有足够的“推力”把它彻底推到0。
L1 惩罚 w i w_i wi 的导数是 λ ⋅ sgn ( w i ) \lambda \cdot \text{sgn}(w_i) λsgn(wi)(即 λ \lambda λ − λ -\lambda λ)。这意味着,只要 w i w_i wi 还不是0,它受到的惩罚力度(梯度)始终是一个恒定值。这个持续的、恒定的“推力”会不断地将权重往0的方向推,直到它变成0为止。

5 如何选择正则化“力度”—— 超参数 λ

l a m b d a \\lambda lambda 是一个至关重要的超参数,它决定了我们对模型复杂度的惩罚力度。

  • λ \lambda λ = 0: 相当于没有正则化,模型可能会过拟合。
  • λ \lambda λ → ∞: 惩罚过重,模型的所有权重都会趋近于 0,导致模型过于简单,无法拟合数据,产生欠拟合 (Underfitting)

选择最佳 λ \lambda λ 的标准方法是交叉验证 (Cross-Validation)。通过尝试一系列的 λ \lambda λ 值,并在验证集上评估模型性能,最终选择那个使模型在验证集上表现最好的 λ \lambda λ

6 用 Python 的 Scikit-learn 库实现正则化

下面我们用 scikit-learn 来演示如何在一个多项式回归任务中使用正则化来防止过拟合。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso

# 1. 生成一些非线性数据
np.random.seed(42)
m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)

# 2. 定义一个高阶多项式回归模型来演示过拟合
# 这里我们用一个30阶的多项式
poly_features = PolynomialFeatures(degree=30, include_bias=False)
std_scaler = StandardScaler()
# 普通线性回归(无正则化)
lin_reg = LinearRegression()

# 创建 Pipeline
polynomial_regression = Pipeline([
    ("poly_features", poly_features),
    ("std_scaler", std_scaler),
    ("lin_reg", lin_reg),
])

polynomial_regression.fit(X, y)

# 3. 定义带正则化的模型
# Ridge (L2)
ridge_reg = Pipeline([
    ("poly_features", PolynomialFeatures(degree=30, include_bias=False)),
    ("std_scaler", StandardScaler()),
    ("ridge_reg", Ridge(alpha=1)) # 在sklearn中,lambda用alpha表示
])
ridge_reg.fit(X, y)

# Lasso (L1)
lasso_reg = Pipeline([
    ("poly_features", PolynomialFeatures(degree=30, include_bias=False)),
    ("std_scaler", StandardScaler()),
    ("lasso_reg", Lasso(alpha=0.1)) # Lasso需要一个相对较小的alpha
])
lasso_reg.fit(X, y)

# 4. 可视化结果
X_new = np.linspace(-3, 3, 100).reshape(100, 1)
y_new_poly = polynomial_regression.predict(X_new)
y_new_ridge = ridge_reg.predict(X_new)
y_new_lasso = lasso_reg.predict(X_new)

plt.figure(figsize=(12, 8))
plt.scatter(X, y, label="Training data")
plt.plot(X_new, y_new_poly, 'r-', label="No Regularization (Overfitting)")
plt.plot(X_new, y_new_ridge, 'g-', linewidth=2, label="Ridge (L2) Regularization")
plt.plot(X_new, y_new_lasso, 'b-', linewidth=2, label="Lasso (L1) Regularization")

plt.title("Regularization Example")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.ylim(0, 10)
plt.show()

# 打印Lasso模型的系数,可以看到很多都变成了0
lasso_coeffs = lasso_reg.named_steps['lasso_reg'].coef_
print(f"Number of coefficients in Lasso: {len(lasso_coeffs)}")
print(f"Number of non-zero coefficients: {np.sum(lasso_coeffs != 0)}")

代码解读:

  • 我们首先创建了一个容易过拟合的场景:用一个 30 阶的多项式去拟合一个二次函数生成的数据。
  • 红线代表无正则化的模型,它剧烈波动,完美地穿过了许多训练点,但显然是过拟合了。
  • 绿线代表 Ridge (L2) 模型,它平滑得多,更好地捕捉了数据的真实趋势。
  • 蓝线代表 Lasso (L1) 模型,它也表现得很好,并且如果我们查看它的系数,会发现 30 个系数中大部分都变为了 0,成功实现了特征选择。

7 正则化的其他方法

除了 L1 和 L2,正则化大家族还有其他成员,常见于深度学习领域:

  • Elastic Net: L1 和 L2 的混合体,同时具备两者的优点。
  • Dropout: 在神经网络训练过程中,随机地“丢弃”(即暂时禁用)一部分神经元,强迫网络学习更加鲁棒的特征。
  • Early Stopping: 在训练过程中监控验证集的性能,一旦验证集误差不再下降甚至开始上升,就立刻停止训练。

8 总结

正则化是机器学习武器库中对抗过拟合最核心、最有效的工具之一。

  • 核心目的:防止模型过拟合,提高其泛化能力。
  • 核心思想:在损失函数中添加惩罚项,以限制模型复杂度。
  • L2 正则化 (Ridge):通过惩罚权重的平方和,使权重变得平滑,适用于大多数情况。
  • L1 正z则化 (Lasso):通过惩罚权重的绝对值,能将不重要的特征权重压缩至 0,从而实现自动特征选择。

希望这篇文章能让您对正则化有了全面而深刻的理解!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐