多分类交叉熵损失函数(如何直观了解二进制交叉熵)
多分类交叉熵损失函数(如何直观了解二进制交叉熵)这是我们唯一的特征:x。让我们从10个随机点开始:我在寻找一篇博客文章,能够以一种直观、清晰、简明的方式解释二进制交叉熵/对数损失背后的概念,这样我就可以向Data Science Retreat的学生展示它。因为找不到任何符合我的目标,所以我自己编写了任务:https://www.datascienceretreat.com一个简单的分类问题
点击上方关注,All in AI中国
如果你正在训练二进制分类器,则可能使用二进制交叉熵/对数损失作为损失函数。
你有没有想过使用这种损失函数究竟意味着什么?问题是,考虑到当今的库和框架的易用性,很容易忽略所使用的损失函数的真正含义。
动机
我在寻找一篇博客文章,能够以一种直观、清晰、简明的方式解释二进制交叉熵/对数损失背后的概念,这样我就可以向Data Science Retreat的学生展示它。因为找不到任何符合我的目标,所以我自己编写了任务:
https://www.datascienceretreat.com
一个简单的分类问题
让我们从10个随机点开始:
这是我们唯一的特征:x。
图0 特征
现在,让我们为我们的点分配一些颜色:红色和绿色。这些是我们的标签。
图1 数据
因此,我们的分类问题非常简单:鉴于我们的特征x,我们需要预测其标签:红色或绿色。
由于这是一个二进制分类,我们也可以将这个问题描述为:"点是绿色的吗",或者更好的是,"点是绿色的概率是多少"?理想情况下,绿点的概率为1.0(绿色),而红点的概率为0.0(绿色)。
在此设置中,绿点属于正类(YES,它们是绿色),而红点属于负类(NO,它们不是绿色)。
如果我们拟合一个模型来执行这个分类,它将预测每个点的绿色概率。根据我们对点的颜色的了解,我们如何评估预测的概率有多好(或有多差)?这是损失函数的全部目的!它应该为不良预测返回高值,为良好预测返回低值。
对于像我们的例子那样的二进制分类,典型的损失函数是二进制交叉熵/对数损失。
损失函数:二进制交叉熵/对数损失
如果你看看这个损失函数,这就是你会发现的:
二进制交叉熵/对数损失
其中y是标签(绿点为1,红点为0),p(y)是所有N点的点为绿色的预测概率。
看看这个公式,它告诉你,对于每个绿点(y = 1),它将log(p(y))添加到损失中,即它是绿色的对数概率。相反,它为每个红点(y = 0)添加log(1-p(y)),即,它为红色的对数概率。不一定很难,当然也不是那么直观......
此外,熵与这一切有什么关系?为什么我们首先记录概率?这些是有效的问题,我希望在下面的"展示我的数学"一节中回答它们。
但是,在采用更多公式之前,让我向你展示上述公式的直观表示......
计算损失的可视化方法
首先,让我们根据他们的类别(正面或负面)分割点数,如下图所示:
图2 分割数据!
现在,让我们训练一个逻辑回归来对我们的点进行分类。拟合回归是一个S形曲线,表示任何给定x点的绿色概率。它看起来像这样:
图3拟合逻辑回归
那么,对于属于正类(绿色)的所有点,我们的分类器给出的预测概率是多少?这些是S形曲线下的绿色条块,在与这些点对应的x坐标处。
图4 正确分类正类中的点的概率
请记住,S形曲线下的绿色条块表示给定点为绿色的概率。那么,给定点是红色的概率是多少?红色条块在S形曲线上方。
图5正确分类负类中的点的概率
总而言之,我们最终会得到这样的结论:
图6所有概率放在一起!
条块表示与每个点的相应真实类别相关联的预测概率!
好的,我们有预测的概率......通过计算二进制交叉熵/对数损失来评估它们的时间!这些概率就是我们所需要的,所以,让我们摆脱x轴并将条块彼此相邻:
图7所有点的概率
好吧,条块不再有意义了,所以让我们重新定位它们:
图8所有点的概率
既然我们正试图计算损失,我们需要惩罚不好的预测,对吧?如果与真实类相关的概率是1.0,我们需要将其损失为零。相反,如果这个概率很低,比如0.01,我们需要它的损失是巨大的!
事实证明,为了这个目的,取概率的对数就足够了(实际上,我们使用对数的原因来自交叉熵的定义,请查看下面的"Show me the math"部分以获得更多细节。
下图给出了一个清晰的图片——如果真实类的预测概率接近零,则损失呈指数增长:
图9 不同概率的对数损失
让我们记下概率的对数,这些是每个点的相应损失。
最后,我们计算所有这些损失的平均值。
图10最后的损失函数
瞧!我们已经成功计算了这个玩具示例的二进制交叉熵/对数损失。它是0.3329!
展示代码
如果你想仔细检查我们发现的值,只需运行下面的代码并亲自查看:
采用数学(真的吗?!)
撇开玩笑不谈,这篇文章并不打算倾向于数学……但是对于读者来说,为了理解熵、对数在所有这些中的作用,如果想深入了解信息理论,包括所有这些概念,例如熵、交叉熵等等,可以查看Chris Olah的帖子,这非常详细!
http://colah.github.io/posts/2015-09-Visual-Information/
分布
让我们从分布点开始吧。由于y表示我们的点的类(我们有3个红点和7个绿点),这就是它的分布,我们称之为q(y),如下所示:
图11q(y),点的分布
熵
熵是与给定分布q(y)相关的不确定性的度量。
如果我们所有的点都是绿色怎么办?那个分布的不确定性是什么?零,对吗?毕竟,对于一个点的颜色毫无疑问:它总是绿色的!所以,熵是零!
另一方面,如果我们确切地知道一半的点是绿色的,而另一半的点是红色的呢?那是最糟糕的情况,对吗?猜测点的颜色没有优势:它完全是随机的!对于这种情况,熵由下面的公式给出(我们有两个类别(颜色)- 红色或绿色):
半分布的熵
对于介于两者之间的所有其他情况,,我们可以使用下面的公式计算分布的熵,如q(y),其中C是类的数量:
熵
因此,如果我们知道随机变量的真实分布,我们就可以计算它的熵。但是,如果是这样的话,为什么首先要费心去训练分类器呢?毕竟,我们知道真正的分布......
但是,如果我们不这样做呢?我们可以尝试用其他一些分布近似真实分布,比如p(y)吗?我们当然可以!
交叉熵
让我们假设我们的观点遵循其他分布p(y)。但我们知道它们实际上来自真实(未知)分布q(y),对吧?
如果我们像这样计算熵,我们实际上是在计算两个分布之间的交叉熵:
交叉熵
因为这很可能永远不会发生,交叉熵将比在真分布上计算的熵具有更大的价值。
交叉熵负熵
事实证明,交叉熵和熵之间的这个区别有一个名字......
相对熵
相对熵,简称"KL散度", 是两个分布之间的不相似度的度量:
相对熵
这意味着,p(y)越接近q(y),发散度越低,因此交叉熵越低。
所以,我们需要找到一个好的p(y)来使用......但是,这是我们的分类器应该做的,不是吗?!确实如此!它寻找最好的p(y),这是最小化交叉熵的方法。
损失函数
在训练期间,分类器使用其训练集中的N个点中的每一个来计算交叉熵损失,有效地拟合分布p(y)!由于每个点的概率是1/N,因此交叉熵由下式给出:
交叉熵 - 逐点
还记得上面的图6到10吗?我们需要在与每个点的真实类相关联的概率之上计算交叉熵。这意味着使用绿色条形作为正类(y = 1)中的点,使用红色条形作为负类中的点(y = 0),或者数学上说:
数学表达式对应图10
最后一步是计算两个类中所有点的平均值,正类和负类:
正、负类的二元交叉熵
最后的想法
我真的希望这篇博文能对通常被认为是理所当然的概念——二进制交叉熵作为损失函数,提出一些新的见解。此外,我也希望它能向你们展示一下机器学习和信息理论是如何联系在一起的。
作者:Daniel Godoy
文章来源:
https://towardsdatascience.com/understanding-binary-cross-entropy-log-loss-a-visual-explanation-a3ac6025181a