机器学习之正则化

devtools/2025/3/14 23:18:05/

机器学习领域,模型的性能至关重要,而过拟合问题常常阻碍模型在实际应用中的表现。正则化技术应运而生,成为解决这一难题的有力武器。它主要分为参数正则化和经验正则化两大类别,核心目的在于遵循奥卡姆剃刀定律,使模型在拟合数据时保持简洁,避免过度复杂,从而提升模型的泛化能力

一、参数正则化

(一)基本原理

参数正则化是对模型参数施加约束的一种策略。其实现方式是在经验风险的基础上添加一个正则化项(惩罚项),以此实现结构风险最小化。在这个过程中,模型的复杂度与正则化项的值呈现单调递增关系。参数正则化的常见形式为:( R_{emp}(w)+\lambda\Omega(w) )。其中,( R_{emp}(w) ) 代表经验风险,它反映了模型在训练数据上的平均损失或误差,体现了模型对训练数据的拟合程度。但单纯追求经验风险最小化,易导致模型过度拟合,在未见数据上表现欠佳。( \lambda\Omega(w) ) 是正则化项,( \lambda\geq0 ) 作为系数,用于调节经验风险与正则化项之间的平衡关系。

(二)范数与正则化

  1. 范数概念:范数用于衡量向量的某种 “大小” 或 “长度”,能理解为向量的投影大小,常见的有L1范数、L2范数等,抽象表示为Lp - norm,其公式为 ( \left | x \right |{p} = \left ( \sum{i=1}^{n}\left | x_{i} \right |^{p} \right )^{\frac{1}{p}} )。当将不同的p值代入,可得到不同类型的范数。
  2. L1范数(曼哈顿范数):L1范数(L1 - norm)的表达式为 ( \left | x \right |{1} = \sum{i=1}^{n}\left | x_{i} \right | ),它是向量各元素绝对值之和,也被称为曼哈顿范数。这一别称源于它与在曼哈顿街区中,从一点到另一点沿街道行走距离的数学描述相似,能够反映向量在特定 “距离” 度量下的大小。
  3. L2范数(欧几里得范数):L2范数(L2 - norm)的计算公式是 ( \left | x \right |{2} = \sqrt{\sum{i=1}{n}x_{i}{2}} ),即对向量元素先平方再求和,最后开平方根,又称为欧几里得范数。它类似于空间中两点间直线距离的计算方式,能够体现向量在空间中的实际大小。例如,在二维平面上,连接两点的直线距离对应L2范数,而通过折线行走的距离之和类似L1范数。最小二乘法便是L2范数在数据拟合和参数估计方面的典型应用,其目标是最小化残差(真实值与估计值之间的差)的平方和,即让模型预测值与真实值之间的L2范数(欧几里得距离)达到最小。
    在这里插入图片描述

(三)常见的参数正则化方法

  1. L1正则化(Lasso回归):在回归模型中,L1正则化方法也被称为Lasso回归。它通过在损失函数中加入L1范数项(即系数的绝对值之和)作为惩罚项。这一做法会使得部分学习到的特征权值变为0,就像给模型进行了 “瘦身”,使模型变得稀疏化,去除了不重要的特征,实现了特征选择。因此,在处理高维数据集时,L1正则化能够帮助模型聚焦于重要特征,提升模型性能。
  2. L2正则化(Ridge回归/权重衰减):在回归模型领域,L2正则化又被称作Ridge回归(岭回归)。其原理是在损失函数中添加L2范数项(即系数的平方和)作为惩罚项,该惩罚项能够限制估计系数,使其变小但不会变为0。这样一来,模型的稳定性得以增强,尤其适用于存在强相关性特征的数据集。在神经网络层的权重调整中,L2正则化也经常被使用,此时它还有一个名字叫权重衰减(weight decay)。通过缩小权重,模型能够有效防止过拟合,降低对输入数据变化的敏感度。在机器学习实践中,L2正则化常采用一种特殊形式,即使用L2范数的 ( \frac{1}{2} ) 乘以平方(不带平方根),表达式为 ( \frac{1}{2}\left | w \right |_{2}^{2} )。这种形式主要是为了在数学计算上的便利,在求导过程中,平方项前的2可以被消去,使结果更为简洁,并且特别适配梯度下降算法。在梯度下降过程中,我们依据损失函数对参数的梯度来更新参数,而L2正则项求导后即为参数本身,能够直接与损失函数对参数的梯度相加,实现对参数的惩罚效果,让优化过程更加平稳、稳定。
  3. 弹性网正则化:Elastic Net Regularization融合了L1和L2正则化的优点,旨在在特征选择和权重缩减之间找到平衡。在模型训练阶段,将L1和L2正则化项同时添加到损失函数中,通过 ( \lambda_{1} ) 和 ( \lambda_{2} ) 来分别控制两种正则化的强度。在处理高维且具有强特征相关性的数据集时,弹性网正则化展现出特别出色的效果。
    在这里插入图片描述

