TensorFlow Probability中Sequential与Named联合分布对数概率不一致问题
TFP两类JointDistribution的核心差异及问题原因
你遇到的结果不一致问题主要来自两类接口的3个底层差异,以及代码中的参数写法疏漏:
1. 依赖函数的入参传递逻辑完全不同
JointDistributionSequentialAutoBatched按列表定义顺序存储随机变量,但其依赖函数(lambda)的入参顺序是前面所有变量的逆序:
你代码中列表顺序为[beta0分布, beta1分布, sigma分布, 依赖lambda],lambda的入参按顺序对应的实际是sigma、beta1、beta0,而非你写的beta0、beta1、sigma。这就导致你定义的loc=beta0 + beta1 * weight实际运算时为loc=sigma + beta1 * weight,参数完全错位。JointDistributionNamedAutoBatched的依赖函数入参按变量名匹配,和定义顺序无关,你的lambda参数写法对这类接口是正确的。
2. log_prob位置传参的默认排序逻辑不同
- 调用
log_prob方法时,给Sequential传位置参数的匹配顺序和列表定义顺序完全一致。 - 给Named传位置参数时,默认按照变量名的字母升序匹配,而非定义顺序,如果你没有显式指定
order参数,也容易出现参数错位。
3. Uniform分布的参数写法错误
tfd.Uniform的原生构造参数为low和high,不支持scale参数,你传入的scale=10会被作为不识别参数忽略,如果你要定义[1, 11)区间的均匀分布,正确写法为tfd.Uniform(low=1., high=11.)。你测试中sigma=0.5时Named输出-inf就是因为sigma的实际取值不在先验分布区间内,而Sequential因为参数错位,0.5被传入了beta0的位置,beta0的先验是Normal分布,所以不会出现-inf。
修正方案
- 把Sequential的lambda参数顺序改成逆序:
lambda sigma, beta1, beta0: ... - 修正Uniform分布的参数写法,用
low和high显式指定区间 - 调用Named的
log_prob时优先传入字典而非位置参数,或者在定义时显式指定order=["beta0", "beta1", "sigma", "x"]参数固定顺序
内容的提问来源于stack exchange,提问作者Marvin Ward Jr
相关产品推荐
相关产品推荐

