Shortcuts

R2D2

概述

R2D2 首次在 分布式强化学习中的循环经验回放 中被提出。 在使用经验回放的RNN训练中,RL算法通常面临表示漂移和循环状态陈旧的问题。 R2D2 采用了两种方法:存储状态和预热,以减轻上述影响。 R2D2 代理整合了这些发现,在 Atari-57 上取得了显著的进展,并在 DMLab-30 上达到了最先进的水平。 作者声称,循环回放分布式DQN(R2D2)是第一个使用单一网络架构和固定超参数集实现这一目标的代理。

快速事实

  1. R2D2 是一种离策略无模型基于价值的强化学习算法,

  2. R2D2 本质上是一种基于 DQN 的算法,使用了分布式框架、双 Q 网络、决斗架构、n 步 TD 损失和优先经验回放。

  3. R2D2 现在仅支持离散动作空间,并且与 DQN 一样使用eps-greedy进行探索。

  4. R2D2 使用存储状态预热技术来减轻表示漂移和循环状态陈旧的影响。

  5. R2D2的DI-engine实现提供了res_link键,以支持循环Q网络中的残差链接。

关键方程或关键图表

R2D2代理与Ape-X最为相似,基于优先分布式回放和n步双Q学习(n = 5),通过大量执行者(通常为256个)生成经验,并由单一学习者从回放的经验批次中学习。 R2D2的Q网络使用决斗网络架构,并在卷积堆栈后提供一个LSTM层。

