深度学习中的信息论——交叉熵

信息量

可以说就信息量是在将信息量化。首先信息的相对多少是有切实体会的,有的人一句话能包含很多信息,有的人说了等于没说。我们还可以直观地感觉到信息的多少和概率是有关的,概率大的信息也相对低一些。为了量化信息,一个做法就是找到一个单位,比如说抛硬币就是一个基本单位,或者说我们使用01编码。先看等概率的情况,种类数n越多,那么需要编码的长度l就越大,每个码字(编码的每一位)独立分布,所以当每个码字的取值为m时,可以表示的种类为n=m^l,所以l=log_m n。因为是等概,所以概率和种类数目就是倒数的关系,l=log_m\frac{1}{p}。那么,不等概的情况呢,比如把骰子的2改为1,那么转到1那一面的概率为\frac{2}{6},我们以“”转到1的一面“”这件事件为单位对概率1重新划分,因为概率总和为1,那么所有的类的数目就是1/p。

现在我们知道信息量中log取2为底和概率取导数的真正含义了。那么熵是什么呢?既然信息量是衡量一件事的不确定程度,那么熵就是衡量一个系统的混乱程度。它综合了所有可能发生类别的不确定性,其实就是信息量的期望。从编码的角度,熵指的是对随机变量编码所需的最小比特数。有一种编码的种类就叫作熵编码,属于无损编码。因为熵就是平均信息量,而信息量是以01编码进行量化的,那么为了不损失信息,我们最少也需要这么多的bit进行编码。同时可以看到,概率越小出现的符号,允许使用更长的编码,这样整体的编码效率才更高。

交叉熵

对于两个信源,分别求熵可以得到各自平均每个字符对应的最小的编码长度。那么如果两个信源互换编码方式呢?平均每个字符所需的最小bit位如何计算呢。从公式上看,变化就是取对数的对象换成了编码对象的概率分布,而加权所使用的概率仍然是自己的概率。可以预见,互换编码方式之后求出的“熵”会增大。因为两个位置的概率不统一,所以被称作交叉熵。

交叉熵用于评估两个分布的差异,常用于分类任务。而分类中常用的激活函数是softmax,我们看看在代码上有什么需要注意的地方。https://blog.csdn.net/weixin_40476348/article/details/94570666

import torch
import torch.nn.functional as F
import torch.nn as nntorch.manual_seed(2019)output = torch.randn(2, 3)  # 网络输出
target = torch.ones(2, dtype=torch.long).random_(3)  # 真实标签
print('output:\n{}'.format(output))
print('target:\n{}\n'.format(target))# 第一步,对output进行log_softmax运算
log_softmax = F.log_softmax(output, dim=1)
print('log_softmax:\n{}\n'.format(log_softmax))
# 第二步,将计算结果和target输入nll_loss损失函数计算交叉熵
nll_loss = F.nll_loss(log_softmax, target)
print('nll_loss:{}'.format(nll_loss))# 直接使用cross_entropy损失函数计算output与target的交叉熵
cross_entropy_loss = F.cross_entropy(output, target)
print('cross_entropy_loss:{}'.format(cross_entropy_loss))# 实例化类
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print('loss:{}'.format(loss))"""
output:
tensor([[-0.1187,  0.2110,  0.7463],[-0.6136, -0.1186,  1.5565]])
target:
tensor([2, 0])log_softmax:
tensor([[-1.5614, -1.2317, -0.6964],[-2.4335, -1.9386, -0.2635]])nll_loss:1.564985990524292
cross_entropy_loss:1.564985990524292
loss:1.564985990524292
"""

当使用torch中的cross_entropy函数时,输入可以直接是全连接的输出和标签值,而不需要添加softmax。原因是在cross_entropy内部自动计算softmax得到概率,并且最终输出交叉熵。CE=\sum_x{p(x)log\frac{1}{q(x)}}=-\sum_x{p(x)log(q(x))}

按照公式,交叉熵的计算可以分为三步:先计算输出的判决概率;再取对数;再以先验概率加权求和,并取负号。第一步由torch.softmax完成(原理细节可以参考之前的博客);第二步就是简单的取对数:torch.log;第三步在torch有函数F.nll_loss。而第一第二步又可以合并为一步:torch.Logsoftmax()

注意n.softmax在计算概率的时候要指定好维度,从而保证不同互斥类别的概率之和为1.

KL散度,相对熵

刚才提到,熵的一个重要意义是编码对应的最短码字。注意看公式值权重的概率和log中的概率是相对应的。权重的概率表示先验的分布,当log中概率变为q,权重仍然为p时,表示依靠旧的先验分布去cover另外一个未知的情况,那么这时再计算出的值肯定会比原来的最短码长长。他们的差值就是相对熵,写成公式为:D_p(p)=\sum_xp(x)log_2\frac{1}{q(x)}-\sum_xp(x)log_2\frac{1}{p(x)}=\sum_xp(x)log_2\frac{p(x)}{q(x)}

