1. 线性分类器
KNN处理图像识别虽然实现起来非常简单,但是有很大的弊端:
- 分类器必须记住全部的训练数据(因为要遍历找近邻啊!!),而在任何实际的图像训练集上,数据量很可能非常大,那么一次性载入内存,不管是速度还是对硬件的要求,都是一个极大的挑战。
分类的时候要遍历所有的训练图片,这是一个相当相当相当耗时的过程。
这个部分我们介绍一类新的分类器方法,而对其的改进和启发也能帮助我们自然而然地过渡到深度学习中的卷积神经网。有两个重要的概念:得分函数/score function:将原始数据映射到每个类的打分的函数
- 损失函数/loss function:用于量化模型预测结果和实际结果之间吻合度的函数
在我们得到损失函数之后,我们就将问题转化成为一个最优化的问题,目标是得到让我们的损失函数取值最小的一组参数。
2.损失函数
腻害的大神们定义出了好些损失函数,我们这里首先要介绍一种极其常用的,叫做多类别支持向量机损失(Multiclass SVM loss)。如果要用一句精简的话来描述它,就是它(SVM)希望正确的类别结果获得的得分比不正确的类别,至少要高上一个固定的大小\(\Delta\)。
我们先解释一下这句话,一会儿再举个例子说明一下。对于训练集中的第i张图片数据xi,我们的得分函数,在参数W下会计算出一个所有类得分结果\(f(x_{i},W)\),其中第j类得分我们记作\(f(x_i, W)_j\),该图片的实际类别为yi,则对于第i张样本图片,我们的损失函数是如下定义的:
假定我们现在有三个类,score值为s = [13, -7, 11],而实际的结果是第一类(yi=0)。假定\(\Delta\)为10。那么上文的\(L_i \)损失函数如下:
仔细看看上述的两项,左边项-10和0中的最大值为0,因此取值是零。其实这里的含义是,实际的类别得分13要比第二类得分-7高出20,超过了我们设定的正确类目和错误类目之间的最小margin\(\Delta=10\),因此第二类的结果我们认为是满意的,并不带来loss,所以值为0。而第三类得分11,仅比13小2,没有大于\(\Delta=10\),因此我们认为他是有损失loss的,而损失就是当前距离2距离设定的最小距离\(\Delta\)的差距8。
我们还需要提一下的是,关于损失函数中\(max(0,-)\)的这种形式,我们也把它叫做hinge loss/铰链型损失,有时候你会看到squared hinge loss SVM(也叫L2-SVM),它用到的是\(max(0,-)^2\),这个损失函数惩罚那些在设定\(\Delta\)距离之内的错误类别的惩罚度更高。两种损失函数标准在特定的场景下效果各有优劣,要判定用哪个,还是得借助于交叉验证/cross-validation。
对于损失函数的理解,可以参照下图:
正则化
然而上面的损失函数有一定的bug。假定我们有一个权值W可以进行正确的分类(也就是说对于所有的i,损失函数\(L_i=0\)),那么现在将W加倍,\(\lambda W\)同样也会得到0损失值。可是这种转化也将正确类\(y_i\)与错误类的score的相差值扩大了\(\lambda\)倍。
因此,想要消除这种误差,我们采用regularization penalty \(R(W)\).比较通用的是L2范式
上式将权值的平方累加,对权值进行正则化。因此多分类SVM损失函数包含数据损失函数和权值损失函数两部分,如下所示: