模型训练的正则L1、L2

详细的解释:L1正则化引起稀疏解的多种解释

1、对“L1稀疏解、L2平滑解”的个人理解

L1正则
  • 二维函数=|x-y|=0,平面图是个以原点为中心的正方形,四个角都正好在x或y周上。
  • 通过分析知道,L1下坐标轴上的点更有可能成为最优解,但坐标轴上的点肯定x=0或y=0,即存在某些维度下value=0的情况,从而导致矩阵变得稀疏
L2正则
  • 二维函数=(x-y)^2=0,是个以原点为中心的圆。
  • 通过分析知道,L2下待拟合曲线与圆的切点是最优解,而圆有那么多切点,分布在坐标轴上的才4个点,其他点也都可以作为切点,而且这些点坐标(x,y)都在(0,1)范围内,不会取0和1,从而导致矩阵里的更多的值是接近0,而不是等于0,也就是所谓的平滑解现象。
### 实现 L1 和 L2 正则化于 YOLOv5 #### 修改损失函数以加入正则项 为了在YOLOv5中引入L1或L2正则化,主要工作是在定义模型的时候修改其损失计算部分,在原有的基础上增加相应的正则化项。对于PyTorch框架下的YOLOv5来说,这意味着要调整`train.py`文件内的训练循环逻辑或是直接作用于构建模型实例时所指定的自定义层。 针对L1正则化而言,由于它倾向于创建稀疏决方案——即让某些权重变为零从而简化最终得到的预测器;而L2正则化则是通过对所有参数施加平方惩罚来抑制过大数值的发生频率,使得各维度上的贡献更加均匀[^1]。 具体的实现方式可以通过重写或扩展现有的损失类来进行: ```python import torch.nn as nn from yolov5.models.yolo import Model # 假设这是yolov5中的model导入路径 class CustomModel(Model): def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, lambda_l1=0.0005, lambda_l2=0.0005): super().__init__(cfg, ch, nc) self.lambda_l1 = lambda_l1 self.lambda_l2 = lambda_l2 def compute_loss(self, p, targets): # 这里的p代表预测值,targets为目标标签 loss, loss_items = super().compute_loss(p, targets) l1_reg = sum(torch.norm(param, 1) for param in self.parameters()) l2_reg = sum((param ** 2).sum() for param in self.parameters()) total_loss = loss + self.lambda_l1 * l1_reg + self.lambda_l2 * l2_reg return total_loss, loss_items ``` 上述代码片段展示了如何继承官方版本的YOLOv5模型并添加额外的方法来处理L1和L2正则化。这里的关键在于覆写了父类中原有的`compute_loss()`方法,并在其返回之前加上了由超参控制强度的新正则化成分[^2]。 值得注意的是,这里的`lambda_l1`和`lambda_l2`分别对应着应用于整个网络上每层权重矩阵的L1与L2正则化因子大小的选择。这两个值应当依据实际情况经过调优实验得出最佳设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值