【Andrew Ng】机器学习(1):线性回归

这里介绍机器学习的基本概念以及采用梯度下降、正规方程建立线性回归模型的方法。

基本概念

1959年,IBM科学家Arthur Samuel开发了一个跳棋程序。通过这个程序,塞缪尔驳倒了普罗维登斯提出的机器无法超越人类,像人类一样写代码和学习的模式。他创造了“机器学习”,并将它定义为“可以提供计算机能力而无需显式编程的研究领域”

1998年,卡内基梅隆大学的Tom MitChell给出了一种更为形式化的定义:假设用P来估计计算机程序在某任务类T上的性能,若一个程序通过利用经验E在任务T上获得了性能改善,我们则称关于T和P,该程序对E进行了学习。

通常,大部分机器学习问题都可以划分为监督学习(Supervised Learning)无监督学习(Unsupervised Learning)两类:

  • 监督学习:给定的数据集中已经包含了正确的输出结果,希望机器能够根据这些数据集学习一个模型,使模型能够对任意的输入,对其对应的输出做出一个好的预测。监督学习具体又可以分为:

    • 回归(Regression):将输入的变量映射到某个连续函数。
      例如,根据一些房子面积与其价格的对应数据,训练一个模型来预测某面积之下的房价:
      房价预测
    • 分类(Classification):将输入变量映射成离散的类别。
      例如,根据一些肿瘤大小与年龄的对应数据,训练一个模型来对良性、恶性肿瘤进行判断:
      肿瘤判断
  • 无监督学习:给定的数据集中不包含任何输出结果,希望机器通过算法自行分析而得出结果。无监督学习具体可以分为:

    • 聚类(Clusterng):将数据集归结为几个簇
      例如,将各种新闻聚合成一个个新闻专题。

    • 非聚类(Non-clustering)
      例如,将鸡尾酒会上的音乐声和人声分离。

单变量线性回归

了解一些机器学习的基本概念后,这里通过解决下面的机器学习问题,来学习机器学习的建模过程。

假如收集到如下“房价”因“房子面积”的变化而变化的数据:
房价预测数据

要通过这些数据解决一个“房价预测”问题,即由任意给定的“房子面积”预测出相应的“房价”。显然,这是一个监督学习下的回归问题。

要解决该问题,我们就要根据已有的数据建立相应的机器学习模型。

符号约定

在学习机器学习的建模过程前,首先对一些符号的含义约定如下:

  • $m$:训练样本(training example)的数量
  • $x^{(i)}$:第$i$个输入变量(即“训练样本”)
  • $y^{(i)}$:第$i$个输出变量(也称“目标变量”)
  • $(x^{(i)},y^{(i)})$:第$i$个训练样本,当$i = 1,\cdots , m$时称为一个训练集(training set)
  • $X$:输入空间(input space,也称“样本空间”)
  • $Y$:输出空间(output space,也称“标记空间”)
  • $\theta_i$:要通过学习得到的第$i$个参数

“房价预测”问题中,共有$m$个训练样本,输入变量$x$为“房子面积”,输出变量$y$是“真实房价”,且$x^{(1)} = 2104,y^{(1)} = 460$,$(x^{(1)},y^{(1)})$组成第一个训练样本,$x^{(1)},\cdots,x^{(m)}$形成样本空间$X$,$y^{(1)},\cdots,y^{(m)}$则形成标记空间$Y$。

假设函数

在解决监督学习问题,我们的目标是:给定一个训练集,希望从中学得一个由$X$到$Y$的假设函数(hypothesis function)$h(x)$,使得对于任意的输入$x$,都能通过$h(x)$准确预测出相应的输出$y$,如下图所示:
监督学习模型

问题中,如果将假设函数简单地设定为一个线性函数:$$h_\theta(x) = \theta_0 + \theta_1x $$
那么我们的目标,就是根据给定的训练样本,获得假设函数中的两个参数值,而获得能过够通过房子面积预测房价的线性回归模型。
线性回归模型

成本函数

在模型的训练过程中,我们需要综合所有的训练样本,训练出表现最优的模型。对于习得的一个假设函数$h(x)$,我们用成本函数(cost function)来评估其预测的准确度,且评估的过程,是将假设函数的预测结果与对应的真实标记进行比较。均方误差(mean squared error)就是一种回归问题中常用的成本函数,其表达式为:$$E(h, D) = \frac{1}{m} \sum_{i=1}^m (h(x^{(i)}) - y^{(i)})^2$$

