信息(香农)熵之1948年

本文回顾了信息熵、条件熵、KL散度和交叉熵等概念,介绍了它们在信息理论和机器学习中的应用,以及在Python库如Tensorflow和Pytorch中的实现示例。文中还提到了对数的历史和计算机科学先驱对这些概念的贡献。
摘要由CSDN通过智能技术生成

一、随笔

之前在一本书上看过香农熵的起源,热力学啊,对数引入,几个概念,现在记不清了,特来梳理下。
最重要的是认识KL散度,交叉熵这些目前计算衡量损失函数的概念。

二、公式

2.1、 信息熵

对于一个离散随机变量X,其可能取值为X = {x1, x2,…, xn},概率分布为P(X = xi) = pi(i = 1, 2,…, n),则随机变量X的熵定义为:

H(X) = - Σ (p(xi) * log2(p(xi)))

这个公式用于计算随机变量的熵,衡量其不确定性或信息量。

2.2 、条件熵联合熵

联合熵,用H(X, Y)表示。
条件熵,用H(Y|X)表示。它衡量了在已知X的条件下,Y的不确定性。条件熵的公式与联合熵和X的熵有关:

H(Y|X) = H(X, Y) - H(X)

2.3、相对熵(KL散度)

对于一个离散随机变量的两个概率分布P和Q,它们的相对熵定义为:

D(P||Q) = Σ (P(xi) * log(P(xi)/Q(xi)))

这个公式用于计算随机变量的熵,衡量其不确定性或信息量。

2.4、交叉熵

常用于衡量模型的预测结果与真实标签之间的差异。对于两个概率分布p和q,交叉熵的计算公式为:

H(p, q) = -Σ(p(x) * log(q(x)))

其中,x表示所有可能的事件,p(x)和q(x)分别表示事件x在分布p和q中的概率。交叉熵的值越小,表示两个概率分布越接近。当两个概率分布完全相同时,交叉熵的值为0。

在某些情况下,KL散度和交叉熵可以相互转换。例如,当目标分布是确定的(即标签是已知的)时,KL散度可以简化为交叉熵。目标分布的熵是一个常数,可以从KL散度中减去,从而得到交叉熵

三、1614年

对数是由纳皮尔(John Napier)在1614年发明的。纳皮尔是苏格兰的数学家,他发明对数主要是为了简化天文学中的运算。

纳皮尔的杰作《奇妙的对数定律说明书》1614年6月在爱丁堡出版。 但直到后来H.布里格斯将它改为常用对数,才得到广泛使用。

3.1 中国的1614年

明朝万历四十二(42/48,48年的万历)年,这一年中国啥事也没有。但都说明实亡于万历。
仔细看了下这一年福王朱常洵(1641年闯王李自成攻陷洛阳,杀朱常洵,享年五十六岁)就藩河南洛阳。
有意思的就是14年就藩,41年被杀。 对数???扯犊子的对数,人家苏格兰数学家搞对数,这边异样发现一个对调数的事件。

四、1770年

欧拉 在1770年才发现了指数与对数的互逆关系。

4.1 中国1770年

乾隆35年(35/60,实际乾隆1711年生而1795年退位死于1799年,差点干进1800年,避不开的历史。)乾隆六十大寿。

国外在发展数学,中国权利绝对集中。指数对数互逆关系被发现,而中国因乾隆六十大寿免全国地丁钱粮一次(我就当庆祝欧拉的发现了!!!)。

五、1948年

不多说香农熵了,直接看下计算机四大先驱吧,理解下香农的位置 :

信息理论:维纳、香农

计算实践:图灵、冯诺依曼

5.0 计算机四大先驱

维纳(控制论):信息熵、反馈、维纳滤波

香农(信息论):信息传输、信息熵、信息度量单位、信息压缩/解压缩、信息加密/解密

图灵(图灵机):信息采样、信息编码/解码、信息加密/解密、信息存储

冯诺依曼(博弈论):信息存储、信息计算。

在信息熵的语境中,冯·诺依曼的贡献在于他建议香农使用“熵”这个词来描述不确定性函数,因为这个词在统计物理中已经被使用过,并且更容易被人们理解和接受。此外,冯·诺依曼还研究了量子熵的概念,将熵的概念扩展到了量子力学的领域。

5.1 中国

不用说,三大战役,信息熵及其的及其的高!!! 信息量太大了,只要是中国人没有不了解三大战役的,定鼎新中国基调的几个月。

六、总结

KL散度的全称是Kullback-Leibler Divergence,也被称为相对熵(Relative Entropy)或信息散度(Information Divergence)。它是一种统计学度量,表示的是一个概率分布相对于另一个概率分布的差异程度。在概率学和统计学中,KL散度可以用来衡量两个概率分布之间的相似度。

交叉熵是分类问题中常用的损失函数。它衡量的是模型预测的概率分布与真实标签的概率分布之间的差异。对于二分类问题,通常使用二元交叉熵;对于多分类问题,则使用多分类交叉熵

当目标分布是确定的(即标签是已知的)时,KL散度可以简化为交叉熵

在实际应用中,根据问题的性质和数据的特点,可以选择使用KL散度或交叉熵作为损失函数。

6.1 tensorflow程序示例

备注:多角度记忆才牢固。

tensorflow内置函数kl散度:
在这里插入图片描述

tensorflow二元交叉熵:

y_true = [[0., 1.], [0., 0.]]  
y_pred = [[0.6, 0.4], [0.4, 0.6]]  
bce = tf.keras.losses.BinaryCrossentropy()  
loss = bce(y_true, y_pred)

在这里插入图片描述

tensorflow多分类交叉熵:

y_true = [[0, 1, 0], [0, 0, 1]]  
y_pred = [[0.1, 0.8, 0.1], [0.3, 0.3, 0.4]]  
cce = tf.keras.losses.CategoricalCrossentropy()  
loss = cce(y_true, y_pred)

在这里插入图片描述

6.2 pytorch程序

pytorch中KL散度:

import torch  
import torch.nn.functional as F  
  
p = torch.tensor([[0.1, 0.9], [0.2, 0.8]], dtype=torch.float)  
q = torch.tensor([[0.3, 0.7], [0.4, 0.6]], dtype=torch.float)  
  
# 为了避免log(0),通常在q上加上一个小的epsilon  
eps = 1e-10  
kl_div_pq = F.kl_div(q.log() + eps, p, reduction='batchmean')

在这里插入图片描述

pytorch中二元交叉熵:

import torch
import torch.nn as nn  
  
criterion = nn.BCELoss()  
y_true = torch.tensor([[0., 1.], [0., 0.]], dtype=torch.float)  
y_pred = torch.tensor([[0.6, 0.4], [0.4, 0.6]], dtype=torch.float)  
loss = criterion(y_pred, y_true)

在这里插入图片描述

多分类交叉熵

criterion = nn.CrossEntropyLoss()  
y_true = torch.tensor([1, 2])  # 类别索引  
y_pred = torch.tensor([[0.1, 0.8, 0.1], [0.3, 0.3, 0.4]], dtype=torch.float)  
loss = criterion(y_pred, y_true)

在这里插入图片描述

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值