深度强化学习(文献篇)—— 从 DQN、DDPG、NAF 到 A3C

自己第一篇 paper 就是用 MDP 解决资源优化问题,想来那时写个东西真是艰难啊。 彼时倒没想到这个数学工具,如今会这么火,还衍生了新的领域——强化学习。当然现在研究的内容已有了很大拓展。
这段时间会做个深度强化学习的专题,包括基础理论、最新文献和实践三大部分。


DRL 的核心思想是,用神经网络来表征值函数或者参数化 policy,从而使用梯度优化方法来优化损失。
本篇介绍近年来 DRL 方向的一些经典算法,并将持续更新。

DQN

DQN(Deep Q-Learning)算是 DRL 的开山之作,算是采用了 Value function approximation 的 critic-only 类算法,实现了从感知到动作的端对端学习法,由 DeepMind 在 NIPS 2013 上提出[1],后在 Nature 2015 上提出改进版本[2]。

1. Motivation

基础理论篇中介绍到,Value function approximation 可以处理连续状态空间问题,即针对函数逼近值函数: V̂(s,θ)Vπ(s) V ^ ( s , θ ) ≈ V π ( s ) Q̂(s,a,θ)Qπ(s,a) Q ^ ( s , a , θ ) ≈ Q π ( s , a ) ,构造 approximation loss,利用 SGD 优化逼近的值函数。Value function approximation 仅处理 policy evaluation(predict) 部分,policy improvement(control) 部分仍需要单独的策略。

DQN 核心思想是:

  • 利用 DL 来进行 Value function approximation 解决连续状态空间问题,称为 Q-network
  • 利用 Q-learning 来进行 RL 的学习
  • 利用 experience replay 解决数据间的相关性和非静态分布问题

基本框架为:

这里写图片描述

2. Q-network

本文提出 CNN 以输入的原始图像作为系统 state, 以拟合输出的 Q 值作为系统值函数。
注意,Q-network 不是“以 (s,a) 为输入, Q(s,a,θ) Q ( s , a , θ ) 为输出”,而是“以 s 为输入, Q(s,ai,θ) Q ( s , a i , θ ) 为输出”。

3. Q-learning

参照上篇博文可知,采用 Value function approximation,优化目标为 loss(θ)=E[(TargetQQ̂(s,a,θ))2] l o s s ( θ ) = E [ ( T a r g e t Q − Q ^ ( s , a , θ ) ) 2 ]
这里采用 Q-network,则 Q̂(s,a,θ) Q ^ ( s , a , θ ) 为 Q-network 输出。
这里采用 Q-learning,则 TargetQ 为 r(s,a,s)+λmaxaQ̂(s,a,θ) r ( s , a , s ′ ) + λ max a ′ ⁡ Q ^ ( s , a , θ )

根据上面的公式,在梯度更新时,当前值函数 Q̂(s,a,θ) Q ^ ( s , a , θ ) 和目标值函数的 maxaQ̂(s,a,θ) max a ′ ⁡ Q ^ ( s , a , θ ) 由同一个 Q-network 产生。

但这样面临一个训练难题,RL 不同 epoch 的 state 变化会导致 Q-network 产生的样本分布非静态,从而导致训练出的 policy 不稳定。15年的 DQN 版本里,为了解决数据的非静态问题,提出使用两个 Q-network:

  • 一个称为 MainNet,输出作为当前值函数,记为 Q̂(s,a,θ) Q ^ ( s , a , θ )
  • 一个称为 TargetNet,输出作为目标值函数,记为 Q̂(s,a,θ) Q ^ ( s , a , θ − )

loss(θ)=E[(r(s,a,s)+λmaxaQ̂(s,a,θ)Q̂(s,a,θ))2] l o s s ( θ ) = E [ ( r ( s , a , s ′ ) + λ max a ′ ⁡ Q ^ ( s ′ , a ′ , θ − ) − Q ^ ( s , a , θ ) ) 2 ] ,保持 TargetQ 中参数 θ θ − 固定,根据 SGD 更新 MainNet 的参数 θ θ ,每经过N轮迭代(保证 TargetQ 中参数 θ θ − 稳定),将 MainNet 的参数复制给 TargetNet。

4. Experience replay

上面两步完成了基本的 DRL,也早就有研究报道,但效果一直不理想,很大一个原因在于 RL 中数据的特点:

  • RL 产生的前后 state 数据具有相关性, 不符合 ML 基本假设(DL 要使用 SGD)
  • RL 在不同 epoch 的 state 分布可能不同,导致 state 数据具有非静态特性,使得训练不稳定

