SMO是SVM寻找最优解的一种效果很好的方法,它先候场等待,紧接SVM最后的问题:
约束条件:
第一步:转化问题函数
通过KKT将约束条件转化为等式函数可得:
函数看起来比较高大上,我们整理下思路:
①参数较多,最小值需我们逐个求偏导为0,再代入该函数进行简化
②避免使用特征向量w求解问题(特定样本下,1000维数据中需要确定1000个值),通过系数αi求解问题(只和样本数量有关)
对参数求偏导并使其为0:w、b、ui、ti
①
②
③
④
将①-④代入原式:
根据KKT可得约束条件:
①u消除条件:
②b消除条件:
③w消除条件:
④KKT不等式无约束或梯度相反条件:
⑤KKT原不等式约束条件:
⑥KKT不等式无约束或最优解位于不等式边界:
小插曲:
①根据KKT理论可知代表该样本未受条件约束:,其意为该样本在支持向量外侧;此时,则正常样本不会贡献误差
②同理代表样本受约束,此时则,由⑥的一式得,其意为该样本刚好处于支持向量上,此时将通过⑥式中得解
③时同上,此时则落在支持向量与超平面内,则落在超平面或另一侧,相当于分类错误;落在支持向量上
④松弛变量巧妙地利用KKT特性在L函数中加入,而该误差又只作用于离群点
回到原函数,可视为w与α的函数:
为使L有最小值,则|w|越小越好、α越大越好。我们现在已经将问题转化为关于α的函数,那么剩下的就是求
由于KKT是建立在求最小值基础上,因此我们把上述函数加个负号改成相反的问题,趁机加入核函数并结合KKT条件得出转化后的问题:
并约束于:
注:引入核函数虽然对样本特征升维了,但特征向量w无需升维,是因为我们将问题转化为min(α),借助核函数求得α最小值后,由于升维前后特征是等效的,我们在利用最小的α求得原特征向量即可
第二步:寻找α最小值
公式场面看起来有些失控,我们现在的目标是使α获得最小值以致L函数具有最小值
突破口在,我们先拿出两个α:α1、α2,固定其他α。则问题相当于是求2个α的最小值(其他则视为常数)→更新这2个α→选择下两项α:
运算牢记,将两个α代入问题函数min(L)中可得:
上式看起来又快失控了,由于目标是通过对α求导来寻找最小值,因此常数项可以直接被干掉(其导数值为0)
由于式子太长,简记,原L函数等效于l函数,继续化简:
令,同时,代入上式可消掉α1。并对α2求导
导数等于0时α2获得最小值,还需要简化B1、B2计算量:迭代时它每次都会计算除这2个样本以外所有样本的数据,其实可以只计算这2样本值:
重点来了!这里的α1、α2还未更新,而上文求导式中的α2是将要求解的值。因此将Bm代入导式便建立了新老参数替代的关系,下文将以αm表示待更新参数、αm-old表示老参数,代入得:
对于右侧函数,我们从右到左逐渐瓦解它,定义:
右式与中式相加得
f(x)-y可理解为某样本真实与预测的误差,定义为E,则上式等效于
我们用老参数消掉A:,代入得:
我们把左中右式加起来,即上述①、②:
至此,我们便获得了α2的更新函数:
第三步:寻找α定义域
第一种情况:
相当于原函数是开口向上的二次函数,最小值可能在边界上,也有可能在定义域之间,需进一步分析
求出α更新函数后,α还要考虑约束条件,设上限为H、下限为L,可得:
①
易知
②
因此
第二种情况:
此时代表两样本相等,数据去重工作没做好?
等效于求导后是常数项,类似,此时L为线性函数
最小值根据其线性斜率正负在定义域边界取得:,哪边的函数值小就取哪边
第三种情况:
理论上核函数使特征升维后,向量的大体方向是不会变化的(小于90°);但某些核函数会导致其方向发生变化的同时也能保证一一映射。
类似第一种情况,此时L函数是开口向下的二次函数,它没有极小值。因此同②一样在定义域边界取得最小值
第四步:各项参数求解
第二、三步详述了的求解过程,可谓道路坎坷。得到两组样本下的后也即将可以拨开云雾求解所有参数
由可得:
由于计算定义域时已经代入了的函数关系,因此无需再考虑其定义域。下面我们开始求w与b,w比较简单,上文已求出关系,将调整后的代入KKT条件③得
再来看b,参考上文提到的小插曲,我们基于KKT条件得出了样本落点情况。自然地,修改的b依然要满足这个条件,不然后续迭代就没有意义了:
将2个样本分别带入f(x)化简得:
注:因为我们将x进行核函数升维,因此计算b时也保持使用
因此
同理
若两个α均为,则 注:因为方程一路求解下来我们用的关系式消掉了,此时又要保证,那么你用来解这个一元一次方程式是没有区别的
若至少有一个α不满足上述条件式,此时会产生一个开放解,SMO提出者使用两者的平均值作为此次b的修改值
因此
第五步:SMO收拾残局
我们通过上文只得出了一对乘子α的优化过程,现在我们通过循环将所有乘子都进行一次优化,而这个过程就是SMO,上面的求解思想也正是SMO的核心思想。我们现在利用SMO强势走一波:
①初始化超平面参数b=0、所有乘子α=0 (w可通过乘子的关系函数直接赋值)
②选择使得每次迭代有最大优化效果
选择第一个α:
优先寻找中的乘子,揪出第一个索引i对应的样本不满足条件的作为
若上述过程中都很老实,没有被揪出,则寻找边界上不满足对应条件的
注:优先找区间内的是因为多轮迭代后,处于边界的大多已被条件约束,调整效果不及区间内的
选择第二个α:
由可知为使改变最大,则要有最大值。寻找满足α与超平面关系条件中能产生最大值的样本,其对应索引的乘子作为需要优化的
③计算相关参数,更新本次w、b
计算及其相应条件下的上下限(Z>0)或值(Z≤0)
求解,并据此解出
④继续遍历,若某次选择没有可选的后停止迭代或连续X次迭代后min(L)减小率小于某个阈值(数量较多时越贴近最优值会多增加收敛过程,但预测效果上差不多满足要求其实就可以提前停止了)
个人看法
从SMO的过程可见,发明者为了让SVM满足可用性,嫁接了一堆数学知识使问题有求解方法,但这样却导致算法本身十分复杂。从机器学习大家推崇的奥卡姆剃刀定理来讲,我个人认为它虽从数学理论上解决了分类问题,但实际面临的运算复杂度却在如今的商业场景中十分受限,实际上原发明者的设计文章也提到尽量不要超过10000样本,放在上个世纪的数据量下可能说得过去,不过时至今日新模型、TB、PB数据量级的情况下,还是黯然失色