跳转至

IML Lab2 report

作者: Ruixuan Huang 学号: PB20111686

目标

  1. 使用两种方法构建解决 SVM 问题的算法类
  2. 测试构建好的算法类的泛化性能
  3. 比较两种方法

方法

方法1:SMO 算法

SMO 算法处理的是原优化问题的对偶问题,根据教材,对偶问题为 $$ \underset{\boldsymbol\alpha}{\arg \max } \sum_{i=1}^m \alpha_i-\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j \boldsymbol{x}i^T \boldsymbol{x}_j $$ 约束条件为 KKT 条件: $$ \sum{i=1}^m\alpha_iy_i=0\quad\textbf{and}\quad0\le\alpha_i\le C\quad (1\le i\le m) $$ SMO 算法每次更新一对变量。在给定 \boldsymbol\alpha 的初值后,每次选择第一个不满足 KKT 约束的变量,也就是满足下面条件的变量 \alpha_t: $$ \left(\alpha_i<C \text { and } y_i E_i<-\varepsilon\right) \text { or }\left(\alpha_i>0 \text { and } y_i E_i>\varepsilon\right) $$ 记误差 $$ \newcommand{\w}{\boldsymbol w} \newcommand{\t}{\top} \newcommand{\x}{\boldsymbol x} E_t=\w^\t \x_i+b-y_i $$ 在剩余的变量列表中,选择 \alpha_l,其中 l 满足 $$ l=\underset i{\arg\max}|E_t-E_i| $$