第二个问题已经靠两个 Q-network 解决了,第一个则靠 experience replay。
基本思想就是,将每个 epoch 产生的交互数据样本 (st,at,st+1,rt) ( s t , a t , s t + 1 , r t ) 都存储到 replay memory,当训练时再从中随机采样 mini-batch 进行训练,相当于对连续 epoch 进行了碎片化处理,随机采样以避免数据样本的相关性。

5. Conclusion

完整算法如下:
这里写图片描述

缺陷:

  • 无法处理连续 action 空间问题
  • CNN 没法处理长时记忆问题

Double-DQN & Dualing-DQN

Double-DQN 和 Dualing-DQN 都是 DQN 的改进版本,前者对训练算法进行了改进,后者对模型结构进行了改进。

1. Double-DQN

1.1 Motivation

DQN 使用的 Q-learning 存在一个固有的缺陷 —— 过估计 Q 值 —— 即估计的值函数比真实值函数要大,且估计误差随 action 数增大而上升。过估计的根源在于 Q-learning 中 target 的最大化操作。

DQN 中采用 mini-batch SGD 进行梯度更新,如 batch_size=N 表示计算出 N 个 loss 后求和或平均得到一个 loss 再利用 BP 进行网络更新。DQN 的 loss 中每次求得的 targetQ 都是取 max 得到的,由于 E{max(x,y)}max{E(x),E(y)} E { max ( x , y ) } ≥ max { E ( x ) , E ( y ) } ,因此将 N 个 targetQ 值先取max操作再求平均,会比先计算 N 个 targetQ 值取平均后再 max 要大,即产生了过估计。

如果过估计是均匀的,由于贪婪策略,因此并不会影响最优 policy,但如果这种过估计不均匀,将导致某个次优 action 对应的高估 Q 值超过最优 action 对应的 Q 值,从而无法找到最优 policy。

Double-DQN 主要解决了 DQN 的这个缺陷。

1.2 Solution

Double-DQN [3] 将之前提出的 Double Q-learning 引入到 DQN,即将 action 的选择和评估解耦开。

  • 选择:用 MainNet 中 Q 值选择 maxaQ̂(s,a,θ) max a ′ ⁡ Q ^ ( s ′ , a ′ , θ ) 对应的 action
  • 评估:在 TargetNet 中评估这个 action 的 Q 值

由于评估时 Q 值不一定是 TargetNet 中最大的,从而可以避免选择高估 Q 值对应的次优 action。

形式化描述为:

loss(θ)=E[(TargetQQ̂MainNet(s,a,θMainNet))2] l o s s ( θ ) = E [ ( T a r g e t Q − Q ^ M a i n N e t ( s , a , θ M a i n N e t ) ) 2 ]
TargetQ=r(s,a,s)+λQTargetNet(s,argaQMainNet(s,a,θMainNet),θTargetNet) T a r g e t Q = r ( s , a , s ′ ) + λ Q T a r g e t N e t ( s ′ , arg a ′ ⁡ Q M a i n N e t ( s ′ , a ′ , θ M a i n N e t ) , θ T a r g e t N e t − )

2. Dualing-DQN

2.1 Motivation

在许多基于视觉感知的 DRL 任务中,不同的 (s,a) 的值函数是不同的,但是在某些 state 下,值函数的大小与动作无关。为处理这种情况,就需要对 DQN 网络结构作一点改变,即将每个 (s,a) 的 Q 值拆分成了两部分: state 的 value,action 的 advantage。

2.2 Solution
Dualing

具体来说,Dualing-DQN [4] 将原 Q-networks 输出分解为两个 channel 各自经过一个 MLP,一个 channel 得到与 action 无关的值函数 V,一个 channel 得到与 action 有关的对抗函数 A。最后,这两个 channel 的值回合形成 Q 值:

Q(s,a,θ,wV,wA)=V(s,θ,wV)+{A(s,a,θ,wA)maxaA(s,a,θ,wA)} Q ( s , a , θ , w V , w A ) = V ( s , θ , w V ) + { A ( s , a , θ , w A ) − max a ′ ⁡ A ( s , a ′ , θ , w A ) }

其中, θ θ 是卷积层参数, wV w V wA w A 是两支路全连接层参数。
流程如下:
这里写图片描述

prioritized experience replay

这里还有个小 trick,DQN 中 experience replay 中 samples 的选取是均匀的,忽视了样本重要性。
这里将 experience 以优先队列方式存储,在采样时根据 experiences 的 TD error,TD-error 绝对值越大则该 experience 被抽出训练的概率越大,从而加速了最优策略的学习。


DDPG

