我正在努力应用 Tensorflow 急切执行 (TF2) 来训练 actor-critic DDPG 算法的 actor 。此示例中的描述说明:
使用参与者的在线网络,使用当前状态作为输入来获取动作平均值。然后,使用评论家在线网络以获得评论家输出相对于动作平均值 ∇aQ(s,a) | 的梯度。s=s_t,a=μ(s_t)。使用链式法则,在给定 ∇aQ(s,a) 的情况下,计算参与者输出相对于参与者权重的梯度。最后,将这些梯度应用到演员网络。
Actor 和 Critic 都是 Keras 模型。很抱歉没有发布完整的代码,但我希望我的问题可以从这些相关的片段中理解。
def fit_actor(self, state):
action = self.predict_actor(state) #online actor
q_value = self.predict_critic(state, action) #online critic
param_gradient = self.tape_online_critic.gradient(q_value, [action])
#=> is alway [None], also for tape_online_actor
gradient = zip(param_gradient, self.online_actor.trainable_weights)
self.optimizer_actor.apply_gradients(gradient)
在“predict_critic”中,评论家被提供状态和动作,所以“tape_online_critic”有操作
#for online critic and online actor
def predict_critic(self, state, actions):
with self.tape_online_critic as tape:
return self.online_critic([state, actions])
def predict_actor(self, state):
with self.tape_online_actor as tape:
return self.online_actor([state])
我尝试了几乎所有可以想到的变量/磁带等组合,但我总是使用[None]和ValueError的梯度。
ValueError: No gradients provided for any variable: ['conv2d_2/kernel:0']
- 我不确定tape.gradient()函数的参数顺序,甚至不确定参数本身的性质。
- 据我了解,我必须在在线演员的磁带上调用tape.gradient()函数,以获得演员权重相对于 with tape: context 中 predict_actor 函数中记录的操作的梯度. 我是否还需要在那里进行tape.watch( someTensor )的操作?文档说变量会被自动监视,所以我假设不会。
- tf.GradientTape 是否适合在这里使用?还有tfe.gradients_function?