问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

信息论基石:熵、互信息与KL散度如何驱动现代机器学习

创作时间:
作者:
@小白创作中心

信息论基石:熵、互信息与KL散度如何驱动现代机器学习

引用
CSDN
1.
https://blog.csdn.net/liu1983robin/article/details/146715050

在数据驱动的浪潮席卷全球,人工智能模型日益复杂的今天,一门略显“古典”的学科——信息论(Information Theory),正以前所未有的方式焕发新生。由“信息论之父”克劳德·香农(Claude Shannon)奠定的这套理论,最初旨在解决通信效率问题,如今却已深深渗透到机器学习的骨髓之中。从我们习以为常的交叉熵损失函数,到前沿的神经网络信息瓶颈方法,信息论无处不在,为我们理解和设计智能系统提供了强大的数学武器和哲学视角。

本文将扮演向导的角色,带你穿越信息论的核心地带,深入浅出地剖析熵 (Entropy)、条件熵 (Conditional Entropy)、互信息 (Mutual Information)和 KL 散度 (Kullback–Leibler Divergence)** 这四大基石概念。我们将不仅仅停留在定义层面,更会结合机器学习中的具体场景,辅以直观的图示和 Python 代码示例,助你夯实理论基础,点燃创新思维的火花。准备好了吗?让我们一起揭开信息论驱动 AI 的神秘面纱。

一、信息论的缘起与核心问题

信息论的故事始于 20 世纪 40 年代末,香农在他划时代的论文《通信的数学理论》中,为“信息”这一抽象概念赋予了精确的数学度量。他关心的是,如何在噪声干扰的信道中,以最高效、最可靠的方式传输信息?为此,他引入了“熵”来量化信息的不确定性,并提出了一系列关于编码、信道容量的定理,构成了现代数字通信的理论基础。


图:信息论之父克劳德·香农 (Claude Shannon)

那么,这和机器学习有什么关系呢?想象一下,机器学习模型训练的过程,本质上不也是一个“信息提炼”和“模式编码”的过程吗?我们试图从嘈杂、高维的数据(信源)中,提取出关于目标任务(如分类、回归)的关键信息,并将其编码到模型的参数(信道/编码器)中,最终做出准确的预测(解码)。信息论恰好提供了一套语言和工具来描述和优化这个过程:

  • 如何衡量数据中的“有用信息”?(熵、互信息)
  • 模型学到了多少关于数据的信息?(互信息)
  • 模型的预测与真实情况偏差多少?(KL 散度、交叉熵)
  • 如何在压缩信息的同时保留关键特征?(信息瓶颈)

这些问题的答案,都深深植根于信息论的基本原理中。

二、熵(Entropy):不确定性的度量

1. 熵的概念

熵,是信息论皇冠上的明珠。它并非物理学中的热力学熵,而是衡量一个随机变量不确定性程度的数学指标。一个随机事件的结果越是难以预测,其熵就越大;反之,结果越是确定,熵就越小。

对于一个离散随机变量X,其可能取值为X = { x 1 , x 2 , . . . , x n },对应概率为P ( X = x i ) = p ( x i )。香农熵H ( X )定义为:

H ( X ) = − ∑ i = 1 n p ( x i ) log ⁡ p ( x i )

其中,log通常以 2 为底(单位为比特, bits)或以自然对数 e 为底(单位为奈特, nats)。这个公式直观地理解:− log ⁡ p ( x i )表示事件x i发生所蕴含的“信息量”或“惊讶程度”(概率越小,信息量越大),而H ( X )则是所有可能事件信息量的期望值。

关键点:

  • 均匀分布时熵最大(最不确定)。
  • 确定性事件(某个p ( x i ) = 1)熵为 0(完全确定)。

2. 熵与机器学习

熵在机器学习中的应用非常广泛。最经典的例子莫过于决策树的构建。ID3、C4.5 等算法在选择分裂节点时,会计算信息增益 (Information Gain),即父节点的熵减去所有子节点熵的加权平均。选择哪个特征进行分裂,取决于哪个特征能最大程度地降低数据集关于目标标签的不确定性(即最大化信息增益)。

3. 代码示例:计算离散随机变量的熵

下面是用 Python 计算离散分布熵的简单函数:

import numpy as np

def calculate_entropy(probabilities):
    """
    计算离散随机变量的香农熵 (使用自然对数 - 单位: nats)
    Args:
        probabilities (list or np.array): 包含各事件概率的列表或数组.
    Returns:
        float: 计算得到的熵值.
    """
    # 过滤掉概率为0的项,避免 log(0)
    probs = np.array(probabilities)
    probs = probs[probs > 0]
    
    if len(probs) == 0:
        return 0.0 # 如果所有概率都为0 (理论上不可能对有效分布),熵为0
    # 计算熵: - sum(p * log(p))
    entropy_value = -np.sum(probs * np.log(probs))
    
    return entropy_value

# 示例1: 公平硬币 (均匀分布,熵最大)
fair_coin_probs = [0.5, 0.5]
print(f"公平硬币的熵: {calculate_entropy(fair_coin_probs):.4f} nats") 
# log2 时为 1 bit

# 示例2: 不公平硬币 (确定性增加,熵减小)
unfair_coin_probs = [0.9, 0.1]
print(f"不公平硬币的熵: {calculate_entropy(unfair_coin_probs):.4f} nats")

# 示例3: 确定性事件 (熵为0)
deterministic_event_probs = [1.0, 0.0]
print(f"确定性事件的熵: {calculate_entropy(deterministic_event_probs):.4f} nats") 

这段代码清晰地展示了如何根据熵的定义进行计算,并验证了熵与不确定性的关系。

三、条件熵(Conditional Entropy):新信息到来后,旧问题的不确定性

1. 条件熵的定义与意义

条件熵H ( Y ∣ X )衡量的是在已知随机变量X的条件下,随机变量Y的剩余不确定性。它不是指某个特定X = x值下的熵,而是X取遍所有可能值时,Y的熵的期望值。

其定义为:

H ( Y ∣ X ) = ∑ x ∈ X p ( x ) H ( Y ∣ X = x ) = − ∑ x ∈ X p ( x ) ∑ y ∈ Y p ( y ∣ x ) log ⁡ p ( y ∣ x )

这里,H ( Y ∣ X = x )是当X取特定值x时Y的熵。条件熵就是这些特定条件下熵的加权平均,权重是X取各个值的概率p ( x )。

核心思想:知道X能帮助我们减少多少关于Y的不确定性?如果X和Y完全独立,那么H ( Y ∣ X ) = H ( Y ),知道X对了解Y毫无帮助。如果X完全决定了Y,那么H ( Y ∣ X ) = 0,知道X后Y就没有任何不确定性了。

2. 条件熵与决策树(再探)

回到决策树的信息增益I G ( Y , X ),它正是用熵和条件熵定义的:

I G ( Y , X ) = H ( Y ) − H ( Y ∣ X )

这完美诠释了信息增益的含义:选择特征X进行分裂后,目标变量Y的不确定性从原来的H ( Y )减少到了H ( Y ∣ X )。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号