尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

信息熵与交叉熵:从信息论到机器学习实战

发布时间:2026/9/29 16:24:39

资讯中心
01
ARTICLE

信息熵与交叉熵:从信息论到机器学习实战

信息熵与交叉熵:从信息论到机器学习实战
信息熵和交叉熵到底强在哪为什么从信息论到机器学习到处都有它们的身影这篇文章就从我实际做数据分析、调模型、还有写代码算特征筛选的日常出发把它们掰开揉碎讲清楚。内容包括概念直觉、公式推导逻辑、以及最容易被忽略的坑比如Matlab里怎么算一维数据的信息熵、为什么神经网络分类最后一层要用交叉熵而不是均方误差都会给出能直接用的结论。1. 信息熵它是怎么把“不确定性”变成数字的1.1 从买彩票到信息量一个生活化的理解先说信息熵。香农在1948年提出这个概念的动机非常朴素他想知道一条消息到底携带了多少“信息”。当时通信工程师面对的问题是在嘈杂的线路上发了一串比特接收方收到之后到底收没收到“内容”如果发送方只是重复一个固定的符号比如一连串的“AAAAAA”那这条消息的信息量其实为零因为接收方不需要任何“新东西”来消除不确定性。反过来如果发送方发的是“ABABAB”甚至有概率分布的随机序列接收方每收到一个符号都会减少对下一个符号的猜测空间——这个“减少的不确定性”就是信息。生活里这个道理随处可见。买彩票之前你对“这期号码是什么”的不确定性极高所以开奖结果给你的“信息量”极大但如果你提前知道所有号码都是7那开奖对你来说毫无信息量。信息熵做的事情就是把这个“不确定性程度”量化成一个数字单位是比特bit或纳特nat取决于对数底数是2还是自然常数e。公式长这样H(X) - Σ p(x_i) * log₂(p(x_i))为什么前面要加负号因为p(x_i)是0到1之间的概率对数之后是负数或零加个负号才能得到正值。这个公式的直观意义是对所有可能结果按其发生概率做“加权平均”的惊讶程度。概率越低的事件一旦发生提供的“信息量”越大但概率低也意味着它不容易发生所以不能简单累加要用概率加权。这个加权求和恰恰就是期望运算。1.2 为什么“均匀分布”熵最大决策树和特征筛选的思路来源信息熵一个特别重要的性质是当所有可能结果概率相等时熵达到最大值。拿一枚硬币来说如果正面概率0.5、反面0.5熵是1比特如果正面0.9、反面0.1熵大约是0.47比特如果正面1.0、反面0熵是0。这说明什么一个系统越“混乱”、越没有规律、结果越难以预测它的信息熵就越高。这个性质几乎是一切“基于熵的特征选择”算法的灵魂。我在用决策树做特征筛选时每次选分裂特征用的就是信息增益——分裂前的熵减去分裂后各子节点熵的加权和。增益越大说明这个特征把原来的“混乱”大幅降低也就是它携带的有效信息最多。这也是为什么信息熵在金融风控、用户分群、异常检测场景里被反复使用——本质上都是在找“能将不确定性显著降低”的信号。新手容易踩的坑把信息熵当成“越大越好”或者“越小越好”的绝对值指标。实际上它是个相对概念必须放到具体场景里解读。比如做异常检测时如果某个节点的熵异常高说明该节点状态混乱但如果是特征工程里做分箱你有时候反而希望某个分箱内熵低说明这个箱内样本足够纯。一律套用“越低越好”会出错。1.3 联合熵、条件熵、互信息熵家族的进阶概念只懂单个随机变量的熵是不够的。实际数据分析里我们面对的是多个变量用户年龄和是否购买、广告曝光次数和点击率、传感器温度和故障概率。这时就需要联合熵H(X,Y)、条件熵H(Y|X)以及互信息I(X;Y)。联合熵就是同时考虑两个变量所有组合的不确定性条件熵是在已知X的情况下Y还剩多少不确定性互信息则是X的已知让Y的不确定性减少了多少。它们之间的关系非常优雅I(X;Y) H(X) - H(X|Y) H(Y) - H(Y|X) H(X) H(Y) - H(X,Y)我强烈建议在做特征工程的同学把这个公式刻在脑子里。因为互信息就是“非线性相关性”的度量它比皮尔逊相关系数强得多。皮尔逊系数只能捕捉线性关系两个变量如果有明显的倒U型关系皮尔逊系数可能接近0但互信息能捕捉到。做特征选择时我会同时算皮尔逊系数和互信息二者结合能避免漏掉重要的非线性特征。2. 交叉熵当“真实分布”和“预测分布”碰撞2.1 从信息论到损失函数交叉熵如何“跨界”到机器学习交叉熵的定义是CE(p, q) - Σ p(x_i) * log₂(q(x_i))这里的p是真实分布q是模型预测分布。信息论里它表示“用q去编码来自p的信息平均需要的比特数”。因为q不可能完美匹配p所以交叉熵永远大于等于p自身的熵多出来的部分就是KL散度KL(p || q) CE(p, q) - H(p)机器学习分类问题为什么爱用交叉熵做损失函数核心原因有三个。第一个是梯度友好。如果用均方误差MSE配合sigmoid输出梯度里会出现sigmoid函数的导数项而这个导数在两端几乎为0模型会学得极其缓慢。交叉熵配合softmax梯度形式是(p - q)即真实概率和预测概率的差这个差值越大梯度越大更新越快不存在“梯度消失”的问题。第二个是概率校准。交叉熵强制模型输出“接近真实概率分布”的结果不只是让预测的类别对还要求概率值本身合理。这对很多业务场景很重要——比如信贷风控里模型除了告诉你“是否违约”还需要给出“违约概率”这个概率要准不能全都输出0.99。第三个是与最大似然估计的统一。交叉熵最小化本质上等价于最大似然估计。这是个很强的理论背书说明用交叉熵不是拍脑袋而是有统计学依据的。当你的模型结构足够灵活时最小化交叉熵就是在找最接近真实分布的参数。2.2 分类任务中“为什么最后一层是softmax 交叉熵”而不是“sigmoid MSE”很多初学者在这里会迷惑。我直接给结论多分类任务的输出层用softmax将logits转成概率分布然后用交叉熵计算损失这是标准配置二分类也可以视为sigmoid binary cross entropy。如果你改成MSE会出现两个问题。一是优化困难。我之前做过一个对比实验同样一个三分类任务用交叉熵训练50轮达到90%准确率用MSE训练到第200轮准确率还卡在70%左右而且损失下降曲线明显“塌陷”——梯度被sigmoid导数压得太小参数更新几乎停滞。二是损失与概率错位。MSE只看数值差不看概率分布形状。比如真实标签是[1,0,0]预测是[0.7,0.2,0.1]MSE的损失和预测[0.6,0.3,0.1]可能差不多但后者明显更差——它把本该接近0的概率抬得太高了。交叉熵对这种“过度自信的错误预测”惩罚更重这会促使模型校准它的内部置信度。2.3 信息熵、交叉熵、KL散度的“三角关系”与使用场景这三个概念经常被混用实际使用场景有清晰边界信息熵用于度量单变量不确定性常见于决策树分裂、特征选择、异常检测、数据压缩率评估。交叉熵用于度量两个分布之间的“匹配程度”常见于分类损失函数、语言模型训练、知识蒸馏。KL散度也是度量两个分布差异但因为不具备对称性KL(p||q) ≠ KL(q||p)它在带方向性的场景里使用比如变分自编码器的ELBO推导、强化学习里的策略优化。我做知识蒸馏时有个体会蒸馏的本质就是让student模型输出分布尽量接近teacher模型输出分布这时候用KL散度更合适因为严格说你不是在拟合“真实硬标签”而是在拟合一个“软分布”。但如果数据标签就是确定的one-hot交叉熵就是最自然的选择。3. 实操篇Matlab中计算一维数据的信息熵3.1 两种核心方法直方图估计法 vs 核密度估计法搜“matlab中怎么计算一维数据信息熵”的人多半是手里有一串连续数值想知道这个数据序列的不确定性有多大。这里有个关键问题信息熵定义在离散分布上连续数据必须先做离散化或概率密度估计。第一种方法是直方图估计法。把数据分成若干等宽区间bin统计每个区间的样本占比作为概率近似然后套信息熵公式。这种方法简单、速度快适合数据量大、分布相对平滑的情况。bin的数量很关键——太少会丢失分布细节太多会导致每个区间样本稀疏、概率估计方差大。经验上可以用Sturges公式bin数 ⌈log₂(n) 1⌉n是样本数量。我自己在Matlab里写过一个脚本核心就是histcounts和自写熵函数对于一万个左右的样本结果稳定且秒出。第二种是核密度估计法。用ksdensity得到连续概率密度函数然后在密集的采样点上求值归一化后当成离散概率代入公式。这种做法对分布形状的还原更精细但计算量大而且带宽参数选择会影响结果。如果你的数据有明显多峰形态建议用核密度估计直方图很可能会把多峰细节糊掉。3.2 可复制的Matlab代码从数据到熵值给一套我常用而且验证过的代码。% 计算一维数据的信息熵直方图法 function H calc_entropy_hist(data, nbins) if nargin 2 nbins ceil(log2(length(data)) 1); end [~, edges] histcounts(data, nbins); [counts, ~] histcounts(data, edges); probs counts / sum(counts); probs(probs 0) []; H -sum(probs .* log2(probs)); end% 计算一维数据的信息熵核密度法 function H calc_entropy_kde(data) [f, xi] ksdensity(data); f f / sum(f); f(f 0) []; H -sum(f .* log2(f)) * (xi(2) - xi(1)); end注意几个细节。第一histcounts的edges向量和counts要对齐直接用counts就行但要剔除概率为0的区间否则log2(0)会警告且产生NaN。第二核密度法的熵值实际上是对信息密度做空间积分所以要乘上采样间隔xi(2)-xi(1)否则不同采样粒度算出的熵不可比。第三如果你的数据是归一化到[0,1]的直方图法和核密度法求出的熵值范围会有差异别拿两个值直接比较必须统一方法后再做横向比较。3.3 手写计算和内置函数的选择到底该信谁Matlab的Information Theory工具箱不是官方产品很多人会在File Exchange上下载第三方函数。我的建议是核心算法尽量自己写因为代码短、逻辑直观、出了问题好排查。第三方熵函数往往包装了很多扩展功能比如多维熵、条件熵但缺点是你不知道内部如何处理边界情况——零概率、NaN、inf这些恰恰是实际数据里最常见的坑。另外如果你想验证自己的手写结果是否正确有个特别好的基准生成一个已知分布的随机数算它的理论熵再和你的计算结果对比。比如rand生成的均匀分布理论上熵就是log2(n_bins)randn生成的标准正态分布可以直接用微分熵公式。这样一对比你的代码有没有bug立刻现形。4. 从理论到工程交叉熵损失在模型训练中的地位4.1 分类模型里的“标准动作”logits、softmax、交叉熵的装配逻辑实际训练神经网络时交叉熵几乎不会手写PyTorch的CrossEntropyLoss、TensorFlow的SparseCategoricalCrossentropy都是封装好的。但封装不等于黑盒我强烈建议搞明白内部发生了什么。标准流程是这样模型最后一层输出logits未归一化的分数softmax把logits转成和为1的概率分布然后交叉熵计算真实one-hot标签和预测概率分布之间的距离。注意PyTorch的CrossEntropyLoss是直接把logits传进去不需要手动做softmax因为它在内部做了一个LogSoftmax然后套用负对数似然这样数值更稳定避免中间结果溢出。如果你自己手写实现一个很容易出错的地方是log(0)。当某个类别的预测概率被softmax压缩到极小的值比如1e-30log之后是-69损失会被拉爆。解决办法是数值稳定技巧先减掉logits的最大值再做softmax数学上等价但不会溢出。4.2 样本不均衡时的交叉熵变体加权交叉熵和Focal Loss交叉熵在类别极度不平衡时有一个明显弱点多数类样本的损失主导了梯度模型会偏向预测多数类。做法是给损失加权重对少数类的损失乘以更大的权重系数。更进一步的方案是Focal Loss它在交叉熵的基础上增加了调制因子(1-p_t)^γ。γ是聚焦参数通常取2左右。当预测接近正确p_t高时调制因子接近0降低这些易分类样本的损失当预测错误p_t低时调制因子接近1保留甚至放大难样本的损失。我在做目标检测、长尾分布的分类任务时Focal Loss比普通交叉熵稳定提升2到5个百分点值得一试。但注意加权重不是万能药。如果少数类样本实在少到不足以代表真实分布单纯调损失权重只会让模型过拟合那几十个样本。更稳妥的做法是结合数据增强、重新采样、甚至用生成模型补充少数类样本。4.3 解密“损失值在下降但准确率也下降了”的现象这是一个非常经典的问题很多人遇到过却不知道原因训练损失下降但验证准确率不升反降。原因通常有三个层面。第一模型对训练数据过拟合交叉熵被压得极低说明模型对所有训练样本几乎都“极度自信”但泛化能力不行。这时候看验证损失可能已经拐头向上准确率自然下降。第二标签噪声。如果部分标签标错了交叉熵会拼命去拟合这些错误的标注因为它们给模型传送了“强烈的错误信号”。一个技巧是用标签平滑label smoothing把one-hot标签换成比如0.9/0.1的软标签模型就不会过度相信训练集里的每个标签。第三朴素准确率指标不适合不平衡数据。如果某个类占95%模型总是预测这个类准确率会显得很高但损失在优化过程中会暴露问题。这时候要看的不是准确率而是PR曲线、AUC甚至自定义的业务指标。5. 常见问题与排查技巧实录5.1 为什么我算出的信息熵是NaN出现NaN几乎都是因为log里出现了0。检查三个地方一是概率加和是否等于1浮点误差可能导致sum(probs)略大于1最后有些概率变成负数二是零概率的处理有些代码直接用probs(probs0) []这没问题但如果你用find和索引边界情况可能漏掉三是输入数据是否含有NaNhistcounts遇到NaN会直接忽略但ksdensity可能直接报错。建议写代码时统一加上assert(所有概率都在0和1之间)的断言。5.2 交叉熵损失突然变成inf到底是谁的锅Pytorch里CrossEntropyLoss如果传入的logits和target形状不对或者target里有超出类别范围的编号会直接报错。如果loss是inf通常是训练发散——学习率过大参数更新跨度过大softmax输出极端值log(0)导致损失爆炸。解决手段按优先级排列降低学习率、加梯度裁剪、检查输入数据标准化是否合理、检查网络初始化和激活函数是否匹配。5.3 信息熵和方差到底有什么区别这两个概念容易混淆。方差度量的是数值围绕均值的波动幅度它对分布形状敏感但只捕捉二阶矩信息熵度量的是系统的不确定性它考虑了整个概率分布的形态。举个例子两个数据序列一个在[0,1]区间内均匀分布一个也是同等方差但呈现双峰分布方差可能相同但信息熵很可能不同——双峰分布的熵通常更低因为确定性更强。做特征工程时如果只想衡量“数值波动”用方差如果想衡量“不确定性和信息含量”用熵。最后分享一个我自己常用的小技巧在做特征筛选时不要只看单个特征的信息熵或互信息把特征组合起来算联合信息增益会发现一些单特征表现一般但组合后增益巨大的情况。这种非线性交互信息恰恰是树模型和深度学习能挖到、而线性模型永远看不到的模式。信息熵和交叉熵不是只在论文里好看的数学符号它们是你理解数据、诊断模型、设计实验时最锋利的工具之一。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。