目录
1.损失函数
1.1 支持向量机SVM
1.1.1 SVM的代价函数及优化目标
1.1.2 如何理解将SVM成为大间距分类器
1.1.3 大间距分类器的数学原理
1.1.4 SVM核函数(构建非线性分类器) 及控制点的选择
1.1.5 构建自己的SVM
1.2 softmax分类器
1.3 softmax VS SVM
2.优化
2.1 梯度下降法
2.2 随机梯度下降
损失函数可以清晰地告诉我们一个分类器的好坏。
损失函数通常定义如下:给予一个数据集,在图像分类问题中,即为输入图像,为标签(数字)。定义损失函数,它将接收来自函数的预测分数,以及真实目标或标签,给我们可量化值告诉我们这个分类器的这些预测对于该训练示例的糟糕程度。
还需强调的是,这是一个笼统的公式,计算结果是对于个测试集的平均代价,是我们待训练的参数。
有了损失函数,我们就能评价我们训练出的参数的好坏,我们来举一个例子:
对于一个分类问题,我们算出每一个图像对应的和相应分类物体的相似度,我们可以看到,这个例子中,猫的得分明显不对,车子分类对了,青蛙彻底分类错了。
我们用多分类SVM损失函数来讲述如上思想,如果对SVM不了解可以先阅读本文1.1章节,这里我将SVM的思想解释的很清楚了。
对于多元SVM分类的损失函数:除了真实的分类以外,对所有的分类都做加和,也就是说我们在所有错误的分类上做和,比较正确分类的分数和错误分类的分数。如果正确分类的分数比错误分类的分数高出某个安全的边距(我们把这个边际设为1),如果真实的分数很高或者说真实分类的分数比其他任何错误分类的分数都要高很多,那么损失为0。接下来把图片对每个错误分类的损失加起来就可以得到数据集中这个样本的最终损失。最后对整个训练集的损失函数取平均。
这听起来像是一个语句,如果真实类的分数比其它都高很多则认为这个分类器很好。SVM的损失函数图如下:这里的轴表示,即是训练样本真实分类的分数;轴表示损失。可以看到随着真实分类的分数提升,损失会线性下降,—直到分数超过了—个阈值,损失函数的值就是0了。因为我们已经为这个样本成功地分对了类。
多分类的SVM损失函数数学表达如下:我们算一下第一组数据的损失:因为猫是正确的分类,我们要对汽车和青蛙类都要做一遍运算。来看汽车,车子的分数5.1减去猫的分数3.2再加上1,我们比较猫和车的时候我们会得到一些损失,因为车的分数比猫还高这是不好的,对这个样本来说,我们得到了2.9的损失值;接着我们比较猫和青蛙的分数3.2-(-1.7),猫的分数超过青蛙得分1以上这表明这两个类别的的损失项为0。训练样例的多分类支持向量机损失函数是每一对这样的类别构成的损失项的加和也就是2.9加上0即2.9。我们用数学表达式表达即:
同理我们算出,最终我们得出整个训练集(仅有三个数据)的损失为。
我们来思考两个问题
如果我们改变了一下汽车的分数会发生什么?损失变了!什么可以导致训练分数发生变化,我们训练的参数。
如果我们改变了损失函数的计算方式会发生什么?损失函数的作用在于量化不同的错误到底有多坏,同时分类器会犯不同的错误,我们如何对分类器可能犯的不同类型的错误进行权衡,如果你使用平方项损失函数这意味着一个非常非常不好的错误就会更加不好成平方地不好,真的十分的不好,即我们不想要一个有严重分错的分类器,相比于上文的损失函数来说(利用上文的损失函数我们其实对微小的错误并不在意)但是如果分类出现很多错误出现很多错误,如果一个样例中出现了很多的错误那么我们就扩大错误以此来减少这个错误。
因此,合理的损失函数有可以帮我们更好的判断训练出模型的好坏。
从逻辑回归模型稍加改动就可以得到支持向量机模型(SVM)。
在逻辑回归中,我们用假设函数和激活函数预测分类,如下图:
我们想一下逻辑回归中我们希望这个模型做什么?
当标定数据时,我们希望预测到的, 当标定数据时,我们希望预测到的。
我们再来看代价函数:
当时,第二项为0。我们观察第一项,画出来的代价函数如上图所示,当很大时,预测值无限接近1,代价函数值无限小。那么我们取一个折线代替这个代价函数,如图,我们取一段直线+曲线代替了这个代价函数,如果这么做了有什么好处呢?
首先,它和逻辑回归的结果相似。其次,它会使逻辑回归的计算变得简单。我们将这个代价函数命名为。于是,现在我们的代价函数变成了:
同时,我们需要考虑正则化项。在逻辑回归中,我们通常采用的形式,通过设定不同的正则化参数以便权衡我们能在多大程度上去适应训练集。在SVM中,我们用一个新的参数,通过最小化代价函数来训练,通过设置C的大小来控制A或B的权重去适应数据集。由此得到了最后的优化目标:
同时,SVM并不会输出概率,直接进行一个预测,输出0/1。即如果输出1,反之输出0。
这是一个训练好的SVM的代价函数。我们可以看到当时,。而不仅仅是,这就相当于在SVM中构建了一个安全间距。我们来看一下这个安全间距会带来什么样的影响。
在此,我们假设十分的大,这样我们的优化目标是使第一项接近于0。让我们试着在这种情况下理解优化问题,也就是要怎么做才能使第一项等于0。如下图:
具体来说,请观察下列数据集:
其中有正样本和负样本,这些数据线性可分(存在一条直线使正样本负样本分开,不局限于一条直线),但是,看看如下图的分割,显然不好。
相比而言,黑色的就好很多。从数学来讲,这条黑色的边界线到两样本有更大的距离(间距)(如蓝线),这个间距叫做支持向量机的间距。
同时这个间距是当参数C设置很大的时候才会出现对异常点很敏感,我们加入一个额外的正样本,如下图:额外的正样本可能让学习到的分界线由黑色向紫色移动。但我们不将参数C设置那么大最后我们得到的还是这条黑线。
首先我们来看看向量的内积,,那么如何计算和的内积呢?将投影到向量上,测量一下投影的长度,如下图红线,长度记为:
就是向量在向量上的投影的长度或者说量,同时可以这样表示,
现在让我们看看我们的优化目标:为了方便理解,我们将截距设置为0(假设分类器过原点方便推导),特征数设置为2,即。
我们将代价函数理解为向量内积的形式,如上图:那么每一个可以计算成投影到的距离再乘以的模。
我们来看一下SVM为什么不会选择这种边界:
这个决策边界对应着一个参数向量,同时能推出参数向量与决策边界是垂直的,如下图:
对于这个决策边界,对于正样本,我们可以看到(向的投影)相当的小,那就要求我们的十分的大;同时对于负样本,我们可以看到(向的投影)相当的小,那就也要求我们的十分的大。但是我们的代价函数,要求尽可能的小,冲突,因此这种决策边界自相冲突,不是一个好方向。
而如上图的决策边界,对于正样本,我们可以看到(向的投影)相当的大,那就要求我们的十分的小;同时对于负样本,我们可以看到(向的投影)相当的大,那就也要求我们的十分的小。同时我们的代价函数,要求尽可能的小,冲突,因此这种决策边界满足我们的要求,是一个好方向。
这就是SVM为什么会选择右边的假设的原因。也是SVM为什么选是大间距分类器的原理。它试图最大化的值,的值大了自然形成一个大间距的分界线。
由此,我们证明完了为什么SVM是一个大间距分类器。
1.对核函数的直观理解
如果想要拟合一个如上数据集的非线性的判别边界,一种方法是构建复杂多项式特征的集合如上图右面的决策边界,但我们不知道哪一个多项式是对我们的边界有作用的,同时计算量也会很大。
我们来试试以下做法:
对于特征,我们手动选取三个点,我们将这些点称之为标记点,像这样定义新的特征给定一个实例,让我将第一个特征定义为一种相似度的变量,即度量训练样本与第一个标记的相似度。
这里的相似度函数就是核函数,我们这里采用高斯核函数。 我们看一下核函数做了什么,为什么这些相似度函数为什么这些表达式是有意义,我们先看看第一个标记:
如果距离很近,则,反之。因此若很接近特征则输出1反之输出0。用图来表示的话如下图:
同时,不同的取值也会对我们的相似度函数有影响:
那么我们根据特征能得到狩么样的预测函数呢?
给定一个训练样本,我们准备计算出三个特征变量,预测函数的预测值将等于1,即时,我已经找到了一个学习算法并且已经得到这些参数的值。
我们要做的是我想要知道会发生什么如果我们有一个训练实例,它的坐标正好是这个洋红色的点,我想知道我的预测函数会给出怎样的预测结果?因为我的训练实例接近于,那么我们会有接近,又因为训练样本离都很远,因此接近于0,于是我们的,根据这个值和0的关系我们可以预测输出是0还是1。
如果我们有一个点离都很远,则,根据这个值和0的关系我们可以预测输出是0还是1。
我们通过对大量的样本进行相应的处理,最后可能得出这个样本点接近预测值输出1,接近预测值输出0....。我们最后会得到这个预测函数的判别边界。如下图:
在这个判别边界里面,预测值就为1,反之为0。这就是我们如何定义控制点和核函数来训练出非常复杂的非线性决策边界的方法。
2.如何选取控制点
在实际应用中,在给定学习问题中,在我们的数据集中有一些正样本和一些负样本,我们的想法是:将选取我们所拥有的每一个样本点只需要直接使用它们作为标记点即可。
如果我有一个训练样本,那么我将在这个样本点完全相同的位置上选做我的第一个标记点;如果我另外一个训练样本,那么我将在这个样本点完全相同的位置上选做我的第二个标记点....这个方法最终可以得到个标记点(数据总数为)。
当给定一个时(数据集、交叉验证集或测试集)我们计算,得到了一个特征向量,也可以加入一个截距。如果我们有一个训练样本,我们对这个样本要计算特征是这样的:
首先计算它的特征向量,计算,若大于0则预测。这就是已知的情况下如何得到预测结果的过程。
但如何得到呢?我们训练下面这个式子:
我们就训练出了参数。
那我们讨论最后两个问题
超参数的选择:这里给出结论
大的:低偏差、高方差
小的:高偏差、低方差
超参数的选择:这里给出结论
大的:高斯核函数变化相对平滑;高偏差、低方差
小的:高斯核函数变化相对剧烈;低偏差、高方差
我们首先要确定参数的选择以及高斯核函数的选择。
对于内核函数,有以下几种:
①线性核函数(无核):即不带有核函数的SVM ,可以当你有大量的特征且样本的数量很少的时候使用。
②高斯核函数(上文讲述过):我们需要选择参数、将特征归一化。可以当特征很少且样本很多的时候使用。
③多项式核函数:,表现较差一般不使用。
随后构建代价函数求解
最后预测,我们的SVM就实现完成了。
深度学习中另外一个流行分类选择是softmax分类器,它的损失函数在深度学习中使用的更为广泛。我们来介绍下这个函数:
回想一下多类别SVM函数分类的背景,针对那些得分我们并没有一个解释,当我们进行分类时我们的模型函数给我们输出了几个数字,这些数字代表了这些类别的得分,但没给我们一个解释,我们仅仅知道正确分类的得分应该比不正确分类的得分高。(3.2>5.1?)
除此之外我们并没有解释这些得分的真正意涵,但对于softmax分类来说,我们将赋予得分实在的意义,我们会基于这些得分去计算概率分布:
我们将其指数化以便结果都是正数,接着我们利用这些指数的和来归一化它们;当我们的分数经过softmax函数处理后,我们得到了概率分布,对于所有类别我们都有了相应概率(每个概率都介于0~1之间)。所有类别的概率和为1。
代价函数如下:
同样地,softmax的代价函数最小值为0,最大值为。
我们用一张图对比SVM和softmax吧!
这两个损失函数的差别在于我们如何来解释这些分值,进而量化度量到底有多坏:所以对于SVM深入研究并观察正确的分类的分值和不正确分类的分值的边际,而对于softmax我们打算去计算一个概率分布然后查看负对数概率。
在多分类SVM损失函数中,当样本为车那么车的分值就会比其他确的分类的分值要高,即使车的得分值稍微有所变化也并不会对结果产生根本改变,因为对于SVM损失函数来说,唯一关心的是正确的分值要比不正确分值高出一个安全边际。
但是softmax这种方式就相当不同了,softmax的目标是将概率质量函数(离散分布值)等于1,所以你给正确分类再高的分值,同时给不正确分类再低的分值,softmax依然会在正确分类上积累更多的概率质量。正确的分类的概率向1迈进,将不正确的分类分值向0靠近。
如何优化使得损失函数达到最小?
高等数学中我们学过梯度的方向是函数增加最快的方向,那么负梯度的方向就是函数下降最快的方向,那么我们可以将损失函数(代价函数)求出关于变量的负梯度方向,使得损失函数取到最小。
在实际的深度学习算法中,首先我们初始化为随机值,然后我们执行梯度下降算法,更新的值....一直循环,最后网络会收敛。如下图:
但在这里步长是一个超参数,这就告诉我们每次戍算梯度时在那个方向前进多少距离,
这个步长也被叫做学习率。找到学习率是一个深度学习算法最先需要做的事情(相比于正则化参数..)。
由于这部分在我机器学习的博客中有,不再赘述。
实际中,训练样本可能非常大。每一步梯度下降都要计算每个样本的偏导数取平均,这样在大数据集中是不可行的。所以实际操作中我们往往使用随机梯度下降,它并非针算整个训练集的误差和梯度值,而是在每一次迭代中选取一小部分训练样本称为minibatdh(小批量),按惯例这里都取2的n次幂(32,64,128..)然后我们利用这minibatch来估算误差总和以及实际梯度。