模型描述


让我们来继续讨论一下房价预测问题,上图分别展示了房价随房屋大小(单位为平米)的变化趋势以及包含这两个特征的原始数据,通常将这些数据叫作训练数据(training data)。我们看下训练数据的表示方式:其中 代表训练样本数量,
代表输入的变量即特征,
代表输出的变量即标签,
代表一个训练样本,
代表第
个训练样本的输入,
代表第
个训练样本的输出。
通常可以将机器学习算法看做是一个函数集合(function set),通过训练数据能够拟合出一个符合训练数据特征的函数,叫做假设函数(Hypothesis Function),用小写 表示。将房屋的平米数作为假设函数的输入变量
,经过计算即可得到假设函数的输出变量
,即关于房价的预测结果。所以假设函数
是一个引导从
得到
的函数。具体表示如下:
其中 和
为假设函数的参数,因为只有一个一次变量
,所以这是一个一元线性函数,如下图所示:

线性函数是数据比较简单的情况,被称为线性回归模型(Linear Regression Model)。因为只有一个变量 ,所以这是一元线性回归,也叫做单变量线性回归。
代价函数
我们希望假设函数的预测是准确的,所以假设函数根据 预测出的
和
对应的真实的
越接近,假设函数的准确度就越高。

可以发现,将假设函数公式中的参数 和
代入不同的值,即可得到不同的假设函数。所以如何找到一个合适的
和
,能够使得假设函数与训练数据很好的拟合,就成为了问题的关键。
我们可以通过假设函数预测值和真实值的误差大小,来衡量假设函数的好坏程度,通常这个衡量假设函数好坏程度的函数叫做代价函数(Cost Function)。代价函数的目标(通常用 表示)就是最小化假设函数的误差,并得到最小误差的假设函数的参数
和
:
误差的衡量有很多种,在线性回归中我们通常使用平方误差(Square Error),平方误差的思路是将所有样本的预测值减去真实值的平方和取平均再取 作为误差。公式如下:
其中 表示单个样本的误差,通常叫做损失函数(Loss Function),而代价函数则是指整个训练集的平均误差。我们可以根据不同的参数得到不同的假设函数,然后通过代价函数求得每个假设函数在训练集上的误差,如下所示:

可以看到,当 时,假设函数
与训练数据拟合的最好,代价函数的误差最小,误差
。一元线性回归中代价函数是一个碗状的曲线,二元线性回归中代价函数是一个碗状的曲面,如下图所示:

图中 和
为线性回归的参数,点
到曲面的高度就是代价函数的误差
。我们可以尝试通过改变
和
的值,同时观察假设函数的误差变化,来得到最小误差的假设函数
,可以看出,图中全局最低点(碗底)就是最小误差的参数值
。我们将代价函数用等高线图来表示,如下所示:

同一条等高线上的点,如紫色的三个点 误差相同。当参数为红色点
时,代价函数
误差很大,假设函数
在训练数据上拟合效果很差。

当参数为紫色点 时,代价函数
误差最小,假设函数
在训练数据上拟合效果很好。接下来我们需要一个方法能自动计算出最小误差的假设函数的参数值,因为理论上假设函数的参数值可以是任意值,很难通过穷举的方法得出。
梯度下降

上图表示代价函数 随参数
变化形成的曲面,先随机选取一点作为假设函数
的初始化参数,并计算出哪个方向的误差更低,然后向误差更低的方向更新参数
,通过参数的不断迭代更新,最终会在局部最低点
停止更新,这种参数更新方式就叫做梯度下降(Gradient Descent)。将最低点的参数
带入假设函数,我们就得到最小误差的假设函数
,也就是我们的线性回归模型。

可以看到,参数的初始化位置不同,得到的最小误差 和假设函数
也有可能不同。我们通过如下梯度下降公式来进行参数更新:
其中 为参数个数,在这里
包括
和
,
为学习率,用来控制参数更新的幅度。
是导数项,表示参数
对
(
表示求导,
表示求偏导),可以理解为是参数
在代价函数
上切线的斜率,下图以单变量为例:

其中 轴为参数
,
轴为误差
,当参数
对代价函数
的导数,即斜率 > 0 时,
需要向左移动,也就是减小参数
,才能够减小误差
,所以公式中
减去
倍的斜率。

当斜率 < 0 时, 需要向右移动,也就是增大参数 ,才能够减小误差 ,由于斜率是负值,所以 仍是减去 倍的斜率。

理论上当参数 对代价函数
求导等于 0 时,也就是切线斜率为 0 时,代价函数的误差就到达了局部最低点,参数停止更新。但实际开发中很难计算出导数为 0 的情况,通常会设定规则来终止更新,比如指定迭代次数、指定最小误差变化或指定最小梯度变化等。

可以发现,越接近最低点时切线斜率越小,所以梯度下降过程是由陡到缓的。开始迭代时,参数更新幅度很大,随着迭代次数的增加,参数更新的幅度会越来越小,所以即使学习率为固定值,只要设定合理,梯度下降也会自动逐渐减小步伐, 也能够收敛在局部最低点,下图展示了
设定不合理的情况:

过小,会造成参数更新非常缓慢。
过大,会造成参数无法收敛在全局最低点。
总结一下梯度下降过程:将初始化参数 带入假设函数
,向假设函数输入训练样本得到预测值,利用代价函数
及学习率
计算得出斜率,更新参数,再将新得出的参数代入假设函数,不断反复迭代,直到将误差
收敛到局部最低点。
梯度下降公式:
根据代价函数公式,计算导数项:
将求导结果代入梯度下降公式:
以上就完成了一次参数 的计算和更新,值得注意的是,每一步梯度下降都遍历了整个训练数据样本,所以计算偏导数的时候需要计算
个样本的总和。另外,
和
需要同时更新。

由于线性回归是碗状函数,通常叫做凸函数,所以线性回归没有局部最优解,只有一个全局最优解,模型总是会将误差收敛在全局最低点。

可以从上图中看出,通过不断迭代, 的误差下降到了全局最低点,而此时假设函数
也的确很好地拟合了训练数据,通过向假设函数输入一个新样本
,
的房屋平米数为 1250,可以得到一个合理的预测结果——房屋价格为 25 万美金。
这就是批量梯度下降算法,还有另外两种梯度下降算法是:随机梯度下降和 mini-batch(小批量)梯度下降,在后面的文章中会给大家逐一讲解。
网友评论