DQN 中采用 Q-network 来进行 Value function approximation 解决了连续状态空间问题,但基于 critic-only method 自然是没法处理连续动作空间问题。
DDPG 和 NAF 是在处理连续动作问题上的拓展。显然是通过 actor-only 类的 policy-based 方法,利用策略梯度方法直接优化用深度神经网络参数化表示的 policy,即网络的输出就是动作。

1. Motivation

之前的 DRL 研究的 model-free 问题,都利用的 SPG,但其计算复杂度很高:

  • SPG 学习得到的随机策略,在每一步行为时,仍需要对得到的最优策略概率分布进行采样,才能获得 action 的具体值,而对高维的 action 空间进行频繁采样,显然很低效
  • SPG 的计算,policy gradient 需要在整个 action space 计算期望,这个过程通常通过 MC 采样进行估算,仍需要对高维 action 空间进行采样,显然很低效

之前,业界普遍认为,model-free 问题的 DPG 是不存在的,直到 2014 年的论文 [5] 中,D. Silver 证明了 DPG 的存在,详见前篇文章。

Deepmind 在 2016 年提出 DDPG [6],将神经网络与 DPG 相结合,在 DQN 基础上,进行了一下改变:

  • 采用 AC 架构
  • 策略网络采用 DPG 更新

2. Framework

DDPG 算法结构如下:

这里写图片描述

off-policy

由于采用的 DPG,学习到的 deterministic policy 面临探索问题,所以采用 off-policy。这里通过对 actor 的决策机制引入随机噪声,将确定性决策过程变为一个随机决策过程, 再从这个随机过程中采样得到 action,下达给环境执行,即 behavior policy β β 的实现。

DDPG 中采用 Uhlenbeck-Ornstein 随机过程作为引入的随机噪声,在时序上具备很好的相关性,可以使 agent 很好的探索具备动量属性的环境。

actor

策略网络的目标是:

maxθμJ(μ)=Esρβ[Qμθμ(s,μθμ(s))] max θ μ ⁡ J ( μ ) = E s ∼ ρ β [ Q μ θ μ ( s , μ θ μ ( s ) ) ]

其中,由于采用的 off-policy,s 由 behavior policy 产生,所以不是 sρμθa s ∼ ρ μ θ a

用一个 CNN 对 policy 函数进行模拟,实现的方式即采用 DPG 计算梯度,然后用 SGA 更新网络参数 θμ θ μ 。已知 DPG 公式为

θμJ(μ)=Esρβ[aQ(s,a,θQ)θμμ(s)] ∇ θ μ J ( μ ) = E s ∼ ρ β ⁡ [ ∇ a Q ( s , a , θ Q ) ∇ θ μ μ ( s ) ]

用 MC-method 来估算上面的期望值,在 replay memory buffer 中存储的transition (si,ai,ri,si+1),是基于 agent 的 behavior policy β β 产生的,它们的分布函数为 ρβ ρ β ,所以可以从 replay memory buffer 中随机采样获得 mini-batch 数据,根据 MC 方法,使用 mini-batch 数据代入上述 policy gradient 公式,作为对上述期望值的一个无偏差估计,从而将 policy gradient 改写为:

θμJ(μ)1Ni[aQ(s,a,θQ)|s=si,a=μθμ(si)θμμ(s)|s=si] ∇ θ μ J ( μ ) ≈ 1 N ∑ i [ ∇ a Q ( s , a , θ Q ) | s = s i , a = μ θ μ ( s i ) ∇ θ μ μ ( s ) | s = s i ]

critic

值网络的目标是:

minθQloss(θQ)=[r(s,a,s)+λQ(s,μθμ(s),θQ)Q(s,a,θQ)]2 min θ Q ⁡ l o s s ( θ Q ) = [ r ( s , a , s ′ ) + λ Q − ( s ′ , μ θ μ − ( s ′ ) , θ Q − ) − Q ( s , a , θ Q ) ] 2

用一个 CNN 对 Q 函数进行模拟,实现方式即采用 SGD 更新网络参数 θQ θ Q

online & target

