如何学习SVM(支持向量机)以及改进实现SVM算法程序

雷锋网 AI 科技评论按,本文为韦易笑在知乎问题如何学习SVM(支持向量机)以及改进实现SVM算法程序下面的回复,雷锋网(公众号:雷锋网) AI 科技评论获其授权转载。以下为正文:

学习 SVM 的最好方法是实现一个 SVM,可讲理论的很多,讲实现的太少了。

第一步:实现传统的 SMO 算法

上面就是如何实现一个相对成熟的 SVM 模型的思路,以及配套优化方法,再往后还有兴趣,可以接着实现支持向量回归,也是一个很有用的东西。

这其实是很直白的一种优化方式,我查了一下,有人专门发论文就讲了个类似的方法。

“后起之秀”铝压延业务看准的是国內市场巨大缺口

所剩的边角余料将会被锯切铝屑压缩机制成铝块再做利用。

那么我们势必就可以把工作集分成两个部分,热数据在前(大于 0 小于 C 的 alpha 值),冷数据在后(小于等于 0 或者大于等于 C 的 alpha)。

2019年已经接近尾声,在这一年中我们见证了多款游戏的问世,如年初发售的《生化危机2:重制版》、《只狼:影逝二度》、《鬼泣5》,还有拥有中国特色的《三国:全面战争》,而在年底更是发售了《死亡搁浅》、《宝可梦:剑/盾》这样的大作。

第一条生产线热轧车间四连精轧机组

由于标准 SVM 核函数用的是两个高维矢量的内积,根据内积的几个条件,SVM 的核函数又是一个正定核,即 K(xi, xj) = K(xj, xi),那么我们同样的内存还能再多存一倍的核函数,性能又能有所提升。

随后记者来到生产的第二个环节——热轧车间进行参观。厂房第一条生产线的热轧车间从德国引进4500mm(板材轧机宽度)的1+1+4热连轧机组,是目前世界上已投产的铝板材轧机中轧制力最大的,可满足高端板材生产需求。

根据行业数据统计,2018年中国新能源汽车销量按年增加超过六成达125.6万辆,工信部预计2019年新能源汽车销量将突破50万辆。虽然目前新能源汽车保有量占汽车总量比重仍然为个位数,但随着环保政策趋严,以及汽车生产制造等方面改善,汽车轻量化市场有望持续放量。

“今年天津忠旺第一条生产线可达到40至50万吨产能,第二条线今年对于业绩贡献不会太大”,许晶说,作为天津忠旺重头戏的第二条生产线将在今年下半年开始释放,不过具体时间仍视乎与客户之间进展来做考虑。

第一条生产线熔铸车间

Platt 的文章里也证明过一旦某个 alpha 出于边界(0 或者 C)的时候,就很不容易变动,而且伪代码也是优先在工作集里寻找 > 0 and < C 的 alpha 值进行优化,找不到了,再对工作集整体的 alpha 值进行迭代。

记者在陈列区见到了众多展品,大到高铁车身和油罐车,小到各种细致零部件,涵盖了日常所见的各种铝制产品。值得一提的是,随着近年来国家节能减排政策出台,新能源汽车市场正在不断扩张,轻量化成为未来交通工具的一个发展方向,而汽车轻量化市场为铝压延带来新的发展机遇。

他先从书本开始自学,但时常弄伤自己,限于当地没有教授中国功夫的武术馆,他进入跆拳道馆学习。在一招一式中探解中国功夫的同时,武术中所弘扬的谦逊、侠义和友善待人,以及博大精深的中国文化更吸引着约瑟夫决定要去中国。

同时这类算法也适合 online 训练和并行训练,可以逐步更新增量训练新的样本,还可以用到多核和分布式计算来训练模型,这是 SMO 算法做不到的地方。

最传统的修改方式就是将不等式约束 C 分为 Cp 和 Cn 两个针对 +1 分类的 C 及针对 -1 分类的 C。修改方式是直接用原始的 C 乘以各自分类的权重,得到 Cp 和 Cn,然后迭代时,不同的样本根据它的 y 值符号,用不同的 C 值带入计算。

