机器学习(2)-SVM分类算法

来源:互联网 发布:蔡健雅 进化论 知乎 编辑:程序博客网 时间:2024/05/17 23:36
  1. SVM算法
    SVM是一种很常见的分类算法,了解SVM算法就不从基本概念 去理解了,各种网页上的分享都是千篇一律。这里直接讲解怎么根据一幅图片的输入,来计算SVM的损失函数,权重矩阵的跟新,梯度下降法计算进行最优化。

  2. 基本概念
    前面介绍的KNN算法存在下面2点主要问题:
    1.分类器必须记住所有训练数据并将其存储起来,以便于未来测试数据用于比较。这在存储空间上是低效的,数据集的大小很容易就以GB计。
    2.对一个测试图像进行分类需要和所有训练图像作比较,算法计算资源耗费高。
    我觉得第二点会在数据量大的时候更加糟糕,每次循环耗时间长,计算矩阵操作,也不会很高效。

所以,用到了更为高效的分类方法-SVM和Softmax,这两个算法也可以很好的运用到神经网络中去。

下面就来一一理解SVM分类算法的一些概念:
1.评分机制(评分函数)
也就是输入一张图片,通过一个函数(就是评分函数)处理后,产生一个分类向量,输入图片和输出向量可以用“原始图像数据到类别分值的映射”来形容。
评分函数:
f(Xi,W,b) = W×Xi+b(W就是权重矩阵,Xi就是输入评分函数的第i张图片,b是一个偏差(bias),W和b的具体含义现在不用管);
通过这个函数,输入图片矩阵[1*D] (D个像素值),W矩阵[K*D],b矩阵[k*1],这里面的k就表示样本集有k个分类。一张图片经过上面这个函数计算后,得到一个分类评分向量,向量中哪个元素评分最大,输入图片就属于评分最大的向量中的元素对应的分类。
但是这样做就会有分类错误的情况,如下图
这里写图片描述
这只,猫就被分类成了狗,这就分类错误,说明权重矩阵W不是最优的。当然肯定有分类正确的情况。现在就要寻找一个最优的W矩阵,来让分类错误的情况尽量少,这就要引入损失函数(有地方也叫代价函数)的概念 。
在实际使用f(Xi,W,b) = W*Xi+b这个公式的时候,会 讲权重矩阵和偏差矩阵合并:
因为分开处理这两个参数(权重参数W和偏差参数b)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时x_i向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成下面这样
f(Xi,W) = W*Xi
这里写图片描述
上面图片形象化了这一个过程。

2.损失函数
损失函数的引入才开始真正的SVM算法的使用;
首先看SVM算法损失函数:
Li = ∑ max(0,Sj - Sy(i) +delta) (j !=y(i))
这里S =F =W *Xi,也就是输出的分类评分向量。因为是训练集合,所以提前知道Xi图片对应的正确分类,是第y(i)类。这个求和公式可以这样理解:对于第i张图片,向量化为Xi,通过评分函数后,得到一个有k个元素的评分向量S,而提前知道Xi对应的应该是评分向量中第y(i)个 评分,也就是说,如果这个得到的评分向量是对的,那么Sy(i)应该得到最高的评分,计算Li = ∑ max(0,Sj - Sy(i) +delta) =0,当S向量中有一个评分或者几个评分大于Sy(i),说明这个分类向量是错的,就产生了损失值,就是Li = ∑ max(0,Sj - Sy(i) +delta) !=0,因为存在Sj>Sy(i).
有了每张图片的损失函数,有N张图片的训练集,所有训练集的损失函数相加,就是整体的损失函数。通过梯度下降或者其他的最优化的方法,寻找到一个最优W矩阵,来让∑Li i=(1 2 3 …..N)最小,就是对图片分类尽可能多的正确(最好是全部正确)。这就是SVM做的事情。

我认为损失函数是SVM的核心。

*注意,这里面有个delta参数,下面引出一句话来理解这个delta:
这里写图片描述
多类SVM“想要”正确类别的分类分数比其他不正确分类类别的分数要高,而且至少高出delta的边界值。如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。

3.正则化的概念
在机器学习中,常常会出现过拟合现象,为了解决过拟合问题,就要引入“正则化惩罚”R(W),最常用的正则化惩罚是L2范式,L2范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重.
下面是正则项表达式:
这里写图片描述
R(W)是讲权重矩阵中所有元素平方后求和。

下面是完整的正则化后的SVM的损失函数表达式:损失数据项+正则项
这里写图片描述

展开式为(编程实现时候可以参考)
这里写图片描述

N为训练集图片的总张数。lamda这个超参数一般自己赋值,根据情况调试。

现在有了损失函数,就要进行最优化操作来求得最佳的W(权重矩阵)

4.最优化概念
记住这句话:最优化是寻找能使得损失函数值最小化的参数W的过程。
在CS231n这门课程中,有很多最优化的方法,比如随机搜索,随机局部搜索,跟随梯度。
这里我就不说求解梯度的过程了,数学不太好,Python中有函数可以直接进行梯度下降法最优化的求解:
这里写图片描述
其中,1(·)是示性函数,其取值规则为:1(表达式为真) =1;1(表达式为假) =0。而且这里delata=1.

下面结合python 代码实现下这个多分类SVM在图片分类中的应用:

def svm_loss_vectorized(W, X, y, reg):  """  Structured SVM loss function, vectorized implementation.  Inputs and outputs are the same as svm_loss_naive.  """  loss = 0.0  dW = np.zeros(W.shape) # initialize the gradient as zero  #############################################################################  # TODO:                                                                     #  # Implement a vectorized version of the structured SVM loss, storing the    #  # result in loss.                                                           #  #############################################################################  score = X.dot(W) #[N*C]  num_train = X.shape[0]  num_classes = W.shape[1]  scores_correct = score[0:num_train-1,y]  scores_correct = np.reshape(scores_correct,(num_train,1))  margins = score -scores_correct +1  margins[margins <=0] =0  loss = np.sum(margins) / num_train  loss += 0.5 * reg * np.sum(W * W)  margins[ margins >0 ] =1  row_sum = np.sum(margins,axis =1) #矩阵的每一行相加  margins[np.arange(num_train),y] = -row_sum  dW += np.dot(X.T,margins)/num_train + reg*W  return loss, dW

上面向量化操作计算出了损失值和梯度。

下面应用梯度下降最优化,具体优化代码会在后面的文章中解释。