想象小李和小王为同一座城市各写了一份一日游攻略。每个景点在攻略里都有一个“推荐权重”——权重越高,越值得专程跑一趟。现在问题来了:怎么量化“这两份攻略差多远”?最直接的思路是 KL 散度:相当于小李拿着自己的攻略,去数“小王强推的地方我怎么没写?”可这件事有两个致命毛病:第一,方向不同答案就不同,小李看小王的攻略,和小王看小李的攻略,数字往往不一样;第二,如果小王提到了一个小李闻所未闻的景点,计算会直接“爆表”。JS 散度(Jensen-Shannon 散度)像一位公允的调解员:先把两份攻略按权重平均成一份“中立攻略”,再让两人分别跟中立攻略比较,最后各取一半综合成绩。这样既对称,又永远不爆表,而且数值封顶在 0.693(即 1 比特)以内。别小看这小小的改进——它直接决定了生成对抗网络(GAN)的兴衰,也是今天 AI 系统评估“两个分布像不像”的默认标尺。

岗位关联

掌握 JS 散度,你就拥有了一把读懂 GAN 训练曲线、诊断梯度消失、评估分布对齐的通用标尺——这是生成模型与深度学习从业者的必备直觉。

目录
  1. 可视化演示
  2. 一、背景与动机:两份攻略差多远?
  3. 二、JS散度的定义与对称性:中立攻略调解员
  4. 三、有界性与度量性质:最多 1 比特的意外
  5. 四、与KL和互信息的关系:家族血缘
  6. 五、f散度统一框架:评分模板的配方
  7. 六、GAN损失设计:仿画师与鉴定师的博弈
  8. 七、Wasserstein对比:当攻略完全不相交
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示JS散度核心机制:P/Q/M分布对比(JS=1/2*KL(P||M)+1/2*KL(Q||M)对称化KL)、JS vs KL性质差异(对称性+有界性log2+定义对比)、GAN中最优判别器下生成器损失等价JS散度(梯度消失与Wasserstein替代),交互切换核心维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

JS散度分布对比 P和Q为两个概率分布,M=(P+Q)/2为中间分布 JS=1/2*KL(P||M)+1/2*KL(Q||M),对称化KL散度 当P=Q时JS=0,P与Q完全不重叠时JS=log2 JSD(P||Q) = 1/2*KL(P||M) + 1/2*KL(Q||M), M=(P+Q)/2 中间分布M+对称化+有界log2

一、背景与动机:两份攻略差多远?

小李和小王为同一座城市各写了一份一日游攻略。他们把每个景点都标上一个“推荐权重”——权重越大,越值得专门跑一趟。两份攻略看似都是满满一页,内容侧重却完全不同。现在他们想回答一个朴素的问题:这两份攻略,到底差多远?

信息论给出的经典答案叫 KL 散度。它的大白话版本是:站在小李的立场,按小李的权重数一数“小王推荐的地方,在小李看来有多离谱”。这个量化方式的致命缺点是单方向的——小李看小王的攻略,和小王看小李的攻略,得到的数字往往不一样,就像问“你对我的了解多,还是我对你的了解多”,答案天然不对称。更麻烦的是分母比值 P(x)/Q(x):如果小王写了一个小李闻所未闻的景点(Q(x)=0 而 P(x)>0),比值直接除以零,差距冲向无穷大。一份攻略再离谱,也不该让“差距”当场爆表。

就像问路时单问“你认识我吗”没有意义一样,KL 散度这种“单程票”在工程里很难用。我们需要一份绕开方向、也不会爆表的对比规则——这正是 JS 散度登场的理由。

