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
)
Эта функция вычисляет приближение Монте-Карло математического ожидания, т.е.
\(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.
Пример использования:
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