与常规的 \((s, a, r, s^')\) 转换元组不同,R2D2 在回放中存储固定长度(m = 80)的 \((s, a, r)\) 序列,相邻序列在时间步上重叠 40 步,并且从不跨越情节边界。具体来说,R2D2 中使用的 n 步目标是:

../_images/r2d2_q_targets.png

在这里,\(\theta^{-}\) 表示目标网络参数,这些参数每2500个学习步骤从在线网络参数 \(\theta\) 复制而来。

R2D 使用最大和平均绝对 n 步 TD 误差 \(\delta_i\) 的混合作为优先经验回放的优先级指标,应用于序列中:

../_images/r2d2_priority.png

注意

在我们的DI-engine实现中,在每个展开步骤中,基于LSTM的Q网络的输入仅仅是观察最后的隐藏状态,不包括奖励和one-hot动作。

有关如何在DI-engine中使用RNN的更多详细信息,用户可以参阅How to use RNN, 关于R2D2中的数据整理过程,用户可以参阅data-arrangement部分, 关于R2D2中的预热技术,用户可以参阅burn-in-in-r2d2部分。

扩展

R2D2 可以与以下内容结合使用:

  • 从演示中学习

    用户可以参考R2D3论文和我们R2D3实现R2D3文档。 R2D3是一个代理,它有效地利用演示来解决在具有高度可变初始条件的部分可观察环境中的困难探索问题。

  • 变压器

    基于Transformers的代理利用其强大的注意力机制,在那些长期记忆可能有益的环境中学习更好的策略。 用户可以参考GTrXL论文和我们GTrXL实现r2d2_gtrxl文档

实现

R2D2Policy 的默认配置定义如下:

class ding.policy.r2d2.R2D2Policy(cfg: EasyDict, model: Module | None = None, enable_field: List[str] | None = None)[源代码]
Overview:

R2D2的策略类,来自论文分布式强化学习中的循环经验回放。 R2D2提出应使用几种技巧来改进DRQN,即一些循环经验回放技巧和用于离策略训练的预热机制。

Config:

ID

符号

类型

默认值

描述

其他(形状)

1

type

字符串

r2d2

RL policy register name, refer to
registry POLICY_REGISTRY
This arg is optional,
a placeholder

2

cuda

布尔

Whether to use cuda for network
This arg can be diff-
erent from modes

3

on_policy

布尔

Whether the RL algorithm is on-policy
or off-policy

4

priority

布尔

Whether use priority(PER)
Priority sample,
update priority

5

priority_IS
_weight

布尔

Whether use Importance Sampling Weight
to correct biased update. If True,
priority must be True.

6

discount_
factor

浮点数

0.997, [0.95, 0.999]

Reward’s future discount factor, aka.
gamma
May be 1 when sparse
reward env

7

nstep

整数

3, [3, 5]

N-step reward discount sum for target
q_value estimation

8

burnin_step

整数

2

The timestep of burnin operation,
which is designed to RNN hidden state
difference caused by off-policy

9

learn.update
per_collect

整数

1

How many updates(iterations) to train
after collector’s one collection. Only
valid in serial training
This args can be vary
from envs. Bigger val
means more off-policy

10

learn.batch_
size

整数

64

The number of samples of an iteration

11

learn.learning
_rate

浮点数

0.001

Gradient step length of an iteration.

12

learn.value_
rescale

布尔

Whether use value_rescale function for
predicted value

13

learn.target_
update_freq

整数

100

Frequence of target network update.
Hard(assign) update

14

learn.ignore_
done

布尔

Whether ignore done for target value
calculation.
Enable it for some
fake termination env

15

collect.n_sample

整数

[8, 128]

The number of training samples of a
call of collector.
It varies from
different envs

16

collect.unroll
_len

整数

1

unroll length of an iteration
In RNN, unroll_len>1

网络接口 R2D2 的定义如下:

class ding.model.template.q_learning.DRQN(obs_shape: int | SequenceType, action_shape: int | SequenceType, encoder_hidden_size_list: SequenceType = [128, 128, 64], dueling: bool = True, head_hidden_size: int | None = None, head_layer_num: int = 1, lstm_type: str | None = 'normal', activation: Module | None = ReLU(), norm_type: str | None = None, res_link: bool = False)[源代码]
Overview:

DRQN(DQN + RNN = DRQN)算法的神经网络结构和计算图,这是用于序列数据和部分可观测环境的最常见的DQN变体。DRQN由三部分组成:encoderheadrnnencoder用于从各种观测中提取特征,rnn用于处理序列观测和其他数据,head用于计算每个动作维度的Q值。

Interfaces:

__init__, forward.

注意

当前的 DRQN 支持两种类型的编码器:FCEncoderConvEncoder,两种类型的头:DiscreteHeadDuelingHead,三种类型的 rnn:normal (LSTM with LayerNorm)pytorchgru。您可以通过继承此类来自定义自己的编码器、rnn 或头。

forward(inputs: Dict, inference: bool = False, saved_state_timesteps: list | None = None) Dict[source]
Overview:

DRQN 前向计算图,输入观测张量以预测 q_value。

Arguments:
  • 输入 (torch.Tensor): 输入数据的字典,包括观察值和先前的RNN状态。

  • 推理: (:obj:’bool’): 是否启用推理前向模式,如果为True,我们展开一个时间步的转换,否则,我们展开整个序列的转换。

  • saved_state_timesteps: (:obj:’Optional[list]’): 当推理为False时,我们展开序列转换,然后我们将使用此列表来指示如何保存和返回隐藏状态。

ArgumentsKeys:
  • obs (torch.Tensor): 原始观测张量。

  • prev_state (list): 之前的RNN状态张量,其结构取决于lstm_type

Returns:
  • 输出 (Dict): DRQN前向的输出,包括logit(q_value)和下一个状态。

ReturnsKeys:
  • logit (torch.Tensor): 每个可能动作维度的离散Q值输出。

  • next_state (list): 下一个RNN状态张量,其结构取决于 lstm_type

Shapes:
  • obs (torch.Tensor): \((B, N)\), 其中 B 是批量大小,N 是 obs_shape

  • logit (torch.Tensor): \((B, M)\), 其中 B 是批量大小,M 是 action_shape

Examples:
>>> # Init input's Keys:
>>> prev_state = [[torch.randn(1, 1, 64) for __ in range(2)] for _ in range(4)] # B=4
>>> obs = torch.randn(4,64)
>>> model = DRQN(64, 64) # arguments: 'obs_shape' and 'action_shape'
>>> outputs = model({'obs': inputs, 'prev_state': prev_state}, inference=True)
>>> # Check outputs's Keys
>>> assert isinstance(outputs, dict)
>>> assert outputs['logit'].shape == (4, 64)
>>> assert len(outputs['next_state']) == 4
>>> assert all([len(t) == 2 for t in outputs['next_state']])
>>> assert all([t[0].shape == (1, 1, 64) for t in outputs['next_state']])

基准测试

Benchmark and comparison of R2D2 algorithm

环境

最佳平均奖励

评估结果

配置链接

比较

Pong (PongNoFrameskip-v4)

20

../_images/pong_r2d2.png

config_link_p


Qbert (QbertNoFrameskip-v4)

6000

../_images/qbert_r2d2_cfg2.png

config_link_q


SpaceInvaders (SpaceInvadersNoFrameskip-v4)

1400

../_images/spaceinvaders_r2d2.png

config_link_s


参考文献

  • Kapturowski S, Ostrovski G, Quan J, 等. 分布式强化学习中的循环经验回放[C]//国际学习表示会议. 2018.

  • Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, Martin Riedmiller: “使用深度强化学习玩Atari游戏”, 2013; arXiv:1312.5602.

  • Schaul, T., Quan, J., Antonoglou, I., & Silver, D. (2015). 优先经验回放. arXiv 预印本 arXiv:1511.05952.

  • Van Hasselt, H., Guez, A., & Silver, D. (2016年3月). 使用双Q学习的深度强化学习. 在AAAI人工智能会议论文集 (第30卷, 第1期).

  • 王, Z., 绍尔, T., 赫塞尔, M., 哈塞尔特, H., 兰克托特, M., & 弗雷塔斯, N. (2016年6月). 深度强化学习的对决网络架构. 在国际机器学习会议上 (pp. 1995-2003). PMLR.

  • Horgan D, Quan J, Budden D, 等. 分布式优先经验回放[J]. arXiv 预印本 arXiv:1803.00933, 2018.

其他公共实现

seed_rl

ray