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_dim | 17 | RL 环境的状态向量维度 |
act_dim | 4 | 输出动作空间的维度 |
max_ep_len | 4096 | 环境中一个 episode 的最大长度(决定时间步嵌入表的大小) |
action_tanh | True | 动作预测输出后是否施加 tanh 激活(用于把动作约束到合法范围) |
GPT 骨干相关参数
| 参数 | 默认值 | 说明 |
|---|---|---|
hidden_size | 128 | 隐藏层维度,也是各模态嵌入的目标维度 |
vocab_size | 1 | 词表大小(本模型实际不使用 token 输入,仅保持与 GPT-2 兼容) |
n_positions | 1024 | 最大位置嵌入长度,映射为max_position_embeddings |
n_layer | 3 | Transformer 层数,映射为num_hidden_layers |
n_head | 1 | 注意力头数,映射为num_attention_heads |
n_inner | None | MLP 中间维度,None时取4 * hidden_size |
activation_function | "relu" | MLP 激活函数,通过ACT2FN映射 |
resid_pdrop/embd_pdrop/attn_pdrop | 0.1 | 残差、嵌入、注意力三个位置的 dropout 概率 |
layer_norm_epsilon | 1e-5 | LayerNorm 的 epsilon |
initializer_range | 0.02 | 权重初始化标准差 |
scale_attn_weights | True | 是否将注意力权重除以sqrt(hidden_size)缩放 |
scale_attn_by_inverse_layer_idx | False | 是否额外按1 / (layer_idx + 1)缩放注意力 |
reorder_and_upcast_attn | False | 混合精度训练时是否在计算点积前缩放 K 并将 softmax 上转为 float32 |
add_cross_attention | False | 是否加入交叉注意力层(默认关闭) |
use_cache | True | 是否启用 KV 缓存 |
bos_token_id/eos_token_id | 50256 | 起始/结束 token id(GPT-2 兼容保留字段) |
配置中还定义了attribute_map,将通用命名(max_position_embeddings、num_attention_heads、num_hidden_layers)映射到 GPT-2 风格命名(n_positions、n_head、n_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:位置嵌入层;h:num_hidden_layers个DecisionTransformerGPT2Block堆叠;ln_f:最终 LayerNorm。
每个DecisionTransformerGPT2Block由ln_1 → attention → 残差 → ln_2 → MLP → 残差组成(若开启add_cross_attention还会插入交叉注意力)。其注意力实现DecisionTransformerGPT2Attention直接复用 GPT-2 的代码结构(Conv1D投影、多头拆分、缩放点积注意力),并支持三种注意力量化开关:scale_attn_weights、scale_attn_by_inverse_layer_idx、reorder_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 表示忽略 |
前向计算流程(源码级拆解)
- 模态嵌入:状态、动作、回报分别经各自的线性层投影到
hidden_size;时间步经embed_timestep得到位置式嵌入,并加到上述三类嵌入上(代码注释明确指出 "time embeddings are treated similar to positional embeddings")。 - 序列堆叠:将三个模态的嵌入堆叠为
(R_1, s_1, a_1, R_2, s_2, a_2, ...)的顺序,序列长度变为3 * episode_length,随后过embed_ln做 LayerNorm。由于 GPT 骨干在自回归意义下"由状态预测动作"最为自然,这种交错排列是模型设计的核心。 - 掩码堆叠:
attention_mask同样按三个模态复制堆叠为3 * episode_length长度。 - 骨干前向:以
inputs_embeds=stacked_inputs(而非 token id)、全零position_ids送入DecisionTransformerGPT2Model,得到last_hidden_state。 - 重排与预测:输出重排为
(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_state、hidden_states、attentions。
实战:加载预训练权重进行自回归评估
源码 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_preds、action_preds、return_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的前六个位置参数依次为states、actions、rewards、returns_to_go、timesteps、attention_mask。 - 自回归集成测试(
test_autoregressive_prediction):加载edbeeching/decision-transformer-gym-hopper-expert预训练权重,模拟两个时间步的闭环评估——每步用模型预测动作,更新状态、returns_to_go(pred_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),仅供参考