线性回归中的正则化

今天的话题从线性回归开始,在应对线性回归问题的时候,实质上就是训练1个函数 \(f(X) = \theta^TX = Y\),这个等式可以通过我之前的文章 最小二乘法 来计算,即 \(\theta = (X^TX)^{-1}X^TY\) ,但是由于最小二乘法需要计算矩阵的逆,所以有很多的限制,比如矩阵不可逆 ,又或者矩阵中有 多重共线性 的情况,会导致计算矩阵的逆的时候行列式接近0,对数据很敏感,还有可能在训练模型的时候有过拟合的情况出现(如下图,第3个图的曲线精确的学习到了所有的数据点,显然就是过拟合了),下面这里通过解决实际问题,一点一点推算出来解决这些问题的2种方法:L1L2 正则化。

L2正则化

先说一下L2正则化的思想,开篇提到过,最小二乘法有很多限制和很多弊端,比如 多重共线性 这个问题,由于需要计算矩阵的逆,所以训练出的模型系数往往会比较大_(行列式接近0)_ ,这样模型会很不稳定,所以大牛们就想啊,能不能给最小二乘法加上点 惩罚,让这个系数小一些,模型更稳定,泛化能力更好,于是就有了这个方法。

L2正则化即是在最小二乘法的基础上,加1个对系数的 “惩罚项” ,为了方便计算所以加上的是 L2-norm 的平方,这时候损失函数就为

$$ J(\theta) = \frac{1}{2N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})^2} + \frac{\lambda}{2}||\theta||_2^2\\ $$

这里添加了一个 \(\frac{\lambda}{2} ||\theta||_2^2\) 就是 L2 正则化做的事情,是为了考虑损失的同时还要兼顾模型也就是 \(\theta\) 的大小,不让 \(\theta\) 变成1个很大的数,从而避免过拟合或者说让模型更简单,泛化能力更强,然后对 \(J(\theta)\) 求导。

$$ \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})x_j} + \lambda \theta_j\\ $$
$$ \begin{aligned} \theta_j^{'} &= \theta_j - \alpha\frac{\partial J(\theta)}{\partial \theta_j}\\ &= \theta_j - \alpha(\frac{1}{N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})x_j} + \lambda\theta_j)\\ &= \theta_j - \alpha \lambda \theta_j - \alpha(\frac{1}{N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})x_j})\\ &=(1-\alpha\lambda)\theta_j - \alpha(\frac{1}{N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})x_j}) \end{aligned}\\ $$

这里根据推导我们就能看出来, \( \alpha\frac{1}{N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})x_j}\) 这部分就是普通的 批量梯度下降 ,同时 \( \alpha\)\(\lambda\) 都是一个 小于1 的比较小的数字,所以这里做的就是在每次迭代的时候,把 \( \theta_j\) 再缩小一点, “缩小多少” 这个因子则是由 \( \lambda\) 控制的,通过调整 \( \lambda\) 的大小来调整模型是更关注 损失 还是更关注 模型的复杂度

最小二乘法 的角度来思考,也可以直接计算 \( \theta\) 的解析解 \( J(\theta) = ||X\theta - Y||_2^2 +\lambda||\theta||_2^2\),这里省略展开过程,可以得到

$$ \begin{aligned} J(\theta) &= ||X\theta -Y||_2^2 +\lambda||\theta||_2^2\\ &=\theta^TX^TX\theta - 2\theta^TX^TY + Y^TY \lambda \theta^T\theta \end{aligned}\\ $$
$$ \begin{aligned} \frac{\partial J(\theta)}{\partial \theta} &= \frac {\partial (\theta^TX^TX\theta - 2\theta^TX^TY + Y^TY + \lambda \theta^T\theta)}{\partial \theta}\\ &=2X^TX\theta - 2X^TY +\lambda \theta\\ &=2(X^TX+\frac{\lambda I}{2})\theta-2X^TY \end{aligned} $$
$$ \frac{\partial J(\theta)}{\partial \theta} = 2(X^TX+\frac{\lambda I}{2})\theta -2X^TY = 0 $$
$$ \theta = (X^TX+\frac{\lambda}{2}I)^{-1}X^TY $$

