CS231n笔记二:损失函数和优化介绍

一、损失函数和优化

  1. 损失函数的定义
    把参数矩阵W当作输入,看一下预测结果与GT的差距,然后定量的评估W的好坏的函数,称为损失函数(loss function)。
  2. 优化的定义
    在W的可行域中找到最优W的取值的一种有效方法。
  3. 损失函数的公式化定义
    在一个数据集中,通常包括若干的x和y。其中x指的是输入数据data,在图像分类问题中即为图片每个像素点所构成的数据集;y指的是标签label或者目标target,即GT,在图像分类中即为正确类别所对应的那个整数。
    损失函数记作Li,是定义处理的一个函数,输入为yi和f(xi, W),输出是二者的差距,以定量描述训练样本目前预测出的W好不好。
    最终的损失函数L是N个样本的Li的平均值。最终的目的是找到是损失函数L最小的参数矩阵W。
    CS231n笔记二:损失函数和优化介绍_第1张图片

二、多分类SVM损失函数

对于第i个输入xi,其标签为yi,用j遍历所有标签整数(yi除外),即用j表里所有对xi来说是错误的标签分类。然后对于每个错误的标签,比较其分数与正确分类的分数,若错误分类分数sj比正确分类分数syi小1以上,则在Li上加0;否则加上sj - syi + 1(在这种情况中它是负的,1是安全距离,代表正确类别的分数比错误类别的分数高很多),即在0和sj - syi + 1中取大的那个加在Li上。最后算出所有Li的平均值,即为L。
CS231n笔记二:损失函数和优化介绍_第2张图片
以上的多分类SVM损失函数是一种合页损失函数Hinge Loss,因为它的图像长成这样(仅对于某一个错误分类j而言)。 CS231n笔记二:损失函数和优化介绍_第3张图片

其中横轴代表训练样本真实分类的分数syi,纵轴是损失Li。由图可以看出,随着syi的增加,Li先是线性减小,之后当syi到达一个阈值分数后,损失函数变成了0,说明syi已经和sj拉开了足够的安全距离,此时分类是正确的。
下面是一个以猫猫为例的计算过程,需要遍历汽车和青蛙的得分:
CS231n笔记二:损失函数和优化介绍_第4张图片
Q1:损失函数的最大值/最小值?
最大值为无穷,最小值为0
Q2:在刚开始训练时W会初始化成一个很小的值,因而所有s都约等于0,这时的L是多少?
类别的总数减一。这个结论可以用来debug,如果模型刚开始训练时的loss不是类别数减一,说明code可能存在问题。
Q3:如果在遍历时同时也遍历了正确类别,会对loss有什么影响?
loss会变大1。这样loss的最小值就是1而不是0了,不太优雅。

下面是一个使用numpy实现的多类别SVM损失函数的示例代码:
CS231n笔记二:损失函数和优化介绍_第5张图片

之后又有一个问题,使loss为0的W是唯一的吗???
答案是不唯一。事实上,单纯的把W翻倍后仍然能使loss为0。这就还需要在多个都能使loss为0的W中挑选一个W出来。
在介绍如何挑选出这个W之前,首先需要声明一个机器学习领域中的重要思想:我们训练模型的目的是为了让它能够在测试数据test data上工作的很好,而实际上不关注它在训练数据training data上到底表现的怎么样。因而在训练时,需要避免模型对于训练数据的过拟合!!!例如蓝色的点为训练数据,当模型过拟合时,它会拟合出一条诡异的蓝色曲线,这条曲线过于依赖于训练数据了,而不具备很好的泛化能力generalize,因而当将其用于绿色测试数据的预测时,结果可能会非常差。
CS231n笔记二:损失函数和优化介绍_第6张图片

因而这里强调的思想就是,我们需要选择一个loss=0且尽可能简单的模型参数W,因而简单模型往往具备更好的泛化能力。
所以需要对之前的loss函数做一个修改,我们在数据丢失项后再增加一个正则化惩罚项R(regularization loss),代表模型是否足够简单,同时引入超参数λ来平衡这两项。
常用的一些正则化函数如下:
CS231n笔记二:损失函数和优化介绍_第7张图片

三、多项logistic回归(softmax classifier)

  1. 定义
    之前在多项SVM中,预测结果中每个类别的得分score并没有一个实际的含义,我们只是单纯的希望正确类别的得分比其它类别高。而在多项logistic回归损失函数中,我们将用得分表示输入图片属于某个类别的概率大小。
    首先需要将得分进行指数化,这样所有得分都为正;随后对得分进行归一化,确保每个得分都在0到1之间,且所有得分之和为1。
    在这种方法下,损失函数定义为将输入图片识别为真实类别的概率的对数再取负值,即 - log P(Y=yi | X=xi)。这样当损失函数很小时,可以保证真实类别的得分很大且趋近于1。其中P(Y=yi | X=xi)就是由得分归一化出的输入xi被识别为yi类别的概率。
    完整的损失函数的公式为下图的最后一行:
    CS231n笔记二:损失函数和优化介绍_第8张图片
    例如猫猫例子的损失函数值的计算过程如下:
    CS231n笔记二:损失函数和优化介绍_第9张图片
    Q1:softmax损失函数的最大值/最小值?
    概率最大为1,对应对数值为0,为softmax的最小值;概率最小为0,对应对数值为无穷小,再取负,故softmax的最大值为无穷大。
    在概率取到1时是理想情况,说明预测是完全正确的。但这需要归一化之前的得分呈现两极分化的极端情况,即正确类别的得分无穷大,而错误类别的得分无穷小。但计算机在无穷大/小这件事上做的并不好,因而概率为1只能是理论情况,并不会在实际的计算中出现。同理,概率取到0也是理论情况,不会实际出现。
    Q2:在刚开始训练时W会初始化成一个很小的值,因而所有s都约等于0,这时的L是多少?
    假设所有s都一样大,那么每个类别的概率都是1/c,其中c为类别总数。那么Li就是-log(1/c),即log(c),这个结论也可以用来debug。

