假设你是一位刚入行的主厨,面对一道从未做过的菜,你手里只有一份模糊的“旧配方”——这是你从师父那里听来的先验经验。你第一次下厨,客人尝了一口皱起眉头,于是你微调盐和火候;第二次、第三次……每一次客人的反馈都在帮你逼近那道菜真正的“味道分布”。这个过程,就是贝叶斯推断的日常图景:先用先验(旧配方)出发,再用数据(客人的反馈)更新信念,最终得到后验(更靠谱的新配方)。 Pyro 就是一个“智能厨房助手”。它由 Uber 开源,底层的食材柜是 PyTorch——所有张量、自动求导都帮你备好了。它提供两种“试菜”方式:SVI 变分推断像一位快速学徒,通过不断对照目标快速逼近真实味道;MCMC 采样像一位老师傅,一口一口耐心品尝,把后验分布的真实轮廓慢慢熬出来。无论你是做贝叶斯回归、时序预测还是因果推断,Pyro 都能让你用写普通 PyTorch 代码的方式完成深度概率建模。

岗位关联

对 AI 从业者而言,掌握 Pyro 意味着你能在模型里显式表达不确定性,做更稳健的预测、更严谨的实验结论和更可信的因果推断——这在科研、风控与决策场景中是硬通货。

目录
  1. 可视化演示
  2. 贝叶斯思想
  3. Pyro初体验
  4. PyTorch地基
  5. 贝叶斯回归
  6. SVI变分推断
  7. MCMC采样
  8. 预测与前沿
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

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

Pyro框架架构:PyTorch + 概率编程 Pyro核心优势Pyro核心优势Pyro核心优势Pyro核心优势 Pyro核心优势Pyro核心优势Pyro核心优势Pyro核心优势

贝叶斯思想

老主厨收徒,从不先教菜谱,而是先教“试菜哲学”:你心里对一道菜有个预期(先验),每让客人尝一口就获得一条反馈(似然),把预期和反馈揉在一起,才形成你对这道菜真正的把握(后验)。贝叶斯推断的全部奥义就在这个循环里。

在概率语言中,假设我们要估计的参数是 \(\theta\)(比如盐的克数)。我们先给它一个先验分布 \(p(\theta)\),它代表“旧配方”的信念。看到数据 \(D\) 后,通过似然 \(p(D|\theta)\) 刻画“在某个配方下客人给出这种反馈的概率”。贝叶斯定理把二者合成后验:

厨师的故事告诉我们一个深刻结论:后验不是“一个最佳配方”,而是一整张“配方分布图”。SVI 是快速逼近这张图的学徒,MCMC 是仔细品尝每个角落的老师傅。

---

p(θ∣D)=p(D∣θ) p(θ)∫p(D∣θ) p(θ) dθ\displaystyle p(\theta \mid D) = \frac{p(D \mid \theta)\,p(\theta)}{\int p(D \mid \theta)\,p(\theta)\,d\theta}
这个公式就是“新配方 = 旧配方 × 反馈味道 ÷ 所有可能配方的总说明力”。分母只负责归一化,保证后验是一个合法的概率分布。
  1. 先验 \(p(\theta)\)这是拿到数据之前的信念。比如你坚信盐量在 2-5 克之间,就给一个以 3.5 克为中心的分布。
    p(θ)=Normal(θ∣3.5,1)p(\theta) = \text{Normal}(\theta \mid 3.5, 1)
  2. 似然 \(p(D|\theta)\)给定某个 \(\theta\),观测到当前反馈数据的概率。它连接参数与数据,是“数据在说话”。
    p(D∣θ)=∏i=1np(yi∣xi,θ)p(D|\theta) = \prod_{i=1}^{n} p(y_i \mid x_i, \theta)
  3. 分子联合分布先验与似然相乘,把“旧信念”与“新证据”揉在一起,得到未归一化的后验形状。
    p(D∣θ) p(θ)p(D|\theta)\,p(\theta)
  4. 分母证据(归一化因子)对所有可能的 \(\theta\) 求积分。这个积分在高维空间常常没有解析解,这正是我们需要 Pyro 的原因。
    ∫p(D∣θ) p(θ) dθ\int p(D|\theta)\,p(\theta)\,d\theta