KL(P∥Q)=∑xP(x)ln⁡P(x)Q(x)KL(P\parallel Q)=\displaystyle\sum_{x}P(x)\ln\frac{P(x)}{Q(x)}
KL 散度是“以 P 的视角看 Q 有多意外”:方向颠倒数值会变,分母为零时直接无穷大。
  1. 遍历所有景点公式在所有景点 x 上累加,一个都不能漏,每个景点都要参与打分。
    x∈Xx\in\mathcal{X}
  2. 按 P 的权重加权以小李的推荐权重 P(x) 作为加权系数,体现“小李视角”。
    P(x)⋅(ln⁡P(x)Q(x))P(x)\cdot\left(\ln\frac{P(x)}{Q(x)}\right)
  3. 计算比值取对数P(x)/Q(x) 表示同一景点在两人攻略中的“地位倍数”,对数把倍数变成可累加的差异分。
    ln⁡P(x)Q(x)\ln\frac{P(x)}{Q(x)}
  4. 加权求和把每个景点的差异分汇总成总分。
    ∑xP(x)ln⁡P(x)Q(x)\sum_{x}P(x)\ln\frac{P(x)}{Q(x)}

二、JS散度的定义与对称性:中立攻略调解员

解决思路很朴素:与其让两人互相比较(伤了和气),不如先综合出一份“中立攻略”。所谓中立,就是每个景点的推荐权重取两人的平均:M(x)=(P(x)+Q(x))/2。然后,小李和小王各自与中立攻略比较,最后把两个“差距分”取平均。这个方案就是 JS 散度(Jensen-Shannon 散度)。它把“谁比谁”的问题,改成了“各自与共同的基准比”,方向感被彻底抹平。

对称性可以严格证明——交换两人后结果不变:

中立攻略的价值在于:无论谁先发言,评判基准都不变——这就是“对称性”的直觉。KL 散度的两条毛病(方向不同、分母爆表)被同一招化解:分母永远有中立攻略兜底。

JS(P∥Q)=12KL ⁣(P∥P+Q2)+12KL ⁣(Q∥P+Q2)JS(P\parallel Q)=\frac{1}{2}KL\!\left(P\parallel\frac{P+Q}{2}\right)+\frac{1}{2}KL\!\left(Q\parallel\frac{P+Q}{2}\right)
JS 散度 = 两份攻略各自与“中立攻略”的 KL 散度的平均。
  1. 中立攻略不变加法满足交换律,两人互换后平均分布完全相同。
    P+Q2=Q+P2\frac{P+Q}{2}=\frac{Q+P}{2}
  2. 半 KL 项换位两个半 KL 项恰好交换位置,求和值保持不变。
    12KL(P∥M)+12KL(Q∥M)=12KL(Q∥M)+12KL(P∥M)\frac{1}{2}KL(P\parallel M)+\frac{1}{2}KL(Q\parallel M)=\frac{1}{2}KL(Q\parallel M)+\frac{1}{2}KL(P\parallel M)

三、有界性与度量性质:最多 1 比特的意外

有了中立攻略,JS 散度还收获了一个神奇性质:数值永远不会超过 ln2≈0.693。原因在于每份攻略的推荐权重都是 0 到 1 之间的概率,把两份攻略捏合成中立攻略,信息量最多只增加“这份攻略到底出自谁手”的二选一不确定性——正好 1 比特(用自然对数表示为 ln2)。不管城市有多大、景点有多少,这个上限都成立。

除了对称、有界、非负,JS 散度还有一个容易被忽略的细节:它本身不满足三角不等式,不算严格意义上的“距离”;只有开根号后的 √JS 才是真正的度量(满足三角不等式)。这就像“两份攻略的差异分”不能直接当里程用,开方校准后才有“两点之间线段最短”的距离直觉。有界性让工程设阈值变得极其方便:0.1、0.3、0.6 都有着明确的语义,这是它成为默认“分布距离”的重要原因。

0≤JS(P∥Q)≤ln⁡2≈0.6930\le JS(P\parallel Q)\le\ln 2\approx 0.693
JS 散度永远落在 0 到 ln2 之间:0 表示两份攻略完全相同,ln2 表示完全不同到极致。
  1. 下界来自 KL 非负两个非负的 KL 项取平均,结果必然非负。
    12KL(P∥M)+12KL(Q∥M)≥0\frac{1}{2}KL(P\parallel M)+\frac{1}{2}KL(Q\parallel M)\ge0
  2. 变形为熵形式JS 散度等于“混合攻略的熵”减去“两份攻略的平均熵”。
    JS(P∥Q)=H(M)−H(P)+H(Q)2JS(P\parallel Q)=H(M)-\frac{H(P)+H(Q)}{2}
  3. 熵的凹性给出上界混合带来的信息增量最多等于“二选一”的不确定性。
    JS≤H ⁣(12,12)=ln⁡2JS\le H\!\left(\frac{1}{2},\frac{1}{2}\right)=\ln2