注意权重概率都是p,p对应时更短,所以放在减号右边,经过变换,写成比例关系时位于分子的位置。当然是长的减短的,所以取值范围就是0~正无穷。经过恒等变换,就可以得到我们最常见的KL散度的表达式。这就经常被用来衡量两个信源,或者说两个分布的差异性,因为差异越大,编码的适用性越差,编码长度变化量也越大。需要注意的是该“距离”不具有对称性。

既然KL散度可以衡量两个分布的差异,而机器学习/深度学习的目的就是让模型在训练集和测试集中得分的分布尽可能接近,所以KL散度就可以用来作损失函数。但为什么常见的是交叉熵呢?这是因为KL散度的一部分是恒定不变的,所以交叉熵和相对熵其实是同等变化的。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。

再深究一点,其实最小化交叉熵和最大似然估计也是等价的。因为最大似然的目的其实是最小化取负对数,取对数的目的是防止连乘过程中的溢出。这就造成了二者首先在格式上是相似的。最大似然是求取模型的参数分布,使得输出的值是已知样本的概率最大,本质上也是让二者的分布最接近。

在决策树中,除了使用基于熵的信息增益,常见的还有基尼不纯度。从名字上看,不纯度和熵的混乱程度是类似的;实际上,二者确实也是类似的,基尼不纯度其实是熵的近似值(log泰勒展开,忽略高阶项)。基于近似后得到的新公式,也可以有新的解释:一个随机事件变成它的对立事件的概率/分错的概率。

在网上的资料中提到,熵与基尼不纯度还有一个区别是熵到达峰值的过程相对慢一些,并且由此造成熵对于混乱程度的判罚要重一些。这里我不太明白,基尼不纯度是通过舍弃高阶项来近似熵,所以基尼不纯度是要比熵值低一些的,二者都是在等概时取最大值,所以二者的关系是熵的曲线段在不纯度上方,二者端点相同。因为熵值更大,所以作为损失函数时的惩罚力度更大。

scipy中实现了KL散度的计算,当参数中只有一个序列时,计算的是熵,并且可以指定以e为底还是以2为底:

>>>entropy([1/2, 1/2], base=2)
1.0

当有两个序列时,以第一个序列为先验分布计算二者的KL散度:

>>>entropy([1/2, 1/2], qk=[9/10, 1/10])
0.5108256237659907

而我在这里计算的时候返回的值是inf,即便输入的是两个完全一致的序列也是这样,问题出在哪里呢?我这里犯了一个错,输入的序列应该是各个事件发生的概率,即应该是一个离散的概率密度序列,而不能直接输入两个取值的集合。尤其是取值可能出现负数,这样把它当做概率进行求对数,就会出错,返回inf。

对应做法是利用scipy中的norm.pdf估计概率密度。还有就是手动统计两个序列在各个区间内数值的频率。比如可以利用np.percentile得到四分位数。

Reference:

https://zhuanlan.zhihu.com/p/59550047

https://www.zhihu.com/question/65288314

https://zhuanlan.zhihu.com/p/40024110

https://www.cnblogs.com/arkenstone/p/10524720.html

https://zhuanlan.zhihu.com/p/76667156

近似https://blog.csdn.net/yingwei13mei/article/details/75452526?utm_source=blogxgwz7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传统手工特征--opencv

一,颜色特征: 简单点来说就是将一幅图上的各个像素点颜色统计出来,适用颜色空间:RGB,HSV等颜色空间, 具体操作:量化颜色空间,每个单元(bin)由单元中心代表&…

特写李飞飞:她激励了人工智能的发展,更要给人工智能赋予人的价值

文 | MrBear 编辑 | 杨晓凡来源:雷锋网摘要:李飞飞无疑是人工智能界最响亮的名字之一。她既对机器学习领域的发展做出了杰出的贡献,也是普通大众眼中温和的人工智能技术宣扬者,还是谷歌这一科技巨头的人工智能技术领导人之一。WI…

Chap-4 Section 4.2.4 指令修正方式

对于X86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种:绝对近址32寻址和相对近址32寻址。 这两种指令修正方式每个被修正的位置的长度都为32位,即4个字节,而且都是近址寻址,不用考虑Intel的段间远址寻址。r_info成员的…

没见过女人的小和尚——SVDD

是的,即便是出生在山上的小和尚,从来没有下过山,没有见过女人,但是一旦有女施主上山,小和尚依然可以轻松地区分出眼前的人是如此不同。 传统的SVM是寻找一个超平面,而SVDD寻找的超平面更进一步&#xff0c…

解读GAN及其 2016 年度进展

作者:程程 链接:https://zhuanlan.zhihu.com/p/25000523 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 GAN,全称为Generative Adversarial Nets,直译为生成式对抗网络…

全国首套中小学生人工智能教材在沪亮相

