损失函数
在梯度下降中,所求的梯度其实就是损失函数的梯度。
损失函数有三种设计方法:
(1)最小二乘法
(2)极大似然估计法
(3)交叉熵法
什么是损失函数呢?
其实就是我们想的模型标准和现实模型相比较,相差多少的定量表达。
那么损失函数如何设计出来的呢?背后的含义是什么?
最小二乘法
- 公式:
- 举例
存在一个神经网络,用于判断输入的图片是否是猫。
首先我们先输入一些带标签的训练数据,xi就是输入数据的标签(xi表示第i张是否是猫,1是猫,0不是猫)
这些图片在经过神经网络后,就会输出yi,在这里用的是sigmoid函数,所以yi就会在0~1之间。
yi的含义是,在经过神经网络的判断后,有yi的概率认为是猫。
很自然的能联想到,当理想模型判断的结果xi和神经网络判断的结果yi之间差值越小,理想模型和神经网络模型之间相差的也会越小。
再将所有的判断结果相加起来,当该值越小,理想模型和神经网络模型之间相差的也会越近似。
但是存在绝对值,绝对值在某些情况下是不可导的(求不了梯度),所以我们加上平方。
虽然这个最小值发生了变化,但是不影响xi和yi之间的关系,且全程可导。
所以最小二乘的二乘就是平方,最小就是找最小的那个结果。这个结果找到了,就找到了理想模型和神经网络模型之间最近似的结果。
为了方便求导,我们可以在前面加上一个1/2。就变成了最后的:
没有∑是因为,样本是一个一个输入的,在训练过程中是迭代中进行的,∑只是数学上的表示。
y/^表示神经网络输出结果值(例子中的yi),y表示理想输出值(例子中的xi)。
极大似然估计法
- 公式:
- 例子:
存在两个世界,一个是理念世界,另一个是现实世界
黄色的是理念世界,理念世界存在一个概率分布:抛硬币存在正反两种情况,各是0.5的概率。
绿色的是现实世界,确确实实的抛掷硬币。
这两个世界存在两种种关系:
(1)理念世界会指导现实世界:理念大致判断现实发生的情况
(2)现实世界也可以反推理念世界:现实世界发生的事件反推理念世界的概率分布
但是现实世界和理念世界中间存在一种次元壁,我们所谓的概率统计问题,很对就是在突破次元壁的时候出现的。
因为存在次元壁,所以我们在反推时,可能存在不同的结果。
反推的这三个概率模型是有差别的,是不平等的:
比如假设硬币的概率分布是第一个,那么在这个概率模型下要发生现实世界中这种情况的可能性有多大呢?
P(C1,C2……C10|θ):
在θ条件下,同时发生C1,C2……C10的概率。
有十个硬币,对应的结果就是10个硬币结果发生概率进行连乘:
对应其他三个概率模型:
极大似然估计法就自然而然地产生了,硬币既然投出了这样的结果,那本来的概率模型是怎样的呢?虽然我们永远不能确定,但是我们选择似然值最高的那可能性就越高,这就是极大似然估计法。挑出似然值最大的那个概率模型,这个概率模型和原本的概率模型应该是最接近的
对于判断猫的例子中,输入的xi就是现实。
如下图,左边是理想的模型,但是我们不知道它存在什么样的概率分布,但是我们假设理想模型可以用高斯分布给完整的描述出来;
我们在训练神经网络模型时,用各种模型去和人脑这个模型进行匹配,通过调整参数u和σ尽量让神经网络里的高斯分布与理想模型重合。
但是我们并不知道理想的模型是什么样的,虽然我们假设是高斯分布,但是准确率就难于保证了。不过没有关系,神经网络可以通过叠加感知机的方式任意逼近任意一种概率模型,即使是表达不出来的概率模型,神经网络也能够去逼近。
于是我们换一下中间的表示形式,用神经网络的方式表示出来;
神经网络有两种参数,w是未知系数的集合,b是偏执系数的集合。
我们对输入图片进行判断以后,最后得到的那个值,就是神经网络中的似然值;当似然值最大的时候,就可以认定神经网络里面的模型和人脑的模型是最接近的
但是W,b是固定的,无论输入什么样的照片,他都是确定的;而对于最后的判断的标签,如果都是用猫的照片来进行确定的话,那都是1,那这样是没有办法进行训练的。
所以极大似然值要进一步推导:
yi隐藏W和b,所以进一步推导:
yi对于每次输入的照片不一样,得到的结果也会不一样,这样将极大似然就存在训练的可能性了。
对于判断猫的例子中,他只存在是猫和不是猫两种结果,符合伯努利分布:
xi:1是猫,0不是猫
p:是猫的概率,1-p:不是猫的概率
yi就是训练后的概率模型的概率密度函数,就是上面的p。
所以进一步展开:
最后是连乘,我们更希望是练加,所以加上log
log是不改变单调性的,所以并没有改变xi和yi的关系。
对比最大值,我们更喜欢最小值,所以我们加上一个负号:
最后得到极大似然的损失函数:
没有∑是因为,样本是一个一个输入的,在训练过程中是迭代中进行的,∑只是数学上的表示。
交叉熵
交叉熵用了熵这个概念,先把模型转换成熵这么个数值,在用这个数值去比较不同模型之间的差异。
为什么要用熵绕这么一圈呢?
对于同一类模型,有一样的参数,比较起来就比较方便;比如高斯分布,它就一个方差,一个期望,比较这两个就可以了。
但是如果两个模型不一样呢?比如一个是高斯分布,一个是泊松分布,就没办法直接比较了。
所以要直接比较模型,是有前提的,他们的模型是同一种。如果不是同一种的话,那就没有办法公度了。
那能否找到一个共度来衡量各类模型,
就此,熵就出来了,它代表的是一个系统里的混乱程度。
就如理想世界里的是一个概念模型,神经网络里也是概率模型,也就是说他们是有一定混乱程度的,是不是都可以用熵去衡量呢?
接下来,在信息论的基础之下,去了解一下熵,它到底是什么。
为了了解熵,先了解一个前置概念,那就是信息量。
在看某个视频时,视频内容都是了解过的,那么我们就会说这个视频没有信息量。或者我们在收到垃圾短信时,短信内容并不是我们想知道的,就可以说该短信没有信息量。
所以要看一个信息有没有信息量,不只是看这个信息是你知道还是不知道的,关键还要看给你能带来多少确定性。
比如,存在八支球队参加比赛,
对于阿根廷夺冠的概率来说,是1/8。
某一天,得到信息阿根廷夺冠了,那么这个概率为1/8的不确定事件就变成了100%的事件。
如果得到的消息是阿根廷挺进决赛,这条信息是存在信息量的,那么原来的1/8事件就变成了1/2概率的不确定事件。
可以知道挺进决赛没有夺冠的信息量高,毕竟只是从1/8提升到了1/2。
那我们如何确定信息量呢?
我们先假设一个f(x)表示信息量。(:=表示后面对前面的定义)
为了找出f(x),我们讨论上述足球的例子:
【阿根廷夺冠的信息量】与【阿根廷进决赛+阿根廷赢了决赛信息量】是一样的
信息量相同的原因很简单:
告诉你阿根廷夺冠,我们就可以从原来1/8的不确定性变成了100%。
如果我们告诉你阿根廷挺进决赛,概率从1/8变成了1/2,再通过阿根廷赢了决赛,1/2不确定行就变成了100%。
虽然这两条路径不同,但是携带的信息量是相同的。
通过上图,我们可以找到计算信息量,f(x)的自变量到底是什么。那个自变量可以想象成,就是这个路径的长短,路径的长短由两部分决定,一个是起点,一个是终点。
对于图中的1/2、1/4、1/8就可以作为自变量去计算自变量。于是我们得出下面式子:
同时我们看到上述式子也得满足概率条件,才能够让定义自洽
那具体怎么做才能够让f(x)能够自洽呢?那就是f(x)必须满足:
到这一步,可以想象,为了能够自洽,f(x)式子中需要有log,所以可以定义为:
对于log前面的系数能否和F:=ma一样定义为1呢?
可以,但是不符合我们的直观思维,对于概率x,是越大信息量越低,越小信息量越大;所以说这里应该是相反的关系,既1/8的信息量算出来应该比1/2和1/2都大
所以log前面的系数要加负号:
接下来取多少为底比较合适呢?其实不用考虑它,我们已经把所有的自洽问题给解决了,这里是可以比较随意的;在这里我们以2为底:
带入之前的式子中:
得出阿根廷夺冠的信息量是3
类比抛硬币:
告诉你事件的概率是1/2,就等价告诉你抛硬币正面朝上的概率。
告诉你事件的概率是1/8,就等价告诉你抛三个硬币全部正面朝上的概率。
如果是1/3呢,那他就介于抛一个硬币和抛三个硬币之间,可以在数学上抛1.58个硬币正面朝上的概率。
信息量的单位是比特。例如A足球队夺冠的概率是1/1024,带入计算后,A足球队夺冠的信息量是10比特。
再看计算机里的多少多少位数据,比如要给计算机输入一个16位的数据,在输入数据之前,每一位都可以填0或1,所以他具体的值是1/(216)这个概率;在输入后就确定下来了,只有一个可能性被确定,从原来的1/(216)变成了100%,信息量就是16比特。
信息量就可以理解为某个事件从不确定性变成确定性,它的难度有多大。难度比较大,信息量就越高。
说回到熵,其实熵也类似,只不过熵不是衡量某一个具体的事件,他是衡量整个系统里的所有事件。也就是熵表示一个系统原来的不确定到确定难度有多大。
熵和信息量都是衡量难度,其实他们的单位都可以一样,
例如,有两场比赛:
把两场球赛看作两个系统,那是第一场比赛从不确定到确定的难度更大,还是第二场比赛从不确定到确定的难度更大呢?
我们就得从信息量入手了
熵应该怎么求呢?
如果熵就是信息量相加,那么中国对阵法国的比赛熵就会比较大,比利时对阵阿根廷熵就会比较小。这肯定不合适,熵越大,代表这个系统的不确定性越高,混乱程度越大。而法国对症中国,法国赢的概率很大,说明他的确定性非常高;反之比利时对阵阿根确定性较低。所以不能相加。
仔细一看,因为中国队赢球,才会有这么高的信息量,如果是法国队赢球,就没有这么多信息量了。所以要乘于自己权重后再相加才行。
值乘于比重再相加不正是期望吗,所以我们就可以对熵进行定义了。
假设有一个概率系统P,我们可以对这个系统求它的熵,我们将熵定义为对这个系统求信息量的期望。
到此,熵的定义就清楚了。
熵确实对整体模型进行了衡量,衡量的结果能够反应该模型的不确定性程度/混乱程度。
回到如何比较两个模型,最直接的方法就是比较两个模型的熵,但是这么比比较简单粗暴而且理想世界的模型的熵是不知道的。
接下来我们引入KL散度(相对熵):
相对熵肯定不是一个系统的概念了,所以我们引入两个系统:
我们来看一下KL散度的定义:
上图是具体的定义,是对于某一个事件在Q系统中的信息量减去它对应到在P系统中的信息量的差值组成的期望。所以,如果是Q和P是相等的,那么结果就一定是0;所以我们可以认定,结果等于0的话,P和Q是完全相等的。
这个差值的直观理解:对于系统Q,想要达到和P一样的分布的话,那他们中间还差多少信息量;如果补齐了那么它们就一样了。
继续推导:
可以看到红框部分就是系统P的熵,所以这一部分是恒定的。所以我们想要知道KL散度是否接近于0,关键看前面那一部分。
前面的部分就是交叉熵了。
可以看出前面部分和后面部分都是正数(信息量肯定是大于0的),对与结果就在于前部分和后部分的大小关系了。如果交叉熵越大,那么KL散度距离0的距离就越远,Q和P就越不像;反之,如果交叉熵越小,那么KL散度距离0的距离就越远,Q和P也是越不像的。
我们现在就希望交叉熵只站一边,要么大于他,要么就小于他;这样去表达损失函数就会方便很多。
我们直接拿吉布斯不等式来用,所以KL散度绝对是大于等于0的。
要Q这个模型和P这个模型非常的接近,我们要做的就是要找到交叉熵最小的那个值,所以交叉熵这个式子本身就可以作为损失函数。
对于之前猫的例子:
交叉熵就可以写成:
最后得到的形式:
相比少了求和,因为在训练过程中是迭代进行的