Pyro初体验

厨房里来了个新助手叫 Pyro。它不直接做菜,而是帮你搭“菜谱的骨架”。在概率编程里,你只需要用几行代码描述“数据是怎么生成的”,剩下的推断交给框架。

Pyro 的模型就是一个普通的 Python 函数。函数体内出现两个核心原语:pyro.sample 表示“从一个分布里抽一个随机变量”,pyro.observe 表示“这个随机变量有观测值,要拿它对比数据”。在这两个原语之间,PyTorch 的张量运算照常进行。

1. sample 声明潜变量:torch.Size([]) 表示标量,dist.Normal(3.5, 1.0) 是标准正态分布,也就是“旧配方”。

θ∼Normal(3.5,1.0)\theta \sim \text{Normal}(3.5, 1.0)

2. plate 批量向量化:plate 将独立同分布的数据维度声明出来,让 Pyro 能做向量化批处理,等价于假设样本间条件独立。

∏i=1np(yi∣θ)\prod_{i=1}^n p(y_i \mid \theta)

3. observe 绑定观测:obs=data 将随机变量 obs 固定为真实数据,使 Pyro 在推断时自动应用贝叶斯定理。

p(θ∣D)∝p(θ)∏i=1np(yi∣θ)p(\theta \mid D) \propto p(\theta) \prod_{i=1}^n p(y_i \mid \theta)

Pyro 的优雅在于:你只写“生成故事”,不写“推断算法”。推断是助手的事——你指定用 SVI 还是 MCMC,它就把后验端上来。

---

text4 行
def model(data):    theta = pyro.sample("theta", dist.Normal(3.5, 1.0))    with pyro.plate("data", len(data)):        pyro.sample("obs", dist.Normal(theta, 1.0), obs=data)

PyTorch地基

Pyro 能如此灵活,功劳首先归功于 PyTorch 这个“万用食材柜”。张量就是你的食材盘——无论是一维向量还是高维矩阵,都能整齐排列、高速运算。自动微分则是“自动调味机”:你只需写清楚前向过程,反向传播自动帮你算出每个参数的偏导。

Pyro 在 PyTorch 之上加了一层“概率调料架”:torch.distributions 提供了几十种分布(正态、泊松、Dirichlet 等),这些分布既可以作为 Pyro 的 dist,也能单独用于张量采样。

| PyTorch 能力 | 在 Pyro 中的角色 |

|:——|:——|

| 张量(Tensor) | 存储参数、数据和采样结果 |

| 自动微分(autograd) | SVI 的梯度下降自动求导 |

| 分布模块(distributions) | 构建先验、似然与 guide 分布 |

| DataLoader | 大数据下分批次喂给模型 |

1. 张量统一数据形态:所有参数和观测都化为 torch.Tensor,支持 GPU 并行。

X∈Rn×d\mathbf{X} \in \mathbb{R}^{n \times d}

2. 自动微分计算梯度:ELBO 对变分参数 \(\phi\) 求导,反向传播自动完成。

∇ϕL(ϕ)\nabla_{\phi} \mathcal{L}(\phi)

3. 分布模块统一接口:每个分布都有 sample 和 log_prob,便于 Pyro 统一处理随机变量。

qϕ(θ)→sample,log⁡qϕ(θ)q_{\phi}(\theta) \to \text{sample}, \log q_{\phi}(\theta)

这一层地基决定了 Pyro 的扩展性:当你把贝叶斯层叠加到深度网络上时,PyTorch 的模块化让“深度概率模型”就像搭积木。

---

贝叶斯回归

回到厨房:你想搞明白“火候”(\(x\))和“客人评分”(\(y\))之间的关系。经典回归只给一条最佳拟合线,而贝叶斯回归给出“线的分布”——每条可能的线都有它的可信度。

贝叶斯线性回归假设:

对权重 \(w\) 和偏置 \(b\) 设置先验 \(w \sim \text{Normal}(0, 1)\),然后让数据说话。

