前面讲到了KNN算法,但是KNN的一些缺点,它没有被用到图像的识别。
线性分类函数f(x,W)应该是卷积神经网络的一个基础概念,它引入了权重w,以及偏移量b。如下图中,喵咪的图片中只取4个像素点作为输入数据x,W矩阵行数3代表可能的三种分类的各自权重值,最后通过线性公式f(x,W)可以计算出3种分类的得分数:Cat score, Dog score, Ship score.
![](https://img.haomeiwen.com/i2010339/37a907c41ff90da0.jpg)
通过这种方式,我们可以算出每个图片对应潜在分类的得分数(scores), 哪种分类的分数最高,那么就意味着该图片属于该分类的可能性更大,如下图:
![](https://img.haomeiwen.com/i2010339/fd8dc515ec8b66ba.jpg)
但是,我们很容易看到该计算的误差,例如,喵咪图片的各分类得分,2.9分属于cat分类,但很显然它不是分数最高的,dog最高。这意味着这张图片会被判为是一只狗,而不是喵。
那么这里我们就需要(To Do):
1、额外引入损失函数(Loss Function)来帮助我们知道,这个误差有多大?
2、我们如何优化参数来减少损失函数的值,提高我们的准确率?
损失函数目前教程里提到了两类:SVM和Softmax。
先讲讲第一类:
SVM
如图所示,被蓝色框出来的公式Li就是SVM的公式,还是以猫咪图片为例,Syi是我们目标的分类分数3.2,首先用car分类的分数5.1代入公式,得到最大值2.9, 随后,把frog分类的分数-1.7带入公式,得到最大值0,那么求和得到的损失值为2.9,说明有较大误差。
![](https://img.haomeiwen.com/i2010339/5f3f8dfdc7e0a8f6.jpg)
那么看看以Car图片为例的损失值又为多少呢?
同样的套SVM公式计算,这时Syj为4.9,首先,我们把cat的分数值1.3代入公式,算出最大值为0,接着把frog的分数值2.0代入公式,算出最大值依然为0,那么由此可见,Car图片的损失函数值为0,意味着该判断误差为0。
![](https://img.haomeiwen.com/i2010339/6a740a83df448204.jpg)
通过上面的分析,我们可以知道,当损失函数值最小可以是0,表示此时没有误差。
需要注意的是:损失函数值为0,意味着我们的linear classifier的模型越精确,例如下图中,我们可以很好的模拟蓝色数据点的曲线图,来达到更好的精确度,但实际上,这样做是没有必要的,因为如果后面进来的需要测试的数据如绿点所示,那么蓝色数据点的训练模型就不能适用了,绿色点更像需要一条直线来模拟。这是深度学习中常见的问题,那么如何解决呢?通常我们的做法是添加一个简单的调整函数
![](https://img.haomeiwen.com/i2010339/212e2b5a1c0151b6.jpg)
而关于这个调整函数R,有如下几种常用的函数,具体的区别,我没太仔细听这段。;)
![](https://img.haomeiwen.com/i2010339/aceb55d02188c38a.jpg)
除了SVM以外,还有一类非常受欢迎的损失函数:
Softmax
SVM它主要比较正确类和错误类之间的距离,要求正确类的分数比错位类的值大很多,来减少损失函数的值,而softmax则是通过计算正确类的概率来表示损失值。softmax classifier公式和计算过程如下图:
![](https://img.haomeiwen.com/i2010339/0bfa9f2a808c2169.jpg)
这里需要指出的是,根据log计算,softmax的最小值理论上是0(log1), 而实际上,计算机是无法得到这样的理论值,因为计算机对数字计算是有限的,无非达到log1,所以min实际值是接近0,而max是接近无限大的(可参考log单调递增函数的图形---红线)
![](https://img.haomeiwen.com/i2010339/bc6d76f791cd41ff.jpg)
刚刚我们说,SVM只需要要求正确类的score足够大于非正确类的score就可以了,我们不需要关心每个score的具体值,而通过softmax的公式我们可以看到,每个score都需要参与概率计算,所以每个score都很重要,要求每个score都越来越准确,越来好。
总结,目前我们的score function和loss fucntion的公式如下:
![](https://img.haomeiwen.com/i2010339/65b2b3feae5e1b9a.jpg)
那么如何优化我们的W来训练复杂的深度学习模型,减少损失函数的值呢?我们需要考虑梯度下降算法。
梯度下降算法(Gradient Descent)
求导的物理意义是可以知道某个点的瞬时速度方向是增加还是下降,即瞬时斜率是正还是负。如果如果为负,说明,损失函数的值在往下降。
![](https://img.haomeiwen.com/i2010339/a4035d9ec245b78c.jpg)
从示例中,我们可以看到,当我们增加了第一个W的值(+0.0001),损失函数的值已经降低到1.25322,计算出来dw为-2.5,这也印证了当求导为负,loss值就在降低,也就达到了我们优化的目的。
![](https://img.haomeiwen.com/i2010339/09f4af29f2211b6b.jpg)
接着我们按照同样的方法计算第二个W的dW
![](https://img.haomeiwen.com/i2010339/5bd20355ac5ab34b.jpg)
但是在实际优化W过程里,我们不会用计算每个W+h的方式,因为如果W很多,成千上万,这样挨着计算的方式就会变的非常愚蠢,效率是极其低下的。所以,我们需要一个事先计算好的analytic expression来一次性计算梯度(gradient dW),这个比挨着迭代每一个W速度更快。
![](https://img.haomeiwen.com/i2010339/d2bd0e482c2aa79f.jpg)
注意:这里课程并没有说明这里的analytic expression是具体怎么计算的。我估计是指通过数学求导公式后得到的另外一些公式,并且可以直接套用?总之,我们可以用第一种方式Numerical gradient,通过挨着计算每个W的dW来验证Analytic gradient的正确性。
![](https://img.haomeiwen.com/i2010339/7a60937d8c91ec89.jpg)
最后在python中,关于梯度计算,只需要三行……
![](https://img.haomeiwen.com/i2010339/76f832f814d4d686.jpg)
以上只是关于卷积神经网络损失函数和梯度算法的一些简单通俗的课后笔记,有些地方不是完全吃透,但假以时日……嗯嗯,哈哈。
顺便说下,梯度下降算法还是计算机科学里非常重要的一个算法,需要好好掌握。
受益匪浅,Mark下。
网友评论