CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化

CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
线性分类属于参数分类的一种,所有的训练数据中的经验知识都体现在参数矩阵W中,而W通过训练过程得到,我们拿到一张照片拉伸成一个长的向量,这里的图片假设叫做X,应该是拉伸成一个三维长向量(32,32,3),一共3个,其中高度和宽度都是32像素。3则代表颜色通道红绿蓝,还存在一个参数矩阵W,把这个代表图片像素的列向量,当作输入,然后转化成10个数字评分。线性分类可以理解为每个种类的学习模板,左下角的图对图里的每个像素,以及10个分类里的每一项,矩阵W里都有一些对应的项。告诉我们那个像素对那个分类有多少影响。也就是说矩阵W里的每一行,都对应一个分类模板。如果我们解开这些行的值(成图片的大小),那么每一行又分别对应一些权重。每个图像像素值和对应那个类别的一些权重,将这行分解回图像的大小。我们就可以可视化学到的每个类的模板。学习像素在高维空间的一个线性决策边界,其中高维空间就对应了图片能取到的像素密度值。
一个只有三张图片的训练集,然后用某个W预测这些图片的所有共10个类别的得分。需要一个度量任意某个W的好坏的方法。可以用一个函数把W当作输入,然后看一下得分,定量地估计W的好坏,这个函数被称为损失函数。
损失函数
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
我们要找到一种有效的方式,来从W的可行域里找到W取什么值,是最不坏的情况,这个过程将会是一个优化过程。三个样本对应三个类的例子。
损失函数,有一些训练数据集x和y,通常我们说有N个样本,其中x是算法的输入,在图片分类问题里,x其实是图片每个像素点所构成的数据集,y是你希望算法预测出来的东西,我们称之为标签或者目标。我们把损失函数记做L_i,我们有了这个关于x的预测函数后,这个函数就是通过样本x和权重矩阵W,给出y的预测。
损失函数记L_i的定义为:通过函数f给出预测的分数,和真实的目标或者说标签y,可以定量地描述训练样本预测地好不好。最终地损失函数L是在整个数据集中,N个样本地损失函数总和的平均。
这是个通用的公式,有了x和y你想要用某个损失函数定量地描述出参数W是否令人满意,然后在所有的W中找到在训练集上损失函数极小化的W。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
多分类SVM损失函数,单个例子的损失函数L_i,除了真实的分类Y_i以外,对所有的分类Y都做加和,也就是说我们在所有错误的分类上做和,比较正确分类的分数和错误分类的分数,如果正确分类的分数比错误分类的分数高出某个安全的边距,我们把这个边际设为1。如果真实分类的分数很高,比其他任何错误分类的分数都要高很多,那么损失为0。接下来把图片每个错误分类的损失加起来,就得到了数据集中这个样本的最终损失,然后取平均。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
缩写成max(0,S_j-S_i)再加上一点东西,这种某个值和0取max的损失函数,可以说成是一个合页损失函数。x轴表示S_Yi,是训练样本真实分类的分数,y轴是损失,可以看到随着真实分类的分数的提升,损失会线性下降,一直到分数超过一个阈值,损失函数就会是0,因为我们已经为这个样本成功地分队了类。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
计算多分类SVM损失函数,我们要对所有不正确地分类全都循环一遍。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
最终我们对于整个训练数据集的损失函数是这些不同的样例的损失函数的平均值,所以得到了5.3。反应了我们的分类器在数据集上有多不好。
如果是每个分数取平均值不会有什么影响。分类的数量需要提前确定,当我们选择数据集的时候,因为这只是将整个损失函数缩小了一个倍数,所以这并没有什么影响,任何缩放操作都不会有什么影响,我们不在意损失函数的分数值。如果变为平方值,是不同的损失函数。用一种非线性的方法,改变了在好和坏之间的均衡。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
向量化代码片段,numpy库中最终实现只需要简单的几行代码,这种不错的矢量化窍门,可以只迭代一个类而不是所有的,你只是把你想要跳过的那个清零,然后计算总和,所以这是个很好的技巧。
如果你找到一个W,损失值为0,你根本不会有损失,但是具备损失值为零的W不是唯一的,两倍的W也将实现零损失。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
假设我们有这样的数据集,并且我们将会为训练数据拟合一些曲线,那么如果我们告诉分类器做的唯一的事情,是尝试和适合的训练数据,它可能进入并具有非常曲折的曲线,尝试完美分类所有的训练数据点。我们希望分类器可能是预测的,这条绿色的直线,而不是完全适合所有的训练数据。我们通常解决的方式是正则化的概念,我们要为损失函数添加一个附加的项,除了高数分类器,需要拟合训练集之外,我们通常会添加一个项到损失函数里,这个项称为正则项。鼓励模型以某种方式选择更简单的W,所谓的简单取决于任务的规模和模型的种类。体现了奥卡姆剃刀的理念,要让一个理论的应用更广泛,如果你有很多可以解释你观察结果的假设,一般来讲,应该选择最简约的,因为这样可以在未来,将其用于解释新的观察结果。假设正则化惩罚项,记为R。标准损失函数就有两个项,数据丢失项和正则项。这里有一些超参数λ用来平衡这两项。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
L2正则化,或权值衰减。L2正则化就是欧氏范数的权重向量W,或有时平方规范,或有时二次范数,因为这会让你的推导变成现实。L2正则化是对这个权重向量的欧式范式进行惩罚,这个权重向量。
L1正则化具有一些很好的性质,像在这个矩阵W中鼓励稀疏。有时弹性网络正则化是L1和L2的组合。所谓的惩罚,主要目的是为了减轻模型的复杂度,而不是去试图拟合数据。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
多项逻辑斯蒂回归,或者叫softmax loss,我们将赋予得分一些额外的含义,并且我们会用这些分数,针对我们的类别去计算概率分布,所以当我们谈论分数时,我们将用这个所谓softmax损失函数,我们将其指数化以便结果都是正数,接着我们利用这些指数的和来归一化它们,我们将分数经过softmax函数处理后,我们得到了概率分布,对于所有类别我们都有了相应概率,每个概率都介于0和1之间,所有类别的概率和等于1。这正是我们所期待的解释,这是结算出来的概率分布,它是从分数推导出来的,我们拿它同我们的目标值,或者说真实的概率分布进行比较,现在我们需要做的是去促使我们计算得到的概率分布,就是那个通过softmax计算的结果,去匹配上述的目标概率分布,即正确的类别应该具有几乎所有的概率。
我们想要的是真实类别的概率应该比较高并接近于1,然后我们的损失函数就是,真实类别概率的对数再取负数。
log函数为单调函数,找log函数最大值相对简单,只要使得概率最大就可以了,当我们针对正确类别最大化logP,意味着我们想要它变高,但是损失函数是用来度量坏的程度,不是好的程度,所以加负号更加符合我们的假设。针对正确类别SVM的损失函数将会变成-logP。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
我们用softmax对分数进行转化处理,并得到正确类别,的损失函数是-logP。通过线性分类器,我们得到三个分数,这些分数同SVM损失函数中的分数是一致的,将它们所有进行指数化处理,因此它们都是正数,然后我们对他们进行归一化,以保证它们的和是1,这是我们的损失函数就是-logP这就是softmax损失函数,也叫做多项式逻各斯回归。softmax损失函数最小值是0,最大值是无穷大。针对正确的类别,我们希望概率是1,不正确类别的概率是0。log函数里的自变量是1,是真实类别所对应的概率,1对数为0,所以我们的损失函数是0。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
在线性分类方面,这个设置看起来是一样的,我们将W和输入向量相乘,得到分值向量。两个损失函数的区别是,我们如何来解释这些分值,进而量化度量到底有多坏,所以对于SVM深入研究并观察正确的分类分值,和不正确分类的分值边际,而对于这个softmax或交叉熵损失,我们计算一个概率分布,然后查看正确分类的负对数概率,
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
我们有一些xs和ys的数据集,我们使用我们的线性分类器来获得一些分数函数,根据我们的输入x计算我们的分数S,然后我们将使用损失函数,softmax或SVM或其他损失函数,来定量地计算我们的预测有多糟糕。我们经常会增加这个损失函数,术语称为正则化,试图在训练数据之间进行权衡,并倾向于更简单的模型。我们如何才能真正发现这个W使损失最小化,这就引出了优化的主题。
优化
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
斜率,在一维的情况下,斜率就是函数的导数。如果我们有一个一维函数f,将X作为标量,输出为曲线的高度,就能计算出某一个点的斜率。我们向任意方向前进一小步h,然后比较前后函数值差别,然后将步长趋于0的时候,就能得到这点函数的斜率。x可能是整个向量,多元(多参数)概念,在多元情况下生成的导数,就叫做梯度。所以梯度就是偏导数组成的向量,梯度有和x一样的形状, 梯度称为偏导数的向量,它指向函数增加最快的方向。相应地,负梯度方向指向了函数下降最快地方向。如果想知道该点任意方向的斜率,就等于这一点上的梯度和该点单位方向向量的点积。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
有限差分法,我们设想当前的W是这个向量参数,给出了当前损失可能是1.25,目标是计算梯度dW,它是和W相同维数的向量,梯度中每个元素都会告诉我们,在相关方向上梅移动一小步,损失变化多少。如果在第一维做微小的改变,损失值从1.2534降低到1.25322,然后使用这个有限差分在梯度的第一维,实现有限差分逼近。
然后恢复为原值,在第二维重复这样的过程,在第二维方向上增加一小步,计算损失使用有限差分逼近,计算出梯度的近似值。如此重复。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
速度太慢了,梯度表达式比起用有限差分法对它进行计算分析,会很有效率。与迭代计算所有W维度不同,计算出梯度的表达式,从W值开始计算dW或每步的梯度。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
实际应用中可能不会使用数值梯度,当计算梯度的时候总是使用解析梯度,数值梯度是很有用的调试工具。通常的调试策略是,使用数值梯度作为单元测试,来确保解析梯度是正确的。
梯度下降算法,首先初始化W为随机值,当为真时计算损失和梯度,然后向梯度相反的方向,更新权重值。梯度是指向函数最大增加方向,所以梯度减小则指向函数最大减小的方向,所以我们向梯度减小的方向前进一小步,然后一直重复,最后网络将会收敛。
步长是一个超参数,告诉我们每次计算梯度时,在那个方向前进多少距离。步长也叫学习率,确定步长是首先要做的事情,其他比如模型大小、需要多少正则化晚点再做。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
碗型图表示误差函数,中间的红色区域表示误差值较低,是我们的目标,蓝色紫色表示较高的误差值,是我们要避免的。以空间内的随机点来开始W,然后计算梯度的反方向,重复最终会达到最小值。利用每一步的梯度决定下一步的方向,有不同的更新策略决定究竟如何使用梯度信息。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
损失误差计算我们的分类器在训练样本中的每一步表现有多糟糕,然后我们设定数据集的总误差是整个训练集误差的平均值,实际中N可能非常大,计算loss值成本非常高。我们通常使用随机梯度下降,它并非计算整个训练集的误差和梯度值,而是在每一次迭代中选取一小部分训练样本称为minibatch(小批量)。按照惯例这里都取2的n次幂,利用minibatch来估算误差总和以及实际梯度。是对真实数值期望的一种蒙特卡洛估计。
代码为:为真时,随机取一些minibatch数据,评估minibatch的误差值和梯度,然后更新各个参数,基于这一误差值的估计,以及梯度的估计。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
使用两步走策略,首先拿到图片,计算图片的各种特征代表,例如可能计算与图片形象有关的数值,然后,将不同的特征向量合到一块,得到图像的特征表述,然后作为输入源传入线性分类器。而不是将原始像素传入分类器。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
对于这种数据集,我们不能用一个线性决策边界,将红点从蓝点中分开。如果采用灵活的特征转换,例子中运用极坐标转换,得到转换特征,就可以把复杂的数据集变成线性可分的。然后可以用线性分类器正确分类。找到正确的特征转换,计算出所关心问题的正确指标。
CS231n-深度学习与计算机视觉-笔记-Lecture3 损失函数和优化
一个特征表示非常简单的例子,就是颜色直方图。获取每个像素值,对应的光谱,把它分到柱状里,将每一个像素,都映射到这些柱状里,然后计算出每一个不同的柱状中,像素点出现的频次,从全局上告诉我们图像中有哪些颜色。
方向梯度直方图,测试图像中边缘的局部方向。词袋,从自然语言处理中获得的灵感,定义视觉单词字典,采用两阶段方法,获得一堆图像,从这些图像中进行小的随机块的采样,然后采用K均值等方法将它们聚合成簇,从而得到不同的簇中心,代表了不同类型。图像分类通道,将整个特征连接在一起,来喂养这些线性分类器的特征提取器。
接下来的想法,就是在提取这些特征之后,固定特征提取器,使得它在训练中不会被更新,在训练中仅仅更新线性分类器,如果用于最重要的特征。