来源:网络大数据中小学 AI 教材正式亮相11 月 18 日,优必选与华东师范大学出版社共同发布了《AI 上未来智造者——中小学人工智能精品课程系列丛书》(以下简称“AI 上未来智造者”丛书)。据了解,该丛书根据教育部“义务…

numpy基础知识点

1. np.squeeze 一,np.squeeze """ np.squeeze 删除单维度的条 对多维度无效 """ import numpy as np anp.array([[1,2],[3,4],[4,5]]) print(a) print(a.shape) bnp.squeeze(a) print(b) ca.reshape(1,6,1) print(c) print(np.squeeze(c)) pri…

从智能交通到智能能源:智慧城市在7个方面的应用实践

来源:资本实验室目前,智慧城市已经成为全球众多城市未来规划和设计的方向,并致力于通过各种新技术的应用来改善城市居民的工作与生活。但什么样的技术应用能够推动智慧城市的建设?如何让新技术在智慧城市中的应用效率最大化&#…

别以为if slse很简单——决策树

怎么分——熵与Gini指数 熵,表示信息量的期望,含义是混乱程度,也是对随机变量编码所需的最小比特数。请参考之前的文章。 信息增益建立在熵之上,是选择某特征之后熵减少的多少(熵减少即信息增加)&#xf…

tensorflow实现回归

直线拟合:yw*xb """ 回归:直线拟合 """ import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x_datanp.random.rand(100) y_datax_data*51Wtf.Variable(0.) btf.Variable(0.) y_predW*x_databxtf.placehol…

微软亚研院20周年独家撰文:数据智能的现在与未来

文:微软亚洲研究院软件分析组来源:雷锋网摘要:今年是微软亚洲研究院(MSRA)20周年,站在这个大节点上,MSRA副院长张冬梅以及她的团队写了这篇有关数据智能的文章,对该领域的发展和未来…

二维与三维之间的桥梁——点云

在做图像配准时就听闻过一些点云的方法,却没对其有太多的认识,只是知道点云point cloud顾名思义就是一些离散点的集合。现在在无人驾驶中一些激光雷达的作用其实就是生成点云数据,接下来介绍一下点云数据的含义和基础的使用方法。 虽然特斯拉…

python刷题+leetcode(第一部分)

1. 设计前中后队列 思路:python代码直接利用list的insert特性 class FrontMiddleBackQueue:def __init__(self):self.queque []def pushFront(self, val: int) -> None:self.queque.insert(0, val)def pushMiddle(self, val: int) -> None:self.queque.insert(len(self…

LINQ基础概述

介绍LINQ基础之前,首说一下LINQ 的历史和LINQ是什么,然后说一下学习 LINQ要了解的东西和 LINQ基础语法LINQ 的历史从语言方面的进化 –委托 –匿名方法 –Lambda表达式 –Linq查询表达式 上边这四个我会在下边一一解说 从时间方面的演进 –2004年 –2005…

机器人“快递小哥”上岗了!京东配送机器人编队长沙亮相

11 月 22 日上午,京东物流配送机器人智能配送站启用仪式在长沙举行,随着载有用户订单的配送机器人编队从站内依次发出,全球首个由机器人完成配送任务的智能配送站正式投入使用。首个京东配送机器人智能配送站位于长沙市科技新城,占…

3D打印技术如何影响未来

来源:学习时报我们应该对3D打印技术保持谨慎态度,但过度反应和监管也可能会扼杀创新。历史经验表明,在技术的不利一面被应用之前进行规范构建对话是最有效的。因此,各国际主体,包括国家、商业领袖、政府官员和其他政策…

HDR简单介绍

问题定义 HDR字面意思是高动态范围High Dynamic Range,而动态范围是高图像质量的五个要素之一(其余是1. 分辨率,2.位深度,3.帧速率,4.色域),而画质直接关系到人眼的主观感受。 如果将动态范围理解为量化的…

争议中挺进全新里程——中国“超级对撞机”《概念设计报告》发布侧记

来源:科技导报2018 年11 月12 日下午6 点半,北京市玉泉路,中国科学院高能物理研究所,所有建筑和行人沐浴在初冬夜晚的清冷与安静之中。不同的是,主楼西侧一座新楼的大厅里,却充满了热望和兴奋。这里正进行着…

haar级联分类器--人脸检测和匹配

分类器链接,https://download.csdn.net/download/fanzonghao/10582586 代码: import numpy as np import cv2# 实例化人脸分类器 face_cascade cv2.CascadeClassifier(./haarcascades/haarcascade_frontalface_default.xml) # 实例化眼睛分类器 eye_c…

社会科技奖不是新鲜事?如何真正做大

来源:中国科学报我国的社会力量设立科学技术奖励起步于上世纪80年代。科技部网站上2018年9月5日更新的《社会科技奖励目录》显示,目前我国共有269个社会科技奖项登记在册,其中最后一个正是未来科学大奖。11月18日,2018未来科学大奖…