正则化项L1和L2的学习与理解

  • 一,正则化(Regularization)
    • 稀疏模型与特征选择的关系
  • 二, 为什么L1产生稀疏模型而L2可以防止过拟合
    • 1, L1和L2正则化的直观理解
      • 正则化和特征选择的关系
    • 2,梯度角度分析
      • L1正则化
      • L2正则化
    • 3, 从优化问题视角来看
    • 4,从概率的角度看
    • 5, 图的角度
    • 6. 其它角度
  • L2 正则化算法代码

一,正则化(Regularization)

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 ℓ1\ell_1ℓ1​-norm和 ell2ell_2ell2​-norm,中文称作 L1正则化L2正则化,或者 L1范数L2范数

L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。下图是Python中Lasso回归的损失函数,式中加号后面一项α∣∣w∣∣1\alpha||w||_1α∣∣w∣∣1​即为L1正则化项。

下图是Python中**Ridge回归(岭回归)**的损失函数,式中加号后面一项α∣∣w∣∣22\alpha||w||_2^2α∣∣w∣∣22​ 即为L2正则化项。

一般回归分析中www表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。L1正则化和L2正则化的说明如下

  • L1正则化是指权值向量www中各个元素的绝对值之和,通常表示为∣∣w∣∣1||w||_1∣∣w∣∣1​
  • L2正则化是指权值向量www中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为∣∣w∣∣2||w||_2∣∣w∣∣2​
    一般都会在正则化项之前添加一个系数,Python的机器学习包sklearn中用α\alphaα表示,一些文章也用λ\lambdaλ表示。这个系数需要用户指定。
    **那添加L1和L2正则化有什么用?**下面是L1正则化和L2正则化的作用,这些表述可以在很多文章中找到。
  • L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
  • L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合

稀疏模型与特征选择的关系

上面提到L1正则化有助于生成一个稀疏权值矩阵,进而可以用于特征选择。为什么要生成一个稀疏矩阵?

稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0. 通常机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系

二, 为什么L1产生稀疏模型而L2可以防止过拟合

1, L1和L2正则化的直观理解

这部分内容将解释为什么L1正则化可以产生稀疏模型(L1是怎么让系数等于零的),以及为什么L2正则化可以防止过拟合

正则化和特征选择的关系

假设有如下带L1正则化的损失函数
J=J0+a∑w∣w∣(1)J = J_0 +a\sum_w|w| \tag{1} J=J0​+aw∑​∣w∣(1)
其中J0J_0J0​ 是原始的损失函数,加号后面的一项是L1正则化项,α\alphaα是正则化系数。注意到L1正则化是权值的绝对值之和,J是带有绝对值符号的函数,因此J是不完全可微的。机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数J0J_0J0​后添加L1正则化项时,相当于对J0J_0J0​ 做了一个约束。令L=a∑w∣w∣L=a\sum_w|w|L=a∑w​∣w∣, 则J=J0+LJ=J_0+LJ=J0​+L, 此时我们的任务变成在L约束下求出J0J_0J0​ 取最小值的解。考虑二维的情况,即只有两个权值w1w^1w1和w2w^2w2, 此时L=∣w1∣+∣w2∣L=∣w^1∣+∣w^2∣L=∣w1∣+∣w2∣。对于梯度下降法,求解J0J_0J0​ 的过程可以画出等值线,同时L1正则化的函数L也可以在w1w2w^1w^2w1w2 的二维平面上画出来。如下图:


