想象一家后厨:你是主厨,手里有一张泛黄的菜谱卡,上面只写了「原料」「调味量范围」「期望的口感」——至于先放盐还是先放糖、火候怎么控制、什么时候尝一口,全都交给一位经验老到的总厨。这位总厨不会乱试,他会像在冰碗上溜冰一样,借着惯性优雅地从一种调味方案滑向下一种,偶尔折返,但从不瞎撞。这张菜谱卡,就是 Stan 程序;那位总厨,就是 HMC/NUTS 采样器;而「每多放一克盐,汤的咸度变化多少」的即时感应,则来自藏在后厨的自动微分传感网。 Stan 是一门概率编程语言,专门用来做贝叶斯推断:你把「世界如何产生数据」的知识写成菜谱,Stan 负责算出「看到数据之后,各种参数该信多少」。无论研究疫情传播、学校教学效果,还是银行客户违约率,这套「先声明、后推断」的范式,都让复杂模型变得像写菜谱一样清晰。
对 AI 从业者而言,Stan 是把「不确定性量化」落地的核心工具:当你需要从稀疏数据中给出带区间的结论,而非单一预测时,它就是那个替你掌勺的可靠总厨。
可视化演示
展示HMC哈密顿蒙特卡洛采样轨迹、NUTS无转折采样器树构建过程与MCMC多链收敛诊断,交互调节步长与链数查看后验采样质量。
本节配有交互动效(进入视口后自动加载,约 3KB)。
HMC:哈密顿蒙特卡洛采样 引入动量变量将参数空间扩展为相空间利用梯度引导采样 Leapfrog积分器模拟哈密顿动力学产生高接受率提议 H(q,p)=U(q)+K(p) 避免随机游走高效探索后验分布
贝叶斯推断入门
想象你要为一位素未谋面的客人调一碗汤。开火之前,你心里已经有个模糊的猜测:这位客人来自四川,多半偏好麻辣——这就是「先验」,即看到数据之前你对参数(盐量、辣度)的信念。汤端出去,客人尝了一口,眉头微皱,你赶快调整配方——这个「试吃反馈」就是「似然」,它告诉你当前调味下,这碗汤被喝光的概率有多大。
贝叶斯推断的全部秘密,就是如何把「经验猜测」和「实测反馈」拧成一股绳,得到最终的「后验」——看到数据之后,你对最佳调味的完整判断。Stan 这类概率编程语言所做的,正是把这条「越调越准」的思路自动化和规模化:你只需要声明先验和似然,剩下的归一化、采样、收敛诊断都由它代劳。后验越大越浓,说明该处参数越可信;后验呈现狭窄的单峰,说明客人口味明确,你信心十足;后验又宽又扁,说明反馈不足,还需继续试。
带着后验回到厨房:它告诉你「盐量该在 2 到 3 克之间,且更偏向 2.4 克」。这比单纯说「放 2.4 克盐」多了一层宝贵的确定性信息——这正是贝叶斯学派与频率学派的本质区别,也是 Stan 存在的最大理由。
- 先验 P(θ)是对参数 θ 的已知信念,相当于你开火前的口味猜测。
- 似然 P(Data|θ)固定某个 θ 值,看它「生成」这份数据的概率有多大,相当于客人对碗里这口汤的反应。
- 证据 P(Data)所有可能的 θ 下数据出现的总概率,起归一化作用,让概率积分等于 1。
- 后验 P(θ|Data)吸收数据后的更新版信念,是贝叶斯推断的最终输出,也是 Stan 采样的目标分布。
声明式语法
传统程序员的习惯是事无巨细地指挥:先给锅加热,再下油,油温七成时放蒜……Stan 的哲学完全不同,它像请一位总厨代劳:你只写「菜谱卡」,不写「做菜步骤」。菜谱卡分四个栏目:data 写原料清单(观测数据),parameters 写需要调教的秘密调料(未知参数),model 写口味方程(概率模型),generated quantities 写成品报告(后验预测、效应量等)。至于总厨怎么揉面、怎么颠勺——那是采样器的事。
这种「声明式」设计让建模者把注意力放在「世界如何生成数据」上,而不是「如何计算后验」上。比如预测房价,你只须声明 price ~ normal(alpha + beta * area, sigma),Stan 会自动推导出需要采样的参数和它们的梯度。下面是一段经典的线性回归模型,它几乎是每个 Stan 用户的第一张菜谱:
这段菜谱的数学本质,是把联合分布拆成「先验 × 每个数据点的似然」。归一化常数与参数无关,可以放心丢掉,于是后验的骨架就是下面这个正比式:
回到厨房视角:这张菜谱卡的价值在于「可传递、可复用」。总厨(Stan)看到卡就知道该配什么厨具(采样算法)、该放多少油(步长)、何时出锅(收敛判据)——而你,只需要把菜谱写清楚。
- 先验 P(θ)你对参数的经验预期,写在
model块开头的分布语句里。 - 似然乘积把 N 个数据点各自的似然相乘,数据越多,乘积对参数的「约束力」越强。
- 正比号 ∝丢掉与 θ 无关的归一化常数 P(Data),因为采样器只需知道「相对高低」,不需要精确的绝对概率。
data { int<lower=0> N; vector[N] x; vector[N] y;}parameters { real alpha; real beta; real<lower=0> sigma;}model { y ~ normal(alpha + beta * x, sigma);}
自动微分引擎
总厨要在冰碗上溜冰,前提是随时知道「哪边是下坡」。在概率厨房里,「下坡方向」就是对数后验的梯度:对每一个参数求偏导,告诉采样器往哪个方向调,概率密度上升得最快。可模型动辄几十个参数,靠手动推公式算梯度,比手写一本调味手册还痛苦。Stan 的自动微分引擎,就是在每个调味罐上装了即时传感器。
它的原理并不神秘:Stan 把 model 块编译成一个计算图,前向传播时算出对数后验的值,同时记录每一步中间结果;反向传播时从终点一路乘回起点,复用链式法则,一次性得到所有偏导。实现上用了一种叫「对偶数」的技巧——把导数当作一个数的影子随身携带,加减乘除时影子自动同步更新。于是「每多放一克盐,咸度变化多少」这种问题,不再需要你亲自做实验,传感器一毫秒就告诉你答案。
没有这套传感网,HMC 每走一步都要手动算梯度,溜冰就成了拄拐杖散步。自动微分让梯度的成本从「写一晚上公式」降为「跑一次前向计算」,这是 Stan 能处理复杂先验和层次模型的底气所在。
- 中间量 h计算图中每个节点代表一次运算结果,比如
alpha + beta * x。 - 逐段导数每一层输出对输入的瞬时变化率,相当于每道工序的「转化系数」。
- 反向连乘从末端 L 开始,把各段系数依次相乘,得到对 θ 的总梯度。
HMC采样原理
老式 MCMC 采样器像一位醉汉:在能量碗里随机乱撞,每一步都步履蹒跚,要走几万步才能逛遍整个碗底。Stan 的招牌采样器 Hamilton Monte Carlo(HMC)则完全不同——它给样本一个随机的「初速度」,让它像溜冰者在冰碗上滑行:借着惯性冲向对岸,再在势能高的地方自动减速回头。一次滑行抵得上醉汉几百步。
物理上,HMC 构造了一个虚构的哈密顿系统:参数 θ 是位置,辅助变量 p 是动量;后验概率的负对数构成「势能」,动量的平方构成「动能」。总能量守恒的溜冰者沿等能量线滑行,于是采样轨迹天然地沿着后验的高概率区域伸展,不会漫无目的地乱逛。滑完一段轨迹后,用 Metropolis 规则决定接受还是拒绝,把离散化带来的微小偏差修正掉。
蛙跳步长 ε 和步数 L 是 HMC 的两个旋钮:ε 太大轨迹会飞出碗外,太小又磨蹭;L 太长滑过头浪费力气,太短又退化成醉汉。Stan 的聪明之处在于,把「L 多长合适」这个难题交给了下一节的主角——NUTS。
- 位置与动量参数 θ 充当粒子位置,p 是无物理含义的辅助动量,每次迭代重新随机抽取。
- 势能 U(θ)后验概率越低的地方势能越高,相当于能量碗里越陡的坡。
- 动能 K(p)动量越大动能越大,质量矩阵 M 决定粒子「有多惯性」,M 常取单位阵或对角阵。
- 蛙跳半步动量先沿梯度方向推半步动量,作为启动动作。
- 位置全步动量带动位置走一整步,像溜冰者蹬冰前进。
- 动量收尾半步再用新位置的梯度修正动量,保证轨迹对称可逆。
NUTS自适应
给溜冰者定「滑多远」是个两难:滑太短,样本之间高度相关,等于没滑;滑太长,粒子可能滑过最低点又折返,白费力气回到原点附近。No-U-Turn Sampler(NUTS)想出一条聪明的规则:不预先定距离,而是一边滑一边问「我是不是正在往回滑?」——一旦发现轨迹的「头」和「尾」开始相向运动,立刻刹车停步。
实现上,NUTS 用二叉树不断加倍扩展候选轨迹:从当前点向正反两个方向各推一步、两步、四步……每扩展一层,就检查「U 型转弯」条件是否成立。如果成立,说明继续走下去只会折返浪费,于是从这棵树的候选节点里按权重抽一个作为新样本。整个过程配合 slice sampling,保证采样分布依然精确——折返前抽到的样本,仍然服从目标后验。与此同时,NUTS 还会用 dual averaging 自适应调整步长 ε,把接受率稳定在预设的目标值附近(Stan 中即 adapt_delta,默认 0.8)。
NUTS 相当于给总厨配了一位「会自动判断何时出锅」的副手:不需要人工试错调 L,模型换了、维度变了、数据多了,它都能自动适应。这也是 Stan 开箱即用、对新手极其友好的核心原因。
- 轨迹正端 θ⁺二叉树扩展出的最远正向位置,相当于溜冰者冲出去的最远点。
- 轨迹负端与动量θ⁻ 是最远反向位置,p⁻ 是该点的动量,两者共同刻画「还在不在前进」。
- 折返判定位移 (θ⁺ − θ⁻) 与动量 p⁻ 的内积小于 0,意味着最远点正在被「拽回来」,该刹车了。
- 树形采样停止后从整棵树的候选节点中按权重抽取,保证接受概率不变,这就是详细平衡的保障。
层次模型建模
连锁餐饮集团开了一百家分店,口味基调统一,但每家店会根据本地客群微调甜辣度。如果让每家店独立研究配方,分店样本太少,结论肯定飘;如果强制所有店用同一配方,又忽略地域差异。层次模型(Hierarchical Model)给出第三条路:总厨先定一个「中央酱料」——全局均值和波动范围,各分店参数从中央酱料里「抽」出来,再结合自家数据微调。数据少的分店,参数会被用力拉向中央;数据多的分店,则保留更多个性。这个折中就叫「部分池化」。
这正是 Stan 的招牌战场。经典案例「八所学校」里,每所学校的 SAT 辅导效果 αⱼ 来自同一个全局分布,观测数据 yᵢ 又受各自学校 αⱼ 影响。Stan 可以轻松表达这种「参数套参数」的结构,并在后验中同时给出全局效应和学校水平的估计。先验敏感性分析还能告诉你:结论对中央酱料的咸淡假设有多依赖。
有了层次结构,统计模型第一次学会了「举一反三」:新开一家分店,即使还没有任何数据,也能用中央酱料给出一个合理的先验预测。这正是社会科学、教育学和医学中「小样本、多分组」数据最需要的推断能力。
- 分组映射 j[i]把每个观测归到它所属的组,相当于给每位客人标上他所在的分店。
- 观测模型组内数据服从以该组效应为中心的钟形分布,σ 是组内噪声。
- 组先验各组参数 αⱼ 从同一个正态分布抽取,这就是「中央酱料」的数学表达。
- 部分池化τα 大则各组各显神通,τα 小则全部向 μα 收缩,数据会替你决定这个度。
流行病学应用
疫情暴发时,疾控指挥部无法真的「试错」,只能靠推演。Stan 在这里就是参谋部的沙盘:把传染病传播机制写成菜谱卡,喂入每日确诊数据,推断出基本再生数 R₀ 的后验区间,再模拟不同干预强度下的疫情曲线。2020 年 COVID-19 流行期间,多个研究团队正是用 Stan 拟合 SIR/SEIR 模型,为封控和疫苗政策的评估提供了概率依据。
最基本的传染病模型是 SIR:人群分成易感者 S、感染者 I、康复者 R。易感者以 β 的比例接触感染者而感染,感染者以 γ 的比例康复。Stan 不光估计这三个「锅里的状态」,更关注一个关键派生量——基本再生数 R₀:平均一个病人传染几个人。R₀ 后验区间的下界高于 1,疫情就在蔓延;低于 1,则趋于消退。相比只报一个点估计,带不确定性的 R₀ 让决策者知道「最坏情况有多坏」。
Stan 的价值不只是算一个 R₀:它还能把不同城市的传播率作为层次模型的组参数,借用全局信息稳定每个城市的估计;或者把干预措施编码成随时间变化的 β(t),量化「哪次封控真正压低了传播」。疾控指挥官看到的不再是一张孤零零的曲线,而是一整套带概率边界的推演沙盘。
- 状态变量S、I、R 分别表示易感、感染、康复人数,N 为总人口。
- 感染流易感者按 βSI/N 的速率转为感染者,传播率 β 越大,传染越快。
- 康复流感染者按 γI 的速率转为康复者,康复率 γ 越大,病程越短。
- 基本再生数R₀ = β/γ,是「无干预时平均每例传染几人」的汇总指标。
云计算扩展
一家后厨再能干,一天也出不了十万道菜。Stan 上云,就是把单枪匹马的后厨升级成中央厨房:多口锅同时开火(多条马尔可夫链并行采样),每口锅独立从后验里取样,最后把各锅的样本合并起来。这不仅能成倍加速,还顺带提供了一种天然的质检方式——如果几口锅煮出来的「口味分布」不一致,说明火候或菜谱有问题。
在云端,Stan 通常这样工作:用 cmdstanpy 这类接口调用编译好的采样程序,一次启动多条链并行运行;每条链的数据通过 CSV 或 Arrow 等高效格式灌入容器,模型打包成 Docker 镜像部署在 Kubernetes 集群上;采样完成后,将各链样本汇总,画轨迹图、算收敛诊断。这里的核心质检指标是 R-hat:它比较「单链内部的波动」与「链与链之间的差异」,理想情况两者接近,说明各链已经忘掉初始位置、融为一家人。
中央厨房的隐喻到这里完整闭环:菜谱(Stan 模型)写一次,就能在后厨(本地)、中央厨房(云端集群)之间无缝迁移。多链并行加 R-hat 把关,让大规模贝叶斯推断从「玄学」变成了「工程」——这正是 Stan 在今天大数据时代依然屹立不倒的原因。
- 组内方差 W单条链内部样本的方差,反映采样过程自身的波动。
- 组间方差 B各链均值的离散程度,反映链之间是否各说各话。
- 合并估计链内、链间加权合并成总方差 V̂,样本量大时主要受组内方差支配。
- 收敛判据R̂ < 1.01 表示各链已经充分混合,可以放心合并后验。
AI 应用场景
疫情传播态势研判
阶段:数据接入 → 传染病模型拟合 → 后验推断 → 决策支持
解决的问题:疫情早期数据稀疏、噪声大,传统点估计无法表达「最坏情况」;Stan 用 SIR/SEIR 模型加贝叶斯推断,输出 R₀ 的后验区间,让决策者同时看见均值与不确定性,避免被单一数字误导。
具体案例:2020 年多国研究团队用 Stan 拟合每日新增确诊,估计基本再生数与封控措施的效果,向公共卫生部门提交带概率边界的疫情推演报告。
教育政策量化评估
阶段:多校数据清洗 → 层次模型构建 → 组效应估计 → 政策报告
解决的问题:评估某辅导项目对学校成绩的影响时,校间差异不可忽略;传统回归把各校当成独立样本会低估标准误,完全合并又会抹杀校际差异。Stan 的层次模型用「部分池化」让薄弱校借用总体信息,得到更稳的效应估计。
具体案例:教育研究团队沿用经典「八所学校」范例,用 Stan 分析几十所学校的辅导效果,输出每所学校效应量及其后验区间,辅助教育局制定资源分配方案。
金融风控贝叶斯信用评分
阶段:特征工程 → 层次逻辑回归 → 后验预测 → 授信决策
解决的问题:不同地区、不同客群的违约率差异显著,新客群又往往样本稀少;Stan 的层次逻辑回归把客群效应作为组参数,小客群自动向全局收缩,同时给出违约概率的完整分布而非点估计。
具体案例:某银行风险团队用 Stan 拟合含地区随机效应的违约模型,按月输出各客群违约率后验分布,当某客群后验区间上移时,系统自动提醒调降授信额度。
Python 演示
import numpy as np # 生成模拟观测数据: y = 1.3 - 0.7*x + 噪声rng = np.random.default_rng(42)n = 80x = rng.uniform(-2, 2, n)y = 1.3 - 0.7 * x + rng.normal(0, 0.35, n) def logp(q): # 后验对数密度: 线性回归似然 + 温和先验 a, b, phi = q s2 = np.exp(2 * phi) resid = y - (a + b * x) return -n * phi - resid @ resid / (2 * s2) - (a*a + b*b) / 200 - phi*phi / 8 def grad(q): # 手写梯度: 对应 Stan 自动微分引擎的输出 a, b, phi = q s2 = np.exp(2 * phi) resid = y - (a + b * x) ga = resid.sum() / s2 - a / 100 gb = (resid * x).sum() / s2 - b / 100 gphi = -n + resid @ resid / s2 - phi / 4 return np.array([ga, gb, gphi]) def leapfrog(q, p, eps, L): # 蛙跳积分: 用梯度模拟哈密顿动力学 q = q.copy() p = p.copy() p = p + 0.5 * eps * grad(q) for _ in range(L - 1): q = q + eps * p p = p + eps * grad(q) q = q + eps * p p = p + 0.5 * eps * grad(q) return q, p q = np.array([0.0, 0.0, 0.0])samples = []accepted = 0eps, L, burn = 0.12, 25, 500total = 3000for i in range(total): p0 = rng.normal(size=3) q_new, p_new = leapfrog(q, p0, eps, L) H0 = -logp(q) + p0 @ p0 / 2 H1 = -logp(q_new) + p_new @ p_new / 2 if rng.random() < np.exp(min(0, H0 - H1)): q, accepted = q_new, accepted + 1 if i >= burn: samples.append(q.copy()) samples = np.array(samples)print("接受率: %.3f" % (accepted / total))print("后验均值 (a, b, log_sigma):", samples.mean(axis=0).round(3))print("后验标准差:", samples.std(axis=0).round(3))
def logp(q):定义对数后验密度,相当于 Stan 的model块;变量phi是log(sigma),保证标准差恒为正。def grad(q):手写对数后验对三个参数的梯度,对应 Stan 自动微分引擎的输出。p = p + 0.5 * eps * grad(q)蛙跳积分的半步启动,先沿「下坡方向」推动量。q = q + eps * p位置全步更新,让样本沿惯性滑行。H0 = -logp(q) + p0 @ p0 / 2出发前的哈密顿量(势能 + 动能),是接受规则中的「守恒量」。if rng.random() < np.exp(min(0, H0 - H1)):Metropolis 接受判据:总能量大致守恒时接受,否则按概率拒绝,修正积分误差。
常见误区
误区看到 Stan 也能「建模」「推断」,就以为它像 PyTorch 一样,直接扔进去一个神经网络结构就能训练出图像识别模型。
正解Stan 是概率编程语言,核心是贝叶斯推断——先验乘似然得后验,用 MCMC 采样而非反向传播优化。它也可以拟合贝叶斯神经网络,但输出的是参数的后验分布,而非一套「识别猫狗」的部署模型。厨房里虽然也有烤箱,但你的目标是炖汤,别拿烤箱当微波炉用。
为何常见:深度学习和贝叶斯建模共用「模型、训练、推断」等词汇,术语重叠让新手极易混淆。
误区收敛诊断报告显示 R-hat 小于 1.01,就认为后验估计绝对准确,可以直接写结论。
正解R-hat 只说明多条采样链「彼此看法一致」——相当于几位厨师尝过都说咸淡差不多,但若菜谱本身写错了(模型设定错误、观测模型不合适),众口一词也救不了这锅汤。还需要检查有效样本量 n_eff,并做先验敏感性分析,确认结论不是被某个拍脑袋的先验绑架。
为何常见:教程常把「收敛」简写成「可以放心用了」,让人遗忘收敛只是「必要不充分」的第一步质检。
误区模型跑得慢、后验不光滑,第一反应是把迭代次数从两千加到两万,坚信「大力出奇迹」。
正解后验的「病」往往在于参数高度相关、尾部厚重或分布极度扭曲,单纯加迭代只会让采样器在同一片区域打转。更有效的是换参数化方式(如非中心化参数化)、调小步长、或重新设计先验——这是给主厨换更顺手的厨具,而不是让他加班熬夜。
为何常见:在优化问题里增加迭代通常有用,但 MCMC 的瓶颈是自相关而非迭代量,两种直觉被混为一谈。
误区写 Stan 时下意识用 Python 的习惯控制流程,试图在 `model` 块里动态地改变数组长度、按条件跳过某些项。
正解Stan 是声明式语言,程序结构必须在编译期确定,循环也要尽量向量化;每条语句都要能被自动微分记录,运行时「看心情改结构」会让导数无从算起。这就像菜谱不允许出现「盐量视心情而定」——约束恰恰保证了梯度可计算、结果可复现。
为何常见:Python 用户习惯了动态语言的灵活性,遇到 Stan 的静态约束会产生强烈的不适。
面试题
Q1. Stan 的核心定位是什么?
- A.深度学习训练框架
- B.概率编程推断框架← 正确答案
- C.大数据存储系统
- D.数据可视化工具
答案:B。Stan 是概率编程语言,定位是贝叶斯推断——先验乘似然得到后验,用 HMC/NUTS 采样而非反向传播优化。深度学习训练、大数据存储、可视化都不是 Stan 的主业,选 B。
Q2. Stan 默认采用的主采样器是哪一种?
- A.随机游走采样器
- B.遗传算法搜索器
- C.NUTS 自适应采样器← 正确答案
- D.梯度下降优化器
答案:C。Stan 默认使用 NUTS(No-U-Turn Sampler),它是 HMC 的自适应版本,自动决定轨迹长度和步长。随机游走是传统 MCMC,遗传算法属进化计算,梯度下降是优化方法而非采样器。
Q3. 在 Stan 程序中,观测数据应声明在哪个块?
- A.data 数据块← 正确答案
- B.model 模型块
- C.函数定义区
- D.生成量输出区
答案:A。data 块存放观测数据和常量,parameters 块声明待推断参数,model 块写先验和似然。观测数据是「原料清单」,当然要放在 data 栏;generated quantities 块则用于输出后验预测。
Q4. 自动微分引擎给 HMC 带来的核心优势是什么?
- A.快速计算后验梯度← 正确答案
- B.自动清洗缺失数据
- C.自动选择先验分布
- D.自动生成合成样本
答案:A。HMC 每一步蛙跳都需要梯度 ∇U(θ),自动微分让这个梯度用手写公式几小时、机器计算几毫秒。它不负责清洗数据、选择先验或生成样本,那些是数据工程和模型设计的事。
Q5. HMC 中引入的「动量」p 起什么作用?
- A.携带惯性穿越低后验区← 正确答案
- B.记录样本的历史位置
- C.控制随机数发生器
- D.加速磁盘数据读取
答案:A。动量让样本像溜冰者一样凭借惯性冲过势能较高的区域,避免随机游走式的小碎步,从而高效探索高维后验。它不记忆历史、不控制随机数,更与磁盘 IO 无关。
Q6. NUTS 中的 "No-U-Turn" 指的是什么规则?
- A.轨迹端点发生折返时停← 正确答案
- B.迭代次数达到固定上限
- C.后验梯度变为零即停
- D.内存使用超过阈值即停
答案:A。NUTS 用二叉树的倍增扩展轨迹,每层都检查「头尾是否相向而行」的 U 型转弯条件,一旦折返立即停止扩展。它不设固定迭代上限,也不依赖梯度为零或内存阈值。
Q7. 层次模型中的「部分池化」指的是什么?
- A.子组参数向全局先验收缩← 正确答案
- B.每个子组完全独立拟合
- C.全部子组共用一个参数
- D.忽略组间差异和整体结构
答案:A。部分池化是「完全合并」与「完全独立」之间的折中:数据少的分组向全局均值收缩以借用信息,数据多的分组保留个性。B 是「无池化」,C 是「完全池化」,D 则是错误理解。
Q8. R-hat 收敛诊断统计量越接近哪个值表示链间越一致?
- A.1 表示链间趋于一致← 正确答案
- B.0 表示完全随机震荡
- C.100 表示采样效率高
- D.无穷大表示链长无限
答案:A。R-hat 是链间方差与链内方差之比的开方,多条链充分混合时两者接近,比值趋近 1,实践要求 < 1.01。接近 0 或 100 都不是收敛指标,无穷大更说明链之间严重分歧。
Q9. Stan 适用的建模任务有哪些?
- A.层次模型后验推断← 正确答案
- B.传染病 R0 估计← 正确答案
- C.图像风格迁移
- D.复杂先验贝叶斯建模← 正确答案
答案:ABD。Stan 的看家本领正是层次模型、传染病传播模型和复杂先验下的贝叶斯推断。图像风格迁移属于深度学习视觉任务,通常用卷积神经网络完成,不是 Stan 的典型应用场景。
Q10. 关于 NUTS 采样器,下列说法正确的是?
- A.树形倍增确定轨迹长度← 正确答案
- B.U 型折返处停止扩展← 正确答案
- C.无需梯度信息即可运行
- D.自适应步长调节采样过程← 正确答案
答案:ABD。NUTS 用二叉树成倍扩展轨迹、在 U 型折返点停止、并用 dual averaging 自适应调节步长,这些都是它的标志性机制。但它仍然建立在 HMC 之上,每步都需要自动微分提供的梯度,C 说法错误。