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

Python tensorflow中混合密度网络协方差的参数化,python,tensorflow,mixture-model,Python,Tensorflow,Mixture Model,我试图构建一个MDN来学习p(y | x),其中y和x都有维度D,K个分量具有完全(非对角)协方差。从NN隐藏层的输出,我需要构造分量均值、权重和协方差。对于协方差,我需要一组下三角矩阵(即协方差的Cholesky因子),即[K,D,D]张量,因此我可以利用这样一个事实,即对于正定矩阵,只需要携带矩阵的一个三角形 此时,将均值(LOC)、权重(logs)和协方差(scales)参数化的NN如下所示: def neural_network(X): # 2 hidden layers with

我试图构建一个MDN来学习p(y | x),其中y和x都有维度D,K个分量具有完全(非对角)协方差。从NN隐藏层的输出,我需要构造分量均值、权重和协方差。对于协方差,我需要一组下三角矩阵(即协方差的Cholesky因子),即[K,D,D]张量,因此我可以利用这样一个事实,即对于正定矩阵,只需要携带矩阵的一个三角形

此时,将均值(LOC)、权重(logs)和协方差(scales)参数化的NN如下所示:

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;医生:使用
假设X是
K
元素
D
维度的张量,我们将其定义为a

#一批D维输入
X=tf.placeholder(tf.float64,[None,D])
神经网络的定义与OP一样

#2个隐藏层和15个隐藏单元
net=tf.layers.density(X,15,activation=tf.nn.relu)
net=tf.layers.dense(net,15,activation=tf.nn.relu)
多元高斯分布的平均值只是先前隐藏层的线性密集层。输出的形状为
(无,D)
,因此无需将尺寸乘以
K
并进行整形

#平均值的参数化
locs=tf.layers.dense(净、D、活化=None)
接下来,我们定义下三角协方差矩阵。关键是要使用另一个线性密集层的输出

下三角协方差矩阵的参数化 协方差加权=tf.layers.density(净,D*(D+1)/2,激活=无) 下三角=tf.contrib.distributions.fill三角(协方差加权) 最后一件事:我们需要确保协方差矩阵是半正定的。通过将激活函数应用于对角线元素,很容易实现

#对角线元素必须为正
对角线=tf.矩阵对角线部分(下三角形)
diag_正片=tf.layers.dense(diag,D,激活=tf.nn.softplus)
协方差矩阵=下三角-tf.矩阵(diag)+tf.矩阵(diag)
就是这样,我们用神经网络将多元正态分布参数化


奖金:可训练的多元正态分布 该软件包具有可训练的多元正态分布,下三角协方差矩阵随时可用:

它可以按如下方式使用:

mvn=tfp.可训练分布.多元正态分布(净,D)
它以与相同的方法输出多元正态三角分布,包括
均值
协方差
样本

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