2.2 线性模型 |
|
假设给定包含 n 个数据的数据集 D ={ X , Y },其中 , ,每个数据有 d 个属性 ,线性模型试图从已知数据集中学习到一个通过数据属性线性组合的预测函数,即:
将 b 扩充到参数 ω 中,同时输入数据 扩充为 d +1维向量,即令 , ,式(2.1)可简写成如下向量形式:
线性模型的学习过程就是对参数 ω 的求解过程,从已有的数据中寻找一组合适的参数,使得线性模型具有良好的泛化能力。线性模型的形式非常简单,并且易于实现,是一种简单朴素的学习算法,但是这种简单的模型可以通过引入层级机构或者高维映射来实现更为复杂的非线性模型。并且由于参数 ω 直观地显示了各个属性在预测过程的权重,因此线性模型具有非常好的可解释性。
线性回归模型是一种基于线性模型的回归预测模型,对于给定的数据集 D ={ X , Y }, , , ,线性回归模型试图寻找一组参数 和 b ,使得在 尽可能准确地描述所有数据。
考虑最简单的情况,当 x 只有一个属性,如图2.1所示,我们很难找到一条完美的直线能通过所有数据点,因此只能退而求其次,找到一条尽可能准确的直线,使得所有数据在模型的预测下,真值和预测值的误差之和达到最小,即线性回归试图学得 f ( x i )= ωx i + b ,使得 f ( x i )尽量靠近 y i 。
图2.1 线性回归模型示意图
显然,衡量 f ( x i )与 y i 之间的差别是关键,这里采用的是均方误差。均方误差具有很好的几何意义,对应了几何里的欧氏距离,并且在随机噪声符合高斯分布的假设下,均方误差与最大似然等价。机器学习模型的输出和目标值之间的差距称为代价,把数据集中所有数据点的代价加起来就是代价函数,表达式如下:
机器学习的过程就是对于使得代价函数最小化的参数的求解,常用的方法有逆矩阵计算法和梯度下降法。
将输出值 x 看作一个列向量, n 个输入向量则构成一个 m × n 维的矩阵,根据矩阵运算法则,可以写成如下式子:
当 X 为满秩矩阵或正定矩阵,并且训练集 X 中数据量不大的情况下,可以直接对代价函数求导后等于零,从而得到参数 ω 的解析解,即:
当 X 不是满秩矩阵时,上式求矩阵的逆运算无法实现,或者当训练集数据量太多,统一计算将带来极大的计算开销,这两种情况下,可采用梯度下降法来求解最优参数。在多元微积分中,把目标函数对各个参数求偏导数,然后把偏导数以向量的形式写出来,就是梯度。从几何意义上来说,沿梯度向量的方向就是目标函数增大最快的方向,反之,沿梯度向量的反方向,目标函数减小得最快,也就更容易找到目标函数的最小值。
如图2.2所示,梯度下降法就是沿着目标函数梯度的反方向移动,直到目标函数达到最小值。例如,对于目标函数 ,在使用梯度下降进行优化时,先将参数随机初始化,然后不断更新参数,直到达到要求:
图2.2 梯度下降法示意图
α 是迭代的步长,也称为学习率,目标函数的梯度一般是变化的,因此需要一个学习率控制每次下降的距离。如果学习率太大,会导致迭代过快,甚至有可能错过最优解;反之如果步长太小,迭代速度太慢,很长时间算法都不能结束。
根据计算梯度所使用的数据量不同,可以将梯度下降法分为以下三种基本方法。
• 批量梯度下降法(Batch Gradient Descent,BGD): 是梯度下降法最常用的形式,在计算梯度时使用全部样本数据,分别计算梯度后取平均值作为迭代值。
• 随机梯度下降法(Stochastic Gradient Descent, SGD): SGD只是用一个随机样本数据参与梯度计算,因此省略了求和及求平均的过程,降低了计算复杂度,大大提升了计算速度,但同时由于只是用一个样本决定梯度方向,导致最终解可能不是最优的。
• 小批量梯度下降法(Mini-Batch Gradient Descent, MBGD): 小批量梯度下降法介于随机梯度下降法和批量梯度下降法之间,在计算优化函数的梯度时随机选择一部分样本数据进行计算。这样在提高计算速度的同时保留了一定的准确度。
对于线性模型,目标函数为凸函数的模型,使用梯度下降法找到的局部最优解是全局最优解。而其他目标函数不是凸函数的模型,可能存在多个局部最优解。
线性回归模型是一种非常简单的模型,但是可以通过引入非线性函数映射产生许多变化,从而可以用线性关系描述非线性关系。例如,考虑将模型输出结果的对数作为线性逼近的目标,即:
这就是对数线性回归,在加入对数函数之后,虽然形式上仍然是线性回归,但实质上已经是在求解输入到输出的非线性映射,如图2.3所示。这里的对数函数起到了将预测值与真实标记值联系起来的作用,类似的联系函数还有很多。一般地,考虑单调可微函数 g ,若将 g 作为联系函数,这样得到的模型称为广义线性模型,即:
图2.3 对数回归模型示意图
上述的线性回归模型解决的是回归问题,即模型最后输出的是一个连续值,如果想要用这种类似的方法解决分类问题,只需要找到一个单调可微的联系函数,将真实标记值与模型预测值联系起来。
考虑最简单的二分类任务, y ∈{0,1},要找到一个将实数转化为0/1值的联系函数,一个比较理想的函数就是“单位阶跃函数”,即:
但是该函数为分段函数,不连续,无法求导,最后求解的过程会十分困难,因此无法作为联系函数,另一个近似的对数概率函数,如图2.4所示,有着相似的变化曲线,同时也有更好的微分性质。
令 z 等于线性回归模型的输出,代入对数概率函数,可以得到:
图2.4 对数概率函数示意图
该式子可变形为如下式子, 称为 y 的对数几率,分子中的 y 表示样本所得输出结果为正的可能性,分母1- y 表示输出结果为负的可能性,两者的比值为“概率”,反映了样本结果为正的相对可能性,再取对数就可以由对数概率的正负判断样本输出结果的正负。
因此,对数回归模型可以看作是,用线性回归模型的预测值取逼近分类取值的对数概率,因此称为对数概率回归模型,虽然叫作回归,但其实解决的是分类问题。另外,由于对数概率函数也是凸函数,因此线性对数模型求解的梯度下降等方法,对数概率模型也可直接使用。
上述的对数概率回归模型可以很好地解决二分类问题,但是现实中更经常遇到的是多分类问题。给定数据集数据集 D ={ X , Y },其中 , , , ,输出有 N 种可能的结果。解决的思路是将多分类问题拆解成若干个二分类问题,再利用若干个二分类模型来解决问题。
常用的拆分方法有以下三种:“一对一”、“一对多”和“多对多”。一对一方法是将 N 个类别进行两两配对,产生 N ( N -1)/2个分类模型,用 M ij 表示对 C i 和 C j 两个类别的分类模型,输出当前分类结果 C i 和 C j 哪一个可能性更高。在测试阶段,数据输入所有模型,得到 N ( N -1)/2个结果,把这些结果看作投票,最后得票最多的即为最终的输出结果。
一对一方法需要在每两个分类之间做出判断,因此当类别增加时,一对一方法将变得十分复杂。一对多模型则对每一个分类产生一个模型,一共产生 N 个分类模型,每个模型 M i 输出属于 C i 和不属于 C i 哪一个可能性更高。如图2.5所示,在测试阶段,数据输入所有 N 个模型,当模型 M j 输出为正,则该数据类别为 C j 。一对多方法只需要训练出与类别数量相同个数的模型,因此存储和时间开销都优于一对一方法。
多对多方法每次将若干个分类划分为正类,剩下若干个分类划分为反类,再对正反两个类继续分类,直到只剩下一个类别。这种方法最少可以产生log( N )个分类模型完成任务,但是对于每一级分类的划分需要有特殊的考量,最终实现效果也跟类别的划分有关系。
图2.5 一对一和一对多方法示意图
机器学习的一大挑战就是要求算法模型在未观测到的新数据上表现良好,而不仅仅是在训练数据集上表现良好,这种在未观测到的数据上的表现能力称为泛化能力。
通常在训练模型时,优化目标是训练数据集上的误差,也就是训练误差最小,而真正关心的是未知数据集上的泛化误差。通常我们把低训练误差高测试误差的情况称为过拟合,而高训练误差的情况称为欠拟合。如图2.6所示,图2.6(a)是一个合理的模型,图2.6(b)则因为模型的复杂度不够,损失函数的收敛速度很慢,这就使得优化算法做得再好,模型的泛化性能也会很差,因为这条直线在训练集上的误差就很大,这种训练集上不能拟合出来较好的图像,称为欠拟合,或者叫高偏差。图2.6(c)则设定的模型复杂度过高,只要模型的复杂度足够高,拟合后就能完美切合所有训练数据,将训练误差降到非常低,但这并不是最终想要的结果,因为这样的模型把不可估计的随机误差考虑了进来,然后在面临新数据的时候,这些随机误差跟训练数据集中的不一样就会带来较大的偏差,导致测试误差非常大,这就是过拟合。
图2.6 过拟合与欠拟合
欠拟合的解决办法就是寻找更多数据特征,增加模型的复杂度。反之,解决过拟合就需要减少特征属性的数量,此外还有另一种方法就是加入正则化项。
如式(2.12)所示,在目标函数中加入参数的模,用来调整参数的权重。如果参数太多,复杂度太大,目标函数也会随之增加,这样当增加模型复杂度带来训练误差较少的收益,小于参数数量增加带来的开销的时候,算法就会选择复杂度较低的模型。这也就是所谓奥卡姆剃刀原则:在同样能解释已知观测现象的假设中,选择最简单的那个。正则化项可以使用第一范数、第二范数或者其他类型,式(2.12)展示的是添加第二范数之后的损失函数。
关于过拟合和欠拟合的问题不仅出现在线性模型中,在其他模型中,如后面要讲到的树模型、神经网络也常常出现。添加正则化项的方法也已用在神经网络模型中,树模型有与之相对应的解决方法,例如,剪枝。