目录
前言:
在上一篇文章中,主要介绍了一个线性分类器(图1)。再回顾一下线性分类器的作用,首先从字面意思理解,通过线性二字,可以想到一次函数,我们可以撒上一些点,通过该函数能够将这些点划分到某条线的两侧。再看分类器,那么被线性分类器划分到不同的侧即表示着不同的类。
回到上文中小猫图片(后文用image代替)的例子(图2),假如image为2X2,拉长后变为4X1记为x。我们想要进行区别的类为3,那么此时需要一个权重W,该权重为3X4,3则表示需要区分的类别数,4则等于image拉长后的行数。接着我们再将W和X进行矩阵相乘,便得到一个3X1的矩阵,这每一行的值便是所需要区分的类别的得分。那么上图中X后面的加上的是一个什么东西?它有一个名字叫做偏置。偏置的作用是为了让分类器变得更加灵活,例如一个y=wx函数无论w如何变化,结果都受限于原点(0,0),但是当我们加上一个b时,分类器便能够上下移动,更能加速网络的拟合。(图3_1、图3_2)
损失函数
我们有个一个线性分类器,可是我们怎么能知道线性分类器是否将各个类区分的很好呢,此时就引入了损失函数。先从字面意思理解一下,损失二字表示相较于完整所不能达到的程度。
损失函数主要有SVM、softmax等,首先介绍一下SVM。SVM损失函数是为了调整W使其能够让正确分类的得分高于其他的分类的得分,看例子比较好理解。(图4)
通过线性分类器分别得到了cat、car、frog的得分,一张图片对应一列,我们看第二列。该列中分类器正确区分出了car,car的得分高于其他两类,损失为0。我们带入公式验证,使用cat的得分减去car的得分再使用max(0, 1.3-4.9)便会得到0,因此损失为零。对frog进行相同的操作仍然得到了0。如此循环对cat、frog列进行损失函数计算,分别得到了2.9、12.9的损失。上图中有一个红箭头指向了1,这是设置的一个超参数。
正则化
我们在训练的时候,想要通过训练集训练出良好的分类器,从而在测试集上表现良好。但是会出现这样的情况,分类器为了适应训练集让自己过度适应训练集,当我们在测试集上验证的时候,其效果会不理想,因此我们需要加入一个惩罚项降低分类器对于训练集的拟合程度。这个过程就叫正则化。(图5)
上图中蓝色的线则表示我们在使用训练集进行训练的时候,分类器为了更好的拟合训练集,呈现出了弯弯曲曲的线条,可见它确实在训练集上表现很好,可当我们加入一些测试集,也就是上图中的绿框的时候,分类器就不管用了。正则化就是为了解决这样的问题,直白的说正则化就是将曲线变直。
优化
当我们通过损失函数计算得到分类器某一次分类的损失的时候,如何让损失变小呢?此时便引入了优化这个概念。优化是针对于权重W的,也就是通过改变W使得损失降低。
策略一:使用随机生成的方式,然后计算损失,找到损失最小的W集。
策略二:尝试轻微地改变W的值,计算损失,不断地迭代优化,找到一个最优的W集。形象化就是我们蒙着眼睛下山,先迈出一条腿,然后计算损失,如果此时损失较低那么便迈出这一步,也就是更新W。
策略三:跟随梯度,我们试图在权重空间找到一个损失下降最好的方向,但是我们不必搜索所有方向,因为能够计算出这个下降的方向,这个方向与损失函数的梯度有关。关于计算损失函数的梯度,有两种方法,第一种是有限差分计算以数值方式计算梯度,该种方法存在效率问题,举例一个损失函数由n个参数,那么需要对n个参数进行评估后才能知道是否能进行此次更新。而第二种方法为使用微积分计算梯度,该方法允许我们直接推导出一个公式,而该公式的计算速度非常快。最后由于计算出的梯度为增加的方向,所以我们需要在该方向相反的方向进行梯度下降。
在进行梯度下降的时候有一个参数特别重要,这个参数决定下降的程度,我们称为学习率。如果学习率过大,虽然我们是在正确的方向进行W更新,但是可能会因此导致损失不降反升,因此选择合适的学习率也是很重要的。(图6)
上图中呈现出一个碗状的图像,表示中部函数的损失小于周围,通过梯度下降便能够逐步到达最低点,找到损失最小的W。