L1,L2

博客主要介绍正则化项L1和L2的区别。L1和L2是为防止模型过拟合加在损失函数后的罚项。L1是参数绝对值之和,趋向产生少量特征;L2是参数平方和开方,选择更多接近0的特征。还探讨参数小代表模型简单、参数稀疏好处及二者避免过拟合的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则化项L1和L2的区别

https://www.cnblogs.com/lyr2015/p/8718104.html

https://blog.youkuaiyun.com/jinping_shi/article/details/52433975

https://blog.youkuaiyun.com/zouxy09/article/details/24971995

一、概括:

L1和L2是正则化项,又叫做罚项,是为了限制模型的参数,防止模型过拟合而加在损失函数后面的一项。

二、区别:

  1.L1是模型各个参数的绝对值之和。

   L2是模型各个参数的平方和的开方值。

  2.L1会趋向于产生少量的特征,而其他的特征都是0.

    因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0 ,产生稀疏权重矩阵

     L2会选择更多的特征,这些特征都会接近于0。  

          最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使每一项趋近于0

三、再讨论几个问题

1.为什么参数越小代表模型越简单?

  越是复杂的模型,越是尝试对所有样本进行拟合,包括异常点。这就会造成在较小的区间中产生较大的波动,这个较大的波动也会反映在这个区间的导数比较大。

  只有越大的参数才可能产生较大的导数。因此参数越小,模型就越简单。

2.实现参数的稀疏有什么好处?

  因为参数的稀疏,在一定程度上实现了特征的选择。一般而言,大部分特征对模型是没有贡献的。这些没有用的特征虽然可以减少训练集上的误差,但是对测试集的样本,反而会产生干扰。稀疏参数的引入,可以将那些无用的特征的权重置为0.

3.L1范数和L2范数为什么可以避免过拟合?

  

  加入正则化项就是在原来目标函数的基础上加入了约束。当目标函数的等高线和L1,L2范数函数第一次相交时,得到最优解。

  L1范数:

  L1范数符合拉普拉斯分布,是不完全可微的。表现在图像上会有很多角出现。这些角和目标函数的接触机会远大于其他部分。就会造成最优值出现在坐标轴上,因此就会导致某一维的权重为0 ,产生稀疏权重矩阵,进而防止过拟合。

  L2范数:

  L2范数符合高斯分布,是完全可微的。和L1相比,图像上的棱角被圆滑了很多。一般最优值不会在坐标轴上出现。在最小化正则项时,可以是参数不断趋向于0.最后活的很小的参数。

  假设要求的参数为θθ,hθ(x)hθ(x)是我们的假设函数,那么线性回归的代价函数如下:

  

  那么在梯度下降法中,最终用于迭代计算参数θθ的迭代式为:

  

  如果在原始代价函数之后添加L2正则化,则迭代公式会变成下面的样子:

  

  每一次迭代,θj都要先乘以一个小于1的因子,从而使得θj不断减小,因此总得来看,θ是不断减小的。

### 关于计算机体系结构中的L1、L2L3缓存 #### L1缓存 L1缓存位于CPU内部,紧邻处理单元。这种设计使得L1拥有极低的访问延迟,通常仅为几个周期的时间。然而,由于其物理尺寸受限,L1缓存容量相对较小。L1缓存分为指令缓存数据缓存两部分,分别用于存储即将执行的指令以及程序运行所需的数据[^1]。 #### L2缓存 相较于L1缓存,L2缓存同样处于CPU内部,但距离计算核心稍远一些。因此,尽管它的响应时间较之L1有所增加,仍然保持在一个较低水平。L2缓存不仅提供了比L1更大的空间来容纳更多临时数据,而且对于那些未能在L1找到匹配项的情况起到了至关重要的作用——当发生未命中时,系统会继续在此处查找所需的资源。 #### L3缓存 作为最外层的一级高速缓冲存储器,L3缓存具备较大的容量,并且被多个CPU核心共同享有。这意味着不同核之间可以通过共享同一片区域内的信息来进行更高效的协作。虽然相比前两者而言,L3的读取速度显得较为缓慢;但是,在面对复杂运算需求或者多线程任务调度场景下,这样的特性反而有助于降低频繁访问外部RAM所带来的性能损耗风险。值得注意的是,某些架构下的L3可能并不完全遵循这一模式,具体取决于制造商的设计理念技术实现方式。 ```python # Python代码示例:模拟简单的三层缓存机制(仅示意) class CacheLevel: def __init__(self, capacity): self.capacity = capacity self.data = {} def check_cache(level, key): if key in level.data: return True elif hasattr(level, 'next_level'): return check_cache(getattr(level, 'next_level'), key) else: return False l1 = CacheLevel(64 * 1024) # 假设L1大小为64KB l2 = CacheLevel(256 * 1024) # 假设L2大小为256KB l3 = CacheLevel(8 * 1024 * 1024) # 假设L3大小为8MB setattr(l1, 'next_level', l2) setattr(l2, 'next_level', l3) print(check_cache(l1, "example_key")) # 测试是否存在某个键值对 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值