美文网首页
各种熵,条件熵,KL

各种熵,条件熵,KL

作者: 锦绣拾年 | 来源:发表于2021-05-24 22:58 被阅读0次

    熵、条件熵、交叉熵、相对熵

    参考《统计学习方法》李航

    通俗理解信息熵 - 忆臻的文章 - 知乎 https://zhuanlan.zhihu.com/p/26486223

    熵表示一个事件的信息量。

    一般认为,如果一个事件的随机性很大,那么这个事件的熵很大。

    如果一个事件比较确定,那么这个事件的熵很小。

    一个【具体】事件的信息量应该是随着其发生概率而递减的,且不能为负。

    信息的大小跟随机事件的概率有关。
    越小概率的事情发生了产生的信息量越大,如湖南产生的地震了;
    越大概率的事情发生了产生的信息量越小,如一个具体事件的信息量应该是随着
    其发生概率而递减的,且不能为负。
    
    如果我们有俩个不相关的事件x和y,那么我们观察到的俩个事件同时发生时获得
    的信息应该等于观察到的事件各自发生时获得的信息之和,即:
    
    h(x,y) = h(x) + h(y)
    
    由于x,y是俩个不相关的事件,那么满足p(x,y) = p(x)*p(y).
    
    根据上面推导,我们很容易看出h(x)一定与p(x)的对数有关(因为只有对数形式
    的真数相乘之后,能够对应对数的相加形式,可以试试)。因此我们有信息量
    公式如下:
    h(x)=-log p(x)
    
    为什么有一个负号?
    负号是为了确保信息一定是正数或者是0,总不能为负数吧!
    

    对于一个二分类事件,概率为[0.9999,0.0001],基本就是个随机性很小的事件,对应它的熵应该很小。

    反之,如果这个二分类事件概率为[0.5,0.5],比如抛硬币,正反概率差不多,基本很难确定,那么它的熵很大。

    定义:

    设x是一个取有限个值的离散随机变量,其概率分布是:

    P(x=x_i)=p_i,i=1,2,\dots,n

    则随机变量x的熵定义为:H(x)=-\sum_{i=1}^np_i logp_i ,若p_i=0,则定义0log0=0。

    在这里,一个事件分布的熵可以看作是具体事件信息量的期望。(即对各个事件的信息量依照概率加权)。

    注意:最后得到的熵与x无关,只与概率分布有关。

    所以我们可以得到二分类事件熵的函数图:

    1621866074(1).png

    条件熵

    H(Y|X) : 是已知随机变量X的前提下,随机变量Y的不确定性。

    定义:

    H(Y|X)=-\sum_{i=1}^np_iH(Y|X=x_i)=-\sum_{i=1}^np(x=x_i)\sum_{i=1}^mp(y=y_j|x=x_i)logp(y=y_j|x=x_i)

    即,已知X的取值情况,则先求x确定下的事件信息量,H(Y|X=x_i),再对信息量求一个期望。

    信息增益:

    知道随机变量X,使随机变量Y的信息,不确定性减少的程度。

    g(D,A) = H(D) - H(D|A)

    信息增益比:

    g_R(D,A)=\frac{g(D,A)}{H_A(D)}

    KL

    参考花书《深度学习》第三章

    如果我们对同一个随机变量x,有两个单独的概率分布,P(x)和Q(x),我们可以使用KL散度,来衡量这两个分布的差异

    D_{KL}(P||Q)=E_{x\sim P}[log\frac{P(X)}{Q(X)}]=E_{x\sim P}[logP(x)-logQ(x)]=-H(P)+H(P,Q)[交叉熵]

    p在前,表示以p为基准,去考虑p和q相差多少
    信息量的差值:

    表示分布差异,再×概率得到期望。

    性质:

    KL 散度有很多有用的性质,最重要的是它是非负的。KL 散度为 0 当且仅当P 和 Q 在离散型变量的情况下是相同的分布(此时P(x)/Q(x)=1),或者在连续型变量的情况下是 ‘‘几乎处处’’ 相同的。因为 KL 散度是非负的并且衡量的是两个分布之间的差异,它经常被用作分布之间的某种距离。然而,它并不是真的距离因为它不是对称的:对于某些 P 和 Q, D_{KL}(P||Q) \neq D_{KL}(Q||P)

    pytorch对应损失函数:

    torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)
    https://pytorch.org/docs/stable/generated/torch.nn.KLDivLoss.html
    torch.nn.KLDivLoss()(x,y)
    x:input ,y:target
    the input given is expected to contain log-probabilities and is not restricted to a 2D Tensor. The targets are interpreted as probabilities by default, but could be considered as log-probabilities with log_target set to True.
    

    l(x,y)=L={l_1,\dots,l_N},l_n=y_n \cdot (log y_n -x_n)

    示例

    import torch.nn.functional as F
    x1 = torch.tensor([[0.23,0.9],[-1.2,2.5]])
    x2 = torch.tensor([[-1,3.4],[-1.2,2.5]])
    x1_log_prob=F.log_softmax(x1,dim=-1)#log pi 概率值经过log函数
    x2_prob = F.softmax(x2,dim=-1)#得到概率值
    print(x1_log_prob)
    print(x2_prob)
    
    tensor([[-1.0832, -0.4132],
            [-3.7244, -0.0244]])
    tensor([[0.0121, 0.9879],
            [0.0241, 0.9759]])
    
    import torch.nn as nn
    nn.KLDivLoss(reduction='none')(x1_log_prob,x2_prob)
    tensor([[-4.0375e-02,  3.9617e-01], 
            [ 0.0000e+00,  1.8177e-08]])#可以看到,相同的分布值接近于0
    import math
    0.0121*(math.log(0.0121)+1.0832) #-0.040309332899191246,值为p(logp-logq)
    0.9879*(math.log(0.9879)+0.4132) #0.3961737820595649
    
    torch.sum(nn.KLDivLoss(reduction='none')(x1_log_prob,x2_prob),dim=-1)
    tensor([3.5580e-01, 1.8177e-08])
    #,最后结果应该是每一行值相加。
    

    交叉熵

    常用的损失函数。不具有对称性。H(P , Q)≠H(Q , P) 且非负。

    H(P,Q)=-E_{x\sim P}logQ(x)

    二分类问题的交叉熵损失函数的本质是假设数据服从以模型输出为参数的伯努利分布的极大似然估计。(为什么交叉熵(cross-entropy)可以用于计算代价? - Chris的回答 - 知乎 https://www.zhihu.com/question/65288314/answer/244601417)

    实际计算:
    \mathcal{L} = - \frac{1}{N} \sum_{n=1}^{N} logp(y^{(n)}|s^{(n)})
    可以直接 认为是这样的一个概率和,

    如果是多分类,假设真实标签[0,1,2,1,1,2,1]

    那就是-(logp(0|x)+logp(1|x)+log p(2|x)+log p(1|x)+log p(1|x)+log p(2|x)+log p(1|x))
    因为在实际运算中,目标label已确定,对应概率值就是1

    相关文章

      网友评论

          本文标题:各种熵,条件熵,KL

          本文链接:https://www.haomeiwen.com/subject/qnifsltx.html