2009年,他获得了由新疆维吾尔自治区人民政府颁发的“中国天山奖”,这是官方表彰对新疆经济建设和社会发展作出突出贡献的优秀外国专家而设立的奖项。

核函数缓存非常消耗内存,libsvm 数学上已经没得挑了,但是工程方面还有很大改进余地,比如它的核缓存实现。

首先来到的是熔铸车间,车间內有绿色盆摘装点,且随处可见张贴的安全生产告示。在生产厂房內,少有见到工作人员,几乎都是各种重型机器在有条不紊的进行现场作业。

雷锋网版权文章,。详情见转载须知。

第七步:支持稀疏向量和非稀疏向量

有了这个核函数缓存,你的 SVM 求解程序能瞬间快几十倍。

那么剩下的 SVM 实现问题就是如何求解这个函数的极值。方法有很多,我们先找个起点,比如 Platt 的 SMO 算法,它后面有伪代码描述怎么快速求解 SVM 的各个系数。

观察下上面的伪代码,开销最大的就是计算核函数 K(xi, xj),有些计算又反复用到,一个 100 个样本的数据集求解,假设总共要调用核函数 20 万次,但是 xi, xj 的组和只有 100×100=1 万种,有缓存的话你的效率可以提升 20 倍。

天津忠旺第一条生产线已于2017年第三季度投产,设计产能60万吨,产品定位为以硬合金为主的中厚板、带材,包括高端汽车板、大型油罐车以及高铁用铝板等,客户涵盖工业级交通运输领域;第二条生产线设计产能120万吨,产品以包装材料等卷材为主,如铝箔胚料、罐料,预计今年下半年可开始投产,目前已开始为部分客户进行小批量试生产。

实现到这一步你就得到了功能上和性能上同 libsvm 类似的东西,接下来我们继续优化。

记者参观时,正见到机器进行铝合金转运工作,据现场工作人员介绍,该机器所吊起的扁锭每一块重量可达20至30吨。而在生产过程中,经过处理的铝锭

其实铝压延业务对于忠旺来说,算是多个业务中的“后起之秀”,成立于2011年的天津忠旺在四年內分四期斥资共38亿美元购置用于生产中厚板及板带产品的热连轧机组、冷轧机组以及熔铸生产线等生产设备。当年如此进取的行动背后,忠旺看准的正是中国铝压延市场需求的巨大缺口。

第二步:实现核函数缓存

2010年底,约瑟夫收获了爱情,邂逅了新疆姑娘奥莉,并于2012年结婚。从此,中国成为他的“第二个家”。

也就是 f(x) 公式除了 b 以外前面的最费时的计算,那么我们随时可以计算误差:

大家都知道,通过 Ensemble 可以让多个不同的弱模型组和成一个强模型,而传统 SVM 实现并不能适应一些类似 AdaBoost 的集成方法,所以我们需要做一些改动。可以让外面针对某一个分类传入一个“权重”过来,修正 SVM 的识别结果。

相信在各位游民玩家心目中,对今年发布的游戏也有着自己的排名,你认为哪款游戏是2019年度最佳游戏呢?不妨在评论区留下你的看法。

从行业来看,现时国內对于铝压延产品仍有大量进口需求,但对于国产铝压延,马青梅表示,“整体来看在价格上会有优势,加上国外生产设备陈旧,而国內近几年装置和设备等大力投入,以及生产自动化程度高,令到产品在生产工艺和质量稳定性上都具备了一定优势。”

这样 SVM 就能用各种集成方法同其他模型一起组成更为强大精准的模型了。

于上个月公布业绩不久的中国忠旺(01333-HK)可以说去年是度过了一个丰收年,收益和纯利双双增长,收益录得256亿元(人民币,下同)按年增加31.6%,纯利按年升15.5%录得44.67亿元。才刚公布完成绩单,公司又马不停蹄地邀请媒体一行去到天津忠旺进行实地探访,若说其中用意,可能与公司开始专注于高附加值铝压延产品的策略定位有较大联系。