这样也是可以直接计算出 \( \theta\) 的,只是加上了1个 \(\frac{\lambda}{2}I\) ,这里有2点需要注意

  1. 有很多普通最小二乘法矩阵不可逆的情况,这里加上了 \( \frac{\lambda}{2}I\) 就变得可逆了,让最小二乘法更通用
  2. \( X^TX\) 由于 \( x_0\) 这项所以是 \( (n+1)\times(n+1)\) 的矩阵,这里的 \( I\) 也应该是 \( (n+1)\times(n+1)\) 的,但是有一点不同就是这里的 \( I\) 实际上是
$$ \left[ \begin{array}{ccccc} 0 & 0 & 0 & \cdots & 0\\ 0 & 1 & 0 & \cdots & 0\\ 0 & 0 & 1 & \cdots & 0\\ \vdots & \vdots & \vdots & \vdots & \vdots\\ 0 & 0 & 0 & \cdots &1 \end{array} \right]\\ $$

因为这里并不需要对 \( \theta_0\) 这个 偏置项 做缩放,这种线性回归方法我们也叫做 岭回归(Ridge Regression) ,即加了 L2-norm 正则化的线性回归。

L1正则化

这里和L2有点不同: L2虽然很优秀,计算出来的系数更稳定,但是多重共线性仍然存在,有没有一种类似这种添加惩罚项的办法来解决掉多重共线性的问题?其实这里很自然的就想到,把L2 正则化中的惩罚项替换成 L0-norm (系数中非0的个数),这样模型就更简单了,无关的维度系数为0,即是去除掉该维度,但是L0-norm 又有很多问题(函数非连续,很难求解),所以用 L1-norm (系数的绝对值)来近似地取代 L0-norm

L1 正则化的推导公式跟 L2 正则化的推导类似,区别主要在添加的惩罚项部分,所以为了理解这里可以这么写这个损失函数

$$ J(\theta) = \frac{1}{2N}\sum_{i=1}^{N}{(H_\theta(x^{(i)})-y^{(i)})^2} + \lambda||\theta||_1 = J_0(\theta) + J_1(\theta)\\ $$

\( J_0(\theta)\) 为一般线性回归部分, \(J_1(\theta)\)L1-norm 部分 \(\frac{\partial J(\theta)}{\partial \theta} = \lambda\times sgn(\theta)+ \frac{\partial J_0(\theta)}{\partial \theta}\) ,梯度下降更新 \(\theta\) 的时候即是 \(\theta_j^{'} = \theta_j - \alpha \lambda sgn(\theta_j) - \alpha\frac{\partial J_0(\theta)}{\partial \theta}\)

其中 \(\alpha \lambda sgn(\theta_j)\) 项,当 \(\theta_j > 0\) 时,更新后 \( \theta_j\) 变小,当 \(\theta_j < 0\) 时,更新后 \( \theta_j\) 变大,所以这里的效果就是让 \( \theta_j\) 往0上靠拢,让 \( \theta\) 中尽可能多的为0,也就是常说的让 \( \theta\) 更稀疏 ,所以说 L1 正则化可以 优化过拟合和做特征选择 ,因为为0的 \( \theta_j\) 就是不重要的特征,但是这里有一个问题,当 \( \theta_j=0\) 的时候怎么办?因为此时 \(\theta\) 是不可导的,所以粗暴一点就是按照普通最小二乘法的方式去迭代,也就是去掉 \( \alpha \lambda sgn(\theta_j)\) 项或者令其为0,这样就解决了,更通用一点的是利用 坐标下降法 来求解,本质就是控制其他维度,单独调整某一个维度的 \( \theta_j\) ,确定之后再继续调整其他的 \( \theta\) ,也可以解决。

这种线性回归方法我们也叫做 LASSO回归(least absolute shrinkage and selection operator),即加了 L1-norm 的惩罚项的线性回归。

总结 LASSO 和 Ridge 回归

相同点: 都是在线性回归的基础上,添加了一个惩罚项,让模型更稳定更简单,泛化能力更强,避免过拟合。

不同点:LASSO 是利用 L1-norm 来逼近 L0-norm的,因为系数可以减小到0,所以可以做特征选择,但是并不是每个点都是可导的,所以计算起来可能会并没有 L2-norm 方便; Ridge 是利用 L2-norm 来使系数不那么大,同时方便计算,但是不会使系数减小到0,所以不能做特征选择,可解释性方面也没有 LASSO 高。


😛

about me