有做销售产品的网站有哪些内容,搜索引擎营销的优势,如何建立网站建设规划,wordpress单页主题营销信息量
可以说就信息量是在将信息量化。首先信息的相对多少是有切实体会的#xff0c;有的人一句话能包含很多信息#xff0c;有的人说了等于没说。我们还可以直观地感觉到信息的多少和概率是有关的#xff0c;概率大的信息也相对低一些。为了量化信息#xff0c;一个做法…信息量
可以说就信息量是在将信息量化。首先信息的相对多少是有切实体会的有的人一句话能包含很多信息有的人说了等于没说。我们还可以直观地感觉到信息的多少和概率是有关的概率大的信息也相对低一些。为了量化信息一个做法就是找到一个单位比如说抛硬币就是一个基本单位或者说我们使用01编码。先看等概率的情况种类数越多那么需要编码的长度就越大每个码字编码的每一位独立分布所以当每个码字的取值为时可以表示的种类为所以。因为是等概所以概率和种类数目就是倒数的关系。那么不等概的情况呢比如把骰子的2改为1那么转到1那一面的概率为我们以“”转到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, dtypetorch.long).random_(3) # 真实标签
print(output:\n{}.format(output))
print(target:\n{}\n.format(target))# 第一步对output进行log_softmax运算
log_softmax F.log_softmax(output, dim1)
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得到概率并且最终输出交叉熵。
按照公式交叉熵的计算可以分为三步先计算输出的判决概率再取对数再以先验概率加权求和并取负号。第一步由torch.softmax完成原理细节可以参考之前的博客第二步就是简单的取对数:torch.log第三步在torch有函数F.nll_loss。而第一第二步又可以合并为一步torch.Logsoftmax()
注意n.softmax在计算概率的时候要指定好维度从而保证不同互斥类别的概率之和为1.
KL散度相对熵
刚才提到熵的一个重要意义是编码对应的最短码字。注意看公式值权重的概率和log中的概率是相对应的。权重的概率表示先验的分布当log中概率变为q权重仍然为p时表示依靠旧的先验分布去cover另外一个未知的情况那么这时再计算出的值肯定会比原来的最短码长长。他们的差值就是相对熵写成公式为
注意权重概率都是pp对应时更短所以放在减号右边经过变换写成比例关系时位于分子的位置。当然是长的减短的所以取值范围就是0~正无穷。经过恒等变换就可以得到我们最常见的KL散度的表达式。这就经常被用来衡量两个信源或者说两个分布的差异性因为差异越大编码的适用性越差编码长度变化量也越大。需要注意的是该“距离”不具有对称性。
既然KL散度可以衡量两个分布的差异而机器学习/深度学习的目的就是让模型在训练集和测试集中得分的分布尽可能接近所以KL散度就可以用来作损失函数。但为什么常见的是交叉熵呢这是因为KL散度的一部分是恒定不变的所以交叉熵和相对熵其实是同等变化的。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题因为学习速率可以被输出的误差所控制。
再深究一点其实最小化交叉熵和最大似然估计也是等价的。因为最大似然的目的其实是最小化取负对数取对数的目的是防止连乘过程中的溢出。这就造成了二者首先在格式上是相似的。最大似然是求取模型的参数分布使得输出的值是已知样本的概率最大本质上也是让二者的分布最接近。
在决策树中除了使用基于熵的信息增益常见的还有基尼不纯度。从名字上看不纯度和熵的混乱程度是类似的实际上二者确实也是类似的基尼不纯度其实是熵的近似值log泰勒展开忽略高阶项。基于近似后得到的新公式也可以有新的解释一个随机事件变成它的对立事件的概率/分错的概率。
在网上的资料中提到熵与基尼不纯度还有一个区别是熵到达峰值的过程相对慢一些并且由此造成熵对于混乱程度的判罚要重一些。这里我不太明白基尼不纯度是通过舍弃高阶项来近似熵所以基尼不纯度是要比熵值低一些的二者都是在等概时取最大值所以二者的关系是熵的曲线段在不纯度上方二者端点相同。因为熵值更大所以作为损失函数时的惩罚力度更大。
scipy中实现了KL散度的计算当参数中只有一个序列时计算的是熵并且可以指定以e为底还是以2为底
entropy([1/2, 1/2], base2)
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_sourceblogxgwz7