【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来
Python系列文章目录
PyTorch系列文章目录
机器学习系列文章目录
深度学习系列文章目录
Java系列文章目录
JavaScript系列文章目录
深度学习系列文章目录
01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
09-【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
10-【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归
11-【深度学习-Day 11】Scikit-learn实战:手把手教你完成鸢尾花分类项目
12-【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
13-【深度学习-Day 13】激活函数选型指南:一文搞懂Sigmoid、Tanh、ReLU、Softmax的核心原理与应用场景
14-【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
15-【深度学习-Day 15】告别“盲猜”:一文读懂深度学习损失函数
16-【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
17-【深度学习-Day 17】神经网络的心脏:反向传播算法全解析
18-【深度学习-Day 18】从SGD到Adam:深度学习优化器进阶指南与实战选择
19-【深度学习-Day 19】入门必读:全面解析 TensorFlow 与 PyTorch 的核心差异与选择指南
20-【深度学习-Day 20】PyTorch入门:核心数据结构张量(Tensor)详解与操作
21-【深度学习-Day 21】框架入门:神经网络模型构建核心指南 (Keras & PyTorch)
22-【深度学习-Day 22】框架入门:告别数据瓶颈 - 掌握PyTorch Dataset、DataLoader与TensorFlow tf.data实战
23-【深度学习-Day 23】框架实战:模型训练与评估核心环节详解 (MNIST实战)
24-【深度学习-Day 24】过拟合与欠拟合:深入解析模型泛化能力的核心挑战
25-【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
文章目录
- Langchain系列文章目录
- Python系列文章目录
- PyTorch系列文章目录
- 机器学习系列文章目录
- 深度学习系列文章目录
- Java系列文章目录
- JavaScript系列文章目录
- 深度学习系列文章目录
- 前言
- 一、为什么需要正则化?
- 1.1 过拟合的困境回顾
- 1.2 正则化的核心思想:奥卡姆剃刀原理
- 二、L2 正则化(权重衰减)详解
- 2.1 L2 正则化的原理
- 2.2 L2 正则化为何叫“权重衰减”
- 2.3 L2 正则化的效果与特点
- 三、L1 正则化(Lasso)详解
- 3.1 L1 正则化的原理
- 3.2 L1 正则化的效果与特点
- 四、L1 与 L2 正则化的对比与选择
- 4.1 核心区别总结
- 4.2 如何选择?
- (1) 默认选择 L2
- (2) 当需要稀疏性时选择 L1
- (3) 弹性网络(Elastic Net)
- 五、框架实战:在 PyTorch/TensorFlow 中应用权重衰减
- 5.1 PyTorch 中的实现
- 5.2 TensorFlow (Keras) 中的实现
- 六、总结
前言
在上一篇文章(Day 24)中,我们详细探讨了深度学习中的“头号公敌”——过拟合(Overfitting)。我们了解到,一个模型如果过于复杂,它会过度学习训练数据中的噪声和细节,导致其在未见过的新数据(测试集)上表现糟糕,即泛化能力差。诊断过拟合只是第一步,更关键的是如何有效地“治疗”它。
从今天开始,我们将进入一个全新的单元,系统学习一系列对抗过拟合的强大技术,统称为正则化(Regularization)。本文作为该系列的第一篇,将聚焦于最经典、最基础的正则化方法:权重衰减(Weight Decay),具体包括 L1 正则化和 L2 正则化。学完本文,你将深刻理解:
- 为什么约束模型权重可以防止过拟合?
- L1 和 L2 正则化的数学原理是什么?它们有何不同?
- “权重衰减”这个名字从何而来?
- 如何在 PyTorch 和 TensorFlow 框架中轻松应用它们?
一、为什么需要正则化?
在深入技术细节之前,我们必须先建立起正则化的核心思想。
1.1 过拟合的困境回顾
让我们回顾一下过拟合的本质。想象一下,一个学生为了应付一场考试,把教科书上的所有例题(包括标点符号)都背得滚瓜烂熟(训练集表现好),但当考试时遇到稍微变化一下的新题型(测试集),他就束手无策了(表现差)。
对于神经网络而言,过拟合通常意味着模型学到了过于复杂的函数,其决策边界会剧烈波动,试图去迎合训练集中的每一个数据点。这背后往往是模型参数(权重)过大导致的。一个很大的权重值意味着模型对某个特定的输入特征非常敏感,这种敏感性很可能是学到了数据的局部噪声,而非普适规律。
1.2 正则化的核心思想:奥卡姆剃刀原理
如何让模型变得不那么“极端”和“敏感”呢?哲学和科学领域有一个著名的原则——奥卡姆剃刀原理(Occam’s Razor),即“如无必要,勿增实体”。简单来说,就是在所有可能解释某个现象的模型中,我们应该选择最简单的那一个。
正则化正是将这一思想引入了深度学习。它通过在模型的**损失函数(Loss Function)中添加一个惩罚项(Penalty Term)**来实现。这个惩罚项专门用来度量模型的复杂度。这样一来,模型优化的目标就从单纯地“最小化预测误差”变成了“最小化预测误差 + 最小化模型复杂度”的权衡。
新目标函数 = 原始损失 (如 MSE, 交叉熵) + λ × 模型复杂度惩罚项 \text{新目标函数} = \text{原始损失 (如 MSE, 交叉熵)} + \lambda \times \text{模型复杂度惩罚项} 新目标函数=原始损失 (如 MSE, 交叉熵)+λ×模型复杂度惩罚项
其中:
- 原始损失 负责让模型更好地拟合数据。
- 模型复杂度惩罚项 负责约束模型的权重,使其不会变得过大,从而让模型更“简单”。
- $ \lambda ( L a m b d a )是 ∗ ∗ 正则化系数 ∗ ∗ ,这是一个超参数,用来控制惩罚的强度。 (Lambda)是**正则化系数**,这是一个超参数,用来控制惩罚的强度。 (Lambda)是∗∗正则化系数∗∗,这是一个超参数,用来控制惩罚的强度。 \lambda $ 越大,对模型复杂度的惩罚就越重,模型就越趋向于简单。
通过这种方式,正则化强迫模型在“拟合训练数据”和“保持自身简单性”之间找到一个平衡点,从而提升其泛化能力。
二、L2 正则化(权重衰减)详解
L2 正则化是迄今为止最常用的一种正则化技术。它也被称为权重衰减(Weight Decay)或岭回归(Ridge Regression)。
2.1 L2 正则化的原理
L2 正则化选择的“模型复杂度惩罚项”是模型所有权重 w w w 的平方和。其修改后的损失函数如下:
L L 2 ( w ) = L o r i g i n a l ( w ) + λ ∑ i w i 2 L_{L2}(w) = L_{original}(w) + \lambda \sum_{i} w_i^2 LL2(w)=Loriginal(w)+λi∑wi2
或者更严谨地写作(加上一个 1 2 \frac{1}{2} 21 是为了求导方便,不影响本质):
L L 2 ( w ) = L o r i g i n a l ( w ) + λ 2 ∥ w ∥ 2 2 L_{L2}(w) = L_{original}(w) + \frac{\lambda}{2} \|w\|_2^2 LL2(w)=Loriginal(w)+2λ∥w∥22
其中:
- L o r i g i n a l ( w ) L_{original}(w) Loriginal(w) 是原始的损失函数。
- w w w 代表模型的所有权重参数。
- ∥ w ∥ 2 2 = ∑ i w i 2 \|w\|_2^2 = \sum_{i} w_i^2 ∥w∥22=∑iwi2 是所有权重平方和,即权重的 L2 范数的平方。
- λ \lambda λ 是正则化系数,控制着正则化的强度。
工作机制解读:
为了最小化新的损失函数 $ L_{L2}(w) $,优化器(如梯度下降)必须同时降低两个部分:原始损失 L o r i g i n a l ( w ) L_{original}(w) Loriginal(w) 和惩罚项 $ \frac{\lambda}{2} |w|_2^2 $。
- 如果某个权重 w i w_i wi 的值变得很大,惩罚项 λ 2 w i 2 \frac{\lambda}{2} w_i^2 2λwi2 就会变得非常大,从而推高总损失。
- 因此,模型在更新权重时,会倾向于选择那些既能降低预测误差,又能使权重值保持较小的方案。
2.2 L2 正则化为何叫“权重衰减”
“权重衰减”这个名字非常形象地描述了 L2 正则化的实际效果。让我们看一下它对梯度下降更新规则的影响。
原始的梯度下降更新规则是:
w i : = w i − η ∂ L o r i g i n a l ∂ w i w_i := w_i - \eta \frac{\partial L_{original}}{\partial w_i} wi:=wi−η∂wi∂Loriginal
其中 η \eta η 是学习率。
现在,我们对新的损失函数 L L 2 ( w ) L_{L2}(w) LL2(w) 求关于 w i w_i wi 的偏导:
∂ L L 2 ∂ w i = ∂ L o r i g i n a l ∂ w i + ∂ ∂ w i ( λ 2 ∑ j w j 2 ) = ∂ L o r i g i n a l ∂ w i + λ w i \frac{\partial L_{L2}}{\partial w_i} = \frac{\partial L_{original}}{\partial w_i} + \frac{\partial}{\partial w_i} \left( \frac{\lambda}{2} \sum_{j} w_j^2 \right) = \frac{\partial L_{original}}{\partial w_i} + \lambda w_i ∂wi∂LL2=∂wi∂Loriginal+∂wi∂(2λj∑wj2)=∂wi∂Loriginal+λwi
于是,新的更新规则变为:
w i : = w i − η ( ∂ L o r i g i n a l ∂ w i + λ w i ) w_i := w_i - \eta \left( \frac{\partial L_{original}}{\partial w_i} + \lambda w_i \right) wi:=wi−η(∂wi∂Loriginal+λwi)
整理一下形式:
w i : = ( 1 − η λ ) w i − η ∂ L o r i g i n a l ∂ w i w_i := (1 - \eta \lambda) w_i - \eta \frac{\partial L_{original}}{\partial w_i} wi:=(1−ηλ)wi−η∂wi∂Loriginal
核心洞察:
看到 ( 1 − η λ ) (1 - \eta \lambda) (1−ηλ) 这一项了吗?在每次更新权重之前,都会先给当前的权重 w i w_i wi 乘以一个小于 1 的系数(因为 η \eta η 和 λ \lambda λ 都是正数)。这相当于让权重在每次更新前都进行一次“衰减”。这就是“权重衰减”这个名字的由来。
2.3 L2 正则化的效果与特点
- 效果:L2 正则化倾向于让模型的权重值变得比较小且分散。它会惩罚大的权重,但除非 λ \lambda λ 无穷大,否则很难让权重精确地等于零。
- 特点:它会让模型的决策边界变得更平滑,降低模型对输入特征的敏感度,从而提高泛化能力。
- 可视化理解:如下图所示,优化过程就像在寻找原始损失函数等高线(椭圆)和 L2 惩罚项等高线(圆形)的切点。最优解(红点)是在两者之间取得平衡的点,它不会是原始损失的最低点(椭圆中心),而是被“拉”向原点,使得权重值更小。
(注:上图为简化示意,真实优化过程是在高维空间中,L2惩罚项约束的是一个超球面)
三、L1 正则化(Lasso)详解
L1 正则化是另一种重要的正则化技术,在某些场景下有其独特的优势。它也被称为 Lasso 回归 (Least Absolute Shrinkage and Selection Operator)。
3.1 L1 正则化的原理
L1 正则化的惩罚项是模型所有权重的绝对值之和。其损失函数如下:
L L 1 ( w ) = L o r i g i n a l ( w ) + λ ∑ i ∣ w i ∣ L_{L1}(w) = L_{original}(w) + \lambda \sum_{i} |w_i| LL1(w)=Loriginal(w)+λi∑∣wi∣
或者写作:
L L 1 ( w ) = L o r i g i n a l ( w ) + λ ∥ w ∥ 1 L_{L1}(w) = L_{original}(w) + \lambda \|w\|_1 LL1(w)=Loriginal(w)+λ∥w∥1
其中 ∥ w ∥ 1 = ∑ i ∣ w i ∣ \|w\|_1 = \sum_{i} |w_i| ∥w∥1=∑i∣wi∣ 是权重的 L1 范数。
3.2 L1 正则化的效果与特点
L1 正则化最显著的特点是它具有稀疏性(Sparsity)。
- 效果:与 L2 不同,L1 正则化倾向于将许多不那么重要的权重直接压缩到精确的零。
- 特点:
- 产生稀疏模型:最终训练出的模型,其参数矩阵中会有大量的零。这使得模型更简单、计算更快、占用内存更少。
- 自动特征选择:如果一个特征对应的权重变成了零,就相当于在模型中彻底移除了这个特征。因此,L1 正则化可以被看作是一种嵌入在训练过程中的自动特征选择方法,对于理解数据中哪些特征是真正重要的非常有帮助。
- 可视化理解:L1 惩罚项的等高线是一个菱形(二维情况)。如下图所示,当原始损失的等高线(椭圆)与菱形首次相交时,这个交点很大概率会发生在菱形的顶点上。而菱形的顶点正对应着某个权重为零的坐标轴上。这就是 L1 产生稀疏性的几何解释。
(注:上图为简化示意,真实优化过程是在高维空间中,L1惩罚项约束的是一个超菱形)
四、L1 与 L2 正则化的对比与选择
现在我们已经了解了 L1 和 L2 的原理,让我们系统地对它们进行比较。
4.1 核心区别总结
特性 | L1 正则化 (Lasso) | L2 正则化 (Weight Decay) |
---|---|---|
惩罚项 | 权重的绝对值之和 ($\lambda \sum | w_i |
对权重的影响 | 倾向于将权重驱动到精确为零 | 倾向于让权重变得很小,但通常不为零 |
模型稀疏性 | 高,产生稀疏模型 | 低,产生非稀疏模型 |
特征选择 | 是,可以作为一种特征选择方法 | 否,保留所有特征,但减小其影响 |
数学性质 | 在 w i = 0 w_i=0 wi=0 处不可导 | 处处可导,计算上更稳定 |
几何形状 | 约束空间为菱形/超菱形 | 约束空间为圆形/超球面 |
4.2 如何选择?
在实际应用中,该如何选择 L1 和 L2 呢?
(1) 默认选择 L2
在大多数情况下,L2 正则化是更安全、更常用的选择。它表现稳定,能有效防止过拟合,并且计算上更简单。当你对问题没有特别的先验知识时,从 L2 开始尝试通常是没错的。
(2) 当需要稀疏性时选择 L1
如果你有以下需求,可以考虑使用 L1 正则化:
- 特征选择:你的数据集特征维度很高,你怀疑其中很多特征是冗余或无用的。使用 L1 可以帮助你识别出那些真正重要的特征。
- 模型解释性:你希望得到一个更简单、更易于解释的模型。一个稀疏模型显然比一个所有权重都非零的密集模型更容易理解。
(3) 弹性网络(Elastic Net)
值得一提的是,还有一种结合了 L1 和 L2 的正则化方法,称为弹性网络(Elastic Net)。它同时包含了 L1 和 L2 的惩罚项,试图兼具两者的优点。
五、框架实战:在 PyTorch/TensorFlow 中应用权重衰减
理论最终要落地于代码。幸运的是,主流深度学习框架已经将正则化的实现封装得非常简洁。
5.1 PyTorch 中的实现
在 PyTorch 中,实现 L2 正则化(权重衰减)极其方便,只需在定义优化器时传入 weight_decay
参数即可。
import torch
import torch.nn as nn# 1. 定义一个简单的模型
model = nn.Sequential(nn.Linear(64, 32),nn.ReLU(),nn.Linear(32, 10)
)# 2. 定义优化器,并设置 weight_decay (L2 正则化)
# weight_decay 的值就是正则化系数 lambda
learning_rate = 1e-3
weight_decay_lambda = 1e-4 # 通常设置为一个较小的值
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay_lambda # 关键参数!
)print("优化器已配置 L2 正则化(权重衰减):")
print(optimizer)# 训练循环中无需做任何额外操作,优化器会自动处理权重衰减
# for inputs, labels in dataloader:
# optimizer.zero_grad()
# outputs = model(inputs)
# loss = loss_fn(outputs, labels)
# loss.backward()
# optimizer.step()
注意:PyTorch 的 weight_decay
参数直接实现了 L2 正则化。实现 L1 正则化相对繁琐一些,通常需要手动将 L1 惩罚项加到损失值上。
5.2 TensorFlow (Keras) 中的实现
在 TensorFlow 的 Keras API 中,正则化通常是在**定义网络层(Layer)**时指定的。
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import regularizers# 定义正则化器
# l2(lambda) 表示 L2 正则化
# l1(lambda) 表示 L1 正则化
# l1_l2(l1=lambda1, l2=lambda2) 表示 L1 和 L2 结合
l2_regularizer = regularizers.l2(0.01) # lambda = 0.01
l1_regularizer = regularizers.l1(0.005) # lambda = 0.005# 1. 构建模型,并在需要正则化的层上应用
model = keras.Sequential([layers.Dense(64, activation='relu', # 对该层的权重(kernel)应用 L2 正则化kernel_regularizer=l2_regularizer, input_shape=(784,)),layers.Dense(32, activation='relu',# 也可以对偏置(bias)或激活值(activity)进行正则化,但最常用的是对权重bias_regularizer=l1_regularizer ),layers.Dense(10)
])# 2. 编译模型,Keras会自动将正则化损失加入总损失中
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy']
)model.summary()# 训练时,打印出的 loss 会是 原始loss + 各层的正则化loss 之和
# model.fit(x_train, y_train, epochs=5)
对比总结:
- PyTorch:在优化器层面统一设置 L2 正则化,更宏观。
- TensorFlow/Keras:在模型层层面精细化设置,可以为不同层指定不同的正则化策略,更灵活。
六、总结
恭喜你,完成了对权重衰减正则化的深度探索!让我们对今天的核心知识点进行梳理:
-
正则化的目的:为了解决过拟合问题,通过向损失函数添加复杂度惩罚项,来约束模型的复杂度,提升其泛化能力。其思想源于“奥卡姆剃刀原理”。
-
L2 正则化 (权重衰减):
- 原理:惩罚项是权重的平方和 ( λ ∑ w i 2 \lambda \sum w_i^2 λ∑wi2)。
- 效果:驱使权重变得小而分散,使模型决策边界更平滑。
- 别名:之所以叫“权重衰减”,是因为其梯度更新公式等价于在每次更新前对权重乘以一个小于1的系数。
-
L1 正则化 (Lasso):
- 原理:惩罚项是权重的绝对值之和 ( λ ∑ ∣ w i ∣ \lambda \sum |w_i| λ∑∣wi∣)。
- 效果:能产生稀疏模型,即将许多不重要的权重直接压缩为零。
- 应用:可用于自动特征选择和构建更易于解释的模型。
-
如何选择:L2 是通用首选。当需要模型具有稀疏性或进行特征选择时,可以考虑 L1。
-
框架实现:
- PyTorch:在
optimizer
中设置weight_decay
参数(实现L2)。 - TensorFlow/Keras:在
layer
中设置kernel_regularizer
等参数(可实现L1, L2等)。
- PyTorch:在
掌握权重衰减是建立稳健深度学习模型的基础一步。然而,它并不是唯一的正则化工具。在下一篇文章中,我们将学习另一种极其强大且广泛使用的正则化技术——Dropout。敬请期待!