[错误] `pyro.render_model` 省略了边
作者: YardenRachamim创建于 2025年7月10日更新于 2025年7月10日
问题描述
上下文: 使用 OrderedLogistic 分布的线性顺序回归模型
问题: pyro.render_model 无法绘制边,当子 pyro.sample 站点接收由以下任一方式生成的张量时: * pyro.deterministic 站点,或 * pyro.sample 站点包装在 Delta 转换中(例如,以强制有序)。 这使得渲染的 DAG 无效,父节点被默默隐藏。我认为推理工作正常,但无法确定。
环境
- 操作系统: Ununto
- Python 版本: 3.10.
- PyTorch 版本: 2.6.0 + cpu
- Pyro 版本: 1.9.1
代码片段
def ordinal_regression_model(X, y=None):
D = X.size(-1)
num_categories = 3
cutpoints = pyro.param(
"cutpoints",
torch.linspace(-1., 1., num_categories - 1, dtype=X.dtype, device=X.device),
constraint=constraints.ordered_vector
)
# cutpoints = pyro.sample(
# "cutpoints",
# dist.TransformedDistribution( # base → transform → ordered
# dist.Normal(
# torch.zeros(num_categories - 1, device=X.device, dtype=X.dtype),
# torch.ones(num_categories - 1, device=X.device, dtype=X.dtype),
# ).to_event(1), # joint prior over the vector
# OrderedTransform(), # enforces monotonicity
# ),
# )
loc = torch.zeros(D, dtype=X.dtype, device=X.device)
scale = torch.ones_like(loc) * 5
beta = pyro.sample("beta", dist.Normal(loc=loc, scale=scale).to_event(1)) # D
# eta = pyro.deterministic("eta", X.float() @ beta.float())
eta = pyro.sample( # now a sample site
"eta",
dist.Delta((X.float() @ beta.float())).to_event(1)
)
with pyro.plate("data", X.size(0)):
pyro.sample(
"obs",
dist.OrderedLogistic(eta, cutpoints), # OrderedLogistic does its own broadcast
obs=y
)
pyro.render_model(
ordinal_regression_model,
model_args=(batch[0], batch[1]),
render_params=True,
render_distributions=True,
render_deterministic=True
)
### 预期行为
图应该明确显示依赖链: beta → eta → obs,包括板块上下文和 `cutpoints` 作为参数。作为参数传递给 `pyro.sample` 站点的分布的任何张量,无论是通过 `pyro.deterministic` 还是通过 Delta 转换的样本计算,在计算边时都应被视为父节点。
注意: 尝试的工作方法如: * 明确地将张量包装在 `pyro.deterministic` 中。 * 使用包含 `Delta` 分布的 `pyro.sample` 站点。
上述所有尝试仍然无法显示缺失的边。
### 实际行为
<img width="496" height="197" alt="Image" src="https://GitHub.com/user-attachments/assets/55842b7f-75a4-4f54-8813-36cb43662fcb" />内容来源: pyro-ppl/pyro