前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度强化学习落地方法论算法选择:DQN、DDPG、A3C、PPO、TD3

深度强化学习落地方法论算法选择:DQN、DDPG、A3C、PPO、TD3

作者头像
汀丶人工智能
发布2023-10-11 17:38:32
2.2K0
发布2023-10-11 17:38:32
举报
文章被收录于专栏:NLP/KGNLP/KG

虽然每年 RL 方向的 paper 满天飞,但真正具有普遍实用价值的突破性工作实在不多,大多数还是在经典框架基础上的改进和扩展。DRL 常规武器库里的存货主要还是老三样:DQN,DDPG 和 A3C,它们是深度学习时代最成熟、最能体现智慧结晶的三个 DRL 框架,你可以在 GitHub 上找到无数相关代码,有 OpenAI,DeepMind 和 Nvidia 这些大公司的,也有个人爱好者的。对于 DRL 初学者,它们是最佳的敲门砖;对于算法研究者,它们是最厚实的 “巨人肩膀”;对于算法工程师,它们是最顺手的试金石。你完全可以把三个框架都放到项目模拟器上跑一跑,看哪个效果好就用哪个。当然,这三个算法框架都有各自的特点和适用 domain,结合对项目的分析,是可以提前评估最合适的算法的。

1.强化学习——探索和利用的平衡游戏


总体来说,强化学习是一个探索(Exploration)和利用(Exploitation)的平衡游戏,前者使 agent 充分遍历环境中的各种可能性,从而有机会找到最优解;后者利用学到的经验指导 agent 做出更合理的选择。两者之间可以说是相爱相杀的关系:

  1. 充分的探索才能带来有效的利用,从而使 RL 走在正确的道路上。对于那些难度特别高的任务,改进探索策略是性价比最高的手段,比如 AlphaGo 使用蒙特卡洛决策树征服了围棋,Go-Explore 利用状态回访打爆了 Montezuma’s Revenge
  2. 充分的利用才能探索到更好的状态,agent 往往需要掌握基本技能,才能解锁更高级的技能。就好像小孩先要学会站起来,才能学会走,然后才能学会跑。这种从易到难、循序渐进的思想在 RL 中也很受用,著名的 Curriculum Learning 就是由此而来
  3. 过量的探索阻碍及时的利用。如果随机探索噪声强度过高,已经学到的知识会被噪声淹没,而无法指导 agent 解锁更好的状态,导致 RL 模型的性能停滞不前
  4. 机械的利用误导探索的方向。如果刚刚学到一点知识就无条件利用,agent 有可能被带偏,从而陷入局部最优,在错误道路上越走越远,在训练早期就扼杀了最好的可能性

强化学习的训练过程其实就是从以探索为主到以利用为主的过渡过程,训练早期通过广泛试错找准一个方向,然后沿着该方向一路试探下去直到达到最优。请牢牢记住这 “两点一线”,因为这是所有 RL 算法的主要内容,任何 RL 算法都能以此为切入点进行解构,有助于不断加深对算法的理解。接下来我就结合实际经验,谈谈对三个主流 DRL 框架的一些浅见。

2.DQN


DQN 是借助 AlphaGo 最早成名的深度强化学习算法,其核心思想是利用 Bellman 公式的 bootstrap 特性,不断迭代优化一个 Q(s,a)函数,并据此在各种状态下选择 action。其中 Q(s,a)函数拟合的是一对状态 - 动作的长期收益评估,该算法没有显式的 policy。DQN 探索和利用的平衡靠的是一种称为ε-greedy 的策略,针对最新的 Q(s,a)函数和当前的输入状态 s,agent 做决策时以概率ε随机选择 action,而以 1-ε的概率选择使 Q(s,a)最大的 action,随着ε从大到小变化,DQN 也相应地从 “强探索弱利用” 过渡到“弱探索强利用”。

DQN 的原理使其天然地适合离散动作空间,也就是 action 可以穷举,比如走迷宫的 agent 只允许前后左右 4 个动作,下围棋的 AlphaGo 只允许 19*19=361 个落子位置(实际还要排除已经落子的网格点)。这是一个重要的特征,如果你手上是一个连续控制任务,action 在某区间内有无数种可能,那就不适合用 DQN 了。当然,你也可以选择把区间离散化,这样就可以应用 DQN 了,也曾有 paper 报告这样做在某些任务中可以比连续控制取得更好的性能。

DQN 属于 off-policy 方法,所谓 off-policy 是指用于计算梯度的数据不一定是用当前 policy 采集的。DQN 使用一个叫 replay buffer 的 FIFO 结构,用于存储 transition:(s,a,s’,r),每次随机从 buffer 中拿出一个 batch 用于梯度计算和参数更新。Replay buffer 是稳定 DQN 训练的重要措施,对历史数据的重复使用也提高了其数据利用率,对于那些数据比较 “贵” 的任务,比如 Google 的抓取应用(见需求分析篇),这一点非常重要,事实上 Google 除了 replay buffer,还专门搞了个数据库,把之前存储的另一个抓取应用采集的数据拿出来做预训练,精打细算到了极致,真是比你有钱,还比你节约~

