深入理解均方误差、交叉熵、似然估计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解均方误差、交叉熵、似然估计相关的知识,希望对你有一定的参考价值。

参考技术A

简单的讲,在深度学习中,我们希望训练之后的模型对输入 的输出 尽可能的和真实标签 接近。

要比较两个值的大小之前的差异,最简单想法就是求比值或者求差的绝对值,如果是比值的话就是越接近于1两个数值越接近,相减求差绝对值的话,就是越接近于0越接近。

这里的最小化均方误差其实就是类似于求差值的方法,均方误差越小,两个值的差距就越小。这很容易想到,所以也容易理解,一般我们学习深度学习,第一个学的损失函数就是均方误差 , 其中 是期望输出, 是实际输出,下面统一使用这个定义。

但是随着学习的深入,我们会发现当使用sigmoid激活输出的时候,可能存在一个训练速度越来越慢的问题。因为我们求损失的偏导,会发现:

它都和sigmoid函数的导数 有关,再回想一下sigmoid的曲线

当 的值趋近于1或者0时,曲线的会变得十分平缓,也就是偏导会很小,于是梯度下降每次的移动也会很微小,于是就造成了训练难以继续下去。

为了解决这个问题,然后我们引入了交叉熵损失:

交叉熵这个词乍一听还真有些不明觉厉,不过从形式上来看,它确实达到了损失函数的要求,并且也解决了均方误差训练速度减慢的问题。

观察上面的表达式,涉及 的单项都是负的,而前面又乘了个负数,因此 ,并且,我们可以假设某个输入 对应的 是0,而且 ,那么 就会非常小,反之 如果接近1,那么 会变得很大,当然假设 是1的时候也能达到这种效果,这些都表明了交叉熵作为损失函数的特性。而它又是怎么解决梯度过小而导致的训练变慢问题的呢?

让我们来计算一下它对于权重 的偏导,并且把 代进去:

而基于sigmoid函数的性质,我们知道 ,带入上面的方程,发现 恰好被抵消了:

完美避免了因为 变小而引起的训练慢的问题,并且,从上面的等式中,我们也可以很容易的看出当误差越大时,偏导也会越大,即学的越快,这跟我们人类学习东西的直觉是一致的,发现的错误越大,学到的东西越多~

当然,这个交叉熵并不是凭空想出来的,顾名思义,我们也许会猜出的一二,它应该和信息论有关,说的没错,接下来我们就去信息论那边找找线索。

信息论的基本想法就是:一个不太可能的事情发生了,要比一个非常可能发生的事情发生,提供更多的信息。

比如,有个消息说:“今天早上太阳升起”,信息量是如此之少,以至于不值一提;但是如果另一个消息是:“今天早上会有日食”,这样信息量就丰富了。于是,可以用这一基本思想来量化信息。特别是:

为了满足上述3个性质,我们定义一个事件 的自信息(self-information)为:

其中 是底数位 的自然对数,因此这里 的单位是奈特。

当 是连续的,我们使用类似的关于信息的定义,但有些源于离散形式的性质就丢失了。例如一个具有单位密度的事件的信息量为0,但是不能保证它一定发生。

自信息值处理单个的输出。我们可以用香农熵(shannon entropy)来对整个概率分布中的不确定性总量进行量化:

换言之,一个分布的香农熵指遵循这个分布的事件所产生的期望信息总量。

如果对于同一个随机变量 有两个单独的概率分布 和Q(x),可以使用KL散度来衡量着两个分布的差异:

那这些要怎么和前面的损失函数联系起来呢?

回想一下最简单的MNIST手写数字识别的神经网络,输出神经元一共有10个,分别代表0~9,然后我们取了值最大的那个作为模型的解。于是,简单的类比,我们可以把10个神经元的输出,看成是模型猜测的某个输入样本

它是不是某个数字的概率,而同样的标签也代表了是否是某个数字的概率。这样,我们就有了关于随机变量 的两个独立的概率分布,一个是模型的,另一个是训练数据本身的,而我们所希望的,就是让模型的概率分布接近于真实的训练数据的概率分布,为了衡量他们之间的差异,刚好 散度就用上了。

也就是说要让模型和真实情况最接近,那么就要最小化 KL散度 ,而显然训练数据的分布 是固定的,并不会受到模型参数的影响,于是我们把左边的 消掉,就得到了 交叉熵

最小化交叉熵,就是最小化KL散度,也就是最小化模型和真实之间的差距。

正如前面所说的,我们模型的输出 代表了是对应标签(也就是 )的概率,而 就是不是对应标签(也就是 )的概率,于是单个样本的香浓熵 ,然后放到所有的样本上再取平均,就得到了最开始所学的交叉熵损失函数:

