在我一直在逐行梳理以了解实现的 Udacity 项目代码中,我偶然发现了class Actor第 55 行出现的部分: https ://github.com/nyck33/autonomous_quadcopter/blob/master/演员解决方案.py
# Define loss function using action value (Q value) gradients
action_gradients = layers.Input(shape=(self.action_size,))
loss = K.mean(-action_gradients * actions)
上面的代码片段似乎正在为动作梯度创建一个输入层,以计算在优化器中使用的 Adam 优化器(在下面的代码片段中)的损失,但是在哪里以及如何将任何东西传递到该action_gradients层?( https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam ) 使用get_updates上述优化器的函数loss:
# Define optimizer and training function
optimizer = optimizers.Adam(lr=self.lr)
updates_op = optimizer.get_updates(params=self.model.trainable_weights, loss=loss)
接下来我们得到train_n一个K.function类型函数(也在 中class Actor):
self.train_fn = K.function(
inputs=[self.model.input, action_gradients, K.learning_phase()],
outputs=[],
updates=updates_op)
其中action_gradients是(来自本地评论家网络的 Q 值 wrt 动作的梯度,而不是目标评论家网络)。
以下是调用时的参数train_fn:
"""
inputs = [states, action_gradients from critic, K.learning_phase = 1 (training mode)],
(note: test mode = 0)
outputs = [] are blank because the gradients are given to us from critic and don't need to be calculated using a loss function for predicted and target actions.
update_op = Adam optimizer(lr=0.001) using the action gradients from critic to update actor_local weights
"""
所以现在我开始认为,一旦Q值的梯度wrt,这里的确定性策略梯度公式: https ://pemami4911.github.io/blog/2016/08/21/ddpg-rl.html 就会实现动作从评论家传递给演员。
我认为action_gradients顶部提到的输入层试图找到actor wrt的输出到参数的梯度,以便它可以进行照片中所示的乘法运算。但是,重申一下,任何东西是如何传递到这一层的,为什么要以这种方式计算损失?
编辑:我错过了第 55 行的评论
# Define loss function using action value (Q value) gradients
所以现在我知道action_gradients输入层action_gradients从评论家那里收到了。
显然这是 Openai Baselines 等一些实现使用的技巧: https ://stats.stackexchange.com/questions/258472/computing-the-actor-gradient-update-in-the-deep-deterministic-policy-gradient- d
但是,为什么损失计算为-action_gradients * actions?
