详细内容或原文请订阅后点击阅览
我的 SciPy ODE 求解器正在扼杀我的贝叶斯推理:宇宙学家发现 Diffrax 的诚实叙述
它的成本、它的收益以及我所犯的三个错误《我的 SciPy ODE 求解器正在扼杀我的贝叶斯推理:宇宙学家对发现 Diffrax 的诚实描述》一文首先出现在《走向数据科学》上。
来源:走向数据科学这个问题让我寻找替代方案
。我的工作涉及建立宇宙模型——暗能量状态方程、修正引力、快子场——并询问:数据实际上对参数说了些什么?解决这个问题的工具是贝叶斯推理。我通常根据模型的复杂程度运行王朝嵌套采样,进行几千到几十万次似然评估。
在我攻读博士学位的大部分时间里,我并没有过多地考虑 ODE 求解器在solve_ivp 工作时的可能性。这是可靠的。因此我使用了它并继续前进。
然后我开始研究快子 DBI 暗能量模型,其中暗能量场由非标准动力学项控制,背景方程和扰动方程是一个耦合的刚性系统。每个似然调用求解了这些常微分方程,计算了同移距离,并评估了 30 颗超新星红移处的距离模量。
我对其进行了概要分析。仅 ODE 求解每次调用就需要 0.4 毫秒。在进行 10⁵ 评估的嵌套采样运行中,即 40 秒——仅在 ODE 调用中,在计算任何簿记之前。对于 10 参数模型,通过中心有限差分获得梯度需要 20 个额外的前向求解,将每个梯度的 0.4 毫秒变成 8 毫秒。就梯度而言,这就是 300 秒,或者大约 5 分钟。对于单个嵌套采样运行。
有些事情必须改变。
我发现了什么:diffrax
经过一天的搜索,我找到了 diffrax[1],这是一个完全用 JAX 编写的数值 ODE 求解器库。不是神经替代品。不是近似值。我已经在 scipy 中使用了相同的嵌入式 Runge-Kutta 算法 - Tsit5 而不是 RK45,但是相同的方法系列 - 只是编译、可微分和可向量化。
三个属性来自“完全用 JAX 编写”的设计:
JIT 编译 – 整个自适应步进循环编译为单个 XLA 内核。第一次调用后 Python 开销为零。
安装需要 10 秒:
pip 安装 jax diffrax