根据成本函数的定义可知,模型预测的准确度越高,相应成本函数的值将越接近$0$。所以有了成本函数后,就有了训练模型过程中的目标–最小化成本函数。

由此,将“房价预测”问题的成本函数定义如下:
$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2$$

其中为方便之后得计算,上式中取均方误差的一半。该成本函数$J$是关于两个参数$\theta_0$、$\theta_1$的函数,其在空间坐标系的图像如下:
成本函数图像

进一步画出该成本函数的等高线图(contour plot),可知一条等高线将对应一个训练过程中学习到的模型:
等高线图

落在等高线包围的中心点上时,$J$将取得最小值,对应将获得最优的$h(x)$:
最优模型

梯度下降

通常采用梯度下降法(Gradient Denscent)来最小化成本函数,而得到假设函数中参数值。

在数学中,梯度指的是一个函数在某一点上一个向量,且该点上的方向导数沿着该向量取得最大值,即在该点处,函数沿着该向量的方向变化最快。由此,只要为成本函数预设一个初始值后,使其沿梯度方向迭代下降,便能一步步将其最小化。更为直观的解释如下:
梯度详解

假设某个成本函数的图像如上所示,在图像上任取一点后,使其不断沿着梯度方向下降,最后定能落入一个局部的最小值上。注意到,当存在多个极小值时,选取的初始位置不同,梯度下降后将得到多种结果,这里暂且不考虑此问题。

要得到所谓的梯度,其实就是对函数进行求导。成本函数往往是个多元函数,对其求导的过程是求取其关于各参数的偏导数。对“房价预测”问题的成本函数$J$,就有其关于$\theta_0$的偏导数$\frac{\partial}{\partial \theta_0} J$以及关于$\theta_1$的偏导数$\frac{\partial}{\partial \theta_1} J$。

实现梯度下降的具体算法为:通过下式迭代更新参数值,直到它们收敛为止:$$\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_n) \ \ \ j = 0, \cdots, n$$

其中的“:=”意为“赋值”,$\alpha$是称为“学习率(learning rate)”,用以控制梯度下降时的“步伐”大小,它的预设值不能过大或小,训练过程中可以将它进行动态调整,使得越接近最小值点时下降的“步伐”越小,以准确地落到最小值点上。要注意,一次迭代过程中各参数的值是同时进行更新的

“房价预测”问题中,$n$的值将为1,且成本函数是一个凸函数,全局只有一个极小值点。训练时参数的更新过程将如下:
$$temp0 := \theta_0 - \alpha \frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1)$$ $$temp1 := \theta_1 - \alpha \frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1)$$ $$\theta_0 := temp0$$ $$\theta_1 := temp1$$
其中,由初等函数的导数可得:
$$\frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)})$$ $$\frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)})x^{(i)}) $$
训练该线性回归模型的过程,将如下动图所示:
训练过程

注意到,使用梯度下降法训练该模型时,每一次学习过程都使用了全部的训练数据。采用这种方式进行梯度下降的过程,又称“批梯度下降(batch gredient descent)”

训练结束后,能够根据“房子面积”而预测“房价”的一个简单的线性回归模型就建立好了。

多变量线性回归

在解决前面的“房价预测”问题时,只由“房子面积”这一种特征(feature)来预测“房价”,建立的是一个单变量线性回归模型。然而我们直到,“房价”不单单因“房子面积”而异,往往还会受到“楼层数量”、“房间数量”等其他特征所影响。
更多房价预测数据

考虑更多影响“房价”的房子特征,假如收集到了如上数据。我们将根据这些数据,建立一个多变量线性回归模型。

符号约定

在原单变量模型的基础上,继续约定如下符号的含义:

  • $n$:特征的数量
  • $x^{(i)}_j$:第$i$个训练样本的第$j$种特征的值

对上表中的训练数据,“房子面积”用$x_1$表示,“房间数量”用$x_2$表示,“楼层数”用$x_3$“表示,“房龄”则用$x_4$表示。每个训练样本中包含了$n=4$种特征,要使用一个由$x_j$组成的$n$维向量进行表示,如第2个训练样本表示为$x^{(2)}= \begin{bmatrix} x^{(2)}_1 \\ x^{(2)}_2 \\ x^{(2)}_3 \\ x^{(2)}_4 \\ \end{bmatrix} = \begin{bmatrix} 1416 \\ 3 \\ 2 \\ 40 \\ \end{bmatrix}$。

