深度学习中交叉熵损失函数背景,公式推导详解
首先,我们来看下交叉熵损失函数的表达式:
其中上面那个方程式是用于计算最后一层激活函数为softmax函数的交叉熵损失函数,下面这个是用于计算最后一层激活函数为sigmoid函数的交叉熵损失函数。
下面我将从为什么使用交叉熵函数、交叉熵函数数学推导、为什么对于sigmoid和softmax两个函数的交叉熵损失函数有差别这三个方面来讲讲我的理解:
一、为什么使用交叉熵误差函数
交叉熵损失函数是基于什么样的背景下提出来的呢?是怎么提出来的?要想清楚这些,首先我们回归到最原始的二次损失计算公式:
这是一个经典的损失函数,而对于神经网络在训练过程中的梯度更新,最后一层的网络参数W,b的偏导数由下面公式给出:
可以看到,其为含有激活函数的导数的一个乘积,当我们选用最经典的sigmoid函数时,我们发现其导数:
在|Z|值比较大的时候数值很小,这使得模型趋于饱和,学习速率这时候会变得很慢,那有什么办法可以解决这个问题呢?一个办法就是可不可以想个办法不要激活函数导数这一项,可不可以通过构建一个新的损失函数,最后得到的关于w的偏导数是(a-y)*x,(这个x表示输出层前一层神经元输出值)。这就是交叉熵损失函数的背景。
二、交叉熵损失函数数学推导
可以看到,其实这里计算得到的交叉熵损失函数对于所有的激活函数满足:激活函数导数=激活函数*(1-激活函数),都适用,也就是说最后的到的偏导数里面都没有激活函数的导数这一项,所以根据sigmoid和softmax函数的导数特性,他们呢都是满足这个要求的,也就是说都可以通过上面那个交叉熵函数技术损失函数的。
三、为什么sigmoid和softmax的交叉熵函数不同
其实刚才也说了,它们两的损失函数其实是一样的,都可以用上面推导出的那个交叉熵函数作为损失函数,但是由于softmax另外一些特性,使得他的交叉熵损失函数可以简化一下,具体如下:
四、总结
最后再来看看交叉熵损失函数在求参数偏导数后结果是:
可以看到已经没有激活函数的导数一项,其学习速率只和(a-y)和x(表示输出层前一层神经元输出值)有关,起到了加快神经网络训练速度,有效抑制神经网络饱和的问题。