四、与KL和互信息的关系:家族血缘

JS 散度不是凭空出现的,它是 KL 散度的“对称化手术”产物——把单方向的 KL 拆成两份,让它们共享同一个中位基准。而互信息表面上是一个新概念,实际上也是 KL 家族的一员:它衡量的是“联合分布”与“把两个变量当成独立时的乘积分布”之间的 KL 差距。如果说 KL 是底层积木,那么互信息就是把“独立性差异”包装成信息的 KL,JS 则是 KL 的对称化版本。三者共享同一个基因——对数似然比。

更妙的是,JS 散度与互信息直接相通。当你以一半概率随机读小李的攻略 P、一半概率读小王的攻略 Q,然后从选中攻略里随机抽一个景点 X 时,问“从景点 X 能猜出它来自哪本攻略吗”——这个“猜来源”的信息量恰恰就是 JS 散度:

血缘关系一句话总结:KL 散度是底层积木,互信息和 JS 散度都是它的“包装款式”——一个用于衡量独立性,一个用于衡量对称差异。

I(X;Y)=KL(PXY∥PXPY)=H(X)+H(Y)−H(X,Y)I(X;Y)=KL(P_{XY}\parallel P_XP_Y)=H(X)+H(Y)-H(X,Y)
互信息 = 联合分布与独立乘积分布的 KL 散度,即“认识 X 后 Y 的不确定性减少多少”。
  1. 来源指示变量Z 表示“抽到哪本攻略”,等概率二选一。
    P(Z=1)=P(Z=0)=12P(Z=1)=P(Z=0)=\frac{1}{2}
  2. 条件抽样关系给定 Z,X 服从对应的攻略分布。
    X∣Z=1∼P,X∣Z=0∼QX\mid Z=1\sim P,\quad X\mid Z=0\sim Q
  3. 化简得 JS来源信息量等于 1 比特减去条件熵,恰好是两分布间的 JS 散度。
    I(Z;X)=H(Z)−H(Z∣X)=JS(P∥Q)I(Z;X)=H(Z)-H(Z\mid X)=JS(P\parallel Q)

五、f散度统一框架:评分模板的配方

如果你见过 KL、χ²、Hellinger、全变差等多种散度,会好奇:它们是不是同一套模板的不同款式?数学家给出了肯定答案。把“比较两个分布”抽象成三步:先对每个景点计算两人的推荐比例 r=P/Q;再用一个“凸函数” f 给这个比例打分;最后按 Q 的权重加权求和。这个统一配方就是 f 散度族。所谓凸函数,可以粗略理解为向上弯曲的锅形曲线——它保证了“差异分”永远非负。

不同款式对应不同的 f:KL 用 $f(t)=t\ln t$;反向 KL 用 $f(t)=-\ln t$;卡方散度用 $f(t)=(t-1)^2$;Hellinger 距离用 $f(t)=(\sqrt{t}-1)^2$;而 JS 散度对应 $f(t)=\frac{1}{2}\left[t\ln t-(t+1)\ln\frac{t+1}{2}\right]$——一个精心设计的“对称款”。所以 JS 散度不是 KL 的敌人,而是同一家族里更温和的成员。找工作面试时会准备不同简历模板,散度家族同理:不同的 f 就是不同的模板,JS 是“谁都不得罪”的那一款。

Df(P∥Q)=∑xQ(x) f ⁣(P(x)Q(x))D_f(P\parallel Q)=\displaystyle\sum_{x}Q(x)\,f\!\left(\frac{P(x)}{Q(x)}\right)
f 散度 = 以 Q 为基准,对比值 r=P/Q 用凸函数 f 打分后,按 Q 权重加权求和。
  1. 计算比值同一景点上两人推荐权重的倍数关系,是“差异”的原材料。
    r(x)=P(x)Q(x)r(x)=\frac{P(x)}{Q(x)}
  2. 凸函数打分f 是向上弯曲的凸函数且 f(1)=0,保证“两份攻略完全相同时得零分”。
    f(r)≥0,f(1)=0f(r)\ge0,\quad f(1)=0
  3. 加权求和以 Q 的权重把每个景点的得分汇总成总分。
    ∑xQ(x) f(r(x))\sum_{x}Q(x)\,f(r(x))

