决策变压器
概述
决策变换器模型在决策变换器:通过序列建模进行强化学习中提出
由Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch共同完成。
论文的摘要如下:
我们引入了一个框架,将强化学习(RL)抽象为一个序列建模问题。这使得我们能够利用Transformer架构的简单性和可扩展性,以及语言建模中的相关进展,如GPT-x和BERT。特别是,我们提出了决策Transformer,这是一种将RL问题转化为条件序列建模的架构。与之前拟合价值函数或计算策略梯度的RL方法不同,决策Transformer通过利用因果掩码Transformer简单地输出最优动作。通过在期望回报(奖励)、过去状态和动作上调节自回归模型,我们的决策Transformer模型可以生成实现期望回报的未来动作。尽管其简单性,决策Transformer在Atari、OpenAI Gym和Key-to-Door任务上匹配或超越了最先进的无模型离线RL基线。
此版本的模型适用于状态为向量的任务。
该模型由edbeeching贡献。原始代码可以在这里找到。
DecisionTransformerConfig
类 transformers.DecisionTransformerConfig
< source >( state_dim = 17 act_dim = 4 hidden_size = 128 max_ep_len = 4096 action_tanh = True vocab_size = 1 n_positions = 1024 n_layer = 3 n_head = 1 n_inner = None activation_function = 'relu' resid_pdrop = 0.1 embd_pdrop = 0.1 attn_pdrop = 0.1 layer_norm_epsilon = 1e-05 initializer_range = 0.02 scale_attn_weights = True use_cache = True bos_token_id = 50256 eos_token_id = 50256 scale_attn_by_inverse_layer_idx = False reorder_and_upcast_attn = False **kwargs )
参数
- state_dim (
int
, optional, defaults to 17) — RL环境的状态大小 - act_dim (
int
, optional, defaults to 4) — 输出动作空间的大小 - hidden_size (
int
, optional, defaults to 128) — 隐藏层的大小 - max_ep_len (
int
, optional, defaults to 4096) — 环境中的最大回合长度 - action_tanh (
bool
, optional, defaults to True) — 是否在动作预测上使用tanh激活函数 - vocab_size (
int
, 可选, 默认为 50257) — GPT-2 模型的词汇量大小。定义了调用 DecisionTransformerModel 时传递的inputs_ids
可以表示的不同标记的数量。 - n_positions (
int
, optional, 默认为 1024) — 该模型可能使用的最大序列长度。通常将其设置为较大的值以防万一(例如,512 或 1024 或 2048)。 - n_layer (
int
, 可选, 默认为 3) — Transformer编码器中的隐藏层数。 - n_head (
int
, optional, 默认为 1) — Transformer 编码器中每个注意力层的注意力头数。 - n_inner (
int
, 可选) — 内部前馈层的维度。如果未设置,将默认为n_embd
的4倍。 - activation_function (
str
, optional, defaults to"gelu"
) — 激活函数,从列表["relu", "silu", "gelu", "tanh", "gelu_new"]
中选择。 - resid_pdrop (
float
, optional, 默认为 0.1) — 嵌入层、编码器和池化器中所有全连接层的 dropout 概率。 - embd_pdrop (
int
, optional, defaults to 0.1) — 嵌入的dropout比例。 - attn_pdrop (
float
, optional, 默认为 0.1) — 注意力的dropout比例. - layer_norm_epsilon (
float
, optional, defaults to 1e-5) — 用于层归一化层的epsilon值。 - initializer_range (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。 - scale_attn_weights (
bool
, 可选, 默认为True
) — 通过除以 sqrt(hidden_size) 来缩放注意力权重。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。 - scale_attn_by_inverse_layer_idx (
bool
, 可选, 默认为False
) — 是否通过1 / layer_idx + 1
额外缩放注意力权重. - reorder_and_upcast_attn (
bool
, 可选, 默认为False
) — 是否在计算注意力(点积)之前缩放键(K),并在使用混合精度训练时将注意力点积/softmax上转换为float()类型。
这是用于存储DecisionTransformerModel配置的配置类。它用于根据指定的参数实例化一个决策变换器模型,定义模型架构。使用默认值实例化配置将产生与标准DecisionTransformer架构类似的配置。许多配置选项用于实例化作为架构一部分的GPT2模型。
配置对象继承自PretrainedConfig,可用于控制模型输出。阅读PretrainedConfig的文档以获取更多信息。
示例:
>>> from transformers import DecisionTransformerConfig, DecisionTransformerModel
>>> # Initializing a DecisionTransformer configuration
>>> configuration = DecisionTransformerConfig()
>>> # Initializing a model (with random weights) from the configuration
>>> model = DecisionTransformerModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
决策变换器GPT2模型
前进
< source >( input_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[typing.Tuple[typing.Tuple[torch.Tensor]]] = None attention_mask: typing.Optional[torch.FloatTensor] = None token_type_ids: typing.Optional[torch.LongTensor] = None position_ids: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.FloatTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None encoder_hidden_states: typing.Optional[torch.Tensor] = None encoder_attention_mask: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None )
DecisionTransformerModel
类 transformers.DecisionTransformerModel
< source >( config )
参数
- config (~DecisionTransformerConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
决策变换器模型 该模型是一个PyTorch torch.nn.Module 子类。将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
该模型基于GPT2架构,在离线强化学习环境中执行自回归动作预测。更多详情请参考论文:https://arxiv.org/abs/2106.01345
前进
< source >( states: typing.Optional[torch.FloatTensor] = None actions: typing.Optional[torch.FloatTensor] = None rewards: typing.Optional[torch.FloatTensor] = None returns_to_go: typing.Optional[torch.FloatTensor] = None timesteps: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.FloatTensor] = None output_hidden_states: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.models.decision_transformer.modeling_decision_transformer.DecisionTransformerOutput
或 tuple(torch.FloatTensor)
参数
- states (
torch.FloatTensor
of shape(batch_size, episode_length, state_dim)
) — 轨迹中每个步骤的状态 - actions (
torch.FloatTensor
of shape(batch_size, episode_length, act_dim)
) — 由“专家”策略为当前状态采取的动作,这些动作被屏蔽以进行自回归预测 - 奖励 (
torch.FloatTensor
of shape(batch_size, episode_length, 1)
) — 每个状态和动作的奖励 - returns_to_go (
torch.FloatTensor
of shape(batch_size, episode_length, 1)
) — 轨迹中每个状态的回报 - timesteps (
torch.LongTensor
of shape(batch_size, episode_length)
) — 轨迹中每个步骤的时间步 - attention_mask (
torch.FloatTensor
of shape(batch_size, episode_length)
) — 掩码,用于在执行自回归预测时屏蔽动作
返回
transformers.models.decision_transformer.modeling_decision_transformer.DecisionTransformerOutput
或 tuple(torch.FloatTensor)
一个 transformers.models.decision_transformer.modeling_decision_transformer.DecisionTransformerOutput
或一个由
torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含各种
元素,具体取决于配置(DecisionTransformerConfig)和输入。
-
last_hidden_state (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出的隐藏状态序列。 -
state_preds (
torch.FloatTensor
形状为(batch_size, sequence_length, state_dim)
) — 环境状态预测 -
action_preds (
torch.FloatTensor
形状为(batch_size, sequence_length, action_dim)
) — 模型动作预测 -
return_preds (
torch.FloatTensor
形状为(batch_size, sequence_length, 1)
) — 每个状态的预测回报 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) — 由torch.FloatTensor
组成的元组(一个用于嵌入层的输出 + 一个用于每一层的输出),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出处的隐藏状态加上初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
, 可选, 当传递output_attentions=True
或当config.output_attentions=True
时返回) — 由torch.FloatTensor
组成的元组(每一层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力权重在注意力 softmax 之后,用于计算自注意力头中的加权平均值。
DecisionTransformerModel 的 forward 方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import DecisionTransformerModel
>>> import torch
>>> model = DecisionTransformerModel.from_pretrained("edbeeching/decision-transformer-gym-hopper-medium")
>>> # evaluation
>>> model = model.to(device)
>>> model.eval()
>>> env = gym.make("Hopper-v3")
>>> state_dim = env.observation_space.shape[0]
>>> act_dim = env.action_space.shape[0]
>>> state = env.reset()
>>> states = torch.from_numpy(state).reshape(1, 1, state_dim).to(device=device, dtype=torch.float32)
>>> actions = torch.zeros((1, 1, act_dim), device=device, dtype=torch.float32)
>>> rewards = torch.zeros(1, 1, device=device, dtype=torch.float32)
>>> target_return = torch.tensor(TARGET_RETURN, dtype=torch.float32).reshape(1, 1)
>>> timesteps = torch.tensor(0, device=device, dtype=torch.long).reshape(1, 1)
>>> attention_mask = torch.zeros(1, 1, device=device, dtype=torch.float32)
>>> # forward pass
>>> with torch.no_grad():
... state_preds, action_preds, return_preds = model(
... states=states,
... actions=actions,
... rewards=rewards,
... returns_to_go=target_return,
... timesteps=timesteps,
... attention_mask=attention_mask,
... return_dict=False,
... )