gpt4 book ai didi

python - Tensorflow:如何批量获取每个实例的梯度?

转载 作者:行者123 更新时间:2023-11-28 17:14:13 30 4
gpt4 key购买 nike

我正在查看此笔记本中的策略梯度示例:https://github.com/ageron/handson-ml/blob/master/16_reinforcement_learning.ipynb

相关代码在这里:

X = tf.placeholder(tf.float32, shape=[None, n_inputs])

hidden = tf.layers.dense(X, n_hidden, activation=tf.nn.elu, kernel_initializer=initializer)
logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits) # probability of action 0 (left)
p_left_and_right = tf.concat(axis=1, values=[outputs, 1 - outputs])
action = tf.multinomial(tf.log(p_left_and_right), num_samples=1)

y = 1. - tf.to_float(action)
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)
optimizer = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(cross_entropy)
gradients = [grad for grad, variable in grads_and_vars]
gradient_placeholders = []
grads_and_vars_feed = []
for grad, variable in grads_and_vars:
gradient_placeholder = tf.placeholder(tf.float32, shape=grad.get_shape())
gradient_placeholders.append(gradient_placeholder)
grads_and_vars_feed.append((gradient_placeholder, variable))
training_op = optimizer.apply_gradients(grads_and_vars_feed)

...
# Run training over a bunch of instances of inputs
for step in range(n_max_steps):
action_val, gradients_val = sess.run([action, gradients], feed_dict={X: obs.reshape(1, n_inputs)})
...
# Then weight each gradient by the action values, average, and feed them back into training_op to apply_gradients()

以上工作正常,因为每个 run() 返回不同的梯度。

我想对所有这些进行批处理,并将一组输入输入 run() 而不是一次输入一个输入(我的环境与示例中的环境不同,因此对我来说进行批处理是有意义的,并提高性能)。即:

action_val, gradients_val = sess.run([action, gradients], feed_dict={X: obs_array})

其中 obs_array 的形状为 [n_instances, n_inputs]

问题是 optimizer.compute_gradients(cross_entropy) 似乎返回单个梯度,即使 cross_entropy 是形状为 [None, 1] 的一维张量。 action_val 确实如预期的那样返回一维 Action 张量 - 批处理中每个实例一个 Action 。

有什么方法可以让我获得一组渐变,批处理中每个实例一个?

最佳答案

The problem is that optimizer.compute_gradients(cross_entropy) seems to return a single gradient, even though cross_entropy is a 1d tensor of shape [None, 1].

这是设计使然,因为每个张量的梯度项会自动聚合。梯度计算操作,如 optimizer.compute_gradients 和低级原语 tf.gradients根据默认的 AddN 聚合方法,对所有梯度操作求和。这对于大多数随机梯度下降的情况都很好。

最后不幸的是,梯度计算将不得不在单个批处理上进行。当然,除非构建自定义梯度函数,或者扩展 TensorFlow API 以提供无需完全聚合的梯度计算。更改 implementation of tf.gradients做到这一点似乎并不简单。

您可能希望为强化学习模型采用的一个技巧是并行执行多个 session 运行。根据FAQ ,Session API 支持多个并发步骤,将利用现有资源进行并行计算。问题Asynchronous computation in TensorFlow显示如何执行此操作。

关于python - Tensorflow:如何批量获取每个实例的梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45324767/

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