六、GAN损失设计:仿画师与鉴定师的博弈

2014 年 Goodfellow 提出生成对抗网络(GAN),想象一个仿画师(生成器 G)和一个鉴定师(判别器 D)互相对抗:鉴定师负责分辨真画与假画,仿画师负责让假画越来越像真的。两者博弈的目标函数,长这样:

关键结论在于:当鉴定师达到最优——按贝叶斯后验概率打分——整个博弈的值可以化简为:

换句话说,原始 GAN 的生成器在暗地里做的事,就是最小化真实分布与生成分布之间的 JS 散度!当两个分布完全重合,JS=0,目标达到下界 −ln4≈−1.386。这个漂亮的理论解释,让“GAN 到底在做什么”变得透明。但注意:这个等价关系的前提是“支持集有重叠”——如果真画和假画一眼就能区分(分布互不相交),JS 散度就会卡住不动,训练进入梯度消失瓶颈。这正是下一节要讲的病灶。

V(G,D)=Ex∼Pr[ln⁡D(x)]+Ex∼Pg[ln⁡(1−D(x))]V(G,D)=\mathbb{E}_{x\sim P_r}\left[\ln D(x)\right]+\mathbb{E}_{x\sim P_g}\left[\ln(1-D(x))\right]
GAN 目标 = 判别器尽量打对真假分,生成器尽量让判别器打错。
  1. 最优鉴定师公式鉴定师的最优打分等于“真画概率占混合概率的比例”。
    D∗(x)=Pr(x)Pr(x)+Pg(x)D^{*}(x)=\frac{P_r(x)}{P_r(x)+P_g(x)}
  2. 代入并展开把最优打分代回目标函数,展开出两个 KL 散度。
    V=EPrln⁡PrPr+Pg+EPgln⁡PgPr+PgV=\mathbb{E}_{P_r}\ln\frac{P_r}{P_r+P_g}+\mathbb{E}_{P_g}\ln\frac{P_g}{P_r+P_g}
  3. 整理常数项把 −ln4 的常数提出,剩下的恰好是两倍 JS 散度。
    V=−ln⁡4+2⋅JS(Pr∥Pg)V=-\ln4+2\cdot JS(P_r\parallel P_g)

七、Wasserstein对比:当攻略完全不相交

理论很美,现实很残酷。如果仿画师水平太差,真画与假画在特征空间里“画风完全不同”,它们的支撑集(攻略覆盖的景点集合)完全不重叠。此时任意一个样本落在真画分布上,在假画分布中的概率就是 0——JS 散度直接封顶:

问题在于:当 JS 恒等于 ln2,生成器无论怎么改参数,损失函数纹丝不动——梯度消失,训练完全停滞。这正是 2017 年 WGAN 论文指出的病灶。Wasserstein 距离换了一种“搬沙子”的思路:把 P_r 这堆概率质量的沙子,搬成 P_g 那堆沙子的形状,最小运费就是距离。两堆沙子隔得再远,货车里程表都会给出读数,梯度处处存在:

JS 散度像“猜作者”的智力游戏,一旦一眼看穿答案,游戏就失去了信息量(封顶 1 比特);Wasserstein 距离像搬家公司报价,无论距离多远都有明确的运价。这也是为什么今天的生成模型大多改用 WGAN 系列或扩散模型——理解了 JS 散度的边界,就理解了这场技术演进的起点。