以Python的scikit - learn算法库为例,实现弹性网正则化的代码如下:

from sklearn.linear_model import ElasticNet
from sklearn.model_selection import train_test_split  
from sklearn.datasets import make_regression  
from sklearn.metrics import mean_squared_error# 创建一个模拟的回归数据集  
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)  # 将数据集分割为训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 初始化ElasticNet模型,alpha控制正则化的强度,l1_ratio控制L1和L2正则化的比例  
enet = ElasticNet(alpha=0.1, l1_ratio=0.5) # 训练和预测
enet.fit(X_train, y_train)
y_pred = enet.predict(X_test)# 计算均方误差  
mse = mean_squared_error(y_test, y_pred)  
print(f"Mean Squared Error: {mse}")

二、经验正则化

经验正则化并非直接对模型参数进行约束,而是借助一些基于实践经验或实验观察总结出来的技巧和策略,来优化模型的训练过程,进而提升模型在未见数据上的泛化性能。

(一)Dropout

在神经网络中,Dropout是一种常用的正则化手段。其操作方式较为独特,在训练过程中,会以一定概率(例如0.5)随机将一部分神经元的输出设置为0,仿佛将这些神经元 “关闭”。由于每次训练迭代时被关闭的神经元是随机选择的,这就相当于在训练多个不同结构的子网络,类似于将众多神经网络集成起来进行学习。通过这种方式,模型不会过度依赖某些特定神经元,打破了神经元之间复杂的共适应关系,显著增强了网络对新数据的适应能力。Dropout可以应用于任何非输出层之后,并且能够与L1或L2正则化方法结合使用,进一步提升模型的泛化能力。在测试阶段,为确保模型性能的稳定性,通常会将每个神经元的输出乘以保留概率(1 - dropout率),以此补偿训练时随机丢弃神经元所带来的影响。
在这里插入图片描述

使用Pytorch的torch.nn模块添加Dropout层的代码示例如下:

self.dropout = nn.Dropout(p=0.5)  # 在训练期间,每个神经元的输出有50%的概率被设置为0

(二)早停法

早停法是在模型训练过程中,密切关注验证集上模型的表现。一旦发现模型在验证集上的性能经过多轮训练后没有明显提升,便停止训练,无需完成预定的所有训练轮次(Epochs)。这种方法既能节省时间,又能减少资源消耗。使用早停法的关键在于准确判断模型何时开始出现过拟合现象。这需要在整个训练过程中持续监控验证数据上损失函数的变化情况,或者观察准确率是否在一段时间内趋于稳定不再提升,以此作为判断是否应该停止训练的依据。
在这里插入图片描述

三、正则化的应用场景

(一)线性回归

当面临高维数据集,或者数据存在多重共线性问题时,正则化能够发挥重要作用。它可以帮助模型更好地处理复杂的数据关系,避免因维度灾难或共线性导致的过拟合问题,提高模型的预测准确性和稳定性。

(二)逻辑回归

在特征空间较大,或者特征之间可能存在相关性的情况下,正则化同样适用。通过对模型进行正则化处理,可以有效降低特征之间相关性对模型的影响,使模型更加稳健,提升模型在分类任务中的性能表现。

