DRL---------------Actor-Critic/DDPG

从名字就可以看出其是PG(关于什么是PG,可以参看https://blog.csdn.net/weixin_42001089/article/details/81478628)的升级版

首先说一下Actor-Critic(AC),之前所说的PG是在一个游戏回合结束之后才更新PG中DL的网络参数的。而AC主要就是看不惯这一点,他就是要改变这一现状,即实现单步更新的壮举。还有一点就是输出的不再是一些列动作的概率,而是一个动作,本质上这个动作值还是连续的,只不过我们不要什么概率了,直接就输出我们要的动作就行了,比如我们输出的旋转角度,这里直接告诉我们是多少度就可以了,这叫做deterministic policy gradient

####################################################################################################

Actor神经网络

输入是S(状态)输出为一个动作:

cell=20
init_w = tf.random_normal_initializer(0., 0.3)
init_b = tf.constant_initializer(0.1)

net = tf.layers.dense(s, cell, activation=tf.nn.relu,kernel_initializer=init_w, bias_initializer=init_b, name='l1')
          
actions = tf.layers.dense(net, a_dim, activation=tf.nn.tanh, kernel_initializer=init_w,bias_initializer=init_b, name='a')

scaled_a = tf.multiply(actions, self.action_bound, name='scaled_a')  
   

最后一步就是为了将动作值规范到一定范围内,最主要的就是actions那一步,可以看出其是选取了一个动作,就是deterministic policy gradient( a_dim就是代表一个动作需要的维数,通常就是一维)

(1)首先要明确优化的目标就是:

J(\theta ^{\mu })= E_{\theta ^{\mu }}[r_{1},\gamma r_{2},\gamma^{2} r_{3},\cdots ]

其中\theta ^{\mu }就是Actor神经网络的参数:a=\pi (S|\theta ^{\mu })即根据状态S,通过参数为\theta ^{\mu }的神经网络后得到下一步的行动为a

对应的Critic的神经网络参数为\theta ^{Q}    :   value=Q(S,a|\theta ^{Q})即根据状态和动作得出该步走得好与坏。

所以Actor神经网络梯度为:

\frac{\partial J(\theta ^{\mu })}{\partial \theta ^{\mu }}=E_{S}[\frac{\partial Q(S,a|\theta ^{Q})}{\partial \theta ^{\mu }}]=E_{S}[\frac{\partial Q(S,\pi (S|\theta ^{\mu })|\theta ^{Q})}{\partial \theta ^{\mu }}]=E_{S}[\frac{\partial Q(S,\pi (S|\theta ^{\mu })|\theta ^{Q})}{\partial\pi (S|\theta ^{\mu }) }\frac{\partial \pi (S|\theta ^{\mu })}{\partial \theta ^{\mu }}]

可以将上面简写为:,\frac{\partial J(\theta ^{\mu })}{\partial \theta ^{\mu }}=E_{s}[\frac{\partial Q}{\partial a}\times \frac{\partial \mu }{\partial \theta ^{\mu }}]

可以看到\frac{\partial \mu }{\partial \theta ^{\mu }}本身就是Actor神经网络的参数梯度,但是在训练的时候,还要乘以\frac{\partial Q}{\partial a},它来自于Critic网络,所以在tensorflow中大概就是这样:

params = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='Actor')

policy_grads = tf.gradients(ys=a, xs=params, grad_ys=Q_a_grads)

a就是Actor网络的输出,params就是该网络的参数,Q_a_grads就是\frac{\partial Q}{\partial a}

然后Actor训练的就是:

opt = tf.train.AdamOptimizer(lr)  
train_op = opt.apply_gradients(zip(policy_grads, e_params))

注意:

(2)这里采取的是deterministic policy gradient,如果按传统的神经网络输出采用的是一些列动作的概率值,那么这里就要像上一篇介绍的PG那样,输出先log后,Vt变成TD-error来实现单步更新,TD-error也是来自于Critic网络,其定义就是:

