KL遇到零概率为何发散:换成JS以后,有限也不代表尺度相同
比较两份模型概率时,KL散度经常出现无穷值,而JS仍是一个有限小数。两者并不是把同一个公式换了名字:方向、参考分布、支持集和返回值定义都有区别。先把概率压成两个格子,就能明确哪些无穷值是输入边界的正确含义,哪些数值差异只是对数底或平方根造成的。
AI生成的概念示意图,以两份概率容器与中央混合容器表示分布比较;不是实际产品、真实模型输出或精确概率柱状图。
零乘对数与正数除零,要分开处理
本文使用自然对数,定义KL(P||Q)=Σi Pi ln(Pi/Qi)。约定Pi=0时,该项为0;若Pi大于0而Qi=0,该项为正无穷。两个零一起出现的格点也贡献0,而不是要求程序直接计算0×ln(0/0)。
取P=(1,0),Q=(1/2,1/2)。KL(P||Q)=1×ln2+0=ln2≈0.693147。反过来,KL(Q||P)的第二格是(1/2)ln((1/2)/0),所以整个散度为无穷。
方向差别有明确含义:从P的期望看,第二格从不发生;从Q的期望看,第二格有一半质量,却被P判为不可能。把两个方向交换,改变了哪些事件受到权重关注。KL通常不对称,因此不能把它当作普通几何距离随便换参数顺序。
如果双方概率都严格为正,两个方向也一般不同;零只是把这种区别表现得最鲜明。程序遇到inf时,应先检查支持集是否符合任务含义,而不是立刻认定是数值溢出或计算失败。
JS先建立一个双方都能使用的中间分布
令M=(P+Q)/2,定义JS(P,Q)=0.5 KL(P||M)+0.5 KL(Q||M)。本例M=(3/4,1/4),两份输入有质量的位置,在M中都会得到正质量,因此不会出现同样的分母缺失。
第一项KL(P||M)=ln(4/3)≈0.287682。第二项为(1/2)ln(2/3)+(1/2)ln2=(1/2)ln(4/3)≈0.143841。平均后JS=(3/4)ln(4/3)≈0.215762。
第二项展开中的ln(2/3)是负数,但完整KL仍非负。单个格点的Pi ln(Pi/Qi)可以为负,非负性质针对符合条件的完整分布求和;若逐项把负数裁成零,会改变散度,不能称为数值稳定处理。
JS关于P与Q对称,不过仍需先说明是在算散度,还是它的平方根。SciPy的spatial.distance.jensenshannon返回的是距离sqrt(JS),本例约为0.464501;若把它直接与手算的0.215762比,差异来自定义,不是库的舍入误差。
对数底变了,最大值与阈值也跟着变
改用以2为底的对数时,KL与JS数值都要除以ln2。本例JS变为约0.311278,平方根距离约为0.557923。报告写“JS等于0.3”却不写对数底与是否开根号,别人无法准确复算阈值。
再取两个完全分离的分布P=(1,0)、Q=(0,1)。双向KL都是无穷,但M=(1/2,1/2),自然对数JS为ln2,距离为sqrt(ln2)≈0.832555;以2为底时JS与距离都恰好为1。
这个例子也提醒我们,JS有界不表示两个分布接近。它们可以完全没有重叠,只是分数达到这个定义下的最大值。判断变化是否重要,需要结合标签含义与任务,而不是看到“不到一”就认为偏移很小。
加epsilon会把不可能改成小概率
一种常见处理是把Q中的零换成很小的ε,再重新归一化。这能让某些KL计算有限,但同时改变了分布。对一份把第二格判为不可能的模型,平滑以后它已经承认第二格可能发生,只是概率很低;这是建模选择,不仅是存储技巧。
ε取值、添加方式和归一化范围都会影响结果。只替换零、对每格都加ε、或对概率设下限再统一归一,通常得到不同分布。若比较多个实验,必须保存平滑前后的向量及规则,否则看似相同的KL阈值可能衡量不同问题。
对模型logit可用稳定的log-softmax计算对数概率,避免先算极小概率再取对数的下溢;但这与修复真实的支持集不匹配不是同一回事。若业务规则真的把某类概率设为零,稳定求对数不会把那条规则自动改掉。
从两格测试扩展到真实输出
让AI写检查器时,至少覆盖P=Q、本文单边零、双方互不重叠、某格双方都为零,以及输入未归一化的情形。明确是否由调用者归一化,因为某些库会自动把输入除以总和;全零向量仍然不是合法概率分布。
再用逐格贡献求和与官方函数两条路线对照,检查轴方向。一个批次包含多条分布时,把整批所有元素一起归一化,会把“逐样本比较”变成另一件事。数值最终没有报错,并不证明归一化维度正确。
KL和JS适合分析概率输出、分布变化及表示差异,但不能独自解释变化原因。标签顺序错位、概率校准改变、真实人群变化都可能改变分数。把类别对齐、支持集、对数底、平滑与平方根约定放在结果旁边,才能让一个小数拥有可复核的含义。
资料核对日期:2026年10月3日。数值均为原创教学设定,使用本地独立程序复算;未进行真实模型训练或生产性能测试。
参考资料
SciPy官方:Jensen–Shannon distance


