python - tensorflow 中的参数化混合密度网络协方差

标签 python tensorflow mixture-model

我正在尝试构建一个 MDN 来学习 P(y | x),其中 y 和 x 都具有维度 D,其中 K 个分量具有完整(非对角)协方差。根据神经网络隐藏层的输出,我需要构造分量均值、权重和协方差。对于协方差,我想要一组下三角矩阵(即协方差的 Cholesky 因子),即 [K, D, D] 张量,因此我可以利用这样一个事实:对于正定矩阵,您只需要随身携带矩阵的一个三角形。

目前,参数化均值 (locs)、权重 (logs) 和协方差 (scale) 的神经网络如下所示:

def neural_network(X):

  # 2 hidden layers with 15 hidden units
  net = tf.layers.dense(X, 15, activation=tf.nn.relu)
  net = tf.layers.dense(net, 15, activation=tf.nn.relu)
  locs = tf.reshape(tf.layers.dense(net, K*D, activation=None), shape=(K, D))
  logits = tf.layers.dense(net, K, activation=None)
  scales = # some function of tf.layers.dense(net, K*D*(D+1)/2, activation=None) ?

  return locs, scales, logits

问题是,对于尺度来说,将 tf.layers.dense(net, K*D*(D-1)/2,activation=None) 转变为最有效的方法是什么? K DxD 下三角矩阵的张量(对角线元素取幂以确保正定性)?

最佳答案

TL;DR:使用tf.contrib.distributions.fill_triangular


假设 X 是 D 维度的 K 个元素的张量,我们将其定义为 placeholder

# batch of D-dimensional inputs
X = tf.placeholder(tf.float64, [None, D])

神经网络的定义与 OP 的定义相同。

# 2 hidden layers with 15 hidden units
net = tf.layers.dense(X, 15, activation=tf.nn.relu)
net = tf.layers.dense(net, 15, activation=tf.nn.relu)

多元高斯的均值只是先前隐藏层的线性密集层。输出的形状为 (None, D),因此无需将维度乘以 K 并重新整形。

# Parametrisation of the means
locs = tf.layers.dense(net, D, activation=None)

接下来,我们定义下三角协方差矩阵。关键是用tf.contrib.distributions.fill_triangular在另一个线性密集层的输出上。

# Parametrisation of the lower-triangular covariance matrix
covariance_weights = tf.layers.dense(net, D*(D+1)/2, activation=None)
lower_triangle = tf.contrib.distributions.fill_triangular(covariance_weights)

最后一件事:我们需要确保协方差矩阵是半正定的。通过应用 softplus 可以轻松实现这一点对角元素的激活函数。

# Diagonal elements must be positive
diag = tf.matrix_diag_part(lower_triangle)
diag_positive = tf.layers.dense(diag, D, activation=tf.nn.softplus)
covariance_matrix = lower_triangle - tf.matrix_diag(diag) + tf.matrix_diag(diag_positive)

就是这样,我们使用神经网络参数化了多元正态分布。


奖励:可训练的多元正态分布

Tensorflow Probability包具有可训练的多元正态分布,并具有现成的下三角协方差矩阵:tfp.trainable_distributions.multivariate_normal_tril

可以按如下方式使用:

mvn = tfp.trainable_distributions.multivariate_normal_tril(net, D)

它使用与tfp.distributions.MultivariateNormalTriL相同的方法输出多元正态三角分布。 ,包括均值协方差样本

我建议使用它而不是构建自己的。

关于python - tensorflow 中的参数化混合密度网络协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49810393/

相关文章:

python - 循环遍历字符串列表并删除特定列表项 (i) 之后的所有项,其中 i 可以是 a 或 b 或 c

tensorflow - 模块未找到错误: No module named 'tflite_support.metadata_writers'

python-3.x - 使用 TensorFlow 对象检测模型时遇到 "Graph contains a cycle"错误

tensorflow - 难以理解tf.contrib.seq2seq.TrainingHelper

python - 用Python抓取具有多个输入的网页

python - 为什么我不能在 python 中重写这个方法?

python - Swig 类型映射中的临时变量生成

matlab - 如何在 MATLAB 中绘制 gmdistribution 的结果?

machine-learning - 在 em 算法期间处理协方差矩阵中的零行/列

opencv - 使用openCV GMM类进行对象建模