相比最小二乘,贝叶斯回归的产出是后验分布。你不仅能说“斜率约为 3.2”,还能说“斜率落在 [2.8, 3.6] 的可信度是 95%”——这在风控和医疗场景里意味着决策的安全性。

---

yi∼Normal(wxi+b,  σ2)\displaystyle y_i \sim \text{Normal}(w x_i + b,\; \sigma^2)
它的哲学是:系数不再是一个点,而是一张分布图。用 Pyro 写出这个模型只需三步:定义先验 → 声明线性变换 → 以正态似然观测数据。
  1. 线性期望均值是 \(w x_i + b\),这是确定性的“菜谱主线”。
    μi=wxi+b\mu_i = w x_i + b
  2. 噪声尺度\(\sigma\) 表示客人评分的随机波动,是“厨房里的随机性”。
    σ∼HalfCauchy(1)\sigma \sim \text{HalfCauchy}(1)
  3. 观测模型每个 \(y_i\) 围绕均值 \(\mu_i\) 波动,形成似然。
    p(yi∣xi,w,b,σ)=Normal(yi∣wxi+b,σ2)p(y_i \mid x_i, w, b, \sigma) = \text{Normal}(y_i \mid w x_i + b, \sigma^2)
  4. 联合后验所有权重与噪声的后验,表达“哪些线最符合数据”。
    p(w,b,σ∣y,x)p(w, b, \sigma \mid \mathbf{y}, \mathbf{x})

SVI变分推断

贝叶斯推断的难点在于分母积分。当参数维度高时,精确计算是不可能的。SVI(随机变分推断)的解决思路是“雇佣一位快速学徒”:用一族简单的分布 \(q_{\phi}(\theta)\)(guide)去近似真实后验 \(p(\theta|D)\)。学徒在一次次对照中调整自己的动作参数 \(\phi\),让 \(q\) 越来越像 \(p\)。

衡量两个分布差距的工具是 KL 散度。直接最小化 KL 不可行,所以我们最大化它的等价下界 ELBO:

SVI 的优势是快——哪怕模型有百万参数,它也能在 GPU 上用梯度下降逼近后验。代价是近似,因为 \(q\) 的分布族可能不够灵活。

---

L(ϕ)=Eqϕ(θ)[log⁡p(D,θ)−log⁡qϕ(θ)]\displaystyle \mathcal{L}(\phi) = \mathbb{E}_{q_{\phi}(\theta)}\left[\log p(D, \theta) - \log q_{\phi}(\theta)\right]
可以这样理解:ELBO 是一张“考试卷”,第一项要求学徒尽量解释数据(对数联合概率高),第二项要求学徒别太离谱(与先验偏离不要过大)。学徒每次上菜,都按考卷分数调整动作。
  1. 变分分布选一个易采样的分布族,例如对角高斯 \(q_{\phi}(\theta) = \text{Normal}(\mu, \text{diag}(\sigma^2))\)。
    qϕ(θ)=∏jNormal(θj∣μj,σj2)q_{\phi}(\theta) = \prod_j \text{Normal}(\theta_j \mid \mu_j, \sigma_j^2)
  2. ELBO 定义对变分分布求期望,目标是最大化它。
    L(ϕ)=Eq[log⁡p(D,θ)]−Eq[log⁡qϕ(θ)]\mathcal{L}(\phi) = \mathbb{E}_{q}[\log p(D,\theta)] - \mathbb{E}_{q}[\log q_{\phi}(\theta)]
  3. 重参数化梯度从 \(q_{\phi}\) 中采样时用 \(\theta = \mu + \sigma \odot \epsilon\),使梯度能穿过采样节点。
    ϵ∼Normal(0,I),θ=μ+σ⊙ϵ\epsilon \sim \text{Normal}(0, I), \quad \theta = \mu + \sigma \odot \epsilon
  4. SGD 更新每个 batch 估计一次梯度,更新变分参数。
    ϕ←ϕ+η∇ϕL(ϕ)\phi \leftarrow \phi + \eta \nabla_{\phi} \mathcal{L}(\phi)

