遵循统一的机器学习框架理解SVM

Posted spingc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遵循统一的机器学习框架理解SVM相关的知识,希望对你有一定的参考价值。

遵循统一的机器学习框架理解SVM

一、前言

  1. 我的博客不是科普性质的博客,仅记录我的观点和思考过程。欢迎大家指出我思考的盲点,更希望大家能有自己的理解。
  2. 本文参考了李宏毅教授讲解SVM的课程和李航大大的统计学习方法。

二、理解

统一的机器学习框架(MLA):

1.模型(Model)
2.策略(Loss)
3.算法(Algorithm)

按照如上所说框架,SVM最核心的就是使用了 Hinge Loss核方法

SVM: Hinge Loss + Kernel Method

Model

给定数据集 \((x^1,\haty^1),(x^2,\haty^2)...(x^n,\haty^n)\),其中\(\haty^i\in\1,-1\\),且线性函数:
\[f(x)=w^Tx+b\]

\[y=\begincases 1,\quad &f(x)>0\-1, &f(x)<0 \endcases\]
同时:
\(\haty=1\) 时,\(f(x)\)越大越好; \(\haty=-1\) 时,\(f(x)\)越小越好。
综合来说即:\(\hatyf(x)\) 越大越好。

Loss

结构风险最小化:经验风险+正则项

经验风险

上面说到我们希望 \(\hatyf(x)\) 越大越好,也就是当 \(\hatyf(x)\) 越大时,损失应该越小(Large Value, Small Loss)。
1.考虑使用 \(sigmoid + cross\ entropy\) 的损失函数:
\[\haty=\begincases +1,\; &f(x)>0\; &\sigma(f(x))\longrightarrow 1, &Loss=-ln(\sigma(f(x)))\-1,\; &f(x)<0\; &\sigma(f(x))\longrightarrow 0, &Loss=-ln(1-\sigma(f(x))) \endcases\]
考虑到 \(1-\sigma(f(x))=1-\frac11+exp(-f(x))=\frac11+exp(f(x))=\sigma(-f(x))\)
\[Loss = -ln(\sigma(\hatyf(x)))=ln(1+exp(-\hatyf(x))) \]

这个就是西瓜书中的对率损失。
2.使用Hinge Loss损失函数:
使用对率损失时,希望\(\hatyf(x)\)越大越好,好上加好,永无止境的那种。
换一种角度看,假如我们希望 \(\hatyf(x)\) 做的足够好就可以了,也就是说当 \(\hatyf(x)>1\) 时,我们认为它已经做的足够好了,此时损失就为0了。

题外话:Hinge Loss就好像横向学习,很多时候我们需要学习很多领域的知识,此时大概知道、了解就行;对率损失就像纵向学习,在自己的领域需要钻研,好上加好。

\[Loss = max(0,1-\hatyf(x))\]

正则项

\[\frac12||w||^2\]
综上所述,最终的损失函数
\[Loss = \frac12\lambda||w||^2 + \sum_i=1^n max(0,1-\haty^i f(x^i))\]

注意到Loss中正则项是凸函数,经验损失项也是凸函数,直接用梯度下降法就可以求解。

Algorithm

梯度下降法

\[\frac\partial L\partial w = \lambda w+ \sum_i=1^n -\delta(\haty^i f(x^i) < 1)\haty^i x^i\]

\[\frac\partial L\partial b = \sum_i=1^n -\delta(\haty^i f(x^i) < 1)\haty^i\]

其中\(\delta(\haty^i f(x^i) < 1)\)是指示函数。

\[w^k+1=w^k-\eta(\lambda w^k+ \sum_i=1^n -\delta(\haty^i f(x^i) < 1)\haty^i x^i)\]

\[b^k+1=b^k-\eta(\sum_i=1^n -\delta(\haty^i f(x^i) < 1)\haty^i)\]

总结

到目前位置所做的事就是:对于一组给定的数据,找到一个超平面划分它们,进行分类,且要求尽可能做的好(策略是HingeLoss)。考虑到在当前维度或者空间可能做的不是很好(可分性不是很好),可以把这些数据点变换空间或者升维,在另一个空间具有更好的可分性,这样可以把当前任务做的更好。