图1 L1正则化
图中等值线是J0J_0J0​的等值线,黑色方形是L函数的图形。L=∣w1∣+∣w2∣L=∣w^1∣+∣w^2∣L=∣w1∣+∣w2∣,这个函数画出来就是一个方框(可以自己动手画一下)。
在图中,当J0J_0J0​等值线与L图形首次相交的地方就是最优解,上图中J0J_0J0​与L在L的一个顶点处相交,这个顶点就是最优解。注意到这个顶点的值是(w1,w2)=(0,w)(w^1,w^2)=(0,w)(w1,w2)=(0,w)。可以直观想象,因为L函数有很多『突出的角』(二维情况下四个,多维情况下更多),J0J_0J0​与这些角接触的机率会远大于与L其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近写),而在这些角上,会有很多权值等于0(因为角就在坐标轴上),这就是为什么L1正则化可以产生稀疏模型,进而可以用于特征选择。

而正则化前面的系数α\alphaα,可以控制L图形的大小。α\alphaα越小,L的图形越大(上图中的黑色方框);α越大,L的图形就越小,可以小到黑色方框只超出原点范围一点点,这是最优点的值(w1,w2)=(0,w)(w^1,w^2)=(0,w)(w1,w2)=(0,w)中的ww可以取到很小的值。

类似地,假设有如下带L2正则化的损失函数:
J=J0+a∑w∣w∣2(2)J = J_0 +a\sum_w|w|^2 \tag{2} J=J0​+aw∑​∣w∣2(2)

同样可以画出他们在二维平面上的图形,如下:

图2 L2正则化
二维平面下L2正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此J0J_0J0​与L相交时使得w1w^1w1或w2w^2w2 等于零的机率小了许多(这个也是一个很直观的想象),这就是为什么L2正则化不具有稀疏性的原因,因为不太可能出现多数w都为0的情况。

2,梯度角度分析

L1正则化

L1正则化的损失函数为:

上式可知,当w大于0时,更新的参数w变小;当w小于0时,更新的参数w变大;所以,L1正则化容易使参数变为0,即特征稀疏化。

L2正则化

L2正则化的损失函数为:

由上式可知,正则化的更新参数相比于未含正则项的更新参数多了

项,当w趋向于0时,参数减小的非常缓慢,因此L2正则化使参数减小到很小的范围,但不为0。

3, 从优化问题视角来看

4,从概率的角度看

5, 图的角度

假设费用函数 L 与某个参数 x 的关系如图所示:

则最优的 x 在绿点处,x 非零。
现在施加 L2 regularization,新的费用函数(L+CX2L + CX^2L+CX2)如图中蓝线所示:


最优的 x 在黄点处,x 的绝对值减小了,但依然非零。
而如果施加 L1 regularization,则新的费用函数(L+C∣X∣L + C|X|L+C∣X∣)如图中粉线所示:

最优的 x 就变成了 0。这里利用的就是绝对值函数的尖峰。两种 regularization 能不能把最优的 x 变成 0,取决于原先的费用函数在 0 点处的导数。如果本来导数不为 0,那么施加 L2 regularization 后导数依然不为 0,最优的 x 也不会变成 0。而施加 L1 regularization 时,只要 regularization 项的系数 C 大于原先费用函数在 0 点处的导数的绝对值,x = 0 就会变成一个极小值点。上面只分析了一个参数 x。事实上 L1 regularization 会使得许多参数的最优值变成 0,这样模型就稀疏了。

6. 其它角度

现在我想从正则化的原因说起, 因为这样的话会比较好理解一点. 正则化就是用来减少模型的复杂度, 那么模型的复杂度是怎么降低的呢? 降低模型复杂度就是从权重参数w入手.

所以我们有两种方式去令更多的w趋向于0, 一种是L1范式, 一种是L2范式.

然后我们来看看L1范式的图像:

损失函数对应的一圈圈等高线, 损失函数的最优解就在圆心处. 而L1范式对应的图形就是下面那个四边形. 当同时满足这两个条件时, 交点在w2轴上, 此时w1=0. 即w1, w2 = [0, 1]. 所以联系到高维空间中, 多个w值为0, 也就是得到一个稀疏解.


而L2正则化为什么不是稀疏解呢?

L2范式的图像:


