gpt4 book ai didi

python - tensorflow 概率: Gradients always zero when backpropagating the log_prob of a sample of a normal distribution

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:35 25 4
gpt4 key购买 nike

作为项目的一部分,我在使用tensorflow_probability处理正态分布的梯度时遇到问题。为此,我创建了一个正态分布并从中抽取了样本。然后,该样本的 log_prob 将被输入优化器以更新网络的权重。

如果我得到某个常数的 log_prob,我总是得到非零梯度。不幸的是,我没有在教程或类似的帮助来源中找到任何相关帮助。

def get_log_prob(mu, std)
extracted_location = tf.squeeze(extracted_location)
normal = tfd.Normal(mu, scale=std)
samples = normal.sample(sample_shape=(1))
log_prob = normal.log_prob(samples)
return log_prob

const = tf.constant([0.1], dtype=np.float32)

log_prob = get_log_prob(const, 0.01)
grads = tf.gradients(log_prob, const)

with tf.Session() as sess:
gradients = sess.run([grads])


print('gradients', gradients)

输出:渐变[array([0.], dtype=float32)]

如果在计算样本的梯度时,我希望得到非零梯度。相反,输出始终为“0”。

最佳答案

这是 TensorFlow Probability 实现重新参数化梯度的结果(又名“重新参数化技巧”,实际上在某些情况下是正确的答案。让我向您展示 0. 答案是如何产生的.

从具有某个位置和比例的正态分布生成样本的一种方法是首先从标准正态分布生成样本(这通常是一些库提供的函数,例如tf.random.normal 在 TensorFlow 中),然后对其进行移位和缩放。例如。假设 tf.random.normal 的输出是 z。要从位置 loc 和比例 scale 的正态分布中获取示例 x,您需要执行以下操作:x = z * scale + loc

现在,如何计算正态分布下数字的概率密度值?一种方法是反转该转换,以便您现在处理标准正态分布,然后计算那里的对数概率密度。 IE。 log_prob(x) = log_prob_std_normal((x - loc)/scale) + f(scale) (f(scale) 项来自于涉及的变量的变化转换,它的形式对于这个解释来说并不重要)。

您现在可以将第一个表达式代入第二个表达式,您将得到 log_prob(x) = log_prob_std_normal(z) + f(scale),即 loc 完全取消!结果,log_prob相对于loc的梯度为0.。这也解释了为什么如果您评估常量的对数概率,您不会得到 0.:它将缺少用于创建样本的正向变换,并且您会得到一些(通常是)非零梯度。

那么,什么时候这是正确的行为呢?当您计算分布参数相对于该分布下函数的期望的梯度时,重新参数化梯度是正确的。计算这种期望的一种方法是进行蒙特卡洛近似,如下所示:tf.reduce_mean(g(dist.sample(N), axis=0)。听起来这就是您所要做的正在做(其中您的 g()log_prob()),所以看起来梯度是正确的。

关于python - tensorflow 概率: Gradients always zero when backpropagating the log_prob of a sample of a normal distribution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55794542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com