特征缩放

在训练机器学习模型的实际过程中,我们需要掌握一些技巧。特征放缩(feature scaling)便是其中之一,它可以有效地使梯度下降的过程变得更快。

所谓的特征放缩,是分别将训练数据中各个特征的值放缩到一个较小的统一区间内,该范围通常取$[-1,1]$,即使得$-1 \leq x_i \leq 1$。
特征放缩

如上图所示,进行特征放缩后,成本函数的等高线图将从椭圆变成圆形,而加快梯度下降的速度。

通常采用下式进行特征缩放:$$x_i := \frac{x_i}{max(x_i)-min(x_i)} $$
类似的还有均值归一化(mean normalization),它能使放缩后的均值为$0$,其表达式为:$$x_i := \frac{x_i - mean(x_i)}{max(x_i)-min(x_i)} $$

模型表示

既然考虑了多种特征,那么假设函数也会变得更为复杂。多变量线性回归中,我们将假设函数设为:$$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n$$

上式看成两个$n+1$维列向量$x$、$\theta$间的矩阵运算,可将它更为简洁地表示为:$$ h_\theta(x) = \theta^{T}x = [\theta_0, \theta_1, \cdots , \theta_n] \begin{bmatrix} x_0 \\ x_1 \\ \cdots \\ x_n \\ \end{bmatrix} $$

其中$x_0 = 1$。

由此,“房价预测”问题的假设函数为:$$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_4 + \theta_4x_4 = [\theta_0, \theta_1, \theta_2, \theta_3, \theta_4] \begin{bmatrix} 1 \\ x_1 \\ x_2 \\ x_3 \\ x_4 \\ \end{bmatrix} $$

正规方程

依然采用均方误差作为成本函数并使用梯度下降法进行模型训练的话,参数更新的过程将为:迭代运算下式,直到个参数值收敛为止: $$ \theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1,\cdots, \theta_n) \ \ \ j = 0, \cdots, n $$

该方法需要经过多次迭代运算,才能得到最优的参数值。对于线性回归模型,另外可采用正规方程法(normal equation)进行参数学习,而一次性计算出模型中各参数的最优值。

前面的式子中,成本函数的具体表达式为:$$ J(\theta_0, \theta_1,\cdots, \theta_n) = \frac{1}{2m} \sum_{i=1}^m (h_{\theta}(x^{(i)}) - y^{(i)})$$

要最小化该式,即求出使$J(\theta_0, \theta_1,\cdots, \theta_n)$最小的$\theta_0, \theta_1,\cdots, \theta_n$值,就要令函数$J$关于各参数$\theta$的偏导等于$0$,如此得到的$\theta$将使$J$取得最小值。

具体地,将有:$$\frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1,\cdots, \theta_n) = \frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_0) = 0$$ $$\frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1,\cdots, \theta_n) = \frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_1) = 0$$ $$\vdots$$ $$\frac{\partial}{\partial \theta_n} J(\theta_0, \theta_1,\cdots, \theta_n) = \frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_n) = 0$$

根据前面所述,有下式:$$x^{(i)}= \begin{bmatrix} x^{(i)}_0 \\ x^{(i)}_1 \\ \cdots \\ x^{(i)}_n \\ \end{bmatrix} \ \ \ i = 1,\cdots,m $$ $$ y = \begin{bmatrix} y^{(1)} \\ x^{(2)} \\ \vdots \\ y^{(m)} \\ \end{bmatrix} ,\ \ \ \theta = \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_n \\ \end{bmatrix} $$ $$h_\theta(x^{(i)}) = \theta^T(x^{(i)}) = (x^{(i)})^T\theta$$

此外,约定一个大小为$m \times (n+1)$的矩阵$X$:$$X= \begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \cdots \\ (x^{(m)})^T \\ \end{bmatrix} = \begin{bmatrix} x^{(1)}_0 & x^{(1)}_1 & \cdots & x^{(1)}_n\\ x^{(2)}_0 & x^{(2)}_1 & \cdots & x^{(2)}_n \\ \vdots & \vdots & \ddots & \vdots \\ x^{(m)}_0 & x^{(m)}_1 & \cdots & x^{(m)}_n \\ \end{bmatrix}$$

