机器学习基础
机器学习基础
模型容量,欠拟合,过拟合参数化
训练机器学习模型的目的不仅仅是可以描述已有的数据,而且是对末知的新数据也可以做出较好的推测,这种推广到新数据的能力称作泛化(generalization)。我们称在训练集上的误差为训练误差 (training error),而在新的数据上的误差的期望称为泛化误差(generalization error)或测试误差 (test error)。通常我们用测试集上的数据对模型进行测试,将其结果近似为泛化误差。
为什么我们只观测了训练集却可以影响测试集上的效果呢? 如果他们是完全随机的无关的分布我们是无法做出这样的推测的,我们通常需要做出对于训练集和测试集的采样过程的假设。训练集和测试集是由某种数据生成分布产生的,通常我们假设其满足独立同分布,即每个数据是相互独立的,而训练集和测试集是又从同一个概率分布中取样出来的。
假设参数固定,那么我们的训练误差和测试误差就应相同。但是实际上,在机器学习模型中,参数不是事先固定的,而是通过采样训练集选取了一个仅优化训练集的参数,然后再对测试集采样,所以测试误差常常会大于训练误差。
机器学习模型因此有两个主要目的:
-
尽量减小训练误差。
-
尽量减小训练误差和测试误差间的间距。
这两点对应着机器学习模型的两个挑战:欠拟合(underfitting)和过拟合(overfitting)。欠拟合就是指模型的训练误差过大,过拟合就是指训练误差和测试误差间距过大。
模型是欠拟合还是过拟合是由模型的容量(capacity)决定的。在此给出一条总结规律:低容量,训练误差和泛化误差都大,欠拟合;高容量,训练误差小但泛化误差大,易过拟合。因此我们一般寻求最佳容量。但是容量的大小其实是比较难以控制的,在此基础上我们可以用偏好选择(正则化的思想)的方法有效的避免欠拟合。
训练误差,测试误差和模型容量的关系可以由下图表示,在容量较小时我们处在欠拟合区,训练误差和测试误差均较大,随着容量增大,训练误差会逐渐减小,但测试误差与训练误差的间距也会逐渐加大,当模型容量超过最适容量后,测试误差不降反增,进入过拟合区

正则化
为了减小测试误差与训练误差的差距过大防止过拟合,需要正则化方法(regularization),这 一方法的主要目的是给模型进行一些修改使其倾向于减小测试误差。
以多次回归问题作为例子。假如引入一项对权重参数矢量w的正则项使得损失函数变为 \(J(w)=M S E_{\text {train }}+\lambda w^T w\) 。 \(\lambda\) 等于零时它和原来的损失函数相同,当 \(\lambda\) 越大时第二项造成的影响越大,为了使误差函数更小,则需要使 \(w\) 更小,如使每一个 \(w\) 坐标更小或使 \(w\) 更集中在某些特征上而其他特征上趋于零,我们需要通过调节 \(\lambda\) 大小来找到过拟合与欠拟合间合适的平衡点。例如对于九次多项式拟合,如下图所示,在最左图中当 \(\lambda\) 过大时,每一个多次项的w都趋于零,曲线是一条近似直线,造成欠拟合,在最右图中,当 \(\lambda\) 趋于零时正则项约为零,对多项式没有造成任何限制,造成过拟合。只有选取一个适中的 \(\lambda\) 才可使某些项的权重减小,进行比较合适的曲线拟合。
正则化的思想类似于凸函数中的罚函数法,将我们想要的约束“罚”到优化目标也就是损失函数上。

