伯努利样本的梯度

时间:2017-01-31 15:46:53

标签: tensorflow gradient distribution

我正在尝试从伯努利分布w.r.t计算样本的梯度。概率1(样本为tensorflow.contrib.distributions)。

我尝试使用Bernoulli中提供的Bernoulli分布的实现和基于此discussion的我自己的简单实现。但是,当我尝试计算渐变时,这两种方法都失败了。

使用import tensorflow as tf from tensorflow.contrib.distributions import Bernoulli p = tf.constant([0.2, 0.6]) b = Bernoulli(p=p) s = b.sample() g = tf.gradients(s, p) with tf.Session() as session: print(session.run(g)) 实施:

TypeError: Fetch argument None has invalid type <class 'NoneType'>

上面的代码给出了以下错误:

import tensorflow as tf

p = tf.constant([0.2, 0.6])
shape = [1, 2]
s = tf.select(tf.random_uniform(shape) - p > 0.0, tf.ones(shape), tf.zeros(shape))
g = tf.gradients(s, p)

with tf.Session() as session:
    print(session.run(g))

使用我的实现:

TypeError: Fetch argument None has invalid type <class 'NoneType'>

同样的错误:

pandas

有没有办法计算伯努利样本的梯度?

(我的TensorFlow版本是0.12)。

1 个答案:

答案 0 :(得分:0)

由于明显的原因,您不能通过离散的随机节点进行反向传播。由于没有定义渐变。 但是,如果您用由温度参数控制的连续分布来近似伯努利,则可以。

这个想法称为重新参数化技巧,并在Tensorflow Probability中的RelaxedBernoulli中实现(或也在TF.contrib库中实现)

Relaxed bernoulli

您可以指定伯努利概率p,它是您的随机变量,等等。