是否可以在 TensorFlow 中仅在一次图形运行中高效地计算每个示例的梯度?

2024-02-23

TD;DR:有没有一种方法可以在一次图形运行中以矢量化形式评估 f'(x1)、f'(x2)、...、f'(xn)?其中 f'(x) 是 f(x) 的导数。

就像是:

x = tf.placeholder(tf.float32, shape=[100])
f = tf.square(x)
f_grad = tf.multiple_gradients(x) # f_grad contains f'(x[0]), f'(x[1]), ...

更具体地说,我正在尝试手动实现黑盒随机变分推理(BBSVI)(我知道我可以使用像Edward http://edwardlib.org/,但我正在尝试自己实现)。 在某一时刻,我需要计算 f'(x)g(x) 在 x (x1, x2, ..., xn) 的许多不同值上的平均值,其中 f(x) 和 g(x) 是两个函数,f'(x) 是 f(x) 的导数。

使用 TensorFlow 的 autodiff 功能,我可以通过简单地调用来计算 f'(x1)、f'(x2)、...、f'(xn)f_prime.eval(feed_dict={x: xi})对于 (x1, x2, ..., xn) 中的每个值 xi 一次。这根本没有效率:我想使用矢量化形式,但我不知道如何做到这一点。

也许使用tf.stop_gradient()不知何故?或者使用grad_ys论证中tf.gradients()?


经过一番挖掘,在 TensorFlow 中计算每个示例的梯度似乎并不简单,因为该库执行标准的反向传播来计算梯度(其他深度学习库如 PyTorch、Theano 等也是如此),它实际上从未计算每个示例的梯度,它直接获得每个示例的梯度之和。查看这次讨论 https://github.com/tensorflow/tensorflow/issues/4897更多细节。

然而,有一些技术可以解决这个问题,至少对于某些用例来说是这样。例如,论文高效的每个示例梯度计算 https://arxiv.org/abs/1510.01799Ian Goodfellow 解释了如何有效计算包含平方导数之和的每个示例向量。以下是显示计算的论文摘录(但我强烈建议您阅读这篇论文,它很短):

该算法是 O(mnp) 而不是 O(mnp²),其中 m 是示例数,n 是神经网络中的层数,p 是每层神经元的数量。因此,它比简单的方法(即每个示例执行一次反向传播)要快得多,尤其是当 p 很大时,甚至在使用 GPU 时速度更快(这会大大加快矢量化方法的速度)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 TensorFlow 中仅在一次图形运行中高效地计算每个示例的梯度? 的相关文章

随机推荐