深度强化学习总结(DQN,DDQN,Actor-Critic,DDPG)

学习强化学习总结的笔记,按照自己的理解总结的,还没总结完,边学边总结,可能存在错误欢迎指正

Deep Q Network(DQN)

DQN存在两个神经网络,即
(1) Action_Net:用于DQN选择动作a(输出为每个动作的Q值,然后选取最大Q值对应的动作。即输出后过softmax)。通过反向传播对权重进行更新。
输入维度:(状态数量,1)
输出维度:(动作数量,1)
(2)Target_Net:用于估计Q值以更新模型参数。参数更新的方式为每 X步用Action_Net 对Target_Net 进行覆盖。
输入维度:(状态数量,1)
输出维度:(动作数量,1)

DQN总流程图

Created with Raphaël 2.3.0 初始化状态S Action_Net根据状态S输出 所有动作的Q值,然后选取Q值 最大的动作a 执行动作a与环境交互, 得到 (1)Reward; (2)下一个状态S'; (3)是否结束循环Done DQN存储记忆(S,a,R,S'), Target_Net根据状态S'输出a'对应 的Q值并计算y,然后计算loss并执 行反向传播更新Action_Net. (每C次迭代更新Target_net) Done=True? 结束 yes no

DQN的整个过程可分为两部分:使执行过程和学习过程。
首先是执行过程为Action_Net工作,即更新自身状态和储存样本。
然后是学习过程为Target_Net工作,即从经验池中抽取小批量数据然后进行更新模型参数。
上述两个过程一般在编写代码时主要在主函数main中体现。即先调用模型的动作选择函数model.choose_action(),然后在调用模型的学习函数model.learn().
【注】:执行过程中仅Action_Net参与,而学习过程中Action_Net和Target_Net均参与。
执行过程(Action_Net):
(1)将当前状态S扔进Action_Net,输出所有动作对应的Q值( Q A Q_A QA)并选取最大Q值的动作a执行。
(2)执行动作a与环境交互,获取下一个时刻的状态 s ′ s' s和奖励 r r r
(3)储存样本( S , a , R , s ′ S,a,R,s' S,a,R,s)
学习过程(Action_Net,Target_Net):
(4)从存储记忆中抽取一个batch作为训练样本,即若干个 ( S , a , R , S ′ ) (S,a,R,S') (S,a,R,S)
(5)将 S S S扔进Action_Net获取所有动作对应的Q值( Q A Q_A QA)。
(6)将 S ′ S' S扔进Target_Net获取所有动作对应的Q值( Q T Q_T QT),然后计算 y = r + γ m a x a Q T y = r + \gamma \underset{a}{max}Q_{T} y=r+γamaxQT. 其中 γ \gamma γ表示折扣因子。
(7)定义 l o s s = ( y − Q A ) 2 loss = (y-Q_{A})^2 loss=(yQA)2,并采用梯度下降更新Action_Net。

Double DQN:

由于DQN中Target_Net输出的 m a x a Q T \underset{a}{max}Q_{T} amaxQT会产生overestimate,说白了就是Target_Net选择的动作不对导致估计的Q值不太合适。那怎么解决这个问题,很简单,Q值没估计对主要是赖在 m a x a \underset{a}{max} amax上,那既然估计的动作不合适,那直接上实际的就完事了。所以这个动作的选择直接让Action_Net来做。所以DDQN的总体与DQN大致相同,唯一的区别在于学习过程中y值的计算方式不一样。

DQN Y t D Q N = R t + 1 + γ m a x a Q ( S t + 1 , a : θ t − ) Y^{DQN}_t=R_{t+1}+ \gamma\underset{a}{max}Q(S_{t+1},a:\theta^-_t) YtDQN=Rt+1+γamaxQ(St+1,a:θt).
DQN中, y y y值的计算只与Target_Net有关。 m a x a Q ( S t + 1 , a : θ t − ) \underset{a}{max}Q(S_{t+1},a:\theta^-_t) amaxQ(St+1,a:θt)意思是Target_Net输出在状态 S ′ S' S下所有动作对应的Q值,然后看哪个动作对应的Q值最大,把该Q值选出来计算y.

Doube DQN Y t D o u b l e D Q N = R t + 1 + γ Q ( S t + 1 , a r g m a x a Q ( S t + 1 , a : θ t ) ; θ t − ) Y^{DoubleDQN}_t=R_{t+1}+ \gamma Q(S_{t+1}, \underset{a}{argmax}Q(S_{t+1},a:\theta_t);\theta^-_t) YtDoubleDQN=Rt+1+γQ(St+1,aargmaxQ(St+1,a:θt);θt).
DDQN中, y y y值的计算与Target_Net和Action_Net均有关。即首先将状态 S ′ S' S扔进Action_Net把动作a给定死了。然后把状态 S ′ S' S扔进Target_Net出所有动作的Q值,然后直接把动作a的Q值拿去计算y(DDQN中,Target_Net的输出中即使动作a对应的Q值不是最大的,但仍然拿去计算y)。
DDQN学习过程(Action_Net,Target_Net):
(1)从存储记忆中抽取一个batch作为训练样本,即若干个 ( S , a , R , S ′ ) (S,a,R,S') (S,a,R,S)
(2)将 S S S扔进Action_Net获取所有动作对应的Q值( Q A Q_A QA)。
(3)将 S ′ S' S扔进Action_Net根据输出的Q值确定动作 a a a
(4)将 S ′ S' S扔进Target_Net获取所有动作对应的Q值( Q T Q_T QT),然后挑选出动作 a a a对应的Q值( Q T a Q^{a}_T QTa
(5)然后计算 y = r + γ Q T a y = r + \gamma Q^{a}_{T} y=r+γQTa. 其中 γ \gamma γ表示折扣因子。
(6)定义 l o s s = ( y − Q A ) 2 loss = (y-Q_{A})^2 loss=(yQA)2,并采用梯度下降更新Action_Net。
【注】: θ − \theta^{-} θ表示Target_Net, θ \theta θ表示Action_Net.

Actor-Critic

策略梯度是每个episode返回一个reward,因此存在以下三个问题:
① 由于agent在一个episode中会采取很多动作,我们很难说哪个动作对最后结果是有用的,换句话说,这种算法存在高方差(variance);
② 收敛速度慢;
③ 只在这种episodic环境下能用。
为了解决上述问题,于是提出了Actor-Critic算法。这种算法就是通过引入一种评价机制来解决高方差的问题。即 AC = Q-learning + policy gradient

Actor的前生是 Policy Gradients, 负责在连续动作中选取合适的动作并从环境中获取反馈(即 R e w a r d e n v Reward_{env} Rewardenv),;Critic的前生是 Q-learning 或者其他的以值为基础的学习法 , 负责对Actor进行评价(即 R e w a r d c r i Reward_{cri} Rewardcri), 通过对比 R e w a r d e n v Reward_{env} Rewardenv R e w a r d c r i Reward_{cri} Rewardcri,来对Critic进行更新。

算法流程:

1、选取初始状态 S t S_t St
2、Actor根据状态 S t S_t St选取动作 a t a_t at, 取得状态 S t + 1 S_{t+1} St+1 R e w a r d e n v Reward_{env} Rewardenv
3、Critic评价状态 S t + 1 S_{t+1} St+1
4、计算TD_error: ;
5、根据TD_error更新Critic;

【注】:Actor的输入为 S t S_t St,输出为 a t a_t at
      Critic的输入为 S t + 1 S_{t+1} St+1,输出为 R e w a r d c r i Reward_{cri} Rewardcri

Actor-Critic方法的优势:可以单步更新,但比传统的 Policy Gradient要快
Actor-Critic方法的劣势:取决于Critic的价值判断,但是Critic难收敛,再加上Actor的更新,就更难收敛。为了解决收敛问题,提出了Deep Deterministic Policy Gradient(DDPG)

Deep Deterministic Policy Gradient(DDPG)

DDPG分为Actor和Critic两部分,且每部分内均含有执行和target两个网络:即Actor( θ μ \theta_\mu θμ)、Actor_Targe( θ μ ′ \theta^{\mu'} θμ)、Critic( θ Q \theta^Q θQ)、Critic_Target( θ Q ′ \theta^{Q'} θQ

Actor需要输出连续的动作值,故Actor的更新采用policy gradient;Critic用于估计Q值,故采用对loss进行反向传播更新模型参数。与DQN一样,Target网络的权重通过执行网络覆盖来进行更新。

一句话概括 DDPG: 一种使用 Actor Critic 结构, 但是输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测. 即 DDPG = Actor-Critic + DQN,提高了 Actor Critic 的稳定性和收敛性。
在这里插入图片描述
(图片源于https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/DDPG/)

Actor采用Policy Gradient
动作估计网络(Actor):用来输出实时的动作, 供 actor 在现实中实行.
动作现实网络(Actor_Target):用来更新价值网络系统的

Critic采用Value-Based
状态现实网络(Critic):输入(动作现实网络来的动作 + 状态的观测值)计算TD_error
状态估计网络(Critic_Target):拿着当时 Actor 施加的动作当做输入

模型更新:

Actor
∇ θ μ ≈ 1 N ∑ i ∇ a Q ( s , a ∣ θ Q ) ∣ s = s i , a = μ ( s i ) ∇ θ μ μ ( s ∣ θ μ ) ∣ s i \nabla_{\theta^\mu}\approx \frac{1}{N}\sum_{i}\nabla_aQ(s,a|\theta^Q)|_{s=s_i,a=\mu(s_i)} \nabla_{\theta^\mu}\mu(s|\theta^\mu)|_{s_i} θμN1iaQ(s,aθQ)s=si,a=μ(si)θμμ(sθμ)si
1 N ∑ i ∇ a Q ( s , a ∣ θ Q ) ∣ s = s i , a = μ ( s i ) \frac{1}{N}\sum_{i}\nabla_aQ(s,a|\theta^Q)|_{s=s_i,a=\mu(s_i)} N1iaQ(s,aθQ)s=si,a=μ(si)(From Critic):这次 Actor 的动作要怎么移动, 才能获得更大的 Q.
∇ θ μ μ ( s ∣ θ μ ) ∣ s i \nabla_{\theta^\mu}\mu(s|\theta^\mu)|_{s_i} θμμ(sθμ)si(From Actor):Actor 要怎么样修改自身参数, 使得 Actor 更有可能做这个动作.

Critic
y i = r i + γ Q ′ ( s i + 1 , μ ′ ( s i + 1 ∣ θ μ ′ ) ∣ θ Q ′ ) l o s s : L = 1 N ∑ i ( y i − Q ( s i , a i ∣ θ Q ) ) 2 y_i=r_i+\gamma Q'(s_{i+1},\mu ' (s_{i+1}|\theta^{\mu'})|\theta^{Q'}) \\ loss:L=\frac{1}{N}\sum_i(y_i-Q(s_i,a_i|\theta^Q))^2 yi=ri+γQ(si+1,μ(si+1θμ)θQ)loss:L=N1i(yiQ(si,aiθQ))2

上面这个是关于 Critic 的更新, 它借鉴了 DQN 和 Double Q learning 的方式, 有两个计算 Q 的神经网络, Q_target 中依据下一状态, 用 Actor 来选择动作, 而这时的 Actor 也是一个 Actor_target (有着 Actor 很久之前的参数). 使用这种方法获得的 Q_target 能像 DQN 那样切断相关性, 提高收敛性.

算法流程:

在这里插入图片描述

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DQN算法是一种基于Q-learning的深度强化学习算法,其目标是学习一个Q函数,使得该函数能够最大化累积奖励。DDQN算法是对DQN算法的改进,通过解决DQN算法中过高估计Q值的问题,提高了算法的性能。Dueling DQN算法则是在DDQN算法的基础上,提出了一种新的神经网络结构,使得算法的学习效率更高。 下面是DQN算法的公式推导分析: 1. Q-learning的更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a) - Q(s_t,a_t))$ 2. DQN算法使用了深度神经网络来逼近Q函数,将更新公式改为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma \max_{a} Q(s_{t+1},a; \theta^-) - Q(s_t,a_t; \theta))$,其中$\theta$为当前网络的参数,$\theta^-$为目标网络的参数,$\max_{a} Q(s_{t+1},a; \theta^-)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值。 3. DDQN算法DQN算法的基础上,使用了双网络结构,解决了DQN算法中过高估计Q值的问题。更新公式为:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha(r_{t+1} + \gamma Q(s_{t+1},\arg\max_{a} Q(s_{t+1},a; \theta); \theta^-) - Q(s_t,a_t; \theta))$,其中$\arg\max_{a} Q(s_{t+1},a; \theta)$表示在下一个状态$s_{t+1}$中,选择动作$a$所得到的最大Q值对应的动作。 4. Dueling DQN算法DDQN算法的基础上,提出了一种新的神经网络结构,使得算法的学习效率更高。具体来说,Dueling DQN算法的输出包括两个分支,分别是该状态的状态价值V(标量)和每个动作的优势值A(与动作空间同维度的向量)。网络结构如下图所示: [Dueling DQN网络结构](https://img-blog.csdn.net/20170727145756345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnhpYW9fYmFpZHUx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 更新公式为:$Q(s_t,a_t) \leftarrow V(s_t) + (A(s_t,a_t) - \frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a))$,其中$V(s_t)$表示状态$s_t$的价值,$A(s_t,a_t)$表示在状态$s_t$下选择动作$a_t$的优势值,$\frac{1}{|\mathcal{A}|} \sum_{a} A(s_t,a)$表示所有动作的平均优势值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值