继续阅读
从模拟里学到的后验能不能信 · 阅读路径
照着这篇做完,你会在共轭高斯模型上重跑一遍模拟校准,用独立的参照检查精确网格后验,再把一个合成振铃的冻结神经后验的校准和失配检验从头算一遍。所有输入、输出和脚本都在下面公开,搭建过程中碰到的失败也一并保留。所有记录都是合成的,不涉及任何探测器数据。
每项检验背后的推导,分别在 可信区域、秩检验 和 模型失配 三章。校准做法沿用 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 跑出来的。想拿来对照的已保存输出,比如 共轭高斯的结果,请另放一个文件夹,因为每个脚本都会覆盖自己的输出。
| 量 | 符号 | 单位或范围 |
|---|---|---|
| 采样率与长度 | 4096 Hz,128 个采样 | 共 |
| 频率 | 到 ,均匀先验 | |
| 衰减时间 | 到 ,均匀先验 | |
| 振幅与相位 | 、 | 固定为 和 |
| 每个采样的噪声 | 白化单位,训练范围 到 | |
| 覆盖率 | 记录所占比例,名义水平也写成比例 |
模型设置 还固定了三类失配。它们的比例只为教学而设:第二模式没有取克尔黑洞泛音的真实数值,毛刺用正弦高斯波包代替真实的探测器瞬变。
python3 calibrate_linear_gaussian.py
shasum -a 256 outputs/linear-gaussian-sbc.json大约 2 秒跑完。先验是 ,四次测量的高斯噪声标准差为一,所以精确后验是方差 的正态分布。脚本用 次模拟、每次 个样本、分 20 根柱子,检验这个后验和四个错误的后验。指纹应为 8bcd4246…cebd4,与 README 一致。
打开输出,每种算法看三个字段。counts 是直方图,拿它和 uniform99Band(即 )比。analyticExpectedCounts 是不经模拟、直接由各个错误后验的已知形式预测的直方图。centralIntervalCoverage 给出真值落进 50% 和 90% 区间的模拟比例、这个比例的 Wilson 95% 区间,以及解析值。
这次运行里,精确后验没通过均匀性检验,尾部概率是 。这是 失败记录 里的第一条。repeatStudy 给出了解释:独立重复 200 次,精确后验被标出两次,每个错误后验都被标出 200 次。在 1% 的门槛下只跑一次,大约每一百次会有一次误报。
python3 validate_grid_posterior.py大约 15 秒,写出 grid-validation.json。后面的一切都拿网格后验当参照,所以它要先过四项检查,而且这些检查不走它自己的计算路径。
| 噪声 | 最优信噪比 | 频率宽度之比 | 衰减时间宽度之比 |
|---|---|---|---|
每个比值都是网格后验的标准差除以费希尔矩阵的预测。费希尔矩阵是高信噪比下的极限,所以只指望下面两行对得上。 时后验不是高斯形状,还被先验方框截掉了一块。
在同一个似然上跑 Metropolis 抽样,频率均值 、标准差 ;网格给出的是 和 。对网格做 2000 次模拟的 SBC,秩检验尾部概率是 和 ,90% 覆盖率是 。最后,在强度 时,小失配模式的一阶偏差公式和网格算出的偏移相差不到 1%。
冻结的网络 在 logit 变换后的坐标里输出五个高斯分布的混合。输入是记录在一组模板基上的 20 个投影,外加 。两层各 128 个 tanh 单元,共 个参数。指纹是 bb213976…ed575。
训练这一步可以跳过:
python3 train_neural_posterior.py它在一个 CPU 上用了 ,见过 万次模拟,每次都从模型正确的情形里新抽。训练日志 里最终的验证损失是 。网络从没见过任何一类失配。从种子 87 重新训练,得到的网络表现应当相同;字节完全一致,只有在同一个 NumPy 构建上才能指望。
python3 validate_neural_posterior.py大约 70 秒,写出 neural-validation.json 和 browser-parity-cases.json。后一个文件固定了一组输入和输出,Lab 的浏览器代码必须逐一复现。它的指纹应为 8f53fbf8…47ba0。
验证文件按下面的顺序读。
每个覆盖率都附有 Wilson 95% 区间。400 条记录时,覆盖率在 附近的区间约为 ,比这更大的差别才算数。
失败记录里有六条。对重做这项工作的人来说,最要紧的是两条。
第一条是抽样程序的错误。网络的抽样程序起初用错了相关项,一维秩检验却照样通过,尾部概率是 和 。把抽样结果的矩和密度函数本身的矩一比才发现,误差 ,修好后降到 。边缘分布上的 SBC 看不见错误的相关性。
第二条是这里任何一项检查都发现不了的局限。模型外强度 的第二模式,让两种后验的 90% 覆盖率都降到约 ,而重要性采样效率仍在 左右,残差检验只标出约 6% 的记录。其余几条记的是:粗糙的求积公式把秩直方图预测错了;低信噪比时费希尔极限失效;某个 NumPy 构建报出的假矩阵警告。
从模拟里学到的后验能不能信 · 阅读路径