过拟合解决方案之正则化

1.过拟合问题

对于过拟合问题,一般缘由是模型选择太过复杂,也有多是训练数据太少。对于模型太复杂的状况,咱们通常有以下考虑:一是经过分析删除部分特征(好比重复多余的特征或者对输出值贡献不太大的特征),可是这样有可能会损失一部分信息。因此,咱们能够经过正则化的方法来下降参数值,从而避免过拟合问题。对于过拟合问题的详细描述,能够查看个人另外一篇博客机器学习之欠拟合与过拟合html

2.正则化

回顾一下,在回归问题中,在肯定模型以后,要根据该损失函数找出使得损失函数最小的参数矩阵。在整个回归过程当中,最为重要的一步是肯定回归模型。一般状况下,若是选择的模型太简单,就会欠拟合。若是模型选择太复杂,就会过拟合。正则化能够很好地解决之一问题,经过对某些参数进行“惩罚”,就能够达到下降参数值的目的。正则化的方法有不少,这里仅介绍L1正则化和L2正则化,对应的分别是Lasson回归和Ridge回归。正则化就是在损失函数中加入正则项(用\(\Omega(\theta)\)表示),L1正则对应的正则项为:\(L1 = \lambda\sum_{i=1}^n|\theta_i|\),L2对应的正则项是:\(L2 = \lambda\sum_{i=1}^n\theta_i^2\)。例如线性回归的正则化损失函数为:机器学习

\[J(\theta)={1\over 2m} \sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2 + \Omega(\theta)\tag{2.1}\]函数

逻辑回归的正则化损失函数为:学习

\[J(\theta)= \dfrac{1}{m}\sum_{i=1}^m[-y^{(i)}ln(h_\theta(x^{(i)}))-(1-y^{(i)})ln(1-h_\theta(x^{(i)}))] +\Omega(\theta) \tag{2.2}\]spa

3.L1正则与L2正则的不一样
3.1L1正则

在介绍L1正则以前,咱们有必要了解一下L0范数,L0范数表示向量中非零元素的个数,其数学表达式为:htm

\[||x||_0 = \sum_{j=1}^{|x|} x_j \neq 0?1:0 \tag{3.1.1}\]blog

若是咱们使用L0范数做为正则项(即\(\Omega(\theta)=\lambda||\theta||_0\)),那就说明咱们但愿权向量\(w\)当中的大部分元素都是零。L0正则更通俗的解释是:若是要增长模型复杂度来增强模型的表达能力,对于增长的每一个参数,咱们都要进行这样的考量----该参数不为0时对初始损失函数(即不加正则项的损失函数)的下降程度是否达到\(\lambda\)。若是不足\(\lambda\),咱们认为增长这样的复杂度是得不偿失的。经过L0正则,可使模型稀疏化,而且在必定程度上实现了特征选择(若是某个参数为0,至关于摒弃了该参数对应的样本特征)。可是因为L0正则项不连续、不可导、也不是凸函数,因此最小化L0正则损失函数是一个NP问题,至关复杂。因此咱们须要更为有效的方式----L1正则。L1范数是L0范数最优凸近似,比L0范数更容易求得最优解。因此咱们能够用L1正则来近似代替L0正则。若是采用L1正则,那么损失函数就变为:get

\[J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n|\theta_i|) \tag{3.1.2}\]博客

对参数求偏导数的结果就是:数学

\[\dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda sgn(\theta_i)\quad (i = 1,2,\dots,n) \tag{3.1.3}\]

在梯度降低法中,对应的参数更新方式为:

\[\theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \alpha\dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} \lambda sgn(\theta_i)) \quad (i = 1,2,\dots,n) \tag{3.1.4} \]

上述各式中,\(J(\theta_0)\)表示初始损失函数(即未添加正则项的损失函数),sgn为符号函数。正则项和\(\theta_0\)无关是由于\(\theta_0\)与任何特征项都无关(即不对应任何\(x_i\)),因此\(\theta_0\)对过拟合的影响并不大,也就不须要在正则项中引入。

3.2L2正则

L0和L1正则都会使参数矩阵变得稀疏(即存在不少为0的元素),对样本特征有所舍弃,虽然对减少方差颇有做用,但一般这会使误差变大。那么有没有什么方法可使方差变小的同时,误差又不会变得太大呢?L2正则就能够解决这一问题。L2范数的数学表达式的直观解释是参数的平方的\(\lambda\)倍求和,若是采用L2范数做为正则项,这会让部分参数值很是小,接近于0,但并非等于0。这就保证了不会舍弃样本特征,只是让特征对应的权重变小。一样能够起到减少方差的做用,而且误差不会变得太大。若是采用L1正则,那么损失函数就变为:

\[J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n\theta_i^2 \tag{3.2.1}\]

对参数求偏导数的结果就是:

\[\dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.1.2}\]

在梯度降低法中,对应的参数更新方式为:

\[\theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} 2\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.2.3} \]

上述各式中,\(J(\theta_0)\)表示初始损失函数(即未添加正则项的损失函数)。(不要纠结于系数,m和2m都是同样的,只是方便求偏导时约去1/2)。

对于线性回归来讲,初始损失函数\(J(\theta)_0 =\dfrac{1}{2m}\sum_\limits{i=0}^m(y^{(i)}-h_\theta(x^{(i)}))^2\)

加入正则项后,最小二乘法求解结果为:\(\theta = \left(X^TX+\lambda \left[\begin{matrix} 0 \\ &1 \\ & & 1 \\ & & &\ddots \\ & & & & 1 \end{matrix} \right]\right)^{-1}X^TY\)

对于逻辑回归来讲,初始损失函数\(J(\theta)_0= \dfrac{1}{m}\sum_{i=1}^m[-yln(h_\theta(x))-(1-y)ln(1-h_\theta(x))]\)

4.总结

对于过拟合问题,咱们能够采用正则化来解决。在机器学习中,咱们通常会使用L2正则。在使用正则化的时候,要注意正则化参数\(\lambda\)的选择。若是\(\lambda\)过小,那么正则项几乎就没有起到做用,也就没法解决过拟合问题;若是\(\lambda\)太大,这时除了\(\theta_0\)之外的其余参数\(\theta_i(i = 1,2,\dots,n)\)就会很小,最后获得的模型几乎就是一条水平直线,会出现欠拟合问题。

相关文章
相关标签/搜索