哈,总算知道这个鬼公式是怎么来的了吧,它并不是凭空想出来的。不过,实际上我们也可以通过想办法消除 这项的过程,来构造出交叉熵这个形式的函数。为了简单起见,我们从 入手,想办法让它满足

既然是 引起的训练速度慢,那么我们就想办法把它消掉。根据链式法则,于是有

而 ,于是

我们让它等于 ,便有了

然后将上面的式子对 积分,当当当,交叉熵形式的公式出来啦:

就是这么奇妙,这也进一步说明了交叉熵可以作为损失函数,并弥补了均方误差不足的原因~~~

接下来,我们再来说一下似然估计,个人觉得,最大似然估计才是我们模型训练的本质。

我们先来介绍一下似然函数( 如果你已经了解似然函数,可以跳过这一块介绍 ),它是一种关于统计模型中的参数的函数,你可以把它理解为条件概率的逆运算。

条件概率对大多数人而言是非常好理解并且自然的,但是它的逆反,往往会让人感觉有些难受,这需要一点时间来习惯这种思维,一旦习惯了,你也会觉得似然函数也是自然而然的。这是初学者常见的困惑,就像很多程序员刚开始接触递归的时候,可能会很难受,很反人类,但是一旦了解它了,就会变得爱不释手,觉得这才是人类该有的思维。总之,我觉得似然函数在机器学习里面至关重要,你需要花一点时间去理解它,先从我们最熟悉的思维入手。

大家都知道概率,是用于在已知一些参数的情况下,预测接下来在观测上所得到的结果;而似然性,恰好相反,用于在已知某些观测所得到的结果时,对有关事物之性质的参数进行估值。而机器学习不正是通过已经观测到的结果即训练数据,来对事物性质的参数进行估计,即得到相应的权重和偏差的模型。

在已知某个参数 时,事件 会发生的概率:

根据贝叶斯定理,有

因此,我们可以反过来构造表示似然性的方法:已知事件 发生,运用似然函数 ,来估计参数 的可能性。形式上看,似然函数也是一种条件概率函数,只不过我们关注点由概率到结果变成了由结果到概率,

注意到这里并不要求似然函数满足归一性,一个似然函数乘以一个正的常数之后仍然是似然函数。对所有 都可以有似然函数:

举个最简单的抛硬币的例子来更加具象化的理解似然函数(其实是维基上的例子...)

考虑投掷一枚硬币的实验。通常来说,已知掷出一枚“公平的硬币”(正面朝上和反面朝上的概率都为0.5), 即正面(Head)朝上的概率为 ,便可以知道投掷若干次后出现各种结果的可能性。

比如说,投两次都是正面朝上的概率是0.25。用条件概率表示,就是:

如果一个硬币的质量分布不够均匀, 那么它可能是一枚"非公平的硬币"

在统计学中,我们关心的是在 已知一系列投掷的结果时,关于硬币投掷时正面朝上的可能性的信息

我们可以建立一个统计模型:假设硬币投出时会有 的概率正面朝上,自然会有 的概率反面朝上。

这时,通过观察已经发生的两次投掷,条件概率可以改写成似然函数:

也就是说,如果我们取 的话,似然函数的值就是0.25。不过注意,这个反过来是不成立的,不能根据似然性是0.25反推出

那么,如果我们取 的话,似然函数的值就变成0.36了,emm...而且还是变大了...

这说明,如果参数 取0.6的话,更有希望观察到两次正面朝上的结果,即参数 比 更有说服力,更合理。

总之, 似然函数的重要性不是它的具体取值,而是当参数变化时函数到底变小还是变大。

对同一个似然函数,其所代表的模型中,某项参数值具有多种可能,但如果存在一个参数值,使得它的函数值达到 最大 的话,那么这个值就是该项参数最为“合理”的参数值。这便是我们稍后要重点说的 最大似然估计

在这个例子中,似然函数等于:

显然,如果取 是最能看到两次都为正面的结果的。

接下来,我们要把最大似然估计用到我们模型的学习中。

考虑到我们有一组真实的样本数据集 ,那么它们应该是独立的由一个位置的真实数据分布 生成的。而假设我们的模型 是由一个由 (也就是一堆权重 和偏差 )确定的相同空间上的概率分布,那么对 的最大似然估计可以写成

多个概率乘积会因为很多原因不方便计算,比如计算的时候会发生数值太小而溢出的情况,于是我们就对其取对数,因为单调性并不会发生改变,所以最大似然估计就等价于

观察上面的等式,我们发现这个值跟样本数量有关,样本越多值越小,于是我们把它缩放一下,除以样本数量就变成了训练数据经验分布 相关的期望表示

基于直觉(当然也可以证明,证明过程就留给写书的人吧orz...),就是当 和训练集上的经验分布 之间的差异最小时,似然函数取得最大值。而他们之间的差异可以通过KL散度来衡量,带入前面KL散度的公式,于是就有了

