zoukankan      html  css  js  c++  java
  • 深入理解SVM,软间隔与对偶问题

    今天是机器学习专题的第33篇文章,我们继续来聊聊SVM模型。

    在上一篇文章当中我们推到了SVM模型在线性可分的问题中的公式推导,我们最后得到的结论是一个带有不等式的二次项:

    [left{egin{align*} &min_{omega , b} frac{1}{2}||omega||^2\ s.t.& quad y_i(omega^Tx + b) ge 1, &i=1,2,3ldots,m\ end{align*} ight.]

    想要了解具体推导过程的同学,可以参考我的上一篇文章:

    机器学习 | 深入SVM原理及模型推导(一)

    其实上一篇的文章当中遗留了一个问题,就是我们希望得到(||omega||)最小,为什么不直接求(||omega||)最小,而非要求(||omega||^2)最小呢?原因就在它的解法上,因为我们要将它转化成一个凸二次规划问题(Quadratic Programming)。QP问题也是计算科学当中一个很重要的领域,也是比较困难的领域,因为需要对计算机以及数学都有很深的造诣。

    我个人感觉和实际的机器学习以及工程结合不是非常紧密,目前主要在SVM模型的原理推导上用到,所以我们可以只需要把SVM用到的公式原理理解就可以了。

    求解过程

    QP问题其实有专门的QP计算包可以求它的极值,我也曾经用过,但这并不是唯一的解法,并且这种解法有一个很大的缺点在于没办法套用核函数。所以我们一般不使用QP规划的方法来求解。

    我们观察一下原式,很自然的会有一种感觉,就是那些不等式很烦人。我们希望消除掉这些不等式,也有办法,就是通过使用拉格朗日乘子法来将有约束的优化目标转化成无约束的优化函数。

    我们来看下拉格朗日乘子法的使用过程,给定一个不等式约束问题:

    [left{egin{align*} &min_{x} f(x)\ s.t.& g_i(x) le 0, i=1, 2, cdots, k\ &h_j(x) = 0, j=1, 2, cdots, m\ & end{align*} ight.]

    对于这个看起来很复杂的方程组,我们引入一个广义朗格朗日函数,将它改写成这样:

    [L(x, alpha, eta)=f(x) + sum_{i=1}^k alpha_ig_i(x)+sum_{j=1}^m eta_jh_j(x), quad alpha_i ge 0 ]

    这个式子相比于上面的方程组看起来要简单一些,但是它有什么用呢?我们简单分析一下,会发现(L le f(x))。因为(alpha_i ge 0),并且(g_i(x) le 0)。所以两者相加,(L le f(x)),当(alpha_i = 0)时L可以取到最大值,这时(L = f(x))。所以我们要求的是(max L(x, alpha, eta))

    又由于我们要求的目标是(f(x))的极小值,我们最终的目标是(min_{x} max_{alpha_i ge 0} L(x, alpha, eta))

    对偶问题

    接下来我们就要讨论著名的对偶问题了,所谓的对偶问题,实质上是将一个带有两个不等式的方程的不等式进行调换顺序。把(min max L)转变成(max min L),但问题是不等号的位置显然是有讲究的,不可以随意调换顺序,所以我们需要证明这样调换成立的。

    为了方便起见,我们把原问题写成( heta_P(x)=min_x max_{alpha, eta}L(x, alpha, eta)),我们再定义一个关于(alpha)(eta)有关的方程:( heta_D(alpha, eta) = min_{x}L(x, alpha, eta))。这个方程等式的右边是拉格朗日函数的最小化,因为x确定了之后,方程的结果就只和(alpha)以及(eta)相关,所以它是一个关于(alpha)(eta)的函数。

    我们对这个函数求极大值:

    [max_{alpha_i ge 0} heta_D(alpha, eta) = max_{alpha_i ge 0} min_{x} L(x, alpha, eta) ]

    不知道这个式子看起来是不是觉得有些眼熟,因为它和我们刚才推导得出来的原问题非常相似,只是不等号的位置不同。我们为什么要列出这两个式子呢?当然不是为了好玩的,主要是为了想要得到这样一条不等式:

    [ heta_D(alpha, eta) = max_{alpha_i ge 0} min_x L(x, alpha, eta) le min_x max_{alpha_i ge 0} L(x, alpha, eta) = heta_P(x) ]

    我们用拉格朗日方程做过度,就可以很容易证明这个式子:

    [min_x L(x, alpha, eta) le L(x, alpha, eta) le max_{alpha_i ge 0} L(x, alpha, eta) ]

    我们想要用对偶问题代替原问题,就需要上面这个不等号取等。对于拉格朗日方程取等的条件,数学家们已经有了严谨的证明,只需要满足Karush-Kuhn-Tucker条件(简称KTT条件)。KTT的条件推导也是一个挺复杂的过程,我们不做深入研究, 只需要知道它的存在就可以了。

    KTT条件有这么几条,看起来多其实并不复杂。

    [ abla_xL(x^*,alpha^*, eta^*)=0 ]

    [ abla_alpha L(x^*,alpha^*, eta^*)=0 ]

    [ abla_eta L(x^*,alpha^*, eta^*)=0 ]

    [alpha_i^*g_i(x*)=0, i = 1, 2, 3ldots m ]

    [g_i(x*)=0, i = 1, 2, 3ldots m ]

    [alpha_igeq0, i = 1, 2, 3ldots m ]

    [h_i(x*)=0, j = 1, 2, 3ldots l ]

    我们对照KTT条件,求解( heta_P(x))的极小值,这个就是高中数学的部分了。我们首先对原式进行化简:

    [egin{aligned} L(x, omega, b) &= frac{1}{2}||omega||^2 + sum_{i=1}^malpha_i(1 - y_i(omega^T x_i + b))\ &= frac{1}{2}||omega||^2 + sum_{i=1}^m (alpha_i - alpha_i y_i omega^Tx_i - alpha_i y_ib) \ &= frac{1}{2}||omega||^2 + sum_{i=1}^m alpha_i - sum_{i=1}^m alpha_i y_iomega^Tx_i - sum{i=1}^m alpha_i y_ib end{aligned} ]

    再对(omega)(b)进行求导:

    [frac{partial L}{partial omega} = frac{1}{2} * 2 * omega + 0 - sum_{i=1}^m alpha_i y_i x_i - 0 = 0 ightarrow omega = sum_{i=1}^m alpha_i y_ix_i ]

    [frac{partial L}{partial b} = 0 + 0 - 0 - sum{i=1}^malpha_i y_i = 0 ightarrow sum_{i=1}^malpha_i y_i = 0 ]

    我们通过求导得出了(omega)(alpha)之间的关系,也就是说只要我们确定了(alpha)也就确定了(omega),另外我们可以神奇地发现上面的式子当中已经没有了b,说明b已经被我们消去了。我们把上面求导得到的取极值时的(omega)(b)代入原式,消去(omega)(b),可以得到:

    [egin{aligned} min_{omega, b} L(x, omega, b) &= frac{1}{2}omega^Tomega + sum_{i=1}^m alpha_i - sum_{i=1}^m alpha_iy_iomega^Tx_i - sum_{i=1}^m alpha_iy_i b \ &= -frac{1}{2}omega^Tsum_{i=1}^m alpha_iy_i x_i + sum_{i=1}^m alpha_i - bsum_{i=1}^m alpha_iy_i \ & = -frac{1}{2}omega^Tsum_{i=1}^m alpha_iy_i x_i + sum_{i=1}^m alpha_i \ & = sum_{i=1}^m alpha_i - frac{1}{2}sum_{i=1}^msum_{j=1}^m alpha_i alpha_j y_i y_j x_i^T x_j end{aligned} ]

    我们观察一下是这个式子,会发现x和y都是固定的值由样本确定,唯一的变量就只有(alpha)了。我们要求的是上式的极大值,唯一的变量是(alpha),求出了(alpha)就可以推导得到对应的(omega)和b。

    那么这个(alpha)怎么求呢?相关的内容我们放到下一篇文章。

    今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

    原文链接,求个关注

  • 相关阅读:
    Spring源码学习之容器的基本实现(一)
    面向对象设计原则
    简单易懂带你了解红黑树
    简单易懂带你了解二叉树
    单例模式
    原形模式
    数组与链表
    记一次解决postgresql数据库内存泄露的问题
    记一次排查CPU高的问题
    react ts 设置paths 和 声明非@types的模块
  • 原文地址:https://www.cnblogs.com/techflow/p/13606161.html
Copyright © 2011-2022 走看看