DDPG 的 actor nn 中的损失乘以否定梯度

数据挖掘 政策梯度 演员评论家
2022-02-23 23:24:34

在我一直在逐行梳理以了解实现的 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 就会实现动作从评论家传递给演员。

DPG的解释

我认为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

1个回答

这个答案不是我的,而是我在 Quora 上收到的回复: https ://www.quora.com/Why-is-the-loss-for-DDPG-Actor-the-product-of-gradients-of-Q-价值观-行动/答案/James-MacGlashan?过滤器=& nsrc =2& snid3 =4129828389

希望它可以帮助某人而不是我只是删除问题,我很抱歉我缺乏数学 jax 知识。

让我们暂时忘记 DDPG、Q 函数、演员和动作。我知道,知道,亵渎神明,但请容忍我一会儿,我们会回到那个。

让我们来谈谈损失函数。我们都擅长损失函数,对吧?它们是我们标准监督深度学习文献的支柱。也就是说,在监督学习中,我们所做的是定义一个损失函数,它定义了一个预测与它应该是什么相比有多糟糕。

作为一个基础示例,让我们重新审视用于回归问题的 L2 损失。我们将此损失定义为:

L 2 ( p , l

)

1 2 ( p - l ) 2

其中 p 是我们神经网络的预测,l 是“标签”:预测应该是的值。如果我们可以调整我们的神经网络参数,使这种损失始终为零,我们就赢了!换句话说,我们想要最小化这个损失函数。

我们如何最小化它?这些天的标准方法是使用一些随机梯度下降(SGD)。为此,我们要做的是根据我们的神经网络参数 w 来区分我们的损失。如果我们使用香草 SGD,我们会这样做:

w t +

1

w t - α ∇ w L 2

好的,但这里有一个问题,我们的损失函数是根据 p 而不是 w 。然而,我们将我们的神经网络预测描述为一些输入和神经网络参数 w: p ( x , w ) 的函数,我们知道如何计算 ∇ w p 。既然我们知道这一点,我们可以使用微分的链式法则,它说:

∇ w L

2

∇ w p ∇ p L 2

因为 w 是一个向量,所以 ∇ w p 将指代它的(转置的)雅可比矩阵。

在我们现代深度学习库的时代,您通常不会自己这样做。相反,您的库将使用 autograd/backpropagation 算法为您计算 ∇ w L 2 ,它会通过与我们上面所做的略有不同的分解来完成它。

尽管现代 autograd 库的处理方式会略有不同,但重要的是要看到我们可以用这种方式用神经网络参数来表达我们的损失梯度。

回到演员评论家

好的,现在我们已经刷新了关于损失函数的记忆以及将链式规则应用于损失函数的样子,让我们回到 Actor Critic 和 DDPG。

让我们问问自己:我们真正希望演员评论家做什么?

假设有人将某些政策的实际 Q 值交给您。您如何改进该政策?很简单:通过制定一项新策略来选择最大化您所获得的 Q 值的操作。这是强化学习的基础。这就是为什么在 Q 学习中,您将策略设置为贪婪地选择具有最大 Q 值的动作(并且可能出于探索原因添加一些噪音)。

好的,假设我有一个 Q 函数:如果动作是连续的,我如何找到最大化 Q 函数的策略?我不能通过简单地评估每个动作并选择最大值来做 Q-learning 所做的事情,因为要评估的动作数量是无限的!

不过等一下。我们知道如何在连续值上最大化函数。我们在监督学习中已经做了很多年了!请注意,最大化函数与最小化该函数的负值相同。那是:

参数最大 x f ( x

)

参数最小值 x - f ( x )

好的很酷,所以如果我想最大化某个函数,我可以在该函数的负值上使用常规 SGD。

由此,我们现在有了一个见解:如果我们将 - Q ( s , a ) 视为损失函数,其中动作 a 是来自某个神经网络的“预测”:演员。在这种情况下,我们可以使用良好的 SGD 来训练我们的参与者选择最大化 Q 值的动作。

这样做当然需要我们有一个可以区分的 Q 表示。但是如果我们同时训练一个神经网络来估计 Q,并且我们相信它的估计是好的**,那么我们可以很容易地将它用作我们演员的“损失”函数!

事实上,如果 -Q 是我们的损失函数,并且动作 a 充当我们来自神经网络参与者模型 μ 的“预测”,那么让我们将其替换回链式规则表达式,以替换我们之前编写的并且我们熟悉的损失函数:

∇ w -

∇ w μ ∇ a - Q

它就在那里!

(您可能会注意到 DDPG 论文将上述乘法的顺序颠倒了。顺序实际上仅取决于论文采用梯度和雅可比矩阵表示的约定。如果您回到最初的确定性策略梯度论文,您'会看到他们像我们上面那样写出来。)

那么为什么 DDPG 不像我们使用损失函数那样在 -Q 上使用 autograd 呢?

好的,所以现在你可能会问自己:

为什么论文不直接说“在 -Q 上使用 autograd”???

毕竟,在监督学习论文中,我们从来没有用那种方式写出链式规则,我们只是假设从业者有一个 autograd 库并且只写损失的前向版本。

原因是如果你不小心,运行纯 autograd 会烧死你!

在 DDPG 中,回想一下我们正在训练两个神经网络:Q 和 μ。如果您只是将 μ 输入 Q 并运行 autograd,除了 μ 上的参数之外,它将在 Q 的参数上产生梯度!但是在优化actor的时候,我们并不想改变Q函数!事实上,如果我们这样做了,那么通过让 Q 总是输出巨大的值来让任何 Actor 最大化 Q 真的很容易!

通过 Q 运行 autograd 就像让监督学习算法改变标签的值,这显然是不对的!

你也不能简单地在 Q 上“阻止渐变”,因为这样就没有渐变会流回actor。

因此,您只需确保将链式法则通过 Q 应用到 μ ,而无需调整 Q 的任何参数。一种方法是手动计算每个参数的梯度并将它们相乘,如论文中所述.

在 autograd 库中也有其他方法可以做到这一点,但现在您开始真正了解您正在使用哪个库。所以对于一篇学术论文,最好简单地写出应该为演员计算什么梯度,然后让从业者在他们选择的库中决定计算它的最佳方法。

** 神经网络对 Q 函数的估计良好的假设非常重要。因为它是一个估计,所以它会有错误,而 DDPG 算法的一个限制是你的参与者将利用你的神经网络对 Q 的估计中存在的任何错误。因此,找到确保 Q 估计良好的方法非常重要工作领域。