文章目录
一、随笔
之前在一本书上看过香农熵的起源,热力学啊,对数引入,几个概念,现在记不清了,特来梳理下。
最重要的是认识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)