diff --git a/ml/linear regression/images/overfitting.jpeg b/ml/linear regression/images/overfitting.jpeg new file mode 100644 index 0000000..921b676 Binary files /dev/null and b/ml/linear regression/images/overfitting.jpeg differ diff --git a/ml/linear regression/linear regression.md b/ml/linear regression/linear regression.md index f789fc7..5669efb 100644 --- a/ml/linear regression/linear regression.md +++ b/ml/linear regression/linear regression.md @@ -22,12 +22,12 @@ + 过拟合 - 过拟合概述与产生原因,解决方案 - 正则化的损失函数 - + 梯度下降法:仍然是凸函数 - + 规范方程法:一定是可逆阵 + - 规范方程法:一定是可逆阵 + - 梯度下降法:仍然是凸函数 ## 摘要 -这篇文章主要介绍线性回归问题。任何一种统计学习方法都由三个要素组成,即**模型**,**策略**以及**算法**;所谓模型,就是本文中的**假设函数**(`hypothesis function`),策略或者评价准则,即本文中的**损失函数**,而算法,则是选取最优模型的方法。本文将从这三个方面对线性回归问题进行总结。 +这篇文章主要介绍线性回归问题。任何一种统计学习方法都由三个要素组成,即**模型**,**策略**以及**算法**。所谓模型,就是本文中的**假设函数**(`hypothesis function`);策略或者评价准则,即本文中的**损失函数**;而算法,则是选取最优模型的方法。本文将从这三个方面对线性回归问题进行总结。 第一部分阐述了线性回归问题的基本概念,给出了它的假设函数以及损失函数的数学表达式,并且指出**平方损失函数**在本质上与**最大似然估计**无异。接下来的两个部分,分别阐述了求解该模型的两种算法,即**梯度下降法**与**规范方程法**,给出了两种方法的数学推导与数学表达式,并就实际应用中可能存在的问题进行讨论。最后,介绍了在统计学习中常见的一个问题——**过拟合**,并且就解决过拟合问题的常见方法——**正则化**(`regularization`)进行了深入的探讨。 @@ -135,10 +135,8 @@ $$ 学习率的选择在梯度下降法中至关重要。如果学习率太小,则需要更多次迭代才能找到最优解,需要较长的学习时间;而如果学习率太大,也有可能导致收敛速度慢,甚至可能会发散。这是因为学习率太大时,不再满足全微分方程中微小变化量的条件,因此每次迭代后被优化函数都未必可以取到比上一次迭代更小的值。学习率的选择对$J(\theta)$收敛速度的影响如下图所示: - - 可以看到,当$\alpha$很小时(如图中红色曲线所示),损失函数$J(\theta)$收敛速度较慢。随着$\alpha$逐渐增大,曲线逐渐变得陡峭,收敛速度越来越快。可是当$\alpha$很大时($\alpha = 1.3$,图中黑色曲线)收敛速度反而相对此前变慢了;$\alpha$继续增大将导致代价函数发散(图中洋红色曲线)。 因此,理想的方案是选择这样一个$\alpha$,它应该处于收敛与发散的临界点,一方面保证被优化函数最终收敛,另一方面还要有较快的收敛速度。 @@ -180,7 +178,7 @@ $$ 容易看出, $$ -H = X^TX +H = \frac{1}{m}X^TX $$ 因此$H$显然是一个**半正定矩阵**,根据凸函数判别的充分条件,可以得出平方损失函数为凸函数。 @@ -203,30 +201,15 @@ $$ ## 规范方程 -## 过拟合 +> 规范方程的直觉理解 -> 规范方程法的推导 - -假设函数(hypothesis)$h_\theta(x)$满足 +前面提到假设函数的表达式为 $$ -h_\theta(x) = \theta^Tx = \theta_0x_0 + \theta_1x_1 + ... + \theta_nx_n = \Sigma_{i = 0}^{n}\theta_ix_i +h_\theta(x) = \theta^Tx = x^T\theta $$ -因此,平方损失函数(cost function)$J(\theta)$可以写作 - -$$ -J(\theta) = \frac{1}{2m}\Sigma_{i = 1}^m[h_\theta(x^{(i)}) - y^{(i)}]^2 -$$ - -参数$\theta$应该是使$J(\theta)$最小的一组列向量。由多元函数极值可知,$\theta$应该满足: - -$$ -\frac{\partial}{\partial \theta_j}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^m[h_\theta(x^{(i)}) - y^{(i)}]x_j^{(i)} = 0 -$$ -解上述方程即可以得到$\theta$的解析解。 - -为了简单起见,下面用矩阵形式来对$J(\theta)$进行表述。矩阵$X, Y, \theta$可以分别表示为 +设样本容量为$m$,则输入$X$以及对应的输出$Y$都可以写成矩阵的形式 $$ X = \left[ @@ -254,7 +237,44 @@ Y = \left[ \end{matrix} \right] $$ -所以$J(\theta)$可以写作 + +这样,就可以把假设函数也写成矩阵形式 + +$$ +Y = X\theta +$$ + +为了得到$\theta$,只需求解该矩阵方程,为此将等式的两边同时乘以$X^T$ + +$$ +X^TY = X^TX\theta +$$ + +所以 + +$$ +\theta = (X^TX)^{-1}X^TY +$$ + +这就是规范方程法的数学表述。以下就这个结论给出严格推导。 + +> 规范方程法的推导 + +平方损失函数(cost function)$J(\theta)$可以写作 + +$$ +J(\theta) = \frac{1}{2m}\Sigma_{i = 1}^m[h_\theta(x^{(i)}) - y^{(i)}]^2 +$$ + +参数$\theta$应该是使$J(\theta)$最小的一组列向量。由多元函数极值可知,$\theta$应该满足: + +$$ +\frac{\partial}{\partial \theta_j}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^m[h_\theta(x^{(i)}) - y^{(i)}]x_j^{(i)} = 0 +$$ + +解上述方程即可以得到$\theta$的解析解。 + +为了简单起见,下面用矩阵形式来对$J(\theta)$进行表述。所以$J(\theta)$可以写作 $$ J(\theta) = \frac{1}{2m}(X\theta - Y)^T(X\theta - Y) = \frac{1}{2m}(\theta^TX^TX\theta - 2Y^TX\theta + Y^TY) @@ -272,21 +292,65 @@ $$ \theta = (X^TX)^{-1}X^TY $$ -> 引入正则化项的规范方程推导 +该结论与上面的直觉理解完全一致。 -为了避免过拟合(overfitting),在损失函数$J(\theta)$中添加正则化项(`regularization term`),所以 +> 规范方程法存在的问题 + +需要注意的是,在实际应用中,$X^TX$往往是不可逆的,比如当特征的数量多于样本容量时。因此,往往是通过对$X^TX$求伪逆,来代替$(X^TX)^{-1}$。 + +> 梯度下降法与规范方程法的比较 + +在通常情况下,当样本的特征比较少时,比如特征数少于10000时,选择规范方程法会有比较好的效果;而当样本数量太多,则应该选择梯度下降法来对模型进行求解。 + +这是因为,在规范方程法中,涉及到矩阵的求逆运算,其时间复杂度是$O(n^3)$,因此当模型的特征太多时,该逆矩阵的计算会消耗大量的时间。反之,即使特征数量非常多,梯度下降法也仍然具有较好的性能。 + +## 过拟合 + +> 过拟合概述 + +过拟合是统计学习中非常常见的一个问题,它是指模型的选择过于复杂,因而可以在训练集上得到很好的训练效果,使得损失函数接近于零,可是却难以将该模型**泛化**(`generalize`)到其他应用场合,比如说在一个新的测试集上预测准确率就会非常低下。**欠拟合**,正常拟合,以及过拟合的关系如下图所示 + +![overfitting](images.overfitting.jpeg) + +可以看到,第一张图中的模型选择过于简单,用线性函数去拟合一个多项式回归问题,发生了欠拟合;第三张图的模型则过于复杂,用了一个非常高阶的多项式来拟合一个简单问题,发生了过拟合。 + +关于过拟合,我想到这样一个直观的理解:训练模型的过程就好比一个人复习考试的过程,一种复习方案是深入理解题目背后的原理和知识点,另一种复习方案则是把每个题目都记忆下来。显然后者在训练集上会有出色的表现,如果记忆里足够好,甚至可以达到100%的正确率,可是在实际考试过程中,遇到的都是他从未记忆过的题目,此时就束手无策了。第二种复习方案就是这里的过拟合。 + +过拟合会发生,主要是因为模型选择过于复杂,选择的特征太多。因此,一种解决过拟合的方案,就是手动剔除一些不重要的特征,简化模型,或者可以使用**模型选择算法**(`model selection algorithm`),后者将在后面的文章中提到。另一种更加常见的方案,就是下面要重点阐述的正则化。 + +> 正则化的损失函数 + +考虑这样一种情况,当前模型的假设函数为 + +$$ +h_\theta(x) = \theta_0 + \theta_1x + \theta_2x^2 + \theta_3x^3 + \theta_4x^4 +$$ + +为了避免发生过拟合,我可以限制$\thete_3, \theta_4$的大小,使得高阶项具有相对更小的权重。具体的方案是在损失函数中对$\theta_3, \theta_4$添加**罚项**(`penalty`),比如 + +$$ +J(\theta) = \frac{1}{2m}\Sigma_{i = 1}^m[h_\theta(x^{(i)}) - y^{(i)}]^2 + 1000\theta_3^2 + 1000\theta_4^2 +$$ + +这样,为了使$J(\theta)$取到最小值,$\theta_3, \theta_4$的取值必然相对较小,因此在一定程度上简化了模型。 + +在实际应用中,很难知道哪一些特征会导致模型过拟合,因此常见的方案是对每一个$\theta_j$,都添加一个上述的罚项,也称为**正则化项**(`regularized term`)。这样,正则化的损失函数就有以下的形式: $$ J(\theta) = \frac{1}{2m}[\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\Sigma_{i = 1}^n\theta_i^2] $$ -同样可以利用多元函数极值,令 +需要注意的是,这里并没有对$\theta_0$引入正则化项,老师说这是一种约定俗成,并没有特别的原因。使用梯度下降法或者规范方程法,就可以求得在正则化下的最优参数$\theta$了。 + +> 引入正则化项的规范方程推导 + +为了令引入正则化项的$J(\theta)$取到最小值,同样可以利用多元函数极值,令 $$ \frac{\partial}{\partial \theta_j}J(\theta) = 0 $$ -逐个求解出$\theta_j$,在此不再赘述。 +逐个求解出$\theta_j$,就可以得到最优的一组$\theta$,在此不再赘述。 为了简化问题,仍然用矩阵形式表示$J(\theta)$,所以 @@ -327,6 +391,7 @@ $$ \end{matrix} \right])^{-1}X^TY $$ + 需要说明的是,正则化项的引入不仅解决了过拟合的问题,还使得新的矩阵 $$ X^TX + \lambda I @@ -392,3 +457,47 @@ $$ $$ 因此两者之和也必定是一个半正定矩阵。由于此前已经得到$X^T + \lambda I$可逆,故不存在为零的特征值,所以所有特征值都必定大于零,因此$X^T + \lambda I$是一个正定矩阵。 + +> 引入正则化项的梯度下降法 + +关于梯度下降法自然不必多说,这里主要证明,引入正则化项后的平方损失函数仍然是凸函数,因此使用梯度下降法仍然可以收敛到全局最优点。 + +再次给出$J(\theta)$的表达式 + +$$ +J(\theta) = \frac{1}{2m}[\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\Sigma_{i = 1}^n\theta_i^2] +$$ + +所以有 + +$$ +\frac{\partial}{\partial \theta_0}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)}\\\\ +\frac{\partial}{\partial \theta_j}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} + \frac{1}{m}\theta_j\ (j \ne 0) +$$ + +$$ +\frac{\partial^2}{\partial \theta_0^2}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^mx_0^{(i)}x_0^{(i)}\\\\ +\frac{\partial^2}{\partial \theta_j^2}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^mx_j^{(i)}x_j^{(i)} + \frac{\lambda}{m}\ (j \ne 0)\\\\ +\frac{\partial^2}{\partial \theta_j\partial \theta_k}J(\theta) = \frac{1}{m}\Sigma_{i = 1}^mx_j^{(i)}x_k^{(i)} \ (j \ne k) +$$ + +因此,可以写出`Hessian`矩阵 + +$$ +H = \frac{1}{m}\left[ + \begin{matrix} + \Sigma_{i = 1}^mx_0^{(i)^2} & \Sigma_{i = 1}^mx_0^{(i)}x_1^{(i)} & \cdots & \Sigma_{i = 1}^mx_0^{(i)}x_n^{(i)}\\\\ + \Sigma_{i = 1}^mx_1^{(i)}x_0^{(i)} & \Sigma_{i = 1}^mx_1^{(i)^2} + \lambda & \cdots & \Sigma_{i = 1}^mx_1^{(i)}x_n^{(i)} \\\\ + \vdots & \vdots & & \vdots&\\\\ + \Sigma_{i = 1}^mx_n^{(i)}x_0^{(i)} & \Sigma_{i = 1}^mx_n^{(i)}x_1^{(i)} & \cdots & \Sigma_{i = 1}^mx_n^{(i)^2} + \lambda\\\\ + \end{matrix} +\right] +$$ + +容易看出, + +$$ +H = \frac{1}{m}(X^TX + \lambda I) +$$ + +上面已经证明了,该矩阵是一个正定矩阵。根据凸函数的充分条件,可以得到正则化后的平方损失函数仍然是一个凸函数。