损失函数

我们之前讲了我们对于一张图片,我们对其进行打分,代表它被分为某一类的可能性,那么我们需要建立一个损失函数来对这个分类器的好坏进行衡量

RNN损失函数 cnn 损失函数_SVM

我们定义SVM损失函数有如下形式。SVM只是一个二元分类器,我们将其进行推广到多元的情况,定义了SVM损失函数。我们将正确类的打分与其他类打分做差,如果差值大一某个阈值(在下图例子中阈值为1),则损失函数为0,;若小于阈值,我们将损失函数定义为二者之差加上阈值

RNN损失函数 cnn 损失函数_softmax_02

我们可以看出损失函数与二元SVM情况下的损失函数非常相似

RNN损失函数 cnn 损失函数_损失函数_03

由此我们就建立了一个衡量分类器的标准

RNN损失函数 cnn 损失函数_损失函数_04

另外我们要注意的是我们的模型应该尽可能拟合未见过的数据,而不是训练数据,因为如果模型过度拟合到训练集上会导致过拟合的问题,因此我们采用正则化的方法来减小过拟合的问题

RNN损失函数 cnn 损失函数_损失函数_05

正则化也有许多方法供我们根据不同情况进行选择

RNN损失函数 cnn 损失函数_SVM_06

除了应用SVM损失函数的分类器,我们还有softmax分类器,softmax函数代表了图片被分为正确类的可能性,可能性越高,代价函数越小

RNN损失函数 cnn 损失函数_RNN损失函数_07

如下是一幅图损失函数计算的过程

RNN损失函数 cnn 损失函数_RNN损失函数_08

我们可以看出SVM和softmax的对比,SVM损失函数在优化的时候只需要正确类的输出值比其他类的输出值大某个阈值就不再进行优化;而softmax损失函数是让正确类的输出值尽可能大,其他类的输出值尽可能小

RNN损失函数 cnn 损失函数_损失函数_09

 

优化

为了让损失函数减小,我们需要找到一个最优的W,这个过程就是优化过程,其中最常用的方法就是梯度下降,让W的值朝着负梯度的方向进行更新,不断迭代来寻找到损失函数的最小值

RNN损失函数 cnn 损失函数_损失函数_10

我们可以通过定义来求不同数值对应的梯度近似值,但是这种方法计算量非常大,十分不适合在多次迭代中使用

RNN损失函数 cnn 损失函数_RNN损失函数_11

我们在进行迭代的时候一般用解析的方法,即导数公式来计算函数的导数,而不采用数值的方法计算近似值,但是数值的方法可以用来验证解析方法的正确性

RNN损失函数 cnn 损失函数_SVM_12

我们在计算损失函数的时候是将所有训练数据都纳入计算,但是当数据量非常大时,这个值的计算将变得非常复杂,因此我们采用随机梯度下降的方法,将数据分批,每一批分别计算损失函数,再来用梯度下降对W进行更新。我们也把这种方法叫做mini-batch

RNN损失函数 cnn 损失函数_线性分类_13

除此以外,对于一般图片,我们很少会将所有像素值作为特征值,而是人为地选取一些特征来表征这个图片,这样能大大减小特征的维度

RNN损失函数 cnn 损失函数_线性分类_14

另外选取特征也会直接影响到分类器应用效果的好坏

RNN损失函数 cnn 损失函数_RNN损失函数_15

如下是一些常用的特征

RNN损失函数 cnn 损失函数_RNN损失函数_16

RNN损失函数 cnn 损失函数_softmax_17

线性分类器的方法一般采用人为提取特征的方法,这种方法在CNN出现之前十分普遍,但是随着CNN的出现,我们不需要人工地对特征进行提取了,而可以让CNN自动学习图片的特征,并且能取得更好的效果

RNN损失函数 cnn 损失函数_RNN损失函数_18