DQN 的缺点挺多,有些是 RL 的通病,比如对超参数敏感,我在训练篇会详细介绍;另外利用 Bellman 公式的 bootstrap 特性更新 Q 值的方式自带 bias,外加计算目标 Q 值时使用同一个网络评估和选择动作(见下式),DQN 容易被 overestimation 问题困扰,导致训练稳定性较差,近些年学术界有不少工作是围绕这一点做出改进(比如 Double DQN)。此外,DQN 还有 off-policy 方法的通病,对历史数据的重复利用虽然可以提高数据效率,但有个前提条件是环境 model 不能发生变化,single agent 任务较易满足这个条件,但 multiagent 场景就未必了,对任意 agent 而言,其他 agent 也是环境的一部分,而他们的学习进化会改变这个环境,从而使历史数据失效,这就是 MARL 领域著名的环境不稳定问题,除非 replay buffer 内的数据更新足够快,否则 off-policy 方法的性能往往不如 on-policy 方法。

3. DDPG


针对 DQN 无法处理连续控制任务的缺点,DDPG 在 DQN 的基础上做了改进,引入了一个输出连续 action 的显式 policy,与 Q 函数组成 Actor-Critic 结构,更新 policy 网络的梯度完全来自于 Q 网络,目标是最大化当前的 Q 函数。Q 函数的更新与 DQN 类似,只是计算 s’状态下目标值时放弃了 max 操作,而采用当前 policy 网络的输出π(a|s’)。DDPG 名字里的第一个 D 是 Deterministic 的缩写,意思是确定性的,这是有意与正宗 Actor-Critic 方法(如 A2C/A3C 等)区分开,后者 policy 输出的是 action 的概率分布,而 DDPG 输出的就是确定性的 action。正因为如此,DDPG 采用了独特的探索方式,即在 action 输出直接加上一个 noise,该 noise 的强弱决定了探索力度,本质上相当于以当前 action 为中心形成了一个概率分布,每次更新都使 policy 向该分布中更好的方向演化,直到 action 达到了最优,此时对应分布内其他方向都是更差的方向,policy 输出也就稳定在最优 action 附近了,从而实现了探索和利用的平衡。

能用于连续控制任务自然是招人喜欢的,毕竟实际控制任务的变量往往都是连续取值的,比如角度、位移、速度、加速度、电流、电压等等。学者们把 DDPG 用在 MuJoCo 上,解决了很多连续 domain 的任务,后来也有人把它用到真实的软体章鱼机器人上,用两只触角实现了向前运动。然而,在连续区间上找到最优的确定性 action 输出本身是一件非常困难的事,导致 DDPG 在 action 维度较高的复杂任务中表现不佳,比如 KUKA iiwa 机器人有 7 个自由度,使得探索空间一下大了很多,训练难度陡升。同时 policy 网络的梯度完全来自于 Q 网络,Q 函数的拟合误差都直接传导给了 policy,致使 DDPG 的训练稳定性也不足。在 Google 的抓取应用中,干脆抛弃了独立 policy 网络,做决策时随机在区间里取 16 个点输入 Q 网络,然后选择 Q 值最大的那个作为 action,实验结果表明如此粗糙的做法却大大提升了训练稳定性,且性能显著优于 DDPG,有点尴尬……

总结一下,如果我们面对的问题是连续控制任务,action 维度又不高,可以尝试用 DDPG 解决,但也不要忘了离散化动作空间并用 DQN 训练得到更高性能的可能性。如果 action 维度很高,那还是别用 DDPG 的好。如果数据很 “贵” 不得不用 off-policy 方法的话,那就向 Google 学习,拿掉 policy 网络,直接用 Q 网络 + 启发式搜索选择 action。如果数据廉价又追求高性能,我推荐使用 PPO 框架——个人比较偏爱的一种框架。

2021 年 2 月 15 日更新:上述建议已经过时了,对于连续控制任务,推荐优先使用 SAC,后者在训练稳定性、收敛速度和性能方面都是目前的 SOTA,作为 off-policy 算法数据效率也相对较高,SAC 作者尝试直接用实体机器人采样并在几个小时内成功收敛

4.A3C→A2C→PPO


在成熟版 SAC 出现以前,PPO 曾带给我最多的成功经验。PPO 从 A3C 的同步版本 A2C 的基础上演化而来。

A3C 作为 Actor-Critic 算法,核心是 REINFORCE 梯度策略方法。其 policy 输出的不是 action,而是关于 action 的概率分布,因此梯度无法直接从 Critic(又称为 V 网络)流到 policy 网络,只能用在线样本统计出一个近似梯度。原始 REINFORCE 梯度形式如

