Keras 在这种情况下,为什么梯度带计算的梯度是错误的(使用tfp.vi.monte_carlo_变分损失)

Keras 在这种情况下,为什么梯度带计算的梯度是错误的(使用tfp.vi.monte_carlo_变分损失),keras,gradient,tensorflow2.0,tensorflow-probability,Keras,Gradient,Tensorflow2.0,Tensorflow Probability,tf.GradientTape中的梯度似乎与我试图最小化的函数中的正确最小值不匹配 我试图使用tensorflowprobability的黑盒变分推断(使用tf2),使用keras优化器tf.GradientTape,调用apply\u gradients函数。替代后叶是一个简单的1d正常。我试着近似一对法线,参见pdist函数。为了简单起见,我只是尝试优化比例参数 当前代码: from scipy.special import erf import numpy as np import mat

tf.GradientTape
中的梯度似乎与我试图最小化的函数中的正确最小值不匹配

我试图使用tensorflowprobability的黑盒变分推断(使用tf2),使用keras优化器
tf.GradientTape
,调用
apply\u gradients
函数。替代后叶是一个简单的1d正常。我试着近似一对法线,参见pdist函数。为了简单起见,我只是尝试优化比例参数

当前代码:

from scipy.special import erf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf
import tensorflow_probability as tfp
from tensorflow_probability import distributions as tfd

def pdist(x):
    return (.5/np.sqrt(2*np.pi)) * np.exp((-(x+3)**2)/2) + (.5/np.sqrt(2*np.pi)) * np.exp((-(x-3)**2)/2)
def logpdist(x):
    logp = np.log(1e-30+pdist(x))
    assert np.all(np.isfinite(logp))
    return logp

optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)
mu = tf.Variable(0.0,dtype=tf.float64)
scale = tf.Variable(1.0,dtype=tf.float64)
for it in range(100):
    with tf.GradientTape() as tape:
        surrogate_posterior = tfd.Normal(mu,scale)
        elbo_loss = tfp.vi.monte_carlo_variational_loss(logpdist,surrogate_posterior,sample_size=10000)
    gradients = tape.gradient(elbo_loss, [scale])
    optimizer.apply_gradients(zip(gradients, [scale]))
    if it%10==0: print(scale.numpy(),gradients[0].numpy(),elbo_loss.numpy())
输出(每10次迭代显示一次):

SCALE GRAD ELBO_损失
1.100, -1.000, 2.697
2.059, -0.508, 1.183

2.903,-0.354,0.859希望有人能详细说明为什么以前的实现失败了(以及为什么它没有例外,只是有错误的答案)。无论如何,我发现我可以通过确保关键表达式使用tensorflow数学库而不是numpy来修复它。将上述两种方法具体替换为:

def pdist(x):
    return (.5/np.sqrt(2*np.pi)) * tf.exp((-(x+3)**2)/2) + (.5/np.sqrt(2*np.pi)) * tf.exp((-(x-3)**2)/2)

def logpdist(x):
    return tf.math.log(pdist(x))
随机优化现在起作用了

输出:

2.020, -0.874, 1.177
2.399, -0.393, 0.916
2.662, -0.089, 0.857
2.761, 0.019, 0.850
2.765, 0.022, 0.843
2.745, -0.006, 0.851
2.741, 0.017, 0.845
2.752, 0.005, 0.852
2.744, 0.015, 0.852
2.747, 0.013, 0.862
我不会接受我自己的答案,因为如果能给出一些答案,让我直观地了解为什么现在这样做,为什么以前失败了(为什么失败模式不是例外或类似,而是不正确的梯度),我将不胜感激

2.020, -0.874, 1.177
2.399, -0.393, 0.916
2.662, -0.089, 0.857
2.761, 0.019, 0.850
2.765, 0.022, 0.843
2.745, -0.006, 0.851
2.741, 0.017, 0.845
2.752, 0.005, 0.852
2.744, 0.015, 0.852
2.747, 0.013, 0.862