0. 前言
本文将直奔主题从数学角度介绍交叉熵函数,以及在深度学习中使用交叉熵函数作为损失函数的理由。
对于交叉熵在信息论中的实际意义,以及相关香农熵等概念在本文不做赘述介绍。
1. 交叉熵介绍
交叉熵(Cross-entropy)是一种常用于衡量两个概率分布之间差异的量度。具体来说,假设有两个概率分布 p i p_i pi 和 q i q_i qi,其中 p i p_i pi 表示 i i i事件真实概率分布, q i q_i qi 表示 i i i事件模型输出的概率分布。交叉熵的计算公式为:
特别地,对于二分类问题(是非问题)交叉熵可以写为:
2. 交叉熵函数数学特性
对于真实概率 p ∈ ( 0 , 1 ) p∈(0,1) p∈(0,1)实际上是一个定值,在交叉熵函数中可以作为一个常数。而模型输出概率 q ∈ ( 0 , 1 ) q∈(0,1) q∈(0,1)是一个变化量,在交叉熵函数中作为一个变量。
为了后续推导简便,指定对数的底为e。这样上面二分类问题的交叉熵函数可以写为:
其一阶导数为:
由于二阶导数恒大于0:
可知在 q ∈ ( 0 , 1 ) q∈(0,1) q∈(0,1)区间, H ′ ( q ) H'(q) H′(q)是从负无穷到正无穷的单调递增函数, H ( q ) H(q) H(q)是一个凹函数。
又由于当 q = p q=p q=p时, H ′ ( q ) = 0 H'(q)=0 H′(q)=0。可知在 q = p q=p q=p时, H ( q ) H(q) H(q)取最小值。
3. 为什么在二分类问题中使用交叉熵函数作为损失函数?
这个问题可以拆分为两个问题:
3.1 为什么交叉熵函数可以作为损失函数?
因为机器学习的过程是通过不断优化(降低)损失函数的值,来达到预测值 q q q不断接近真实值 p p p的目的。交叉熵函数由于是一个凹函数,且在 q = p q=p q=p时, H ( q ) H(q) H(q)取最小值(尽管这个最小值不是0),刚好满足作为损失函数的要求。
3.2 交叉熵函数作为损失函数好在哪?
为什么不用简单现有的均方差函数作为损失函数,而引入交叉熵函数?
这是因为上面所述特性:在 q ∈ ( 0 , 1 ) q∈(0,1) q∈(0,1)区间, H ′ ( q ) H'(q) H′(q)是从负无穷到正无穷
的单调递增函数,也就是说相比于均方差函数,交叉熵函数的梯度绝对值更大。而更大的梯度绝对值意味着在学习时可以更快更容易收敛。
这一点也可以通过两个函数的3D作图上看出:
明显看出绿色交叉熵的梯度明显比蓝色平方差大,这样就可以更快地收敛。
画图源码
from matplotlib import pyplot as plot import numpy as np from mpl_toolkits.mplot3d import Axes3D figure = plot.figure() axes = Axes3D(figure) x = np.arange(0.01, 0.99, 0.01) y = np.arange(0.01, 0.99, 0.01) x, y = np.meshgrid(x, y) z1 = (x - y) ** 2 axes.plot_surface(x, y, z1, cmap='Blues_r') z2 = -x * np.log(y) - (1 - x) * np.log(1 - y) axes.plot_surface(x, y, z2, cmap='Greens_r') plot.show()