【本文内容是对此视频的整理、补充和修正】

在大多数课程,尤其是帮助大家快速掌握深度学习的课程,损失函数似乎并不是一个需要额外关心的问题。因为它往往都是现成的。

就像是网上非常火的,吴恩达讲深度学习的课程里面,他就提到了两个损失函数。也就是红框里的那两个函数。

最大似然估计函数定义(损失函数是如何设计出来的)(1)

对于某个数据x,y^hat是通过机器学习模型对这个数据x估计出来的结果,而y则是x的实际结果,往往也就是x数据的标签值。

在课程里面,吴恩达老师就是给我们演示了一下这两个函数如何用的,至于为什么是这样的却没有给出一个详细解释。

现在做深度学习研究的,往往都会自嘲说自己是炼丹的。炼丹嘛,其实就算是说一个模型它为什么好用,为什么不好用,我们其实也搞不太清楚,反正就是试来试去,试出来的。

我想很多人可能都和我一样,看到这两个损失函数其实都产生过好奇,它们是怎么得出来的,肯定不是硬生生地凑出来的。能写成这样,背后一定有道理。

但是又可能会想,反正都已经是在炼丹了,背后的原理是不是搞明白也无所谓了,能用就行。

如果是这样的话,你就会发现,对于快速上机实践、应付一下学校里的作业,这么做完全没有问题。但是一旦你想稍微系统化地学习一下深度学习,不论去看花书还是西瓜书,损失函数都会成为你理解的障碍。

就是想找深度学习方面的工作,面试官都很有可能会让你现场给出损失函数的推导。

这篇文章的作用,就是希望解决这个问题。

1、直观理解损失函数到底是什么,为什么这么重要

2、吴恩达老师给出的两个损失函数分布是最小二乘法和最大似然估计,它们是怎么来的,为什么叫这个名字

3、最小二乘法和最大似然估计它们之间到底有什么关系

1.损失函数的作用

要想明白损失函数是怎么设计出来的,还要从损失函数的作用开始说起。

我们都知道,机器学习本质上来说就是在学习数据背后的规律。就比如,给了一堆照片,照片里面有猫有狗,我们人去分辨的话,很容易就能分辨出哪些是猫、哪些是狗。虽然我们没有办法清楚地给出一个定义,符合这个的是猫,符合那个的就是狗。但是,我们认为在我们大脑里是有那么一个分辨猫狗的定义和规律的。

而机器学习的作用,就是哪怕你自己都不清楚这些事物的定义和规律,它依然可以通过模型和算法把这个规律找出来。

其实,我们人的学习行为很多时候也是这样的。这个世界从来没有告诉我们它的背后到底有什么规律,但是我们还是可以通过观察世界运行的各种现象,寻找到它背后的规律。这就是智能的一种体现,机器学习为什么是人工智能的重要一环,也正是这个原因。

那么机器是如何学到数据背后规律的呢?不同的学习方法可能会有不同,不过针对神经网络的深度学习,它们寻找规律的方法是先猜测、后比较、再调整。

就比如说,一个还没有训练过的新神经网络,神经网络里的参数W、b还都是初始值。不论效果怎么样,这个神经网络其实已经完成了一次猜测。输入一张图片,不论结果对错,它肯定是会得出一个结论,判断这张图片是猫还是狗。

猜测完了,就是比较了。一下蒙对那是不可能的,所以初始的一个新神经网络肯定不靠谱,但是有多不靠谱呢,就需要拿猜测的这个规律和真实的规律进行比较了。具体怎么比,我们放在后面再说,其实这就是损失函数的作用。

通过比较,就可以得到一个具体的差值,我们猜测的规律和真实的规律到底差了多少。有了这个具体的差距之后,再接下来就是调整了。比如说用梯度下降法,其实就是把损失函数计算出的那个差值分配到各个参数。用梯度下降法的好处就是,这个算法可以知道哪个参数对产生这个差值贡献的多,哪个贡献的少,贡献多的多调整,贡献少的少调整。

这样调整完之后,就是神经网络对规律的新一轮猜测。然后就可以再比较、再调整,直到差距小到一定程度位置。

2.“最小二乘法”是怎么得出来的

