交叉熵(cross entropy)的由来
1、信息量
信息量是指事件发生概率的度量,一个事件发生的概率越低,则这个事件所包含的信息量越大。
信息量的定义(香农信息量):
假设是一个离散型随机变量,其取值集合为,概率分布函数为,,我们定义事件的信息量为:
一个事件发生的概率越大,则它所携带的信息量就越小,而当p(x0)=1p(x0)=1时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。例如,“太阳从东边升起,西边落下”这句话所携带的信息量为0。因为,事件x=“太阳从东边升起,西边落下”,,。
2、什么是熵?
考虑另一个问题,对于某个事件,有nn种可能性,每一种可能性都有一个概率p(xi)p(xi) 这样就可以计算出某一种可能性的信息量。举一个例子,假设你拿出了你的电脑,按下开关,会有三种可能性,下表列出了每一种可能的概率及其对应的信息量
序号 | 事件 | 概率p | 信息量I |
---|---|---|---|
A | 电脑正常开机 | 0.7 | -log(p(A))=0.36 |
B | 电脑开机蓝屏 | 0.2 | -log(p(B))=1.61 |
C | 电脑无法开机 | 0.1 | -log(p(C))=2.30 |
注:该对数取自然对数
熵用来表示所有信息量的期望,即:
其中n代表所有的n种可能性,所以上面的问题结果就是:
如,投掷硬币只有两种可能,正面朝上或反面朝上。我们称之为0-1分布问题(二项分布的特例),对于这类问题,熵的计算方法可以简化为如下算式(二分类交叉熵):
3、相对熵(KL散度)
相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异
即如果用P来描述目标问题,而不是用Q来描述目标问题,得到的信息增量。
在机器学习中,P往往用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布,比如[0.7,0.2,0.1]
直观的理解就是如果用P来描述样本,那么就非常完美。而用Q来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些“信息增量”才能达到和P一样完美的描述。如果我们的Q通过反复训练,也能完美的描述样本,那么就不再需要额外的“信息增量”,Q等价于P。
相对熵的计算公式:
4、交叉熵
对相对熵变形可得:
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:
,由于KL散度中的前一部分−H(y)−H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
交叉熵(cross entropy)
1.二次代价函数的不足
ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。
以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):
在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。
从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢。
其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:
其中,表示代价,表示样本,表示实际值,表示输出值,表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:
目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导如下:
其中,z表示神经元的输入,表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:
如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。
可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数,具体请自行google之。
2.交叉熵代价函数
换个思路,我们不换激活函数(仍然是sigmoid激活函数),而是换掉二次代价函数,改用交叉熵代价函数:
其中,表示样本,表示样本的总数。那么,重新计算参数的梯度:
其中(具体证明见附录):
实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。
3.交叉熵代价函数是如何产生的?
以偏置b的梯度计算为例,推导出交叉熵代价函数:
在第1小节中,由二次代价函数推导出来的b的梯度公式为:
,我们想找到一个代价函数使得:
即:
对两侧求积分,可得:
而这就是前面介绍的交叉熵代价函数。
总结:
在使用sigmoid函数作为神经元的激活函数时,最好使用交叉熵代价函数(cross-entropy)代替均方差代价函数(mean-square),避免训练太慢。
另外,交叉熵函数的形式是 而不是 ,其中表示实际输出(即模型预测输出),y表示预期输出(即标签值)。当期望时,没有意义。而是sigmoid函数的实际输出,永远不会等于0或1,只会无限接近于0或1,因此不存在这个问题。