跳到主要内容
Sandbox Physics
从模拟里学到的后验能不能信

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

Sandbox Physics ·

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

每项检验背后的推导,分别在 可信区域、秩检验 和 模型失配 三章。校准做法沿用 Talts 等人,重要性采样检查沿用 Dax 等人。Talts 等,2018 Dax 等,2023

下载文件,准备环境

先读 README,里面列了模型、运行顺序、耗时和文件指纹。脚本都放在一个文件夹里,设置放在 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 把它固定在 2.0.2。公开的结果是在 arm64 macOS 的 CPU 上、用 Python 3.9.6 跑出来的。想拿来对照的已保存输出,比如 共轭高斯的结果,请另放一个文件夹,因为每个脚本都会覆盖自己的输出。

单位与约定

表 5.1 各脚本共用的量。
量符号单位或范围
采样率与长度4096 Hz,128 个采样共 31.25 ms31.25\,\mathrm{ms}
频率ff200200 到 300 Hz300\,\mathrm{Hz},均匀先验
衰减时间τ\tau22 到 10 ms10\,\mathrm{ms},均匀先验
振幅与相位AA、φ\varphi固定为 11 和 00
每个采样的噪声σ\sigma白化单位,训练范围 0.150.15 到 0.60.6
覆盖率记录所占比例,名义水平也写成比例

模型设置 还固定了三类失配。它们的比例只为教学而设:第二模式没有取克尔黑洞泛音的真实数值,毛刺用正弦高斯波包代替真实的探测器瞬变。

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

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

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

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

这次运行里,精确后验没通过均匀性检验,尾部概率是 0.00930.0093。这是 失败记录 里的第一条。repeatStudy 给出了解释:独立重复 200 次,精确后验被标出两次,每个错误后验都被标出 200 次。在 1% 的门槛下只跑一次,大约每一百次会有一次误报。

第二步:检查精确网格后验

python3 validate_grid_posterior.py

大约 15 秒,写出 grid-validation.json。后面的一切都拿网格后验当参照,所以它要先过四项检查,而且这些检查不走它自己的计算路径。

表 5.2 默认源上,网格后验宽度与费希尔极限之比。
噪声 σ\sigma最优信噪比频率宽度之比衰减时间宽度之比
0.60.64.324.321.501.500.820.82
0.20.213.013.01.091.091.001.00
0.050.0551.851.81.001.001.001.00

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

在同一个似然上跑 Metropolis 抽样,频率均值 249.993 Hz249.993\,\mathrm{Hz}、标准差 3.32 Hz3.32\,\mathrm{Hz};网格给出的是 249.994249.994 和 3.283.28。对网格做 2000 次模拟的 SBC,秩检验尾部概率是 0.3360.336 和 0.0710.071,90% 覆盖率是 0.8970.897。最后,在强度 0.020.02 时,小失配模式的一阶偏差公式和网格算出的偏移相差不到 1%。

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

冻结的网络 在 logit 变换后的坐标里输出五个高斯分布的混合。输入是记录在一组模板基上的 20 个投影,外加 ln⁡(σ/0.3)\ln(\sigma/0.3)。两层各 128 个 tanh 单元,共 23,19823{,}198 个参数。指纹是 bb213976…ed575。

训练这一步可以跳过:

python3 train_neural_posterior.py

它在一个 CPU 上用了 413.8 s413.8\,\mathrm{s},见过 30723072 万次模拟,每次都从模型正确的情形里新抽。训练日志 里最终的验证损失是 1.5121.512。网络从没见过任何一类失配。从种子 87 重新训练,得到的网络表现应当相同;字节完全一致,只有在同一个 NumPy 构建上才能指望。

第四步:检验网络

python3 validate_neural_posterior.py

大约 70 秒,写出 neural-validation.json 和 browser-parity-cases.json。后一个文件固定了一组输入和输出,Lab 的浏览器代码必须逐一复现。它的指纹应为 8f53fbf8…47ba0。

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

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

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

保留下来的失败

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

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

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

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

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

来源

  1. Talts 等,2018
  2. Dax 等,2023

继续阅读

这一页直接连着哪些内容

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

从后验到校准,再到模型失配

  1. 文章神经网络给出的漂亮后验,怎样证明可以相信
  2. 文章后验分布与 90% 可信区域到底保证什么
  3. 文章用秩统计和覆盖率检查后验是否校准
  4. 文章用重要性权重和残差检验找出错误的模拟器
  5. 当前页面动手复算振铃后验的校准检验
  6. 文章读懂 DINGO 论文里的 P–P 图、散度和采样效率
这个页面有错误、看不明白,或者缺了什么?告诉我们
反馈类型

提交时会附带本页地址、Lab ID、网站语言和设备类型。请不要填写个人信息。反馈最多保存 12 个月。隐私政策