吴恩达机器学习课程笔记+代码实现(16)11.支持向量机(Support Vector Machines)

11.支持向量机(Support Vector Machines)


本章编程作业及代码实现部分见:Python实现支持向量机

11.1 优化目标

       在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法A还是学习算法B,而更重要的是,应用这些算法时,所创建的大量数据在应用这些算法时,表现情况通常依赖于你的水平。比如:你为学习算法所设计的特征量的选择,以及如何选择正则化参数,诸如此类的事。还有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持向量机(Support Vector Machine)。与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

       我们从优化目标开始。为了描述支持向量机,事实上,我将会从逻辑回归开始展示我们如何一点一点修改来得到本质上的支持向量机。
       在这里插入图片描述

       那么,在逻辑回归中我们已经熟悉了这里的假设函数形式,和右边的S型激励函数。然而,为了解释一些数学知识.我将用 z z 表示 θ T x \theta^Tx

       现在考虑下我们想要逻辑回归做什么:如果有一个 y = 1 y=1 的样本,是不管是在训练集中或是在测试集中,又或者在交叉验证集中,总之是 y = 1 y=1 ,现在我们希望 h θ ( x ) {{h}_{\theta }}\left( x \right) 趋近1。因为我们想要正确地将此样本分类,这就意味着当 h θ ( x ) {{h}_{\theta }}\left( x \right) 趋近于1时, θ T x \theta^Tx 应当远大于0,这里的 > > >> 意思是远远大于0。这是因为由于 z z 表示 θ T x \theta^Tx ,当 z z 远大于0时,即到了该图的右边,你不难发现此时逻辑回归的输出将趋近于1。相反地,如果我们有另一个样本,即 y = 0 y=0 。我们希望假设函数的输出值将趋近于0,这对应于 θ T x \theta^Tx ,或者就是 z z 会远小于0,因为对应的假设函数的输出值趋近0。
       在这里插入图片描述

       如果你进一步观察逻辑回归的代价函数,你会发现每个样本 ( x , y ) (x,y) 都会为总代价函数,增加这里的一项,因此,对于总代价函数通常会有对所有的训练样本求和,并且这里还有一个 1 / m 1/m 项,但是,在逻辑回归中,这里的这一项就是表示一个训练样本所对应的表达式。现在,如果我将完整定义的假设函数代入这里。那么,我们就会得到每一个训练样本都影响这一项。

       现在,先忽略 1 / m 1/m 这一项,但是这一项是影响整个总代价函数中的这一项的。

       一起来考虑两种情况:

       一种是 y y 等于1的情况;另一种是 y y 等于0的情况。

       在第一种情况中,假设 y = 1 y=1 ,此时在目标函数中只需有第一项起作用,因为 y = 1 y=1 时, ( 1 y ) (1-y) 项将等于0。因此,当在 y = 1 y=1 的样本中时,即在 ( x , y ) (x, y) 中 ,我们得到 y = 1 y=1 log ( 1 1 1 + e z ) -\log(1-\frac{1}{1+e^{-z}})​ 这样一项。

       我用 z z 表示 θ T x \theta^Tx ,即: z = θ T x z= \theta^Tx 。当然,在代价函数中, y y 前面有负号。我们只是这样表示,如果 y = 1 y=1 代价函数中,这一项也等于1。这样做是为了简化此处的表达式。如果画出关于 z z 的函数,你会看到左下角的这条曲线,我们同样可以看到,当 z z 增大时,也就是相当于 θ T x \theta^Tx 增大时, z z 对应的值会变的非常小。对整个代价函数而言,影响也非常小。这也就解释了,为什么逻辑回归在观察到正样本 y = 1 y=1 时,试图将 θ T x \theta^Tx 设置得非常大。因为,在代价函数中的这一项会变的非常小。

       现在开始建立支持向量机,我们从这里开始:

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

       目前,我们只是讨论了 y = 1 y=1 的情况,另外一种情况是当 y = 0 y=0 时,此时如果你仔细观察代价函数只留下了第二项,因为第一项被消除了。如果当 y = 0 y=0 时,那么这一项也就是0了。所以上述表达式只留下了第二项。因此,这个样本的代价或是代价函数的贡献。将会由这一项表示。并且,如果你将这一项作为 z z 的函数,那么,这里就会得到横轴 z z 。现在,你完成了支持向量机中的部分内容,同样地,我们要替代这一条蓝色的线,用相似的方法。
       在这里插入图片描述
       如果我们用一个新的代价函数来代替,即这条从0点开始的水平直线,然后是一条斜线,像上图。那么,现在让我给这两个方程命名,左边的函数,我称之为 cos t 1 ( z ) {\cos}t_1{(z)} ,同时,右边函数我称它为 cos t 0 ( z ) {\cos}t_0{(z)} 。这里的下标是指在代价函数中,对应的 y = 1 y=1 y = 0 y=0 的情况,拥有了这些定义后,现在,我们就开始构建支持向量机。
       在这里插入图片描述
       这是我们在逻辑回归中使用代价函数 J ( θ ) J(\theta) 。也许这个方程看起来不是非常熟悉。这是因为之前有个负号在方程外面,但是,这里我所做的是,将负号移到了表达式的里面,这样做使得方程看起来有些不同。对于支持向量机而言,实质上我们要将这替换为 cos t 1 ( z ) {\cos}t_1{(z)} ,也就是 cos t 1 ( θ T x ) {\cos}t_1{(\theta^Tx)} ,同样地,我也将这一项替换为 cos t 0 ( z ) {\cos}t_0{(z)} ,也就是代价 cos t 0 ( θ T x ) {\cos}t_0{(\theta^Tx)} 。这里的代价函数 cos t 1 {\cos}t_1 ,就是之前所提到的那条线。此外,代价函数 cos t 0 {\cos}t_0 ,也是上面所介绍过的那条线。因此,对于支持向量机,我们得到了这里的最小化问题,即:

       在这里插入图片描述
       然后,再加上正则化参数。现在,按照支持向量机的惯例,我们的书写会稍微有些不同,代价函数的参数表示也会稍微有些不同。

       首先,我们要除去 1 / m 1/m 这一项,当然,这仅仅是由于人们使用支持向量机时,对比于逻辑回归而言,不同的习惯所致,但这里我所说的意思是:你知道,我将要做的是仅仅除去 1 / m 1/m 这一项,但是,这也会得出同样的 θ {{\theta }} 最优值,好的,因为 1 / m 1/m 仅是个常量,因此,你知道在这个最小化问题中,无论前面是否有 1 / m 1/m 这一项,最终我所得到的最优值 θ {{\theta }} 都是一样的。这里我的意思是,先给你举一个样本,假定有一最小化问题:即要求当 ( u 5 ) 2 + 1 (u-5)^2+1 取得最小值时的 u u 值,这时最小值为:当 u = 5 u=5 时取得最小值。

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

       最后是逻辑回归输出的概率。在这里,我们的代价函数,当最小化代价函数,获得参数 θ {{\theta }} 时,支持向量机所做的是它来直接预测 y y 的值等于1,还是等于0。因此,这个假设函数会预测1。当 θ T x \theta^Tx 大于或者等于0时,或者等于0时,所以学习参数 θ {{\theta }} 就是支持向量机假设函数的形式。那么,这就是支持向量机数学上的定义。
       在这里插入图片描述