天津忠旺坐落于天津市武清区汽车产业园,据公司介绍,选址于此有明显区位优势,距离北京较近,且70多公里车程可抵达东疆港。厂区占地面积6平方公里,呈横2公里,纵3公里的规整矩形,园区內绿化面积达20%,被称作“园林式工厂”。而这座生产基地主要用于生产铝压延产品,其创立之初的目的还得从国內铝压延产品的市场缺口说起。

核心代码很紧凑,就是给定两个 ai, aj,然后迭代出新的 ai, aj 出来,还有一层循环会不停的选择最需要被优化的系数 ai, aj,然后调用这个函数。如何更新权重和 b 变量(threshold)文章里面都有说,再多调试一下,可以用 python 先调试,再换成 C/C++,保证得到一个正确可用的 SVM 程序,这是后面的基础。

不过,按公司2018年的年报显示,该板块业务的毛利率为8.2%,按年下跌3.2个百分点。对此,公司董事总经理许晶表示,2017年毛利率只按半年计,而2018年以全年计算,此外公司该业务整体销量提升,开拓海外客户给予一定优惠,而在运输成本方面也相应有所增加令毛利率有所降低。

传统的 SMO 方法,是 SVM 的通用求解方法,然而针对线性核,就是:

之后便是冷轧环节,现场仍然是较少见到工作人员,主要依靠机器进行有序生产操作。

下面就跟记者一起走进天津忠旺,对忠旺在天津的高附加值铝压延项目一探究竟。

2018年,他来到兰州工作,也开启了中国武术又一段新的旅程,学习咏春拳,成为了拳馆中的“孩子王”。

但是还有很多时候样本是密集向量,比如一共 200 个特征,大部分样本都有 100个以上的非零特征,用稀疏向量存储的话就非常低效了,openCV 的 SVM 实现就是非稀疏向量。

记者沿着第一条生产线的熔铸——热轧——冷轧——精整的生产流程依次参观了各环节生产情况。天津忠旺目前约3600人,其中研发人员约在100人左右,研发投入占天津整体收入比重约在3%。在考察过程中记者发现,在所有生产车间中,都的确鲜少见到实地介入操作流程的工作人员,而是在每间隔一定距离的控制室內有技术人员进行自动化设施的操控。“天津忠旺定位比较高,生产的大型设备多从国外进口,且自动化程度高”,马青梅称。

注意看上面的伪代码,里面需要计算一个估计值和真实值的误差 Ei 和 Ej,他们的求解方法是:

第四步:实现冷热数据分离

公司目前三大核心业务板块包括铝合金模板、铝压延以及工业铝挤压,2018年公司整体销量约在91.7万吨,按年增加约24.4%。而这其中,铝压延业务占比录得明显增长,由2017年的12.4%,增加至2018年的31.1%。年內,铝压延业务销售金额约为50.5亿元,按年录得升幅超过两倍。而天津忠旺目前正是铝压延业务的主要生产基地,对铝压延业务的强劲增长有着至关重要的作用。

寒暑假是他探访中国的旅游期,拿着一张中国地图,沿着丝绸之路,有着异域风情的新疆成为了约瑟夫的向往之地,“热情好客的新疆人、外国人少、对于英语更加需要”让他决定从繁华的中国南方,扎根中国西北。2006年,幽默、会中国功夫的他成为新疆大学学生们最受欢迎的外教。

图为约瑟夫·坎泊尔正在给学生们上英语课。杨艳敏 摄

从响应国家铝生产和消费由“大国”向“强国”转变,到交通运输轻量化的大势所趋,捕捉到铝压延产品的潜在市场缺口,又要主打高附加值创新产品,忠旺可以说是赶上趟儿了。

在加拿大温哥华一家大型企业任职电子工程师的他不顾家人朋友的反对,2004年毅然来到中国。不会中文的他得知中国学校对于外教的需要,他留下来,成为广东一所高校的外籍教师。“上课坚持不说中文”成为了他对自己的基本要求。他说,这样才能让学生开口用英语和他对话。放慢语速、咬字清晰也成为了他的说话习惯。

上面的公式计算出 f(x) ,如果返回值 > 0 那么是 +1 类别,否则是 -1 类别,先把这一步怎么来的,为什么这么来找篇文章读懂,不然你会做的一头雾水。

