我在计算重复调用的转换函数的渐变时遇到问题。
相对于动作计算的梯度是无,即使损失取决于通过重复转换调用生成的最大值之和所选择的所选动作。如果我们将损失函数的值更改为v而不是a的总和,那么我们会收到转换的渐变。
为什么在我们计算损失时,没有计算过渡的梯度,相对于总和超过?
以下是一大堆示例代码,您可以在其中复制问题。
import tensorflow as tf
import numpy as np
ACTION_DIM = 1
# random input
x = tf.Variable(np.random.rand(1, 5)) # [b branches, state_dim]
depth = 3
b = 4
v_list, a_list = [], [] # value and action store
# make value estimates 3 steps into the future by predicting intermediate states
for i in range(depth):
reuse = True if i > 0 else False
x = tf.tile(x, [b, 1]) # copy the state to be used for b different actions
mu = tf.layers.dense(x, ACTION_DIM, name='mu', reuse=reuse)
action_distribution = tf.distributions.Normal(loc=mu, scale=tf.ones_like(mu))
a = tf.reshape(action_distribution.sample(1), [-1, ACTION_DIM])
x_a = tf.concat([x, a], axis=1) # concatenate action and state
x = tf.layers.dense(x_a, x.shape[-1], name='transition', reuse=reuse) # next state s'
v = tf.layers.dense(x, 1, name='value', reuse=reuse) # value of s'
v_list.append(tf.reshape(v, [-1, b ** i]))
a_list.append(tf.reshape(a, [-1, b ** i]))
# backup our sum of max values along trajectory
sum_v = [None]*depth
sum_v[-1] = v_list[-1]
for i in reversed(range(depth)):
max_v_i = tf.reduce_max(v_list[i], axis=1)
if i > 0:
sum_v[i-1] = tf.reduce_max(v_list[i-1], axis=1) + max_v_i
max_idx = tf.reshape(tf.argmax(sum_v[0]), [-1, 1])
v = tf.gather_nd(v_list[0], max_idx)
a = tf.gather_nd(a_list[0], max_idx)
loss = -tf.reduce_sum(a)
opt = tf.train.AdamOptimizer()
grads = opt.compute_gradients(loss)
答案 0 :(得分:2)
我认为问题源于String fileTxt = File.ReadAllText(Give a path for a file); //read from file
Jobject Json = Jobject.Parse(fileTxt); //convert the string to Json
Console.WriteLine($"rr: {Json["rr"]} "); // get the rr from json and print it
定义arg_max
时的调用。 col_idx
是位置参数,因此没有渐变。这是有道理的,因为列表中最大值的位置不会随着最大值的变化而变化。
我也不相信对Arg_max
的调用会对其输入变量有衍生物,但仅仅因为它在contrib中。如果在修复tf.contrib.distributions.Normal
后问题仍然存在,也许您可以尝试使用默认的张量流。