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

一、前言

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

二、理解

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

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

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

SVM: Hinge Loss + Kernel Method

Model

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

\[y=\begin{cases}
1,\quad &f(x)>0\\
-1, &f(x)<0
\end{cases}\]
同时:
当 \(\hat{y}=1\) 时,\(f(x)\)越大越好; \(\hat{y}=-1\) 时,\(f(x)\)越小越好。
综合来说即:\(\hat{y}f(x)\) 越大越好。

Loss

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

经验风险

上面说到我们希望 \(\hat{y}f(x)\) 越大越好,也就是当 \(\hat{y}f(x)\) 越大时,损失应该越小(Large Value, Small Loss)。
1.考虑使用 \(sigmoid + cross\ entropy\) 的损失函数:
\[\hat{y}=\begin{cases}
+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)))
\end{cases}\]
考虑到 \(1-\sigma(f(x))=1-\frac{1}{1+exp(-f(x))}=\frac{1}{1+exp(f(x))}=\sigma(-f(x))\)
\[Loss = -ln(\sigma(\hat{y}f(x)))=ln(1+exp(-\hat{y}f(x))) \]

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

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

\[Loss = max(0,1-\hat{y}f(x))\]

正则项

\[\frac{1}{2}||w||^2\]
综上所述,最终的损失函数
\[Loss = \frac{1}{2}\lambda||w||^2 + \sum_{i=1}^n max(0,1-\hat{y}^i f(x^i))\]

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

Algorithm

梯度下降法

\[\frac{\partial L}{\partial w} = \lambda w+ \sum_{i=1}^n -\delta(\hat{y}^i f(x^i) < 1)\hat{y}^i x^i\]

\[\frac{\partial L}{\partial b} = \sum_{i=1}^n -\delta(\hat{y}^i f(x^i) < 1)\hat{y}^i\]

其中\(\delta(\hat{y}^i f(x^i) < 1)\)是指示函数。

\[w^{k+1}=w^k-\eta(\lambda w^k+ \sum_{i=1}^n -\delta(\hat{y}^i f(x^i) < 1)\hat{y}^i x^i)\]

\[b^{k+1}=b^k-\eta(\sum_{i=1}^n -\delta(\hat{y}^i f(x^i) < 1)\hat{y}^i)\]

总结

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

\[z = \phi(x) \]

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

\[Loss = \frac{1}{2}\lambda||w||^2 + \sum_{i=1}^n max(0,1-\hat{y}^i f(z^i))\]