现在大部分的 SVM 开源实现,源头都是 platt 的 smo 算法,读完他的文章和推导,然后照着伪代码写就行了,核心代码没几行:

上面八条,你如果实现前三条,基本就能深入理解 SVM 的原理了,如果实现一大半,就可以得到一个类似 libsvm 的东西,全部实现,你就能得到一个比 libsvm 更好用的 SVM 库了。

对于高维样本,比如文字这些,可能有上千维,每个样本的非零特征可能就那么几个,所以稀疏向量会比较高效,libsvm 也是用的稀疏向量。

或许哪天出个数学家又找到一种更好的方法,可以用类似 pegasos 的方式求解非线性核,那么 SVM 就能有比较大的进展了。

platt 的文章建议是做一个 E 函数的缓存,方便后面选择 i, j 时比较,我看到很多入门版本 SVM 实现都是这么做。其实这是有问题的,后面我们会说到。最好的方式是定义一个 g(x) 令其等于:

还有很多更高效的求解思路,比如 Pegasos 算法就用了一种类似随机梯度下降的方法,快速求 SVM 的解权重 w,如果你的样本适合线性核,使用一些针对性的非 SMO 算法可以极大的优化 SVM 求解,并且能处理更加庞大的数据集,LIBLINEAR 就是做这件事情的。

另外,公司在轨道交通方面,亦为中国中车重要供应商,为高铁“复兴号”列车以及多个城市地铁和成规项目供应车体铝材等,公司管理层曾表示,可以说超过一半的“复兴号”车体铝材都是由忠旺生产。根据中铁总公司工作会议,到2020年,全国标准动车组保有量达3800组,其中“复兴号”动车在900组以上。不过,轨道交通毕竟属于国家规划性经济范畴,未来在这一业务板块或难有爆发式增长,但鉴于现时公司行业参与度较高,未来轨道交通方面的订单也有可预期的稳定性。

第一条生产线冷轧车间

图为加拿大外籍教师约瑟夫·坎泊尔正在中国妻子的陪练下练习武术。杨艳敏 摄

假设你已经读懂了 SVM 的原理,并了解公式怎么推导出来的,比如到这里:

随着迭代加深,会发现大部分时候只需要在热数据里求解,并且热数据的大小会逐步不停的收缩,所以区分了冷热以后 SVM 大部分都在针对有限的热数据迭代,偶尔不行了,再全部迭代一次,然后又回到冷热迭代,性能又能提高不少。

但是如果碰到非线性核,权重 w 处于高维核空间里(有可能无限维),你没法梯度下降迭代 w,并且 pegasos 的  pdf 里面也没有提到如何用到非线性核上,LIBLINEAR 也没有办法处理非线性核。

根据行业內报告显示,目前国內铝压延市场的现状是,行业集中度低,产能分散且低端产能所占比重较大。马青梅指,天津忠旺的产品定位是高附加值的铝压延产品,厂房內生产线的自动化程度高,产品应用包括交通运输、机械设备、罐料包装等众多行业。

第六步:继续优化核函数计算

所以最好的办法是对 g(x) 进行缓存,platt 的方法里因为所有 alpha 值初始化成了 0,所以 g(x) 一开始就可以全部设置成 0,稍微观察一下 g(x) 的公式,你就会发现,因为去掉了 b 的干扰,而每次 SMO 迭代更新 ai, aj 参数时,这两个值都是线性变化的,所以我们可以给 g(x) 求关于 a 的偏导,假设 ai,aj 变化了步长 delta,那么所有样本对应的 g(x) 加上 delta 乘以针对 ai, aj 的偏导数就行了,具体代码类似:

SVM 的问题就变成:求解一系列满足约束的 alpha 值,使得上面那个函数可以取到最小值。然后记录下这些非零的 alpha 值和对应样本中的 x 值和 y 值,就完成学习了,然后预测的时候用:

天津忠旺董事长马青梅

第一条生产线热轧车间

把这段代码放在 takeStep 后面,每次成功更新一对 ai, aj 以后,更新所有样本对应的 g(x) 缓存,这样通过每次迭代更新 g(x) 避免了大量的重复计算。