在猜测、比较、调整,这个循环过程中,损失函数的作用就是将神经网络里猜测的规律与真实规律进行比较,看看它们差距有多少。

而要想完成比较这个动作,也就是把损失函数设计出来,其中有个最重要的问题需要解决。那就是,真实的规律我们不知道,我们没有办法拿着猜测出来的规律和真实的规律直接比较。

还好,我们虽然不知道真实的规律是什么样子的,但是我们有已经打好标签的数据集。就比如,数据集里的每一个图片,都被打好标签了,是猫是狗我们都已经知道了正确答案。正确答案是什么?换个角度想,它们其实就是利用真实规律对图片进行判断,得到的判断结果。

所以,虽然没有办法拿出真实的规律来比较,但是我们可以拿猜测的规律和真实规律它们的判断的结果进行比较。如果我们猜测的规律就是真实规律的话,那么神经网络判断出来的结果一定和数据的标签一致。y^hat是神经网络的判断的结果,y是标签标记的真实结果,那么损失函数我们就可以设计成,把数据集里所有数据都放到神经网络判断一遍,挨个比较猜测的结果和真实的结果,看看它们之间差了多少,然后把所有的差值都加起来。

最大似然估计函数定义(损失函数是如何设计出来的)(2)

我们都知道,绝对值这个函数并不是全定义域都可导的,而随后求最小值还要进行求导,所以我们就可以把绝对值换成平方(还额外加了一个系数1/2,这是因为求导的时候指数部分的2会拿下来,可以和1/2抵消)。

最大似然估计函数定义(损失函数是如何设计出来的)(3)

3.如果深度学习是一个概率问题3.如果深度学习是一个概率问题

第一个式子是怎么设计出来的,这个问题我解决了。那第二个式子又是如何设计出来的?它又为什么叫做极大似然估计法,似然又是个啥?

要想明白这些,就需要切换一下视角了,需要从概率的视角来看深度学习问题。

怎么切换成概率呢?我们可以先来看一下最理想的情况,比如,我们可以想象一下,把真实规律用概率分布的方式表示出来,会是什么样子。 (假如说就是判断是一个非猫即狗的二分问题)

最大似然估计函数定义(损失函数是如何设计出来的)(4)

也就是说,只要图片是猫,那么判断的结果一定不会是狗;如果图片是狗,那么判断的结果就一定不是猫,没有任何判断错误的情况出现。(注意:“具体一个猫的图片判断结果也是猫”这个事件的概率并不等于1,“所有猫的图片都判断成猫”、“所有狗的图片都判断成狗”,它们这些事件的概率全加起来才是1)

但是我们猜测出来的规律呢?虽然仍然可以用一个概率分布来表示,但是就没有这么准了,就算是给了一张猫的图片,但是神经网络还是有概率把它判断成狗。最理想的情况,当然是让我们猜测出来的规律可以和真实规律的概率分布一模一样,但现实是,我们几乎不可能得到和真实规律一模一样的规律,只能近似。(这个原因,需要对PAC框架和VC维理论有比较深入的理解之后才能解释清楚,这里就不多解释了。可以简单的理解为,任何一种机器学习的模型能力都是有限的,所以无法学到真实规律。)

不过,不论这么样,不论是真实的规律,还是我们猜测的规律,都可以用一个条件概率分布来呈现。我们得到的数据集里面打好标签的数据,其实就是在真实规律这个概率分布下进行抽样得到的结果,而深度学习的过程,就是我们已经有了样本数据,去反推背后概率分布是什么的过程。

这就相当于,你有一个不知道正反概率是什么的硬币,抛了10次结果是7正3反,如何才能反推出这个硬币正反的真实概率。

4.已知样本数据,如何反推概率分布

如何才能反推出硬币真实的概率呢?投了10次,7正3反,是不是说硬币的概率就一定是正面的概率是0.7,反面的概率是0.3呢?

这么想很符合我们的直觉,但这并不是一件板上钉钉的事情。

你可以想一下,假如说,我们的硬币是正反概率都是0.5的话,你抛10次,难道就真的能保证一定是5次正、5次反吗?不一定吧,出现6正4反,4正6反也还是挺常见的吧。更甚者,运气好到极点,10次全部是正面也是有可能的。

