优化目标
与逻辑回归和神经网络相比,支持向量机,或者简称 SVM,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。
现在考虑下我们想要逻辑回归做什么:如果有一个 𝑦 = 1的样本,不管是在训练集中或是在测试集中,又或者在交叉验证集中,总之是 𝑦 = 1,现在我们希望?𝜃(𝑥) 趋近 1,因为我们想要正确地将此样本分类。这就意味着当 ?𝜃(𝑥)趋近于 1 时,𝜃𝑇𝑥 应当远大于 0,这里的>>意思是远远大于 0。这是因为由于 𝑧 表示 𝜃𝑇𝑥,当 𝑧远大于 0 时,即到了该图的右边,你不难发现此时逻辑回归的输出将趋近于 1。相反地,如果我们有另一个样本,即𝑦 = 0。我们希望假设函数的输出值将趋近于 0,这对应于𝜃𝑇𝑥,或者就是 𝑧 会远小于 0,因为对应的假设函数的输出值趋近 0。 现在,一起来考虑两种情况: 一种是𝑦等于 1 的情况;另一种是 𝑦 等于 0 的情况。 在第一种情况中,假设 𝑦 = 1 ,此时在目标函数中只需有第一项起作用,因为𝑦 = 1时,(1 ? 𝑦)项将等于 0。因此,当在 𝑦 = 1 的样本中时,我们得到**?log(1?1/1+𝑒??)**这样一项。 用 𝑧 表示𝜃𝑇𝑥,即: 𝑧 = 𝜃𝑇𝑥。如果画出关于𝑧 的函数,你会看到下图的这条曲线,我们同样可以看到,当𝑧 增大时,也就是相当于𝜃𝑇𝑥增大时,?log(1?1/1+𝑒??)会变的非常小。对整个代价函数而言,影响也非常小。这也就解释了,为什么逻辑回归在观察到正样本𝑦 = 1时,试图将𝜃𝑇𝑥设置得非常大。因为,在代价函数中的这一项会变的非常小。 现在开始建立支持向量机,从这个代价函数开始,也就是?log(1?1/1+𝑒??)一点一点修改,取𝑧 = 1点,我先画出将要用的代价函数。
新的代价函数将会水平的线从z=1延申到右边(图外),然后再画一条同逻辑回归非常相似的直线,但是,在这里是一条直线,也就是用紫红色画的曲线。那么,到了这里已经非常接近逻辑回归中使用的代价函数了。只是这里是由两条线段组成,即位于右边的水平部分和位于左边的直线部分,这里使用的新的代价函数cos𝑡1(𝑧),是在𝑦 = 1的前提下的。另外一种情况是当𝑦 = 0时,此时如果你仔细观察代价函数只留下了第二项?(1-y)log(1?1/1+𝑒??)。因此,这个样本的代价或是代价函数的贡献,将会由这一项表示。并且,如果你将这一项作为𝑧的函数,那么,这里就会得到横轴𝑧。现在,你完成了支持向量机中的部分内容,同样地,我们要替代这一条蓝色的线,用相似的方法。 如果我们用一个新的代价函数**cos𝑡0(𝑧)**来代替,即这条从 0 点开始的水平直线,然后是一条斜线。 拥有了这些定义后,现在,我们就开始构建支持向量机。
这是我们在逻辑回归中使用代价函数𝐽(𝜃)。(将负号移到了表达式的里面) 对于支持向量机而言,实质上我们要将这替换为cos𝑡1(𝑧)、cos𝑡0(𝑧)的表达式。 因此,对于支持向量机,我们得到了这里的最小化问题,即: 按照支持向量机的惯例,事实上,我们的书写会稍微有些不同,代价函数的参数表示也会稍微有些不同。
- 除去1/𝑚
首先,我们要除去1/𝑚这一项,因为1/𝑚 仅是个常量,因此,在这个最小化问题中,无论前面是否有1/𝑚 这一项,最终所得到的最优值𝜃都是一样的。
- 用参数来决定是更关心第一项的优化,还是更关心第二项的优化
对于逻辑回归,在目标函数中,我们有两项:第一个是训练样本的代价,第二个是我们的正则化项,我们不得不去用这一项来平衡。这就相当于我们想要最小化𝐴加上正则化参数𝜆,然后乘以其他项𝐵,即:𝐴 + 𝜆 × 𝐵,这里的𝐴表示这里的第一项,同时我用 B 表示第二项,但不包括𝜆。我们所做的是通过设置不同正则参数𝜆达到优化目的,这样就能够权衡对应的项,使得训练样本拟合的更好。即最小化𝐴,还是保证正则参数足够小即是对于 B 项而言。在逻辑回归中,如果 给定𝜆,一个非常大的值,意味着给予 B 更大的权重。 - 对于支持向量机,按照惯例,我们将使用一个不同的参数替换这里使用的𝜆来权衡这两项。第一项和第二项我们依照惯例使用一个不同的参数称为𝐶,同时改为优化目标:𝐶 × 𝐴 +𝐵。而这里,就对应将𝐶 设定为非常小的值,那么,相应的将会给𝐵比给𝐴更大的权重。因此,这只是一种不同的方式来控制这种权衡或者一种不同的方法,即用参数来决定是更关心第一项的优化,还是更关心第二项的优化。
把这里的参数𝐶 考虑成1/𝜆,同 1/𝜆所扮演的角色相同,并且这两个方程或这两个表达式并不相同,因为当𝐶 = 1/𝜆时,这两个优化目标应当得到相同的值,相同的最优值𝜃。 因此,这就得到了在支持向量机中我们的整个优化目标函数。然后最小化这个目标函数,得到 SVM 学习到的参数𝐶。 最后有别于逻辑回归输出的概率:在这里的代价函数,当最小化代价函数,获得参数𝜃时,支持向量机所做的是它来直接预测𝑦的值等于 1,还是等于 0。当𝜃𝑇𝑥大于或者等于 0 时,学习参数𝜃就是支持向量机假设函数的形式。那么,这就是支持向量机数学上的定义。
理解支持向量机的意义
对于普通的逻辑回归,如果你有一个正样本𝑦 = 1,我们仅仅要求𝜃𝑇𝑥>=0,反之,如果𝑦 = 0,仅需要𝜃𝑇𝑥<=0 就会将负例正确分离。 但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,即不仅仅要求𝜃𝑇𝑥>=0,我们需要的是比 0 值大很多,比如大于 等于 1,我也想这个比 0 小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。 在支持向量机中,这个因子有什么具体的意义? 例如:我们假设𝐶的值为 100000 或者其它非常大的数,然后来观察支持向量机会给出什么结果?
如果 𝐶非常大,则最小化代价函数的时候,我们将会很希望找到一个使第一项为 0 的最优解。 即:𝐶*0 +,前提:当𝜃𝑇𝑥>=1,y=1或𝜃𝑇𝑥=<-1,y=0。 具体而言,如果你考察这样一个数据集,其中有正样本,也有负样本,可以看到这个数据集是线性可分的(存在一条直线把正负样本分开)。 当然有多条不同的直线,可以把正样本和负样本完全分开。比如图中所示:黑线、红线、绿线。 支持向量机将会选择这个黑色的决策边界,相较于之前我用粉色或者绿色画的决策界,黑线看起来是更稳健的决策界,在分离正样本和负样本上它显得的更好。数学上来讲,这是什么意思呢?黑色的决策界和训练样本之间有更大的最短距离,这个距离叫做支持向量机的间距(margin),而这是支持向量机具有鲁棒性的原因(一个具有鲁棒性的机器学习模型能够不被这些训练集中的错误数据影响),因为它努力用一个最大间距来分离样本。因此支持向量机有时被称为大间距分类器。
为什么这个优化问题会产生大间距分类器? 这个图示有助于你理解支持向量机模型的做法,即努力将正样本和负样本用最大的间距分开。 𝐶取特别大的值时: 对于图中的数据可以得到黑色的分类线,若增加如图的负类异常点,会得到红色分界线。 仅仅基于一个异常值,就将我的决策界从这条黑线变到这条粉线,这实在是不明智的。但是如果𝐶设置的小一点,如果你将 C 设置的不要太大,则你最终还会得到这条黑线;当然数据如果不是线性可分的,如果你在这里有一些正样本或者你在这里有一些负样本,则支持向量机也会将它们按黑线分开。 𝐶的作用类似于1/𝜆,𝜆是我们之前使用过的正则化参数。当𝐶不是非常非常大的时候,它可以忽略掉一些异常点的影响, 得到更好的决策界。甚至当你的数据不是线性可分的时候,支持向量机也可以给出好的结果。 回顾 𝐶 = 1/𝜆,因此: 𝐶 较大时,相当于 𝜆 较小,可能会导致过拟合,高方差。 𝐶 较小时,相当于 𝜆 较大,可能会导致低拟合,高偏差。
大边界分类背后的数学
向量内积
假设有两个向量𝑢和𝑣,两个都是二维向量。由于是二维向量,我可以将它们画在这个图上。 𝑢?𝑣也叫做向量𝑢和𝑣之间的内积。 ∥𝑢∥表示𝑢的范数,即𝑢的长度,即向量𝑢的欧几里得长度。根据毕达哥拉斯定理,∥𝑢∥ = √𝑢?2 + 𝑢?2,这是向量𝑢的长度,它是一个实数。 𝑢?𝑣 = 𝑝?∥𝑢∥,p为向量𝑣投影到向量𝑢上的投影。𝑢?𝑣就是[𝑢1 𝑢2] 这个一行两列的矩阵乘以𝑣。因此可以得到𝑢1 × 𝑣1 + 𝑢2 × 𝑣2。所以,𝑢?𝑣 =𝑣?𝑢 需要注意的就是𝑝值,𝑝事实上是有符号的,即它可能是正值,也可能是负值。下图所示的p即为负值。
接下来将会使用这些关于向量内积的性质试图来理解支持向量机中的目标函数。 这就是我们先前给出的支持向量机模型中的目标函数。为了讲解方便,我做一点简化,仅仅是为了让目标函数更容易被分析。忽略掉截距,令𝜃0 = 0,这样更容易画示意图,将特征数𝑛置为 2,因此我们仅有两个特征𝑥1, 𝑥2。 对于支持向量机的优化目标函数,,这个式子可以写作:,注意到括号里面的这一项是向量𝜃的范数,或者说是向量𝜃的长度。 那么红线的这一项就是向量𝜃的长度或范数。 这意味着我们的目标函数是等于1/2∥𝜃∥2。因此支持向量机做的全部事情,就是极小化参数向量𝜃范数的平方,或者说长度的平方。 我们知道的是𝜃?𝑥(𝑖)将会等于𝑝 乘以向量 𝜃 的长度或范数。这个𝜃?𝑥(𝑖) >= 1 约束是可以被𝑝(𝑖)?∥𝜃∥ >= 1这个约束所代替的。因为𝜃?𝑥(𝑖) = 𝑝(𝑖)?∥𝜃∥ ,将其写入我们的优化目标。我们将会得到没有了约束,𝜃?𝑥(𝑖)而变成了𝑝(𝑖)? ∥𝜃∥。
现在让我们考虑下面这里的训练样本。 𝜃0 = 0,我们来看一下支持向量机会选择什么样的决策界。 若选择绿色的这条边界。 参数向量𝜃事实上是和决策界是 90 度正交的,因此这个绿色的决策界对应着一个参数向量𝜃这个方向,顺便提一句𝜃0 = 0的简化仅仅意味着决策界必须通过原点(0,0)。现在让我们看一下这对于优化目标函数意味着什么。
第一个样本𝑥(1),这个样本到参数𝜃的投影,是这个短的红线段,就等于𝑝(1),它非常短。类似地,这个样本如果它恰好是𝑥(2),我的第二个训练样本,则它到𝜃的投影在这里。我将它画成粉色,这个短的粉色线段是𝑝(2),即第二个样本到我的参数向量𝜃的投影。因此,这个投影非常短。𝑝(2)事实上是一个负值,𝑝(2)是在相反的方向,这个向量和参数向量𝜃的夹角大于 90 度,𝑝(2)的值小于 0。
我们会发现这些𝑝(𝑖)将会是非常小的数,因此当我们考察优化目标函数的时候,对于正样本而言,我们需要𝑝(𝑖)? ∥𝜃∥ >= 1,如果 𝑝(1) 很小,而我们希望𝑝(1)? ∥𝜃∥ >= 1 ,令其实现的唯一的办法就是𝜃的范数大。类似地,对于负样本而言我们需要𝑝 (𝑖)?∥𝜃∥ <= ?1。我们已经在这个样本中看到𝑝(2)是一个非常小的数,因此唯一的办法就是𝜃的范数变大。 但是我们的目标函数是希望找到一个参数𝜃,它的范数是小的。因此,这看起来不像是一个好的参数向量𝜃的选择。
再来看另外一个边界。 这个绿色的决策界有一个垂直于它的向量𝜃。 样本𝑥(1),当我将它投影到横轴𝑥上,或说投影到𝜃上,就会得到这样𝑝(1)。它的长度是𝑝(1),另一个样本,那个样本是𝑥(2)。我做同样的投影,𝑝(2)的长度是负值。𝑝(1) 和𝑝(2)这些投影长度长多了。如果我们仍然要满足这些约束,𝑃(𝑖)? ∥𝜃∥>1,则因为𝑝(1)、𝑝(2)变大了,𝜃的范数就可以变小了。 因此,如果我们想令𝜃的范数变小,从而令𝜃范数的平方变小,就能让支持向量机选择这个的决策界。 以上就是为什么支持向量机最终会找到大间距分类器的原因。因为它试图极大化这些𝑝(𝑖)的范数,它们是训练样本到决策边界的距离。最后一点,我们的推导自始至终使用了这个简化假设,就是参数𝜃0 = 0。
核函数
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题: 为了获得上图所示的判定边界,我们的模型可能是𝜃0 + 𝜃1𝑥1 + 𝜃2𝑥2 + 𝜃3𝑥1𝑥2 + 𝜃4𝑥12 +𝜃5𝑥22 + ?的形式。 我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令: 𝑓1 = 𝑥1, 𝑓2 = 𝑥2, 𝑓3 = 𝑥1𝑥2, 𝑓4 = 𝑥12, 𝑓5 = 𝑥22…得到?𝜃(𝑥) = 𝜃1𝑓1 + 𝜃2𝑓2+. . . +𝜃𝑛𝑓𝑛。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造𝑓1, 𝑓2, 𝑓3?我们可以利用核函数来计算出新的特征。
给定一个训练实例 𝑥 ,我们利用 𝑥 的各个特征与我们预先选定的地标(landmarks)𝑙(1), 𝑙(2), 𝑙(3)的近似程度来选取新的特征𝑓1, 𝑓2, 𝑓3。 例如:𝑓1 = 𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑥, 𝑙(1))= 其中:∥∥𝑥 ? 𝑙(1)∥∥2= ∑ ? ? ? ? (𝑥𝑗 ? 𝑙?(1))2,为实例𝑥中所有特征与地标𝑙(1)之间的距离的和。上例中的𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑥, 𝑙(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。 类似地:𝑓2 = 𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑥, 𝑙(2)),𝑓3 = 𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑥, 𝑙(3))…,𝑓n = 𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(𝑥, 𝑙(n))。 每一个标记会定义一个新的特征。
地标的作用
如果一个训练实例𝑥与地标𝐿之间的距离近似于 0,则新特征 𝑓近似于𝑒?? = 1,如果训练实例𝑥与地标𝐿之间距离较远,则𝑓近似于𝑒?(一个较大的数) = 0。 假设我们的训练实例含有两个特征[𝑥1 𝑥2],给定地标𝑙(1)与不同的𝜎值,见下图: 当x=[3,5]时,和L1最接近,此时距离为0,f1=1。
图中水平面的坐标为 𝑥1,𝑥2而垂直坐标轴代表𝑓。可以看出,只有当𝑥与𝑙(1)重合时𝑓才具有最大值。随着𝑥的改变𝑓值改变的速率受到𝜎2的控制。
在下图中,当实例处于洋红色的点位置处,因为其离𝑙(1)更近,但是离𝑙(2)和𝑙(3)较远,因此𝑓1接近 1,而𝑓2,𝑓3接近 0。因此?𝜃(𝑥) = 𝜃0 + 𝜃1𝑓1 + 𝜃2𝑓2 + 𝜃1𝑓3 > 0,因此预测𝑦 = 1。 同理可以求出,对于离𝑙(2)较近的绿色点,也预测𝑦 = 1,但是对于蓝绿色的点,因为其离三个地标都较远,预测𝑦 = 0。 这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征𝑓1, 𝑓2, 𝑓3。
如何选择地标
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有𝑚个实例,则我们选取𝑚个地标,并且令:𝑙(1) = 𝑥(1), 𝑙(2) = 𝑥(2), . . . . . , 𝑙(𝑚) = 𝑥(𝑚)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即: 下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为: 给定𝑥,计算新特征𝑓。当𝜃? 𝑓 >= 0 时,预测 𝑦 = 1,否则反之。相应地修改代价函数为:, ,在具体实施过程中,我们还需要对最后的正则化项进行些微调整,我们用𝜃?𝑀𝜃代替𝜃?𝜃,其中𝑀是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。 理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 𝑀来简化计算的方法不适用与逻辑回归,因为计算将非常耗费时间。
在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。
线性核函数
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。
参数𝐶和𝜎的影响
下面是支持向量机的两个参数𝐶和𝜎的影响:𝐶 = 1/𝜆 𝐶 较大时,相当于𝜆较小,可能会导致过拟合,高方差; 𝐶 较小时,相当于𝜆较大,可能会导致低拟合,高偏差; 𝜎较大时,可能会导致低方差,高偏差; 𝜎较小时,可能会导致低偏差,高方差。
使用支持向量机
在高斯核函数之外我们还有其他一些选择,如: 多项式核函数(Polynomial Kernel) 字符串核函数(String kernel) 卡方核函数( chi-square kernel) 直方图交集核函数(histogram intersection kernel) 等等… 这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足 Mercer’s 定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有𝑘个类,则我们需要𝑘个模型,以及𝑘个参数向量𝜃。 我们同样也可以训练𝑘个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。 尽管你不去写你自己的 SVM 的优化软件,但是你也需要做几件事: 1、是提出参数𝐶的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。 2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。
逻辑回归vs支持向量机
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,应该怎么选择? 下面是一些普遍使用的准则: 𝑛为特征数,𝑚为训练样本数。 (1)如果相较于𝑚而言,𝑛要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。 (2)如果𝑛较小,而且𝑚大小中等,例如𝑛在 1-1000 之间,而𝑚在 10-10000 之间,使用高斯核函数的支持向量机。 (3)如果𝑛较小,而𝑚较大,例如𝑛在 1-1000 之间,而𝑚大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。 值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值,得到的是全局最优解。
SVM 仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含了什么时候一个有效的方法去学习复杂的非线性函数。
|