吴恩达机器学习笔记-支持向量机

发布于 2018-10-11  228 次阅读


优化目标

之前的课程有学习过Logistic回归的假设函数:
h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}
其图像如下:

从图像可以看出,如果y=1的话,那么我们希望h_\theta(x) \approx 1,那么\theta^Tx >> 0;如果y=0的话,那么我们希望h_\theta(x) \approx 0,那么\theta^Tx << 0;对于Logistic回归的一个样本的代价则可以表示为:
-(ylogh_\theta(x) + (1-y)log(1-h_\theta(x))) = -ylog\frac{1}{1+e^{-\theta^Tx}} - (1-y)log(1-log\frac{1}{1+e^{-\theta^Tx}})

当y=1时,该函数就只剩减号左边的部分,画出的图像就是-log\frac{1}{1+e^{-\theta^Tx}}的图像,然后我们开始建立支持向量机。首先从这个函数y一点点的进行修改,取这里的z=1点,先画出将要用的代价函数,新的代价函数将会水平的从这里到右边,然后再画一条同逻辑回归非常相似的直线,但是在这里是一条直线,也就是 用紫红色画的曲线。那么到了这里已经非常接近逻辑回归中使用的代价函数了,只是这里是由两条线段组成 即位于右边的水平部分和位于左边的直线部分。先别过多的考虑左边直线部分的斜率,这并不是很重要,但是 这里我们将使用的新的代价函数是在y=1的前提下的。你也许能想到这应该能做同逻辑回归中类似的事情但事实上在之后的的优化问题中这会变得更坚定,并且为支持向量机带来计算上的优势。

同理y时,该函数只剩下减号右边部分,即-log(1-log\frac{1}{1+e^{-\theta^Tx}})。这个样本的代价或是代价函数的贡献将会由这一项表示,并且,如果你将这一项作为z的函数,那么,这里就会得到横轴z,现在 已经完成了支持向量机中的部分内容。同样地,再来一次,我们要替代这一条蓝色的线,用相似的方法。如果用 一个新的代价函数来代替,即这条从0点开始的水平直线,然后是一条斜线。那么,现在给这两个方程命名左边的函数称之为cost_1(z)。同时,在右边函数称它为cost_0(z)这里的下标是指,在代价函数中对应的y=1和 y=0的情况。拥有了这些定义后。现在,我们就开始构建支持向量机。

首先写出之前logistic回归的代价函数,但这里把负号移动到表达式的里面。对于支持向量机而言,将中括号里-logh_\theta(x^(i))表示为cost_1(\theta^Tx^(i)),后面的-log(1-h_\theta(x^(i)))表示为cost_0(\theta^Tx^(i))。对于逻辑回归,在目标函数中,我们有两项,第一项是来自于训练样本的代价,第二项是正则化项,我们不得不去,用这一项来平衡。这就相当于我们想要最小化A加上正则化参数λ然后乘以其他项B:A+\lambda B。这里的A表示这里的第一项,用B表示第二项但不包括λ。

我们不是优化这里的A+\lambda B,我们所做的,是通过设置不同正则参数\lambda达到优化目的。这样 就能够权衡对应的项,使得训练样本拟合的更好。即最小化A还是对于B项而言保证正则参数足够小。但对于支持向量机,按照惯例将使用一个不同的参数,为了替换这里使用的\lambda来权衡这两项,使用一个不同的参数称为C,同时改为优化目标C*A+B,因此,在逻辑回归中,如果给定\lambda一个非常大的值,意味着给予B更大的权重,而这里就对应于将C设定为非常小的值,那么相应的将会给B比给A更大的权重。这只是一种不同的方式来控制这种权衡或者一种不同的方法,即用参数来决定是更关心第一项的优化还是更关心第二项的优化。当然你也可以把这里的参数C考虑成\frac{1}{\lambda},同\frac{1}{\lambda}所扮演的角色相同,并且这两个方程或这两个表达式并不相同,因为C等于\frac{1}{\lambda},但是也并不全是这,如果当C等于\frac{1}{\lambda}时,这两个优化目标应当得到相同的值相同的最优值\theta,因此就用它们来代替。那么,现在删掉这里的\lambda并且用常数C来代替这里。这就得到了在支持向量机中,我们的整个优化目标函数,然后最小化这个目标函数得到SVM学习到的参数C。

最后,有别于逻辑回归,输出的概率在这里,当最小化代价函数 获得参数\theta时,支持向量机所做的是,它来直接预测y的值等于1还是等于0,因此,这个假设函数会预测当\theta^Tx大于等于0或者小于0时。所以学习参数θ就是支持向量机假设函数的形式。

直观上对大间隔的理解

下图中的公式表示了支持向量机模型的代价函数,左边的图中,画出了z的代价函数,此函数适用于正样本,右边画的z的代价函数,适用于负样本。