如果只使用单个 Q 网络,由于 Q 网络的参数在频繁 gradient update 同时,又用于计算 Q 网络和 policy 网络的 gradient,学习过程很不稳定。
DDPG 解决方案区别于 DQN,DQN 每隔一定的迭代次数后,将 MainNet 参数复制给 TargetNet ;而 DDPG中 TargetNet 的参数每次迭代都以微小量逼近 MainNet 的参数。
具体说来,DDPG 分别为 policy 网络、Q 网络各创建了两个神经网络拷贝,一个叫做online,一个叫做target:

  • policy 网络的 online 网络记为 μ(s,θμ) μ ( s , θ μ ) ,使用梯度更新参数 θμ θ μ
  • policy 网络的 target 网络记为 μ(s,θμ) μ − ( s , θ μ − ) ,使用软更新参数 θμ θ μ −
  • Q 网络的 online 网络记为 Q(s,a,θQ) Q ( s , a , θ Q ) ,使用梯度更新参数 θQ θ Q
  • Q 网络的 target 网络记为 Q(s,a,θQ) Q − ( s , a , θ Q − ) ,使用软更新参数 θQ θ Q −

每训练完一个 mini-batch 数据后,通过 SGA/SGD 使用梯度更新 online 网络的参数,再通过 soft update 算法更新 target 网络的参数。
soft update 是一种 running average 的算法:

θQτθQ+(1τ)θQθμτθμ+(1τ)θμ θ Q − ← τ θ Q + ( 1 − τ ) θ Q − θ μ − ← τ θ μ + ( 1 − τ ) θ μ −

通常 τ τ 很小,如 1e-3。
这样一来,target 网络参数变化小,用于在训练过程中计算 online 网络的 gradient,比较稳定,训练易于收敛。当然由于参数变化小,学习过程会变慢。

算法

再回头看 Q 网络和 policy 网络,policy 网络将 target 的参数给 Q 网络的 target 用于评估值函数,Q 网络的 online 将值函数给 policy 网络的 online 用于计算梯度。整个流程可以描述为:

初始化 actor\critic 的 online 神经网络参数: θQ 和 θμ;
将 online 网络的参数拷贝给对应的 target 网络:θQ′←θQ,θμ′←θμ ;
初始化replay memory buffer R;
for each episode:
   初始化 UO 随机过程;
   for t = 1, T:(下面的步骤与 DDPG 实现框架图中步骤编号对应)
        1. actor 根据 behavior 策略选择一个 at, 下达给 agent 执行:at=μ(st|θμ)+Noi
        2. agent 执行 at,返回reward rt 和新的状态 st+1
        3. actor 将这个状态的转换过程 (st,at,rt,st+1)存入replay memory buffer R中,作为训练 online 网络的数据集
        4. 从replay memory buffer R 中,随机采样 N 个 transition 数据,作为 online 策略网络、online Q 网络的一个 mini-batch 训练数据。用 (si,ai,ri,si+1) 表示 mini-batch 中的单个 transition 数据。
        5. 计算 online Q 网络的 gradient:对 Loss=1/N∑_i(loss),基于标准的 back-propagation 方法,可以求得 Loss 针对 θQ 的 gradient。
        6. update online Q: 采用 Adam optimizer 更新 θQ
        7. 计算 online policy 网络的 policy gradient:根据 DPG 计算,根据 MC 方法使用 mini-batch 计算其中的期望
        8. update online policy:采用Adam optimizer 更新 θμ
        9. soft update target 网络 μ′ 和 Q′
    end for time step
end for episode

3. Conclusion

自然是不适用于随机策略的场景。


NAF

NAF 和 DDPG 一样都是在处理连续动作问题上的拓展。

1. Motivation

在 DQN 框架下,是通过计算 Q 值的最大值来选择动作。当扩展到连续控制,需要设计一种方法,可以输入状态,然后输出动作,并且保证输出动作对应的 Q 值最大。
一种思路是,准备两个网络,一个 policy 网络用于输入状态输出动作,另一个 Q 网络用于输入状态输出 Q 值,典型的 AC 结构,DDPG 走的这条路。
另一种思路是,仅准备一个网络,既能输出动作又能输出 Q 值。也就是 NAF 走的路。

DeepMind 等在16年的 [7] 中,提了一个最简单的 NAF 模型,以及一个机遇 model-based 加速的 NAF 版本。这里仅介绍最简单版本的 NAF。

2. Solution

DDPG 实现连续控制需要训练两个网络,而 NAF 仅需要训练一个模型即可。通过其名字,normalized advantage functions,就可以发现 NAF 利用了类似于 Dueling-DQN 的 dueling net 思想:Q 值函数可以表示为状态值函数 V 与优势值函数 A 的和。

引入 Advantage,即每个动作在特定状态下的优劣。因此,选最优的动作就变成了选 Advantage 最大的动作。因此,有下述定义:

Q(s,a,θQ)=V(s,θV)+A(s,a,θA) Q ( s , a , θ Q ) = V ( s , θ V ) + A ( s , a , θ A )

