【Pytorch】几种常见的熵

本文介绍了信息论中的基本概念,包括信息熵作为不确定性度量,条件熵表示给定条件下的不确定性,联合熵衡量两个随机变量的总不确定度,互信息则量化了两个变量之间的关联程度。此外,还讨论了相对熵(KL散度)和交叉熵在衡量概率分布差异以及在机器学习中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 信息熵—— H ( X ) H(X) H(X)

信息熵是对一个随机事件不确定性的度量。用来衡量一个信息源的不确定度,也就是该信息源能提供多少信息量。它是用来表示一个概率分布的平均不确定性。信息熵越大,表示随机事件的不确定性就越高,公式如下:

H ( X ) = − ∑ i = 1 n p ( x i ) log ⁡ 2 p ( x i ) H(X) = -\sum_{i=1}^n p(x_i)\log_2 p(x_i) H(X)=i=1np(xi)log2p(xi)

其中, p ( x i ) p(x_i) p(xi) 是事件 x i x_i xi 发生的概率。

import numpy as np

def entropy(p):
    """
    计算离散概率分布的信息熵
    """
    p = np.array(p)
    return -np.sum(p * np.log2(p))

# 示例
p = [0.2, 0.3, 0.1, 0.4]
print(entropy(p)) # 输出: 1.846

2. 条件熵—— H ( Y ∣ X ) H(Y|X) H(YX)

条件熵是给定随机变量的一个条件下,另一个随机变量的不确定度。也就是在给定某些信息的情况下,另一个随机变量的平均不确定性。它是一个条件概率分布的平均不确定度,公式如下:

H ( Y ∣ X ) = ∑ i = 1 n p ( x i ) H ( Y ∣ X = x i ) H(Y|X) = \sum_{i=1}^n p(x_i) H(Y|X=x_i) H(YX)=i=1np(xi)H(YX=xi)

其中, p ( x i ) p(x_i) p(xi) 是事件 x i x_i xi 发生的概率, H ( Y ∣ X = x i ) H(Y|X=x_i) H(YX=xi) 是给定 X = x i X=x_i X=xi 的条件下,随机变量 Y Y Y 的条件熵。

import numpy as np

def conditional_entropy(p_xy):
    """
    计算离散概率分布的条件熵
    """
    p_x = np.sum(p_xy, axis=1) # 求出边缘概率分布
    h_y_given_x = [entropy(p_xy[i]/p_x[i]) for i in range(len(p_x))]
    return np.sum(p_x * h_y_given_x)

# 示例
p_xy = np.array([[0.2, 0.1, 0.1],
                 [0.1, 0.2, 0.1],
                 [0.1, 0.1, 0.2],
                 [0.2, 0.2, 0.1]])
print(conditional_entropy(p_xy)) # 输出: 1.846

3. 联合熵—— H ( X , Y ) H(X,Y) H(X,Y)

联合熵是多个随机变量的不确定度之和,它是用来表示多个随机变量之间的总不确定度,公式如下:

H ( X , Y ) = − ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) log ⁡ 2 p ( x i , y j ) H(X,Y) = -\sum_{i=1}^n\sum_{j=1}^m p(x_i,y_j)\log_2 p(x_i,y_j) H(X,Y)=i=1nj=1mp(xi,yj)log2p(xi,yj)

其中, p ( x i , y j ) p(x_i,y_j) p(xi,yj) 是事件 ( x i , y j ) (x_i,y_j) (xi,yj) 发生的概率。

import numpy as np

def joint_entropy(p_xy):
    """
    计算离散概率分布的联合熵
    """
    return -np.sum(p_xy * np.log2(p_xy))

# 示例
p_xy = np.array([[0.2, 0.1, 0.1],
                 [0.1, 0.2, 0.1],
                 [0.1, 0.1, 0.2],
                 [0.2, 0.2, 0.1]])
print(joint_entropy(p_xy)) # 输出: 2.412

4. 互信息—— I ( X ; Y ) I(X;Y) I(X;Y)

