专栏首页算法工程师的养成之路L1正则为什么会产生稀疏解

L1正则为什么会产生稀疏解

在机器学习中,当模型过于复杂时,为了防止产生过拟合的现象,最常用的方法时采用正则化,如L1正则和L2正则.

正则化的本质

L2正则就是在原来的损失函数的基础上加上权重参数的平方和. L=L0+λ∑jwj2L = L_0 + \lambda\sum_j w_j^2L=L0​+λj∑​wj2​ 其中L0L_0L0​是训练样本误差,λ\lambdaλ是正则化参数. 正则化的目的是防止参数过多或者过大,从而避免模型过于复杂. 为了达到这一目的最直接的方法是限制参数的个数,但是这属于NP-hard问题,求解很困难,所以我们通常采取的限定条件是 ∑jwj2≤C\sum_j w_j^2\leq Cj∑​wj2​≤C

所谓的添加正则项的损失函数,本质上是原始训练误差在给定上述约束条件下的最小化,这样我们通过拉格朗日乘数法即可将其转化为无约束问题,也就是我们添加了正则项的损失函数LLL,拉格朗日乘子即是正则化参数.

L2正则化

直观解释

假设损失函数是在二维上求解,即参数的个数为2,我们可以绘制出如下图象,其中彩色实线是L0L_0L0​的等值线,黑色的是L2L2L2的等值线,从二维空间上看,L2L2L2和L0L_0L0​等值线相交时参数w1、w2w_1、w_2w1​、w2​等于零的概率很小,所以使用L2L2L2正则的解不具有稀疏性.

L2正则倾向于构造一个所有参数都比较小的模型,当数据产生较大的偏移时,由于参数足够小,对于结果也不会产生太大的影响,所以说抗扰动能力强.

数学解释

根据 L=L0+λ∑jwj2L = L_0 + \lambda\sum_j w_j^2L=L0​+λj∑​wj2​ 为了LLL的最小值,我们通常对其求梯度并令其为0. ▽L=▽L0+2λ∑jwj\bigtriangledown L = \bigtriangledown L_0 + 2 \lambda \sum_j w_j▽L=▽L0​+2λj∑​wj​ 在参数wj=0w_j=0wj​=0时, ▽L=▽L0\bigtriangledown L = \bigtriangledown L_0▽L=▽L0​ 这意味着代价函数的梯度在wj=0w_j=0wj​=0处不等于零,所以对损失函数LLL求极小值时,不会wj=0w_j=0wj​=0处取到,因此L2L_2L2​正则不会产生稀疏解.

L1正则化

直观解释

L=L0+∑j∣wj∣L = L_0 + \sum_j|w_j|L=L0​+j∑​∣wj​∣

L1L1L1的等值线是方形,L0L_0L0​与L1L1L1等值线相交时很大概率上出现在顶点处,而顶点都在坐标轴上,因此必有其他参数为0,所以用L1L1L1正则的解具有稀疏性.

数学解释

同样我们对损失函数求梯度. ▽L=▽L0+λsign(wj)={▽L0−λ,wj→0−▽L0+λ,wj→0+ \begin{aligned} \bigtriangledown L = \bigtriangledown L_0 + \lambda sign(w_j)= \begin{cases} \bigtriangledown L_0 - \lambda , & w_j \rightarrow 0^-\\ \bigtriangledown L_0 + \lambda , & w_j \rightarrow 0^+ \end{cases} \end{aligned} ▽L=▽L0​+λsign(wj​)={▽L0​−λ,▽L0​+λ,​wj​→0−wj​→0+​​ 当▽L0−λ\bigtriangledown L_0 - \lambda▽L0​−λ与▽L0+λ\bigtriangledown L_0 + \lambda▽L0​+λ异号时,则损失函数LLL会在wjw_jwj​处产生一个极小值,因此L1L1L1正则会产生稀疏解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于adaboost的人脸快速检测

    RGB、normalized RGB、HSV、YIQ、YES、CIE XYZ、CIE LUV等.

    JNJYan
  • MySQL(一)基本架构

    连接到数据库,负责跟客户端建立连接、获取权限、维持和管理连接,命令通常是mysql -h$ip -P$port -u$user -p.

    JNJYan
  • 逻辑斯谛回归(对数几率回归)

    线性回归完成了数据的拟合,我们通过引入一个sigmoidsigmoidsigmoid函数,即可在线性回归模型的基础上实现分类。

    JNJYan
  • C++11用户自定义字面量

    C++11新标准中引入了用户自定义字面量,也叫自定义后缀操作符,即通过实现一个后缀操作符,将申明了该后缀标识的字面量转化为需要的类型。考察如下代码:

    Dabelv
  • 高通 display 驱动【转】

    233333
  • 智能合约:solidity语法(一)

    在 solidity 里面 uint 默认表示 uint256,其他的还有 uint8、uint16、uint32...

    yichen
  • 字节的奥秘

    在数码产品中,最常见的名词就是“字节”了。不管是U盘容量、手机存储空间,还是网络带宽,下载速度,都会涉及所谓“字节”这个单位。但到底“字节”是一个什么东西呢?本...

    韩伟
  • 安全平台

    以谁为师
  • Docker构建Yapi镜像并部署

    YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi ...

    Ryan-Miao
  • lua的性能优化

    Roberto Ierusalimschy写过经典的Lua 性能提示的文章,链接地址>>

    meteoric

扫码关注云+社区

领取腾讯云代金券