---
title: "动手复算振铃后验的校准检验"
description: "先在共轭高斯模型上做模拟校准，再用到冻结的振铃神经后验上；输入、输出和失败案例都已保存。"
canonical_url: "https://sandboxphysics.com/zh/stories/simulation-based-inference/recompute-the-ringdown-calibration/"
language: "zh-CN"
page_type: "story"
alternate_languages:
  en: "https://sandboxphysics.com/stories/simulation-based-inference/recompute-the-ringdown-calibration/"
last_modified: "2026-11-12"
---

[从模拟里学到的后验能不能信](https://sandboxphysics.com/zh/stories/simulation-based-inference/)

# 动手复算振铃后验的校准检验

Sandbox Physics · 2026-11-12

照着这篇做完，你会在共轭高斯模型上重跑一遍模拟校准，用独立的参照检查精确网格后验，再把一个合成振铃的冻结神经后验的校准和失配检验从头算一遍。所有输入、输出和脚本都在下面公开，搭建过程中碰到的失败也一并保留。所有记录都是合成的，不涉及任何探测器数据。

每项检验背后的推导，分别在 [可信区域](https://sandboxphysics.com/zh/stories/simulation-based-inference/posterior-and-credible-regions/)、[秩检验](https://sandboxphysics.com/zh/stories/simulation-based-inference/rank-tests-for-posterior-calibration/) 和 [模型失配](https://sandboxphysics.com/zh/stories/simulation-based-inference/model-mismatch-and-importance-weights/) 三章。校准做法沿用 Talts 等人，重要性采样检查沿用 Dax 等人。[Talts 等，2018](https://arxiv.org/abs/1804.06788v2) [Dax 等，2023](https://arxiv.org/abs/2210.05686v2)

## 下载文件，准备环境

先读 [README](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/README.md)，里面列了模型、运行顺序、耗时和文件指纹。脚本都放在一个文件夹里，设置放在 **inputs** 子文件夹，结果写进 **outputs** 子文件夹。下面这条命令用 curl 自带的列表写法，按这个结构把文件取下来：

```
mkdir ac87 && cd ac87
curl -fsS --create-dirs -o "#1" "https://sandboxphysics.com/stories/simulation-based-inference/materials/\
{README.md,requirements.txt,ringdown_model.py,neural_posterior.py,calibration_statistics.py,\
calibrate_linear_gaussian.py,validate_grid_posterior.py,train_neural_posterior.py,validate_neural_posterior.py,\
inputs/ringdown-config.json,inputs/training-settings.json,inputs/linear-gaussian-settings.json,\
inputs/grid-validation-settings.json,inputs/neural-validation-settings.json,\
outputs/frozen-neural-posterior.json,outputs/training-log.json,outputs/failure-cases.json}"
python3 -m pip install -r requirements.txt
```

唯一的依赖是 NumPy，[requirements.txt](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/requirements.txt) 把它固定在 2.0.2。公开的结果是在 arm64 macOS 的 CPU 上、用 Python 3.9.6 跑出来的。想拿来对照的已保存输出，比如 [共轭高斯的结果](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/linear-gaussian-sbc.json)，请另放一个文件夹，因为每个脚本都会覆盖自己的输出。

## 单位与约定

**表 5.1** 各脚本共用的量。

| 量 | 符号 | 单位或范围 |
| --- | --- | --- |
| 采样率与长度 | 4096 Hz，128 个采样 | 共 $31.25\,\mathrm{ms}$ |
| 频率 | $f$ | $200$ 到 $300\,\mathrm{Hz}$，均匀先验 |
| 衰减时间 | $\tau$ | $2$ 到 $10\,\mathrm{ms}$，均匀先验 |
| 振幅与相位 | $A$、$\varphi$ | 固定为 $1$ 和 $0$ |
| 每个采样的噪声 | $\sigma$ | 白化单位，训练范围 $0.15$ 到 $0.6$ |
| 覆盖率 |  | 记录所占比例，名义水平也写成比例 |

[模型设置](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/inputs/ringdown-config.json) 还固定了三类失配。它们的比例只为教学而设：第二模式没有取克尔黑洞泛音的真实数值，毛刺用正弦高斯波包代替真实的探测器瞬变。

## 第一步：校准一个答案已知的模型

```
python3 calibrate_linear_gaussian.py
shasum -a 256 outputs/linear-gaussian-sbc.json
```

大约 2 秒跑完。先验是 $\theta\sim\mathcal N(0,1)$，四次测量的高斯噪声标准差为一，所以精确后验是方差 $0.2$ 的正态分布。脚本用 $4000$ 次模拟、每次 $99$ 个样本、分 20 根柱子，检验这个后验和四个错误的后验。指纹应为 **8bcd4246…cebd4**，与 README 一致。

打开输出，每种算法看三个字段。**counts** 是直方图，拿它和 **uniform99Band** （即 $[165, 236]$）比。**analyticExpectedCounts** 是不经模拟、直接由各个错误后验的已知形式预测的直方图。**centralIntervalCoverage** 给出真值落进 50% 和 90% 区间的模拟比例、这个比例的 Wilson 95% 区间，以及解析值。

这次运行里，精确后验没通过均匀性检验，尾部概率是 $0.0093$。这是 [失败记录](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/failure-cases.json) 里的第一条。**repeatStudy** 给出了解释：独立重复 200 次，精确后验被标出两次，每个错误后验都被标出 200 次。在 1% 的门槛下只跑一次，大约每一百次会有一次误报。

## 第二步：检查精确网格后验

```
python3 validate_grid_posterior.py
```

大约 15 秒，写出 [grid-validation.json](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/grid-validation.json)。后面的一切都拿网格后验当参照，所以它要先过四项检查，而且这些检查不走它自己的计算路径。

**表 5.2** 默认源上，网格后验宽度与费希尔极限之比。

| 噪声 $\sigma$ | 最优信噪比 | 频率宽度之比 | 衰减时间宽度之比 |
| --- | --- | --- | --- |
| $0.6$ | $4.32$ | $1.50$ | $0.82$ |
| $0.2$ | $13.0$ | $1.09$ | $1.00$ |
| $0.05$ | $51.8$ | $1.00$ | $1.00$ |

每个比值都是网格后验的标准差除以费希尔矩阵的预测。费希尔矩阵是高信噪比下的极限，所以只指望下面两行对得上。$\sigma=0.6$ 时后验不是高斯形状，还被先验方框截掉了一块。

在同一个似然上跑 Metropolis 抽样，频率均值 $249.993\,\mathrm{Hz}$、标准差 $3.32\,\mathrm{Hz}$；网格给出的是 $249.994$ 和 $3.28$。对网格做 2000 次模拟的 SBC，秩检验尾部概率是 $0.336$ 和 $0.071$，90% 覆盖率是 $0.897$。最后，在强度 $0.02$ 时，小失配模式的一阶偏差公式和网格算出的偏移相差不到 1%。

## 第三步：冻结的网络和它的训练成本

[冻结的网络](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/frozen-neural-posterior.json) 在 logit 变换后的坐标里输出五个高斯分布的混合。输入是记录在一组模板基上的 20 个投影，外加 $\ln(\sigma/0.3)$。两层各 128 个 tanh 单元，共 $23{,}198$ 个参数。指纹是 **bb213976…ed575**。

训练这一步可以跳过：

```
python3 train_neural_posterior.py
```

它在一个 CPU 上用了 $413.8\,\mathrm{s}$，见过 $3072$ 万次模拟，每次都从模型正确的情形里新抽。[训练日志](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/training-log.json) 里最终的验证损失是 $1.512$。网络从没见过任何一类失配。从种子 87 重新训练，得到的网络表现应当相同；字节完全一致，只有在同一个 NumPy 构建上才能指望。

## 第四步：检验网络

```
python3 validate_neural_posterior.py
```

大约 70 秒，写出 [neural-validation.json](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/neural-validation.json) 和 [browser-parity-cases.json](https://sandboxphysics.com/zh/stories/simulation-based-inference/materials/outputs/browser-parity-cases.json)。后一个文件固定了一组输入和输出，Lab 的浏览器代码必须逐一复现。它的指纹应为 **8f53fbf8…47ba0**。

验证文件按下面的顺序读。

1. **sbc**：从先验抽的 2000 条记录上的秩直方图。尾部概率频率是 $0.462$，衰减时间是 $0.800$。
2. **wellSpecifiedSummary**：网络和网格在 $0.05$ 到 $0.95$ 各个水平上的覆盖率；重要性采样效率中位数 $0.966$；与网格的 Jensen-Shannon 散度中位数 $0.0045$ 奈特；残差检验标出 $0.9\%$ 的记录。
3. **conditionalAndHeldOut**：九组、每组 400 条记录。三个噪声区间和短衰减时间在训练范围内；两个噪声水平在训练范围外；三类失配训练时从没出现过。
4. **labPresetsAtFixedSource**：Lab 的六个预设，每个 400 条记录，Lab 把它们画成虚点参考线。

每个覆盖率都附有 Wilson 95% 区间。400 条记录时，覆盖率在 $0.9$ 附近的区间约为 $\pm0.03$，比这更大的差别才算数。

## 保留下来的失败

失败记录里有六条。对重做这项工作的人来说，最要紧的是两条。

第一条是抽样程序的错误。网络的抽样程序起初用错了相关项，一维秩检验却照样通过，尾部概率是 $0.462$ 和 $0.781$。把抽样结果的矩和密度函数本身的矩一比才发现，误差 $0.223$，修好后降到 $0.0038$。边缘分布上的 SBC 看不见错误的相关性。

第二条是这里任何一项检查都发现不了的局限。模型外强度 $0.6$ 的第二模式，让两种后验的 90% 覆盖率都降到约 $0.74$，而重要性采样效率仍在 $0.98$ 左右，残差检验只标出约 6% 的记录。其余几条记的是：粗糙的求积公式把秩直方图预测错了；低信噪比时费希尔极限失效；某个 NumPy 构建报出的假矩阵警告。

## 做自己的模拟推断时可以对照的清单

- 先在写得出后验的模型上校准，并在模拟之前就预测错误后验的直方图。
- 记下随机种子、版本、耗时和文件指纹；失败的那次运行留着，不要换种子重跑。
- 参照用的后验本身，也要拿一个极限和一个独立的抽样器去核对。
- 检验联合覆盖率，拿抽样结果对照密度本身，不要只看一维的秩。
- 按参数空间的区域、按噪声水平，分开统计覆盖率。
- 跑留出的和失配的记录，写明每一种分别被哪项检查标出。

## 来源

1. [Talts 等，2018](https://arxiv.org/abs/1804.06788v2)
2. [Dax 等，2023](https://arxiv.org/abs/2210.05686v2)

## 继续阅读

从模拟里学到的后验能不能信 · 阅读路径

### 从后验到校准，再到模型失配

1. [文章 **神经网络给出的漂亮后验，怎样证明可以相信**](https://sandboxphysics.com/zh/stories/simulation-based-inference/trusting-a-neural-posterior/)
2. [文章 **后验分布与 90% 可信区域到底保证什么**](https://sandboxphysics.com/zh/stories/simulation-based-inference/posterior-and-credible-regions/)
3. [文章 **用秩统计和覆盖率检查后验是否校准**](https://sandboxphysics.com/zh/stories/simulation-based-inference/rank-tests-for-posterior-calibration/)
4. [文章 **用重要性权重和残差检验找出错误的模拟器**](https://sandboxphysics.com/zh/stories/simulation-based-inference/model-mismatch-and-importance-weights/)
5. [当前页面 **动手复算振铃后验的校准检验**](https://sandboxphysics.com/zh/stories/simulation-based-inference/recompute-the-ringdown-calibration/)
6. [文章 **读懂 DINGO 论文里的 P–P 图、散度和采样效率**](https://sandboxphysics.com/zh/stories/simulation-based-inference/reading-dingo-calibration-evidence/)
