让咱们试着去理解最普遍使用的损失函数-交叉熵。框架
交叉熵(也称为对数损失)是分类问题中最经常使用的损失函数之一。可是,因为当今庞大的库和框架的存在以及它们的易用性,咱们中的大多数人经常在不了解熵的核心概念的状况下着手解决问题。因此,在这篇文章中,让咱们看看熵背后的基本概念,把它与交叉熵和KL散度联系起来。咱们还将查看一个使用损失函数做为交叉熵的分类问题的示例。函数
为了开始了解熵到底指的是什么,让咱们深刻了解信息理论的一些基础知识。在这个数字时代,信息是由位(0和1)组成的。在通讯时,有些位是有用的,有些是多余的,有些是错误的,等等。当咱们传递信息时,咱们但愿尽量多地向接收者传递有用的信息。学习
在Claude Shannon的论文“通讯数学理论(1948)”中,他指出传输1位信息意味着将接收者的不肯定性下降2倍。编码
让咱们看看他是什么意思。例如,假设一个地方的天气是随机的,天天都有50-50个晴天或下雨的机会。 spa
如今,若是一个气象站告诉你明天会下雨,那么他们已经把你的不肯定性下降了2倍。起初,有两种可能性相同,但在收到气象站的最新消息后,咱们只有一种可能性。在这里,气象台给咱们发送了一点有用的信息,无论他们如何编码这些信息,这都是真的。3d
即便发送的消息是“未雨绸缪”的,每一个字符占用一个字节,消息的总大小对应40位,但它们仍然只传递1位有用信息。orm
假设天气有8种可能的状态,全部的可能性都同样。 blog
如今,当气象台给你次日的天气时,他们会把你的不肯定性下降8倍。因为每一个事件都有1/8的机会发生,所以折减系数为8。 事件
但若是可能性不同呢?好比说,75%的概率是晴天,25%的概率是雨天。 get
如今,若是气象台说次日会下雨,那么你的不肯定性就下降了4倍,这是2位信息。不肯定性的下降只是事件几率的倒数。在这种状况下,25%的反比是4,对数(4)到基2等于2。因此,咱们获得了2位有用的信息。
若是气象台说次日会是晴天,那么咱们就能获得0.41位有用的信息。那么,咱们平均要从气象站获得多少信息呢?
好吧,有75%的可能性明天会是晴天,这给了你0.41比特的信息,25%的可能性明天会下雨,这给了你2比特的信息,这至关于,
咱们平均天天从气象站获得0.81位信息。因此,咱们刚才计算的是熵。这是一个很好的衡量事件有多不肯定的指标。它是由,
熵的方程如今彻底有意义了。它测量你天天学习天气时获得的平均信息量。通常来讲,它给出了咱们从一个给定几率分布的样本中获得的平均信息量,它告诉咱们几率分布是多么不可预测。
若是咱们生活在一个天天都是晴天的沙漠中间,平均来讲,咱们天天从气象站得不到多少信息。熵将接近于零。另外一方面,若是天气变化很大,熵就会大得多。
如今,咱们来谈谈交叉熵。它只是平均消息长度。考虑到8种可能的天气条件的相同示例,全部这些条件都一样可能,每一个条件均可以使用3位编码。
这里的平均消息长度是3,这就是交叉熵。但如今,假设你生活在一个阳光充足的地区,那里的天气几率分布以下:
天天有35%的可能性是晴天,只有1%的可能性是雷雨。因此,咱们能够计算这个几率分布的熵,
Entropy = -(0.35 * log(0.35) + 0.35 * log(0.35) + 0.1 * log(0.1) + 0.1 * log(0.1) + 0.04 * log(0.04) + 0.04 * log(0.04) + 0.01 * log(0.01) + 0.01 * log(0.01))
Entropy = 2.23 bits
注意,这里使用的二元的记录。
因此,平均来讲,气象台发送3位,但收信人只能获得2.23个有用的位。咱们能够作得更好。
例如,让咱们这样更改代码:
咱们如今只使用2位表示晴天或部分晴天,3位表示多云和大部分多云,4位表示小雨和中雨,5位表示大雨和雷雨。天气的编码方式是明确的,若是你连接多条信息,只有一种方法能够解释比特序列。例如,01100只能表示部分晴天,而后是小雨。因此,若是咱们计算电台天天发送的平均比特数,
35%*2 + 35%*2 + 10%*3 + 10%* 3+ 4%*4 + 4%*4 + 1%*5 + 1%*5 = 2.42 bits
这是咱们的新的和改进的交叉熵,比以前的3位要好。如今,假设咱们在不一样的地方使用相同的代码,那里的天气正好相反,并且大部分时间都在下雨。
咱们计算交叉熵,
1%*2 + 1%*2 + 4%*3 + 4%* 3+ 10%*4 + 10%*4 + 35%*5 + 35%*5 = 4.58 bits
咱们获得4.58比特。大约是熵的两倍。平均而言,电台发送4.58位,但只有2.23位对接收者有用。它发送的信息是每条消息所需信息的两倍。这是由于咱们使用的代码对天气分布作了一些隐含的假设。例如,当咱们对晴天使用2位消息时,咱们隐式地预测晴天的几率为25%。这是由于负二元对数(0.25)给出2。
一样,咱们计算全部的天气条件。
分母中2的幂对应于用于传输消息的位数。如今,很明显,预测的分布q与真实的分布p有很大的不一样。
所以,如今咱们能够将交叉熵表示为真几率分布p和预测几率分布q的函数,其表示为:
注意,咱们示例中使用的是以2为基数的。
如你所见,它看起来与熵方程很是类似,除了咱们在这里使用预测几率的对数。若是咱们的预测是完美的,即预测分布等于真分布,那么交叉熵就是简单的熵。可是,若是分布不一样,那么交叉熵将比熵大一些位。交叉熵超过熵的量称为相对熵,或者更常见的称为Kullback-Leibler散度(KL散度)。简而言之,
从上面的例子,咱们获得K-L散度=交叉熵 - 熵=4.58–2.23=2.35位。
如今,让咱们在应用程序中使用交叉熵。考虑到咱们正在训练一个图像分类器来对外观基本类似的不一样动物进行分类,例如浣熊、小熊猫、狐狸等等。
所以,对于可能的7个类中的每个,分类器估计一个几率,这称为预测分布。因为这是一个有监督的学习问题,咱们知道真实的分布。
在上面的例子中,我拍摄了一只浣熊的图像,因此在真实分布中,它的几率是100%,其余的几率是0。咱们能够用这两种分布之间的交叉熵做为代价函数,称之为交叉熵损失。
这只是咱们前面看到的方程,除了它一般使用天然对数而不是二元对数。这对于训练来讲并不重要,由于二元对数(x)等于天然对数(x)/log(2),其中分母是常数。
所以,当类几率被称为一个热向量时(这意味着一个类有100%,其他的都是0),那么交叉熵就是真类估计几率的负对数。
在这个例子中,交叉熵=1*log(0.3)=-log(0.3)=1.203
如今,当真类的预测几率接近0时,代价将变得很是大。但当预测几率接近1时,成本函数接近于0。
因为获得的损失较多(因为预测的分布过低),咱们须要为每一类训练更多的例子来减小损失量。
咱们以气象站更新第二天天气为例,了解香农信息论的概念。而后咱们把它与熵和交叉熵联系起来。最后,咱们以一个例子来讲明交叉熵损失函数的实际应用。但愿本文能澄清熵、交叉熵和KL散度背后的基本概念及其相互关系。