Как брать образцы из нескольких цепочек с помощью GPflow? - PullRequest
0 голосов
/ 16 июня 2020

Недавно я начал использовать gpflow для построения модели GP. Я использовал гамильтониан Монте-Карло, чтобы взять апостериор с одной цепочкой.

Моя цель - запустить несколько цепочек и выполнить диагностику сходимости.

Это моя настройка для одной цепочки:

num_burnin_steps = ci_niter(100)
num_samples = ci_niter(500)


hmc_helper = gpflow.optimizers.SamplingHelper(
    model.log_posterior_density, model.trainable_parameters
)

hmc = tfp.mcmc.HamiltonianMonteCarlo(
    target_log_prob_fn=hmc_helper.target_log_prob_fn, num_leapfrog_steps=10, step_size=0.01
)

adaptive_hmc = tfp.mcmc.SimpleStepSizeAdaptation(
    hmc, num_adaptation_steps=10, target_accept_prob=f64(0.75), adaptation_rate=0.1
)


@tf.function
def run_chain_fn():
    return tfp.mcmc.sample_chain(
        num_results=num_samples,
        num_burnin_steps=num_burnin_steps,
        current_state=hmc_helper.current_state,
        kernel=adaptive_hmc,
        trace_fn=lambda _, pkr: pkr.inner_results.is_accepted,
    )

samples, _ = run_chain_fn()
constrained_samples = hmc_helper.convert_to_constrained_values(samples

Я не могу найти никаких примеров того, как изменить это для нескольких цепочек. Здесь - ближайший пример, который я могу найти, который делает то же самое. Initial_state изменено на 10 цепочек. Чтобы сделать то же самое с моим примером, мне нужно было бы изменить hmc_helper.current_state, но я не могу найти правильный способ сделать это.

Любые предложения были бы очень признательны.

Я новичок в переполнении стека, поэтому извиняюсь, если мой вопрос не ясен.

Спасибо!

...