我正在尝试使用哈密顿量蒙特卡罗(HMC),来自Tensorflow概率,但我的目标分布包含一个难解的一维积分,我用梯形法则对此进行了近似。我对HMC的理解是,它可以计算目标分布的梯度以构建更有效的过渡内核。我的问题是Tensorflow是否可以根据函数的参数计算出梯度,它们是否有意义?
例如,这是目标分布的对数概率,其中“ A”是模型参数:
# integrate e^At * f[t] with respect to t between 0 and t, for all t
t = tf.linspace(0., 10., 100)
f = tf.ones(100)
delta = t[1]-t[0]
sum_term = tfm.multiply(tfm.exp(A*t), f)
integrals = 0.5*delta*tfm.cumsum(sum_term[:-1] + sum_term[1:], axis=0)
pred = integrals
sq_diff = tfm.square(observed_data - pred)
sq_diff = tf.reduce_sum(sq_diff, axis=0)
log_lik = -0.5*tfm.log(2*PI*variance) - 0.5*sq_diff/variance
return log_lik
以A为单位的该函数的梯度有意义吗?
是的,您可以使用tensorflow GradientTape计算出梯度。我假设您有一个log_lik
带有许多输入的数学函数输出,其中之一是A
该得到的梯度log_lik
相对于A
,您可以使用tf.GradientTape
在tensorflow
例如:
with tf.GradientTape(persistent=True) as g:
g.watch(A)
t = tf.linspace(0., 10., 100)
f = tf.ones(100)
delta = t[1]-t[0]
sum_term = tfm.multiply(tfm.exp(A*t), f)
integrals = 0.5*delta*tfm.cumsum(sum_term[:-1] + sum_term[1:], axis=0)
pred = integrals
sq_diff = tfm.square(observed_data - pred)
sq_diff = tf.reduce_sum(sq_diff, axis=0)
log_lik = -0.5*tfm.log(2*PI*variance) - 0.5*sq_diff/variance
z = log_lik
## then, you can get the gradients of log_lik with respect to A like this
dz_dA = g.gradient(z, A)
dz_dA
包含变量中的所有部分导数 A
我只是通过上面的代码向您展示这个想法。为了使它起作用,您需要通过Tensor操作进行计算。因此更改以修改您的函数以使用张量类型进行计算
另一个例子但在张量运算中
x = tf.constant(3.0)
with tf.GradientTape() as g:
g.watch(x)
with tf.GradientTape() as gg:
gg.watch(x)
y = x * x
dy_dx = gg.gradient(y, x) # Will compute to 6.0
d2y_dx2 = g.gradient(dy_dx, x) # Will compute to 2.0
在这里,您可以看到文档中的更多示例,以了解更多https://www.tensorflow.org/api_docs/python/tf/GradientTape
首先让我将python代码转换为数学(我使用https://www.codecogs.com/latex/eqneditor.php,希望它可以正确显示):
# integrate e^At * f[t] with respect to t between 0 and t, for all t
从上面开始,这意味着您具有功能。我叫它g(t, A)
然后,您正在做一个定积分。我叫它G(t,A)
从您的代码开始,t
不再是变量,将其设置为10。因此,我们简化为仅具有一个变量的函数h(A)
到目前为止,函数h
内部具有确定的积分。但是,由于您是近似值,因此我们不应该将其视为实积分(dt-> 0),这只是简单数学的另一链。这里没有神秘。
然后,最后一个输出log_lik
(它只是一些带有一个新输入变量的简单数学运算)被observed_data
称为y
。
然后z
计算的函数log_lik
是:
z
与张量流中的其他普通数学运算链没有什么不同。因此,dz_dA
从z
wrtA
的梯度为A
您提供可以最小化的更新梯度的意义上讲,这是有意义的z
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句