numpy机器学习 – L2正则化

本文介绍如何推导L2正则化,涉及到数学推导没法事无巨细,所以下面只是一个大概的流程记录。

理论简述

根据前面几篇博客,我们知道通过引入2次项与更高的项次可以解决线性不可分的数据分布问题,此时分类的边界线呈现出弧线效果。

但是如果我们对输入x向量做太高的次方项的话,模型训练就容易”过于拟合”训练数据,反而对测试集的表现就不好了,这是我们认为模型过于复杂了,如果不能有更大量的训练样本来学习的话,那么就表现为泛化能力差。

遇到”过拟合”的话,可以减少模型的N次项来降低模型复杂度以便让分界线更直一些即可,另外一种思路就是使用”正则化”技术。

以回归问题为例,下面分别是原先的目标函数,我们的目标是不停的调整theta来令函数值尽量小:

该目标函数里面只会涉及到theta的2次项,所以其函数曲线如下:

也就是说通过不停的求偏导数修正theta(梯度下降),最终theta会调整到4到5之间,整个目标函数接近了最小值,这就是我们机器学习的核心要义啊。

现在我们定义R为正则项,把它加入到目标函数中:

R项也是关于theta的函数,我们把原目标函数与正则项函数的曲线画出来:

因为新的目标函数是原目标函数+正则项函数,所以我们把2个曲线的高度想加,画出想加后的曲线:

深色的曲线就是新的目标函数,它取最小值时的横坐标(theta)更接近于0,也就是说同样是优化目标函数,加入正则项后这个theta的取值会更小,对于最终学习后的回归函数来说就意味着:

可能x二次方项式前面的theta值几乎为0,这样的话回归函数就相当于被正则化惩罚为了1次项模型,因此曲线不会那么弯曲,也就避免了过拟合。

至于正则化项前面的lambda系数,如果为0就相当于不应用正则化:

否则lambda越大则正则化的曲线越收拢在y轴,可以把目标函数取最小值时的theta位置也拉向theta=0的位置,也就是会导致theta更小,即更大程度的打压了”过拟合”情况:

对于逻辑回归分类的目标函数来说,优化目标是概率最大化,所以是”梯度上升”找最大值的位置:

与正则化函数曲线开口向上来拉扯最小值的出现位置是矛盾的,所以只需要取反来把最大化问题转成最小化问题,这样就可以符合上述要求:

上述第一项就是原先的部分,我们只需要对后面正则化这部分求偏导并加入到微分结果里即可。

代码开发

我们以逻辑回归分类器为例。

数据如下:

加载数据,对x1与x2特征分别做标准化:

我们将回归函数做成包含常数项和x1二次项的样子:

我们引入L2正则的强度系数,越大则会导致theta越小,模型的高次项系数就越接近于0,这样分界线就越直:

训练过程关键是原目标函数前面加了负号,将原先的最大化目标函数转成了最小化问题,然后再加上正则化项的偏导数:

最后发现训练出的模型对训练集准确率不是100%,并不能继续完全拟合到训练集:

新目标函数引入了>=0的正则项函数,这个优化目标就不如原先纯粹了,theta系数的平方和与损失似乎没有什么关系,所以引入正则项的目标函数就像是干扰训练一样,使得theta不能达到某种最优,从另一方面看就是theta更加贴近于0,从而使得模型变得“简单”,避免了“过拟合”问题。

如果我们只对x1的二次项theta引入正则化,其他theta不引入正则化,则x1二次项的theta系数几乎为0,分界线几乎变成了直线:

numpy机器学习系列的源码我放在这里:https://github.com/owenliang/numpy-ml

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~