TD-error=r+\lambda Q(S'|\theta ^{Q})-Q(S|\theta ^{Q})

就是说该模式下Actor神经网络和上节讲的PG一模一样,只不过将vt换成了来自Critic的TD-error

所以这里小结一下:如果采用deterministic policy gradient,则按(1)来,否则按(2)来。二者都需要来自Critic的一个控制信号来概述Actor该步走的到底怎么样?是好是坏?只不过(1)传过来的是\frac{\partial Q}{\partial a},(2)传过来的是TD-error

#################################################################################################

Critic神经网络

先来看一下如果是(2)模式下时:

其网络的输入(s)和输出(q值)就是:


            l1 = tf.layers.dense(
                inputs=s,
                units=20,  
                activation=tf.nn.relu,
                kernel_initializer=tf.random_normal_initializer(0., .1),  
                bias_initializer=tf.constant_initializer(0.1),  
                name='l1'
            )

             v = tf.layers.dense(
                inputs=l1,
                units=1,  
                activation=None,
                kernel_initializer=tf.random_normal_initializer(0., .1),  
                bias_initializer=tf.constant_initializer(0.1), 
                name='V'
            )

TD-error就是:

td_error = self.r + GAMMA * s'_q - s_q

s'_q 和 s_q就是通过上述神经网络的得到的输出值(q值,也就是上面提到的value)

该网络的loss实质上也是TD-error:

loss = tf.square(self.td_error)

所以Critic神经网络做的事情就是

一:通过Loss优化本网络

二:将TD-error传给Actor神经网络(因为Actor神经网络优化自身参数时需要TD-error)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面看一下如果是(1)这样模式

其网络就是类似DQN了,即输入的是a(行动)和s(状态值)输出的是Q值

cel1 = 30
w1_s = tf.get_variable('w1_s', [s_dim, cel1], initializer=init_w, trainable=trainable)
w1_a = tf.get_variable('w1_a', [a_dim, cel1], initializer=init_w, trainable=trainable)
b1 = tf.get_variable('b1', [1, cel1], initializer=init_b, trainable=trainable)
net = tf.nn.relu(tf.matmul(s, w1_s) + tf.matmul(a, w1_a) + b1)
q = tf.layers.dense(net, 1, kernel_initializer=init_w, bias_initializer=init_b, trainable=trainable)   

这里的最后的q就是我们一开始value=Q(S,a|\theta ^{Q})中的value。

这里相较于(1)就是多考虑了行动值a,

首先Loss部分基本还是和上面一样,

target_q = R + self.gamma * s'_q
loss = tf.reduce_mean(tf.squared_difference(target_q, s_q))

\frac{\partial Q}{\partial a}即为:

Q_a_grads = tf.gradients(q, a)[0] 

所以Critic神经网络做的事情就是

一:通过Loss优化本网络

二:将\frac{\partial Q}{\partial a}(Q_a_grads )传给Actor神经网络(因为Actor神经网络优化自身参数时需要\frac{\partial Q}{\partial a}

####################################################################################################

以上就是Actor-Critic的全部内容,最后归结一下其工作过程:

一:Actor神经网络首先选出一个动作

二:Critic神经网络评判该动作的好坏

三:Actor神经网络训练是过程根据Critic神经网络评判的结果做出这样一个动作:如果该行为的方向是好的(Q值较大/value         较大),那 么就想该方向大步前进,否则减少前进的脚步!!!!!!

这里Critic神经网络的训练为了使自己得到的拟合函数不断的变好,从而使自己对行动好坏的评价更权威!!!!!!

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

说完了Actor-Critic,我们再来说最后的大佬DDPG,其实际上是借鉴了Q_learning在泛化到DQN的过程中冻结了Target的思想,在Actor-Critic基础框架上改进成了DDPG,其中DDPG的第一个字母是Deep,采用冻结Target的思想可以减少相关性,使得网络走向更深,解决很复杂的问题。

什么意思呢?实际上就是将AC中的A变成两个网络A_Net1,A_Net2,A_Net1为实时更新,一A_Net2是每隔一段时间从A_Net1中更新而来,C中一样有两个网络,是不是很眼熟?对的,它的作用就是DQN中那两个神经网络的作用。

需要变动地方的有以下:

在(2)模式下

在Critic中s'_q的计算。需要传入的S‘和a中a的由来是A_Net2传过来的,然后将二者一起传入到C_Net2得到s'_q,s_q的得来就是将s和a一起传入C_Net1得到的,这里的a还是和上面Actor-Critic介绍的一样从A_Net1拿过来的,所以DDPG最大的改进就是这样:

给Actor和Critic网络都多加了一个Net2(有时候叫做Target),然后Critic 的Net2作用就是类似DQN中的冻结Target,Actor的Net2的作用就是给Critic 的Net2传入动作值。

用一个框架表示就是:

左边红框是AC中的A,右边红框是C。

首先进行黄色部分,待达到Memory的最大容量时开始训练2DDPG模型(就是那两个红框下的四个神经网络)即天蓝色部分开始,然后每隔一段时间用A_vel更新A_Target 用C_vel更新C_Target即可。

多说一句:要是和原始的Actor-Critic做比较就是没有上图中的A_Target和C_Target,q_s和q_s'的产生均用C_vel网络,如果采用模式(1),那么C_vel的输入可以不要a,直接根据q_s和q_s'输出相应的Q值再和r一起考虑算出TD-error代替图上的Q_a_grads传入到A即可,当然这种显然不好!

猜你喜欢

转载自blog.csdn.net/weixin_42001089/article/details/81501871
今日推荐