tensorflow / tensorflow/probability
Error in HamiltonianMonteCarlo when using gather in log_prob function
Nobody has claimed this yet.
- Dominant language
- Jupyter Notebook
- Stars
- 4.4k
- Forks
- 1.1k
- PR merge metrics
- No merged PRs in 30d
Description
I am trying to run a Hamiltonian MCMC on a target distribution whose implementation involves a call to tf.gather. The following code:
import tensorflow as tf
import tensorflow_probability as tfp
def sample_hmc(
target_log_prob_fn,
current_state,
num_results=1000,
num_burnin_steps=500,
adaptation_frac=0.8,
num_leapfrog_steps=3,
step_size=1.,
):
hmc = tfp.mcmc.SimpleStepSizeAdaptation(
tfp.mcmc.HamiltonianMonteCarlo(
target_log_prob_fn=target_log_prob_fn,
num_leapfrog_steps=num_leapfrog_steps,
step_size=step_size,
),
num_adaptation_steps=int(num_burnin_steps * adaptation_frac))
@tf.function
def run_chain():
samples, is_accepted = tfp.mcmc.sample_chain(
num_results=num_results,
num_burnin_steps=num_burnin_steps,
current_state=current_state,
kernel=hmc,
trace_fn=lambda _, pkr: pkr.inner_results.is_accepted,
)
return samples, is_accepted
return run_chain()
def logprob(alpha):
indices = tf.constant([2, 0, 1], dtype=tf.int32)
return -tf.math.reduce_sum(tf.gather(alpha**2, indices))
# return -tf.math.reduce_sum(alpha**2)
alpha = tf.constant([1.0, 1.0, 1.0])
sample_hmc(
logprob,
current_state=alpha,
num_results=10,
num_burnin_steps=5,
)
raises ValueError: The two structures don't have the same nested structure. followed by a very long and (to me) cryptic message. Replacing the return statement in the logprob function with the commented line gets rid of the error. The error seems to appear whenever the result of logprob contains a tf.gather subexpression.
The error also disappears when I remove the @tf.function decorator from the definition of run_chain. However, this comes at a huge performance cost.
How can I efficiently sample from a distribution whose log-probability involves a tf.gather expression?
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the supplied sample_hmc and logprob reproduction, focusing on tfp.mcmc.sample_chain, HamiltonianMonteCarlo, and the @tf.function boundary. Compare the tf.gather and reduction-only cases, then verify that the reported structure error is resolved while graph execution remains enabled and sampling still returns samples and acceptance values.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python, tensorflow
- Domain
- machine-learning
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100