由此,可将最小化成本函数时的累加过程转换为矩阵运算,例如有:$$\frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_0) = \frac{1}{m}[x^{(1)}_0, x^{(2)}_0, \cdots, x^{(m)}_0] \begin{bmatrix} h_\theta(x^{(1)}) - y^{(1)} \\ h_{\theta}(x^{(2)}) - y^{(2)} \\ \vdots \\ h_{\theta}(x^{(m)}) - y^{(m)} \\ \end{bmatrix} $$ $$\begin{bmatrix} h_{\theta}(x^{(1)}) - y^{(1)} \\ h_{\theta}(x^{(2)}) - y^{(2)} \\ \vdots \\ h_{\theta}(x^{(m)}) - y^{(m)} \\ \end{bmatrix} = \begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(m)})^T\\ \end{bmatrix} \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_n \\ \end{bmatrix} - \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \\ \end{bmatrix} = X\theta - y$$

则有:$$\frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_0) = \frac{1}{m}[x^{(1)}_0, x^{(2)}_0, \cdots, x^{(m)}_0] (X\theta - y) = 0$$ $$\frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_1) = \frac{1}{m}[x^{(1)}_1, x^{(2)}_1, \cdots, x^{(m)}_1] (X\theta - y) = 0$$ $$\vdots $$ $$\frac{1}{m} \sum_{i=1}^m ((h_{\theta}(x^{(i)}) - y^{(i)}) \cdot x^{(i)}_n) = \frac{1}{m}[x^{(1)}_n, x^{(2)}_n, \cdots, x^{(m)}_n] (X\theta - y) = 0$$

将上式进一步矩阵化有:$$\frac{1}{m}\begin{bmatrix} x^{(1)}_0 & x^{(1)}_1 & \cdots & x^{(1)}_n\\ x^{(2)}_0 & x^{(2)}_1 & \cdots & x^{(2)}_n \\ \vdots & \vdots & \ddots & \vdots \\ x^{(m)}_0 & x^{(m)}_1 & \cdots & x^{(m)}_n \\ \end{bmatrix}^T(X\theta -y) = \frac{1}{m}X^T(X\theta - y) = 0$$

并进一步整理上式,就能得到可一步计算出线性回归模型中$\theta$值的正规方程:$$ \theta = (X^TX)^{-1}X^Ty $$

值得一提的时,上式中$X^TX$为奇异矩阵或非方阵时,它将不存在逆矩阵,造成该问题的原因可能是训练样本的特征类型中存在冗余特征,也可能是特征数量$n$大于等于训练样本数量$m$,此时需要将舍去某些特征或将样本进行正则化(regularization)。但在MATLAB中,始终可以用pinv()求得$X^TX$的逆矩阵或伪逆矩阵。

在“房价预测”中,有:$$X= \begin{bmatrix} 1 & 2104 & 5 & 1 & 45 \\ 1 & 1406 & 3 & 2 & 40 \\ 1 & 1534 & 3 & 2 & 30 \\ 1 & 852 & 2 & 1 & 36 \\ \end{bmatrix} y = \begin{bmatrix} 460 \\ 232 \\ 315 \\ 178 \\ \end{bmatrix}$$

据此,就可以通过简单的矩阵运算而得到$\theta$的值。

采用梯度下降法训练模型时:

  • 需要调参($alpha$)
  • 需要多次迭代计算
  • 当样本的特征($n$)很多时也能保持较好的性能
  • 除线性回归模型外还适用于逻辑回归等其他模型

而对正规方程:

  • 不需要调参
  • 一次性完成计算
  • 当$n$比较大时,$(X^TX)^{-1}$的运算量较大,性能较差
  • 只适用于线性回归模型
    因此,在训练模型的过程中要根据实际的情况,选择学习参数的方法。

参考资料

  1. 吴恩达-机器学习-网易云课堂
  2. Andrew Ng-Machine Learning-Coursera
  3. 周志华.机器学习[M].北京:清华大学出版社,2016.
  4. 机器学习简史-CSDN
  5. Normal equation公式推导-CSDN

注:本文涉及的图片及资料均整理翻译自Andrew Ng的Machine Learning课程及上述书籍、博客资料,版权归各作者所有。翻译整理水平有限,如有不妥的地方欢迎指出。


更新历史:

  • 2019.03.18 初稿完成
文章作者: Hugsy
文章链接: http://binweber.top/2019/03/02/machine_learning_1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Sky Inside the Eyewall
支付宝打赏~
微信打赏~