Байесовские нейронные сети, использующие вероятность тензорного потока - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь использовать вероятность тензорного потока для изучения байесовских нейронных сетей. Я хочу узнать ответы y_t на основе входных характеристик x_t, то есть

y_t = f(x_t) + eps

, где f (x_t) - это выход нейронной сети и модели eps aleatori c неопределенности. В качестве первого шага я предполагаю, что все веса сети имеют априор по Гауссу с нулевым средним и единичной дисперсией, в то время как eps моделируется как нулевое среднее и шум единичной дисперсии. Это может быть достигнуто с помощью следующих примеров, взятых из https://colab.research.google.com/github/tensorchiefs/dl_book/blob/master/chapter_08/nb_ch08_03.ipynb

kernel_divergence_fn=lambda q, p, _: tfp.distributions.kl_divergence(q, p) / (x.shape[0] * 1.0)
bias_divergence_fn=lambda q, p, _: tfp.distributions.kl_divergence(q, p) / (x.shape[0] * 1.0)

def NLL(y, distr): 
  return -distr.log_prob(y) 

def normal_sp(params): 
  return tfd.Normal(loc=params[:,0:1], scale=1.0)

inputs = Input(shape=(10,))

hidden = tfp.layers.DenseFlipout(10,bias_posterior_fn=tfp.layers.util.default_mean_field_normal_fn(),
                           bias_prior_fn=tfp.layers.default_multivariate_normal_fn,
                           kernel_divergence_fn=kernel_divergence_fn,
                           bias_divergence_fn=bias_divergence_fn,activation="relu")(inputs)
hidden = tfp.layers.DenseFlipout(5,bias_posterior_fn=tfp.layers.util.default_mean_field_normal_fn(),
                           bias_prior_fn=tfp.layers.default_multivariate_normal_fn,
                           kernel_divergence_fn=kernel_divergence_fn,
                           bias_divergence_fn=bias_divergence_fn,activation="relu")(hidden)
params = tfp.layers.DenseFlipout(1,bias_posterior_fn=tfp.layers.util.default_mean_field_normal_fn(),
                           bias_prior_fn=tfp.layers.default_multivariate_normal_fn,
                           kernel_divergence_fn=kernel_divergence_fn,
                           bias_divergence_fn=bias_divergence_fn)(hidden)
dist = tfp.layers.DistributionLambda(normal_sp)(params) 

model_vi = Model(inputs=inputs, outputs=dist)
model_vi.compile(Adam(learning_rate=0.0002), loss=NLL)

Затем я могу обучить эту сеть. Я, однако, хочу, чтобы гамма была априорной для дисперсии параметра шума eps, т.е.

eps ~ N (0, sigma)

sigma ~ Gamma (a1, b1)

Как я могу реализовать это в вероятностной структуре TensorFlow? Я думаю, мне нужно добавить еще один нейрон на последний слой DenseFlipout и изменить априорную и апостериорную функции на функцию, которая производит выборку из продукта нормального и гамма-распределения. Однако точно не знаю, как это реализовать.

...