而经验分布显然是基于训练数据固定的,然后最小化KL散度又变成了最小化两个分布之间的交叉熵,也就是负对数似然...

然后咱从最大似然估计出发又到最小化交叉熵了~~~真是万变不离其宗呐...其本质可以说都是让模型去拟合训练数据,只是方法有所不同罢了。

实际上,任何一个由负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概率分布之间的交叉熵。例如, 均方误差就是经验分布和高斯模型之间的交叉熵

什么..原来均方误差也是交...交叉熵......

说的没错,要不然让我们来推导一下

实际上,我们只要把上面的 变成一个不知道 的高斯分布函数作为咱的似然函数:

然后还是把最大化这个函数变成最大化它的对数,然后分别对 和 求偏导,让其偏导等于0,求出方程的解便是其极值。

这个方程的解是 .这的确是这个函数的最大值,因为它是 里头惟一的一阶导数等于零的点并且二阶导数严格小于零。

同理,我们对 求导,并使其为零。

这个方程的解是

因此,其关于 的最大似然估计为:

然后这玩意不就是均方误差吗orz....

均方差交叉熵及公式推导

交叉熵损失函数

交叉熵损失函数常作为深度学习分类任务的损失函数,本文主要对交叉熵进行了一个较为详细的了解。

交叉熵的几种表达形式

交叉熵的loss函数形式是比较统一的,之所以经常见到不同形式的交叉熵主要取决于你的分类任务是二分类还是多分类。

Binary CrossEntropy

[L = -frac{1}{n} sum_i^n{{y_i log{a_i} + (1-y_i) log{(1-a_i)}}} ]

Categorical CrossEntropy

[egin{aligned} L & = -frac{1}{n} sum_i^n{y_{i1}}log{a_{i1}} + {y_{i2}log{a_{i2}} + ... + {y_{im}}log{a_{im}}} & = -frac{1}{n} sum_i^n sum_j^m {y_{ij}} log{a_{ij}} end{aligned}]

其中,n是样本数,m是类别数

对数似然函数与交叉熵的关系

注:以下比较是在单个样本下的对数似然函数公式及交叉熵公式

二元分布下对数似然函数的公式为

[L = ylnp(x) + (1-y)ln(1-p(x)) ]

交叉熵的公式为

[H(p, q) = -sum{ p(x)log q(x) } ]

看起来两者公式是非常一致的。

这里X的分布模型即样本集的真实分布模型(p(x)),这里模型(q(x))即想要模拟真实分布模型的机器学习模型。可以说交叉熵是直接衡量两个分布,或者说两个model之间的差异。而似然函数则是解释以model的输出为参数的某分布模型对样本集的解释程度。因此,可以说这两者是“同貌不同源”,但是“殊途同归”啦。

均方误差与交叉熵误差(sigmoid为激活函数)

为什么常常使用交叉熵误差而不是均方误差作为神经网络的损失函数?可以从两个函数的梯度上看出一些端倪。

均方误差(MSE)与梯度更新

首先是均方误差,均方误差的损失函数为

[L=frac{1}{2n} {sum_{i}{||a_i - y_i||^2}} ]

(n)为样本数量,(a_i)为神经网络对当前样本的预测值,(y_i)为当前样本的标签。(a_i = sigma(z_i) = sigmoid(z_i) = sigmoid(wx_i+b))

简化上式为(n=1)的情况,此时

[L = frac{(a-y)^2}{2} ]

那么参数(w)(b)的梯度分别为

[egin{aligned} frac{partial{L}}{partial{w}} & = 2 * 1/2 * (a-y) * sigma‘(z) * (wx+b)‘_w & = (a-y) * sigma‘(z) * x end{aligned}]

[egin{aligned} frac{partial{L}}{partial{b}} & = 2 * 1/2 * (a-y) * sigma‘(z) * (wx+b)‘_b & = (a-y) * sigma‘(z) * 1 end{aligned}]

交叉熵误差与梯度更新

其次是交叉熵误差,交叉熵误差的损失函数为

[L = -frac{1}{n} sum_i{{y_i log{a_i} + (1-y_i) log{(1-a_i)}}} ]

同样简化上式为(n=1)的情况,此时

[L = -(y log{a} + (1-y) log{(1-a)}) ]

计算w和b的梯度为

[egin{aligned} frac{partial{L}}{partial{w}} & = -[frac{y}{a} * sigma‘(z) * x -frac{1-y}{1-a}*sigma‘(z)*x]& = -[ sigma‘(z)*x*(frac{y}{a} - frac{1-y}{1-a}) ] & = -[ sigma(z)(1-sigma(z))*x*(frac{y}{a}-frac{1-y}{1-a}) ] & = -[ a(1-a)*x*(frac{y}{a}-frac{1-y}{1-a}) ] & = -x[ a(1-a)frac{y-a}{a(1-a)} ] & = x(a-y) \\end{aligned}]