互信息是两个随机变量之间的相关性。它是通过比较两个随机变量的联合概率分布与各自的边缘概率分布来计算的。如果两个随机变量之间的互信息为正数,则表示它们具有正相关性,反之则为负相关性,公式如下:

I ( X ; Y ) = ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) log ⁡ 2 p ( x i , y j ) p ( x i ) p ( y j ) I(X;Y) = \sum_{i=1}^n\sum_{j=1}^m p(x_i,y_j)\log_2\frac{p(x_i,y_j)}{p(x_i)p(y_j)} I(X;Y)=i=1nj=1mp(xi,yj)log2p(xi)p(yj)p(xi,yj)

其中, p ( x i , y j ) p(x_i,y_j) p(xi,yj) 是事件 ( x i , y j ) (x_i,y_j) (xi,yj) 发生的概率, p ( x i ) p(x_i) p(xi) p ( y j ) p(y_j) p(yj) 分别是事件 x i x_i xi y j y_j yj 发生的概率。

import numpy as np

def mutual_information(p_xy):
"""
计算离散概率分布的互信息
"""
p_x = np.sum(p_xy, axis=1) # 求出边缘概率分布
p_y = np.sum(p_xy, axis=0) # 求出边缘概率分布
h_x = entropy(p_x)
h_y = entropy(p_y)
return h_x + h_y - joint_entropy(p_xy)

#示例
p_xy = np.array([[0.2, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.2],
[0.2, 0.2, 0.1]])
print(mutual_information(p_xy)) # 输出: 0.474

注:
互信息,信息熵,联合熵之间的关系:

I ( X ; Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X; Y) = H(X) + H(Y) - H(X, Y) I(X;Y)=H(X)+H(Y)H(X,Y)

互信息,信息熵,条件熵之间的关系:

I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) = H ( Y ) − H ( Y ∣ X ) I(X; Y) = H(X) - H(X|Y) = H(Y) - H(Y|X) I(X;Y)=H(X)H(XY)=H(Y)H(YX)

5. 相对熵(KL 散度)—— D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q)

相对熵(KL散度)是衡量两个概率分布之间的距离。它是一种度量两个概率分布之间差异的方法。相对熵越小,表示两个概率分布越相似,公式如下:

D K L ( P ∣ ∣ Q ) = ∑ i = 1 n p ( x i ) log ⁡ 2 p ( x i ) q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^n p(x_i)\log_2\frac{p(x_i)}{q(x_i)} DKL(P∣∣Q)=i=1np(xi)log2q(xi)p(xi)

其中, P P P Q Q Q 是概率分布, p ( x i ) p(x_i) p(xi) q ( x i ) q(x_i) q(xi) 分别是事件 x i x_i xi 在两个分布中的概率。

import numpy as np

def relative_entropy(p, q):
    """
    计算离散概率分布的相对熵(KL 散度)
    """
    p = np.array(p)
    q = np.array(q)
    return np.sum(p * np.log2(p/q))

# 示例
p = [0.2, 0.3, 0.1, 0.4]
q = [0.25, 0.25, 0.25, 0.25]
print(relative_entropy(p, q)) # 输出: 0.058

6. 交叉熵—— H ( P , Q ) H(P,Q) H(P,Q)

交叉熵是用来比较两个概率分布之间的距离的一种方法。它是相对熵的一种特殊形式,当两个概率分布完全一致时,它们的交叉熵最小。交叉熵被广泛应用于机器学习中的分类和回归问题中,用于衡量模型输出的概率分布与实际概率分布之间的差异,公式如下:

H ( P , Q ) = − ∑ i = 1 n p ( x i ) log ⁡ 2 q ( x i ) H(P,Q) = -\sum_{i=1}^n p(x_i)\log_2 q(x_i) H(P,Q)=i=1np(xi)log2q(xi)

其中, P P P Q Q Q 是概率分布, p ( x i ) p(x_i) p(xi) q ( x i ) q(x_i) q(xi) 分别是事件 x i x_i xi 在两个分布中的概率。

注:
交叉熵,KL散度,信息熵之间的关系:

H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) H(P,Q) = H(P) + D_{KL}(P||Q) H(P,Q)=H(P)+DKL(P∣∣Q)