首先L2范式画出来的是一个圆(W12+W22<=C2W_1^2+W_2^2<=C^2W12​+W22​<=C2), 损失函数最优解依旧在A点. 当同时满足损失函数和L2正则化的最优解落在两个图形的交点处, 此时w1和w2都不为0. 所以L2范式得到的不是稀疏解.

L2 正则化算法代码

三层全连接的网络的L2正则化的算法实现

import numpy as npdef compute_cost_with_regularization(A3, Y, parameters, lambd):"""Implement the cost function with L2 regularization. See formula above.Arguments:A3 -- post-activation, output of forward propagation, of shape (output size, number of examples)Y -- "true" labels vector, of shape (output size, number of examples)parameters -- python dictionary containing parameters of the modelReturns:cost - value of the regularized loss function"""m = Y.shape[1]W1 = parameters["W1"]W2 = parameters["W2"]W3 = parameters["W3"]cross_entropy_cost = compute_cost(A3, Y) # This gives you the cross-entropy part of the costL2_regularization_cost = (1/m)*(lambd/2)*(np.sum(np.square(W1))+np.sum(np.square(W2))+np.sum(np.square(W3)))cost = cross_entropy_cost + L2_regularization_costreturn costdef backward_propagation_with_regularization(X, Y, cache, lambd):""" Implements the backward propagation of our baseline model to which we added an L2 regularization.Arguments:X -- input dataset, of shape (input size, number of examples)Y -- "true" labels vector, of shape (output size, number of examples)cache -- cache output from forward_propagation()lambd -- regularization hyperparameter, scalarReturns:gradients -- A dictionary with the gradients with respect to each parameter, activation and pre-activation variables"""m = X.shape[1](Z1, A1, W1, b1, Z2, A2, W2, b2, Z3, A3, W3, b3) = cachedZ3 = A3 - YdW3 = 1./m * np.dot(dZ3, A2.T) + (lambd/m)*W3db3 = 1./m * np.sum(dZ3, axis=1, keepdims = True)dA2 = np.dot(W3.T, dZ3)dZ2 = np.multiply(dA2, np.int64(A2 > 0))dW2 = 1./m * np.dot(dZ2, A1.T) + (lambd/m)*W2db2 = 1./m * np.sum(dZ2, axis=1, keepdims = True)dA1 = np.dot(W2.T, dZ2)dZ1 = np.multiply(dA1, np.int64(A1 > 0))dW1 = 1./m * np.dot(dZ1, X.T) + (lambd/m)*W1db1 = 1./m * np.sum(dZ1, axis=1, keepdims = True)gradients = {"dZ3": dZ3, "dW3": dW3, "db3": db3,"dA2": dA2,"dZ2": dZ2, "dW2": dW2, "db2": db2, "dA1": dA1,"dZ1": dZ1, "dW1": dW1, "db1": db1}return gradients

求梯度的推导

参考资料
[1] https://blog.csdn.net/jinping_shi/article/details/52433975
[2] https://blog.csdn.net/zouxy09/article/details/24971995
[3] https://www.cnblogs.com/wuliytTaotao/p/10837533.html
[4] https://blog.csdn.net/dpengwang/article/details/88355744
[5] https://www.zhihu.com/question/37096933

