- 作者:老汪软件技巧
- 发表时间:2024-09-23 11:01
- 浏览量:
前言
在前一篇文章中,笔者为大家讲解了人工智能正则化技术的综述,那么下面我们就来详细了解一下在机器学习中被广泛运用,形影不离的两个正则化技术--L1和L2正则化。
一、L1正则化定义 :
L1正则化,也称为Lasso正则化,是一种在机器学习中常用的技术。它的目的是防止模型过拟合,特别是在处理具有大量特征的数据集的时候。L1正则化通过向模型的损失函数添加一个惩罚项来实现,这个惩罚项是模型权重的L1范数,即权重向量的绝对值之和。
数学公式 :
数学上,L1正则化的损失函数可以表示为:
LL1=Ldata+λ∑i=1n∣wi∣L_{\text{L1}} = L_{\text{data}} + \lambda \sum_{i=1}^{n} |w_i|LL1=Ldata+λ∑i=1n∣wi∣
其中,LdataL_{\text{data}}Ldata 是模型的数据损失,通常是模型预测值与真实标签之间的误差,如均方误差(MSE)或交叉熵损失(Cross-entropy loss)。λ\lambdaλ 则是正则化参数,用于控制正则化项的强度,而 wiw_iwi 表示的是模型的权重,无论是对于线线性模型还是神经网络模型,这个权重指的都是模型的参数,也就是我们利用梯度下降或者反向传播想要更新的东西。
为什么要用L1正则化 :
L1正则化的特点是它能够产生稀疏权重矩阵,即许多权重会变成0。这意味着模型会自动进行特征选择,只有那些对预测结果有重要影响的特征才会保留在模型中。这种稀疏性不仅有助于减少模型的复杂度和计算成本,而且还提高了模型的解释性。在优化过程中,L1正则化倾向于将一些参数推向零,这有助于模型专注于最重要的特征,同时忽略那些不重要的特征。这种特性使得L1正则化在特征选择方面非常有用,尤其是在特征数量很多且许多特征可能与输出变量关系不大的情况下。
不足的地方 :
L1正则化的一个缺点就是它的优化问题不是光滑的,因此在求解时可能会比较困难。尽管如此,L1正则化在我们的实践中仍然被广泛使用,特别是在需要进行特征选择的场景中。( 如果算力和时间充足的情况下,我们通常会把每一种正则化方法都试一遍,选取模型效果最好的一种方法作为最终项 )
需要注意的地方 :
在实际应用中,L1正则化的参数 λ\lambdaλ 需要仔细选择,因为它直接影响正则化的强度。较大的 λ\lambdaλ 值会导致更多的权重变为零,从而产生更稀疏的模型,但同时也可能导致欠拟合。相反,较小的 λ\lambdaλ 值可能会导致过拟合。通常呢,λ\lambdaλ 的最佳值是通过交叉验证等技术来确定的,其实也就是实验确定最佳取值。
总的来说,L1正则化是一种强大的技术,可以帮助机器学习模型在保持预测性能的同时,减少过拟合的风险,并提高模型的可解释性。很多时候,依旧是我们模型选取正则化方法的首选项。
二、L2正则化定义 :
L2正则化,也称为Ridge正则化,是一种在机器学习中广泛使用的正则化技术,特别是在线性回归和逻辑回归模型中。其核心思想是在模型的损失函数中添加一个惩罚项,这个惩罚项是模型权重的L2范数的平方,即权重系数的平方和。这样做的目的是限制模型权重的增长,使其不会变得过大,从而避免模型在训练数据上过拟合( 因为当权重过大的时候,模型往往无法抓住整体特征的影响反而会关注局部特征从而影响模型效果,并且如果大权重关联的还是噪音特征的话那就gg了 )。
数学表达式 :
L2正则化的损失函数加上正则化项可以表示为:
L(θ)=12m∑i=1m(hθ(x(i))−y(i))2+λ2m∑j=1nθj2L(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum_{j=1}^{n} \theta_j^2L(θ)=2m1∑i=1m(hθ(x(i))−y(i))2+2mλ∑j=1nθj2
其中:
为什么要用L2正则化 :
限制权重大小,处理特征相关性:通过惩罚大的权重值,L2正则化鼓励模型使用较小的权重值,从而减少模型对每个特征的依赖。并且当特征之间存在高度相关性时,L2正则化可以减少模型对特定特征组合的依赖,从而提高模型的鲁棒性。
提高模型稳定性,平滑决策边界:L2正则化有助于防止模型在面对新的、未见过的数据时表现不佳的情况,即提高模型的泛化能力。在逻辑回归中,L2正则化有助于使决策边界更加平滑,而不是过分曲折,这有助于减少分类错误。
不足的地方 :
L2正则化虽然能有效防止过拟合,提高模型的泛化能力,但也存在一些局限性。它不会产生稀疏解,因此无法进行特征选择。此外,它对异常值较为敏感,并且在处理具有多重共线性的特征时可能不够有效 ( 因此要求我们要对数据进行清洗和噪音特征筛选等预处理 )。L2正则化还要求用户通过交叉验证等方法来手动调整正则化参数,这可能比较困难。最后,它可能会限制模型的表达能力,特别是在处理复杂数据结构时。
代码实现 :
在实际应用中,L2正则化可以通过各种机器学习库轻松实现。例如,我们在scikit-learn中可以通过设置Ridge回归的alpha参数来应用L2正则化( 笔者大力推荐利用scikit-learn库进行模型的一些基础和简单的调试):
from sklearn.linear_model import Ridge
# 创建Ridge回归模型实例,设置正则化强度alpha
ridge_reg = Ridge(alpha=1.0)
ridge_reg.fit(X_train, y_train)
# 使用模型进行预测
y_pred = ridge_reg.predict(X_test)
在神经网络中,L2正则化也可以通过设置权重衰减参数来实现,如在Keras中:
from keras import regularizers
# 定义一个带有L2正则化的神经网络层
model.add(Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
总之,L2正则化是一种有效的技术,用于控制模型复杂度和防止过拟合。通过在损失函数中添加权重的平方和作为惩罚项,它有助于保持权重的小幅度,从而提高模型的泛化能力。在实际应用中,L2正则化参数的选择非常重要,通常也是通过交叉验证来确定最佳的正则化强度。