12.1 优化目标
在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的水平。比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。
我们从优化目标开始。为了描述支持向量机,事实上,我将会从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。
那么,在逻辑回归中我们已经熟悉了这里的假设函数形式,和右边的S型激励函数。然而,为了解释一些数学知识.我将用z 表示。
现在考虑下我们想要逻辑回归做什么:如果有一个 y=1的样本,是不管是在训练集中或是在测试集中,又或者在交叉验证集中,总之是 y=1,现在我们希望 趋近1。因为我们想要正确地将此样本分类,这就意味着当
趋近于1时,
应当远大于0,这里的>>意思是远远大于0。这是因为由于 z 表示
,当 z远大于0时,即到了该图的右边,你不难发现此时逻辑回归的输出将趋近于1。相反地,如果我们有另一个样本,即y=0。我们希望假设函数的输出值将趋近于0,这对应于
,或者就是 z 会远小于0,因为对应的假设函数的输出值趋近0。
一起来考虑两种情况:
一种是y等于1的情况;另一种是 y等于0的情况。
在第一种情况中,假设 y=1,此时在目标函数中只需有第一项起作用,因为y=1时,(1−y)项将等于0。因此,当在 y=1 的样本中时,即在 (x,y)中 ,我们得到 这样一项。
我用 z表示,即:
。当然,在代价函数中,y 前面有负号。我们只是这样表示,如果 y=1 代价函数中,这一项也等于1。这样做是为了简化此处的表达式。如果画出关于z 的函数,你会看到左下角的这条曲线,我们同样可以看到,当z 增大时,也就是相当于
增大时,z 对应的值会变的非常小。对整个代价函数而言,影响也非常小。这也就解释了,为什么逻辑回归在观察到正样本y=1时,试图将
设置得非常大。因为,在代价函数中的这一项会变的非常小。
现在开始建立支持向量机,我们从这里开始:
我们会从这个代价函数开始,也就是 一点一点修改,让我取这里的z=1 点,我先画出将要用的代价函数。
新的代价函数将会水平的从这里到右边(图外),然后我再画一条同逻辑回归非常相似的直线,但是,在这里是一条直线,也就是我用紫红色画的曲线,只是这里是由两条线段组成,即位于右边的水平部分和位于左边的直线部分,先别过多的考虑左边直线部分的斜率,这并不是很重要。但是,这里我们将使用的新的代价函数,是在y=1的前提下的。
目前,我们只是讨论了y=1的情况,另外一种情况是当y=0时,此时如果你仔细观察代价函数只留下了第二项,因为第一项被消除了。如果当y=0时,那么这一项也就是0了。所以上述表达式只留下了第二项。因此,这个样本的代价或是代价函数的贡献。将会由这一项表示。并且,如果你将这一项作为z的函数,那么,这里就会得到横轴z.
如果我们用一个新的代价函数来代替,即这条从0点开始的水平直线,然后是一条斜线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为,同时,右边函数我称它为
。这里的下标是指在代价函数中,对应的 y=1 和 y=0的情况,拥有了这些定义后,现在,我们就开始构建支持向量机。
因此,对于支持向量机,我们得到了这里的最小化问题,即:
然后,再加上正则化参数。现在,按照支持向量机的惯例,我们的书写会稍微有些不同,代价函数的参数表示也会稍微有些不同。
首先,我们要除去1/m这一项,因为1/m 仅是个常量,因此,你知道在这个最小化问题中,无论前面是否有1/m这一项,最终我所得到的最优值θ都是一样的。
第二点概念上的变化。对于支持向量机,按照惯例,我们将使用一个不同的参数替换这里使用的 λ 来权衡这两项。你知道,就是第一项和第二项我们依照惯例使用一个不同的参数称为C,同时改为优化目标,C×A+B。
因此,在逻辑回归中,如果给定λ,一个非常大的值,意味着给予B更大的权重。而这里,就对应于将C设定为非常小的值,那么,相应的将会给B比给A更大的权重。现在删掉这里的λ,并且用常数C来代替。因此,这就得到了在支持向量机中我们的整个优化目标函数。然后最小化这个目标函数,得到SVM 学习到的参数C。
12.2 大边界的直观理解
人们有时将支持向量机看作是大间距分类器。在这一部分将介绍其中的含义,这有助于我们直观理解SVM模型的假设是什么样的。
这是我的支持向量机模型的代价函数,在左边这里我画出了关于zz的代价函数,此函数用于正样本,而在右边这里我画出了关于z的代价函数
,横轴表示z,现在让我们考虑一下,最小化这些代价函数的必要条件是什么。如果你有一个正样本,y=1,则只有在z>=1时,代价函数
才等于0。
换句话说,如果你有一个正样本,我们会希望,反之,如果y=0,我们观察一下,函数
,它只有在z<=−1的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本y=1,则其实我们仅仅要求
,就能将该样本恰当分出,这是因为如果
大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要
就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 ,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。
当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。具体而言,我接下来会考虑一个特例。我们将这个常数C设置成一个非常大的值。比如我们假设C的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?
如果 C非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为0的最优解。因此,让我们尝试在代价项的第一项为0的情形下理解该优化问题。比如我们可以把C设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。
我们已经看到输入一个训练样本标签为y=1,你想令第一项为0,你需要做的是找到一个θ,使得,类似地,对于一个训练样本,标签为y=0,为了使
函数的值为0,我们需要
。因此,现在考虑我们的优化问题。选择参数,使得第一项等于0,就会导致下面的优化问题,因为我们将选择参数使第一项为0,因此这个函数的第一项为0,因此是C乘以0加上二分之一乘以第二项。
具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。
我们可以画一条更差的决策界,这是另一条决策边界,可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这条黑线有更大的距离,这个距离叫做间距(margin)。
当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,而这其实是求解上一页幻灯片上优化问题的结果。
我将会从直观上略述为什么这个优化问题会产生大间距分类器。总之这个图示有助于你理解支持向量机模型的做法,即努力将正样本和负样本用最大的间距分开。
我们将这个大间距分类器中的正则化因子常数C设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。那么在让代价函数最小化的过程中,我们希望找出在y=1和y=0两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:
事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。
在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数C,设置的非常大,这事实上正是支持向量机将会做的。它将决策界,从黑线变到了粉线,但是如果C 设置的小一点,如果你将C设置的不要太大,则你最终会得到这条黑线,当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数C非常大的情形,同时,要提醒你C的作用类似于1/λ,λ是我们之前使用过的正则化参数。这只是C非常大的情形,或者等价地 λ 非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候,当C不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。
回顾 C=1/λ,因此:C较大时,相当于 λ较小,可能会导致过拟合,高方差。C较小时,相当于λλ较大,可能会导致低拟合,高偏差。
12.3 数学背后的大间距分类
在本节课中,我将介绍一些大间隔分类背后的数学原理。这会让你对支持向量机中的优化问题,以及如何得到大间距分类器,产生更好的直观理解。
首先,让我来给大家复习一下关于向量内积的知识。假设我有两个向量,u和v,我将它们写在这里。两个都是二维向量,我们看一下,的结果。
也叫做向量u和v之间的内积。由于是二维向量,我可以将它们画在这个图上。我们说,这就是向量u即在横轴上,取值为某个
,而在纵轴上,高度是某个
作为u的第二个分量。现在,很容易计算的一个量就是向量u的范数。∥u∥表示u的范数,即u的长度,即向量u的欧几里得长度。根据毕达哥拉斯定理,
,这是向量u的长度,它是一个实数。现在你知道了这个的长度是多少了。
回头来看向量v ,因为我们想计算内积。v是另一个向量,它的两个分量和
是已知的。向量v可以画在这里,现在让我们来看看如何计算u和v之间的内积。这就是具体做法,我们将向量v投影到向量u上,我们做一个直角投影,或者说一个90度投影将其投影到u上,接下来我度量这条红线的长度。我称这条红线的长度为p,因此p就是长度,或者说是向量v投影到向量u上的量,我将它写下来,p是v投影到向量u上的长度,因此可以将
=p⋅∥u∥,或者说u的长度。这是计算内积的一种方法。如果你从几何上画出p的值,同时画出uu的范数,你也会同样地计算出内积,答案是一样的。另一个计算公式是:
就是[u1 u2] 这个一行两列的矩阵乘以v。因此可以得到
。根据线性代数的知识,这两个公式会给出同样的结果。顺便说一句,
。因此如果你将u和v交换位置,将u投影到v上,而不是将v投影到u上,然后做同样地计算,只是把u和v的位置交换一下,你事实上可以得到同样的结果。申明一点,在这个等式中u的范数是一个实数,p也是一个实数,因此
就是两个实数正常相乘。
最后一点,需要注意的就是p值,p事实上是有符号的,即它可能是正值,也可能是负值。我的意思是说,如果u是一个类似这样的向量,v是一个类似这样的向量,u和v之间的夹角大于90度,则如果将v投影到u上,会得到这样的一个投影,这是p的长度,在这个情形下我们仍然有是等于p乘以u的范数。唯一一点不同的是p在这里是负的。在内积计算中,如果u和v之间的夹角小于90度,那么那条红线的长度p是正值。然而如果这个夹角大于90度,则p将会是负的。就是这个小线段的长度是负的。如果它们之间的夹角大于90度,两个向量之间的内积也是负的。这就是关于向量内积的知识。我们接下来将会使用这些关于向量内积的性质试图来理解支持向量机中的目标函数。
这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化.
我接下来忽略掉截距,令,这样更容易画示意图。我将特征数n置为2,因此我们仅有两个特征
,现在我们来看一下目标函数,支持向量机的优化目标函数。当我们仅有两个特征,即n=2时,这个式子可以写作:
现在让我们考虑下面这里的训练样本。现在,继续使用之前的简化,即,我们来看一下支持向量机会选择什么样的决策界。这是一种选择,我们假设支持向量机会选择这个决策边界。这不是一个非常好的选择,因为它的间距很小。这个决策界离训练样本的距离很近。我们来看一下为什么支持向量机不会选择它。
对于这样选择的参数θ,可以看到参数向量θθ事实上是和决策界是90度正交的,因此这个绿色的决策界对应着一个参数向量θ这个方向,顺便提一句的简化仅仅意味着决策界必须通过原点(0,0)(0,0)。现在让我们看一下这对于优化目标函数意味着什么。
以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些p(i)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设,就是参数。
的意思是我们让决策界通过原点。如果你令
的话,含义就是你希望决策界不通过原点。我将不会做全部的推导。实际上,支持向量机产生大间距分类器的结论,会被证明同样成立,证明方式是非常类似的,是我们刚刚做的证明的推广。
之前说过,即便,支持向量机要做的事情都是优化这个目标函数对应着C值非常大的情况,但是可以说明的是,即便
,支持向量机仍然会找到正样本和负样本之间的大间距分隔。
12.4 核函数1
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题:
为了获得上图所示的判定边界,我们的模型可能是的形式。
我们可以用一系列的新的特征f来替换模型中的每一项。例如令:得到
。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造
?我们可以利用核函数来计算出新的特征。
给定一个训练样本x,我们利用x的各个特征与我们预先选定的地标(landmarks)的近似程度来选取新的特征
。
例如:
其中:, 为实例x中所有特征与地标
之间的距离的和。上例中的
就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。
这些地标的作用是什么?如果一个训练样本与地标
之间的距离近似于0,则新特征
近似于
,如果训练样本x与地标
之间距离较远,则
近似于
。z表示一个较大的数。
假设我们的训练样本含有两个特征,给定地标
与不同的σ值,见下图:
图中水平面的坐标为而垂直坐标轴代表
。可以看出,只有当
与
重合时
才具有最大值。随着
的改变ff值改变的速率受到
的控制。
在下图中,当样本处于洋红色的点位置处,因为其离更近,但是离
和
较远,因此
接近1,而
接近0。因此
,因此预测y=1。同理可以求出,对于离
较近的绿色点,也预测y=1,但是对于蓝绿色的点,因为其离三个地标都较远,预测y=0。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练样本和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练样本本身的特征,而是通过核函数计算出的新特征。
12.5 核函数2
在上一节我们讨论了核函数这个想法,以及怎样利用它去实现支持向量机的一些新特性。在这一节我将补充一些缺失的细节,并简单的介绍一下怎么在实际中使用应用这些想法。
如何选择地标?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有m个样本,则我们选取m个地标,并且令: 。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
• 给定x,计算新特征f,当 时,预测 y=1,否则反之。
相应地修改代价函数为:,
在具体实施过程中,我们还需要对最后的正则化项进行些微调整,在计算时,我们用
代替
,其中M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。
理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。
在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如liblinear,libsvm等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的两个参数C和σ的影响:
C=1/λ
C较大时,相当于λ较小,可能会导致过拟合,高方差;
C较小时,相当于λ较大,可能会导致低拟合,高偏差;
σ较大时,可能会导致低方差,高偏差;
σ较小时,可能会导致低偏差,高方差。
12.6 使用支持向量机
目前为止,我们已经讨论了SVM比较抽象的层面,在这个视频中我将要讨论到为了运行或者运用SVM。你实际上所需要的一些东西:支持向量机算法,提出了一个特别优化的问题。但是就如在之前的视频中我简单提到的,我真的不建议你自己写软件来求解参数θ,因此由于今天我们中的很少人,或者其实没有人考虑过自己写代码来转换矩阵,或求一个数的平方根等我们只是知道如何去调用库函数来实现这些功能。同样的,用以解决SVM最优化问题的软件很复杂,且已经有研究者做了很多年数值优化了。因此你提出好的软件库和好的软件包来做这样一些事儿。然后强烈建议使用高优化软件库中的一个,而不是尝试自己落实一些数据。有许多好的软件库,我正好用得最多的两个是liblinear和libsvm,但是真的有很多软件库可以用来做这件事儿。你可以连接许多你可能会用来编写学习算法的主要编程语言。
在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等…
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer’s定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有k个类,则我们需要kk个模型,以及kk个参数向量θ。我们同样也可以训练k个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
尽管你不去写你自己的SVM的优化软件,但是你也需要做几件事:
1、是提出参数C的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的SVM(支持向量机),这就意味这他使用了不带有核函数的SVM(支持向量机)。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?
下面是一些普遍使用的准则:
n为特征数,m为训练样本数。
(1)如果相较于m而言,n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果n较小,而且m大小中等,例如n在 1-1000 之间,而m在10-10000之间,使用高斯核函数的支持向量机。
(3)如果n较小,而m较大,例如n在1-1000之间,而m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
参考资料: