Возникают проблемы с пониманием того, как работает тензорная вероятность Bijectors 'RealNVP' 'log_prob - PullRequest
0 голосов
/ 11 апреля 2020

Вот код

tfd = tfp.distributions
tfb = tfp.bijectors

# A common choice for a normalizing flow is to use a Gaussian for the base
# distribution. (However, any continuous distribution would work.) E.g.,
nvp = tfd.TransformedDistribution(
    distribution=tfd.MultivariateNormalDiag(loc=[0., 0., 0.]),
    bijector=tfb.RealNVP(
        num_masked=2,
        shift_and_log_scale_fn=tfb.real_nvp_default_template(
            hidden_layers=[512, 512])))

x = nvp.sample((32,32))

x = nvp.sample((32,32)) дает мне тензор с 32x32x3 формой. Но, бросая x в nvp.log_prob(x), я получаю тензор формы 32x32. Я ожидал (1,) подобного тензора, поскольку хочу получить log_prob этого 32,32,3 тензора.

Итак, проблема в том, как повозиться с кодом выше для вычисления log_prob из 32x32x3 тензор формы?

1 Ответ

0 голосов
/ 13 апреля 2020

RNVP преобразует векторно-значные распределения (т. Е. MVNDiag в вашем случае выше). Вы можете попробовать nvp.distribution.log_prob(x) (применить базовый дистрибутив log_prob) и заметить, что он имеет ту же форму. Функция log_prob "потребляет" форму события x.

. log_prob преобразованного распределения - это что-то вроде

nvp.distribution.log_prob(nvp.bijector.inverse(x)) - nvp.bijector.inverse_log_det_jacobian(x) (я могу поменять знак. )

А именно, это сумма базового распределения log_prob, примененного к выборкам, отобранным посредством биективного преобразования, плюс поправочный член для учета (локального, при x) изменения объема, вызванного биективным преобразованием.

...