老规矩,先贴出网盘链接,有需要的小伙伴可以自己去下载哦!链接: http://pan.baidu.com/s/1eRBa0nw 密码: skje。
1.Loss Function(损失函数)
上节课我们讲到视觉识别中有很多的挑战例如:相机位姿,光线,变形,遮挡,背景杂乱等问题。然后提出了数据驱动的KNN算法,接着介绍了线性分类器。上节课结束的时候留下了一个问题,就是我们怎么能够比较好的选择分类器的权重W呢?
我们这节课的任务就是定义一个损失函数,找出一个有效的方法来找到参数使得损失函数最小化。
为了叙述方便,这里贴出了课程的PPT,这里我们可以看到我们定义了一个多类的SVM(支持向量机)的损失,看到右边的公式
这里应该很好理解,如果是猫的分类器,那么以猫的权重作为基准,如果得分高于猫的得分减一,那么就要计算到它的损失中去。这里还有一个问题,为什么要减一,如果看过支持向量机都会知道,有一个margin的概念,那是个安全距离,其实人为的可以设定更大的值,但是从归一化的角度来说,距离为1应该是一个比较好的设定值。就像在相机设定的归一化平面一样,更加简便明了
最后计算这三类,取平均就是求得的损失函数啦
Q1:这里有一个问题,我们在计算损失函数是不包括自己那一类的,如果以猫为例,是不算猫的,那么如果把自己那一类算上,对损失有什么改变呢?答:损失会加1,因为根据公式同类减去同类还要加上一个边界值1,对于每一类的损失都会加1,那么最后取平均总的损失也会加1。
Q2:如果我们使用平均值来代替求和,会有什么差别?答:对于这种平均值和总和的问题其实只是相差尺度的问题,特别是后面对于损失函数的优化,并不会对中间的过程产生什么影响。
Q3:如果我们使用下式会有什么影响?
损失计算变成了平方项
答:这其实对应的问题就是超参数选择的问题。之前我们在定义距离的时候就曾说过马氏距离和欧式距离的问题,这里选择是否用平方作为损失也是具体问题具体选择,在通常情况下使用第一种(hinge loss)比较多,第二种又叫做square hinge loss。最后选择不同的超参数,得到的loss会不同。
Q4:那么最大/最小的损失可能是?答:最小当然是0啦,即得分最高是那一类就是本身啦,最大的话是无穷,你的权重得多差啊!
Q5:通常情况下,W初始化是非常小的数,那么损失是多少呢?答:应该是类别数减一,为什么?如果权重都特别小的话,那么根据损失的定义式可以看到两类s的差无论正负应该属于0附近,那么加上安全系数1肯定会接近1,那么最后的损失接近于类别数减去1。
但是针对这个损失函数,会有一个bug!如果计算出的损失是0和话,那么权重乘以一个比例系数,损失仍然为0,即权重不唯一确定。这样我们就要引入下一个概念:权重正则化。
这就是权重正则化的公式
我们这里使用的是L2正则化,这就是说我们在选定某一个权重时,也是有对应的损失的,如果一个权重过大,那么它对损失的贡献也就越大,在优化过程中就会减小这部分权重,从而减少损失。正则化其实是防止过拟合的一种方式。同时,正则话虽然有时候会使得训练效果变差,但是在测试集上的效果会有所增加。因为它属于权重分散,更好的利用了图片中的像素点,增加了分类器的泛化能力。
Softmax Classifier(Multinomial Logistic Regression,多项逻辑回归)
求导的数值表示方法是这样的
这里我就直接贴出公式啦!Softmax分类器其实就是一个指数形式的概率分布,因为有个归一化的分母啦,计算损失时取了负对数,如果我们希望求最大似然,求负对数相当于求最小化是正确类别的最小负对数似然。
这里直接按照公式贴出了指数计算后的概率,归一化后的概率,和通过求负对数求得的损失。
Q6:Softmax 分类器中,最小/最大的损失分别可能是多少?答:最小可能是0,即正确分类的概率为1,最大是无穷,即正确分类的概率接近0.
Q7:如果W在初始化接近0,那么损失是多少?答:类别数分之一的负对数,这就是类似的根据公式计算可得。exp(0)都是1,进行归一化也就是类别数的倒数,计算损失时在取个负倒数就是答案。
在卷积神经网络中花费的时间主要用在训练网络,所以最后分类器花费是时间基本上是可以忽略不计的,课程说使用SVM分类器和Softmax分类器花费的时间基本上也差不多,而且在总的时间中占的比例很小,所以就不对它的时间损耗做进一步叙述了。
这里是最后对SVM分类器和Softmax分类器进行了一个总结。
Q8:还有一个问题,加入我取一个数据点,给它增加一点数据的扰动,在两种情况下,损失有什么改变?答:SVM基本上是不会改变的。SVM在文中说过是设定了一个安全系数为1的边界,那么一点点的扰动是不会让正样本变成负样本,或者从负样本变成正样本的,所以SVM是具有一定的鲁棒性的,同时SVM是关注离边界比较近的样本,对于离边界比较远的样本关注较少。Softmax会对所有的样本点敏感,因为所有点参与计算,所以loss也会随之改变。
2.Optimization(优化)
第一种策略是:随机搜索,大概的正确率在15.5%,现在最好的大概在95%左右。。。
第二种策略是:根据斜率。在一维的情况下直接求导就可以了,在多维的情况下就是求偏导。
这里因为是高维,就会根据每一维求偏导
我们使用数值计算的方法针对每一维都进行求偏导,需要遍历整个W,并且对每一维都要进行计算。这种方法是近似的,计算非常的慢。所以为了解决这个问题,我们只要求微分就可以了,这就得感谢牛顿和莱布尼兹啦!简直是雷神之锤,神器好嘛!
所以总得说来,数值梯度是近似的,很慢,但是很容易写。解析梯度是非常精确的,很快,但是要进行check,检查,要用数值梯度对解析梯度进行检查,如果两者相差的很小,那么就证明你求的解析梯度是正确的。在确保解析梯度正确后,把数值梯度检查的代码要注释掉,不然你的程序会运行的很慢,很花费时间。
从效率的方面考虑,又产生了Mini-batch Gradient Descent,使用一部分训练集来计算梯度,这样可以在局部的训练集上进行优化,逐步达到最优。对于梯度下降也有一个超参数,学习率或者说叫步幅,步幅也大下降速度越快,但是容易产生震荡,学习率太小又会导致收敛速度太慢,如何调节学习率也是一门学问呢!
当然也有很多其它更新的算法:momentum, Adagard, RMSProp, Adam。。。还有好多啦
此外,还要简单介绍一下在传统方法中会使用的几个特征:Color(Hue) Histigram颜色直方图, HOG/SIFT feature,Bag of Words等等,对于图像识别问题中,特征的选取还是非常重要的。下节课我们会要接触到神经网络啦!期待中O(∩_∩)O