python交叉熵函数 numpy 交叉熵

Pytorch-交叉熵一条信息的信息量大小和它的不确定性有很大的关系。一句话如果需要很多外部信息才能确定,我们就称这句话的信息量比较大 。比如你听到“云南西双版纳下雪了”,那你需要去看天气预报、问当地人等等查证(因为云南西双版纳从没下过雪) 。相反,如果和你说“人一天要吃三顿饭” , 那这条信息的信息量就很小,因为这条信息的确定性很高 。
那我们就能将事件的信息量定义如下(其中表示事件发生的概率):
信息量是对于单个事件来说的  , 但是实际情况一件事有很多种发生的可能 , 比如掷骰子有可能出现6种情况 , 明天的天气可能晴、多云或者下雨等等 。熵是表示随机变量不确定的度量,是对所有可能发生的事件产生的信息量的期望。公式如下:
的曲线如下:
结合熵的公式(2)以及曲线,当这些所有可能发生事件的概率比较?。ń咏?)或者比较大(接近1)时,熵的值会比较?。蝗绻录⑸母怕始仍独?也远离1时,熵的值就会比较大 。
例如 , 如下三组事件比较:
1)事件概率均等,[0.2500, 0.2500, 0.2500, 0.2500],熵为2;
2)事件概率比较靠近0或者1,[0.1, 0.1, 0.1, 0.7] , 熵为1.3568;
3)事件概率极其靠近0或者1,[0.001, 0.001, 0.001, 0.999],熵为0.0313.
熵的一种比较特殊的情况就是掷硬币  , 只有正、反两种情况,该种情况(二项分布或者0-1分布)熵的计算可以简化如下:
其中,表示正面概率 。
相对熵又称KL散度 , 用于衡量对于同一个随机变量的两个分布和之间的差异。在机器学习中,常用于描述样本的真实分布  , 例如[1,0,0,0]表示样本属于第一类 , 而则常常用于表示预测的分布 ,例如[0.7,0.1,0.1,0.1] 。显然使用q(x)来描述样本不如准确,需要不断地学习来拟合准确的分布。
KL散度的公式如下:
KL散度的值越小表示两个分布越接近 。
我们将KL散度的公式进行变形,得到:
前半部分就是的熵,后半部分就是我们的交叉熵:
机器学习中,我们常常使用KL散度来评估predict和label之间的差别,但是由于KL散度的前半部分是一个常量,所以我们常常将后半部分的交叉熵作为损失函数,其实二者是一样的 。
交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式 。与二次代价函数相比,它能更有效地促进ANN的训练 。在介绍交叉熵代价函数之前 , 本文先简要介绍二次代价函数,以及其存在的不足 。
ANN的设计目的之一是为了使机器可以像人一样学习知识 。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大 。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐 。同理,我们希望:ANN在训练时 , 如果预测值与实际值的误差越大,那么在反向传播训练的过程中 , 各种参数调整的幅度就要更大,从而使训练更快收敛 。然而 , 如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大 , 参数调整的幅度可能更?。?训练更缓慢 。
以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数 , 该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):

推荐阅读