本文翻译自文章:Differences between L1 and L2 as Loss Function and Regularization,如有翻译不当之处,欢迎拍砖,谢谢~

  在机器学习实践中,你也许需要在神秘的L1和L2中做出选择。通常的两个决策为:1) L1范数 vs L2范数 的损失函数; 2) L1正则化 vs L2正则化。

作为损失函数

  L1范数损失函数,也被称为最小绝对值偏差(LAD),最小绝对值误差(LAE)。总的说来,它是把目标值(\(Y_{i}\))与估计值(\(f(x_{i})\))的绝对差值的总和(\(S\))最小化:

\[S=\sum\limits_{i=1}^{n}|Y_{i}-f(x_{i})|.\]

  L2范数损失函数,也被称为最小平方误差(LSE)。总的来说,它是把目标值(\(Y_{i}\))与估计值(\(f(x_{i})\))的差值的平方和(\(S\))最小化:

\[S=\sum\limits_{i=1}^{n}\Big(Y_{i}-f(x_{i})\Big)^{2}.\]

  L1范数与L2范数作为损失函数的区别能快速地总结如下:

L2损失函数 L1损失函数
不是非常的鲁棒(robust) 鲁棒
稳定解 不稳定解
总是一个解 可能多个解

  鲁棒性(robustness),根据维基百科,被解释为:

因为与最小平方相比,最小绝对值偏差方法的鲁棒性更好,因此,它在许多场合都有应用。最小绝对值偏差之所以是鲁棒的,是因为它能处理数据中的异常值。这或许在那些异常值可能被安全地和有效地忽略的研究中很有用。如果需要考虑任一或全部的异常值,那么最小绝对值偏差是更好的选择。

从直观上说,因为L2范数将误差平方化(如果误差大于1,则误差会放大很多),模型的误差会比L1范数来得大( e vs e^2 ),因此模型会对这个样本更加敏感,这就需要调整模型来最小化误差。如果这个样本是一个异常值,模型就需要调整以适应单个的异常值,这会牺牲许多其它正常的样本,因为这些正常样本的误差比这单个的异常值的误差小。

  稳定性,根据维基百科,被解释为:

最小绝对值偏差方法的不稳定性意味着,对于数据集的一个小的水平方向的波动,回归线也许会跳跃很大。在一些数据结构(data configurations)上,该方法有许多连续解;但是,对数据集的一个微小移动,就会跳过某个数据结构在一定区域内的许多连续解。(The method has continuous solutions for some data configurations; however, by moving a datum a small amount, one could “jump past” a configuration which has multiple solutions that span a region. )在跳过这个区域内的解后,最小绝对值偏差线可能会比之前的线有更大的倾斜。相反地,最小平方法的解是稳定的,因为对于一个数据点的任何微小波动,回归线总是只会发生轻微移动;也就说,回归参数是数据集的连续函数。

下面的图是用真实数据和真实拟合模型生成的:

这里使用的基本模型为梯度提升回归(GradientBoostingRegressor),使用L1范数和L2范数作为损失函数。绿线和红色分别代表了模型使用L1范数与L2范数作为损失函数时的情形。实线代表了训练的模型中不含有异常值(橙色)的情形,虚线代表了训练的模型中含有异常值(橙色)的情形。
  我缓慢地将这个异常值从左向右移动,使得它在中间时不那么异常,而在左右两边时更加异常。当这个异常值不那么异常时(在中间的情形),在拟合直线的时候,L2范数的变动较小,而L1范数的表动较大。
  当这个异常值更加异常(上左位置,下右位置,它们离左、右两边更加远)时,这两个范数都有大的变动,但是再一次地,L1范数总体上比L2范数变动更大。
  通过数据可视化,我们能够对这两个损失函数的稳定性有更好的认知。

作为正规化

  在机器学习中,正规化是防止过拟合的一种重要技巧。从数学上讲,它会增加一个正则项,防止系数拟合得过好以至于过拟合。L1与L2的区别只在于,L2是权重的平方和,而L1就是权重的和。如下:

最小平方损失函数的L1正则化:

最小平方损失函数的L2正则化:

它们的性质的区别能快速地总结如下:

L2正则化 L1正则化
计算效率高(因为有解析解) 在非稀疏情形下计算效率低
非稀疏输出 稀疏输出
无特征选择 内置特征选择

  解的唯一性是一个更简单的性质,但需要一点想象。首先,看下图:

绿色的线(L2范数)是唯一的最短的路径,而红色、蓝色、黄色线条(L1范数)都是同一路径,长度一样(12)。可以将其扩展至n-维的情形。这就是为什么L2范数有唯一解而L1并不是。
  内置特征选择是L1范数被经常提及的有用的性质,而L2范数并不具备。这是L1范数的自然结果,它趋向于产生稀疏的系数(在后面会解释)。假设模型有100个系数,但是仅仅只有其中的10个是非零的,这实际上是说“其余的90个系数在预测目标值时都是无用的”。L2范数产生非稀疏的系数,因此它不具备这个性质。
  稀疏性指的是一个矩阵(或向量)中只有少数的项是非零的。L1范数具备性质:产生许多0或非常小的系数和少量大的系数。
  计算效率。L1范数没有一个解析解,但是L2范数有。这就允许L2范数在计算上能高效地计算。然而,L1范数的解具备稀疏性,这就允许它可以使用稀疏算法,以使得计算更加高效。