核心的 idea 来了,即如果能够限制 A(s,a,θA)0 A ( s , a , θ A ) ≤ 0 ,当且仅当 a=μθ(s) a = μ θ ( s ) A(s,a,θA)=0 A ( s , a , θ A ) = 0 ,像是加了一个正则,使得 μθ(s) μ θ ( s ) 不偏离 a 太多并且希望最后 μθ(s) μ θ ( s ) 逐点收敛。
要实现这个想法,即定义 A 是一个负二次形式的正定方阵即可:

A(s,a,θA)=12(aμθ(s))TP(s,θP)(aμθ(s)) A ( s , a , θ A ) = − 1 2 ( a − μ θ ( s ) ) T P ( s , θ P ) ( a − μ θ ( s ) )

其中,矩阵 P 是一个关于状态的正定矩阵, 利用正定矩阵的 Cholesky 分解,可以表示为 P(s,θP)=L(s,θP)L(s,θP)T P ( s , θ P ) = L ( s , θ P ) L ( s , θ P ) T ,矩阵 L 为对角线都是正数的下三角矩阵,且是唯一的。那么问题就变成了构造 L 得到 P 就有了 A。

上面提到在 s 下最优的 a 的优势函数 A=0,所以对应最优动作的值函数 Q 就等于 V,从而很容易构造出 TargetQ 值。整个流程如下所示:

这里写图片描述


A3C

A3C(Asynchronous Advantage Actor-Critic)是一种基于异步 RL 思想的轻量级 AC 框架。

1. Motivation

前面的 DRL 训练时非常依赖于计算强劲的 GPU,而且沿袭了 DQN 提出的处理数据相关性的 experience replay 机制。但 experience replay 也存在缺陷:

  • agent 与 env 的每次实时交互都需要耗费巨大的内存和算力
  • experience replay 要求 agent 采用 off-policy,而 off-policy 只能基于旧策略生成的数据进行更新

面对这些问题,ARL 能利用 cpu 的多线程,实现多 agent 实例的并行 actor-learner 对,每个线程对应不同的探索策略,这种并行化起到了数据解相关的作用,可替代 experience replay 从而节省存储开销。

deepMind 于2016年 [8] 提出了四种 ARL 算法,前三种都是传统 RL 方法的改造,第四种是 DRL 的改造,总得来说,这篇论文更多是工程上的设计和优化:

  • asynchronous one-step SARSA (on-policy)
  • asynchronous one-step Q-learning (off-policy)
  • asynchronous n-step Q-learning (on-policy)
  • asynchronous advantage actor-critic (on-policy)

异步的实现,简单地说,就是等所有的异步 agent 执行完后,再用累计的梯度信息更新网络参数。其中,n-step 类算法需要每个异步 agent 复制一份子网络,每个 agent 执行 n 步后倒退算出每步的总回报和相关梯度,用累计梯度更新主网络参数。如果不复制子网络,则等单个 agent 执行完 n-step 耗时太多,而 one-step 可忽略这个影响)。

2. A3C

A3C 在学习过程中使用 n-step 回报来同时更新 policy 和 value function。网络结构使用了 CNN,其中 policy 网络使用 softmax output 作为 πθ(a|s) π θ ( a | s ) ,value 网络使用 linear output 作为 V(s,θV) V ( s , θ V ) ,其余 layer 都共享。如下图所示:

这里写图片描述

此外,作者还引入了一些小 trick,即将 policy 的 entropy 加到目标函数可以避免收敛到次优确定性解。直观上,加上该正则项后目标函数更鼓励找 entropy 大的,即形状“扁平”的分布,这样就不容易在训练过程中聚集到某一个动作上去。


Reference

  1. Playing Atari with Deep Reinforcement Learning, V. Mnih, 2013.
  2. Human-level control through deep reinforcement learning, V. Mnih, 2015.
  3. Deep Reinforcement Learning with Double Q-learning, H. V. Hasselt, 2015.
  4. Dueling Network Architectures for Deep Reinforcement Learning, Z. Wang, 2016.
  5. Deterministic policy gradient algorithms,D. Silver, 2014.
  6. Continuous control with deep reinforcement learning,TP Lillicrap,2015.
  7. Continuous Deep Q-Learning with Model-based Acceleration,Shixiang Gu,2016.
  8. Asynchronous Methods for Deep Reinforcement Learning,V. Mnih,2016.
  9. BLOG:https://blog.csdn.net/kenneth_yu/article/details/78478356
  10. BLOG:https://blog.csdn.net/u013236946/article/category/6965927
  11. BLOG:https://blog.csdn.net/lipengcn/article/details/81253033
  • 26
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值