TensorFlow 2.0 Beta is available Learn more

tf.contrib.distributions.assign_log_moving_mean_exp

Compute the log of the exponentially weighted moving mean of the exp.

tf.contrib.distributions.assign_log_moving_mean_exp(
    log_mean_exp_var,
    log_value,
    decay,
    name=None
)
View source on GitHub

If log_value is a draw from a stationary random variable, this function approximates log(E[exp(log_value)]), i.e., a weighted log-sum-exp. More precisely, a tf.Variable, log_mean_exp_var, is updated by log_value using the following identity:

log_mean_exp_var =
= log(decay exp(log_mean_exp_var) + (1 - decay) exp(log_value))
= log(exp(log_mean_exp_var + log(decay)) + exp(log_value + log1p(-decay)))
= log_mean_exp_var
  + log(  exp(log_mean_exp_var   - log_mean_exp_var + log(decay))
        + exp(log_value - log_mean_exp_var + log1p(-decay)))
= log_mean_exp_var
  + log_sum_exp([log(decay), log_value - log_mean_exp_var + log1p(-decay)]).

In addition to numerical stability, this formulation is advantageous because log_mean_exp_var can be updated in a lock-free manner, i.e., using assign_add. (Note: the updates are not thread-safe; it's just that the update to the tf.Variable is presumed efficient due to being lock-free.)

Args:

  • log_mean_exp_var: float-like Variable representing the log of the exponentially weighted moving mean of the exp. Same shape as log_value.
  • log_value: float-like Tensor representing a new (streaming) observation. Same shape as log_mean_exp_var.
  • decay: A float-like Tensor. The moving mean decay. Typically close to 1., e.g., 0.999.
  • name: Optional name of the returned operation.

Returns:

  • log_mean_exp_var: A reference to the input 'Variable' tensor with the log_value-updated log of the exponentially weighted moving mean of exp.

Raises:

  • TypeError: if log_mean_exp_var does not have float type dtype.
  • TypeError: if log_mean_exp_var, log_value, decay have different base_dtype.