Transformers 中的 Decision Transformer:将离线强化学习重构为条件序列建模
2026/9/11 18:50:39 网站建设 项目流程

Transformers 中的 Decision Transformer:将离线强化学习重构为条件序列建模

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

Decision Transformer 是 🤗 Transformers 仓库中一个把离线强化学习(Offline RL)抽象为条件序列建模问题的模型实现。它以 GPT-2 为骨干网络,通过因果掩码 Transformer 直接输出最优动作,而无需拟合价值函数或计算策略梯度。阅读本文后,你将掌握 Decision Transformer 的核心思想、DecisionTransformerConfig全部配置参数的含义、模型前向计算流程,以及如何基于 models/decision_transformer 模块加载预训练权重完成自回归动作预测。

核心思想:把强化学习当作序列建模问题

原论文Decision Transformer: Reinforcement Learning via Sequence Modeling(Lili Chen、Kevin Lu、Aravind Rajeswaran 等人,2021)提出的框架,将强化学习抽象为一个序列建模问题,从而可以直接借用 Transformer 架构的简洁性与可扩展性,以及 GPT-x、BERT 等语言建模领域的相关进展。

与以往"拟合价值函数"或"计算策略梯度"的 RL 方法不同,Decision Transformer 借助因果掩码 Transformer直接输出最优动作:将自回归模型以期望回报(return-to-go)过去的状态动作为条件,模型即可生成能够达成该期望回报的未来动作序列。尽管实现简单,该模型在 Atari、OpenAI Gym 和 Key-to-Door 等任务上取得了与最先进的无模型离线 RL 基线相当甚至更优的表现。

需要特别注意的是:当前仓库中的这一版本模型只适用于"状态为向量"的任务(如 OpenAI Gym 的连续控制环境),不支持图像像素等非向量状态的场景。该模型由 edbeeching 贡献到 Hugging Face Transformers,官方日语文档位于 docs/source/ja/model_doc/decision_transformer.md。

整个模块由三个可独立理解的部分组成:

组件职责
DecisionTransformerConfig模型全部超参数与默认值,定义 RL 环境维度与 GPT 骨干规模
DecisionTransformerGPT2Model去掉位置嵌入的 GPT-2 骨干(含注意力、MLP、LayerNorm 堆叠)
DecisionTransformerModel完整模型:模态嵌入层 + GPT-2 骨干 + 状态/动作/回报预测头

DecisionTransformerConfig:完整参数详解

DecisionTransformerConfig继承自PreTrainedConfig(见 configuration_decision_transformer.py),model_type"decision_transformer",并声明了推理时忽略past_key_values键。它定义了两组参数:一组描述 RL 环境(状态、动作、episode 长度),另一组描述 GPT-2 骨干网络结构。全部参数及其默认值如下:

RL 环境相关参数

参数默认值说明
state_dim17RL 环境的状态向量维度
act_dim4输出动作空间的维度
max_ep_len4096环境中一个 episode 的最大长度(决定时间步嵌入表的大小)
action_tanhTrue动作预测输出后是否施加 tanh 激活(用于把动作约束到合法范围)

GPT 骨干相关参数

参数默认值说明
hidden_size128隐藏层维度,也是各模态嵌入的目标维度
vocab_size1词表大小(本模型实际不使用 token 输入,仅保持与 GPT-2 兼容)
n_positions1024最大位置嵌入长度,映射为max_position_embeddings
n_layer3Transformer 层数,映射为num_hidden_layers
n_head1注意力头数,映射为num_attention_heads
n_innerNoneMLP 中间维度,None时取4 * hidden_size
activation_function"relu"MLP 激活函数,通过ACT2FN映射
resid_pdrop/embd_pdrop/attn_pdrop0.1残差、嵌入、注意力三个位置的 dropout 概率
layer_norm_epsilon1e-5LayerNorm 的 epsilon
initializer_range0.02权重初始化标准差
scale_attn_weightsTrue是否将注意力权重除以sqrt(hidden_size)缩放
scale_attn_by_inverse_layer_idxFalse是否额外按1 / (layer_idx + 1)缩放注意力
reorder_and_upcast_attnFalse混合精度训练时是否在计算点积前缩放 K 并将 softmax 上转为 float32
add_cross_attentionFalse是否加入交叉注意力层(默认关闭)
use_cacheTrue是否启用 KV 缓存
bos_token_id/eos_token_id50256起始/结束 token id(GPT-2 兼容保留字段)

