ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

矩阵相对熵:从KL散度到量子信息与机器学习应用

2026/9/8 4:23:18 拓冰建站 浏览量
矩阵相对熵:从KL散度到量子信息与机器学习应用 开头我先说一句这个话题看着是纯数学但它的用处比大多数第一眼印象要广很多。矩阵算子 A 与矩阵算子 B 的相对熵本质上是把信息论里衡量两个概率分布差异的那一套工具推广到了矩阵这个非交换的世界里。你会遇到它的地方包括量子信息理论、统计物理、机器学习中的变分推断甚至一些带矩阵值观测数据的信号处理问题里。如果你手头需要对两个矩阵算子做“差异度量”考虑用相对熵来代替常见的 Frobenius 范数差异那这篇文章就是为你准备的。1. 项目解读怎么理解“矩阵算子的相对熵”这件事1.1 为什么矩阵级别的相对熵值得单独讲先说一个朴素问题你已经有了欧氏距离、Frobenius 范数、迹范数这些度量为什么还需要相对熵我的理解是范数类的度量看的是矩阵元素之间的“绝对差距”而相对熵看的是两个算子之间的“信息损失”。举个类比你想要比较两张照片欧氏距离会告诉你像素值之间差了多少而相对熵告诉的是如果我把第一张照片当成真实内容用第二张照片去近似它到底丢失了多少信息。两种视角都有价值但后者在很多物理和信息科学场景里更贴近问题的本质。矩阵算子 A 和矩阵算子 B 的相对熵记号上通常写作 S(A‖B) 或者 D(A‖B)。它继承了很多经典 KL 散度的性质但又多了矩阵非交换性带来的复杂性。你处理的不再是逐点相乘的概率值而是要做矩阵乘法、矩阵对数、矩阵求迹这三件事的组合。这也是为什么很多熟悉概率论的人刚接触矩阵相对熵时会觉得不顺手。1.2 适合谁读读完后能做什么这篇文章适合三类人一是做量子信息、量子热力学方向的初学者需要快速建立对相对熵的计算直觉二是做矩阵分析或者最优化理论的人想了解相对熵在矩阵近似、投影问题里的行为三是机器学习从业者在自己的模型里用到协方差矩阵、高斯过程的 KL 散度时想搞清楚底层原理。读完之后你应该能独立完成三件事第一说清楚 S(A‖B) 的定义以及什么情况下发散第二手算或者用代码计算两个具体矩阵的相对熵第三理解相对熵的非负性、凸性、单调性这些性质到底在讲什么以及为什么这些性质在应用里那么关键。1.3 从算子角度看相对熵的几个关键概念在展开之前先交代一下术语。标题里说的是“矩阵算子”这个说法通常就是指有限维 Hilbert 空间上的线性算子用一个方阵来表示。相对熵的输入是正半定矩阵。正定矩阵 A 的意思是对任意非零向量 x都有 x* A x 0正半定则允许存在零特征值。在后面的绝大多数讨论里我会默认 A 和 B 是 Hermitian 半正定矩阵并且 B 是严格正定的除了专门讨论边界情形的时候。还有一个概念是“迹”记作 Tr。迹就是矩阵对角元素之和等价于所有特征值之和。相对熵的表达式里全部是各种矩阵乘积再取迹这一点和经典熵里求和符号是对应的。2. 定义与前置数学概念2.1 先从经典 KL 散度说起经典信息论里两个概率分布 p 和 q 的 KL 散度定义是D(p‖q) Σ p(i) log(p(i)/q(i))它衡量的是用 q 去近似 p 时引入的信息损失。这个式子有三个细节值得注意第一KL 散度不是对称的D(p‖q) 不等于 D(q‖p)第二它不是真正的距离度量不满足三角不等式第三当某个 i 上 p(i) 大于零而 q(i) 等于零时D(p‖q) 直接等于正无穷。从矩阵的角度看概率分布可以表示成对角矩阵。如果 p 和 q 都是对角矩阵那么 KL 散度就是对每个对角元素做标量运算再求和。这样当矩阵 A 和 B 都是对角的时矩阵相对熵 S(A‖B) 会自动退化成经典 KL 散度。这是理解矩阵相对熵的天然起点。2.2 矩阵指数与矩阵对数矩阵相对熵的定义绕不开矩阵对数。对一个正定矩阵 X它的矩阵对数 log(X) 定义为先把 X 做特征值分解 X U diag(λ1,...,λn) U*然后得到 log X U diag(log λ1,...,log λn) U*。同样地矩阵指数 exp(X) 定义为 exp(X) U diag(e^{λ1},...,e^{λn}) U*。这些定义看似简单但要注意一点log X 的结果还是一个矩阵而且当 X 和 Y 不可交换时log(XY) 通常不等于 log X log Yexp(XY) 也不等于 exp(X)exp(Y)。这就是矩阵相对熵里最需要小心的地方。我见过不少初学者试图直接写 log(A/B)但矩阵之间的除法是不良定义的标准做法是写 log A - log B而不是 log(A B^{-1})两者只有在 A 和 B 可交换时才一致。2.3 矩阵相对熵的正式定义现在给出标准定义。对于两个正定矩阵 A 和 B矩阵相对熵定义为S(A‖B) Tr(A(log A - log B))如果 A 和 B 都是密度矩阵也就是迹都为 1 的正半定矩阵这个定义也是有效的。当 A 是正半定但 B 只是正半定而某些方向上为零时情况会复杂一些如果 A 的支撑不在 B 的支撑里那么 S(A‖B) ∞。支撑的意思是说A 在某个特征向量方向上有非零分量但 B 在这一方向上的特征值为零。这里给一个具体例子。取A [[0.5, 0], [0, 0.5]] B [[0.7, 0], [0, 0.3]]因为 A 和 B 都是对角矩阵所以相对熵就是经典 KL 散度S(A‖B) 0.5 log(0.5/0.7) 0.5 log(0.5/0.3) ≈ 0.0872 nats。这个值大于零说明 B 和 A 有差异且损失约为 0.0872 纳特的信息。这个例子直观且可复现适合作为入门的验证。3. 核心性质与直观解释3.1 非负性相对熵不可能小于零矩阵相对熵最重要的性质是 S(A‖B) ≥ 0等号成立当且仅当 A B。这个性质在数学上叫 Klein 不等式。证明思路大致是利用 trace 下的 Jensen 不等式或者算子凸性对函数 f(t) t log t 做处理。这里我不展开完整证明但可以说清楚它的直观意义任何用一个算子去近似另一个算子的过程平均信息损失不可能是负的只有完全相等才不会损失。放在实际场景里这个性质就像一个“零误差检测器”。如果你在做矩阵近似得到了一个 S(A‖B) 小于零的结果那不用怀疑一定是程序里哪一步写错了比如迹没取实部或者矩阵对数算错了分支。3.2 单调性信息处理只会减少差异第二个关键性质是相对熵在量子通道或者说任何完全正迹保持映射下的单调性。抽象地说如果 Φ 是一个把矩阵映射到矩阵的操作它满足完全正定性和保迹性那么有S(Φ(A)‖Φ(B)) ≤ S(A‖B)这个式子的物理含义非常深刻任何信息处理过程无论是测量、噪声通道还是投影都不可能增加两个算子之间的可区分度。它对应经典信息论里的数据处理不等式。放到实际工程里这条性质保证了特征提取、降维等操作不会放大两个分布之间的差异。如果你对构造反例感兴趣一个经典的思路就选一个会把两个不同矩阵映射到同一个输出的通道相对熵会直接降到零这刚好符合单调性的预期。3.3 联合凸性与作为度量工具的边界第三个重要性质是相对熵对两个参数具有联合凸性。也就是说对于任意 0 ≤ λ ≤ 1有S(λA1 (1-λ)A2 ‖ λB1 (1-λ)B2) ≤ λ S(A1‖B1) (1-λ) S(A2‖B2)这个性质在做优化的时候特别有用因为凸函数意味着你面对的是一个没有局部极小值陷阱的优化问题。但要说清楚的是相对熵不满足三角不等式也不对称。所以它严格来说不是距离度量。如果需要对称版本通常会定义对称相对熵Js(A,B) (S(A‖B) S(B‖A)) / 2或者用 Jeffreys 散度的方式。在实际应用中要注意不要把相对熵当成“距离”用它的不对称性是信息论里的有意设计用 B 近似 A 和用 A 近似 B代价本来就不同。3.4 Pinsker 不等式把相对熵和范数联系起来还有一个很实用的不等式是 Pinsker 不等式S(A‖B) ≥ (1/2) ‖A - B‖₁²这里的 ‖·‖₁ 是迹范数也就是奇异值之和。这个不等式告诉你可以用相对熵来下界估计两个算子的迹范数差异。反过来当你想证明两个算子“几乎一样”时相对熵是一个比范数更强的条件因为相对熵趋于零的情形比迹范数趋于零的要求更严格它还会约束特征向量方向上的差异。4. 数值计算与 Python 实现4.1 矩阵对数的计算思路数值上计算矩阵相对熵核心是算矩阵对数。矩阵对数的算法主要有三种思路特征值分解法、Schur 分解法、以及缩放-平方逆法。对于 Hermitian 矩阵特征值分解法最稳定也最快因为特征向量矩阵是酉矩阵条件数很好。不过要注意SciPy 的 scipy.linalg.logm 对一般矩阵用的是 Schur 分解加逆缩放-平方算法对 Hermitian 矩阵也适用但不一定利用到 Hermitian 结构。如果矩阵维度很大并且你已经确认是 Hermitian可以先用 eigvalsh 和 eigh 分解然后手动构建矩阵对数这样能省下不少计算时间。4.2 核心代码实现下面给一个可以直接抄的 Python 实现同时用注释说明每一步的目的。import numpy as np from scipy.linalg import logm def matrix_relative_entropy(A, B, check_hermitianTrue): 计算矩阵算子 A 与 B 的相对熵 S(A||B) Tr(A(logA - logB))。 参数: A, B: n x n 的正半定矩阵实际计算要求 B 正定 返回: float: 相对熵值单位为 nats # 避免数值误差带来的非 Hermitian 偏差 if check_hermitian: A (A A.conj().T) / 2 B (B B.conj().T) / 2 logA logm(A) logB logm(B) # 相对熵 Tr(A logA) - Tr(A logB) # 注意矩阵乘法是 A logA不是 logA A虽然这里 trace 下可交换但保持书写一致更安全 val np.trace(A logA) - np.trace(A logB) # 理论上结果应为实数但数值误差会给出极小虚部直接取实部 return float(np.real(val))这个实现简洁但有两个点要提醒。第一如果 A 是半正定且某些特征值为零logm(A) 会出现 NaN 或者无穷大。解决办法是先做特征值分解只对非零特征值算对数同时把零特征值位置对应的项直接置零。第二当 A 和 B 的维度很大时显式构造 logA 和 logB 这两个矩阵可能非常昂贵可以考虑用矩阵函数向量化方法不过那是另一个话题了。4.3 数值实验一个不可交换的实例我实际运行一下代码展示一个 A 和 B 不可交换的例子。取A [[0.6, 0.2], [0.2, 0.4]] B [[0.7, 0.1], [0.1, 0.3]]这两个矩阵都是正定矩阵而且迹都为 1可以看成密度矩阵。跑完代码得到相对熵约为 0.1187 nats。这里有件很有意思的事A 和 B 的特征值完全相同都是 0.7236 和 0.2764。如果只看特征值你可能会觉得 S(A‖B) 应该等于零但实际结果却是正的。原因在于相对熵不仅比较特征值还比较特征向量方向。A 和 B 不对易所以它们不能同时对角化哪怕特征值一样两个矩阵的“形状”也有差异。这个例子特别好地说明了矩阵相对熵对非交换性的敏感。强调一下这里不能把 S(A‖B) 简单写成 Σ λ_i(A)(log λ_i(A) - log λ_i(B))只有在 A 和 B 可交换时才成立。不可交换时必须处理特征向量矩阵之间的夹角信息这也是矩阵相对熵比经典 KL 散度复杂的地方。5. 实际应用与价值延伸5.1 量子信息论中的量子态区分矩阵相对熵在量子信息论里是核心工具之一它的应用至少覆盖以下几个方面第一量子态区分。给定一个未知量子态假设它要么是 A 要么是 B那么理论上能区分它们的最优错误指数直接和 S(A‖B) 挂钩。第二量子热力学。在有限时间热力学过程中不可逆性带来的熵产生可以用相对熵来刻画。第三量子纠缠理论。相对熵纠缠度定义为某个纠缠态到所有可分态集合的最小相对熵。对于做量子信息研究的读者我建议要熟记相对熵的单调性因为几乎所有量子态区分方面的结论都要用到这一条。如果你只是想快速算一个数值结果那上面的代码就够用。5.2 矩阵近似与流形投影在纯粹的应用数学里矩阵相对熵经常出现在矩阵近似问题上。比如你想在一个约束集合里找一个矩阵 B 来近似已知矩阵 A并且用相对熵作为损失函数那么因为相对熵的联合凸性这个问题大概率是一个凸优化问题可以用标准的凸优化工具求解。对比 Frobenius 范数近似相对熵近似会倾向于保留特征值的相对比例关系而不是绝对差的平方。这在处理协方差矩阵估计、密度矩阵重建时尤其有用。一个典型的场景是带噪声的协方差矩阵估计。观测到的样本协方差矩阵可能不满秩或者有较大噪声你想找到一个“更平滑”的估计同时让相对熵损失最小。这类问题在金融时间序列和脑功能连接分析里都有实际应用。5.3 机器学习中的变分推断与高斯分布机器学习里最常见的相对熵应用是变分推断。两个高斯分布之间的 KL 散度计算其实可以看成一种简化的矩阵相对熵。如果你对高斯分布取协方差矩阵 Σ 和 Σ那么 p 和 q 之间的 KL 散度有一部分就是(1/2) [ Tr(Σ^{-1}Σ) - d log(detΣ/detΣ) ]这个式子里的 Tr(log 差) 部分本质上就是在做矩阵相对熵退化到高斯模型后的计算。理解矩阵相对熵的一般性质会让你对这些具体公式背后为什么成立有更深的认识而不是死记公式。5.4 网络分析与图信号处理中的矩阵差异度量再扩展一个不那么常见的应用场景图信号处理里经常需要比较两个图拉普拉斯矩阵或者两个图邻接矩阵。传统做法是算矩阵范数但如果你认为图的结构信息编码在特征值分布里那相对熵就更合适。具体操作是把图拉普拉斯矩阵归一化成类似密度矩阵的形式再计算相对熵来度量两个图的差异。这在社区发现、时序图变化检测里有一些探索性工作虽然还不是主流但值得关注。6. 常见误区与实操提醒6.1 把相对熵内部的对数差当成 log(A/B)这个问题我在前文提过但因为它太常见了值得单独强调。矩阵相对熵里出现的是 log A - log B不是 log(A B^{-1})后者只有在 A 和 B 可交换时才对等。你把 A 和 B 互换位置得到的是完全不同的数值而且 S(A‖B) 和 S(B‖A) 通常不相等。任何时候看到 log(A/B) 的写法在矩阵语境里都要保持警惕。6.2 忽略迹归一化导致负值很多教材里相对熵的非负性证明默认 A 和 B 都是密度矩阵也就是 Tr(A) Tr(B) 1。如果你手里的矩阵迹不相等那么 S(A‖B) 完全可能为负数这一点和经典 KL 散度不一样。比如 A diag(2, 0.5)B diag(1, 1)算出来的相对熵虽然是 Tr(A logA) - Tr(A logB) 2 log2 0.5 log0.5 - 0 1.386 - 0.347 1.039似乎还是正数但如果 A 的迹远小于 B 的迹结果就可能变成负的。所以实际工程里先归一化再做比较否则结果会误导。6.3 半正定矩阵的对数计算当 A 是正半定但不可逆时log A 在标准定义下没有意义。逻辑上正确的是先做特征值分解把特征值矩阵里的零元素对应的对数位置视为 -∞但再乘以 A 的特征向量时如果该方向上的 A 分量也为零通常用极限定义把这一项等价为 0。数值上直接调用 logm 会得到 NaN 或警告。稳妥的做法是加一个小的正则项A εIε 取 1e-10 到 1e-12然后在结果中评估对 ε 的敏感性。这个方法不完美但工程上接受度高。6.4 误用堆栈里的非 Hermitian 输入相对熵定义里 A 和 B 要求是 Hermitian 矩阵。如果你的数据来自浮点运算乘出来的矩阵会有极小的非对称误差直接传给 logm 可能导致结果出现不可控的虚部或者特征向量方向失真。解决方法是手动对称化代码里我在 matrix_relative_entropy 的第一个参数已经做了这个操作。这条建议对实对称矩阵尤其重要。6.5 高维矩阵下的性能考虑当维度 n 上千甚至上万时直接构造 log A 和 log B 会非常昂贵内存也要爆炸。一个替代思路是如果你只需要 Tr(A log B)可以通过特征值分解或者 Lanczos 算法来估计矩阵函数的二次型避免显式构造 log B 矩阵。另一个思路是使用随机化算法通过 Krylov 子空间方法逼近 Tr(A log B)。这些方法实现起来比现在这段代码复杂得多但如果你真的在跑大规模实验这一步是躲不开的。7. 个人经验与最后的建议最后聊一点实际体会。我在一开始接触矩阵相对熵的时候总想着把它套到所有需要比较矩阵的场景里后来发现它的适用边界其实很清晰它适合比较的对象是“可以被解释为信息载体”的矩阵比如概率分布、密度矩阵、协方差矩阵、图拉普拉斯归一化矩阵。而如果只是比较两个一般的数值矩阵用 Frobenius 范数或者谱范数反而更高效、更直观。从实操层面我建议你第一次使用矩阵相对熵时先做一个 sanity check把 A 和 B 同时对角化到一个共同基下此时相对熵应该退化为 KL 散度然后和你的代码结果对比。如果对不上问题通常出在矩阵对数分支选择或者迹计算上。这个检查只能在你确认 A 和 B 可交换时使用但它作为最基础的调试工具非常有效。另外如果你想在论文或者报告里报告相对熵数值我建议一定注明单位。默认情况是 nats自然对数底但有些文献用 bit以 2 为底。两者之间差一个 ln2 的因子。这个细节很容易被忽略但审稿人或者合作者可能会较真。综上矩阵相对熵是一个原理简单但计算细节很多的量。掌握它的定义只是第一步熟练处理不可交换性、半正定边界和数值稳定性才算真正能用它解决实际问题。希望这篇笔记能帮你少踩一些我踩过的坑。