您的位置:首页 > 其它

【2017年cs231n学习笔记1】Lecture2 K近邻 距离度量 超参数 交叉验证 线性分类器

2017-11-05 23:36 330 查看
这是2017年,斯坦福大学,李飞飞教授及其博士生讲授的CS231n课程的第二节,主要内容是KNN算法、距离度量算法、超参数的选择方法、线性分类器的简单介绍。

所有图像来自课程ppt:http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture2.pdf

内容来自课程视频:https://www.youtube.com/watch?v=OoUX-nOEjG0&list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv

全文都是看英文字幕所得,如有翻译转诉不恰当之处请包涵。

引入

首先,我们要意识到,对于这样一个图像:



我们见到的是一只猫,而计算机见到的仅仅是一堆数据。

明显的,即使一些在我们人眼看来很轻微的变化,比如:光照、猫的姿态、猫的种类、遮挡物、背景,其在数据上的变化都是巨大的。

那么我们该如何通过对数据的分析来对图像进行分类呢?

一开始的想法可能是定义一个函数,里面有一些很高级的算法,输入图片,经过算法运算,获得标签

def classify_image(image):
#some magic algorithm here
return class_label


比如lecture1中提到的通过边缘检测和区域识别来分类



但是这样的方式有许多问题,比如

1. 很脆弱

2. 通用性差

所以我们采用以数据驱动(datas-diven)的方法:

1. 收集许多带有标签的图片数据

2. 使用机器学习来训练一个分类器,使其产生一个用于分类的模型(model)

3. 在新的图片上使用这一分类器

于是函数就变成了两个

def train(images, labels):
#machine learning
return model

def predict(model, images):
#using model to predict labels
return labels


虽然这节课程是关于卷积神经网络和深度学习的,但是这种Datas-Driven的途径是很广泛,是远远不仅限于以上两种方式的,我们首先从最简单的开始:

最邻近算法(Nearest Neighbor)

这个算法说起来其实很蠢很粗暴,在train函数中我们什么也不做,仅仅是记录所有输入的图像和标签;在predict函数中,当我们输入新图片,我们在train记录的图像中找寻和他最相似的图片,然后用最相似的图片的标签作为这张新图片的标签。

你可以在CIFAR10数据集上实验这种算法,然后获得一些结果(当然你会发现他经常不能提供正确的结果)。



距离度量

你可以发现,在这个算法中有一个问题:我们如何评估两张图片“相似”?如何比较两张图片谁和新图片更相似(或者说谁距离新图片更近)?

这里有一个例子,我们称其“L1距离”或者“绝对距离”(Manhattan distance)

它是将两张图片的矩阵相减,然后将获得矩阵的所有元素相加得到的值作为“距离”



很明显可以得出两个函数的时间复杂度:

Train:O(1)

Predict:O(N)

我们总期望Predict的时间复杂度尽可能的小,因为,这是很容易理解的,所以明显这个算法太慢了。

同时,这一算法十分依赖训练集,很容易出现如下图的情况:



无论是锯齿形的边界还是绿色中心的黄色小岛,都不是很好的结果。

于是有了改进的算法 K近邻算法(K-Nearest Neighbors)

算法介绍

Nearest Neighbor其实就是K=1的情况,随着k增高,边界会更平滑,中间点也会被消灭:



但是也有一个问题:如果新图像落在了空白的区域,无法处理。

于是我们想能否从距离的度量方式上对算法进行优化,例如:

L2距离或称欧氏距离(Euclidean distance)

欧氏距离

很明显选择L1还是L2或是其他的度量方式,L2选择2维还是n维,依赖于输入的数据类型以及数据矩阵的向量维数。

对于距离度量方式的选取,建议是:直接进行尝试

这里有一个直观的页面可以供我们实验与尝试页面

超参数

刚才我们所讲关于k的选择以及距离度量的选择,我们叫他“超参数”(Hyperparameters),他们无法通过机器学习直接从数据中获得的,而是在机器学习之前去人为选取的。

那么该如何选择呢?

直接在你的数据上尝试,选择结果最好的。

既然是在数据上尝试,那么对于“数据”的选取我们就需要考虑一下:

1. 选用同一份数据进行训练和测试,很明显如果选用同一份进行测试和训练,表现最好的永远是K=1的情况,但事实上,K=1往往都不是效果最好的

2. 将数据分为训练集和测试集,用训练集进行训练,然后选取在这测试集上表现最好的,其实,当你这样选择的时候,那么,既然是按照测试集选择超参数,那么分类效果永远的是最好的,因为你是按照测试集调试的参数。

3. 将数据分为训练集、验证集和测试集,用训练集进行训练,选取在验证集上表现最好的超参数,然后用测试集上运行所得的分类结果发表论文。一般来说,我们选用方法3这是一个非常重要的诚信和公平的理念。

4. 还有一种方式叫交叉验证,一般用于当数据集很小的时候,在深度学习中使用不多,这里就暂且不多说(课程视频34分08秒处有解说)。

需要注意的是,以上的划分都是随机的,否则会带来一定的错误。

实际上,我们很少会在图像的分类中使用KNN算法:

1. 上面提的花费时间太多

2. 距离度量方式仅适用于黑白图像,而且对于一些很明显的视觉变动的识别能力也不好,如图:



3. 还有一个KNN所面临的问题是“维数诅咒”(Curse of dimensionality)这里有一篇很不错的介绍维数诅咒的文章码迷,想避免维数诅咒,必须使训练样本密度足够大的充满空间,这就需要庞大的训练集,明显这是比较难以达到的。

线性分类器(Linear classification)

线性分类器同样是一个很简单的分类器,但是在接下来的课程中他会变得很重要,并且可以帮我们强化整个神经网络和卷积神经网络,因为一般来说,神经网络的基本层都是线性分类器,如果把神经网络比作一个乐高建筑,那么线性分类器就是最基本的方块。

在这里我们采取和KNN不同的方式,我么将图像信息输入一个函
ae90
数f,得到一个对应于标签的值(一般是矩阵);新图像同样输入f,获得一个值,选取结果矩阵中值最大的那个元素所对应的标签:



f有两个部分组成,X是图像数据(像素值)构成的,W是权值组成的,每个x对应一个w,代表x的重要程度,我们可以想象,X与W的结合方式有很多种,相乘、二次方、对数等等,线性分类器采用的就是x和w相乘的模式,其公式如下:



为了方便理解,给出了一个例子:



当然正如他的名字“线性”,他对于非线性的数据分布显得力不从心。

那么,如何得到W以及怎样评估W的好坏呢?这将是下节课的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息