微信扫码
与创始人交个朋友
我要投稿
在深度学习模型设计中,正则化(Regularization)是通过对模型施加约束或惩罚的方式。
如果不加任何约束,模型很容易将训练数据中的噪声也学习到,从而过度拟合于训练数据,无法很好地泛化到新的测试数据上,对未见过的、新的数据,判断的准确率低,是提高模型泛化能力的一种手段。
L1正则化通过向损失函数添加一个与模型权重的绝对值成正比的项(即L1范数),它在数学上的表示如下:
其中Loriginal是原始的损失,比如MSE,λ是人为设定的超参数(正则化强度),控制L1正则化项对总损失的贡献大小,鼓励模型产生更少的非零权重,也就是某些权重会被置为0,准确点的表述是推向0(why?可以先想一下)。
L1、L2正则化的核心是降低模型的复杂度,也就是对参数的依赖。在训练模型的过程中,为什么会出现过拟合的情况呢?
主要还是因为在学习的过程中,模型参数导致的,参数越多,模型的表达能力就越强,它就越能让预测值接近实际值,出现过拟合的情况。比如,在做线性回归的过程中,如果数据交叉的比较厉害,相比用直接来分割数据,曲线的效果会更好,反馈到模型上,就是模型会更复杂,直线可以用一元一次方程表示,而曲线,那就~
L1正则化倾向于产生稀疏的权重矩阵,即许多权重被置为零。相当于进行了特征选择,只保留了对模型输出最有贡献的输入特征。当一些特征对预测目标贡献不大时,L1正则化通过消除这些不重要的特征来简化模型,这有助于提高模型的解释性和泛化能力。
L2正则化鼓励模型权重趋向于较小的值,但不会完全置为零,这是跟L1的核心区别。它导致了权重的平滑分布,减少了模型对单个特征的依赖,使模型更加稳健。通过惩罚大的权重值,L2正则化有助于防止模型权重对少数极端值过度敏感,从而提升模型在新数据上的表现。
L1,L2正则化,从数学上理解他们表现出的差异会更好一些,在反向传播求梯度时,L1对wi求偏导数,结果是 λ(需要考虑参数的符号),且是不连续的;L2对wi求偏导数时,结果是2 λwi,且是连续的。
对于L1来说,更新步骤会考虑到 λ 乘以权重的符号。如果wi > 0,更新类似 wi = wi - λ;如果wi < 0时,更新类似 wi = wi + λ;对于非常小的 wi,很容易将wi更新为0,或者跨过0,改变符号。这对于计算损失来说,只有在wi=0时,才能取到最小值,跨过0点,都会让损失函数变大。
但是对于L2,由于函数的连续性,在更新参数后,损失函数始终是往减小的方向逼近,但是不会存在突变点,这个特点,导致L2能够保留小的参数,而不是将参数置为0。
这里直接上核心代码吧,本文主要是想让大家能够理解L1,L2的概念以及差异。
L1正则化:
import torch
import torch.nn as nn
import torch.optim as optim
# 正则化强度
lambda_l1 = 0.05
# 训练模型
for epoch in range(100):# 训练100轮
optimizer.zero_grad() # 清空梯度
outputs = model(x_train)# 前向传播
mse_loss = criterion(outputs, y_train)# 计算MSE损失
l1_reg_loss = 0
for param in model.parameters():
l1_reg_loss += torch.norm(param, 1)# 计算L1正则化损失
loss = mse_loss + lambda_l1 * l1_reg_loss# 总损失包括MSE损失和L1正则化损失
loss.backward()# 反向传播
optimizer.step()# 更新权重
if epoch % 10 == 0:
print(f'Epoch {epoch}, Loss: {loss.item()}')
L2正则化:
# 使用SGD优化器并添加L2正则化(权重衰减)optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=0.01) # weight_decay 参数就是 λ
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-14
2024-04-12
2024-05-10
2024-05-28
2024-07-18
2024-04-25
2024-05-22
2024-04-26