[egin{aligned} frac{partial{L}}{partial{b}} & = -[ frac{y}{a}*sigma‘(x)-frac{1-y}{1-a}*sigma‘(x)] & = a - y \\end{aligned}]

对比与结论

对比上述两个损失函数对参数w和b求导后的结果可以看出,均方误差求导后的梯度始终跟(sigma‘(z))是有关系的,而交叉熵误差则不然。可见,关键就出在激活函数

[sigma(x) = sigmoid(z) = frac{1}{1+e^{-z}} ]

sigmoid的函数图像存在两端导数趋于零的特性,因此当z的值较大时,(sigma‘(z))的值会趋于零,进而降低神经网络的收敛速度,因此不建议使用均方误差作为神经网络分类问题的损失函数。因此,结论为,当神经网络最后一层的激活函数是sigmoid函数时,使用二进制交叉熵损失函数可以解决sigmoid梯度消失的问题

技术图片

多分类交叉熵函数的梯度更新(softmax为激活函数)

首先明确softmax激活函数的表达式,当样本数n=1时,softmax函数可以表达为 $$a_{j} = frac{e^{z_j}}{sum_k^m{e^{z_k}}}$$

对应的多分类交叉熵损失函数表达式为

[L = -sum_j^m y_j ln{a_j} ]

对损失函数求导有,

[egin{aligned} frac{partial{L}}{partial{z_j}} & = frac{partial{L}}{partial{a_q}} * frac{partial{a_q}}{partial{z_j}} & = frac{partial{(-sum{y_q log{a_q}})}}{partial{a_q}} * frac{partial{a_q}}{partial{z_j}} & = -sum_q^m{y_q * frac{1}{a_q}} * frac{partial{a_q}}{partial{z_j}} \\end{aligned}]

此时有两个情况需要考虑,

  • (q = j)时,

[egin{aligned}frac{partial{a_q}}{partial{z_j}} = frac{partial{a_j}}{partial{z_j}} & = frac{partial{frac{e^{z_j}}{sum_k^m{e^{z_k}}}}}{partial{z_j}} \\ & = frac{ e^{z_j}sum_k^m{e^{z_k}} - e^{z_j}e^{z_j} }{sum_k^m{e^{z_k}}sum_k^m{e^{z_k}}} & = frac{ e^{z_j}(sum_k^m{e^{z_k}} - e^{z_j})}{sum_k^m{e^{z_k}}sum_k^m{e^{z_k}}} & = frac{ e^{z_j}}{sum_k^m{e^{z_k}}}frac{ sum_k^m{e^{z_k}} - e^{z_j}}{sum_k^m{e^{z_k}}} & = frac{ e^{z_j}}{sum_k^m{e^{z_k}}}(1 - frac{ e^{z_j}}{sum_k^m{e^{z_k}}}) & = a_j(1-a_j) \\end{aligned}]

  • (q eq j)时,

[egin{aligned} frac{partial{a_q}}{partial{z_j}} & = frac{partial{frac{e^{z_q}}{sum_k^m{e^{z_k}}}}}{partial{z_j}}& = frac{0 - e^{z_q}e^{z_j}}{sum_k^m{e^{z_k}}}& = frac{0 - e^{z_q}e^{z_j}}{sum_k^m{e^{z_k}}sum_k^m{e^{z_k}}}& = - frac{ e^{z_q}}{sum_k^m{e^{z_k}}}frac{ e^{z_j}}{sum_k^m{e^{z_k}}}& = - a_q a_j\\end{aligned}]

整合上式之后可以得到最终的结论

[egin{aligned} frac{partial{L}}{partial{z_j}} = frac{partial{L}}{partial{a_q}} * frac{partial{a_q}}{partial{z_j}} & = -sum_q^m{y_q * frac{1}{a_q}} * frac{partial{a_q}}{partial{z_j}} & = -frac{y_j}{a_j}a_j(1-a_j) + a_q a_jsum_{q eq{j}}frac{y_q}{a_q}& = y_j(a_j-1) + a_jsum_{q eq{j}}y_q& = -y_j + a_jsum_{q}y_q& = a_j - y_j\\end{aligned}]

由上式可见,交叉熵与softmax的配合在梯度反向传播的时候计算量非常小,十分高效。

References

以上是关于深入理解均方误差、交叉熵、似然估计的主要内容,如果未能解决你的问题,请参考以下文章

均方差交叉熵及公式推导

损失函数——均方误差和交叉熵

最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络

损失函数

在哪些情况下,交叉熵优于均方误差? [关闭]

交叉熵函数(Cross Entropy)与均方误差损失函数(MSE)对比?为什么选择交叉熵函数?