#7308·pymc

重构/升级 `find_MAP`

作者: jessegrabowski创建于 2024年5月12日更新于 2026年9月12日
标签request discussionfeature requestjaxnumba

描述 find_MAP 有一点过时了,但它仍然是 PyMC 中有用的功能,需要一些关注。 特别是,我正在考虑以下升级: 1. 允许更多自由地访问底层 scipy.optimize.minimize 配置 目前,用户无法自由指定是否需要梯度 - 它会根据可用性自动选择。 这是一个很好的启发式方法,但也是不必要的。 更重要的是,如果梯度不可用,用户请求的方法将完全被覆盖为 powell。 这仍然是一个自由的选择,并且如果用户要求基于梯度的求解器,则会出错。 2. 允许二阶导数信息 所有模型都可以编译一个 d2logp 函数,可以由多个 scipy.optimize.minimize 例程利用,包括 Newton-CGtrust-ncgtrust-krylovtrust-exact。 没有理由不允许用户带入此信息(可选)。 对于小问题,当前的 d2lopg 函数(计算全密集二阶矩)应该是可行的。 但出于性能原因,我们还应该考虑编译一个 hessp 函数,该函数返回给定向量的梯度的 JVP。 这正是 Newton-CGtrust-ncgtrust-krylov 需要的(只有 trust-exact 需要全密集二阶矩)。 3. 允许编译交替后端 以下代码几乎工作,但不是完全正确: with pytensor.config.change_flags(dict(mode = 'JAX')): res = pm.find_MAP() 这显然是许多情况下所希望的代码(扫描基模型,请注意)。 但它在其他情况下也很有用,例如如果我们真的想在 GPU 上运行我们的模型。 我建议使用类似于 pm.find_MAP(backend='JAX') 的 API,它将为用户处理所有这些。 4. 允许使用随机优化的小批量支持 这更像是一个远大的目标,但对于内存受限的模型,如果我们能够与 PyMC 中现有的小批量+随机优化框架实现互操作性,那就太好了。 从我所能了解的情况来看,这基本上没有任何障碍。 find_MAP 已经有一个 method 方法,它可以接受字符串(访问 scipy.optimize 优化器)或 pymc 随机优化器(如 pm.adam),这将触发相应的机制。 5. 允许访问 scipy.optimize.basinhopping 这点最底层,因为除了我以外,没有人关心,但我发现模拟退火对于复杂问题非常稳定,对于真正棘手的优化问题来说是一颗强大的核弹。 它是一个独立的 API,与 scipy.optimize.minimize 不同,但我们可以通过 method 参数在后台连接它。 例如,statsmodels 就是这样做的。