Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SMC likelihood tempering? #514

Open
lukego opened this issue Oct 19, 2023 · 0 comments
Open

SMC likelihood tempering? #514

lukego opened this issue Oct 19, 2023 · 0 comments

Comments

@lukego
Copy link

lukego commented Oct 19, 2023

Is there a convenient way to implement SMC likelihood tempering using Gen/GenParticleFilters?

I want use SMC for parameter inference on static models with complex multi-modal posteriors and broad uninformative priors. The intuition is that very few of the particles sampled from the prior will agree well with the posterior. There will need to be a series of resampling and rejuvenation steps to help the particles settle in the right places and avoid particle degeneracy along the way.

The likelihood tempering strategy is to automatically derive a series of distributions to bridge the distance between the prior and the posterior. The bridging distributions are defined by taking any black-box model and tempering its final likelihood score. Summed up well by this figure:

smc_tempering

which shows a prior distribution (beta=0) and a posterior (beta=1) and two intermediate bridging distributions.

The challenge I see with Gen is that we don't have an explicit likelihood function that could be tempered with a wrapper function e.g. can't write

tempered_model(model, temp=0.5) = args -> model(args) ^ temp

and I'm not sure if there's an obviously correct way to hack trace.score within an inference method to affect tempering of SMC resampling/rejuvenating/reweighting steps without screwing up some important invariants on Gen data structures.

More references to the SMC likelihood tempering idea:

Any hints about how to approach this problem?

I have experimented with a "white-box" approach of defining models with their own explicit internal tempering but I haven't found a satisfactory solution here. I think the automatic approach is very elegant and would like to find a way to make it work with Gen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant