本文以二分类交叉熵损失函数为例,详细分析了交叉熵损失函数在实际应用中遇到的问题,以及解决办法,并给出了在深度学习中使用的交叉熵损失函数的具体形式。通过本文的叙述,相信能够使读者对深度学习的理解更加深入。
交叉熵损失函数的向量表示
交叉熵损失函数:
其中y为label,
BGD(batch 梯度下降算法):
对于batch梯度下降训练,loss不再是单个样本的loss,而是batch size大小(如m)的损失函数的均值。
写为向量表示为:
其中
Y为batch大小的label向量,P为batch大小的预测正向概率。
交叉熵损失函数的实际应用
自然对数的性质
交叉熵损失函数的表达式:
即对于不同的类别损失函数为:
从上式可知,交叉熵损失函数的主要部分为自然对数。
自然对数的图示如下表示:
如上图所示:
在x=0附近,log(x)抖动很大,即在x=0附近,x的微小变化就会导致log(x)值发生很大变化。而且在x趋近于0时,
由于自然对数的上述性质,会造成交叉熵在0值附近的值的不稳定。
同样会使得梯度计算不稳定,因为当x趋近于0时,导数会趋近于无穷大。
即自然对数的性质,会造成交叉熵损失函数值和梯度在x=0附近的不稳定。损失函数值和导数的不稳定,必然会导致模型的训练不稳定,使得模型收敛变得困难。
值稳定的交叉熵损失函数
由
其中z为输入到sigmoid函数的值
即通过上式的变换,最终交叉熵损失函数由
对于上式,交叉熵
对
对于上式,当
再次进行变形可得:
此时,当
但是, 当
为了得到值稳定的交叉熵损失函数,采用分段函数的形式构建最终稳定的交叉熵损失函数,如下:
即综合了式子(1)和式子(2)的优点,保证了值不会溢出。如下图所示:
统一为一个表达式可得:
Cost函数即向量表达为:
注:上述向量表达式是利用element wise进行计算的。
在tensorflow中,稳定版本的交叉熵损失函数的表达式与上式相同。
梯度稳定的交叉熵损失函数
由
其中
从上式可以得出,计算
这样做的好处在于:
不需要计算
同时规避了sigmoid函数的饱和点,即梯度接近于0的点。对于梯度接近于0的点,梯度不能有效传递,参数不能有效更新。
sigmoid的函数图示如下:
总结
通过以上的叙述可以看到,虽然交叉熵损失函数的形式简单,但是在深度学习实际应用中会遇到值和导数不稳定的问题。为了能够使模型能够更好的训练,采用了分段函数的形式保证了损失函数的值稳定,在后向传输中,跳过sigmoid层,直接计算损失函数对z的导数即
因此在深度学习中,为了更好的模型训练,往往需要对损失函数做相应的调整。