图解DQN,DDQN,DDPG网络


本文未经许可,禁止转载,如需转载请联系笔者

1. DQN

深度Q网络(Deep Q Network)适用于动作离散的强化学习任务

1.1 网络结构

深度Q网络有两个网络结构,如下所示:

在这里插入图片描述

Q网络输入是状态,输出是各种动作对应的 Q Q Q值。

如果这个 Q Q Q值越精准,就说明Q网络训练地越好。

Q网络和Target Q网络的区别是,Q网络是每步都会在经验池中更新,而Target Q网络是隔一段时间将Q的网络参数拷贝到Target Q网络中,实现Target Q网络的更新。这种“滞后”更新是为了保证在训练Q网络时训练的稳定性。

1.2 产生experience的过程

已知一个状态 s t s_t st,通过 Q网络 得到各种动作的Q值,然后用 ϵ \epsilon ϵ贪婪策略 选择动作 a t a_t at ϵ \epsilon ϵ贪婪策略是为了保证一定的探索,大概率会选择Q值最大的那个动作),然后将 a t a_t at输入到环境中,得到 s t + 1 s_{t+1} st+1 r t + 1 r_{t+1} rt+1,这样就得到一个experience: ( s t , a t , s t + 1 , r t + 1 ) (s_t, a_t, s_{t+1}, r_{t+1}) (st,at,st+1,rt+1),然后将experience放入经验池中。

在这里插入图片描述

1.3 Q网络的更新流程

从经验池中取出一批experience,这里以一个experience: ( s t , a t , s t + 1 , r t + 1 ) (s_t, a_t, s_{t+1}, r_{t+1}) (st,at,st+1,rt+1)为例讲述训练神经网络的过程。

下图假设 a t = a 1 , a t + 1 = a 2 a_t=a_1, a_{t+1}=a_2 at=a1,at+1=a2
在这里插入图片描述

其中:红色字母代表已知项。

如上图所示,首先是根据 s t s_t st a t a_t at是可以确定当前的 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)值的,即 Q ( s t , a 1 ) Q(s_t,a_1) Q(st,a1)。然后将下一状态 s t + 1 s_{t+1} st+1输入到Target Q网络中,得到各种不同的动作的Q值,接下来选择最大的Q值(注意是完全贪婪,不是 ϵ \epsilon ϵ贪婪),这里假设选择了动作 a 2 a_2 a2。最后,以 Q ( s t , a 1 ) Q(s_t,a_1) Q(st,a1)作为网络的预测值,而 r t + 1 + γ Q ( s t + 1 , a 2 ) r_{t+1} + \gamma Q(s_{t+1},a_2) rt+1+γQ(st+1,a2)作为网络的实际值,进行误差反向传播。loss函数可以选择方差等,把它当做一个有监督学习即可。

过一段时间后,将Q网络中的参数拷贝到Target Q网络中。

2. DDQN

DQN算法在深度强化学习领域取得了不俗的成绩,不过其并不能保证一直收敛,研究表明这种估计目标价值的算法过于乐观的高估了一些情况下的行为价值,导致算法会将次优行为价值一致认为最优行为价值,最终不能收敛至最佳价值函数。

一种使用双价值网络的DDQN(double deep Q network)被认为较好地解决了这个问题。

2.1 网络结构

DDQN算法的网络结构与DQN相同
在这里插入图片描述

2.2 产生experience的过程

与DQN相同

2.3 Q网络的更新流程

DDQN与DQN大部分都相同,只有一步不同,那就是在选择 Q ( s t + 1 , a t + 1 ) Q(s_{t+1},a_{t+1}) Q(st+1,at+1)的过程中,DQN总是选择Target Q网络的最大输出值。而DDQN不同,DDQN首先从Q网络中找到最大输出值的那个动作,然后再找到这个动作对应的Target Q网络的输出值。用图像表示即为:

在这里插入图片描述

其中:红色字母代表已知项。

如上图所示,首先是根据 s t s_t st a t a_t at是可以确定当前的 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)值的,这里假设为 Q ( s t , a 1 ) Q(s_t,a_1) Q(st,a1)。然后将下一状态 s t + 1 s_{t+1} st+1输入到 Q网络 中,得到各种不同的动作的Q值,接下来选择最大的Q值对应的动作(注意是完全贪婪,不是 ϵ \epsilon ϵ贪婪),这里假设选择了动作 a 1 a_1 a1。接着将状态 s t + 1 s_{t+1} st+1输入到 Target Q网络 中,找到动作 a 1 a_1 a1对应的 Q Q Q Q ( s t + 1 , a 1 ) Q(s_{t+1},a_1) Q(st+1,a1)。最后,以 Q ( s t , a 1 ) Q(s_t,a_1) Q(st,a1)作为网络的预测值,而 r t + 1 + γ Q ( s t + 1 , a 1 ) r_{t+1} + \gamma Q(s_{t+1},a_1) rt+1+γQ(st+1,a1)作为网络的实际值,进行误差反向传播。loss函数可以选择方差等,把它当做一个有监督学习即可。

