在深度确定性策略梯度 (DDPG) 算法中计算 Actor 梯度更新

机器算法验证 机器学习 神经网络 深度学习 强化学习
2022-03-24 17:03:47

这个问题是关于 DDPG 的 Deepmind 论文:https ://arxiv.org/pdf/1509.02971v5.pdf 。

我见过的大多数(全部?)DDPG 算法的实现通过以下方式计算对参与者网络的梯度更新(J)=μ(s|θ)(Q(s,μ(s|θ))θ(μ(s|θ)), 在哪里θ表示actor网络的参数,μ代表演员网络,Q代表评论家网络,并且s表示状态输入。我将把这个等式称为 1。

如论文所示,方程式 1 是通过将链式法则应用于(J)=θ(Q(s,μ(s|θ)). 这给μ(s|θ)(Q(s,μ(s|θ))θ(μ(s|θ)).

我的问题是,使用自动梯度软件包(Theano/Tensorflow/Torch/etc),我有什么理由不能只计算输出的梯度Qθ直接地?出于某种原因,所有实现似乎都首先计算输出的梯度Qμ(s)然后乘以梯度μ(s)写给θ,根据链式法则。我不明白他们为什么这样做——为什么不直接计算梯度Qθ反而?你有理由不能这样做吗?即,为什么大多数更新似乎都这样做:

Q_grad = gradients( Q(s, mu(s|theta)), mu(s|theta) )
mu_grad = gradients( mu(s|theta), theta )
J_grad = Q_grad * mu_grad

而不是这个:

J_grad = gradients( Q(s, mu(s|theta)), theta )

“梯度”的第一个输入是您要区分的功能,第二个输入是您要区分的功能。

说清楚,我看不出为什么(J)=θ(Q)是与等式 1 不同的更新,因为等式 1 是通过将链式法则应用于θ(Q),但我想确保我不会错过某种微妙之处。

3个回答

计算上没有区别。我想知道同样的事情,并在我自己的 TensorFlow DDPG 实现中通过尝试两者并断言数值相同来验证。正如预期的那样,他们是。

我注意到大多数类似教程的实现(例如Patrick Emami's)都明确显示了乘法。然而,OpenAI 的基线实现 does直接计算θμQ. (他们通过在参与者网络上定义一个损失来做到这一点,等于θμQ,在批次中平均)。

你想分开的原因之一aQθμμ并将它们相乘。这是如果您想直接操纵其中一个术语。例如,Hausknecht 和 StoneaQ强制行动以保持在环境的范围内。

这样您就可以定义两个独立的网络。否则,您可能必须定义一个大型网络,并区分哪些部分属于策略,哪些属于状态-动作价值函数。

我不确定理解这两个梯度项之间的乘法..

当您使用 tensorflow 进行计算时:

J_grad = gradients( Q(s, mu(s|theta)), theta )

它应用链式规则,因此计算Q策略网络输出的mu(s|theta)梯度,然后通过策略网络反向传播这些“错误”以获得采样梯度 wrt theta(策略网络每一层的参数)。

但是,当您这样做时:

Q_grad = gradients( Q(s, mu(s|theta)), mu(s|theta) )
mu_grad = gradients( mu(s|theta), theta )
J_grad = Q_grad * mu_grad

然后在我的理解中,它(1)计算Q策略网络输出mu(s|theta)的梯度和(2)策略网络输出的梯度,mu(s|theta)策略参数theta,但这次是分开的。我不明白的是,现在,一方面你有你的第一个渐变,它是一个大小的向量,(1, action_dim)另一方面,你有你的第二个渐变,它是一个大小的向量(1, theta_dim)要应用您的更新,您需要一个渐变 wrt 到 theta ,这将是一个 size 的向量(1, theta_dim)那么第三行中的乘法到底是做什么的,它如何等效于通过策略网络反向传播第一个梯度:

J_grad = Q_grad * mu_grad

问题:

它是否只是执行一个外积创建一个形状矩阵,(action_dim, theta_dim)然后通过对维度求和来减少以获得我们的形状更新向量(1, theta)如果是这样,为什么这是有效的(相当于通过策略网络反向传播第一个梯度)?