MCMC采样

如果说 SVI 是快速学徒,MCMC 就是老师傅。它不假设分布形状,而是直接在后验分布上“游走采样”:每走一步就留下一个样本,走过足够多步之后,留下的样本集合就近似后验分布本身。

Pyro 默认推荐 NUTS 内核。它的巧妙之处在于自动决定“每一步跳多远”:在参数空间中按照哈密顿动力学优雅地滑动,避免普通随机游走那种原地打转的低效。

1. 马尔可夫链:下一个样本只依赖当前样本,构成一条链。

θ(t+1)∼T(θ(t)→θ(t+1))\theta^{(t+1)} \sim T(\theta^{(t)} \to \theta^{(t+1)})

2. 平稳分布:设计转移核 \(T\) 使链的平稳分布恰好是后验。

π(θ)=p(θ∣D)\pi(\theta) = p(\theta \mid D)

3. NUTS 自动步长:利用梯度信息在相空间模拟动力学,避免随机游走低效问题。

θ←Leapfrog(θ,r,ϵ)\theta \leftarrow \text{Leapfrog}(\theta, r, \epsilon)

4. 采样平均:舍弃前 \(B\) 个老化样本后,用经验分布近似后验。

p^(θ∣D)≈1T∑t=B+1Tδ(θ−θ(t))\hat{p}(\theta \mid D) \approx \frac{1}{T}\sum_{t=B+1}^{T}\delta(\theta - \theta^{(t)})

MCMC 的代价是慢,但换来的是渐近精确。当后验分布多峰、扭曲、非标准时,老师傅依然能品尝出每个角落的味道。

---

预测与前沿

学好了菜谱,最终要用它开新店。在贝叶斯世界里,对新输入的预测不是点估计,而是一个后验预测分布:

在 Pyro 中,预测和前沿应用都站在同一块地基上:后验是食材,分布是刀具,而 do 算子是分子料理的喷雾器——它帮你回答“如果我把盐换糖,客人评分会怎样”这类反事实问题。

---

p(y⋆∣x⋆,D)=∫p(y⋆∣x⋆,θ) p(θ∣D) dθ\displaystyle p(y^{\star} \mid x^{\star}, D) = \int p(y^{\star} \mid x^{\star}, \theta)\,p(\theta \mid D)\,d\theta
这是“老师傅对新菜品的预言”:把所有可能配方的预测结果按后验权重平均,得到的不只是平均味道,还有味道的波动范围。
  1. 后验预测对新输入集成所有参数的后验。
    p(y⋆∣x⋆,D)=∫p(y⋆∣x⋆,θ) p(θ∣D) dθp(y^{\star} \mid x^{\star}, D) = \int p(y^{\star} \mid x^{\star}, \theta)\,p(\theta \mid D)\,d\theta
  2. 预测区间由后验预测分布的分位数给出,例如 95% 置信区间。
    y^⋆±z0.975 std(y⋆)\hat{y}^{\star} \pm z_{0.975}\,\text{std}(y^{\star})
  3. 时序建模把隐状态写成时间上的马尔可夫链,例如 pyro.contrib.forecast 支持状态空间模型。
    ht∼Normal(ht−1,σh2)h_t \sim \text{Normal}(h_{t-1}, \sigma_h^2)
  4. 因果推断用 pyro.do 实施干预,区分“相关性”与“因果性”。
    P(y∣do(x))=∑zP(y∣x,z) P(z)P(y \mid do(x)) = \sum_z P(y \mid x, z)\,P(z)

AI 应用场景

金融风控模型

阶段:推断与不确定性量化

解决的问题:传统信用评分只输出“违约概率 0.85”的静态数值,忽略了模型自身的不确定性。金融监管要求对每笔预测给出置信区间。Pyro 的贝叶斯逻辑回归能输出完整的后验分布,当数据稀疏时自动扩大置信区间,避免过度自信。

具体案例:某消费金融公司用 Pyro 建模用户还款行为,特征包括收入、年龄、历史逾期次数。模型输出违约概率的 95% 后验区间,风控规则从“概率 > 0.8 拒绝”改为“区间下限 > 0.8 拒绝”,坏账率下降 12%。

