最近看了莫烦python的DDPG-update2,这个代码很经典,本人新手读了很久才读懂记录一下。
DDPG的核心是Actor-Critic算法,相当于是后者的升级版。顾名思义,Actor就是用来决策的神经网络,Critic就是用来对Actor的行动进行评分的,因此,在更新神经网络的参数时,Actor靠的是给出的行动在Critic上的得分来更新的
self.a = self._build_a(self.S,)
# Actor神经网络根据状态S,给出决策
q = self._build_c(self.S, self.a, )
# Critic神经网络根据状态S和决策a,给出评分q
a_loss = - tf.reduce_mean(q)
# 这个函数就是求平均值,注意负号
self.atrain = tf.train.AdamOptimizer(LR_A).minimize(a_loss, var_list=a_params)
# 训练Actor神经网络使得a_loss最大
和Actor-Critic算法不同的是,DDPG和DQN一样,Actor和Critic都有两套神经网络:估计神经网络和现实神经网络,上面提到的都是估计神经网络,在代码中,占主导作用的是估计神经网络,现实神经网络是可以通过估计神经网络进行软更新实现
ema = tf.train.ExponentialMovingAverage(decay=1 - TAU)
def ema_getter(getter, name, *args, **kwargs):
return ema.average(getter(name, *args, **kwargs))
target_update = [ema.apply(a_params), ema.apply(c_params)]
这个什么功能可以看(4条消息) Tensorflow中tf.train.ExponentialMovingAverage()函数_冯爽朗的博客-CSDN博客
至于Critic网络怎么更新的呢?就是用的这个现实网络和估计网络之间的差异来更新的:
a_ = self._build_a(self.S_, reuse=True, custom_getter=ema_getter)
q_ = self._build_c(self.S_, a_, reuse=True, custom_getter=ema_getter)
# 用两个现实网络算出现实的决策和q
q_target = self.R + GAMMA * q_
# R是达到目标时的奖励,这个就是相当于DQN里面的Q现实,可以就想为一个得分而已
td_error = tf.losses.mean_squared_error(labels=q_target, predictions=q)
# 估计和现实得分差异的平方,再求平均
self.ctrain = tf.train.AdamOptimizer(LR_C).minimize(td_error, var_list=c_params)
# 训练