资讯详情

理解二分类交叉熵|可视化的方法解释对数损失

点击上方“”,选择加""或“

重磅干货,第一时间送达

假如你在训练一个二分类分类器,很有可能你在使用二值交叉熵,log损失,作为你的损失函数。

你有没有想过使用这个损失函数意味着什么?事实上,各种图书馆和框架都非常简单和容易使用,因此很容易忽略损失函数的真正意义。

我一直在寻找一种清晰而简单的解释二元交叉熵的方法,可以通过可视化来解释(log损失)的背后的真正含义,这样我可以在 Data Science Retreat向我的学生展示,但我还没有找到。既然找不到自己想要的,就自己来:-)

让我们从10个随机数开始:

x = [-2.2, -1.4, -0.8, 0.2, 0.4, 0.8, 1.2, 2.2, 2.9, 4.6]

这是我们唯一的特点:x

21fafea5248e1df89de7a27318ea8856.png

现在,我们在这些点上涂上一些颜色:红色和绿色,作为标签

因此,我们的分类问题非常直观:给出特征x,我们需要预测标签:红色或绿色。

既然是个二分类,我们可以将这个问题描述成:“这个点是绿色的吗?”,或者,“这个点是绿色的概率是多少?”,理想的状态下,绿色点的概率应该为1.0,红点的概率应该是0.0。

绿点属于正样本,红点属于负样本。

如果我拟合一个模型进行分类,预测每个点都是绿色的概率。我们如何评估指定颜色的预测概率?这就是损失函数的目的!好的预测损失函数将返回低值,坏的预测将返回高值。

例如,对于二分类,典型的损失函数是二值交叉熵(对数损失)。

如果你仔细看损失函数,你会发现:

y是标签(1是绿色,0是红色),p(y)所有N点预测都是绿色概率。

这个公式告诉你每一个绿色(y=1)点,加一个log(p(y))在损失中,这是绿色对数的概率。相反,对于每一个红色(y=0)添加点log(1-p(y)),这是红色的对数概率。一点也不难,也不直观。

另外,熵和这些有什么关系?为什么要先拿概率对数?这是一个有价值的问题,我希望在下面 “Show me the math” 在链接中回答。

然而,在我们开始更多的公式之前,我将向您展示上述公式的可视化表示。

首先,我们根据类别将这些点分开,如正样本和负样本:

现在,让我们训练逻辑回归模型来分类我们的观点。这种回归的拟合是一种sigmoid曲线表示给定x是绿色的概率。

我们的分类器给出的的点(绿色),我们的分类器给出的预测概率是什么?sigmoid曲线下的绿条,x坐标代表这一点。

到目前为止,一切都很好!那么负样本呢?sigmoid曲线下的绿条表示绿色的概率。那么,红色的概率是多少呢?sigmoid曲线上的红条 :-)

把这些放在一起,我们得到了这样的东西:

该条代表了每个点对应类别的预测概率。

嗯,我们有预测的概率。是时候计算二值交叉熵/对数损失来评估了。

这些概率是我们需要的,所以我们不需要x坐标,我们一个接一个地排列竖条。

现在,这些竖条不再有任何意义,让我们改变位置:

既然我们想计算损失,我们需要惩罚坏的预测,对吗?如果相应类别的概率为1.我们需要对应的loss为零。相应地,如果概率很低,比如0.我们希望损失很大!

因此,将概率值取对数可以很好地满足我们的需求(事实上,使用对数的原因来自交叉熵的定义)。

下图显示清楚,预测真实概率值趋于零,损失指数增加:

很公平!我们取概率的对数——这些就是每个点对应的损失。

最后,我们计算所有损失的平均值。

嗯!我们成功计算了二元交叉熵/对数损失值,为0.3329!

如果您需要反复确认我们的一些发现,请自己查看以下代码!

from sklearn.linear_model import LogisticRegression   from sklearn.metrics import log_loss   import numpy as np      x = np.array([-2.2, -1.4, -.8, .2, .4, .8, 1.2, 2.2, 2.9, 4.6])   y = np.array([0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])      logr = LogisticRegression(solver='lbfgs')   logr.fit(x.reshape(-1, 1), y)      y_pred = logr.predict_proba(x.reshape(-1, 1))[:, 1].ravel()   loss = log_loss(y, y_pred)      print('x = {}'.format(x))   print('y = {}'.format(y))   print('p(y) = {}'.format(np.round(y_pred, 2)))   print('Log Loss / Cross Entropy = {:.4f}'.format(loss))

开个玩笑,上面的东西没那么数学。如果你想理解熵,对数在这个角色中扮演,我们开始:-)

如果你想对信息理论有更深入的了解,包括所有概念-熵、交叉熵等,你可以看看Chris Olah’s写的的东西http://colah.github.io/posts/2015-09-Visual-Information/,非常详细。

我们从数据分布开始。y代表了我们的点的类别(有3个红色点,7个绿色点),这就是分布,我们叫做q(y),看上去是这样的:

熵是一个给定的分布的不确定性的度量。

如果所有的点都是绿色的呢?分布的不确定性是什么?零,对吗?毕竟,点的颜色是毫无疑问的,总是绿色的!所以熵是零!

另外,如果我们知道一半是绿色的,另一半是红色的呢?这是最糟糕的情况,对吧?当我们猜测颜色时,我们没有任何优势:完全随机!在这种情况下,熵值由以下公式给出,我们的类别数为2:

在任何情况下,我们都可以像我们一样计算熵的分布q(y),使用以下公式,C类别数:

因此,如果我们知道随机变量的真实分布,我们可以计算它的熵。但是,为什么一开始要训练分类器呢?毕竟,我们知道真正的分布

但是,如果我们不知道呢?我们能通过其他分布吗,比如p(y)估计真实分布怎么样?当然可以!

假设我们的点服从其他分布p(y),但我们知道这种分布来自真实(未知)的分布q(y),是吗?

如果我们计算熵,我们实际上计算这两个分数的交叉熵:

如果我们可以神奇的将p(y)和q( y)匹配的很好,那么交叉熵的计算值和熵的计算值也会匹配的很好。

既然这个是不太可能发生的,在真实的分布上,交叉熵永远会比熵要大那么一点。

原来,交叉熵和熵的差值是有个名字的...

KL散度,衡量的是两个分布之间的差异性:

这个的意思是, p(y)和q(y)越接近,散度的值越小,交叉熵也是这样。

所以,我们需要找到一个好的p(y)来用,这就是我们的分类器做的事情,是吗?确实也是这样!寻找最近的p(y),就是最小化交叉熵。

在训练中,分类器使用了N个点找那个的每一个来计算交叉熵的损失,有效的拟合出分布p(y)!既然每个点的概率都是1/N,交叉熵是这样的:

还记得上面的图6吗?我们需要在每个点对应的真实类别的概率上计算交叉熵。意思就是正样本使用绿色条,负样本使用红色条,数学上可以这样写:

最后一步是计算所有的点在两个类别上的平均值,正样本和负样本:

最后,再加上一点操作,我们使用任何一个点,不管是正样本还是负样本,都用同样的公式:

好了!我们回到了二元交叉熵/对数损失最初的公式:-)

我真的希望上面的内容可以给一些理所当然的概念一些不同的东西。我当然也希望可以展示给你关于机器学习和信息论是联系在一起的。

开始面向外开放啦👇👇👇

 
     

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

标签: 熵指数传感器entropy

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台