首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tensorflow混合密度网络协方差的参数化

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

Stack Overflow用户
提问于 2018-04-13 06:13:56
回答 1查看 768关注 0票数 2

我试图构建一个MDN来学习P(y,x),其中y和x都有维数D,K分量具有完全(非对角)协方差。从神经网络隐层的输出,需要构造分量均值、权值和协方差。对于协方差,我需要一组下三角矩阵(即协方差的Cholesky因子),即K,D,D张量,这样我就可以利用这样一个事实:对于正定矩阵,你只需要带一个矩阵的三角形。

目前,将均值(locs)、权重(Log)和协方差(scales)参数化的NN看起来如下:

代码语言:javascript
运行
复制
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下三角矩阵的张量最有效的方法是什么(对角元指数化以确保正确定性)?

EN

回答 1

Stack Overflow用户

发布于 2018-12-07 16:20:33

TL;DR:使用三角状

假设X是K元素的D维张量,让我们将其定义为占位符

代码语言:javascript
运行
复制
# batch of D-dimensional inputs
X = tf.placeholder(tf.float64, [None, D])

神经网络的定义就像OP一样。

代码语言:javascript
运行
复制
# 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和整形乘以维数。

代码语言:javascript
运行
复制
# Parametrisation of the means
locs = tf.layers.dense(net, D, activation=None)

其次,定义了下三角协方差矩阵.关键是在另一个线性密集层的输出上使用三角状

代码语言:javascript
运行
复制
# 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)

最后一点:我们需要确保协方差矩阵是半正定的。通过将软+激活函数应用于对角线单元,可以很容易地实现。

代码语言:javascript
运行
复制
# 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流动概率包具有可训练的多元正态分布,且具有较低的三角协方差矩阵:三联

它可用于以下方面:

代码语言:javascript
运行
复制
mvn = tfp.trainable_distributions.multivariate_normal_tril(net, D)

它以与tfp.distributions.MultivariateNormalTriL相同的方法输出多元正态分布三角分布,包括meancovariancesample等。

我建议你用它代替你自己的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49810393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档