冷轧车间之后便是精整环节,作为生产重要环节的最后一步,在经过前面工序后,可对产品进行更加精细化的修整加工,以满足不同产品各项性能要求。记者亦参观了汽车板的生产车间,不过鉴于客户保密性要求未能拍摄照片。

在新疆的12年,约瑟夫不仅是老师,更是外国专家、翻译家、武术家、志愿者等多重身份,他利用空暇时间前往新疆农村学校授课;举行关于英语写作和演讲的讲座,鼓励学生坚持梦想;带领学生在运动会开幕式表演中国功夫;参加当地官方举行的外国专家会议,为当地发展献计献策;翻译修订中国学者出版的外文书籍……生活忙碌且快乐。

针对核函数的计算和存储有很多优化方式,比如有人对 NxN 的核函数矩阵进行采样,只计算有限的几个核函数,然后通过插值的方式求解出中间的值。还有人用 float 存储核函数值,又降低了一倍空间需求。

第三步:优化误差值求解

《My 103 angels of china》则是约瑟夫2019年的“写作清单”。他说,如同《水浒传》中的108位好汉一样,他更想记录15年间所有给与他帮助的中国人,“实际上帮助我的人太多了,103仅是一个数字,是他们让我在中国的生活丰富多彩。”(完)

虽然市场潜力大,但应用于汽车产业的铝压延产品所需技术含量也更高,马青梅称,目前忠旺有部分汽车板产品已通过部分国內新能源汽车厂商包括比亚迪、长城华冠等公司的认证,并开始小批量供货,但认证资质耗时较长,需要与客户不断进行各项试验和检测,公司目前正积极推进欧系品牌车企认证,“拿到汽车厂商的认证后,意味着可直接接触终端客户,公司未来的利润空间也会比较大。”公司在去年亦成为捷豹路虎一级供应商,将为其英国工厂直接提供优质铝合金产品解决方案,这意味着公司已正式进入海外汽车厂商供应链。

样本太大时,如果你想存储所有核函数的组和,需要 N*N * sizeof(double) 的空间,如果训练集有 10 万个样本,那么需要 76 GB 的内存,显然是不可能实现的,所以核函数缓存是一个有限空间的 LRU 缓存,SVM 的 SMO 求解过程中其实会反复用到特定的几个有限的核函数求解,所以命中率不用担心。

交通运输轻量化趋势蕴藏新发展契机

非稀疏向量直接是用数组保存样本每个特征的值,在工程方面就有很多优化方式了,比如用的最多的求核函数的时候,直接上 SIMD 指令或者 CUDA,就能获得更好的计算性能。

行云流水般的中国功夫成为了约瑟夫了解中国的“启蒙老师”。出生于加拿大多伦多、身材瘦弱的他,成为了学校大男孩的欺负对象。13岁时,他从电影上看到功夫巨星李小龙,目瞪口呆的他如获至宝。

所以最好的方式是同时支持稀疏和非稀疏,兼顾时间和空间效率,对不同的数据选择最适合的方式。

这就是目前为止 SMO 这段为代码里代价最高的函数,因为回顾下上面的公式,计算一遍 f(x) 需要 for 循环做乘法加法。

约瑟夫还喜欢摄影和写作,“出一本让外国人读懂中国的书”成为了他的愿望。他说,“很多外国人没有到访中国,往往通过网络来了解一切,这些都是片面的,希望通过我的文字和图片,告诉他们一个真实的中国。”

第八步:针对线性核进行优化

天津忠旺第一条生产线全景

“公司在设立天津忠旺之前在国內进行过两轮市场调研,发现在国产的铝压延高端产品方面有着较大市场缺口,市场所需要的铝材均是自美铝等海外供应商进口所得”,天津忠旺董事长马青梅在接受访问时对记者表示,“虽然彼时的忠旺集团产业链已经较为全面,但唯独在铝压延市场上却欠缺布局”,为补齐短板抢占市场先机,也为满足多样化市场需求,忠旺在天津建立了产能规模合共180万吨的铝压延产品生产厂房。

本文由游民星空制作发布,未经允许禁止转载。