JS(Pr∥Pg)=ln⁡2,supp(Pr)∩supp(Pg)=∅JS(P_r\parallel P_g)=\ln2,\quad \mathrm{supp}(P_r)\cap\mathrm{supp}(P_g)=\varnothing
Wasserstein 距离 = 把一堆概率质量搬成另一堆的最小期望运费,永远有定义、永远有梯度。
  1. 搬运方案γ 是联合分布,边缘分布分别等于 P_r 和 P_g,代表一种把 P_r 搬运成 P_g 的方案。
    γ∈Π(Pr,Pg)\gamma\in\Pi(P_r,P_g)
  2. 单份方案成本按 γ 抽样的一对点的距离期望,就是这套方案的平均运费。
    E(x,y)∼γ[∥x−y∥]\mathbb{E}_{(x,y)\sim\gamma}\left[\left\|x-y\right\|\right]
  3. 取最小方案在所有可行搬运方案中取最小成本,得到“最优运费”。
    inf⁡γ(⋯ )\inf_{\gamma}(\cdots)

AI 应用场景

生成对抗网络的训练监控与故障诊断

阶段:模型训练与评估

解决的问题:训练 GAN 时生成器损失不再下降、图像质量停滞,传统上只能肉眼观察生成图,无法量化“生成分布与真实分布差多远”。用 JS 散度作为训练期指标,可实时监控其是否卡在 ln2(≈0.693);若长时间封顶,则大概率发生了支撑集不重叠导致的梯度消失。

具体案例:图像生成团队训练人脸 GAN,每 100 步在特征空间小批量上计算 JS 散度。发现指标长期停在 0.69 附近且梯度范数趋零,判定为模式坍塌前的梯度消失,随即切换到 WGAN-GP 损失,训练曲线恢复下降,生成质量明显提升。

上线模型的数据漂移检测

阶段:模型部署与运维

解决的问题:线上输入特征的分布会随着时间漂移,传统用单边 KL 散度做监控时,方向不同数值不同,难以统一设报警阈值;JS 散度对称且有界 [0, ln2],天然适配“超过阈值就告警”的工程需求。

具体案例:信贷风控团队监控消费特征分布,每小时计算训练分布与当日线上分布的 JS 散度,设定阈值为 0.1:超过则触发特征告警并自动拉起重训练任务,把模型劣化消灭在用户感知之前。

文本风格迁移的分布对齐评估

阶段:模型评估

解决的问题:风格迁移后生成的文本与目标风格文本的分布是否一致?逐句人工比对成本高且主观。用 JS 散度度量两者在语气词、句式长度、情感色彩等特征维度上的分布差异,无需指定“以谁为基准”。

具体案例:电商团队训练“口语评论 → 正式评论”迁移模型,用 JS 散度衡量生成文本与人工正式文本的特征分布距离,配合阈值自动筛选不达标的样本批次,迭代优化模型。

Python 演示

python30 行
# -*- coding: utf-8 -*-# 从零实现 JS 散度, 并对比 KL 的不对称性与 JS 的有界性import math  def kl(p, q):    # 按 p 的权重统计对 q 的"意外程度"    total = 0.0    for pi, qi in zip(p, q):        if pi > 0 and qi > 0:            total += pi * math.log(pi / qi)    return total  def js(p, q):    # 两份攻略分别与中立攻略比较后取平均    m = [(pi + qi) / 2.0 for pi, qi in zip(p, q)]    return 0.5 * kl(p, m) + 0.5 * kl(q, m)  if __name__ == "__main__":    p = [0.7, 0.2, 0.1]    q = [0.2, 0.2, 0.6]    print("KL(p||q) = %.4f, KL(q||p) = %.4f  # 不对称" % (kl(p, q), kl(q, p)))    print("JS(p||q) = %.4f, JS(q||p) = %.4f  # 对称" % (js(p, q), js(q, p)))    print("JS(p||p) = %.4f  # 自相似为零" % js(p, p))    disjoint_p = [0.99, 0.01, 0.0, 0.0]    disjoint_q = [0.0, 0.0, 0.01, 0.99]    print("支撑集不重叠: JS = %.4f, 接近 ln2=%.4f (卡死)" % (        js(disjoint_p, disjoint_q), math.log(2)))
目的:用纯 Python 手写 KL 与 JS 散度,直观对比 KL 的不对称性和 JS 的对称性、有界性,并复现“支撑集不重叠导致 JS 卡在 ln2”的 GAN 困境。
  1. total += pi * math.log(pi / qi)这一行就是 KL 散度的核心:每个景点的权重乘以对数比值再累加。
  2. if pi > 0 and qi > 0跳过分母为零的项;JS 内部因为使用了中立攻略 M,分母永远大于 0,所以天然不爆表。
  3. m = [(pi + qi) / 2.0 for pi, qi in zip(p, q)]构造中立攻略:两份攻略逐景点取平均。
  4. return 0.5 * kl(p, m) + 0.5 * kl(q, m)各取一半相加,得到 JS 散度。
  5. print("KL(p||q) = ..." ...)验证不对称:同一对分布,去程与回程数值不同。
  6. print("支撑集不重叠: JS = ...")演示 GAN 困境:两个互不重叠的分布,JS 恒等于 ln2,梯度信号消失。