超参数与验证集
参数与超参数(hyperparameter)的区别,用多次项拟合例子来说,参数就是指其中每项的权重 \(w\) 的值,合适的 \(w\) 是通过机器学习得到的,而超参数是我们选取用几次多项式来描述,也可以看做模型容量超参数,另外还有正则项系数 \(\lambda\) 取什么值,这些通常是人为设定的。有些超参数是无法用训练集习得的,例如模型容量超参数,如果仅对训练集来说总会选取更大的模型容量,使得训练误差减小,但会造成过拟合,同样的,对于正则项,仅对训练集学习会使得 正则项为零而使训练误差更小,也造成过拟合。
为了解决这个问题,我们需要一个区别于训练集的验证集(validation set)。我们可以将训练集分成两部分,一部分对于固定的超参数得到合适的参数w,而另一部分作为验证集来测试该模型的泛化误差,然后对超参数进行适宜的调整。简单概括就是训练集是为了选取合适的参数,而验证集是为了选取合适的超参数。
SVM支持向量机
SVM可以说是机器学习中最广为人知与应用的算法之一,其引入的核函数的概念,也对深度学习的隐层激活函数给出了一些指导,因此在此需要给出其大概的数学推导 (ps. 摘自知乎专栏,完整版可以查看该网址https://zhuanlan.zhihu.com/p/270298485?utm_id=0)
衡量指标
按照直觉来说,如果我们需要得到一个问题的解,那首先需要有一个优化的目标问题,深度学习中的优化目标就是最小化代价函数。那么对于SVM来说,我们也需要找到一个优化的目标函数。
分类间隔
需要有一个指标来衡量解决方案 (即我们通过训练建立的分类模型) 的好坏,而分类间隔是一个比 较好的指标。
函数间隔
在进行分类的时候,我们可以让计算机这样来看待我们提供给它的训练样本,每一个样本由一个向量 (就是那些数据特征所组成的向量) 和一个标记 (标示出这个样本属于哪个类别) 组成。如下:
\(x_i\) 就是数据向量 (维数很高), \(y_i\) 就是分类标记,在二元的线性分类中,这个表示分类的标记只 有两个值,1和-1 (用来表示属于还是不属于这个类)。有了这种表示法,我们就可以定义一个样本点到某个超平面的间隔:
这个公式只是个定义而已,但做做变换,就能看出一些有意思的东西。
首先注意到如果某个样本属于该类别的话,那么 \(w^T x+b>0\) (记得么? 这是因为所选的 \(g(x)=w^T x+b\) 就通过大于 0 还是小于 0 来判断分类),而 \(y_i\) 也大于 0 ;若不属于该类别的话, 那么 \(w^T x+b<0\) ,而 \(y_i\) 也小于 0 ,这意味着 \(y_i\left(w^T x+b\right)\) 总是大于0的,而且它的值就等于 \(\left|w^T x+b\right|\) ,(也就是 $\left|g\left(x_i\right)\right| $)
当 \(y_i=1\) 时, \(w^T x+b\) 应该是个大正数,反之是个大负数。因此函数间隔代表了我们认为特征是正例还是反例的确信度。
也就是说,针对某一个样本的函数间隔就是 \(\left|w^T x+b\right|\) ,定义全局样本上的函数间隔:
几何间隔
继续考虑 \(\omega\) 和 \(b\) ,如果同时加大 \(\omega\) 和 \(b\) ,比如在 \(w^T x+b\) 前面乘个系数比如 2 ,那么所有点的函 数间隔都会增大二倍,这个对求解问题来说不应该有影响,因为我们要求解的是 \(w^T x+b=0\) ,同时扩大 \(\omega\) 和 \(b\) 对结果是无影响的。这样,我们为了限制 \(\omega\) 和 \(b\) ,可能需要加入归一化条件,毕 竟求解的目标是确定唯一一个 \(\omega\) 和 \(b\) ,而不是多组线性相关的向量。现在把 \(\omega\) 和 \(b\) 进行一下归一 化,即用 \(\frac{w}{\|w\|}\) 和 \(\frac{b}{\|w\|}\) 分别代替原来的 \(\omega\) 和 \(b\) ,那么间隔就可以写成:
这个公式是不是看上去有点眼熟? 没错,这不就是解析几何中点xi到直线 \(g(x)=0\) 的距离公式 嘛!
再换种写法
当 \(\|w\|=1\) 时,不就是函数间隔吗? 前面提到的函数间隔归一化结果就是几何间隔。他们为什 么会一样呢? 因为函数间隔是我们定义的,在定义的时候就有几何间隔的色彩。同样,同时扩大 \(\omega\) 和 \(b , \omega\) 扩大几倍, \(\|\omega\|\) 就扩大几倍,结果无影响。同样定义全局的几何间隔
当用归一化的 \(\omega\) 和 \(b\) 代替原值之后的间隔有一个专门的名称,叫做几何间隔,几何间隔所表示的正 是点到超平面的欧氏距离,我们下面就简称几何间隔为 “距离"。以上是单个点到某个超平面的距离定义,同样可以定义一个点的集合到某个超平面的距离为此集合中离超平面最近的点的距离。
最优间隔分类器求解
最小间隔
上节说到我们有了一个分类函数,也有了判断解优劣的标准,即有了优化的目标,这个目标就是最大化几何间隔,但是看过一些关于SVM的论文的人一定记得什么优化的目标是要最小化 \(\|w\|\) 这样的 说法,这是怎么回事呢? 回头再看看我们对间隔和几何间隔的定义:
间隔: \(r=y\left(w^T x+b\right)=|g(x)|\)
几何间隔:
可以看出 \(\delta=\|\omega\| * r\) 。注意到几何间隔与 \(\|\omega\|\) 是成反比的,因此最大化几何间隔与最小化 \(\|\omega\|\) 完全是一回事。而我们常用的方法并不是固定 \(\|\omega\|\) 的大小而寻求最大几何间隔,而是固定间隔 (例如固定为 1 ,为什么是1而不是其他数呢? 后面会说),寻找最小的 \(\|\omega\|\) 。
我们确定一个分类器,对任意的实数,当
有了分类器,那么我们的目标就是找到离超平面最近的数据点,然后让其距离超平面最远,并求出参数w,b。这就可以写作:
我们由上面的分类器定义可知
即其最小值为 1 ,为了最大化间隔只需要最大化 \(\frac{1}{\|w\|}\) 。
因此我们给出一个优化问题的形式:
但是这只是给出了优化目标,但是没有给出优化的约束。如果没有约束,不管什么情况上面的问题解都是 \(w=0\)。
前文提到过把间隔固定为 1 ,这是指把所有样本点中间隔最小的那一点的间隔定为 1,也就意味着集合中的其他 点间隔都不会小于1,按照间隔的定义,满足这些条件就相当于让下面的式子总是成立:
\(y_i\left[\left(w^T \cdot x_i\right)+b\right] \geq 1(i=1,2, \ldots, l) \quad(l\) 是总的样本数 \()\)
但我们常常习惯让式子的值和0比较,因而经常用变换过的形式:
\(y_i\left[\left(w^T \cdot x_i\right)+b\right]-1 \geq 0(i=1,2, \ldots, l)(l\) 是总的样本数 \()\)
因此两类分类问题也被转化成了它的数学形式,一个带约束的最小值的问题:
之所以最小间隔选1是因为归一化后对 \(w\) 和 \(b\) 的影响是一样的,不是 0 是因为上面提到的那会造成 H1与H2两条直线间的距离无限大。
凸优化分析
一个求最小值的问题就是一个优化问题,它同样由两部分组成,目标函数和约束条件,可以用下面的式子表示:
所以线性分类器可以描述为:
由凸优化相关知识可知该问题是一个凸二次规划问题,可以采用matlab的CVX包进行求解。
拉格朗日对偶法求解
重新回到SVM的优化问题:
我们将约束条件改写为:
从KKT条件得知只有函数间隔是1 (离超平面最近的点) 的线性约束式前面的系数 \(\alpha_{i}>0\) ,也就是说这些约束式 \((g_{i}(w)=0)\) ,对于其他的不在线上的点(\(g_{i}(w)<0)\) ,极值不会在他们所在的范围内取得, 因此前面的系数 \(\alpha_{i}=0\) 。注意每一个约束式实际就是一个训练样本。

实线是最大间隔超平面,假设 \(\times\) 号的是正例,o的是负例。在虚线上的点就是函数间隔是 1 的点,那么他们前面的系数 \(\alpha_{i}>0\) ,其他点都是 \(\alpha_{i}=0\) 。这三个点称作支持向量。构造拉格朗日函数如下:
注意到这里只有 \(\alpha i\) 没有 \(\beta i\) 是因为原问题中没有等式约束,只有不等式约束。
下面我们按照前面分析的对偶问题的求解步骤来一步步进行
首先求解
的最小值,对于固定 \(\alpha_{i}\) ,
的最小值只与 \(w\) 和 \(b\) 有关,对 \(w\) 和 \(b\) 分别求偏导数。
并得到
将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)代入后, 化简过程如下:
最后得到
由于最后一项是0,因此简化为
这里我们将向量内积
表示为
此时的拉格朗日函数只包含了变量 \(\alpha_{i}\) 。然而我们求出了 \(\alpha_{i}\) 才能得到 \(w\) 和 \(b\) 。
接着是极大化的过程
前面提到过对偶问题和原问题满足的几个条件,首先由于目标函数和线性约束都是凸函数,而且这里不存在等式约束 \(h\) 。存在w使得对于所有的 \(i\),\(g_{i}(w)<0\)。因此,一定存在 \(w^*, \alpha^*\) 使得 \(w^*\) 是原问题 的解, \(\alpha^*\) 是对偶问题的解。在这里,求 \(\alpha\) 就是求 \(\alpha^* 了\) 。
如果求出了 \(i\) ,根据
就可求出 \(w\) (也的 \(w^{\star}\),原问题的解)
,然后
即可求出\(b\)。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
由于前面求解中得到
我们通篇考虑问题的出发点是
根据求解得到的 \(\alpha i\) ,代入前式得到
也就是说,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于 0 还是 小于 0 ,来判断正例还是负例。现在有了 \(\alpha_{i}\) ,我们不需要求出 \(w\) ,只需将新来的样本和训练数据中的 所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了? 其实不然,我 们从KKT条件中得到,只有支持向量的 \(\alpha_{i}>0\),其他情况 $ \alpha_{i}=0$ 。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。这种写法为下面要提到的核函数 (kernel) 做了很好的铺垫。
核函数
以上的例子是在线性可分的条件下进行讨论的,但是我们知道,在大部分的情况下,我们没法使用简单的线性函数就可以将这个分类问题解决。但是我们可以通过非线性变换将原本维度的样本转化为高维度的样本来解决这个问题,若高维度的样本可以由高维空间的超平面进行分类的话,我们不就解决问题了么!
用一个具体分类的例子来看看这种向高维空间映射从而分类的方法如何运作,想象一下,我们分类问题的原始空间是 1000 维的(即每个要被分类的文档被表示为一个1000 维的向量),在这个维度上问题是线性不可分的。现在我们有一个2000维空间里的线性函数
注意向量的右上角有个' 哦。它能够将原问题变得可分。式中的 w' 和 \(x^{\prime}\) 都是2000维的向量, 只不过 w' 是定值,而 \(x^{\prime}\) 是变量 ,现在我们的输入呢,是一个 1000 维的向量 \(x\) ,分类的过程是先把 \(x\) 变换为 2000 维的向量 \(x^{\prime}\) ,然后求这个变换后的 向量 \(x^{\prime}\) 与向量 \(w^{\prime}\) 的内积,再把这个内积的值和b相加,就得到了结果,看结果大于阈值还是小于 阈值就得到了分类结果。
你发现了什么? 我们其实只关心那个高维空间里内积的值,那个值算出来了,分类结果就算出来 了。而从理论上说, \(x^{\prime}\) 是经由x变换来的,因此广义上可以把它叫做 \(x\) 的函数,而 \(w'\) 是常量,它是一个低维空间里的常量 \(w\) 经过变换得到 的,所以给了一个 \(w\) 和 \(x\) 的值,就有一个确定的 \(f\left(x^{\prime}\right)\) 值与其对应。这让我们幻想,是否能有这样一 种函数 \(K(w, x)\),他接受低维空间的输入值,却能算出高维空间的内积值\(<w^{\prime}, x^{\prime}>\) ?
如果有这样的函数,那么当给了一个低维空间的输入\(x\)以后,
这两个函数的计算结果就完全一样,我们也就用不着费力找那个映射关系,直接拿低维的输入往 \(g(x)\) 里面代就可以了。
万幸的是,这样的 \(K(w, x)\) 确实存在 (发现凡是我们人类能解决的问题,大都是巧得不能再巧,特殊得不能再特殊的问题,总是恰好有些能投机取巧的地方才能解决,由此感到人类的挱小),它被称作核函数 (核,kernel),而且还不止一个,事实上,只要是满足了Mercer条件的函数,都可以作为核函数。核函数的基本作用就是接受两个低维空间里的向量,能够算出经过某个变换后在高维空间里的向量内积值。
回想我们上节说的求一个线性分类器,它的形式应该是:
现在这个就是高维空间里的线性函数,我们就可以用一个低维空间里的函数来代替,
\(f\left(x^{\prime}\right)\) 和 \(g(x)\) 里的 \(\alpha , y , b\) 全都是一样一样的! 这就是说,尽管给的问题是线性不可分的,但是我们就硬当它是线性问题来求解,只不过求解过程中,凡是要求内积的时候就用你选定的核函数来算。这样求出来的 \(\alpha\) 再和你选定的核函数一组合,就得到分类器了。
在平常使用的过程中,我们会遇到很多核函数,对核函数的选择,需要根据指导原则。各种实验的观察结果表明,某些问题用某些核函数效果很好,用另一些就很差,但是一般来讲,径向基核函数(BRF,也就是大名鼎鼎的高斯核)是不会出太大偏差的一种,首选。
高斯核可以理解为将需要分类的样本,投影到无限维的空间。
小结
SVM的扩展内容还有很多,其中就包括了BRF为什么可以实现高维度可分投影,还有当出现噪点时,如何对SVM优化目标进行改进,从而得到松弛的SVM判别公式,这些在此不再展开,详细可以看知乎专栏。SVM的想法其实类似于logistic回归,但是SVM只追求局部最优(离超平面最近的点最优即可),但是logistic回归考虑所有样本点,因为其通常采用最小二乘法进行求解参数。SVM的核函数为神经网络中的隐藏单元的激活函数提供了一定的理论指导和解释角度,所以相当重要。


浙公网安备 33010602011771号