在 Tensorflow 中,计算图可以依赖于随机变量。在随机变量代表分布中的单个样本的情况下,可能会感兴趣的是用 N 个单独的样本计算数量,例如进行方差较小的样本估计。
有没有办法用不同的随机样本运行相同的图,尽可能多地重用中间计算?
可能的解决方案:
- 在循环内创建图形和随机变量。缺点:制作不依赖于随机变量的数量的冗余副本。
- 使用批次维度扩展随机变量。缺点:有点麻烦。似乎 TF 应该能够自动执行某些操作。
- 也许图形编辑器(在 .contrib 中)可用于制作具有不同噪声的副本,但我不确定这是否比循环更好。
- 理想情况下,应该只有一个操作来重新评估随机变量或将依赖项标记为未实现,从而强制它对新数量进行采样。但这很可能是不可能的。
循环策略示例:
import tensorflow as tf
x = tf.Variable(1.)
g = []
f = lambda x: tf.identity(x) #op not depending on noise
for i in range(10):
a = tf.random_normal(()) # random variable
y = tf.pow(f(x)+a*x, 2) # quantity to be repeated for diff samples
g += [y]
#here, the mean is the quantity of interest
m = tf.reduce_mean(g)
#the variance demonstrates that the samples are different
v = tf.reduce_mean(tf.map_fn(lambda x: tf.square(x-m), tf.stack(g)))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(g))
print('variance: {}'.format(sess.run(v)))
iff(x)
是一个昂贵的函数,我只能假设循环会进行大量冗余计算。