常见误区

误区JS 散度不就是 KL(P||Q) 和 KL(Q||P) 取平均吗?对称一下而已,没什么新鲜的。

正解这是完全不同的算法。JS 是让两份攻略各自与“中立攻略 M”比较再平均;而直接平均两个 KL 散度没有中位基准,依然保留分母为零爆表的毛病,也没有 ln2 上界。JS 的灵魂在于“先捏合、再比较”——构造中位分布这一步,才是它对称且有界的根本原因。

为何常见:两者都长着“KL + 对称 + 平均”的模样,初学者看到定义式里有 ½ 和两个 KL 项,就想当然地认为是简单平均。

误区JS 散度对称、非负、为 0 时两个分布相等,这不就是数学上的距离吗?

正解还差最关键的一条——三角不等式。JS 本身不满足“绕道中间点不会更短”的性质,因此不是严格度量;数学上 √JS 才满足三角不等式,是真正的度量。就像“两份攻略的差异分”本身不能当里程表用,只有开根号校准后的值才能当距离。

为何常见:对称、非负、同一性这三条太符合直觉里的“距离”,人们很容易忽略度量还需要第四条性质。

误区JS 永远不爆表,那它是不是能衡量任意两个分布差多远?越大就代表差得越远?

正解上界 ln2 意味着 JS 只能区分“有没有显著差异”,对大差异的排序能力有限。尤其当支撑集不重叠时,JS 恒等于 ln2,完全丧失区分度——这正是原始 GAN 梯度消失的根源。要量化“远距离”的差异,需要用 Wasserstein 距离这样的无界度量。

为何常见:把“有界”理所当然地理解为“好用”,没意识到封顶意味着盲区——量程有限的尺子,量不了天壤之别。

误区JS 的定义式里有两个 KL 项,KL 会在分母为零的时候变成无穷大,JS 肯定也会爆表。

正解JS 永远不会爆表。当 P(x)>0 而 Q(x)=0 时,中立攻略 M(x)=(P(x)+Q(x))/2 在该点仍然大于 0,两个 KL 项的分母都由 M 兜底,数值有限;最终整个 JS 被 ln2 罩住。这正是 JS 解决 KL“无定义”问题的关键设计。

为何常见:看到公式里嵌着 KL,就直觉认为继承了 KL 的一切毛病,忽略了“中立攻略”已经悄悄替换了分母基准。

面试题

Q1. 关于 JS 散度的对称性,下列说法正确的是:

单选题 · easy

  • A.JS(P||Q) 与 JS(Q||P) 数值相等← 正确答案
  • B.JS(P||Q) 与 JS(Q||P) 数值不同
  • C.只有 P 等于 Q 时才对称
  • D.对称性取决于样本数量

答案:A。JS 以中立攻略 M=(P+Q)/2 为共同基准,交换 P、Q 后 M 不变,两个半 KL 项互换位置,求和值自然相等。就像两份攻略先后找同一位中立调解员打分,谁先谁后不影响结果。

Q2. JS 散度的取值上界是:

单选题 · easy

  • A.正无穷大
  • B.常数 1
  • C.自然对数 ln2← 正确答案
  • D.随支撑集增大

答案:C。JS 散度永远不超过 ln2≈0.693,对应“二选一猜来源”的 1 比特信息量。这是它区别于 KL 散度的重要性质——不管分布有多复杂,混合两份攻略的信息增量最多就是一比特。

Q3. 相比 KL 散度,JS 散度不具备哪个优势:

单选题 · easy

  • A.天然具备对称性
  • B.取值被限制有界
  • C.分母为零不爆表
  • D.数值永远更大← 正确答案