\[z = \phi(x) \]

z表示对x进行变换后的形式(可以是高维空间,也可以是低维空间),此时再使用上面所说的方法

\[Loss = \frac12\lambda||w||^2 + \sum_i=1^n max(0,1-\haty^i f(z^i))\]

\[Loss = \frac12\lambda||w||^2 + \sum_i=1^n max(0,1-\haty^i f(\phi(x^i)))\]

不足之处:对x进行变换后得到z,首先我们需要计算得到z,再进行后续的计算,当升维后z的维度很大,此时虽然可分性增加了,但是计算量会大大增加,而且对于特殊情况,比如z是无限维时,z根本就无法计算出来,由此引出核方法。

扩展

  1. 对于一个深度神经网络做二分类任务,一般我们使用交叉熵作为损失函数,假如把损失函数替换为hingeloss,则就是深度学习版的SVM。
  2. 把深度神经网络的前n-1层看作一个特征变换层,最后一层看作分类层,与我们总结中说的就非常相似了,把 \(x\) 进行转换,再进行分类。不同点在于:我们所说的SVM这个变换的函数是我们定义的是确定的,而Deep Learning里的转换函数是不定的,是通过数据学出来的。
    总的来说,SVM和深度学习分类任务遵循统一的思想,从本质上来说没必要区分它们。

三、对偶形式

写出对偶形式的目的是:将 \(w,b\) 表示为数据点的线性组合,这样可以把 \(\phi(x^i)\phi(x^j)\) 这种在高维空间的计算转换成成 \(\kappa(x^i,x^j)\) 在低维空间计算,再通过核函数直接得到最终的值的方式。
隐含的思想是:我并不需要了解中间的过程(升维后的值),只需要得到他们之间的关系就行(核函数),核函数 \(\kappa\) 就表示了这种关系。

根据 \(w,b\) 的求解公式的特性,当 \(w^0=0,b^0=0\) 时,容易看出 \(w,b\) 是给定数据点的线性组合(Linear Combination)
\[w = \sum_i=1^n \alpha_i \haty^i x^i\]

\[b = \sum_i=1^n \beta_i \haty^i\]

\[\alpha_i= \eta\(1-\eta \lambda)^k \delta(\haty^i (w^Tx^i+b<1))_w,b->0+(1-\eta \lambda)^k-1 \delta(\haty^i (w^Tx^i+b<1))_w,b->1+...\\+(1-\eta \lambda)^0 \delta(\haty^i (w^Tx^i+b<1))_w,b->k\\]

\[\beta_i= \eta\\delta(\haty^i (w^Tx^i+b<1))_w,b->0+ \delta(\haty^i (w^Tx^i+b<1))_w,b->1+...\\+ \delta(\haty^i (w^Tx^i+b<1))_w,b->k\\]

这里要区别于感知机,因为在此处有正则项,\(\lambda > 0\),假如 \(\lambda=0\) 时,则 \(\alpha_i=\beta_i\)

此时:

\[f(x) = w^Tx+b= (\sum_i=1^n \alpha_i \haty^i x^i)^Tx+\sum_i=1^n \beta_i \haty^i\]

\[f(x) = w^Tx+b= (\sum_i=1^n \alpha_i \haty^i z^i)^Tz+\sum_i=1^n \beta_i \haty^i\]

\[f(x) = w^Tx+b= \sum_i=1^n \alpha_i \haty^i \kappa (z^i,z)+\sum_i=1^n \beta_i \haty^i\]

以上是关于遵循统一的机器学习框架理解SVM的主要内容,如果未能解决你的问题,请参考以下文章

机器学习--- SVM的学习:理论基础理解

深入理解支持向量机(SVM)

机器学习:通俗理解支持向量机SVM及代码实践

机器学习基础:通俗理解支持向量机SVM及代码实践

机器学习算法之SVM原理

Spark机器学习系列之13: 支持向量机SVM