当两个概率分布完全一致时,此时 p ( x i ) = q ( x i ) p(x_i) = q(x_i) p(xi)=q(xi),代入交叉熵的公式可得:

H ( P , Q ) = − ∑ i = 1 n p ( x i ) log ⁡ 2 q ( x i ) = − ∑ i = 1 n p ( x i ) log ⁡ 2 p ( x i ) = H ( P ) H(P,Q) = -\sum_{i=1}^n p(x_i)\log_2 q(x_i) = -\sum_{i=1}^n p(x_i)\log_2 p(x_i) = H(P) H(P,Q)=i=1np(xi)log2q(xi)=i=1np(xi)log2p(xi)=H(P)

其中, H ( P ) H(P) H(P) 是分布 P P P 的熵。通常情况下 P P P 代表真实的分布,其熵值为0,此时交叉熵达到最小值0。

import numpy as np

def cross_entropy(p, q):
    """
    计算离散概率分布的交叉熵
    """
    p = np.array(p)
    q = np.array(q)
    return -np.sum(p * np.log2(q))

# 示例
p = [0.2, 0.3, 0.1, 0.4]
q = [0.25, 0.25, 0.25, 0.25]
print(cross_entropy(p, q)) # 输出: 1.922
### 软Actor-Critic中的温度系数Alpha初始化 软Actor-Critic(SAC)是一种基于最大框架的离策略深度强化学习算法[^3]。其核心目标是在优化累积奖励的同时,通过增加动作分布的来促进探索行为。为了平衡奖励最大化和最大化之间的关系,引入了一个超参数——温度系数 $\alpha$。 #### 温度系数的作用 $\alpha$ 的作用在于调节奖励项 $r(S_t, A_t)$ 和项 $H(\pi_\theta(\cdot|S_t))$ 之间的重要性。具体而言,在 SAC 中的目标函数可以写成如下形式: $$ \max_{\pi_\theta} \mathbb{E}\left[\sum_t \gamma^t \left( r(S_t, A_t) + \alpha H(\pi_\theta(\cdot | S_t)) \right) \right] $$ 其中,较大的 $\alpha$ 值会更倾向于提高动作分布的不确定性(即更多探索),而较小的 $\alpha$ 则会让算法更加关注即时奖励的最大化。 #### Alpha的初始化方法 对于 $\alpha$ 的初始化,通常有以下几种常见方式: 1. **固定值初始化** 在某些简单环境中,可以直接设定一个固定的初始值作为 $\alpha$。例如,常见的默认值为 $\alpha=0.2$ 或者其他经验值。这种方法适用于环境动态较为稳定的情况,或者当先验知识表明特定的 $\alpha$ 可能表现良好时[^2]。 2. **自动调整机制** 更加推荐的方式是让模型自适应地学习最优的 $\alpha$ 值。这可以通过定义一个新的可训练变量并将其纳入到整个网络更新过程中实现。具体的实现过程包括: - 定义一个负数范围内的对数空间变量 ${log\_alpha}$ 并初始化它; - 使用指数映射得到正值的 $\alpha={exp(log\_alpha)}$; - 将该变量加入梯度下降步骤中以便不断修正至最佳状态。 自动调参的方法能够使算法更好地应对不同复杂程度的任务需求[^4]。 以下是采用PyTorch实现的一个简单的代码片段展示如何完成上述操作: ```python import torch.optim as optim class SACAgent(): def __init__(self, ...): self.log_alpha = torch.zeros(1, requires_grad=True) self.alpha_optim = optim.Adam([self.log_alpha], lr=lr) @property def alpha(self): return self.log_alpha.exp() def update_parameters(self,...): ... # Update temperature parameter automatically. alpha_loss = -(self.log_alpha * (log_pi + target_entropy).detach()).mean() self.alpha_optim.zero_grad() alpha_loss.backward() self.alpha_optim.step() ``` 此段程序展示了怎样构建以及维护用于控制随机性的热力因子,并且允许其随着训练进程自行演化直至达到理想水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值