答案:D。JS 并不“永远更大”——它常常小于对应的 KL 散度,两者没有恒定的大小关系。对称、有界、分母不为零才是 JS 相对 KL 的三大核心优势,这也是它在 GAN 中被采用的直接原因。

Q4. JS 散度满足下列哪些性质:

多选题 · mid

  • A.非负且有上界← 正确答案
  • B.分布相同时为零← 正确答案
  • C.满足三角不等式
  • D.满足对称性← 正确答案

答案:ABD。JS 散度非负、有界、满足同一性(P=Q 时为零)且对称;但它不满足三角不等式,因此本身不是严格度量。只有开根号后的 √JS 才是满足全部度量公理的距离——这是面试中常见的“陷阱点”。

Q5. 原始 GAN 在判别器最优时,生成器的目标等价于:

单选题 · mid

  • A.最小化 JS 散度← 正确答案
  • B.最大化 KL 散度
  • C.最小化互信息
  • D.求 Wasserstein 距离

答案:A。当判别器达到最优 D\,GAN 目标化为 V(G,D\)=−ln4+2·JS(P_r‖P_g)。生成器固定判别器后,等价于最小化真实分布与生成分布之间的 JS 散度——这是理解“GAN 在做什么”的理论基石。

Q6. 原始 GAN 训练中 JS 散度导致梯度消失的原因有:

多选题 · mid

  • A.真画假画分布不重叠← 正确答案
  • B.判别器训练到完全饱和← 正确答案
  • C.JS恒等于ln2常数← 正确答案
  • D.学习率设置过大

答案:ABC。当真实分布与生成分布的支撑集互不相交,JS 恒等于 ln2,判别器完全饱和、输出不再变化,生成器收不到任何梯度信号。学习率过大是调参问题,并非 JS 散度本身的缺陷。

Q7. 关于 JS 散度与“度量”的关系,正确的是:

单选题 · hard

  • A.JS 本身是严格度量
  • B.JS 不满足三角不等式← 正确答案
  • C.JS 完全满足三角不等式
  • D.JS 的取值永不为零

答案:B。JS 散度对称、非负、有界、且 P=Q 时取零,但缺少三角不等式这一条,所以不是严格度量。数学上 √JS 才是度量(Endres-Schindelin 结论)。把“差异分”与“距离”混为一谈是常见误区。

Q8. f 散度框架中,KL 散度对应的凸函数 f(t) 为:

单选题 · hard

  • A.t 乘以 t 的自然对数← 正确答案
  • B.t 的自然对数的负值
  • C.t 减 1 的差的平方
  • D.t 减 1 的差的绝对值

答案:A。f(t)=t·ln t 是 KL 散度的生成函数;f(t)=−ln t 对应反向 KL,f(t)=(t−1)² 对应卡方散度,f(t)=|t−1| 对应全变差。同一套配方换上不同凸函数,就得到不同款式的散度。

Q9. 关于 JS 与 KL、互信息的关系,正确的有:

多选题 · hard

  • A.JS 是两半 KL 的加权和← 正确答案
  • B.JS 的取值上界是 ln2← 正确答案
  • C.互信息是一种 KL 散度← 正确答案
  • D.JS 的取值总大于 KL

答案:ABC。JS=½KL(P‖M)+½KL(Q‖M),是 KL 的对称化加权和,上界为 ln2。互信息 I(X;Y)=KL(P_XY‖P_XP_Y),本质就是联合分布与独立乘积分布之间的 KL 散度。JS 与 KL 没有恒定的大小关系,“总大于”是错误的。

Q10. Wasserstein 距离相比 JS 散度在 GAN 中的关键优势是:

单选题 · extreme

  • A.数值范围固定更小
  • B.处处提供非零梯度← 正确答案
  • C.天然具备有界性
  • D.完全不需要判别器

答案:B。支撑集不重叠时 JS 恒为 ln2、梯度为零;而 Wasserstein 距离是最小搬运运费,无论两堆概率质量相距多远,货车里程表都会给出读数,梯度处处存在。WGAN 正是用这一特性解决了原始 GAN 的梯度消失问题。