当前位置: 首页 > java >正文

【深度学习-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)+λiwi2

或者更严谨地写作(加上一个 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λw22

其中:

  • 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 w22=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ηwiLoriginal
其中 η \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 wiLL2=wiLoriginal+wi(2λjwj2)=wiLoriginal+λ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η(wiLoriginal+λ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ηwiLoriginal

核心洞察
看到 ( 1 − η λ ) (1 - \eta \lambda) (1ηλ) 这一项了吗?在每次更新权重之前,都会先给当前的权重 w i w_i wi 乘以一个小于 1 的系数(因为 η \eta η λ \lambda λ 都是正数)。这相当于让权重在每次更新前都进行一次“衰减”。这就是“权重衰减”这个名字的由来。

2.3 L2 正则化的效果与特点

  • 效果:L2 正则化倾向于让模型的权重值变得比较小且分散。它会惩罚大的权重,但除非 λ \lambda λ 无穷大,否则很难让权重精确地等于零
  • 特点:它会让模型的决策边界变得更平滑,降低模型对输入特征的敏感度,从而提高泛化能力。
  • 可视化理解:如下图所示,优化过程就像在寻找原始损失函数等高线(椭圆)和 L2 惩罚项等高线(圆形)的切点。最优解(红点)是在两者之间取得平衡的点,它不会是原始损失的最低点(椭圆中心),而是被“拉”向原点,使得权重值更小。
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)+λiwi

或者写作:
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)+λw1

其中 ∥ w ∥ 1 = ∑ i ∣ w i ∣ \|w\|_1 = \sum_{i} |w_i| w1=iwi 是权重的 L1 范数。

3.2 L1 正则化的效果与特点

L1 正则化最显著的特点是它具有稀疏性(Sparsity)

  • 效果:与 L2 不同,L1 正则化倾向于将许多不那么重要的权重直接压缩到精确的零
  • 特点
    1. 产生稀疏模型:最终训练出的模型,其参数矩阵中会有大量的零。这使得模型更简单、计算更快、占用内存更少。
    2. 自动特征选择:如果一个特征对应的权重变成了零,就相当于在模型中彻底移除了这个特征。因此,L1 正则化可以被看作是一种嵌入在训练过程中的自动特征选择方法,对于理解数据中哪些特征是真正重要的非常有帮助。
  • 可视化理解:L1 惩罚项的等高线是一个菱形(二维情况)。如下图所示,当原始损失的等高线(椭圆)与菱形首次相交时,这个交点很大概率会发生在菱形的顶点上。而菱形的顶点正对应着某个权重为零的坐标轴上。这就是 L1 产生稀疏性的几何解释。
L1 正则化优化过程
被拉向
不再是目标
原点
最优解
很可能在顶点
部分权重为0
原始损失
最低点

(注:上图为简化示意,真实优化过程是在高维空间中,L1惩罚项约束的是一个超菱形)

四、L1 与 L2 正则化的对比与选择

现在我们已经了解了 L1 和 L2 的原理,让我们系统地对它们进行比较。

4.1 核心区别总结

特性L1 正则化 (Lasso)L2 正则化 (Weight Decay)
惩罚项权重的绝对值之和 ($\lambda \sumw_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:在模型层层面精细化设置,可以为不同层指定不同的正则化策略,更灵活。

六、总结

恭喜你,完成了对权重衰减正则化的深度探索!让我们对今天的核心知识点进行梳理:

  1. 正则化的目的:为了解决过拟合问题,通过向损失函数添加复杂度惩罚项,来约束模型的复杂度,提升其泛化能力。其思想源于“奥卡姆剃刀原理”。

  2. L2 正则化 (权重衰减)

    • 原理:惩罚项是权重的平方和 ( λ ∑ w i 2 \lambda \sum w_i^2 λwi2)。
    • 效果:驱使权重变得小而分散,使模型决策边界更平滑
    • 别名:之所以叫“权重衰减”,是因为其梯度更新公式等价于在每次更新前对权重乘以一个小于1的系数。
  3. L1 正则化 (Lasso)

    • 原理:惩罚项是权重的绝对值之和 ( λ ∑ ∣ w i ∣ \lambda \sum |w_i| λwi)。
    • 效果:能产生稀疏模型,即将许多不重要的权重直接压缩为
    • 应用:可用于自动特征选择和构建更易于解释的模型。
  4. 如何选择L2 是通用首选。当需要模型具有稀疏性或进行特征选择时,可以考虑 L1。

  5. 框架实现

    • PyTorch:在 optimizer 中设置 weight_decay 参数(实现L2)。
    • TensorFlow/Keras:在 layer 中设置 kernel_regularizer 等参数(可实现L1, L2等)。

掌握权重衰减是建立稳健深度学习模型的基础一步。然而,它并不是唯一的正则化工具。在下一篇文章中,我们将学习另一种极其强大且广泛使用的正则化技术——Dropout。敬请期待!


http://www.xdnf.cn/news/12809.html

相关文章:

  • 标准代码项目开发流程学习指南
  • CMS内容管理系统的设计与实现:架构设计
  • 红黑树完全指南:为何工程都用它?原理、实现、场景、误区全解析
  • 数学:”度量空间”了解一下?
  • JESD204B IP核接口实例,ADI的ADRV9009板卡,ZYNQ7045驱动实现2发2收。
  • LLMs 系列科普文(14)
  • 关于IE浏览器被绑定安装,还卸载不掉
  • 72常用控件_QGridLayout的使用
  • 热成像实例分割电力设备数据集(3类,838张)
  • Vscode下Go语言环境配置
  • 矢状位片不可用怎么办?前后位测量方法评估骨盆倾斜角!
  • 智能职业发展系统:AI驱动的职业规划平台技术解析
  • LLMs 系列科普文(2)
  • python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件
  • F(x, y, z) = 0 隐函数微分 确定自变量
  • 【资源分享】手机玩转经典游戏!小鸡模拟器1.9.0:PSP/NDS/GBA完美运行!
  • SSE (Server-Sent Events) 技术简介
  • Java八股文——并发编程「并发安全篇」
  • C-Equilateral Triangle
  • Windows安装Miniconda
  • 鸿蒙学习笔记01
  • 手写 vue 源码 === runtime-core 实现
  • RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
  • Kaggle注册不成功,添加插件header Editor
  • FreeRTOS同步和互斥
  • CppCon 2015 学习:Large Scale C++ With Modules
  • Codeforces Educational 179(ABCDE)
  • MyBatis中foreach集合用法详解
  • yyMMddHHSSS 是什么日期
  • 99. Java 继承(Inheritance)