先简单了解信息论中信息量和信息熵的概念,再通过信息熵引出相对熵(KL散度)和交叉熵,并说明为什么交叉熵可以用于机器学习中分类任务的损失函数。
在信息论发明出来之前,人们是无法精确地用数值衡量一个事件包含的信息量的(如,小明这次考试得了100分包含多少信息?),即信息的量化。信息论之父香农提出量化一个事件包含的信息量可以基于这样的想法:一个不太可能发生的事件发生了,要比一个非常可能发生的事件提供更多的信息(如,上面的例子,如果小明之前经常考试是100分,那么这次考试得100的概率本来就很高,这是在我们的预料之内的,所以没有什么好惊讶的,也不需要有什么信息需要进一步了解;如果小明以前是个学渣,每次考试都是0分,所以按照以前的统计经验,他得100分的概率几乎为0,那这次考试得了100分就不得了了,这里面一定包含很多未知的信息需要我们了解(调查):小明抄袭了?痛改前非奋发图强了?还是吃了叮当猫的记忆面包,一下子变成了天才?等等),这便可以得出事件发生概率和该事件包含信息量的量化关系:
这便是香农信息量,又称为自信息(self-information),其代表一个事件所能够提供信息的多少(公式中是底数为 2 的对数,信息量用比特(bit)衡量,那么信息的多少就是多少比特)。然而,自信息只能衡量单个事件的信息量,而整个系统呈现的是一个分布(多个事件的集合),因此在信息论中,使用信息熵来对整个系统事件集合包含的信息进行量化,即对概率分布进行量化,计算公式为:
其中,N为x所有可能取值的数量,为x取值时的概率。
从公式可以看出,信息熵的本质是香农信息量log(1/p)的期望,即各个事件包含信息的加权平均。从信息论的角度来说,信息熵就是按照真实分布p来衡量识别一个样本的所需要的编码长度(上面提到信息量使用比特衡量,此处的编码长度就是一个数据(事件)至少需要多少个比特进行编码)的期望,即平均最小编码长度。
为了引出相对熵(KL散度)和交叉熵,我们先使用一个例子:含有4个字母(A,B,C,D)的数据集中,真实分布P=(1/2,1/2,0,0),即A和B出现的概率均为1/2,C和D出现的概率都为0。计算H(p)为1(计算方法:),即只需要1位编码即可编码A和B。如果使用分布Q=(1/4, 1/4, 1/4, 1/4)来编码则得到H(p,q)=2,即需要2位来编码识别A和B(当然还有C和D,尽管C和D并不会出现,因为真实分布P中C和D出现的概率为0,这里就指定概率为0的事件不会发生,即)。(引申:其实从这里就可以解释为什么霍夫曼编码使用长短不一的编码方式)。从这个例子可以看出根据非真实分布q得到的平均编码长度H(p,q)(需要使用更多的载体存储信息)大于根据真实分布p得到的平均编码长度H(p)(最优的存储信息的方式)。事实上,根据Gibbs'inequality可知,H(p,q)>=H(p)恒成立,当q为真实分布p时二者相等。我们将由q得到的平均编码长度与由p得到的平均编码长度的差(额外多出的信息载体)称为相对熵,也称为KL散度:
上式中的的H(p,q)便是交叉熵,在信息论编码中,它说明的是使用q分布对原分布为p的字符集进行编码所需要的平均编码长度(信息量的期望)。
如果我们将p和q的概念从上面例子中字符的概率再引申扩展下,即:p为数据的真实概率分布,而q为机器学习算法预测数据的分布,那么KL散度便可以用来衡量两个分布的差异,可以将其作为机器学习的目标函数,通过训练尽量降低KL散度,就可以降低两个分布的差异,预测模型分布q就越接近真实分布p。然而,由上面的公式可以看出,交叉熵只是比KL散度少了H(p)一项,由于在机器学习中H(p)是固定的(真实分布的信息熵),所以在优化的时候我们只需要尽量降低H(p,q)的值(这便是交叉熵可以作为分类算法损失函数的原因)。所以,使用交叉熵作为算法的误差函数即可。
下面是单个样本的**交叉熵损失**函数公式,其中N为分类任务中的类别数量:
多个样本(mini-batch)的平均交叉熵损失函数公式,M为样本数量:
以上的公式中,通过sigmoid(二分类)函数或者softmax(多类别分类)计算得到。
参考:
作者能力有限,不正确之处欢迎斧正。