tl;dr:是的,梯度反向传播可以正常工作tf.distributions.Normal
.
dist.pdf(x)
不从分布中抽取样本,而是返回概率密度函数x
。这可能不是您想要的。
要获得随机样本,您真正想要的是调用dist.sample()
。对于许多随机分布,随机样本对参数的依赖性是重要的,并且不一定是可反向传播的。
然而,正如 @Richard_wth 指出的那样,特别是对于正态分布,可以通过重新参数化来获得对位置和尺度参数的简单依赖(mu
and sigma
).
事实上,在实施 https://github.com/tensorflow/tensorflow/blob/b7e38a5f2a310599e9d4cab2bd95a43dd18018d6/tensorflow/python/ops/distributions/normal.py#L186 of tf.contrib.distributions.Normal
(最近迁移到tf.distributions.Normal
),这正是如何sample
已实施:
def _sample_n(self, n, seed=None):
...
sampled = random_ops.random_normal(shape=shape, mean=0., stddev=1., ...)
return sampled * self.scale + self.loc
因此,如果您提供尺度和位置参数作为张量,则反向传播将在这些张量上正确工作。
请注意,这种反向传播本质上是随机的:它将根据正常高斯变量的随机抽取而变化。然而,从长远来看(通过许多训练示例),这可能会如您所期望的那样工作。