zoukankan      html  css  js  c++  java
  • SVM

    支持向量机(Support Vector Machine, SVM)

    基本思想就是找两类数据的最大间隔。

    一、目标函数

    令数据集为 D,标签 y 为 +1、-1。

    正确的分类可以用这个不等式描述:

    当我们不希望有点落在边界时,公式改写为:

    即将支持向量的函数间隔为 1,相当于对wT 、b 进行了缩放,对超平面的确定并没有影响。

    假设左右边距离分界线最近的两个点是 x+ 和 x-,x+ 和 x- 的连线垂直于决策线,所以两点连线的方向是 w 乘一个缩放因子 γ。就有最下面一个公式。

     

     以上公式变形得到:

     

     

     把γ代回,得到两点的间隔公式:

     将右边的向量平方再开方计算幅度,得到2除以 w 的二范式

    所以优化问题变为最大化 w 的二范式。

    也就是最小化下式(最小化是因为这种形式更加符合优化问题 ),分母2是为了求导方便。

     

    求解的方法有很多:

    ① 很多工具使用内点法求解

    ② 梯度下降法。hinge-loss代替约束,求导然后用步长优化。

    ③ 大多数时候使用对偶函数优化。把约束从目标函数中拿出,换成一个惩罚项来产生优化中的鞍点。(拉格朗日)

    以上是两类数据线性可分的情况,对于不完全线性可分,加入松弛变量 ξ。松弛变量中每个元素对应一个样本。这也就是软间隔SVM。

     当然,我们不希望 ξ 太大,所以在目标函数中,加入一项 ξ 的惩罚项。C起到了平衡的作用。

    二、对偶问题

    大多数优化问题可以从两个角度来看,一个是原问题,一个是对偶问题。解出了对偶问题就等于解出了原问题。

    接下来推导拉格朗日(KKT)对偶。

    下式是拉格朗日函数,α、β是用来控制两个约束的(分类正确以及ξ 大于0)。

     此时带约束的目标函数被重写成 min-max 问题。

    为了把原问题转化为对偶问题,需要转化为 max-min 问题。

     这样做不改变最后的解的原因是,这是一种强对偶关系。之后需要简化这个对偶问题。

    KKT这位科学家指出了max-min问题中一定会成立的一些条件,这些被称为KKT条件:

    ① Stationarity。所有原变量和对偶变量的梯度为0。也就是无论最大化还是最小化的过程,都不能通过改变变量的值以得到比变量梯度为0时更好的得分。

    ② Primal feasibility。原问题中所有约束都要被满足。

    ③ Dual feasibility。要求对偶变量的约束要被满足(非负)。

    ④ Complementary Slackness。松弛互补。要么KKT乘子为0,要么不等式约束取等号(恰好满足)。

    后面的分析会着重于①④。

    然后回到拉格朗日函数,由于条件一,我们要对其中的变量进行求导,然后令他们梯度为0。

     

    下图是各变量的梯度,以及梯度为0时的结论。

    接下来使用这些结论推导后面的公式。

    把拉格朗日里的乘积都拆开,然后把刚刚结论中的值一个一个带进去

                 

              

      

     

    最终得到最后一个式子,我们是要最大化它(也就消除了原问题中的最小化项)

    上式还有两个约束项,是由KKT条件推导的结论得到的。因为,所以;因为而 β 非负,所以 α 小于 C。

    下图是对偶SVM的最终形式:

     如果通过上式得到了 α,如何得到 w 和 b 。

    前面推导得到了

    而 b 要通过KKT条件的第4个条件来得到

     其中 xi 是 αi ∈ [0, C] 之间的样本(通常使用多个样本均值估计b)。所以 b 如下。

    总结下,下图就是对偶SVM的所有内容。这就转化为一种简单的约束优化问题了。

    三、核函数

    在对偶SVM中,我们可以观察到所有带有 x 的地方都有一定规律。它的优化不需考虑向量本身,只需要考虑两个数据向量的内积。

    这使得对偶SVM在对非线性决策边界的数据进行学习时,可以使用一些技巧。就是将xiT xj 这个内积替换成核函数。

    接下来说明什么是核函数。核函数是内积的一个一般化形式,也可以理解为空间的另一个内积。

    核函数是做什么的。假设我们想分开下图红色和蓝色星星,用一条直线是肯定不行的。

     这时候考虑把 x 映射到另一个空间,把 x 映射为 x 的平方,这样决策边界就是抛物线形状。

    这就是后面要说的多项式特征映射。把输入的维度(特征)组合相乘在一起,这样把原始的一阶输入扩展到更高阶。

     这样做会导致特征非常多,需要一些方法进行计算,就是核技巧。

    对于核函数的内积,就是下图的每一项对应相乘,再加起来。

     有一个技巧,就是把上图的乘积写成下面的形式,而不用展开每一项。(计算机中矩阵相乘比起计算数据向量快)

     比如 M = 2 时,上式展开就是下面的。也就是二次多项式核。

    RBF(径向基函数)

    和高斯函数非常像。

    那么已知上方的内积计算方式,它的特征映射是什么样?

    对 exp 做泰勒展开:

     

    特征映射为:

    综合常见的核函数来讲:

    都可以计算出 gram 矩阵(所有(i, j)组合的核函数值组成的矩阵),就是图片里的每个核函数的第二个公式。这样计算量相对轻量。

    只要一种算法使用了内积,都可以使用核函数代替,而没有实际计算向量的内积。

    四、SVM的优化方法

    主要有两个让SVM更快的解决方法:

    1、SMO(序列最小优化)

    2、梯度下降

    都是启发于同样的思想,每次只考虑一个或两个样本

    我们对原问题或对偶问题进行优化,都是在解一个二次规划问题。

    前面说过 SVM 对偶问题不会出现 w 和 b,针对这个目标函数建立的优化方法就是SMO,使用的思想是一次只优化两个变量,而不是一次优化所有。专注于优化那些并非处在最优点的样本对应的变量值。

    比如我们要优化 α和 αb,目标函数可拆成下式,其他常数与最小化无关就忽略了。

     

     这个是二维的,它存在一个等式约束和一个不等式约束,求解会很快,而且它存在解析解(就是把 α 设为某个公式的值就好)。

     所以 SMO 的主要思想是可以求解二维的最小化优化问题的解析解,可以遍历所有两个变量的组合或使用其他更好的办法,最后收敛到全局解。

    下面是使用hinge loss进行梯度下降,这是从另一个角度看SVM原问题的目标函数。

    之前使用了松弛变量,这里使用另一个完全等价的方式 hinge loss 来替代。

      

     hinge 函数如果输入是负得到 0,输入是正就是原值。hinge 函数的输入是间隔约束被破坏的程度。除以 n 是用来缩放正则函数。

    这种方法移除了松弛变量的约束,使之可以对目标函数求梯度

     

     其中 这个函数表示样本是否分类错误,其值等于 0 或 1,如果正确就没有梯度,因为没有loss。

    可以得到随机 SVM 的更新公式

  • 相关阅读:
    The type new View.OnClickListener(){} must implement the inherited abstract method View.Onclicklis
    vue开发环境跨域
    浅析deep深度选择器
    模块化
    highlight-current-row无效的解决方法
    element-ui的table 在页面缩放时,出现的问题
    css变量
    节流和防抖
    promise详解
    正则表达式详解
  • 原文地址:https://www.cnblogs.com/sumuyi/p/13200608.html
Copyright © 2011-2022 走看看