过一段时间后,将Q网络中的参数拷贝到Target Q网络中。

3. DDPG

3.1 网络结构

深度确定性策略梯度(deep deterministic policy gradient,DDPG)算法的主要网络结构为以下四个:
在这里插入图片描述
Actor网络输入是状态,输出是动作。Critic网络输入是状态和动作,输出是对应的Q值。

Actor网络的目的是根据状态 s t s_t st,能够输出使得 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)最大的动作 a t a_t at,这个 a t a_t at越能使 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)大,就说明网络训练地越好。

Critic网络的目的是根据状态动作对 ( s t , a t ) (s_t,a_t) (st,at)能够输出其action value Q ( s t , a t ) Q(s_t,a_t) Q(st,at),这个 Q Q Q值越精确,就说明网络训练地越好。

Actor网络和Target Actor网络的区别是,Actor网络是每步都会在经验池中更新,而Target Actor网络是隔一段时间将Actor的网络参数拷贝到Target Actor网络中,实现Target Actor网络的更新。这种“滞后”更新是为了保证在训练Actor网络时训练的稳定性。Critic网络和Target Critic网络也是一样。

3.2 产生experience的过程

已知一个状态 s 0 s_0 s0,通过 actor网络 得到动作 a 0 ′ a'_0 a0,然后再加噪声 N N N得到动作 a 0 = a 0 ′ + N a_0=a'_0+N a0=a0+N(噪声是为了保证一定的探索),然后将 a 0 a_0 a0输入到环境中,得到 s 1 s_1 s1 r 1 r_1 r1,这样就得到一个experience: ( s 0 , a 0 , s 1 , r 1 ) (s_0, a_0, s_1, r_1) (s0,a0,s1,r1),然后将experience放入经验池中。

经验池 存在的意义是为了消除experience的相关性,因为强化学习中前后动作通常是强相关的,而将它们打散,放入经验池中,然后在训练神经网络时,随机地从经验池中选出一批experience,这样能够使神经网络训练地更好。
在这里插入图片描述

3.3 Actor网络的更新流程

从经验池中取出一批experience,这里以一个experience: ( s 0 , a 0 , s 1 , r 1 ) (s_0, a_0, s_1, r_1) (s0,a0,s1,r1)为例讲述训练神经网络的过程。

在这里插入图片描述
其中:红色字母代表已知项。

结合3.1中对Actor网络的描述可知,Actor网络的loss函数就是-Q,-Q越小越好。这个-Q需要由Critic网络得到,如上图所示。

将experience中的 s 0 s_0 s0输入到Actor网络中,得到预测的动作 a 0 _ p r e d i c t a_{0\_predict} a0_predict,这里不加噪声了,直接将 s 0 s_0 s0 a 0 _ p r e d i c t a_{0\_predict} a0_predict输入到Critic网络中,得到Q值,然后将-Q作为loss函数,修正Actor网络。

python代码示意如下:

        pred_a0 = self.actor.forward(s0) # 直接使用a0会不收敛
        #反向梯度下降(梯度上升),以某状态的价值估计为策略目标函数
        loss_actor = -1 * torch.sum(self.critic.forward(s0, pred_a0))
        self.actor_optimizer.zero_grad()
        loss_actor.backward()
        self.actor_optimizer.step()

3.4 Critic网络的更新流程

接着上述experience: ( s 0 , a 0 , s 1 , r 1 ) (s_0, a_0, s_1, r_1) (s0,a0,s1,r1)为例讲述训练Critic网络的过程

在这里插入图片描述

其中:红色字母代表已知项。

结合3.1中对Critic网络的描述可知,Critic网络需要使预测的Q值越精确越好,因此它loss函数就是Critic网络的输出值 Q ( s 0 , a 0 ) Q(s_0,a_0) Q(s0,a0)(被认为是预测值)与下一步Target Critic网络的输出值和奖励的和 r 1 + γ Q ( s 1 , a 1 ) r_1+\gamma Q(s_1,a_1) r1+γQ(s1,a1)(被认为是实际值)之间的差异,差异越小越好,这种差异可以用方差,或者一些其他的pytorch自带的loss函数。整个过程如上图所示。

python代码示意如下:

        a1 = self.target_actor.forward(s1).detach()
        next_val = torch.squeeze(self.target_critic.forward(s1, a1).detach())
        # y_exp = r + gamma*Q'( s2, pi'(s2))
        y_expected = r1 + self.gamma * next_val
        y_expected = y_expected.type(torch.FloatTensor)
        # y_pred = Q( s1, a1)
        a0 = torch.from_numpy(a0) # 转换成Tensor
        y_predicted = torch.squeeze(self.critic.forward(s0, a0))
        # compute critic loss, and update the critic
        loss_critic = F.smooth_l1_loss(y_predicted, y_expected)
        self.critic_optimizer.zero_grad()
        loss_critic.backward()
        self.critic_optimizer.step()
  • 41
    点赞
  • 233
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值