Python ValueError:没有为策略渐变中的任何变量提供渐变
我一直在尝试在强化学习中实现策略梯度算法。但是,在计算自定义损失函数的梯度时,我面临错误“ValueError:没有为任何变量提供梯度:”如下所示:Python ValueError:没有为策略渐变中的任何变量提供渐变,python,tensorflow,reinforcement-learning,gradient-descent,policy-gradient-descent,Python,Tensorflow,Reinforcement Learning,Gradient Descent,Policy Gradient Descent,我一直在尝试在强化学习中实现策略梯度算法。但是,在计算自定义损失函数的梯度时,我面临错误“ValueError:没有为任何变量提供梯度:”如下所示: def loss_function(prob, action, reward): prob_action = np.array([prob.numpy()[0][action]]) #prob is like ->[0.4900, 0.5200] and action is scalar index->1,0 log_
def loss_function(prob, action, reward):
prob_action = np.array([prob.numpy()[0][action]]) #prob is like ->[0.4900, 0.5200] and action is scalar index->1,0
log_prob = tf.math.log(prob_action)
loss = tf.multiply(log_prob, (-reward))
return loss
我计算的梯度如下:
def update_policy(policy, states, actions, discounted_rewards):
opt = tf.keras.optimizers.SGD(learning_rate=0.1)
for state, reward, action in zip(states, discounted_rewards, actions):
with tf.GradientTape() as tape:
prob = policy(state, training=True)
loss = loss_function(prob, action, reward)
print(loss)
gradients = tape.gradient(loss, policy.trainable_variables)
opt.apply_gradients(zip(gradients, policy.trainable_variables))
请帮我解决这个问题。
谢谢大家,正如@gekrone在评论中指出的,这肯定是由于prob_动作是一个numpy数组而不是张量,导致梯度不流动。还要注意不要使用
.numpy()
方法。可能会坚持这样的观点
prob_action = prob[0][action]
...
这应该是可行的。我认为这个错误意味着损失张量是不可微的,所以tensorflow不能计算损失对可训练变量的梯度。
loss\u函数中的某些东西正在中断从可训练变量到loss的路径。我不确定是什么导致了这个问题,它可能是prob_action=np.array([prob.numpy()[0][action]])
;尝试将prob_操作保持为tf.Tensor
而不是numpy数组。