SVM和softmax二者对比:SVM实际上只有将模型训练到 其预测结果中正确类别的得分比错误类别高出一个阈值后就会停手;但softmax不会就此罢休,它会一直一直训练,不断的让正确类别的分数趋近于正无穷,而让错误类别的分数趋近于负无穷。但它们在执行时效果类似。

四、优化optimization

前面定义了怎么衡量一个W是否足够好,现在要解决如何找到一个很好的(即损失函数值很小)W。

  1. 方法一:随机搜索
  2. 方法二:follow the slope √
follow the step方法详解

1. 回忆一下梯度的定义
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
CS231n笔记二:损失函数和优化介绍_第10张图片
函数在一点沿梯度方向的变化率最大,最大值为该梯度的模。函数在该点沿其它方向的变化率等于其它方向的单位方向向量与梯度向量的点积
下面是一个计算W的梯度dW的实例(实际上是一个有限差分逼近),但这个方法太慢了!!!:
CS231n笔记二:损失函数和优化介绍_第11张图片
以上方法叫数值梯度Numerical Gradient,但实际上只要求出L对每个Wi分量的微分就行了,即解析梯度方法analytic gradient。这种方法更加精确且快速。同时可以用数值梯度来验证解析梯度公式的正确性。

2. 梯度下降算法 Gradient Descent
先初始化W为一个随机值,然后进入while true循环:
计算W对应的损失函数值和梯度,则梯度即为损失函数上升最快的方向。
然后将W向梯度的负方向更新,因为我们要找损失函数的最小值,即找到下降最快的方向。
最终网络会收敛。
其中步长step_size,又叫学习率,是一个很重要的超参数
CS231n笔记二:损失函数和优化介绍_第12张图片
3. 随机梯度下降算法 Stochastic Gradient Descent(SGD)
在之前的loss函数定义中,需要对每一个输入样本算Li,然后取所有Li的平均值作为L。在计算loss的梯度时,也需要遍历训练数据中的所有样本。这样的问题就是,当样本数N很大时,计算loss函数值和计算loss梯度值的过程是非常耗时的。这就引出了随机梯度下降算法。
随机梯度下降算法并非计算整个训练集数据的loss和梯度值,而是在每一次迭代中选取一小部分训练样本(称作minibatch),用这个minibatch来估算loss值和梯度值。代码如下,比之前多了一个随机选出minibatch的步骤:
CS231n笔记二:损失函数和优化介绍_第13张图片

五、图像特征提取

有的时候直接将图片像素值作为分类器的输入效果并不好,因为可能会存在多模态之类的问题(如上一节中两个头的马)。因而有时需要先对图像做一下特征提取,将提取出的特征作为分类器的输入。
下面是一种常用的特征提取方式:颜色直方图 Color Histogram,即统计图片中各种颜色出现的频率。也叫一种特征向量
CS231n笔记二:损失函数和优化介绍_第14张图片
另一种特征提取方式是:有向梯度直方图 Histogram of Oriented Gradients(HoG)。这种方法尝试测量了图像中边缘的局部方向。
它的具体实现方法是:
1、获取到图像,将图像按八个像素区分为八份;
2、在每个像素区中计算每个像素值的主要边缘方向,统计边缘方向以得到直方图。
CS231n笔记二:损失函数和优化介绍_第15张图片
还有一个特征表示的方法:词袋 Bag of Words
词袋的两阶段方法:
1、构建codebook:在图像中进行小的随机块的采样,然后用K均值方法将它们聚合(cluster)成簇,从而得到不同的簇中心,这些中心代表了图像中的visual words(是一些颜色和边缘方向);
2、对图像进行编码encode:统计这些visual words在某个输入图像中出现的频次。
CS231n笔记二:损失函数和优化介绍_第16张图片

六、总结

经过以上的所有学习,可以总结出图像分类的整个过程如下(上半部分):
CS231n笔记二:损失函数和优化介绍_第17张图片
首先,针对输入图像,通过一个特征提取器提取出图像的feature。这个特征提取器是固定的,不会被训练更新。在得到特征后,将这些特征作为分类器的输入,然后不断的通过计算loss和优化来更新分类器。
这整个思路其实和现在的CNN很相似(见下半部分),但不同的是,CNN不会人工的进行特征提取,输入的直接是raw image,即它的特征提取和神经网络是融合在一起并被同时训练更新的,是从数据中学习特征的。

补充:聚类cluster和K-means算法

参考博客:https://www.jianshu.com/p/d68a1e429860

你可能感兴趣的:(计算机视觉CS231n,机器学习,python,计算机视觉,深度学习)