本文试图将四类最基础也最常用的损失函数进行统一归纳,以明白各自的区别,加深对他们的记忆和理解。
本文会从两个步骤分析损失函数,第一个是从输入到模型的输出,第二个是从模型的输出到损失函数的计算。
第一个步奏,从输入到模型的输出。我先解释一下什么是模型的输出。比如当我们训练好了一个回归模型,用来判断房子的大小和价格的关系。那么,当我们输入一个房子的大小时,模型就会输出一个房子的价格,而这房子的价格就是模型的输出。简单来说,如果用x表示输入的话,f(x)可以用来表示模型的输出。
建立在第一个问题上,我们有了损失函数的概念。损失函数就是来衡量模型的输出与真实值之间的差距。我们试图减小这个差距以达到训练模型的目的。因此,可以认为损失函数是依附于模型输入与输出之上的。
我们可以用上图来表示输入,模型输出,真实值和损失函数之间的关系。
为了更加方便的说明下面的内容,我们还需要注意到样本的概念。这里不试图说明样本概念,只是想提及一个输入和多个输入的区别。
我们在训练模型时,常常是对很多输入和输出来进行的。我们必须要明确多个输入和多个输出的基本规律,而我们求损失函数也是基于多个输出的。实际上,更进一步,我们求导亦是如此。
还要注意的是,输入的数量和输入的维度是不一样的概念,不要混淆。举例来说,还是使用房价的回归来说,我们使用房子的大小和房子距离最近的地铁之间的距离来拟合。这时候,每一个输入xi应该包含两个维度,一个是房子面积,一个是房子与某个地铁的距离。而我们有很多个房子的价格,每一个房子数据则为一个个样本。如下图,这里有三个样本,x1,x2,x3,每个样本则有两个维度。
综合以上,并进一步说明以下符号的表示:
我们用x表示输入,xij(ij为右下角标)表示不同的输入。其中,i表示样本的标号,j表示维度标号。
f(xi)表示输入为xi时的模型输出。
用L表示所有输入(不管是多少个输入)的总损失,其中Li(i为右下角标)表示输入为xi时的损失。
g(xi)表示真实值,g可以理解为groundtruth。
N表示样本数量。
M表示输入的维度。
用W表示参数。w1表示对应于输入的第一个维度的参数。
还有其他符号会在给出时说明。
1.Mean Square Error
该损失函数可以认为是最基础的损失函数,最易理解。在机器学习中可以简写为MSE,如tensorflow中可以用MSE来说明你使用的损失函数。
中文可以翻译成均方误差。其中,“均”是指平均,如下公式中的N分之一和求和符号,就是对多个输入的损失值求和之后求平均;“方”表示对某个数的平方,如下面公式中的平方;而误差则可以理解为两个数之间的差,可以理解为下面公式中的减号,推广开来可以理解为两个向量之间的差。公式可以是:
首先,这个公式并不限制f(x)是怎么得到的。而且直接将模型输入使用在损失函数中。其中2分之1,是为了方便求导计算。
补充说明一下,通常f(x)可以用公式来表示,下面会用其他方式来表示不同损失函数的计算:
从这个输入到输出的函数来看,这是一个线性关系,最为简单的关系。
大家也都对这个函数很熟悉,这里就不过多介绍。关键是下面的几个损失函数。
2.cross entropy error
可翻译为交叉熵损失,与信息论中熵的概念也是有关系,这里就不展开了。
在第一步,也就是从输入到模型的输出,交叉熵损失的模型输出与均方误差已经有所不同。上面说到,均方误差是一个最简单的线性关系。而对于交叉熵损失来说,需要一个非线性的映射。
在得到f(xi)之后,交叉熵损失函数将其进一步作为输入输进sigmoid的函数中,我们用S(f(xi))来表示:
sigmoid函数图像如下图,这是一个输出值在0到1之间的映射关系,属于非线性映射。
总的来说,对于交叉熵损失函数从输入到输出与均方误差不同的地方在于,在其得到线性映射之后又加了一个sigmoid的非线性映射。
而对于该模型来说,s值就是模型的输出。
以下分析得到模型的输出之后,交叉熵损失如何进一步计算损失的。
如第一节所说,均方误差是用真实值与输出值之间的绝对误差的平方来表示的。
由于各种原因,我们在使用交叉熵损失函数的时候,真实值只有两种情况,一种是0,一种是1。而交叉熵损失中的模型输出在0到1之间。我们使用log函数来表示真实值与模型输出之间的关系。而真实值有两个,我们可以分开讨论。
这里,我使用了ln 来 代替 log,这样可以更方便的求导。我们可以接着继续观察一下ln函数的图像。
这里,我们可以看到当输入在0到1之间时,-ln(x)的值域在0到正无穷之间。
损失函数的价值可以分析一下,当真实值为1时,如果模型输出越接近1,则损失值越接近于0;如果模型输出越接近0,则损失值则接近于正无穷。当真实值为0时,如果模型越接近0,则损失值也接近于0,反之亦然。这里可以认为起到了衡量真实值与模型输出之间的作用。
为了统一一下上面的两个真实值的公式,我们有下面这个公式(我们使用g表示g(xi),使用f表示f(xi)):
最后,我们再次总结一下,交叉熵损失函数从模型输出到损失函数,使用了对数函数,其特点是真实值要么是0要么是1。损失函数可以让越接近真实值的损失值接近于0,远离真实值的损失值趋向于无穷大。其常用于分类问题中。
3.softmax
交叉熵损失可以解决二分类问题,但是却无法一次性针对多分类问题。这时,我们可以使用softmax进行分类。
同均方误差函数一样,我们得到了f(xi)之后,我们进一步处理。可以描述为求e次方,然后再归一化。得到的一个所有分类总和为1的数,我们用概率来描述这样的方式,实际上,每个数也表示了对应的分类概率,我们用p来作为记号(这里我们用fi来表示f(xi)):
这里只表示一个样本的情况,g=k表示真实情况为k类,X=xi表示输入为xi,j就是一个样本分类的数量。以上就是模型的输出。
而损失函数则是描述真实值和模型输出之间的差距。我们计算好了模型输出之后,我们就可以计算损失函数:
前面第二节已经说到,ln函数的图像关系。我们知道当某一分类的模型输出接近于1的时候,损失值是接近0的。
但是,这里我们貌似只看到了模型的输出,而并没有见到真实值。实际情况并非如此,我们对应的损失函数是某样本下真实值对应的模型输出值的ln值。如果这个值越接近于1,说明我们模型认为这个样本应该就是该类。为了更加形象的说明,下面举出一个实际的例子,例子中只有一个样本,一个样本对应的分类可能有三个,分别为猫,汽车,和人,我们直接从得到了f开始计算:
这里关键是要理解损失函数的值与真实值的关系。真实值由于是正确的分类,并没有直接参与计算,而是其对应标签下的概率值参与计算。
可以知道,softmax也是一个非线性的映射,处理的是多分类问题,输出是每个类的概率值,损失函数是正确分类的对数函数值。
4.SVM
还是针对多分类问题,我们在得到了f值之后,进一步进行计算。我们知道模型的输出是我们对样本的分类,而实际上SVM的输出是与核相关的,这也是其独特之处。这里我并不是很想讲核函数是什么,与输出又有什么关系。我们直接认为SVM的输出就是均方误差里的输出,也就是上面一直提到的f(xi),当然,这还不是最后的输出,SVM的输出就是每个样本的在每个分类下最大值对应的类。
下面我们讲SVM的损失怎么由f(x)计算得到。由于是多分类问题,而我们又使用当前样本在每个分类下最大值对应的类作为我们的预测值,我们可以假设如果正确分类下的值是最大值,则我们的预测是正确的。那么如何衡量这个值了,可以使用差来表示。而又有多个分类,我们进一步可以使用差值的和来进行衡量。
而SVM一个特性就是,只有当真实标签下对应的值比其他值大上一个值才认为是零损失。个人称这个值是保险值。整体公式如下:
公式中1就是上面说到的那个值。累加符号表示样本的每一个分类(除了正确的那个分类)。
举个例子,同上面的那个例子,还是从得到了f值开始:
另外提一句,我们说SVM其实主要分为两个部分,第一个部分是通过输入求模型的输出,这里面核函数起到重要作用,这里我试图用简单的话来解释核函数有什么作用,它就相当于把输入的x映射到另一个空间上,可以认为这是利用一组不同的基来表示一些向量(也就是原始输入)。而第二个部分就是利用输出得到损失函数,这中间那个值起到重要作用。而在深度学习中,我们通常直接使用第二部分。
总结
最后,本文做一个总结。