当y=1时,我们需要\theta^Tx>=1(并不是仅仅大于0),当y=0时,我们需要\theta^Tx<=-1(并不是仅仅小于0)。我们假设常量C的值为一个很大的数,比如100000,然后观察支持向量机会给出什么结果。如果C非常大则最小化代价函数的时候,我们将会很希望找到一个使第一项为0的最优解。则其实我们是要得到min\frac{1}{2}\sum_{i=1}^{n}\theta_j^2

y^(i) = 1,我们需要\theta^Tx^(i)>=1,同样对于一个样本y^(i) = 0,我们需要\theta^Tx^(i)<=-1.

具体而言,如果考察下面这样一个数据集:

其中有正样本也有负样本,可以看到这个数据是线性可分的,即存在一条直线把正负样本分开,且这里存在有多条不同的直线可以把正负样本分开。支持向量机会选择图中黑色的这条线来作为决策边界,相对于其他的线来看要更合理些。从数学上来讲,这条黑线和训练样本之间有着更大的最短距离,这个距离被称作支持向量机的间距,这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此SVM经常被称作是一种大间距分类器(Large Margin Intuition)。

在实际的使用中,我们可能会出现一些异常点数据,比如下图:

由于异常点的存在,决策边界可能就变成了图中倾斜的那条线,这显然是不明智的。因此,如果C设置的非常大,这也是支持向量机将会做的,它从图中较为竖直的线变为了倾斜的那条,但如果C的值设置的小一点,最终将会得到图中较为竖直的线。当然,如果数据不是线性可分的,支持向量机也可以将它们分开。因此大间距分类器仅仅是从直观上给出了正则化参数C非常大的情形。同时要提醒你C的作用类似于\frac{1}{\lambda},\lambda是我们之前使用过的正则化参数,这只是C非常大的情形或者等价\lambda非常小的情形。实际上当C不是非常大时,支持向量机可以忽略掉一些异常点的影响,得到更好的决策边界,甚至当数据不是线性可分的时候也能给出很好的结果。

核函数

假设有个数据集如下图所示,我们希望拟合一个非线性的决策边界来区分正负样本,一种方法是构造多项式特征变量如图中所示:

这里介绍一种新的写法:\theta_0+\theta_1 f_1+\theta_2 f_2+\theta_3 f_3+...,这里的一系列将要计算的新的特征变量。那么现在有一个问题,有没有比这些高阶项更好的特征变量呢?

如图,我们选择三个点l^(1),l^(2),l^(3),给定x,计算新的特征,这个特征衡量标记点和原先样本点的相似性。f_i=similarity(x^(i),l^(i))=exp(-\frac{||x^(i)-l^(i)||^2}{2\sigma^2}),其中exp中的函数为高斯核函数。

很显然可以得出若x\approx l^(1),则f_1 \approx 1;若x\approx远离 l^(1),则f_1 \approx 0。然后再看\sigma对核函数的影响:

通过上图可以看出,\sigma越大收敛越慢,反之收敛越快。

那么现在有个问题,上述的标记点是随机取得,这很显然没那么简单,有一种较好的方法,是将训练集中的正样本作为标记点,对于每一个训练集中的数据,我们都有一个m+1维向量与之对应。 这里的f_0默认为1。如下图所示:

将核函数运用到支持向量机中来看,给定x,计算特征f\in R^{m+1},我们预测当\theta^Tf>=0时y=1。假设函数则为:h_\theta(x) = \theta_0 + \theta_1 f_1+\theta_2 f_2+\theta_3 f_3+...。相应的,代价函数也修改如下图中所示:

在实际使用中,我们还需要对正则化项进行调整,计算\sum_{j=1}^{n=m}\theta_j^2=\theta^T\theta时,会用\theta^TM\theta来代替\theta^T\theta,其中M是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用M来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。

下面是支持向量机的两个参数 C 和 \sigma 的影响(C可以看做\frac{1}{\lambda}):
C较大时,相当于 \lambda 较小,可能会导致过拟合,高方差;
C较小时,相当于\lambda较大,可能会导致低拟合,高偏差;
\sigma较大时,可能会导致低方差,高偏差;
\sigma较小时,可能会导致低偏差,高方差。

实践SVM

在实际工作中,我们往往使用已有的工具包中所包含的SVM。在使用时,我们需要注意其中的参数选定和选择想要使用的核函数。其中一个选择是不需要使用任何内核参数,这也叫作线性核函数。因此如果有人说使用了线性核函数的SVM,这就意味着使用了不带有核函数的SVM。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?如下图所示:

如果n很大,接近m,那么使用Logistic回归或者线性SVM;
如果n很小,m大小适中,使用高斯核函数;
如果n很小,m很大,则可以创建新的特征然后使用logistic回归或者线性SVM
神经网络在上面几种情况下都可能有较好的表现,但训练神经网络非常慢。

以上,为吴恩达机器学习第七周支持向量机的课程笔记。


叶子是明明的小太阳