配置中还定义了attribute_map,将通用命名(max_position_embeddingsnum_attention_headsnum_hidden_layers)映射到 GPT-2 风格命名(n_positionsn_headn_layer),这样从预训练权重加载时可以正确对齐。

从配置创建随机初始化模型的官方写法:

>>> from transformers import DecisionTransformerConfig, DecisionTransformerModel >>> # 初始化一个默认配置 >>> configuration = DecisionTransformerConfig() >>> # 由配置创建随机权重模型 >>> model = DecisionTransformerModel(configuration) >>> # 读取模型配置 >>> configuration = model.config

模型架构:DecisionTransformerGPT2Model

DecisionTransformerGPT2Model(源码见 modeling_decision_transformer.py)是完整的 GPT-2 骨干实现,包含:

  • wte:token 嵌入层(保留 GPT-2 结构,但 Decision Transformer 实际不喂 token id);
  • wpe:位置嵌入层;
  • hnum_hidden_layersDecisionTransformerGPT2Block堆叠;
  • ln_f:最终 LayerNorm。

每个DecisionTransformerGPT2Blockln_1 → attention → 残差 → ln_2 → MLP → 残差组成(若开启add_cross_attention还会插入交叉注意力)。其注意力实现DecisionTransformerGPT2Attention直接复用 GPT-2 的代码结构(Conv1D投影、多头拆分、缩放点积注意力),并支持三种注意力量化开关:scale_attn_weightsscale_attn_by_inverse_layer_idxreorder_and_upcast_attn。权重初始化遵循 GPT-2 论文方案——残差路径上的c_proj层权重按initializer_range / sqrt(2 * n_layer)缩放,以抵消深度残差网络中的梯度累积效应。

与标准 GPT-2 唯一的关键差异是:DecisionTransformerGPT2Model虽然保留wpe权重,但在DecisionTransformerModel中调用时传入的位置 id 恒为 0,位置信息改由"时间步嵌入"(timestep embedding)提供。此外,模型通过create_causal_mask构造因果注意力掩码,保证每个 token 只能看到其之前的位置。

DecisionTransformerModel:完整模型与前向流程

DecisionTransformerModel在 GPT-2 骨干之上叠加了 RL 特有的"模态嵌入层"与"预测头":

self.embed_timestep = nn.Embedding(config.max_ep_len, config.hidden_size) # 时间步嵌入 self.embed_return = torch.nn.Linear(1, config.hidden_size) # 回报嵌入 self.embed_state = torch.nn.Linear(config.state_dim, config.hidden_size) # 状态嵌入 self.embed_action = torch.nn.Linear(config.act_dim, config.hidden_size) # 动作嵌入 self.embed_ln = nn.LayerNorm(config.hidden_size) self.predict_state = torch.nn.Linear(config.hidden_size, config.state_dim) # 状态预测头 self.predict_action = nn.Sequential( # 动作预测头 *([nn.Linear(config.hidden_size, config.act_dim)] + ([nn.Tanh()] if config.action_tanh else [])) ) self.predict_return = torch.nn.Linear(config.hidden_size, 1) # 回报预测头

输入格式

forward接收五个必需张量(另加可选attention_mask):

参数形状含义
states(batch_size, episode_length, state_dim)轨迹中每一步的状态
actions(batch_size, episode_length, act_dim)专家策略在当前状态采取的动作(自回归预测时被掩码)
rewards(batch_size, episode_length, 1)每一步的奖励
returns_to_go(batch_size, episode_length, 1)每一步的"待实现回报"(期望回报减去已获奖励的累积)
timesteps(batch_size, episode_length)轨迹中每一步的时间步编号
attention_mask(batch_size, episode_length)1 表示可被注意力关注,0 表示忽略

