博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[cs231n之第三课]Loss function and optimization
阅读量:3558 次
发布时间:2019-05-20

本文共 3371 字,大约阅读时间需要 11 分钟。

课程地址:

http://www.bilibili.com/video/av13260183/index_1.html#page=3
课件地址:
http://cs231n.stanford.edu/slides/2017/

本课主要内容:

损失函数的含义,以及最优化权值向量的方法。

回顾上节课:

机器识别图像的巨大困难在于semantic gap(语义代沟)
这里写图片描述
使用KNN进行图像识别(关键点是像素距离的定义:L1距离,L2距离等),使用K折交叉验证来验证模型。
这里写图片描述
线性N分类器的含义:将图像的像素矩阵拉长成为一个列向量,将之乘以一个权值向量W,得到一个N维的向量,每一维的数值表示该类对于待预测图片的得分,取得分最高的那一类作为预测输出的类别。
这里写图片描述
为了衡量一个线性分类器分类效果的好坏,定义一个损失函数。损失函数得分越高,证明分类效果越差,所以我们要最小化损失函数,需要利用优化方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWvSH2Y5-1572932687040)(https://img-blog.csdn.net/20170815103516538?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
下面是一个多分类svm,它对每一个样本的损失函数定义为Li,S表示线性分类器输出的各类的得分,Sj表示将图像预测为j类的得分,Syi表示将图像正确分类的得分。
这里写图片描述
如下面的式子可知,如果正确分类的得分比某个错误分类的得分高,则损失为0。
这里写图片描述
下图是整个样本集的损失函数。
这里写图片描述
在这个损失函数里,有一个BUG,即我们如果找到一个W使得L=0,那么这个W,并不是唯一的,放大缩小它,都可以使得L=0。
这里写图片描述
在这个三分类的例子里。我们先求得car这一类的损失函数值,为0。现在我们将W放大2倍,最后得到的损失函数值还是为0。但是权值向量改变了,其它样本的损失函数会改变。
这里写图片描述
在这里,为了使得整体样本的损失函数最小,我们要给这个损失函数加上一个正则化项。这个正则化项的选择有L1,L2,Elastic net,max norm regularization, dropout,具体见下图。
这里写图片描述
对于下面的两个权值向量W1,W2,样本x,我们计算他们的内积,都等于1。但是明显可知用W2提取x的特征更好。一个直观的衡量标准就是计算它们的正则化值。为了使得损失函数更小,所以正则化项的值越小越好,这里W2的L2正则化项的值小于W1的。
这里写图片描述
Softmax Classifier,这个分类器是使用归一化了的概率预测值。公式如下可知,对于每一个预测类的得分Sj,我们使用指数对其处理,分母是所有类的得分的指数函数的总和,分子是预测为K类的得分Sk的指数函数。为什么用指数函数呢?因为后面我们要用log来处理损失函数。使用log前后并不会对最优解w产生影响,但是可以优化计算过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e8GuML5b-1572932687055)(https://img-blog.csdn.net/20170815104859080?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
Li为样本i的损失函数。
这里写图片描述
处理过程:对每个得分进行指数处理,然后归一化,得到每个样本预测为i类别的损失函数。
这里写图片描述
损失函数的最大值最小值是多少?最小值当然是0,即预测正确。最大值为无求大。为什么呢,当正确分类Pk的概率非常小,接近于0的时候,logPk的值接近无穷大,L_i=-logPk就是正无穷大了。
这里写图片描述
在初始化的时候,w的各维都是很小的值,此时s!=0,这个时候的损失函数会比较大,为什么呢?因为每个类别的得分不同,初始化W的时候,不会有明显的权重倾斜,那么每个类别的概率也会根据得分不同而不同,最后归一化之后得到的损失函数值还是比较大的,所以应该优化,求解使得损失函数值最小的权值W。
这里写图片描述
下图左边是一个权值矩阵W,乘以一个图像xi的像素矩阵拉成的像素向量,加上偏置b,经过svm分类器后,损失函数得到的值是1.58;经过Softmax分类器后,损失函数得到的值是0.452。这两个分类器对于样本的分类效果是不一样的。SVM对于小的数据波动有比较强的容忍能力,而Softmax会考虑到每一个样本值的波动。原因在于,SVM求解的是一个分离超平面,只要样本在超平面分类区域内,不管数据如何变化,它的分离超平面不会受影响。而Softmax,从它的定义看出,它求解的权值向量会受到每一个样本值的影响。
这里写图片描述
这里写图片描述
从http://vision.stanford.edu/teaching/cs231n-demos/linear-classify/这里,我们可以直观感受,当某些样本值改变的时候,这两个分类器的改变。
这里写图片描述
概括一下,分类图像的几大步骤。
1,得到图像数据集;
2,定义得分函数;
3,定义损失函数。
这里写图片描述
优化的一个想法:随机搜索(不好,不要用)
这里写图片描述
这就好像是随机猜一个使得损失函数变小的优化方向。它对于CIFAR-10的预测准确率才15%,比基准10%高不了多少。而SOTA的成绩是95%。
这里写图片描述
第二个想法是:随着梯度。
一维偏导函数如下定义:
这里写图片描述
如下所示,对于W的第一维进行演化,可知如果加上0.0001,它这一维的梯度是-2.5,证明这是使得损失函数减小的方向。
这里写图片描述
对第二维做同样的操作,此时该维的梯度为正,证明这是使得损失函数增加的方向,这不是我们想要的。
这里写图片描述
于是我们进行数值化的梯度演化。问题是,样本太大了,而且维度太多了,每一个都进行梯度演化,那样的代价也太大了。
这里写图片描述
这个损失是权值W的函数,我们想要的是对W求导,乘以L。
这里写图片描述
左边是当前的权值向量W,右边是它的梯度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqK7XWlL-1572932687074)(https://img-blog.csdn.net/20170815112411597?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTlhIWUQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
在实践中,我们使用analytic gradient
这里写图片描述
梯度下降:为了使得损失函数最小,我们要利用梯度下降求得最优解W
这里写图片描述
这里写图片描述
然而这个工作量非常大,通常使用的是多次的mini_batch 梯度下降。每次只对一部分样本的损失函数进行梯度下降演化,然后多次重复这个过程(当然使用不同的子样本集)。这样的效果还不错。
这里写图片描述
随着mini_batches的训练,整体的损失函数值在下降。
这里写图片描述
选择合适的学习率非常重要。如下图可知,当一上来就选择很大的学习率时,损失函数值会爆炸的。如果选择很小的学习率,那收敛速度将非常慢,如果选择过高的学习率,也有可能不能得到最优解。
这里写图片描述
之后还会讲解更多的梯度下降的优化方法(momentum,Adagrad,RMSprop,Adam,…)
这里的mini_batch的大小可以选择32、64、128个样本。这几个数值对于训练没有特别的影响,完全是看你的GPU比较适合多少。
这里写图片描述
下面本来是个动图,截图就这样了。表示的是各种梯度下降法的特性。
这里写图片描述
对于图像特征:
左边是一个原始的图像,我们用模型提取出了它的各个特征,再连成一个向量,放到分类器进行分类。
这里写图片描述
可以根据RGB图像的色调直方图来提取一个特征。
这里写图片描述
可以根据图像的边缘,已经边缘的位置来提取一个特征(SIFT).
这里写图片描述
词袋特征?(这里不是很明白)
这里写图片描述
特征提取的过程就是对图像进行一系列的卷积的过程。
这里写图片描述

在这里插入图片描述

你可能感兴趣的文章
Scala-HelloWorld
查看>>
Scala-IDEA中环境部署
查看>>
Scala-HelloWorld解析
查看>>
Scala-变量和数据类型
查看>>
Scala-流程控制
查看>>
Scala-面向对象后章
查看>>
iOS蓝牙原生封装,助力智能硬件开发
查看>>
iOS 代码的Taste(品位)
查看>>
iOS开发代码规范
查看>>
iOS组件化实践(基于CocoaPods)
查看>>
【iOS学习】RxSwift从零入手 - 介绍
查看>>
数据结构之栈
查看>>
Elastic Stack简介
查看>>
关于deepin系统安装design compiler的问题解答
查看>>
Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
查看>>
记录一下最近的学习经历
查看>>
hadoop3.0+spark2.0两台云服务器集群环境配置。
查看>>
网站实现qq登录(springboot后台)
查看>>
简单的用户头像修改功能(springboot后台)
查看>>
springboot+mybatis实现分页
查看>>