(三)神经网络

在处理复杂模型和大数据集时,正则化是防止过拟合的重要手段。由于神经网络的复杂性较高,容易对训练数据中的噪声和细节过度学习,正则化能够限制模型的复杂度,增强模型的泛化能力,确保神经网络在面对各种不同的数据时都能保持良好的性能。

(四)支持向量机SVM

正则化可以帮助支持向量机更好地调整模型的复杂度,优化模型的决策边界,从而提升模型的性能。通过合理设置正则化参数,能够使SVM在不同的数据集上都能找到最优的分类或回归效果。

(五)图像分类

尤其是在训练卷积神经网络(CNNs)进行图像分类时,L2正则化被广泛应用于提高模型的泛化能力。图像数据通常具有高维度和复杂的特征,L2正则化能够对模型的权重进行约束,防止模型过拟合,使训练出的CNN模型能够更好地识别不同类别的图像,在新的图像数据上也能保持较高的准确率。


http://www.ppmy.cn/devtools/167138.html

相关文章

大一新生备战蓝桥杯c/c++B组——2024年省赛真题解题+心得分享

一&#xff0c;握手问题 这个题用点像小学奥数&#xff0c;直接手算就行 答案&#xff1a;1204 二&#xff0c;小球反弹 这个题思路简单&#xff0c;但是运行会显示超时。在思考思考&#xff0c;后续补代码。 三&#xff0c;好数 思路一&#xff1a; #include <iostream&…

ChromeOS 133 版本更新

ChromeOS 133 版本更新 1. 增强托管用户的 Office 文件处理功能 从 ChromeOS 133 开始&#xff0c;托管用户 现在可以 无缝打开和编辑 Microsoft Office 文件&#xff08;Word、PowerPoint、Excel&#xff09;&#xff0c;无论他们使用的是 Microsoft 365&#xff08;Office …

踩坑故障实录 自学软硬件工程师第750天

见字如面&#xff0c; 这里是AIGC创意人_竹相左边 我很喜欢 《流浪地球 2》中 &#xff0c;马兆&#xff1a;没有硬件支撑&#xff0c;你破解个屁。 --- 故障描述 昨天在服务器ess当中部署自己的网页计时器。代码都交给通义灵码。给的代码我并不能全部看懂。 今天我想继续…

Java Socket通信基础及拆包粘包问题模拟(上)

一、Socket通信基础概念 1.1 什么是Socket&#xff1f; Socket&#xff08;套接字&#xff09;是计算机网络中不同主机间进程进行双向通信的端点&#xff0c;本质是操作系统提供的进程间通信机制。它封装了TCP/IP协议栈的复杂操作&#xff0c;为应用程序提供了标准API。 1.2…

Redis 缓存穿透、缓存击穿与缓存雪崩详解:问题、解决方案与最佳实践

目录 引言 1. 缓存穿透 1.1 什么是缓存穿透&#xff1f; 示例&#xff1a; 1.2 缓存穿透的原因 1.3 缓存穿透的解决方案 1.3.1 缓存空对象 1.3.2 布隆过滤器&#xff08;Bloom Filter&#xff09; 1.3.3 参数校验 2. 缓存击穿 2.1 什么是缓存击穿&#xff1f; 示例&…

Docker基础命令说明

Docker基础操作命令众多&#xff0c;这些命令可以按如下方式进行分类&#xff1a; 镜像操作容器操作网络操作数据卷操作LOG查询 等方面进行分类。 一、镜像操作命令 docker images&#xff1a;用于列出本地系统中所有的 Docker 镜像。镜像就像是一个模板&#xff0c;它包含…

vue中,watch里,this为undefined的两种解决办法

提示&#xff1a;vue中&#xff0c;watch里&#xff0c;this为undefined的两种解决办法 文章目录 [TOC](文章目录) 前言一、问题二、方法1——使用function函数代替箭头函数()>{}三、方法2——使用that总结 前言 ‌‌‌‌‌尽量使用方法1——使用function函数代替箭头函数()…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…