#3441·pyro

[错误] `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" />