上面选择的两个变量外,其余的都看成常量,则有 $$ \left{\begin{array}{l} \alpha_l y_l+\alpha_t y_t=k \ \alpha_{l, u} y_l+\alpha_{t, u} y_t=k \ \sum_{i \neq l, t}^m \alpha_i y_i=-k \end{array}\right. $$ 其中 \left(\alpha_l, \alpha_t\right) 是上一轮迭代的参数值,是常量; \left(\alpha_{l, u}, \alpha_{t, u}\right) 是本轮优化变量,其不一定满足 KKT 条件,需要根据可行域进一步修剪为符合约束的 \left(\alpha_{l, *}, \alpha_{t, *}\right)

记优化目标函数为 \Gamma(·),记 v_l=\boldsymbol{x}_l^\t \sum_{i \neq l, t}^m \alpha_i y_i \boldsymbol{x}_i, v_t=\boldsymbol{x}_t^\t \sum_{i \neq l, t}^m \alpha_i y_i \boldsymbol{x}_i,则 $$ \begin{aligned} &\Gamma\left(\alpha_{l, u}, \alpha_{t, u}\right)=\sum_{i=1}^m \alpha_i-\frac{1}{2} \sum_{i=1}^m \sum_{j=1}^m \alpha_i \alpha_j y_i y_j \boldsymbol{x}i^\t\boldsymbol{x}_j\newline &\Rightarrow \begin{aligned} \Gamma\left(\alpha{t, u}\right) =&\left(k-\alpha_{t, u} y_t\right) y_l+\alpha_{t, u}-\frac{1}{2}\left(k-\alpha_{t, u} y_t\right)^2 \boldsymbol{x}l^\t \boldsymbol{x}_l-\frac{1}{2} \alpha{t, u}^2 \boldsymbol{x}t^\t \boldsymbol{x}_t \ &-\left(k-\alpha{t, u} y_t\right) \alpha_{t, u} y_t \boldsymbol{x}l^\t \boldsymbol{x}_t-\left(k-\alpha{t, u} y_t\right) v_l-\alpha_{t, u} y_t v_t \end{aligned} \end{aligned} $$ 这是单变量二次规划问题,直接求导即可获得极值点: $$ \frac{\partial \Gamma\left(\alpha_{t, u}\right)}{\partial \alpha_{t, u}}=-y_t y_l+1+y_t\left(k-\alpha_{t, u} y_t\right) \boldsymbol{x}l^\t \boldsymbol{x}_l-\alpha{t, u} \boldsymbol{x}t^\t \boldsymbol{x}_t-k y_t \boldsymbol{x}_l^\t \boldsymbol{x}_t+2 \alpha{t, u} \boldsymbol{x}_l^\t \boldsymbol{x}_t+y_t v_l-y_t v_t=0 $$

\alpha_{t, u}=\alpha_t+\frac{y_t\left(E_l-E_t\right)}{\left(\boldsymbol{x}_l^\t \boldsymbol{x}_l+\boldsymbol{x}_t^\t \boldsymbol{x}_t-2 \boldsymbol{x}_l^\t \boldsymbol{x}_t\right)}

随后,需要根据可行域修剪参数: $$ \alpha_{t, *}=\left{\begin{array}{l} H, \alpha_{t, u}>H \ \alpha_{t, u}, L \leqslant \alpha_{t, u} \leqslant H \ L, \alpha_{t, u}<L \end{array}\right. $$

L=\left\{\begin{array}{l} \max \left(0, \alpha_t-\alpha_l\right), y_l \neq y_t \\ \max \left(0, \alpha_t+\alpha_l-C\right), y_l=y_t \end{array} \right.
H=\left\{\begin{array}{l} \min \left(C, C+\alpha_t-\alpha_l\right), y_l \neq y_t \\ \min \left(C, \alpha_t+\alpha_l\right), y_l=y_t \end{array}\right.
\alpha_{l,*}=(k-\alpha_{t,*}y_t)y_l

\w 的更新: $$ \boldsymbol{w}=\sum_{i=1}^m \alpha_i y_i \boldsymbol{x}_i^\t $$ 因为 \w 的计算不涉及 b,所以每次迭代不更新 b,最后用梯度下降法确定 b

方法2:GD 算法

原问题为(使用 Hinge loss) $$ \min_{\w,b}\frac12||\w||^2+\frac Cm\sum_{i=1}^m\max(0,1-y_i(\w^\t\x_i+b)):=\min_{\w,b}J(\w,b) $$ 约束条件为 $$ y_i(\w^\t\x_i+b)\ge1\quad(1\le i\le m) $$ 当分类正确时,\w,b 不改变;当分类不正确也就是 y_i(\w^\t\x+b)<1 时,梯度 $$ \nabla J(\w)=\w-\frac Cm\sum_{i\in {i|y_i(·)<1}}y_i\x_i\quad \nabla J(b)=-\frac Cm\sum_{i\in {i|y_i(·)<1}}y_i $$ 参数更新公式为 $$ \begin{aligned} &\w\leftarrow \w+lr\nabla J(\w)\newline &b\leftarrow b+lr\nabla J(b)\newline \end{aligned} $$ 直到两次更新参数后 J(\w,b) 之差小于 self.tol,退出,宣告训练完毕。

结果

SMO 算法

使用随机生成数据,维度为 20,长度为 10000。使用留出法进行训练和测试,训练集占数据集的 70%,测试集占余下的 30%。系数 C=0.5,选择 \varepsilon=10^{-5}\eta_b=1\boldsymbol\alpha 的初值设为 np.ones(self.m)/20 (即全部为 0.05)。

多次重复测试(不同随机数据)表明,测试集上的精度 \left(\text{accuracy}=\frac{TP+FN}{TP+TN+FP+FN}\right) 为 95% 左右,训练所需时间为 70 秒左右。

image-20221025221008815

image-20221027155606197

image-20221025221052182

GD 算法

使用随机生成数据,维度为 20,长度为 10000。使用留出法进行训练和测试,训练集占数据集的 70%,测试集占余下的 30%。系数 C=0.01,选择 lr=0.1,tol=10^{-3}

多次重复测试(不同随机数据)表明,测试集上的精度 \left(\text{accuracy}=\frac{TP+FN}{TP+TN+FP+FN}\right) 为 95% 左右,训练所需时间为 120 秒左右。

image-20221026211607640

image-20221027160016447

image-20221027160049526

image-20221026211647381

比较

可以看出,方法 1(SMO)的训练时间比方法 2(GD)要好,但是二者的泛化能力在本数据上相差并不大。

本文阅读量