医药临床试验分析

阶段:实验设计与因果推断

解决的问题:传统 A/B 检验在中期分析时需要复杂的边界修正,且无法利用历史试验数据。贝叶斯方法天然支持“先验 + 实时数据”的持续更新,还能通过 pyro.do 做因果效应估计。

具体案例:某药企在 II 期试验中使用 Pyro 建立剂量-响应曲线,以过往类似药物数据作为先验,每入组 50 名患者就更新一次后验,提前识别出无效剂量组,节省约 3 个月试验时间和 800 万元成本。

推荐系统冷启动

阶段:预测与不确定量化

解决的问题:新用户刚注册时行为数据少,传统协同过滤无法给出可靠推荐。贝叶斯矩阵分解将用户和物品的隐向量视为分布,冷启动时后验方差大,系统自动推荐探索性内容。

具体案例:某视频平台用 Pyro 构建贝叶斯协同过滤,对每个新用户维护一组隐向量后验样本。系统在“高方差”时增加探索流量,在“低方差”时进入利用模式,新用户 7 日留存提升 6 个百分点。

Python 演示

python59 行
import torchimport pyroimport pyro.distributions as distfrom pyro.infer import SVI, Trace_ELBO, MCMC, NUTS, Predictive pyro.set_rng_seed(0) # 生成模拟数据:真实关系 y = 3.2x + 1.8 + 噪声x = torch.linspace(0, 10, 50)y = 3.2 * x + 1.8 + torch.randn(50) * 1.5  def model(x, y):    w = pyro.sample("w", dist.Normal(0.0, 5.0))    b = pyro.sample("b", dist.Normal(0.0, 5.0))    sigma = pyro.sample("sigma", dist.HalfCauchy(1.0))    mu = w * x + b    with pyro.plate("data", len(x)):        pyro.sample("obs", dist.Normal(mu, sigma), obs=y)  def guide(x, y):    w_mu = pyro.param("w_mu", torch.tensor(1.0))    w_sigma = pyro.param("w_sigma", torch.tensor(1.0),                         constraint=dist.constraints.positive)    b_mu = pyro.param("b_mu", torch.tensor(1.0))    b_sigma = pyro.param("b_sigma", torch.tensor(1.0),                         constraint=dist.constraints.positive)    sigma = pyro.param("sigma_q", torch.tensor(1.0),                       constraint=dist.constraints.positive)    pyro.sample("w", dist.Normal(w_mu, w_sigma))    pyro.sample("b", dist.Normal(b_mu, b_sigma))    pyro.sample("sigma", dist.LogNormal(torch.tensor(0.0), sigma))  def main():    # SVI 变分推断    svi = SVI(model, guide, pyro.optim.Adam({"lr": 0.05}), loss=Trace_ELBO())    for step in range(1000):        svi.step(x, y)    print("SVI w_mu =", pyro.get_param_store()["w_mu"].item())     # MCMC 采样(NUTS内核)    nuts = NUTS(model)    mcmc = MCMC(nuts, num_samples=200, warmup_steps=100)    mcmc.run(x, y)    samples = mcmc.get_samples()    print("MCMC w mean =", samples["w"].mean().item())     # 后验预测    predictive = Predictive(model, samples, return_sites=("obs",))    x_new = torch.tensor([11.0, 12.0])    pred = predictive(x_new, None)    print("预测均值:", pred["obs"].mean(dim=0).tolist())    print("预测标准差:", pred["obs"].std(dim=0).tolist())  if __name__ == "__main__":    main()
目的:演示用 Pyro 对同一线性模型分别做 SVI 变分推断和 MCMC 采样,并输出后验预测分布。
  1. pyro.sample("w", dist.Normal(0.0, 5.0))将权重 w 声明为随机变量,先验设为均值为 0 的正态分布。
  2. with pyro.plate("data", len(x))批量处理所有数据点,声明它们条件独立,提升向量化效率。
  3. pyro.param(...constraint=positive)声明变分参数时用正值约束,保证标准差合法。
  4. SVI(model, guide, optimizer, loss=Trace_ELBO())组装学徒(guide)、考试题(ELBO)和优化器,开始训练。
  5. MCMC(NUTS(model), num_samples=200, warmup_steps=100)请出老师傅,先烧 100 步老火,再取 200 个后验样本。
  6. Predictive(model, samples, return_sites=("obs",))用后验样本做预测,输出的 obs 就是后验预测分布。