L1与L2损失函数和正则化的区别的更多相关文章

  1. L1、L2损失函数、Huber损失函数

    L1范数损失函数,也被称为最小绝对值偏差(LAD),最小绝对值误差(LAE) L2范数损失函数,也被称为最小平方误差(LSE) L2损失函数 L1损失函数 不是非常的鲁棒(robust) 鲁棒 稳定解 ...

  2. L0,L1,L2范数,正则化,过拟合

    L0范数是指向量中非0元素的个数 L1范数是向量中各个元素的绝对值求和 L2范数是指向量的各个元素平方求和然后取和的平方根 机器学习的目的是使学习到的模型不仅对已知的数据而且对未知的数据有很好的预测能 ...

  3. Spark2.0机器学习系列之12: 线性回归及L1、L2正则化区别与稀疏解

    概述 线性回归拟合一个因变量与一个自变量之间的线性关系y=f(x).       Spark中实现了:       (1)普通最小二乘法       (2)岭回归(L2正规化)       (3)La ...

  4. 正则化项L1和L2

    本文从以下六个方面,详细阐述正则化L1和L2: 一. 正则化概述 二. 稀疏模型与特征选择 三. 正则化直观理解 四. 正则化参数选择 五. L1和L2正则化区别 六. 正则化问题讨论 一. 正则化概 ...

  5. L0/L1/L2范数的联系与区别

    L0/L1/L2范数的联系与区别 标签(空格分隔): 机器学习 最近快被各大公司的笔试题淹没了,其中有一道题是从贝叶斯先验,优化等各个方面比较L0.L1.L2范数的联系与区别. L0范数 L0范数表示 ...

  6. L0、L1、L2范数正则化

    一.范数的概念 向量范数是定义了向量的类似于长度的性质,满足正定,齐次,三角不等式的关系就称作范数. 一般分为L0.L1.L2与L_infinity范数. 二.范数正则化背景 1. 监督机器学习问题无 ...

  7. 正则化项L1和L2的区别

    https://blog.csdn.net/jinping_shi/article/details/52433975 https://blog.csdn.net/zouxy09/article/det ...

  8. L1和L2:损失函数和正则化

    作为损失函数 L1范数损失函数 L1范数损失函数,也被称之为最小绝对值误差.总的来说,它把目标值$Y_i$与估计值$f(x_i)$的绝对差值的总和最小化. $$S=\sum_{i=1}^n|Y_i-f ...

  9. 神经网络损失函数中的正则化项L1和L2

    神经网络中损失函数后一般会加一个额外的正则项L1或L2,也成为L1范数和L2范数.正则项可以看做是损失函数的惩罚项,用来对损失函数中的系数做一些限制. 正则化描述: L1正则化是指权值向量w中各个元素 ...

随机推荐

  1. Django积木块五——分页

    分页 django本身带有分页功能,为什么要用他呢?因为它的代码更为简洁,并且在做筛选的时候会把url中的所有参数都组装起来,并且加上分页.也就是做筛选中的结果也可以用这个分页. pip instal ...

  2. [转] KVM VirtIO paravirtualized drivers: why they matter

    http://www.ilsistemista.net/index.php/virtualization/42-kvm-virtio-paravirtualized-drivers-why-they- ...

  3. 吴恩达机器学习笔记30-神经网络的反向传播算法(Backpropagation Algorithm)

    之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的ℎ

  4. 一些能体现个人水平的SQL语句[总结篇]

    作为一名小小的开发人员,刚入门的时候觉得很难,过了一段时间之后,发现很简单,很快就可以搞定很bug了.然而这并不能说明你就已经很牛掰了,只能说,你不了解其他太多的东西.应该说,数据库有几个共同的命令, ...

  5. Spring整合MyBatis 你get了吗?

    Spring整合MyBatis 1.整体架构dao,entity,service,servlet,xml 2..引入依赖 <dependencies> <dependency> ...

  6. python通过手机抓取微信公众号

    使用 Fiddler 抓包分析公众号 打开微信随便选择一个公众号,查看公众号的所有历史文章列表 在 Fiddler 上已经能看到有请求进来了,说明公众号的文章走的都是HTTPS协议,这些请求就是微信客 ...

  7. 原生js的简单倒计时

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>倒计 ...

  8. 深入理解JavaScript原型:prototype,__proto__和constructor

    JavaScript语言的原型是前端开发者必须掌握的要点之一,但在使用原型时往往只关注了语法,其深层的原理并未理解透彻.本文结合笔者开发工作中遇到的问题详细讲解JavaScript原型的几个关键概念, ...

  9. 使用 Kubeadm 安装部署 Kubernetes 1.12.1 集群

    手工搭建 Kubernetes 集群是一件很繁琐的事情,为了简化这些操作,就产生了很多安装配置工具,如 Kubeadm ,Kubespray,RKE 等组件,我最终选择了官方的 Kubeadm 主要是 ...

  10. mysql 开发进阶篇系列 19 MySQL Server(innodb_flush_log_at_trx_commit与sync_binlog)

    一. innodb_flush_log_at_trx_commit 这个参数名称有个log,一看就是与日志有关.是指:用来控制缓冲区(log buffer)中的数据写入到日志文件(log file), ...