\[Loss = \frac{1}{2}\lambda||w||^2 + \sum_{i=1}^n max(0,1-\hat{y}^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 \hat{y}^i x^i\]

\[b = \sum_{i=1}^n \beta_i \hat{y}^i\]

\[\alpha_i= \eta\{(1-\eta \lambda)^k \delta(\hat{y}^i (w^Tx^i+b<1))_{w,b->0}+(1-\eta \lambda)^{k-1} \delta(\hat{y}^i (w^Tx^i+b<1))_{w,b->1}+...\\+(1-\eta \lambda)^0 \delta(\hat{y}^i (w^Tx^i+b<1))_{w,b->k}\}\]

\[\beta_i= \eta\{\delta(\hat{y}^i (w^Tx^i+b<1))_{w,b->0}+ \delta(\hat{y}^i (w^Tx^i+b<1))_{w,b->1}+...\\+ \delta(\hat{y}^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 \hat{y}^i x^i)^{T}x+\sum_{i=1}^n \beta_i \hat{y}^i\]

\[f(x) = w^Tx+b= (\sum_{i=1}^n \alpha_i \hat{y}^i z^i)^{T}z+\sum_{i=1}^n \beta_i \hat{y}^i\]

\[f(x) = w^Tx+b= \sum_{i=1}^n \alpha_i \hat{y}^i \kappa (z^i,z)+\sum_{i=1}^n \beta_i \hat{y}^i\]

遵循统一的机器学习框架理解SVM的更多相关文章

  1. 遵循统一的机器学习框架理解高斯混合模型(GMM)

    遵循统一的机器学习框架理解高斯混合模型(GMM) 一.前言 我的博客仅记录我的观点和思考过程.欢迎大家指出我思考的盲点,更希望大家能有自己的理解. 本文参考了网络上诸多资料,特别是B站UPshuhua ...

  2. 机器学习之深入理解SVM

    在浏览本篇博客之前,最好先查看一下我写的还有一篇文章机器学习之初识SVM(点击可查阅哦).这样能够更好地为了结以下内容做铺垫! 支持向量机学习方法包括构建由简至繁的模型:线性可分支持向量机.线性支持向 ...

  3. 支持向量机通俗导论(理解SVM的三层境界)

    原文链接:http://blog.csdn.net/v_july_v/article/details/7624837 作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算 ...

  4. 支持向量机通俗导论(理解SVM的三层境界) by v_JULY_v

    支持向量机通俗导论(理解SVM的三层境界) 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去 ...

  5. [转] - Weiflow——微博机器学习框架

    Weiflow--微博机器学习框架 本文从开发效率(易用性).可扩展性.执行效率三个方面,介绍了微博机器学习框架Weiflow在微博的应用和最佳实践. 在上期<基于Spark的大规模机器学习在微 ...

  6. 支持向量机通俗导论(理解SVM的三层境界)(ZT)

    支持向量机通俗导论(理解SVM的三层境界) 原文:http://blog.csdn.net/v_JULY_v/article/details/7624837 作者:July .致谢:pluskid.白 ...

  7. 支持向量机通俗导论(理解SVM的三层境界)【非原创】

    支持向量机通俗导论(理解SVM的三层境界) 作者:July :致谢:pluskid.白石.JerryLead. 出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vecto ...

  8. Python开源机器学习框架:Scikit-learn六大功能,安装和运行Scikit-learn

    Python开源机器学习框架:Scikit-learn入门指南. Scikit-learn的六大功能 Scikit-learn的基本功能主要被分为六大部分:分类,回归,聚类,数据降维,模型选择和数据预 ...

  9. 支持向量机通俗导论(理解SVM的三层境界)[转]

    作者:July .致谢:pluskid.白石.JerryLead.说明:本文最初写于2012年6月,而后不断反反复复修改&优化,修改次数达上百次,最后修改于2016年11月.声明:本文于201 ...

随机推荐

  1. 44、[源码]-Spring容器创建-BeanFactory预准备

    44.[源码]-Spring容器创建-BeanFactory预准备 @Override public void refresh() throws BeansException, IllegalStat ...

  2. LOJ P10114 数星星 stars 题解

    每日一题 day7 打卡 Analysis 树状数组 由于题目中给的数据是按y轴排序,我们只需构建x轴的树状数组,也就是说我们只需统计星星i之前一共有多少个x坐标小于或等于Xi的星星,这个数值也就是星 ...

  3. 初识QuartusII 9.0(破解,半加器的仿真,综合:上)

    由于在意大利期间,用的xilinx公司的ZYBO板子,相应的软件用ISE,SDK.回国买了altera公司的板子,自然也要学习国内较流行的软件(TB大西瓜家,因此相关例程也是大部分引用他家).Quar ...

  4. P1966 火柴排队——逆序对(归并,树状数组)

    P1966 火柴排队 很好的逆序对板子题: 求的是(x1-x2)*(x1-x2)的最小值: x1*x1+x2*x2-2*x1*x2 让x1*x2最大即可: 可以证明将b,c数组排序后,一一对应的状态是 ...

  5. Manjaro Linux无备份迁移home目录

    前几天安装了最新的manjaro kde 18.10,速度刚开始非常快,后来几乎每次重启都会出现无法挂在home分区的情况,刚开始以为是分区对齐的问题,但是后来发现根本不是.算了,干脆迁移下home分 ...

  6. POX flow_stats2.py analysis by uestc_gremount

    该程序是POX WIKI上的程序,我只是将统计的报文修改了以下,并做了对这个程序运行流程的分析: 1.程序从launch开始运行 2.监听2个事件,如果监听到"FlowStatsReceiv ...

  7. oracle 编译无效对象

    在数据库中,会存在一些无效的对象,导致这种现象的发生原因很多,其中最常见的就是数据库升级(例如修改了表的结构),迁移而引起. 编译无效对象的方式: 1 使用alter **** compile 语句进 ...

  8. linux pip install gdal apyt-get install libgdal-dev export cplus_path=/usr/include/gdal export c_path=/usr/include/gdal

    apt-get install libgdal-dev pip install gdal

  9. python @classmethod

    写在前面 写博客的时候,我发现拖延症很严重,本来昨天要开始写的,结果东看看,西翻翻,啥也没落实下来.时间过去了,口袋里的收获却寥寥无几.讨厌这样的自己.我要戒掉这个不好的毛病. 拖延症的底层原因之一是 ...

  10. Nginx设置黑名单

    date: 2019-07-04  14:35:56 author: headsen chen notice: 个人原创 1,在分域名下面设置: [root@pro-nginx:/usr/local/ ...