那么,当我们不知道硬币正反概率的时候,7正3反,就一定0.7的概率吗?也不一定,对吧。完全有可能是,硬币的概率是0.1正、0.9反,但是运气就是很好,抛出了7正3反的结果。或者是,概率本来是0.8正、0.2反,但是运气就差那么一点,抛出了7正3反。

最大似然估计函数定义(损失函数是如何设计出来的)(5)

也就是说,我们知道抛硬币的结果(抽样结果),我们没有办法唯一确定一个真实的概率(背后的规律)。就像前面看到的,7正3反的硬币结果,没有办法排除掉任何一种概率,它们都有可能。

不过,虽然我们没有办法百分百确定样本背后的概率分布原本是什么样子的,但是我们还是可以确定,最有可能情况是什么。

比如,C1~C10代表着10次抛硬币的结果,θ是硬币决定正反概率的属性(这个属性是未知的;也可以直接理解为硬币固有的概率属性),那么抛10次硬币有7次是正面对应的概率就是等号右边这么多。

最大似然估计函数定义(损失函数是如何设计出来的)(6)

有了这个式子之后,我们就可以算出来,如果硬币抛出来正面朝上的概率分别是0.1、0.7和0.8的时候,要想得到抛10次硬币7次朝上的概率分布是多少。

最大似然估计函数定义(损失函数是如何设计出来的)(7)

大家算一下就知道,显然当正面概率是0.7的时候,发生的概率是最大的。

所以,我们直觉上觉得抛10次硬币7次正面,硬币的概率应该是0.7,不是没有根据的,这种情况与其他的情况想比,的确是可能性最大的。其实对于任何已经知道了样本,想要反推背后的概率分布,都可以用类似的思路。这种思路,虽然没有办法百分百的知道真实的情况是什么,但是显然猜0.7是正面,这样的正确的可能性最大。

对应到深度学习里面也一样,也是已知了一堆样本数据,目的是想办法反推出生成样本数据的真实概率分布。虽然没有办法百分百确定是哪一个,但是我们还是有办法确定哪一个的可能性最大。

而这个思路,就是最大似然估计法的思路,其中的“最大”这个词,对应的就是前面说的可能性最大。至于为什么是似然值,而不是概率值,这个就用解释一下似然值和概率值的区别了。

5.“似然”和“概率”有什么不一样

什么是似然值?首先,它也是用来表示可能性的,但是它又和概率描述的问题不一样。

就比如,C代表了硬币是正还是反,θ是硬币决定正反概率的属性。

最大似然估计函数定义(损失函数是如何设计出来的)(8)

这是一个概率分布的前提是,C是随机变量。随机变量是什么意思呢?其实就是在说,当θ是一个固定值的时候,把所有C的可能取值都考虑进来,把它们对应的概率值加起来,最后的结果是归一的。

最大似然估计函数定义(损失函数是如何设计出来的)(9)

但是我们可以想一下,在前面我们的问题是什么?我们面临的问题是,C是一个确定的值(也就是样本已经确定了),未知的是θ。θ是一个条件,它不是随机变量,也就是说如果把全部θ的取值都考虑进来,它并不要求满足归一。也就是下式不一定等于1。

最大似然估计函数定义(损失函数是如何设计出来的)(10)

了解这些之后,我们应该就能明白了,如果我们设计一个函数,它的变量是θ:

最大似然估计函数定义(损失函数是如何设计出来的)(11)

这个L函数的结果,虽然还是一个概率值,也能表示某个事件发生的可能性,但是它又和概率分布的概率不太一样。概率如果写成函数的话,变量一定是随机变量才对,而这里变量是条件。

而我们在已知某个抽样结果后,反推那种情况的可能性最大,其实就是在求这个L函数的最大值。

至于这个函数呢?因为和概率表达意义不同,所以就被赋予了一个新的名字,似然函数。我们说的最大似然估计法,其实就是在说,要求出似然函数的最大值,这个最大值对着的就是最有可能的规律。

6.“最大似然估计法”为什么要写成这个样子

最大似然估计法到底是什么意思,我们已经知道了,剩下的就是神经网络里面的最大似然法为什么写出来是这个样子的。

最大似然估计函数定义(损失函数是如何设计出来的)(12)

