基于线性SVM的CIFAR-10图像集分类

AI有道

一个有情怀的公众号

之前我用了六篇文章来详细介绍了支持向量机SVM的算法理论和模型,链接如下:

实际上,支持向量机SVM确实是机器学习中一个非常重要也是非常复杂的模型。关于SVM的详细理论和推导,本文不再阐述,读者可以直接阅读上面的六篇文章。

学习完了复杂的理论知识,很多朋友可能非常想通过一个实际的例子,动手编写出一个SVM程序,应用到实际中。那么本文就将带领大家动手写出自己的SVM程序,并且应用到图像的分类问题中。我们将在经典的CIFAR10图像数据集上进行SVM程序验证。

话不多说,正式开始!

1

SVM的基本思想

简单来说,支持向量机SVM就是在特征空间中找到一条最佳的分类超平面,能够让正、负样本距离该超平面的间隔(margin)最大化。

以二维平面为例,确定一条直线对正负样本进行分类,如下图所示:

很明显,虽然分类线H1、H2、H3都能够将正负样本完全分开,但是毫无疑问H3更好一些。原因是正负样本距离H3都足够远,即间隔「margin」最大。这就是SVM的基本思想:尽量让所有样本距离分类超平面越远越好。

2

线性分类与得分函数

在线性分类器算法中,输入为x,输出为y,令权重系数为W,常数项系数为b。我们定义得分函数s为:

这是线性分类器的一般形式,得分函数s所属类别值越大,表示预测该类别的概率越大。

以图像识别为例,共有3个类别「cat,dog,ship」。令输入x的特征维度为4「即包含4个像素值」,W的维度是3x4,b的维度是3x1。在W和b确定后,得到各个类别的得分函数s为:

由上图可知,因为总有3个类别,得分函数s是3x1的向量。其中,cat score=-96.8,dog score=437.9,ship score=61.95。从s的值来说,dog score最高,cat score最低,则预测为狗的概率更大一些。而该图片真实标签是一只猫,显然,从得分函数s上来看,该线性分类器的预测结果是错误的。

通常为了简化计算,我们直接将W和b整合成一个矩阵,同时将x额外增加一个全为1的维度。这样,得分函数s的表达式得到了简化:

示例图如下:

3

优化策略与损失函数

通常来说,SVM的优化策略是样本到分类超平面的距离最大化。也就是说尽量让正负样本距离分类超平面有足够宽的间隔,这是基于距离的衡量优化方式。针对上文提到的例子,图片真实标签是一只猫,但是得到的s值却是最低的,显然这不是我们希望看到的。最好的情况应该是cat score最高。这样才能保证预测cat的概率更大。此时,利用SVM的间隔最大化的思想,就要求cat score不仅仅要大于其它类别的s值,而且要达到一定的程度,可以说有个最低阈值。

因此,这种新的SVM优化策略可以这样理解:正确类别对应的得分函数s应该比其它类别的得分函数s大一个阈值 Δ:

接下来,我们就可以根据这种思想定义SVM的损失函数:

‍‍‍‍‍‍其中,yi表示正确的类别,j表示错误类别。从Li的表达式可以看出,只有当syi比sj大超过阈值 Δ 时,Li才为零,否则Li大于零。这种策略类似于距离最大化策略。

举个例子来解释Li的计算过程:例如得分函数s=[-1, 5, 4],y1是真实样本,令Δ=3,则:

该损失函数由两部分组成:y1与y,y1与y2。由于y1与y的差值大于阈值 Δ,则其损失函数为0;虽然y1比y2大,但差值小于阈值 Δ,则计算得到其损失函数为2。总的损失函数即为2。

这类损失函数的表达式一般称作合页损失函数「Hinge Loss Function」:

显然,只有当sj- syi+Δ

这种合页损失函数的优点是体现了SVM距离最大化的思想;而且,损失函数大于零时,是线性函数,便于梯度下降算法求导。

除了这种线性hinge loss SVM之外,还有squared hinge loss SVM,即采用平方的形式:

这种squared hinge loss SVM与linearhinge loss SVM相比较,特点是对违背间隔阈值要求的点加重惩罚,违背的越大,惩罚越大。某些实际应用中,squared hinge loss SVM的效果更好一些。具体使用哪个,可以根据实际问题,进行交叉验证再确定。

对于超参数阈值 Δ,一般设置 Δ = 1。因为,权重系数W是可伸缩的,直接影响着得分函数s的大小。所以说,Δ = 1 或 Δ = 10,实际上没有差别,对W的伸缩完全可以抵消掉 Δ 的数值影响。因此,通常把 Δ 设置为1即可。此时的损失函数为:

SVM中,为了防止模型过拟合,可以使用正则化「Regularization」方法。例如使用L2正则化:

引入正则化项之后的损失函数为:

其中,N是训练样本个数,λ 是正则化参数,可调。一般来说,λ 越大,对权重W的惩罚越大;λ 越小,对权重W的惩罚越小。λ 实际上是权衡损失函数第一项和第二项之间的关系:λ 越大,对W的惩罚更大,牺牲正负样本之间的间隔,可能造成欠拟合「underfit」;λ 越小,得到的正负样本间隔更大,但是W数值会变大,可能造成过拟合「overfit」。实际应用中,可通过交叉验证,选择合适的正则化参数λ。

常数项b是否需要正则化?其实一般b是否正则化对模型的影响很小。可以对b进行正则化,也可以选择不。实际应用中,通常只对权重系数W进行正则化。

4

线性SVM实战

首先,简单介绍一下我们将要用到的经典数据集:CIFAR-10。

CIFAR-10数据集由60000张3×32×32的 RGB 彩色图片构成,共10个分类。50000张训练,10000张测试(交叉验证)。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类,是非常经典和常用的数据集。

这个数据集网上可以下载,我直接给大家下好了,放在云盘里,需要的自行领取。

链接:

https://pan.baidu.com/s/1iZPwt72j-EpVUbLKgEpYMQ

密码:vy1e

下面的代码是随机选择每种类别下的5张图片并显示:

接下来,就是对SVM计算hinge loss,包含L2正则化,代码如下:

计算W梯度的代码如下:

根据SGD算法,每次迭代后更新W:

训练过程中,使用交叉验证的方法选择最佳的学习因子 learning_rate 和正则化参数 reg,代码如下:

训练结束后,选择最佳的学习因子 learning_rate 和正则化参数 reg,在测试图片集上进行验证,代码如下:

>> linear SVM on raw pixels final test set accuracy: 0.384000

最后,有个比较好玩的操作,我们可以将训练好的权重W可视化:

可以明显看出,由W重构的图片具有所属样本类别相似的地方,这正是线性SVM学习到的东西。

5

总结

本文讲述的线性SVM利用距离间隔最大的思想,利用hinge loss的优化策略,来构建一个机器学习模型,并将这个简单模型应用到CIFAR-10图片集中进行训练和测试。实际测试的准确率在40%左右。准确率虽然不是很高,但是此SVM是线性模型,没有引入核函数构建非线性模型,也没有使用AlexNet,VGG,GoogLeNet,ResNet等卷积网络。测试结果比随机猜测10%要好很多,是一个不错的可实操的有趣模型。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180612G00QAH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券