SVM S V M 学习笔记第三篇
上次讲到了 SVM S V M 的对偶形式,这个对偶问题也是二次规划问题。所以可以使用二次规划的方法来解决。之所以要使用 SVM S V M 的对偶形式,是因为它告诉了我们 SVM S V M 背后的一些几何意义,例如,对偶的 SVM S V M 问题的解中 αn≥0 α n ≥ 0 所对应的那些点 (zn,yn) ( z n , y n ) 就是我们想要找的支撑向量。另一方面,这个对偶问题在求解的时候好像几乎和我们所在的空间的维度没有关系,(经过复杂的特征转化之后的 Z Z 空间的维度 d~ d ~ 一般来说是很大的)。但是实际上我们上一篇中讲到其实是有关系的, 隐藏在了我们使用二次规划时求解矩阵 Q Q 的过程中。我们今天的目标是要得到一个能用特征转换还确实和 Z Z 空间的维度没有关系的 SVM S V M 。即, 我们的目标是要找一个不依赖于 d~ d ~ 的 SVM S V M 算法。
该问题从变量的数量 N N 和约束的数量 N+1 N + 1 来看是和 d~ d ~ 没有关系的,但是 qn,m=ynymzTnzm q n , m = y n y m z n T z m 是要在 d~ d ~ 空间中做內积,即需要做长度为 d~ d ~ 的两个向量 z z 的內积运算。所以在这里如果 d~ d ~ 很大的话,那么这将是我们求解 SVM S V M 的一个瓶颈。
问题出在:我们要在 Z Z 空间中做內积。
这可以分为两个步骤:
我们的想法是:如果我们可以将这两个步骤合为一个的话,可能会算的快些。
我们首先看一个简单的例子, 我们想要通过这个例子来看看,先进行转换再进行內积这样的步骤可不可以通过某些操作简化一点。二次多项式转换:
这样原来在 X X 空间中的一个样本的特征 (x1,x2,x3) ( x 1 , x 2 , x 3 ) 经过以上的二次转换就变为了如下在 Z Z 空间的向量 (1,x1,x2,x3,x1x1,x1x2,x1x3,x2x1,x2x2,x2x3,x3x1,x3x2,x3x3) ( 1 , x 1 , x 2 , x 3 , x 1 x 1 , x 1 x 2 , x 1 x 3 , x 2 x 1 , x 2 x 2 , x 2 x 3 , x 3 x 1 , x 3 x 2 , x 3 x 3 )
考虑两个向量 x,x′ x , x ′ ,首先我们计算这两个向量经过特征转换之后的內积:
既然这样,那么对于上述问题我们就可以先在 X X 空间算內积,然后加 1 1 再加內积的平方就可以得到先做特征转化在做內积的结果。前者的复杂度为 O(d) O ( d ) ,后者的复杂度为 O(d2) O ( d 2 )
通过以上的操作我们完成了原来需要两步(先转换到 Z Z 空间,再在 Z Z 空间中做內积)才能得到的结果。即通过一个函数 KΦ K Φ ,作用于 X X 空间中向量的內积就可以得到将 x x 通过转换 Φ Φ 在 Z Z 空间中得到的向量然后做內积的结果。
我们把这样的函数称为是核函数, 直观上理解, 核函数就是将我们原来要做的两步:特征转化+高维空间中內积,合并为了一步:直接在低维空间中计算我们想要的结果。例如在刚刚的那个例子中我们得到的核函数为:
有了核函数的定义之后,我们看看对于原来的对偶形式的 SVM S V M 来说有什么用呢?
这样我们所有需要在 Z Z 空间中的內积运算都被核函数取代了。 也就是说,到这里我就真正的实现了在上一篇中想要实现的目标: SVM S V M 和 d~ d ~ 无关了。
Kernel Hard-Margin SVM Algorithm(Kernel SVM)
所以我们就得到了 Kernel SVM K e r n e l S V M , 就是将原来 Dual SVM D u a l S V M 中所有涉及到 Z Z 空间內积的运算都使用 Kernel K e r n e l 函数,这样就和 d~ d ~ 没有关系了。
上一小节使用了一个特殊的二次多项式转化导出了一个核函数。
二次项转化 | 对应的核函数 |
---|---|
Φ2(x)=(1,x1,x2,⋯,xd,x21,⋯,x2d) Φ 2 ( x ) = ( 1 , x 1 , x 2 , ⋯ , x d , x 1 2 , ⋯ , x d 2 ) | K(x,x′)=1+xTx′+(xTx′)2 K ( x , x ′ ) = 1 + x T x ′ + ( x T x ′ ) 2 |
Φ2(x)=(1,2–√x1,2–√x2,⋯,2–√xd,x21,⋯,x2d) Φ 2 ( x ) = ( 1 , 2 x 1 , 2 x 2 , ⋯ , 2 x d , x 1 2 , ⋯ , x d 2 ) | K(x,x′)=(1+xTx′)2 K ( x , x ′ ) = ( 1 + x T x ′ ) 2 |
Φ2(x)=(1,2γ−−√x1,2γ−−√x2,⋯,2γ−−√xd,γx21,⋯,γx2d) Φ 2 ( x ) = ( 1 , 2 γ x 1 , 2 γ x 2 , ⋯ , 2 γ x d , γ x 1 2 , ⋯ , γ x d 2 ) | K(x,x′)=(1+γxTx′)2 K ( x , x ′ ) = ( 1 + γ x T x ′ ) 2 |
K(x,x′)=(1+γxTx′)2 K ( x , x ′ ) = ( 1 + γ x T x ′ ) 2 是更为常用的形式,也更容易延伸到高次多项式,即将原始的內积做 γ γ 的放缩之后加 1 1 的平方。那么 K(x,x′)=1+xTx′+(xTx′)2 K ( x , x ′ ) = 1 + x T x ′ + ( x T x ′ ) 2 和 K(x,x′)=(1+γxTx′)2 K ( x , x ′ ) = ( 1 + γ x T x ′ ) 2 有什么区别呢?相同的是它们都对应到了一个相同维度的空间;不同的是它们定义了不一样的內积运算,不同的內积代表不同的距离计算方法。不同的距离会影响到 margin m a r g i n ,所以使用不同的转换,尽管是转换到了相同的空间中,可能也会得到不同的边界。通常我们会将 K(x,x′)=(1+γxTx′)2 K ( x , x ′ ) = ( 1 + γ x T x ′ ) 2 直接称为 K2 K 2 。
可以看到分隔超平面不同,虽然都是二次曲线。并且支撑向量也不同。所以换核函数,就是换几何定义,这样 margin m a r g i n 的定义就会换掉。所以可能会得到不一样的结果。 所以我们要仔细的对很函数做选择。就像我们以前仔细的对特征转换做选择,但是现在特征转换的部分包含在核函数中,所以我们要仔细的对核函数做选择。
基于二次 Kernel K e r n e l 出发, 我们可以延伸出更一般的核函数:
SVM S V M 加上多项式核就得到了多项式 SVM S V M 。现在我们就可以很容易的使用高次的转换,例如只是需要将 Q Q 设置为 10 10 ,并且设置 γ,ζ γ , ζ 的取值。就可以得到一个 10 10 次的特征转化下 SVM S V M 的结果。如果没有 Kernel trick K e r n e l t r i c k , 我们首先要将特征展成 10 10 次空间中的特征, 很多的计算量,很大的维度。另一个可能会考虑到的问题是, 如果运用 10 10 次的特征转换会不会出现 overfitting o v e r f i t t i n g ,有可能,但是 SVM S V M 本身的 large margin l a r g e m a r g i n 的特征会自动的帮助我们控制下复杂度。如下图是一个 10 10 次的 Kernel K e r n e l 做出的分界线,也就是 10 10 次的特征转换的结果:
Linear Kernel:K1(x,x′)=(0+1⋅xTx′)1 L i n e a r K e r n e l : K 1 ( x , x ′ ) = ( 0 + 1 ⋅ x T x ′ ) 1 ,也就是不做任何的转化,这个时候可能没有必要使用 Dual SVM D u a l S V M , 直接使用原始的 SVM S V M 求解就好。
如果线性的支撑向量机已经可以做的很好了,那么我们就没有必要再使用非线性的 SVM S V M ,或者没有必要使用对偶形式的 SVM S V M ; 如果线性的效果不是很好,再使用对偶形式的 SVM S V M ,然后挑选合适的核函数。这应该是我们考虑使用 SVM S V M 的最佳步骤。
上一节介绍了多项式核Polynomial Kernel。
现在我们设想一下,因为利用核函数我们可以“假装”做 Z Z 空间的特征转换和內积, 我们是不是可以做无限多维的特征转化呢?
在没有 kernel k e r n e l 之前,如果我们有这个想法,那么我们就要把 Z Z 空间中的所有的特征都算出来,但是这是无穷维度的, 是算不完的,更不要说还得求內积了。 但是现在因为有了 Kernel trick K e r n e l t r i c k , Kernel trick K e r n e l t r i c k 可以代替特征的转换和內积运算,所以我们现在可以尝试考虑了。
考虑一个特别的例子:原始的样本只有一个维度,另外考虑一个特别的函数如下:
K(x,x′)=exp(−(x−x′)2) K ( x , x ′ ) = e x p ( − ( x − x ′ ) 2 )
我们想要得到的结果是 K(x,x′) K ( x , x ′ ) 其实是 x,x′ x , x ′ 分别转换后的內积, 即 K(x,x′)=Φ(x)Φ(x′) K ( x , x ′ ) = Φ ( x ) Φ ( x ′ ) ,并且这个转换是 无 限 维 的。
到这里我们证明了,高斯函数中隐藏了一个无限维度的转换。也就说两个向量(这里我们推到的是一维的) x x 和 x′ x ′ 的 K(x,x′) K ( x , x ′ ) 运算 (K(x,x′)=exp(−(x−x′)2)) ( K ( x , x ′ ) = e x p ( − ( x − x ′ ) 2 ) ) 的结果就是这两个向量分别做一个无限维度的转换 Φ Φ 之后再做內积的结果。
这样我们就可以把我们的特征映射到无限维。映射的方法是 Φ(x)=exp(−x2)(1, 21!−−√x, 222!−−√x2.⋯) Φ ( x ) = e x p ( − x 2 ) ( 1 , 2 1 ! x , 2 2 2 ! x 2 . ⋯ ) ,而在无限维中內积计算的方法就是 K(x,x′)=exp(−(x−x′)2) K ( x , x ′ ) = e x p ( − ( x − x ′ ) 2 ) 。
更一般的情形,高斯核函数如下:
使用高斯核得到的 SVM S V M 的分隔超平面如下:
使用不同的高斯核 (γ) ( γ ) 的结果:
可以看到如果参数选择的不好的话,也有可能会 overfit o v e r f i t ,虽然有 large margin l a r g e m a r g i n 的保证。所以我们也需要认真的选择参数 γ γ 。通常不建议使用太大的 γ γ , 事实上, 当设置太大的 γ γ 的时候, Kernel(x,x′)=|[x=x′]| K e r n e l ( x , x ′ ) = | [ x = x ′ ] | ,因为当 x=x′ x = x ′ 的时候, Kernel(x,x′)=1 K e r n e l ( x , x ′ ) = 1 和 γ γ 没有关系;当 x≠x′ x ≠ x ′ 的时候, Kernel(x,x′)=0 K e r n e l ( x , x ′ ) = 0 。这样就好像这个分类器只是记住了每一个样本的特征。
现在简要记录下各个 Kernal K e r n a l 的优劣势,以便以后做选择的时候参考。
优势:
劣势:
优势
劣势
当参数 Q Q 很大, 即你想要做很复杂的特征转换,这个时候会出现计算上的问题:
有太多的参数需要指定 (γ,ζ,Q) ( γ , ζ , Q ) 。
通常用于比较小的 Q Q 。 如果需要的转换特别的低次的时候,例如说需要二次的转换或者是三次的转换,其实可以直接对 Z Z 空间进行展开,然后在使用 Linear SVM L i n e a r S V M 来解原始问题通常是更好的(也就是说不解 Dual SVM D u a l S V M ),尤其是在 d~ d ~ 不是很大的情况下。
优势
劣势
可以说 kernel k e r n e l 代表的是 x x 和 x′ x ′ 转换之后在 Z Z 空间的相似性。
一个函数可以称之为核的必要条件是:
这两个条件其实不仅仅是必要条件,也是充分条件。 所以一个函数如果是核函数的话,就需要满足以上的两个条件,这两个条件也被称为是 Mercer′s condition M e r c e r ′ s c o n d i t i o n 。
本篇介绍了 Kernel SVM K e r n e l S V M ,首先提出了核技巧,将我们原来需要两步(先特征转换,再计算內积)才能做完的事情利用核函数可以简单的完成。然后介绍了多项式核和高斯核,其中高斯函数中包含了一个无限维的特征转换。最后对不同的 Kernel K e r n e l 做出了比较。 线性的 SVM S V M 有比较高的效率,高斯的 SVM S V M 可以找到比较复杂的边界线应对比较复杂的数据。
之前我们考虑的是要将数据绝对正确的分类(在转换之后的 Z Z 空间也要是线性可分的)。这样可能会造成一定的问题,比如说可能会去过拟合那些噪声。之后我们将讨论怎么解决这些问题。