支持向量机 (三): 优化方法与支持向量回归
拉格朗日乘子法 - KKT条件 - 对偶问题
支持向量机 (一): 线性可分类 svm
支持向量机 (二): 软间隔 svm 与 核函数
支持向量机 (三): 优化方法与支持向量回归
优化方法
一、SMO算法
回顾 支持向量机 (二) 中 \((1.7)\) 式最后要求解的优化问题:
在求出满足条件的最优 \(\boldsymbol{\alpha}\) 后,即可得 svm 模型的参数 \((\boldsymbol{w}, b)\) ,进而获得分离超平面。可以用通用的二次规划算法求解,该二次规划问题有 \(m\) 个变量 ( \(m\) 为样本数), \((m+1)\) 项约束,所以当样本容量 \(m\) 很大时,问题变得不可解,而本节介绍的 SMO(sequential minimal optimization)算法就是高效求解上述问题的算法之一。
SMO 算法将原来非常大的二次规划问题分解成了一系列非常小的可解的二次规划问题。SMO 算法最诱人的地方在于,这些分解后小的二次规划问题 ,都是拥有解析解的,也就是说,求解这些小的二次规划优化问题不需要通过非常耗时的循环来得到问题的结果。由于不需要矩阵计算,使得 SMO 算法 在实际的数据集的测试中,其计算复杂度介于线性复杂度和二次复杂度之间。SMO 算法的计算复杂度和 svm 的模型也有关系,比如线性核 svm 计算速度较快。在实际测试中发现,如果训练样本是稀疏数据集,那么SMO 算法的效率会极其高。
SMO算法的基本思路是:选择两个变量 \(\alpha_1\)和 \(\alpha_2\) ,固定其他所有 \(\alpha_i(i =3\ldots m)\),仅针对这两个变量构建二次规划问题,这样就比原来复杂的优化问题简化很多。由于有约束条件 \(\sum\limits_{i=1}^m \alpha_iy_i = 0\) ,固定了其他 \(\alpha_i(i =3\ldots m)\) 后,可得 \(\alpha_1 y_1 + \alpha_2 y_2 = - \sum\limits_{i=3}^m \alpha_iy_i\) 。所以 \(\alpha _1\) 确定后,\(\alpha _2\) 即可自动获得,则该小型二次规划问题中的两个变量会同时更新,接着再不断选取新的变量进行优化。
如何在每一步选择合适的 \(\alpha\) 进行优化? SMO 采用启发式的变量选择方法:第 1 个变量 \(\alpha_1\) ,一般选择训练样本中违反 KKT 条件最严重的样本点所对应的 \(\alpha\) 。而第 2 个变量 \(\alpha_2\) 则选取与 \(\alpha_1\) 的样本点之间间隔最大的样本点对应的 \(\alpha\) ,这样二者的更新往往会给目标函数带来更大的变化。这里的 KKT 条件具体指的是:
其中 \(f(\boldsymbol{x}_i) = \boldsymbol{w}^\top \boldsymbol{x}_i + b = \sum\limits_{j=1}^m \alpha_jy_j \boldsymbol{x}_i^\top \boldsymbol{x}_j + b\) 。还有一点就是,由于 KKT 条件过于地严格,比如 \(y_if(\boldsymbol{x}_i) = 1\) ,这个条件一般很难达到,所以在检验 KKT 条件的时候,都是在一定的误差范围 $\epsilon $ 内检验 KKT 条件的, 即 \(|y_if(\boldsymbol{x}_i) - 1| < \epsilon\) 。
在选择了合适的变量后,下面来看如何解 \(\alpha_1\) 和 \(\alpha_2\):
若不考虑约束项 \((1.2)\) 和 \((1.3)\) ,由于固定了其他所有 \(\alpha_i(i =3\ldots m)\) ,因此设 \(\alpha_1 y_1 + \alpha_2 y_2 = - \sum\limits_{i=3}^m \alpha_iy_i = \zeta\) ,利用 \(y_i^2 = 1\) 两边同乘以 \(y_1\) ,则 \(\alpha_1 = (\zeta - \alpha_2 y_2) y_1\) ,代入 \((1.1)\) 式并求导即可得最优的 \(\alpha_2\) ,继而利用上式求得 \(\alpha_1\) 。
然而由于约束项 \((1.3)\) 的存在,\(\alpha_1\) 和 \(\alpha_2\) 必须位于 \([0, C] \times [0, C]\) 围成的矩形区域内; 且由于约束项 \((1.2)\) 的存在, \(\alpha_1 y_1 + \alpha_2 y_2 = - \sum\limits_{i=3}^m \alpha_iy_i = \zeta\) ,又由于 \(y_1\), \(y_2\) 只能取 \(+1\) 和 \(-1\) ,所以在第一种情况 —— \(y_1\) 和 \(y_2\) 异号时,\(\alpha_1\) 和 \(\alpha_2\) 位于直线 \(\alpha_1 - \alpha_2 = \zeta\) 上 (这里取 \(y_1 = 1, \;y_2 = -1\) ,反过来情况类似),如下图:
这里采用迭代优化,假设上一轮迭代得到的最优解是 \(\alpha_1^{\,old}\) 和 \(\alpha_2^{\,old}\),本轮迭代完成后的解为 \(\alpha_1^{\,new}\) 和 \(\alpha_2^{\,new}\)。由于要满足约束条件,\(\alpha_2^{\,new}\) 存在下界 \(L\) 和上界 \(H\) ,即: \(L \leqslant \alpha_2^{\,new} \leqslant H\) 。
假设要求 \(\alpha_2\) 的最小值,从图中可以看到只有当 \(\alpha_1 = 0\) 时,\(\alpha_2\) 可以在矩形区域内的直线 \(\alpha_1 - \alpha_2 = \zeta\) 上取得最小值。此时 \(\alpha_2^{\,new} = -\zeta = \alpha_2^{\,old} - \alpha_1^{\,old}\) ( 后面一个等式是因为 \(\zeta\) 是常数 ) ,从图中也显示红线和绿线与 \(y\) 轴都相交于 \((0, -\zeta)\) ,然而由于约束 \(0 \leqslant \alpha_2 \leqslant C\) 的存在,图中绿线的下端点只能取到 \((\zeta, 0)\) ,所以综合这两种情况 \(\alpha_2\) 的下界 \(L = \max(0, \, -\zeta) = \max(0, \,\alpha_2^{\,old} - \alpha_1^{\,old})\) 。
同理要求 \(\alpha_2\) 的最大值,只有当 \(\alpha_1 = C\) 时,\(\alpha_2\) 可以在矩形区域内的直线 \(\alpha_1 - \alpha_2 = \zeta\) 上取得最大值。红线和绿线与 \(y\) 轴都相交于 \((C, C-\zeta)\) ,然而由于约束 \(0 \leqslant \alpha_2 \leqslant C\) 的存在,图中红线的上端点只能取到 \((C + \zeta, C)\) ,所以综合下来 \(\alpha_2\) 的上界 \(H = \min(C, \, C - \zeta) = \min(C, \, C + \alpha_2^{\,old} - \alpha_1^{\,old})\) 。
第二种情况 —— \(y_1\) 和 \(y_2\) 同号时,\(\alpha_1\) 和 \(\alpha_2\) 位于直线 \(\alpha_1 + \alpha_2 = \zeta\) 上 (这里取 \(y_1 = 1, \;y_2 = 1\) ,反过来情况类似),如下图:
假设要求 $\alpha_2$ 的最小值,从图中可以看到只有当 $\alpha_1 = C$ 时,$\alpha_2$ 可以在矩形区域内的直线 $\alpha_1 + \alpha_2 = \zeta$ 上取得最小值。此时 $\alpha_2^{\,new} = \zeta - C = \alpha_1^{\,old} + \alpha_2^{\,old} - C$ ,从图中也显示红线和绿线与 $y$ 轴都相交于 $(C, \zeta - C)$ ,然而由于约束 $0 \leqslant \alpha_2 \leqslant C$ 的存在,图中绿线的下端点只能取到 $(\zeta, 0)$ ,所以综合这两种情况 $\alpha_2$ 的下界 $L = \max(0, \, \zeta - C) = \max(0, \, \alpha_1^{\,old} + \alpha_2^{\,old} - C)$ 。
同理要求 \(\alpha_2\) 的最大值,只有当 $\alpha_1 = \(0 时,\)\alpha_2$ 可以在矩形区域内的直线 \(\alpha_1 + \alpha_2 = \zeta\) 上取得最大值。红线和绿线与 \(y\) 轴都相交于 \((0, \zeta)\) ,然而由于约束 \(0 \leqslant \alpha_2 \leqslant C\) 的存在,图中红线的上端点只能取到 \((\zeta-C, \, C)\) ,所以综合下来 \(\alpha_2\) 的上界 \(H = \min(C, \, \zeta) = \min(C, \, \alpha_1^{\,old} + \alpha_2^{\,old})\) 。
于是在 \(L \leqslant \alpha_2^{\,new} \leqslant H\) 的约束范围内求得 \(\alpha_2^{\,new}\) 后,继而从 \(\alpha_1 y_1 + \alpha_2 y_2 = - \sum\limits_{i=3}^m \alpha_iy_i = \zeta\) 中求得 \(\alpha_1^{\,new}\) ,这样 \(\alpha_1\) 和 \(\alpha_2\) 就同时得到了更新。接下来不断选择变量进行优化,当所有 \(\alpha_i\) 都满足 KKT 条件时,算法终止,求得了最优的 \(\alpha_i , \;\; i = 1,2,\ldots m\) 。
二、Hinge Loss 梯度下降
svm 使用的损失函数为 hinge loss,即为:
\(\text{hinge loss}\) 使得 \(yf(x)>1\) 的样本损失皆为 0,由此带来了稀疏解,使得 svm 仅通过少量的支持向量就能确定最终超平面。下面来看 hinge loss 是如何推导出来的,支持向量机 (二) 中 \((1.1)\) 式带软间隔的 svm 最后的优化问题为:
\((1.5)\) 式重新整理为 \(\xi_i \geqslant 1 - y_i(\boldsymbol{w}^\top\boldsymbol{x}_i + b)\) 。若 \(1 - y_i(\boldsymbol{w}^\top\boldsymbol{x}_i + b) < 0\) ,由于约束\((1.6)\) 的存在,则 \(\xi_i \geqslant 0\) ;若\(1 - y_i(\boldsymbol{w}^\top \boldsymbol{x}_i + b) \geqslant 0\) ,则依然为 $ \xi_i \geqslant 1 - y_i(\boldsymbol{w}^\top \boldsymbol{x}_i + b)$ 。所以 \((1.5),\,(1.6)\) 式结合起来:
又由于 \((1.4)\) 式是最小化问题,所以取 \(\xi_i\) 的极小值,即令 \(\xi_i = \max(0,1-yf(x))\) 代入 \((1.4)\) 式,并令\(\lambda = \frac{1}{2C}\) :
svm 中最常用的优化算法自然是上文中的 SMO 算法,不过有了损失函数后也可以直接优化。由于 hinge loss 在 \(y_i(\boldsymbol{w}^T\boldsymbol{x}_i + b) = 1\) 处不可导,因而无法直接使用梯度下降,不过可以通过求次梯度 (subgradient) 来进行优化:
支持向量回归
前文主要叙述支持向量机用于分类问题,当然其也可用于回归问题。给定一组数据 \(\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{m}, y_{m}\right)\right\}\) ,其中 \(\boldsymbol{x}_i \in \mathbb{R}^d\) ,\(y_i \in \mathbb{R}\) ,回归问题希望学得一个模型 \(f(\boldsymbol{x}) = \boldsymbol{w}^\top \boldsymbol{x} + b\) ,使得 \(f(\boldsymbol{x})\) 与 \(y\) 尽可能接近 。传统的回归模型通常基于模型输出 \(f(\boldsymbol{x})\) 与真实输出 \(y\) 之间的差别来计算损失。当且仅当 \(f(\boldsymbol{x})\) 与 \(y\) 完全相同时,损失才为零。支持向量回归 ( Support Vector Regression,以下简称 \(\text{svr}\) ) 与之不同,它假设能容忍 \(f(\boldsymbol{x})\) 与 \(y\) 之间最多有 \(\epsilon\) 的偏差,即仅当 \(|f(\boldsymbol{x}) - y| > \epsilon\) 时,才计算损失。如下图所示,\(\text{svr}\) 相当于以 \(f(\boldsymbol{x})\) 为中心,构建了一个宽度为 \(\epsilon\) 的间隔带。若训练样本落在此间隔带内则被认为是预测正确的。
\(\text{svr}\) 的损失函数由此被称为 \(\epsilon - \text{insensitive error}\) ,形如 :
本质上我们希望所有的模型输出 \(f(x)\) 都在 \(\epsilon\) 的间隔带内,因而与 支持向量机 (一) 中的 \((1.3)\) 式一样,我们可以定义 \(\text{svr}\) 的优化目标:
同样类似于 支持向量机 (二) 中的 \((1.1)\) 式,可以为每个样本点引入松弛变量 \(\xi > 0\),即允许一部分样本落到间隔带外,使得模型更加 robust 。由于这里用的是绝对值,实际上是两个不等式,也就是说两边都需要松弛变量,我们定义为 \(\xi_i^{\lor}, \xi_i^{\land}\) ,于是优化目标变为:
上式中的 \(C\) 和 \(\epsilon\) 分别对应 scikit-learn 的 SVR 中的参数 \(C\) 和 \(\text{epsilon}\) ,\(C\) 越大,意味着对离群点的惩罚就越大,最终就会有较少的点跨过间隔边界,模型也会变得复杂。而 \(C\) 设的越小,则较多的点会跨过间隔边界,最终形成的模型较为平滑。而 \(\text{epsilon}\) 越大,则对离群点容忍度越高,最终的模型也会较为平滑,这个参数是 \(\text{svr}\) 问题中独有的,svm 中没有这个参数。
对于 \((2.3)\) 式,为每条约束引入拉格朗日乘子 \(\mu_i^{\lor} \geqslant 0, \, \mu_i^{\land} \geqslant 0,\, \alpha_i^{\lor} \geqslant 0, \,\alpha_i^{\land} \geqslant 0\) :
其对偶问题为:
上式对 \(\boldsymbol{w}, b, \xi_i^\lor, \xi_i^\land\) 求偏导为零可得:
将 \((2.6) \sim (2.9)\) 式代入 \((2.4)\) 式,并考虑由\((2.8), \,(2.9)\) 式得 \(C - \alpha_i = u_i \geqslant 0\) ,因而 \(0 \leqslant \alpha_i \leqslant C\) 得化简后的优化问题:
上述求最优解的过程需满足 \(\mathbb{KKT}\) 条件,其中的互补松弛条件为 :
若样本在间隔带内,则 \(\xi_i = 0\) , \(| y_i - \boldsymbol{w}^\top \boldsymbol{x} - b| < \epsilon\) ,于是要让互补松弛成立,只有使 \(\alpha_i^{\lor} = 0, \,\alpha_i^{\land} = 0\) ,则由 \((2.6)\) 式得 \(\boldsymbol{w} = 0\) ,说明在间隔带内的样本都不是支持向量,而对于间隔带上或间隔带外的样本,相应的 \(\alpha_i^\lor\) 或 \(\alpha_i^\land\) 才能取非零值。此外一个样本不可能同时位于 \(f(\boldsymbol{x})\) 的上方和下方,所以 \((2.11)\) 和 \((2.12)\) 式不能同时成立,因此 \(\alpha_i^{\lor}\) 和 \(\alpha_i^\land\) 中至少一个为零。
优化问题 \((2.10)\) 同样可以使用二次规划或 SMO 算法求出 \(\boldsymbol{\alpha}\) ,继而根据 \((2.6)\) 式求得模型参数 \(\boldsymbol{w} = \sum_{i=1}^m (\alpha_i^\land - \alpha_i^\lor) \boldsymbol{x}_i\) 。而对于模型参数 \(b\) 来说,对于任意满足 \(0 < \alpha_i < C\) 的样本,由 \((2.13)\) 和 \((2.14)\) 式可得 \(\xi _i= 0\) ,进而根据 \((2.11)\) 和 \((2.12)\) 式:
则 \(\text{svr}\) 最后的模型为:
支持向量机算法总结
支持向量机的优点:
- 解决高维特征的分类问题和回归问题很有效,在特征维度大于样本数时依然有很好的效果。
- 仅仅使用一部分样本决定超平面,内存占用少。
- 有大量的核函数可以使用,从而可以很灵活的来解决各种非线性的分类回归问题。
支持向量机的缺点:
- 当采用核函数时,如果需要存储核矩阵,则空间复杂度为 \(\mathcal{O}(m^2)\) 。
- 选择核函数没有通用的标准 (当然其实是有的,见下文~) 。
- 样本量很大时,计算复杂度高。
对于第 3 个缺点,scikit-learn 的 SVC 文档中有一句话:
The fit time scales at least quadratically with the number of samples and may be impractical beyond tens of thousands of samples.
我特意去查了下字典,”tens of thousands“ 意为 ”好几万“,也就是说对于几万的数据 svm 处理起来就已经很捉急了,至于百万到亿级的数据基本就不用想了,这在如今这个大数据时代确实不够看,不过这里说的是使用核函数的 svm。而对于线性 svm 来说,情况要好很多,一般为 $\mathcal{O}(m)$。
LibSVM 的作者,国立台湾大学的林智仁教授在其一篇小文(A Practical Guide to Support Vector Classification)中提出了 svm 库的一般使用流程 :
其中第二步 scaling 对于 svm 的整体效果有重大影响。主要原因为在没有进行 scaling 的情况下,数值范围大的特征会产生较大的影响,进而影响模型效果。
第三步中认为应优先试验 RBF 核,通常效果比较好。但他同时也提到,RBF 核并不是万能的,在一些情况下线性核更加适用。当特征数非常多,或者样本数远小于特征数时,使用线性核已然足够,映射到高维空间作用不大,而且只要对 C 进行调参即可。虽然理论上高斯核的效果不会差于线性核,但高斯核需要更多轮的调参。
下表总结了 scikit-learn 中的 svm 分类库:
scikit-learn 中 svm 库的两个主要超参数为 \(C\) 和 \(\gamma\) ,\(C\) 和 \(\gamma\) 越大,则模型趋于复杂,容易过拟合;反之,\(C\) 和 \(\gamma\) 越小,模型变得简单,如下图所示:
/