根据上一篇文章,我们得到了:
- 一些数据集;
- 一个计算的得分的函数——f(W,x)=Wx;
- 一个计算损失的函数(softmax、svm、加正则项等)。
接下来我们就想要找到一个W使得损失函数达到最小,这就引出了今天的主题——优化(权值矩阵W)。
优化权值矩阵
想象你在山间走路,每一个位置对应不同的W,山的高度相当于损失函数的值,你的任务是走到山谷。
- 方法一:随机搜索
直接随机初始化多个W,计算一下损失函数,找到(验证集上)损失函数最小的。
但是这个方法非常的糟糕,它在CIFAR-10的数据集中准确率只有15%,虽然比盲猜好一点(10%),事实上也没好到哪去。
- 方法二:跟随梯度下降的方向
由于深度学习的函数太复杂,你不能直接找到一条路到达山谷,但是你可以找到当前位置的下山(梯度下降)方向→向那个方向走一步→找到新位置的下山方向→向那个方向走一步→……
有两种方法计算梯度的方向:
一、使用差分计算各个维度的偏导,但是这个方法非常的慢。
二、直接使用微积分的方法对损失函数求导,这个方法很精确,也很快,实际中经常使用。
但是也不是说前一个计算梯度的方法完全没用,我们可以使用它来验证我们的求导公式写对了没有,也就是作为一个测试单元。但是因为它非常慢,我们还是要减少参数的个数使得它在合适的时间内运行。
我们得到梯度后,就要向梯度的相反方向(梯度方向是损失函数上升的方向)走一小步。这一小步的大小是很重要的一个超参数,有时候也叫步长或学习率。
小批量下降
我们计算损失函数的时候是把所有数据样本的损失都加起来,然后求平均。那么我们在对损失函数求W的偏导时也还是要计算所有的数据样本(第二个式子的求和平均符号还在)。这在数据集小的时候没问题,但是如果数据集非常大,那么每次更新W都要计算那么多的数据会导致算法非常的慢。
所以使用了小批量梯度下降的方法:即每次只用一小部分的数据样本(32/64/128个数据样本等)来更新W。
图像特征
线性分类器是直接将原始像素拿去做分类,但是因为多模态(马的头的方向等)问题,所以效果可能并没有那么好。
在深度学习之前,人们也并不是直接进行图像识别的,他们先计算图片的各种特征代表(下图的中间部分),然后把各种特征组合起来,用这个组合起来的特征进行图像识别。这样的效果比直接对像素进行图像识别效果好。
计算各种特征的动机是什么呢?
原来不是线性分类的问题经过变换后可能成为线性分类问题,计算图像的特征就是在做各种变换。
各种特征:
一、颜色直方图:对每种颜色计算它的出现次数
二、方向梯度直方图(对猫脑的实验,大脑对边缘信息敏感):
- 计算水平和竖直的梯度图,通过两张梯度图计算合梯度(包括幅值和方向);
- 图像分为多个8*8的小块,每个小块按合梯度计算梯度直方图(9个方向);
- 进行Block(如2*2个小块)归一化;
- 按8*8小块对其梯度直方图可视化(如右图)。
三、词袋:
从自然语言处理得到的灵感,对于一段话,可以使用不同词在这段话中出现的次数,来表示这段话的特征。
但是我们并不能简单把两张图片像素完全相同类比为两个词语相同,所以我们要定义视觉单词词典。
第一步:在很多图像中随机采样各种小块,然后用K均值等方法进行聚类。下图的上半部分就获取了不同的颜色单词。
第二步:计算各个视觉单词在图像中出现的次数,然后进行识别。
图像特征方法和卷积网络比较,你会发现两者很相似:卷积神经网络并不是提前设定所需要的特征(如颜色直方图等),而是直接从数据中学习特征(各种卷积层的任务),然后把特征组合在一起(全连接层任务),最后做分类等任务。