11.2 大边界的直观理解

       人们有时将支持向量机看作是大间距分类器。在这一部分将介绍其中的含义,这有助于我们直观理解SVM模型的假设是什么样的。
       在这里插入图片描述
       这是我的支持向量机模型的代价函数,在左边这里我画出了关于 z z 的代价函数 cos t 1 ( z ) {\cos}t_1{(z)} ,此函数用于正样本,而在右边这里我画出了关于 z z 的代价函数 cos t 0 ( z ) {\cos}t_0{(z)} ,横轴表示 z z ,现在让我们考虑一下,最小化这些代价函数的必要条件是什么。如果你有一个正样本, y = 1 y=1 ,则只有在 z > = 1 z>=1 时,代价函数 cos t 1 ( z ) {\cos}t_1{(z)} 才等于0。

       换句话说,如果你有一个正样本,我们会希望 θ T x &gt; = 1 \theta^Tx&gt;=1 ,反之,如果 y = 0 y=0 ,我们观察一下,函数 cos t 0 ( z ) {\cos}t_0{(z)} ,它只有在 z &lt; = 1 z&lt;=-1 的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本 y = 1 y=1 ,则其实我们仅仅要求 θ T x \theta^Tx 大于等于0,就能将该样本恰当分出,这是因为如果 θ T x \theta^Tx >0大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要 θ T x \theta^Tx <=0就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求 θ T x \theta^Tx >0,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。

       当然,逻辑回归做了类似的事情。但是让我们看一下,在支持向量机中,这个因子会导致什么结果。具体而言,我接下来会考虑一个特例。我们将这个常数 C C 设置成一个非常大的值。比如我们假设 C C 的值为100000或者其它非常大的数,然后来观察支持向量机会给出什么结果?

       在这里插入图片描述
       如果 C C 非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为0的最优解。因此,让我们尝试在代价项的第一项为0的情形下理解该优化问题。比如我们可以把 C C 设置成了非常大的常数,这将给我们一些关于支持向量机模型的直观感受。
       在这里插入图片描述
       我们已经看到输入一个训练样本标签为 y = 1 y=1​ ,你想令第一项为0,你需要做的是找到一个 θ {{\theta }}​ ,使得 θ T x &gt; = 1 \theta^Tx&gt;=1​ ,类似地,对于一个训练样本,标签为 y = 0 y=0​ ,为了使 cos t 0 ( z ) {\cos}t_0{(z)}​ 函数的值为0,我们需要 θ T x &lt; = 1 \theta^Tx&lt;=-1​ 。因此,现在考虑我们的优化问题。选择参数,使得第一项等于0,就会导致下面的优化问题,因为我们将选择参数使第一项为0,因此这个函数的第一项为0,因此是 C C​ 乘以0加上二分之一乘以第二项。这里第一项是 C C​ 乘以0,因此可以将其删去,因为我知道它是0。

       这将遵从以下的约束: θ T x ( i ) &gt; = 1 \theta^Tx^{(i)}&gt;=1 ,如果 y ( i ) y^{(i)} 是等于1 的, θ T x ( i ) &lt; = 1 \theta^Tx^{(i)}&lt;=-1 ,如果样本 i i 是一个负样本,这样当你求解这个优化问题的时候,当你最小化这个关于变量 θ {{\theta }} 的函数的时候,你会得到一个非常有趣的决策边界。
       在这里插入图片描述
       具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的。我的意思是,存在一条直线把正负样本分开。当然有多条不同的直线,可以把正样本和负样本完全分开。

       在这里插入图片描述

       比如,这就是一个决策边界可以把正样本和负样本分开。但是多多少少这个看起来并不是非常自然是么?

       或者我们可以画一条更差的决策界,这是另一条决策边界,可以将正样本和负样本分开,但仅仅是勉强分开,这些决策边界看起来都不是特别好的选择,支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界。这条黑色的看起来好得多,黑线看起来是更稳健的决策界。在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?这条黑线有更大的距离,这个距离叫做间距(margin)。
       在这里插入图片描述

       当画出这两条额外的蓝线,我们看到黑色的决策界和训练样本之间有更大的最短距离。然而粉线和蓝线离训练样本就非常近,在分离样本的时候就会比黑线表现差。因此,这个距离叫做支持向量机的间距,而这是支持向量机具有鲁棒性的原因,因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器,而这其实是求解上一页幻灯片上优化问题的结果。

       优化问题为什么会产生这个结果?它是如何产生这个大间距分类器的呢?

       我将会从直观上略述为什么这个优化问题会产生大间距分类器。总之这个图示有助于你理解支持向量机模型的做法,即努力将正样本和负样本用最大的间距分开。

       在这里插入图片描述
       我们将这个大间距分类器中的正则化因子常数 C C 设置的非常大,我记得我将其设置为了100000,因此对这样的一个数据集,也许我们将选择这样的决策界,从而最大间距地分离开正样本和负样本。那么在让代价函数最小化的过程中,我们希望找出在 y = 1 y=1 y = 0 y=0 两种情况下都使得代价函数中左边的这一项尽量为零的参数。如果我们找到了这样的参数,则我们的最小化问题便转变成:
       在这里插入图片描述

       事实上,支持向量机现在要比这个大间距分类器所体现得更成熟,尤其是当你使用大间距分类器的时候,你的学习算法会受异常点(outlier) 的影响。比如我们加入一个额外的正样本。

       在这里插入图片描述

       在这里,如果你加了这个样本,为了将样本用最大间距分开,也许我最终会得到一条类似这样的决策界,对么?就是这条粉色的线,仅仅基于一个异常值,仅仅基于一个样本,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。而如果正则化参数 C C ,设置的非常大,这事实上正是支持向量机将会做的。它将决策界,从黑线变到了粉线,但是如果 C C 设置的小一点,如果你将C设置的不要太大,则你最终会得到这条黑线,当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们恰当分开。因此,大间距分类器的描述,仅仅是从直观上给出了正则化参数 C C 非常大的情形,同时,要提醒你 C C 的作用类似于 1 / λ 1/\lambda λ \lambda 是我们之前使用过的正则化参数。这只是 C C 非常大的情形,或者等价地 λ \lambda 非常小的情形。你最终会得到类似粉线这样的决策界,但是实际上应用支持向量机的时候, C C 不是非常非常大的时候,它可以忽略掉一些异常点的影响,得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。

       回顾 C = 1 / λ C=1/\lambda ,因此:

        C C 较大时,相当于 λ \lambda 较小,可能会导致过拟合,高方差

        C C 较小时,相当于 λ \lambda 较大,可能会导致低拟合,高偏差

参考资料: 吴恩达机器学习课程;黄海广机器学习课程笔记