Keras GradientType:计算关于输出节点的梯度
Keras GradientType: Calculating gradients with respect to the output node
对于初学者:这个问题不寻求关于强化学习(RL)的帮助,RL仅用作示例。
Keras 文档包含一个示例 actor-critic reinforcement learning implementation using Gradient Tape。基本上,他们创建了一个具有两个独立输出的模型:一个用于演员(n
动作),一个用于评论家(1
奖励)。以下几行描述了反向传播过程(在代码示例的某处找到):
# Backpropagation
loss_value = sum(actor_losses) + sum(critic_losses)
grads = tape.gradient(loss_value, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
尽管 actor 和 critic 损失的计算方式不同,但他们将这两个损失相加以获得用于计算梯度的最终损失值。
在看这段代码的时候,我想到了一个问题:有没有一种方法可以计算输出层相对于相应损失的梯度,即计算第一个n
的梯度基于演员损失的输出节点和使用批评家损失的最后一个输出节点的梯度?根据我的理解,这比添加损失(不同!)和基于这种累积方法更新梯度要方便得多。你同意吗?
好吧,经过一番研究,我自己找到了答案:可以根据层名称提取给定层的可训练变量。然后我们可以将 tape.gradient
和 optimizer.apply_gradients
应用于提取的可训练变量集。我目前的解决方案很慢,但它有效。我只需要弄清楚如何改进它的运行时间。
对于初学者:这个问题不寻求关于强化学习(RL)的帮助,RL仅用作示例。
Keras 文档包含一个示例 actor-critic reinforcement learning implementation using Gradient Tape。基本上,他们创建了一个具有两个独立输出的模型:一个用于演员(n
动作),一个用于评论家(1
奖励)。以下几行描述了反向传播过程(在代码示例的某处找到):
# Backpropagation
loss_value = sum(actor_losses) + sum(critic_losses)
grads = tape.gradient(loss_value, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
尽管 actor 和 critic 损失的计算方式不同,但他们将这两个损失相加以获得用于计算梯度的最终损失值。
在看这段代码的时候,我想到了一个问题:有没有一种方法可以计算输出层相对于相应损失的梯度,即计算第一个n
的梯度基于演员损失的输出节点和使用批评家损失的最后一个输出节点的梯度?根据我的理解,这比添加损失(不同!)和基于这种累积方法更新梯度要方便得多。你同意吗?
好吧,经过一番研究,我自己找到了答案:可以根据层名称提取给定层的可训练变量。然后我们可以将 tape.gradient
和 optimizer.apply_gradients
应用于提取的可训练变量集。我目前的解决方案很慢,但它有效。我只需要弄清楚如何改进它的运行时间。