def _init_step_size(self, q, p, mass, get_gradient, get_log_posterior):
factor = 1.5
def loop_cond(step_size, last_acceptance_rate, cond):
return cond
def loop_body(step_size, last_acceptance_rate, cond):
# Calculate acceptance_rate
new_q, new_p = leapfrog_integrator(
q, p, tf.constant(0.0), step_size / 2,
get_gradient, mass)
new_q, new_p = leapfrog_integrator(
new_q, new_p, step_size, step_size / 2,
get_gradient, mass)
__, _, _, _, acceptance_rate = get_acceptance_rate(
q, p, new_q, new_p,
get_log_posterior, mass, self.data_axes)
acceptance_rate = tf.reduce_mean(acceptance_rate)
# Change step size and stopping criteria
new_step_size = tf.cond(
tf.less(acceptance_rate,
self.target_acceptance_rate),
lambda: step_size * (1.0 / factor),
lambda: step_size * factor)
cond = tf.logical_not(tf.logical_xor(
tf.less(last_acceptance_rate, self.target_acceptance_rate),
tf.less(acceptance_rate, self.target_acceptance_rate)))
return [new_step_size, acceptance_rate, cond]
new_step_size, _, _ = tf.while_loop(
loop_cond,
loop_body,
[self.step_size, tf.constant(1.0), tf.constant(True)]
)
return new_step_size
评论列表
文章目录