常见误区

误区SVI 或者 MCMC 跑完以后,我应该取后验均值作为模型的最终参数,就像训练神经网络取最后权重一样。

正解贝叶斯推断的产出是分布,不是点估计。后验均值只是分布的一个摘要,丢失了不确定性的形状。正确做法是保留整个后验样本集合:做预测时把它们全部传入模型,得到预测分布;做决策时看区间而不是看单个数字。取均值相当于厨师只记住了“平均口味”,却忘了有的客人吃辣、有的忌口。

为何常见:常年在深度学习里训练出单一权重的习惯,会天然地让人把后验也浓缩成一个点。

误区先验就是模型里随便填的分布,反正数据多了都会被我修正掉,设成啥无所谓。

正解先验承载着领域知识,它在数据稀疏时起决定性作用。如果你设一个极端宽的先验,小样本下的后验会近乎等于极大似然估计,失去贝叶斯正则化的意义;如果你设一个错误集中的先验,数据又少,后验会被带偏。厨师心中对“盐该放多少”要有底线,完全不设防和固执己见都会翻车。

为何常见:初学者从频率派转过来,容易把先验当成“程序里的初始值”,忽略了它是一个概率陈述。

误区SVI 速度那么快,而且 Pyro 里写起来简单,以后所有模型都用 SVI 就好了。

正解SVI 的快是建立在“变分分布族足够表达后验”的假设之上的。当后验是多峰、强相关或形状复杂时,简单的 guide 只能覆盖其中一部分,得到的近似会产生严重偏差。MCMC 虽然慢,但在充分运行后会得到渐近精确的后验样本。实际工程中,先用 MCMC 在小子集上探实验证后验形状,再决定是否可以用 SVI 上生产,是成熟的流程。

为何常见:很多教程直接展示 SVI 的漂亮收敛曲线,让人忽略了它对分布族的强假设。

面试题

Q1. 贝叶斯公式中,后验分布 \(p(\theta|D)\) 与先验 \(p(\theta)\) 和似然 \(p(D|\theta)\) 的关系是?

单选题 · easy

  • A.后验等于先验乘以似然再做归一化← 正确答案
  • B.后验等于先验与似然之和
  • C.后验等于似然除以先验
  • D.后验只能通过 MCMC 得到

答案:A。贝叶斯定理的核心是后验 ∝ 先验 × 似然,除以证据归一化。A 正确。B 是加法,C 是除法,都不对;D 混淆了推断工具与公式本身的关系。

Q2. 在 Pyro 中,pyro.sample("theta", dist.Normal(0, 1)) 的作用是?

单选题 · easy

  • A.定义一个观测变量并传入数据
  • B.从指定分布中申明一个随机变量← 正确答案
  • C.计算当前参数的梯度
  • D.执行一次变分推断迭代

答案:B。pyro.sample 是概率编程的核心原语,用于从分布中抽样并声明潜变量。B 正确。观测要用 obs 参数,梯度由 autograd 负责,推断迭代由 SVI.step() 或 MCMC.run() 驱动。

Q3. Pyro 底层使用的自动微分框架是?

单选题 · easy

  • A.TensorFlow
  • B.JAX
  • C.PyTorch← 正确答案
  • D.NumPy

答案:C。Pyro 完全构建在 PyTorch 之上,所有张量运算和自动微分都来自 PyTorch。C 正确。Pyro 不是 TensorFlow 概率库的绑定,也不是 JAX 生态的 NumPyro。

Q4. 在 SVI 中,guide 分布 \(q_{\phi}(\theta)\) 的作用是?

