Spec-Zone.ru › TensorFlow 1.15

tf.contrib.bayesflow.monte_carlo.expectation

Вычисляет приближение Монте-Карло для \(E_p[f(X)]\). (устарело)

tf.contrib.bayesflow.monte_carlo.expectation(
    f, samples, log_prob=None, use_reparametrization=True, axis=0, keep_dims=False,
    name=None
)
Предупреждение: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена после 2018-10-01. Инструкции по обновлению: Библиотека tf.contrib.bayesflow переехала в TensorFlow Probability (https://github.com/tensorflow/probability). Используйте tfp.monte_carlo.expectation вместо неё.

Эта функция вычисляет приближение Монте-Карло математического ожидания, т.е.

\(E_p[f(X)] \approx= m^{-1} sum_i^m f(x_j), x_j\ ~iid\ p(X)\)

где:

  • x_j = samples[j, ...],
  • log(p(samples)) = log_prob(samples) и
  • m = prod(shape(samples)[axis]).

Трюки: Перепараметризация и градиент-метод скоров

Когда p «перепараметризован», т.е. является диффеоморфным преобразованием распределения без параметров (например, Normal(Y; m, s) <=> Y = sX + m, X ~ Normal(0,1)), мы можем поменять местами градиент и математическое ожидание, т.е. grad[ Avg{ \(s_i : i=1...n\) } ] = Avg{ grad[\(s_i\)] : i=1...n } где S_n = Avg{\(s_i\)}and\(s_i = f(x_i), x_i ~ p\).

Однако, если p не перепараметризован, градиент TensorFlow будет некорректным, так как правило цепи обрывается на выборках неперепараметризованных распределений. (Результат без дифференцирования, approx_expectation, одинаков независимо от use_reparametrization.) В этом случае использование трюка градиента-метода скоров приводит к несмещённому градиенту, т.е.

grad[ E_p[f(X)] ]
= grad[ int dx p(x) f(x) ]
= int dx grad[ p(x) f(x) ]
= int dx [ p'(x) f(x) + p(x) f'(x) ]
= int dx p(x) [p'(x) / p(x) f(x) + f'(x) ]
= int dx p(x) grad[ f(x) p(x) / stop_grad[p(x)] ]
= E_p[ grad[ f(x) p(x) / stop_grad[p(x)] ] ]

Если p не перепараметризован, обычно лучше use_reparametrization = True.

Предупреждение: пользователи несут ответственность за проверку того, что p является «перепараметризованным» распределением.

Пример использования:

import tensorflow_probability as tfp
tfd = tfp.distributions

# Monte-Carlo approximation of a reparameterized distribution, e.g., Normal.

num_draws = int(1e5)
p = tfd.Normal(loc=0., scale=1.)
q = tfd.Normal(loc=1., scale=2.)
exact_kl_normal_normal = tfd.kl_divergence(p, q)
# ==> 0.44314718
approx_kl_normal_normal = tfp.monte_carlo.expectation(
    f=lambda x: p.log_prob(x) - q.log_prob(x),
    samples=p.sample(num_draws, seed=42),
    log_prob=p.log_prob,
    use_reparametrization=(p.reparameterization_type
                           == distribution.FULLY_REPARAMETERIZED))
# ==> 0.44632751
# Relative Error: <1%

# Monte-Carlo approximation of non-reparameterized distribution, e.g., Gamma.

num_draws = int(1e5)
p = ds.Gamma(concentration=1., rate=1.)
q = ds.Gamma(concentration=2., rate=3.)
exact_kl_gamma_gamma = tfd.kl_divergence(p, q)
# ==> 0.37999129
approx_kl_gamma_gamma = tfp.monte_carlo.expectation(
    f=lambda x: p.log_prob(x) - q.log_prob(x),
    samples=p.sample(num_draws, seed=42),
    log_prob=p.log_prob,
    use_reparametrization=(p.reparameterization_type
                           == distribution.FULLY_REPARAMETERIZED))
# ==> 0.37696719
# Relative Error: <1%

# For comparing the gradients, see `monte_carlo_test.py`.
Примечание: Приведенный выше пример предназначен только для иллюстрации. Для вычисления приближенного расхождения Кульбака-Лейблера предпочтительнее использовать следующее:
approx_kl_p_q = tfp.vi.monte_carlo_csiszar_f_divergence(
    f=bf.kl_reverse,
    p_log_prob=q.log_prob,
    q=p,
    num_draws=num_draws)
Аргументы
f Python-функция, которая может возвращать f(samples).
samples Tensor выборок, используемых для формирования приближения Монте-Карло для \(E_p[f(X)]\). Массив выборок должен быть индексирован по axis измерениям.
log_prob Python-функция, которая может возвращать log_prob(samples). Должна соответствовать натуральному логарифму плотности/массы вероятности каждой выборки. Требуется/используется только если use_reparametrization=False. Значение по умолчанию: None.
use_reparametrization Python-значение, указывающее, что приближение должно использовать тот факт, что градиент выборок несмещён. Независимо от того, True или False, этот аргумент влияет только на градиент полученного approx_expectation. Значение по умолчанию: True.
axis Измерения для усреднения. Если None, усредняются все измерения. Значение по умолчанию: 0 (самое левое измерение).
keep_dims Если True, сохраняет усреднённые измерения, используя размер 1. Значение по умолчанию: False.
name name_scope для операций, созданных этой функцией. Значение по умолчанию: None (что подразумевает «ожидание»).
Возвращаемые значения
approx_expectation Tensor соответствующее приближению Монте-Карло для \(E_p[f(X)]\).
Исключения
ValueError если f не является Python-функцией.
ValueError если use_reparametrization=False и log_prob не являются Python-функцией.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/contrib/bayesflow/monte_carlo/expectation

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API