https://blog.csdn.net/poulang5786/article/details/79737474
一. 损失函数
在上一讲的线性分类器中,我们使图像与一个权重w相乘,然后输出每个分类可能性的分数。某个类别的分数越高,图像就越有可能是这一类。但是如何确定w的好坏,我们需要一个评价的标准。
我们可以把w输入到一个函数中,这个函数会返回对w的评价结果(一个分数),这个函数的返回值反映了w的好坏。这个函数我们就叫做损失函数。
1.1 多分类SVM的损失函数
将猫、车、青蛙的图片输入到分类器中,每一个图片的输入都会产生一个对三种分类预测的分数。我们拿第一列举例,它的输入是一个猫的图片,cat的得分是3.2,car的得分是5.1,frog的得分-1.7,从得分看分类器更倾向于这个图片是一辆车。这个权重w肯定不好,那么它不好的程度如何评价呢?就是Li的值。公式中Sj是错误分类的得分,Syi是正确分类的得分。通过这个公式我们得出对猫的分类的损失是2.9。
再看第二个例子,对车的预测。我们发现car的得分都超过其他两种,我们可以先认为分类器分对了,凭直觉来说这时的损失函数应该是0,那么我们通过公式算一下,Li的值确实是0。
通过第三个例子,是对青蛙的分类,但是青蛙得分最低,是负数,此时的损失函数值很大,12.9。
最后我们算一下整个训练集上的损失(2.9+0+12.9)/3=5.3。由此我们就得出了评价w值好坏的标准。
1.2 softmax loss
之前我们得到的对应每个分类的预测都是数值,下面我们要说的softmax函数可以将对每个分类的预测值转换成概率。下面是softmax的公式。如果是一个三分类问题,对应的三个分类都会有一个预测值,那么正确分类的分数除以三个分类分数的和就是对应正确分类的概率。aj是对应正确的分类,ak是所有分类。因为我们取了指数形式,所以分子分母都是正数,Sj也是正数。并且对应三个分类的概率加和是1。
举例来说,[cat, car, frog]对应的分数是[3.2, 5.1, -1.7]。然后将这个分数输入到softmax函数,对cat来说,S1 = e^3.2/(e^3.2+e^5.1+e^-1.7)。
那么根据softmax公式我们可以得到,softmax loss是对softmax取-log。我们可以这么想,log是单调递增函数,取负号后是单调递减,所以当我们的预测结果越正确,softmax的值越高,相应的softmax loss的值就越小,即损失函数就越小。
下面举个例子:
求softmax loss分为三个步骤:1. 对得分取指数;2. 归一化,也就是用softmax公式进行处理;3. 取-log得到损失函数值。
在这个例子中输入的是猫的图片,但是cat的预测分数是3.2,car的预测分数5.1,frog的预测分数-1.7我们认为这是个糟糕的预测,通过求损失函数,得到损失函数是0.89,也可以看出这个预测很糟糕。
1.3 SVM损失函数和softmax loss的对比
用一波图来说明:
前面都是一样的,w*x+b得到对每个分类的预测。
svm更强调正确分类的分数超过错误分类分数一个安全边际,而softmax loss更强调比值,正确分类的分数推向正无穷,将错误分类的分数推向负无穷。
也就是说如果提高正确分类的分数,对svm的结果来说不会有影响,因为svm只是判断正确分类的分数是否超过错误分类的分数;而对softmax loss来说,它将不断将这个比值扩大。
二.正则化
正则化主要目的就是减轻模型的复杂程度,不去试图拟合所有数据,防止过拟合。当选择的w使得损失函数为0,拟合了所有训练集,但这可能是个糟糕的结果。
如图所示,蓝色的训练曲线经过所有训练数据,但是当有新的数据加入时,我们发现之前表现很好的模型可能现在是错误的;绿色的线是我们更想要的结果。我们训练出来的模型是为了对未知的数据有良好的预测性,而不是模型仅仅可以完美的拟合训练数据。
正则化可以理解为模型复杂度的量化,我们加入正则化为了训练处一个更简单的模型,即使它可能不会完美拟合所有数据,但是会有良好的预测性。下面是几种正则化的方法:
三.优化
让我们先想一个问题,一个人在山顶,如何最快到达谷底。其中一个想法是随机走,佛系旅者,走到哪算哪;另一个做法是凭当前脚下的感觉,总会察觉某一个方向是向下的方向,然后不断重复这个步骤。第二种每次都是朝着下降的方向走。
对我们来说,如何让损失函数尽快达到最小,这是我们的目的。下面引入梯度的概念。
3.1 梯度
梯度是多元函数偏导数组成的向量。梯度代表函数增长最快的方向,负梯度代表函数下降最快方向。
某一点任意方向上的斜率,等于该点的梯度与单位向量的点积。
那么我们如何来求梯度,有两个方法:1.有限差分法 2. 微积分的方法。有限差分计算量大,且精度差,我们一般用微积分的方法。
引入两个概念,数值梯度和解析梯度。数值地图用有限差分法求得,解析梯度通过微积分求。微积分的方法很快而且精确度高,而数值梯度作为调试手段,测试解析梯度是否正确。
梯度下降的代码实现:
1.首先初始化w为随机值 2.计算损失和梯度 3.梯度相反的方向更新权重值 4.向函数减小方向走一步
重复这个过程最后网络会收敛。
Note:注意步长或学习率step_size,梯度是函数增长最大的方向,反向梯度是函数减小最快的方向。
四.图像特征
有些情况下我们不会直接把原始图像输入到网络中,而是会先对图像进行预处理,提取出特征,只是把特征输入到网络中训练。下面介绍几种有用的图像特征。
4.1颜色直方图
将图像像素点对应颜色映射到直方图中,统计每种颜色出现的次数,对青蛙来说绿色出现次数多,而红、紫出现较少。(不知道为什么青蛙图片贴上来以后颜色变了。。。。)
4.2 方向梯度图
4.3 词袋