\nabla

\nabla V(s) logπ(a|s),直观解释就是使状态 s 下返回高 V 值的 action 出现概率更大。缺点是 V 值绝对值不可控(与 reward 等因素有关),variance 很大,造成训练不稳定。A3C 将梯度改成

\nabla

\nabla A(s,a) logπ(a|s),A(s,a) 是在线 episode 计算出的一对 s,a 的 Value 值与当前 V 网络估计值之差,并经过 normalization 操作,简单理解就是把 log 前的部分做了一个居中 + 归一化,variance 降低,训练稳定性显著提升,这里的 A(s,a) 称为 a 在 s 下的 advantage,是 A3C 名字里的第二个’A’。既然 policy 输出的是 action 概率分布,那么探索就很容易实现——按照这个分布采样即可,训练初期分布 variance 比较大,探索力度强,随着 policy 不断改善,分布 variance 越来越小,代表 policy 对所选 action 越来越自信,这就实现了对经验的利用。

A3C 能够充分利用多核资源,在不同 CPU 上并行运行不同的环境种子,显著提升了训练稳定性、收敛速度以及最终性能。A3C 支持多种 action 概率分布,如果 action 空间是 DQN 那样的离散集合,可以用 Categorical 分布;如果是像 DDPG 那样的多维连续分布,可以用 Multivariate Gaussian 分布,此外 A3C 还支持伯努利分布,如果 action 的每一维都是非此即彼的二值选项,或者 one-hot 向量太长想改用二进制表示,那就是它了。可见,A3C 在通用性上是显著优于 DQN 和 DDPG 的,几乎所有任务都能拿 A3C 跑一跑。此外,A3C 作为 on-policy 方法,每次更新 policy 的梯度都由当前 policy 采集的样本计算,这使得 A3C 在 MARL 任务里对环境不稳定性的抵抗能力比 DQN 和 DDPG 更强。

A3C 将多核环境中计算的梯度进行异步(Asynchronous)聚合,然后统一更新主网络并将新参数分发到各环境。这种方式的运行效率较高,但计算的梯度可能与当前主网络参数在时间上 “错位”,有可能损害算法性能。因此,学术界更多地沿用了 A3C 的同步梯度聚合版本 A2C。PPO 就是在 A2C 的基础上利用 clip 操作进一步限制了每次梯度更新的幅度,从而显著提升了训练稳定性。和很多 paper 的实验结果一致,我在实际应用中发现 PPO 在连续控制任务里性能显著优于 DDPG,对超参数的敏感度也比 DDPG 低,因此训练起来更加得心应手。因此,我推荐大家在解决连续任务时首选 PPO,DDPG 的优先级往后放就是了。对于具有离散动作空间的任务也值得用 A3C 跑一下,跟 DQN 比一比。

2021 年 2 月 15 日更新:考虑到这篇文章写作时间较早,这里统一更新算法选择方面的建议:对于连续控制任务,推荐 SAC、TD3 和 PPO,三种算法都值得试一试并从中择优;对于离散控制任务,推荐 SAC-Discrete(即离散版 SAC)和 PPO。至于 TD3 和 SAC 的详细介绍,网上资料很多,暂时就不写了,有机会再说。

5. 其他算法


以上三个 DRL 框架是基础,大多数情况下都至少能得到一个 “能用” 的 policy。然而,也不应奢望它们能解决一切问题。DRL 领域是个大坑,里边有太多需要解决的问题和值得挖掘的方向,比如:高难度探索,稀疏 reward,数据效率,训练稳定性,快速适应新环境等等,类似 MARL 这样的子领域还有自己特有的问题,如环境不稳定性,scalability 等等。算法工作者一定要保持开放的态度,及时跟踪学术界的新趋势新方法。

每当算法性能遇到瓶颈,首先要沉下心来分析关键制约因素在哪里,如果是上述这些普遍意义上的问题造成,那就去相关方向最新 paper 中寻找灵感。比如探索不够充分时,可以用 count-based exploration 或者 parameter noise 来加强探索;DQN 训练不稳定时,可以尝试 Double-DQN,或者孪生网络,每次选择较小 Q 值计算目标值,从而抑制 overestimation;DQN 或 DDPG 数据效率不够时,可以用 prioritized replay buffer;MARL 里为了改善环境不稳定问题,可以尝试 DIMAPG,……。问题无常势,算法无常形,群众智慧是无穷的,博采众长才能攻无不克。

关于算法选择就先写到这里,不同算法在训练时还有各种各样的 trick 和注意事项,我在训练篇里再详细介绍。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.强化学习——探索和利用的平衡游戏
  • 2.DQN
  • 3. DDPG
  • 4.A3C→A2C→PPO
  • 5. 其他算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档