Композиция совместных распределений в вероятности TensorFlow - PullRequest
2 голосов
/ 13 апреля 2020

Я новичок в вероятности c программирования и TFP. Я пытаюсь использовать его для вероятностного графического моделирования c, которое привлекает меня гибкостью, позволяя разбивать сложные модели на более простые кусочные объяснения. Однако у меня возникают трудности при определении моделей более высокого уровня, которые вероятностно связаны с переменными, определенными моделями более низкого уровня.

Предположим, я определил следующее распределение для случайной величины theta_1 на основе пояснительных переменных x_1, x_2 и аналогично для theta_2 на основе x_3, x_4:

theta_1_model = tfd.JointDistributionSequential(
    [
        tfd.Normal(0, 1, name='x_1'),
        tfd.Normal(0, 1, name='x_2'),
        lambda x_2, x_1: tfd.Normal(x_1, tf.exp(x_2), name='theta_1')
    ]
)
theta_2_model = tfd.JointDistributionSequential(
    [
        tfd.Normal(0, 1, name='x_3'),
        tfd.Normal(0, 1, name='x_4'),
        lambda x_4, x_3: tfd.Normal(x_3, tf.exp(x_4), name='theta_2')
    ]
)

Я бы тогда нравится определять модели, которые опираются на theta_1 и theta_2 в качестве объясняющих переменных. Например, предположим, что я хотел бы смоделировать случайную величину y, которая обычно распределяется по разнице между theta_1 и theta_2. Учитывая, что theta_1_model и theta_2_model сами являются распределениями (для случайных величин dim-3), похоже, я должен иметь возможность использовать их в определении JointDistributionSequential для y по направлениям:

y_model = tfd.JointDistributionSequential(
    [
        theta_1_model,
        theta_2_model,
        lambda t_2_m, t_1_m: tfd.Normal(t_1_m[...,2]-t_2_m[...,2], 1, name='y')
    ]
)

где я попытался использовать индексирование [..., 2] для ссылки на тета-компонент в дистрибутивах dim-3. Это не работает однако. Именно при определении взаимосвязи между новыми переменными в модели более высокого уровня и отдельными переменными, уже определенными в моделях более низкого уровня, у меня возникают трудности .

Я, конечно, мог бы определить полное модель для y в одном большом JointDistributionSequential определении. Однако для более сложных приложений, где я хотел бы повторно использовать компоненты более низкого уровня, это невозможно.

Недавно был опубликован официальный документ (https://arxiv.org/pdf/2001.11819.pdf), озаглавленный «Совместные распределения». для вероятности TensorFlow »с разделом« Композиция совместных распределений ». В этом разделе предполагается, что совместные распределения в принципе можно комбинировать способом, который я предлагаю, но не показывает, как могут быть определены отношения между новыми переменными в модели более высокого уровня и переменными, уже определенными в моделях более низкого уровня.

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, ваш код будет работать с небольшими изменениями. Вы используете t_1_m[...,2], но t_1_m - это не Tensor - как пример из JDSequential, это список python из Tensor s. Я попробовал это, заменив это на t_1_m[2] (то же самое для другого), и я смог выбрать из вложенной модели и вычислить логи.

...