Я пытаюсь использовать вероятность тензорного потока для изучения байесовских нейронных сетей. Я хочу узнать ответы 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 и изменить априорную и апостериорную функции на функцию, которая производит выборку из продукта нормального и гамма-распределения. Однако точно не знаю, как это реализовать.