July深度学习之线性分类器与损失函数
一、图像识别困难之处
1. 视角不同:每个事物旋转或者侧视最后的构图都完全不同
2. 尺寸大小不统一:相同内容的图片也可大可小
3. 变形:很多东西处于特殊的情形下,会有特殊的摆放和形状
4. 光影等干扰/幻象
5. 背景干扰
6. 同类内的差异(比如椅子有靠椅/吧椅/餐椅/躺椅...)
二、K最近邻法
找到训练集中最近的N个,以它们中最多的类别为结果
所以K近邻算法需要衡量样本之间的距离,那么距离如何衡量呢?
一般有以下三种方法:
这里有一个小问题就是K值的选取问题,如果你对KNN有了解的话,会知道K值的选取很关键。
那么在做图像识别时如何选取K值呢?我们可以通过做—N折交叉验证来选择K值。即把训练集分成n折,然后用n-1折训练,用第n折验证。如此反复,可以得到如下的图形,既可以选择合适的K值。
实际上,用K近邻算法做图像识别有很多问题:
- 首先,识别的准确率不高
- 其次,要记录全部的数据
- 速度慢
所以我们可以试试线性分类器。
三、线性分类器与损失函数
1、线性分类器
图片数据总可以转换成矩阵向量,假如这个图片像素是32 * 32的,那么可以用[ 32 * 32* 3]的向量来表示这个图片数据,其中最后的3表示RGB值。
我们可以尝试构造这样一个函数f(W,x)。其中x表示输入的数据向量,W表示参数或权重,这个函数就表示得分函数。
f(W,x) = Wx + b,其中的b叫做bias偏置。
那么线性分类器怎么理解呢?我们可以有如下两个理解方式:
- 我们可以把此分类器理解为线性空间的划分,最简单的,在二维空间上,通过直线的划分。
- 第二个理解可以理解为模板匹配,W的每一行可以看做是其中一个类别的模板。每类得分,实际上是像素点和模板匹配度。模板匹配的方式是内积计算。
2、损失函数
损失函数也叫代价函数(cost function),是用来衡量吻合度的,在训练的过程中,我们的目的就是要尽量最小化损失函数。
有两大类损失函数:
- hinge loss/支持向量机损失
对于训练集中的第i张图片数据xi
在W下会有一个得分结果向量f(xi,W)
第j类的得分为我们记作f(xi,W)j
则在该样本上的损失我们由下列公式计算得到
直观理解是delta可以理解为正确类别得分和错误类别得分的安全距离,我们只需要保证此安全距离大于delta即可。
当然,为了防止过拟合,我们也可以加上正则化项。
互熵损失/cross-entropy
对于训练集中的第i张图片数据xi
在W下会有一个得分结果向量fyi
则损失函数记作:
这里给出几点说明,CNN中一般用的就是互熵损失,在softmax分类器中,实际上做的是把每个类别的得分映射成概率。其中的分母求和的目的是归一化,使得最后每个类别的概率之和等于1。
两个损失函数的比较:我们经常使用第二个损失函数,是因为其实第一个损伤函数如果找到了这样的W,使得正确类别的得分值和错误类别的得分值差距之间大于delta即可,这个条件比较容易满足。
而第二个损失函数我们可以不断优化。