[机器学习]正则化项L1和L2的学习与理解相关推荐

  1. 机器学习中正则化项L1和L2

    机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作 L1正则化 和 L2正则化,或者 L1范数 和 L2范数.  图像卷 ...

  2. 机器学习中正则化项L1和L2的直观理解

    文章目录 正则化(Regularization) 稀疏模型与特征选择的关系 L1和L2正则化的直观理解 正则化和特征选择的关系 为什么梯度下降的等值线与正则化函数第一次交点是最优解? L2正则化和过拟 ...

  3. 损失函数中正则化项L1和L2的理解

    正则化(Regularization) 机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1-norm和ℓ2-norm,中文称作L1正则化和L2正则化,或者L ...

  4. 机器学习中的L1和L2正则化项

    关注微信公众号[Microstrong],我写过四年Android代码,了解前端.熟悉后台,现在研究方向是机器学习.深度学习!一起来学习,一起来进步,一起来交流吧! 本文同步更新在我的微信公众号里,地 ...

  5. 机器学习中的L1与L2正则化图解!

    今日锦囊 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化 今天我们来讲讲一个理论知识,也是老生常谈的内容,在模型开发相关岗位中出场率较高的,那就是L1与L2正则化了,这个看似简单却十分重要的概念, ...

  6. 【机器学习基础】一文搞懂机器学习里的L1与L2正则化

    文章来源于SAMshare,作者flora 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化 今天我们来讲讲一个理论知识,也是老生常谈的内容,在模型开发相关岗位中出场率较高的,那就是L1与L2正则化 ...

  7. 【应用】【正则化】L1、L2正则化

    L1正则化的作用:特征选择从可用的特征子集中选择有意义的特征,化简机器学习问题.著名的LASSO(Least Absolute Shrinkage and Selection Operator)模型将 ...

  8. 初学者如何学习机器学习中的L1和L2正则化

    训练机器学习模型的要点之一是避免过拟合.如果发生过拟合,模型的精确度会下降.这是由于模型过度尝试捕获训练数据集的噪声.本文介绍了两种常用的正则化方法,通过可视化解释帮助你理解正则化的作用和两种方法的区 ...

  9. 深度学习正则化(L1 norm/L2 norm)以及dropout理解

    正则化知识其实是深度学习领域较为基础的知识点,初入此门的时候受限于正则化三个字的逼格,一直不求甚解:后期虽然了解但也仅限于L1和L2范数而已.恰巧上周在谢毅博士的课上旁听,讲到过拟合相关知识,后续和捷 ...

最新文章

  1. MongoDB GridFS 存储文件
  2. 滚动触发的翻转式文字引用效果
  3. 商品规格表设计_400㎡美容院装修设计,为什么说无中式不贵气?
  4. 我们再来玩游戏(博弈)
  5. sublime开发python需要安装哪些插件_Sublime text 3搭建Python开发环境及常用插件安装...
  6. js中闭包的概念和用法
  7. 为什么onenote一直在加载_OneNote:科研笔记独一无二的无敌利器
  8. html标记语言 --框架
  9. redhat6.3的linux内核版本,1-6-RHEL6.3-内核升级(Red Hat Enterprise Linux Server6.3)@树袋飘零...
  10. Linux使用jstat命令查看jvm的GC情况(转)
  11. 软件需求规格说明书模板
  12. AutoLayout 讲解
  13. 中国互联网发展报告(2021)
  14. 读书笔记——心理学之影响力
  15. kubuntu我显示服务器,还是不行!kubuntu到底怎么配置IP才能上网啊?[已经解决!]...
  16. html css 扑克牌桌面,CSS Card:纯css制作扑克牌
  17. 请没有买房和买车的朋友一定认真的看一下,看后再做决定吧..
  18. 登录爬取拉勾网2.0 Python selenium
  19. 计算机视觉和机器学习_我从计算机视觉和机器学习硕士课程中学到的东西
  20. Excel中如何输入前面带0的数值

热门文章

  1. Windows Server 2008十大新特性
  2. vs的form标签引起css走样问题
  3. 容器编排技术 -- Kubernetes 中查看Pods和Nodes
  4. Homebrew命令详解
  5. [Linux]gocron定时任务平台的部署
  6. Dockerfile 文件结构、docker镜像构建过程详细介绍
  7. 一个列表包揽所有你需要的Windows应用
  8. 【C语言】一堆数组中存放了10个小于100的整数,请编程对所有数据按照从小到大的顺序进行排序,若个位数相等,则按照十位从小到大的顺序排序,输出排序后的结果...
  9. 软件测试漫谈之谈谈技术之外的事情
  10. jemter的竞品分析