单选题 · mid

  • A.代替似然函数参与梯度回传
  • B.作为先验分布参与采样
  • C.作为真实后验的近似分布,通过优化 \(\phi\) 逼近后验← 正确答案
  • D.对数据做归一化处理

答案:C。SVI 的思想是选一个参数化的分布族 q,通过最大化 ELBO 使 q 逼近难以计算的后验 p(θ|D)。C 正确。guide 不是似然也不是先验,更不做数据归一化。

Q5. ELBO 需要被最大化,其直观含义是?

单选题 · mid

  • A.让变分分布尽可能远离先验
  • B.让变分分布在解释数据与接近先验之间取得平衡← 正确答案
  • C.让模型完全拟合训练数据
  • D.让 MCMC 采样步长最大

答案:B。ELBO 包含“对数联合概率期望”和“变分分布熵”两项,前者鼓励拟合数据,后者鼓励分布不要过度膨胀。B 正确。它不追求“远离先验”,也不要求完全拟合,更与 MCMC 步长无关。

Q6. MCMC 采样中,"warmup"(老化)阶段的作用是?

单选题 · mid

  • A.提高 GPU 利用率
  • B.丢弃链尚未收敛到目标分布时的样本← 正确答案
  • C.增加模型训练轮数
  • D.自动调低学习率

答案:B。马尔可夫链需要从初始位置逐步“收敛”到目标分布,最开始的样本并不能代表后验。warmup 就是烧掉这些早期失真样本,只保留稳定后的结果。B 正确。

Q7. NUTS 相较于普通随机游走 Metropolis-Hastings 的主要优势是?

单选题 · hard

  • A.不需要计算梯度信息
  • B.利用哈密顿动力学自动选择跳跃方向与步长,减少随机游走行为← 正确答案
  • C.可以并行采样多个完全独立的链
  • D.无需设置任何超参数

答案:B。NUTS 是 HMC 的改进版,它利用一阶梯度模拟粒子在参数空间的运动,并通过递归树自动确定步长,从而大幅降低样本间的自相关性。B 正确。NUTS 恰恰需要梯度,并行是工程实现问题,它也需要设置步长等参数。

Q8. 关于贝叶斯线性回归,以下说法正确的是?

多选题 · mid

  • A.系数 w 是一个随机变量,其后验是分布而非单点← 正确答案
  • B.预测时使用后验预测分布可以给出不确定区间← 正确答案
  • C.贝叶斯回归的结果一定比最小二乘回归更准
  • D.先验只在数据量极少时起作用

答案:AB。贝叶斯回归把系数建模为随机变量,预测时对后验积分形成预测分布,从而量化不确定性,A、B 正确。C 错误:更“准”取决于评价指标,贝叶斯方法优势在不确定量化而非必然更优。D 错误:先验在小样本时影响更大,但即使样本量大它也会通过正则化影响结果。

Q9. 在 Pyro 中,关于 pyro.plate 的说明正确的是?

多选题 · hard

  • A.用于声明数据的独立性结构并支持向量化← 正确答案
  • B.必须在模型与 guide 中使用完全相同的 plate 名称← 正确答案
  • C.可以替代所有 for 循环
  • D.它会影响 MCMC 后验样本数量

答案:AB。plate 声明条件独立并提供向量化批处理,A 正确;Pyro 要求 guide 里的 plate 名称必须与模型一致,否则无法对应隐变量,B 正确。C 错误:plate 不等价于普通循环,它带概率语义。D 错误:样本数量由 num_samples 控制。

Q10. 关于 Pyro 的 pyro.do 算子和因果推断,正确的是?

多选题 · hard

  • A.它通过干预操作改变生成机制,从而估计因果效应← 正确答案
  • B.它可以回答“如果干预了 X,Y 会怎样变化”的反事实问题← 正确答案
  • C.它的结果与普通条件概率 P(Y|X) 完全等价
  • D.它只能用在线性回归模型中

答案:AB。pyro.do 实施干预,删除指向被干预变量的入边,得到 P(Y|do(X)),这与观测条件下的 P(Y|X) 不同(C 错)。A、B 正确。它可以用于多种结构化模型而非仅限于线性回归,D 错。