zoukankan      html  css  js  c++  java
  • 关于范数与正则化详解(转)

    L0范数是指向量中非0的元素的个数。 

    L1范数是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。  

    L2范数是指向量各元素的平方和然后求平方根。

    1. 什么是稀疏解?

    如果所得的解只在某(几)个轴上有实数另外的轴为0,从而最终得到稀疏解

    2. L0、L1和L2正则是如何避免过拟合的?

    L0正则化的值是模型参数中非零参数的个数,L1范数是指向量中各个元素绝对值之和,L2正则化标识各个参数的平方的和的开方值。

    先讨论几个问题:

    1)实现参数的稀疏有什么好处吗? 一个好处是可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据就只能呵呵了。另一个好处是参数变少可以使整个模型获得更好的可解释性。

    2)参数值越小代表模型越简单吗? 是的。为什么参数越小,说明模型越简单呢,这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,为了拟合这些异常点,函数的曲线就会变得非常陡,忽高忽低,函数曲线变化剧烈,说明参数值非常大,比如y=2x^2曲线就没有y=100x^2曲线陡峭,所以复杂的模型,往往就是过拟合的结果,其参数值就会比较大。

    根据上面的讨论,稀疏的参数可以防止过拟合,因此用L0范数(非零参数的个数)来做正则化项是可以防止过拟合的,毕竟L0的定义就是要使得非零参数个数最少。从直观上看,利用非零参数的个数,可以很好的来选择特征,实现特征稀疏的效果,具体操作时选择参数非零的特征即可。但因为L0正则化很难求解,是个NP难问题,因此一般采用L1正则化。L1正则化是L0正则化的最优凸近似,比L0容易求解,并且也可以实现稀疏的效果。

    L1正则化之所以可以防止过拟合,是因为L1范数就是各个参数的绝对值相加得到的,我们前面讨论了,参数值大小和模型复杂度是成正比的。因此复杂的模型,其L1范数就大,最终导致损失函数就大,说明这个模型就不够好。

    L2正则化可以防止过拟合的原因和L1正则化一样,只是形式不太一样。L2范数是各参数的平方和再求平方根,我们让L2范数的正则项最小,可以使w的每个元素都很小,都接近于0。但与L1范数不一样的是,它不会是每个元素为0,而只是接近于0。越小的参数说明模型越简单,越简单的模型越不容易产生过拟合现象。

    3. L1和L2的对比,以及L1如何得到稀疏解的?

    对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)

    我们考虑两维的情况,在(w1, w2)平面上可以画出目标函数的等高线,而约束条件则成为平面上半径为C的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:

    可以看到,L1-ball与L2-ball的不同就在于L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性。

    相比之下,L2-ball就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1能产生稀疏性,而L2不行的原因了。

    因此,一句话总结就是:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,但这些特征都会接近于0。在所有特征中只有少数特征起重要作用的情况下,选择Lasso比较合适,因为它能自动选择特征。而如果所有特征中,大部分特征都能起作用,而且起的作用很平均,那么使用Ridge也许更合适。Lasso不仅可以作为正则化手段,其在特征选择时候非常有用,而Ridge就只是一种规则化而已。

    4. 总结一下

    L1范数主要是为了:1,得到稀疏解,可以用于特征选择;2,其次可以预防过拟合; L2范数主要是为了:防止过拟合,并且一般都选择L2范数来防止过拟合。

    需要搞清楚以下问题:1,为什么L1可以得到稀疏解;2,L1和L2防止过拟合的原理差别;3,什么时候选择L1或L2。

  • 相关阅读:
    leetcode58. 最后一个单词的长度 🌟
    leetcode53. 最大子序和 🌟
    leetcode38. 报数 🌟
    leetcode35. 搜索插入位置 🌟
    leetcode28. 实现strStr() 🌟
    ⚠️ Python 循环列表删除元素的注意事项
    leetcode27. 移除元素 🌟
    leetcode26. 删除排序数组中的重复项 🌟
    javascript 高阶函数 currying & uncurrying
    javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming
  • 原文地址:https://www.cnblogs.com/gczr/p/6547182.html
Copyright © 2011-2022 走看看