有了这个对应之后,我们就比较容易思考了,于是就有如下:

最大似然估计函数定义(损失函数是如何设计出来的)(13)

最大似然估计函数定义(损失函数是如何设计出来的)(14)

(在求最大值的时候灰色部分是可以忽略的。特别是P(xi),这是因为我们默认数据集是优质的数据集,数据集里的图片都是相互独立的,而且应该是等概率的。如果这部分有问题,那就需要重新整理数据集,让数据集尽可能满足这个条件。)

最大似然估计函数定义(损失函数是如何设计出来的)(15)

通过上面的推导,就可以看出来了,为什么吴恩达老师的最大似然估计法的式子要写成那个样子了。

7.“最小二乘法”可以等价于“最大似然估计法”

本来,讲到这里,最开始我们所有的问题就都已经解决了。不论是是最小二乘法,还是极大似然估计法,它们其实都是用来比较神经网络猜测的那个规律和真实的规律的方法。

最小二乘法认为,当所有的误差的平方值最小时,神经网络里面猜测的规律与真实的规律最接近。最大似然估计法则认为,当似然值最大的时候,猜测的规律与真实的规律最接近。

如果就是这么看的话,最小二乘法好像和极大似然估计法是两套不想干的判断标准,最后选择哪个好像就是一个偏好问题。

但其实如果对最小二乘法的本质有所了解的话,就会发现从某种程度上来说,最小二乘法与最大似然估计在底层是相通的。

为什么这么说呢?

我们可以看看最小二乘法最后求出来的最值是什么。为了简化问题,我们把Y当做变量,代表不同W,b下神经网络得出的判断结果。这样的话,损失函数就可以写成:

最大似然估计函数定义(损失函数是如何设计出来的)(16)

最大似然估计函数定义(损失函数是如何设计出来的)(17)

如果只是进行到这一步的话,我们还什么都看不出来。但是我们还可以把Y-yi看做是神经网络的判断结果与真实结果的误差,也就是:

最大似然估计函数定义(损失函数是如何设计出来的)(18)

那么我们是可以把数据集里每个数据对应的ε看做抽样结果,也就相当于前面抛硬币例子里面7正3反的结果。这样的话,我们其实是可以利用最大似然估计法的。(注意这里用最大似人估计法时,随机变量是误差ε,而前面用最大似然估计法的时候随机变量是判断结果yi,这还是有些不一样的。)

利用最大似然估计法的话,可以得到似然函数如下:

求最大值,其实就是下面的函数对Y求导等于0:

具体这里的最大值求出来是多少我们先放一下,但是在前面我们已经知道,用最小二乘法已经求出来了,当Y等于yi的平均值时,是我们的目标。而最小二乘法和极大似然估计法,它们虽然用到了不同的思路,但都是在解决同一个问题,那我们是不是可以认为,它们其实是殊途同归的,最后的答案都是Y应该等于yi的平均值。

如果真的可以做出这样的假设的话,那把平均值这个答案带到最大似然估计法里面,就可以去反推一下这个概率分布是什么样子的了。带进去之后,就会发现,这个概率分布的概率密度函数如下:

这是什么?这就是正态分布啊。

于是最小二乘法和最大似然估计法的关系就变成了这样:如果我们认定神经网络得到的结果与真实情况的误差,是属于正态分布的话,那么最小二乘法与极大似然估计法是等价的。

我们都知道正态分布最开始是被高斯最先提出来的,他提出来的思路是什么?虽然细节上可能会有差别,但是大体上他就是做了类似的思考,也就是认为最小二乘法和极大似然估计法应该殊途同归,然后计算得出了正态分布的表达式。

所以,最小二乘法和极大似然估计法,虽然形式上非常不同,但是它们本质上还是相通的。只不过,最小二乘法比极大似然估计法多了一个前提,那就是它要求误差的分布属于正态分布,只有这样的时候,最小二乘法和极大似然估计法才是等价的。

其实,最大似然估计法很多人也把它称为交叉熵法,这是因为极大似然估计法和交叉熵方法是彻彻底底的等价,而不是最小二乘法这种有条件的等价。关于交叉熵方法的介绍,会在下一篇内容中介绍。

,