前向计算流程(源码级拆解)

  1. 模态嵌入:状态、动作、回报分别经各自的线性层投影到hidden_size;时间步经embed_timestep得到位置式嵌入,并加到上述三类嵌入上(代码注释明确指出 "time embeddings are treated similar to positional embeddings")。
  2. 序列堆叠:将三个模态的嵌入堆叠为(R_1, s_1, a_1, R_2, s_2, a_2, ...)的顺序,序列长度变为3 * episode_length,随后过embed_ln做 LayerNorm。由于 GPT 骨干在自回归意义下"由状态预测动作"最为自然,这种交错排列是模型设计的核心。
  3. 掩码堆叠attention_mask同样按三个模态复制堆叠为3 * episode_length长度。
  4. 骨干前向:以inputs_embeds=stacked_inputs(而非 token id)、全零position_ids送入DecisionTransformerGPT2Model,得到last_hidden_state
  5. 重排与预测:输出重排为(batch, episode_length, 3, hidden_size),再按模态维度 permute。其中:
    • action_preds = predict_action(x[:, 1])—— 由状态 token预测下一步动作;
    • state_preds = predict_state(x[:, 2])—— 由状态+动作 token 预测下一状态;
    • return_preds = predict_return(x[:, 2])—— 由状态+动作 token 预测下一回报。

输出格式

return_dict=False时返回三元组(state_preds, action_preds, return_preds);否则返回DecisionTransformerOutput数据类,包含state_preds(形状(batch_size, sequence_length, state_dim))、action_preds(形状(batch_size, sequence_length, act_dim))、return_preds(形状(batch_size, sequence_length, 1)),以及last_hidden_statehidden_statesattentions

实战:加载预训练权重进行自回归评估

源码 docstring 中给出了完整的评估循环示例(基于 OpenAI Gym 的 Hopper-v3 环境)。核心步骤是:先以目标回报初始化returns_to_go,每步用模型预测动作,执行环境步进后更新状态与"待实现回报":

>>> from transformers import DecisionTransformerModel >>> import torch >>> model = DecisionTransformerModel.from_pretrained("edbeeching/decision-transformer-gym-hopper-medium") >>> 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) >>> # 前向传播 >>> 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, ... )

测试与集成验证:输出形状与自回归行为

仓库的测试套件 tests/models/decision_transformer/test_modeling_decision_transformer.py 从三个层面验证了上述行为:

  • 形状校验create_and_check_model):断言state_predsaction_predsreturn_preds分别与输入状态、动作、回报形状一致,且last_hidden_state形状为(batch_size, seq_length * 3, hidden_size)——正是三个模态堆叠的结果(测试注释明确写着 "seq length *3 as there are 3 modalities: states, returns and actions")。
  • 前向签名校验test_forward_signature):通过inspect.signature断言forward的前六个位置参数依次为statesactionsrewardsreturns_to_gotimestepsattention_mask
  • 自回归集成测试test_autoregressive_prediction):加载edbeeching/decision-transformer-gym-hopper-expert预训练权重,模拟两个时间步的闭环评估——每步用模型预测动作,更新状态、returns_to_gopred_return = returns_to_go - reward)与timesteps,并将预测动作与期望输出做数值比对(rtol/atol 均为 1e-4)。该测试完整展示了"预测-步进-拼接"的在线推理闭环。

总结

在 🤗 Transformers 仓库中,Decision Transformer 的实现把"条件序列建模"这一思想落到了可复用的工程代码上:DecisionTransformerConfig让环境维度与网络规模完全参数化,DecisionTransformerGPT2Model提供经过时间步嵌入改造的 GPT-2 骨干,而DecisionTransformerModel通过三模态嵌入堆叠与三个预测头,实现了"给定期望回报与历史轨迹,自回归生成最优动作"的完整能力。理解这一实现,是进一步阅读其代码、改造适配新环境或复现离线 RL 实验的起点。

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询