《百面机器学习》第三章是经典算法,第一个经典算法就是SVM。但是书中对SVM的讲解比较简略,而李航老师的《统计学习方法》拿出非常大的篇幅对SVM进行详细讲解,所以本篇先参考《统计学习方法》复习下SVM相关知识点,再看下《百面》中涉及SVM的面试题。
SVM
(此部分主要参考李航老师的《统计学习方法》)
支持向量机(support vector machines,SVM)是一种二类分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划(convex quadratic programming)的问题,也等价于正则化的合页损失函数的最小化问题。
支持向量机按模型复杂程度可以分为线性可分支持向量机(linear support vector machine in linearly separable case)、线性支持向量机(linear support vector machine)、非线性支持向量机(non-linear support vector machine)。
当训练数据线性可分时,通过硬间隔最大化学习一个线性的分类器;当训练数据近似线性可分时,通过软间隔最大化学习一个线性分类器;当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
1. 线性可分支持向量机
定义
给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为
w∗⋅x+b∗=0
以及相应的分类决策函数
f(x)=sign(w∗⋅x+b∗)
称为线性可分支持向量机。
几何间隔和函数间隔
几何间隔的定义
几何间隔一般是实例点到超平面的带符号的距离,当样本点被超平面正确分类时就是实例点到超平面的距离。
对于给定的训练数据集 T和超平面( w,b),定义超平面( w,b)关于样本点( xi,yi)的几何间隔为
γi=yi(∥w∥w⋅x+∥w∥b)
定义超平面( w,b)关于训练数据集 T的几何间隔为超平面( w,b)关于 T中所有样本点( xi,yi)的几何间隔的最小值,即
γ=i=1,...,Nminγi
几何间隔的推导过程
函数间隔的定义
对于给定的训练数据集 T和超平面( w,b),定义超平面( w,b)关于样本点( xi,yi)的函数间隔为
γ^i=yi(w⋅xi+b)
定义超平面( w,b)关于训练数据集 T的函数间隔为超平面( w,b)关于 T中所有样本点( xi,yi)的函数间隔的最小值,即
γ^=i=1,...,Nminγ^i
函数间隔与几何间隔有以下关系:
γi=∥w∥γ^i γ=∥w∥γ^
间隔最大化
支持向量机学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面,对线性可分的训练数据集而言,线性可分分离超平面有无穷多个,但是几何间隔最大的分离超平面是唯一的。
间隔最大化的直观解释是:对训练数据集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。
最大间隔分离超平面
考虑如何求得一个几何间隔最大的分离超平面,即最大间隔分离超平面,具体的,这个问题可以表示为下面的约束最优化问题:
w,bmaxγ s.t.yi(∥w∥w⋅xi+∥w∥b)⩾γ,i=1,2,...,N
即我们希望最大化超平面 (w,b)关于训练数据集的几何间隔 γ,约束条件表示的是超平面( w,b)关于每个训练样本点的几何间隔至少是 γ。
上述条件式左右同乘 ∥w∥,
w,bmax∥w∥γ^ s.t.yi(w⋅xi+b)⩾γ^,i=1,2,...,N
可以看出函数间隔 γ^并不影响最优化问题的解,而且,最大化 ∥w∥1和最小化 21∥w∥2是等价的,所以最优化问题变为:
w,bmin21∥w∥2 s.t.yi(w⋅xi+b)−1⩾0,i=1,2,...,N
这样做的意义是把之前的优化问题转化为凸优化问题进行求解。
所谓凸优化问题,是指约束最优化问题
wminf(w) s.t.gi(w)⩽0,i=1,2,...,k hi(w)=0,i=1,2,..,l
其中,目标函数 f(w)和约束函数 gi(w)都是 Rn上的连续可微的凸函数,约束函数 hi(w)是 Rn上的仿射函数。
当目标函数 f(w)是二次函数且约束函数 gi(w)是仿射函数时,凸最优化问题成为凸二次规划问题。
综上,就有下面的线性可分支持向量机的学习算法——最大间隔法(maximum margin method)。
输入:线性可分训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)},其中, xi∈X=Rn,yi∈Y={−1,+1},i=1,2,...,N;
输出:最大间隔分离超平面和分类决策函数。
(1)构造并求解约束最优化问题:
w,bmin21∥w∥2 s.t.yi(w⋅xi+b)−1⩾0,i=1,2,...,N
求得最优解 w∗,b∗.
(2)由此得到分离超平面:
w∗⋅x+b∗=0
分离决策函数
f(x)=sign(w∗⋅x+b∗)
支持向量和间隔边界
在线性可分情况下, 训练数据集的样本点中与分列超平面距离最近的样本点的实例成为支持向量(support vector),支持向量是使约束条件式等号成立的点,即
yi(w⋅xi+b)−1=0
对 yi=+1的正例点,支持向量在超平面
H1:(w⋅xi+b)=1上,对 yi=−1的负例点,支持向量在超平面 H2:w⋅x+b=−1上。
H1与H2之间形成一条长带,分离超平面与它们平行且位于它们中央。 H1与H2之间的距离称为间隔(margin)。间隔依赖于分离超平面的法向量 w,等于 ∥w∥2。 H1和H2称为间隔边界。
在决定分离超平面时只有支持向量起作用,而其他实例点并不起作用。
学习的对偶算法
应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解,这样做的优点,一是对偶问题往往更容易求解;二是自然引入核函数,进而推广到非线性分类问题。
首先,构建拉格朗日函数:
L(w,b,α)=21∥w∥2−i=1∑Nαiyi(w⋅xi+b)+i=1∑Nαi
其中, α=(α1,α2,...,αN)T为拉格朗日乘子向量。
根据拉格朗日对偶性,原始问题的对偶问题是极大极小问题:
αmaxw,bminL(w,b,α)
先求极小将求得的 w,b带入式子,得到等价的对偶最优化问题:
αmin21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi s.t.i=1∑Nαiyi=0 αi⩾0,i=1,2,...,N
利用KKT条件便可求出原始最优化问题的解 w∗,b∗,推导过程不展开写了。
线性可分支持向量机学习算法
输入:线性可分训练集 T={(x1,y1),(x2,y2),...,(xN,yN)},其中 xi∈X=Rn,yi∈Y={−1,1};
输出:分离超平面和分类决策函数。
(1)构造并求解约束最优化问题
αmin21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi s.t.i=1∑Nαiyi=0 αi⩾0,i=1,2,...,N
求得最优解 α∗=(α1∗,α2∗,...,αN∗)T。
(2)计算
w∗=i=1∑Nαiyixi
并选择 α∗的一个正分量 αj∗>0,计算
b∗=yi−i=1∑Nαi∗yi(xi⋅xj)
(3)求得分离超平面
w∗⋅x+b∗=0
分离决策函数: f(x)=sign(w∗⋅x+b∗)
将训练集中对应于 αj∗>0的样本点 (xi,yi)的实例称为支持向量。
以上就是硬间隔最大化算法。但是现实问题中,训练数据往往线性不可分,即在样本中出现噪声或特异点,需要更一般的学习算法。
2. 线性支持向量机与软间隔最大化
线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,此时就需要修改硬间隔最大化,使其成为软间隔最大化。
线性支持向量机
现实问题中训练数据集往往存在特异点,如果将这些特异点除去后,剩下大部分的样本点组成的集合是线性可分的,我们就可以用以下方法解决问题。
我们对每个样本点 (xi,yi)引进一个松弛变量 ξi⩾0,使函数间隔加上松弛变量大于等于1。约束条件变为
yi(w⋅xi+b)⩾1−ξi目标函数变为
21∥w∥2+Ci=1∑NξiC>0称为惩罚参数,C值大对误分类的惩罚增大,C值小对误分类的惩罚减小。该目标函数的解释为使 21∥w∥2尽量小即距离尽量大,同时使误分类点的个数尽量小。(C大更易过拟合)
线性不可分的线性支持向量机的学习问题变成如下的凸二次规划问题(原始问题):
min21∥w∥2+Ci=1∑Nξi s.t.yi(w⋅xi+b)⩾1−ξi,i=1,2,...,N ξi⩾0,i=1,2,...,N
学习的对偶算法
原始问题的对偶问题是
min21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi s.t.i=1∑Nαiyi=0 0⩽αi⩽C,i=1,2,...,N
线性支持向量机学习算法
输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)},其中, xi∈X=Rn,yi∈Y={−1,1},i=1,2,...,N
输出:分离超平面和分类决策函数
(1)选择惩罚参数 C>0,构造并求解凸二次规划问题
min21i=1∑Nj=1∑Nαiαjyiyj(xi⋅xj)−i=1∑Nαi s.t.i=1∑Nαiyi=0 0⩽αi⩽C,i=1,2,...,N求得最优解 α∗=(α1∗,α2∗,...,αN∗)T。
(2)计算 w∗=∑i=1Nαi∗yixi
选择 α∗的一个分量 αj∗适合条件 0<αj∗<C,计算
bj∗=yj−i=1∑Nyiαj∗(xi⋅xj)
(3)求得分离超平面
w∗⋅x+b=0
分类决策函数
f(x)=sign(w∗⋅x+b)
支持向量
在线性不可分的情况下,将对偶问题的解 α∗中对应于 αj∗>0的样本点 (xj,yj)的实例 xi称为支持向量(软间隔的支持向量)。支持向量到间隔边界的距离 ∥w∥ξi
软间隔的支持向量 xi或者在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分一侧。若 αi<C,则 ξi=0,支持向量 xi恰好落在间隔边界上;若 α∗=C,0<ξi<1,则分类正确, xi在间隔边界与分离超平面之间;若 α∗=C,ξi=1,则分类正确, xi在分离超平面上;若 α∗=C,ξi>1,则分类错误, xi在分离超平面误分一侧。
3. 非线性支持向量机与核函数
有时分类问题是非线性的,这时就要使用非线性支持向量机,其主要特点是利用核技巧(kernel trick)。
用线性方法求解非线性分类问题分为两步:
- 使用一个变换将原空间的数据映射到新空间
- 在新空间用线性分类学习方法从训练数据中学习分类模型。
核技巧
核函数的定义
设 X是输入空间(欧氏空间 Rn的子集或离散集合),又设 H为特征空间(希尔伯特空间),如果存在一个从 X到 H的映射
ϕ(x):X→H使得对所有 x,z∈X,函数 K(x,z)满足条件
K(x,z)=ϕ(x)⋅ϕ(z)则称 K(x,z)为核函数, ϕ(x)为映射函数, ϕ(x)⋅ϕ(z)为内积运算。
核技巧在支持向量机中的应用
我们注意到在线性支持向量机的对偶问题中,无论是目标函数还是决策函数(分离超平面)都只涉及输入实例与实例之间的内积。对偶问题的目标函数中的内积 xi⋅xj可以用 K(xi,yi)=ϕ(xi)⋅ϕ(xj)来代替。
当映射函数是非线性函数时,学习到的含有核函数的支持向量机就是非线性分类模型。在实际应用中,往往依赖领域知识直接选择核函数,核函数选择的有效性需要通过实验验证。
常用核函数
- 线性核
K(x,z)=x⋅z - 多项式核函数
K(x,z)=(x⋅z+1)p
对应的支持向量机是一个p次多项式分类器。分类决策函数成为
f(x)=sign(i=1∑Nsαi∗yi(xi⋅x+1)p+b∗) - 高斯核函数
K(x,z)=exp(−2σ2∥x−z∥2)
对应的支持向量机是高斯径向基函数(RBF)分类器,分类决策函数成为
f(x)=sign(i=1∑Nsαi∗yiexp(−2σ2∥x−xi∥2)+b∗) - 指数核
K(x,z)=exp(−2σ2∥x−z∥) - sigmoid核
K(x,z)=tanh(αx⋅z+c)
- 当样本的特征很多时,特征的维数很高,这是往往样本线性可分,可考虑用线性核函数的SVM或LR(如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的)。
- 当样本的数量很多,但特征较少时,可以手动添加一些特征,使样本线性可分,再考虑用线性核函数的SVM或LR。
- 当样特征维度不高时,样本数量也不多时,考虑用高斯核函数(RBF核函数的一种,指数核函数和拉普拉斯核函数也属于RBF核函数)。
非线性支持向量分类机
输入:训练数据集 T={(x1,y1),(x2,y2),...,(xN,yN)},其中, xi∈X=Rn,yi∈Y={−1,1},i=1,2,...,N
输出:分离超平面和分类决策函数
(1)选择适当的核函数 K(x,z)和适当的参数 C,构造并求解最优化问题
min21i=1∑Nj=1∑NαiαjyiyjK(xi,xj)−i=1∑Nαi s.t.i=1∑Nαiyi=0 0⩽αi⩽C,i=1,2,...,N求得最优解 α∗=(α1∗,α2∗,...,αN∗)T。
(2)计算 w∗=∑i=1Nαi∗yixi
选择 α∗的一个分量 αj∗适合条件 0<αj∗<C,计算
bj∗=yj−i=1∑Nαj∗yiK(xi,xj)
(3)构造决策函数:
f(x)=sign(i=1∑Nαi∗yiK(x⋅xi)+b∗)
4. 序列最小化算法
待补充。。。
5. 百面机器学习中的问题
问题1 在空间上线性可分的两类点,分别向SVM分类的超平面上做投影,这些点在超平面上的投影仍然是线性可分的吗?
问题2 是否存在一组参数使SVM训练误差为0?
仅考虑不带松弛变量的情况
SVM的预测公式
f(x)=sign(i=1∑Nαi∗yiK(x⋅xi)+b∗)假设给定训练集中不存在两个点在同一位置,核函数采用高斯核。
对于任意的i,固定 αi=1以及 b=0,则有
f(xj)=i=1∑Nyiexp(−2σ2∥xj−xi∥2) f(xj)−yj=i=1,i̸=j∑Nyiexp(−2σ2∥xj−xi∥2) ∥f(xj)−yj∥⩽i=1,i̸=j∑Nexp(−2σ2∥xj−xi∥2)
由题意知 ∥xj−xi∥⩾ϵ ,取 σ=logm ϵ,可将式重写为
∥f(xj)−yj∥⩽i=1,i̸=j∑Nexp(−2σ2∥xj−xi∥2)⩽i=1.i̸=j∑me−logm=mm−1<1所以,对于任意 xj,预测结果 f(xj)与样本真实标签 yj的距离小于1。因此所有样本的类别都被正确预测,训练误差为0。
问题3 训练误差为0的SVM分类器一定存在吗?
问题2找到了一组参数使得SVM分类器的训练误差为0。本问旨在找到一组参数满足训练误差为0,且是SVM模型的一个解。
我们已经得到了一组参数使得当 yj=1时, f(xj)>0时,而当 yj=−1时, f(x)<0。现在需要找到一组参数满足更强的条件,即 yjf(xj)⩾1。
仍固定b=0,将 yif(xi)展开,有
yjf(xj)=yji=1∑mαiyiK(xi,xj)=αjyjyjK(xj,xj)+i=1,i̸=j∑mαiyiyjK(xi,xj)
=αj+i=1,i̸=j∑mαiyiyjK(xi,xj)
可以每个 α取很大的值,同时 σ取很小的值,使得核映射项非常小,于是 αj在上式占主导地位,这样 yjf(xj)>1,满足SVM的解条件。
问题4 加入松弛变量的SVM的训练误差可以为0吗?
使用SMO算法训练的线性分类器并不一定能得到训练误差为0的模型。这是由于我们的优化目标改变了,并不再是使训练误差最小。考虑带松弛变量的SVM模型优化的目标函数所包含的两项: C∑i=1mξi和 21∥w∥2,当我们的参数C选取较小的值时,后一项(正则项)将占据优化的较大比重。这样,一个带有训练误差,但是参数较小的点将成为更优的结果。一个简单的特例是,当C取0时,w也取0即可达到优化目标,但是显然此时我们的训练误差不一定能达到0。
参考链接
支持向量机原理篇
常用核函数
机器学习实战
机器学习问题与解答系列