ML-Agents On/Off-Policy Trainer 架构解析:PPO 与 SAC 训练器源码级指南

发布时间:2026/9/20 14:23:27
ML-Agents On/Off-Policy Trainer 架构解析:PPO 与 SAC 训练器源码级指南 人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载本文以 Unity ML-Agents Toolkit 仓库中 Python-On-Off-Policy-Trainer-Documentation.md 为骨架结合ml-agents/mlagents/trainers下训练器实际源码系统讲解 on-policyPPO与 off-policySAC训练器的类层级、核心 API、更新流程与配置参数。读完本文你将理解 Trainer 体系的继承关系、训练循环中收集轨迹—更新策略—发布新策略的完整链路并能看懂并编写对应训练器的 YAML 配置文件。一、训练器体系总览从 Trainer 到 PPO/SAC 的三级继承从文档与源码结构看ML-Agents 的训练器Trainer采用三级抽象继承Trainer (abc.ABC) # ml-agents/mlagents/trainers/trainer/trainer.py └── RLTrainer (Trainer) # 使用 Reward Signals 的训练器基类 ├── OnPolicyTrainer (RLTrainer) # PPO 算法实现 └── OffPolicyTrainer (RLTrainer) # SAC 算法实现trainer.py 定义了所有训练器共有的抽象基类Trainerrl_trainer.py 中RLTrainer是使用奖励信号Reward Signals的训练器的基类文档原文明确RLTrainer(Trainer)This class is the base class for trainers that use Reward Signalson_policy_trainer.py 中OnPolicyTrainer是 PPO 算法的实现源码头注释引用 arxiv.org/abs/1707.06347off_policy_trainer.py 中OffPolicyTrainer是 SAC 算法的实现源码头注释引用 arxiv.org/abs/1801.01290并支持离散动作与循环网络。在运行层面mlagents-learn根据配置文件中每个 behavior 的trainer_type字段创建对应训练器ppo映射到 ppo/trainer.py继承 OnPolicyTrainersac映射到 sac/trainer.py继承 OffPolicyTrainer多智能体场景还有基于 on-policy 的 poca/trainer.py 类签名为class Trainer(abc.ABC)其__init__签名与参数含义def __init__( self, brain_name: str, # Brainbehavior名称即要训练的行为名 trainer_settings: TrainerSettings, # 训练器参数TrainerSettings 对象 training: bool, # 是否处于训练模式 load: bool, # 是否加载已保存的模型 artifact_path: str, # 训练产物模型、检查点的存储目录 reward_buff_cap: int 1, # 奖励缓冲最大容量默认 1 ):文档与源码trainer.py共同定义了它负责收集经验并训练神经网络模型的职责。其核心属性与方法如下成员类型说明stats_reporterproperty返回与该训练器关联的 StatsReporter用于向 TensorBoard 输出统计parametersproperty返回TrainerSettings类型的训练器参数get_max_stepsproperty返回最大训练步数用于判断何时停止训练get_stepproperty返回训练器已执行的步数threadedproperty是否在线程中运行训练器。True允许训练器在环境采样的同时更新策略False则强制严格的 on-policy 更新即采样时不更新策略should_still_trainproperty是否应继续训练。源码实现为self.is_training and self.get_step self.get_max_steps即未训练或达到 max_steps 时返回 Falsereward_bufferproperty返回Deque[float]类型的奖励缓冲保存最近若干个已完成 episode 的累计奖励save_model()abstractmethod保存与该训练器关联的一个或多个策略的模型文件end_episode()abstractmethodepisode 结束信号必须重置缓冲仅在 Academy 重置时调用create_policy()abstractmethod创建 Policy 对象add_policy()abstractmethod将策略添加到训练器get_policy(name_behavior_id)方法按完整 behavior 名获取关联策略advance()abstractmethod推进训练器典型实现是从所有已订阅的轨迹队列trajectory_queues取出轨迹并用其中的 step 更新策略必要时把新策略推送到策略队列policy_queuespublish_policy_queue()方法注册一个策略队列训练器更新策略后向该队列发布新策略subscribe_trajectory_queue()方法注册一个轨迹队列训练器从该队列摄取 Trajectorythreaded属性是区分严格 on-policy 训练的关键开关当为False时训练器与环境采样同步推进策略更新发生在采样间隙保证用于更新的数据全部来自当前策略当为True时训练器在独立线程中边采样边更新吞吐更高但策略更新时可能有部分轨迹来自旧策略。三、RLTrainer奖励信号与训练循环的中枢rl_trainer.py 中RLTrainer(Trainer)是所有使用奖励信号训练器的基类。文档列出的核心方法def end_episode(self) - None: ... abc.abstractmethod def create_optimizer(self) - TorchOptimizer: ... def save_model(self) - None: ... def advance(self) - None: ...各方法在源码中的实际语义end_episode将collected_rewards中所有 reward signal 的累计奖励清零。collected_rewards是一个奖励信号名 → agent_id → 累计奖励的字典其中environment条目始终保留环境奖励必须上报 TensorBoard无论配置了哪些奖励信号。create_optimizer抽象方法返回TorchOptimizer对象由子类PPO/SAC各自实现。save_model保存与训练器关联的策略。实现会先调用_checkpoint()生成检查点再通过TorchModelSaver.copy_final_model()复制出最终的.onnx模型文件并调用ModelCheckpointManager.track_final_checkpoint()登记最终检查点。advance训练循环的主入口rl_trainer.py。它先遍历所有trajectory_queues消费队列中的轨迹_process_trajectory随后在should_still_train且_is_ready_update()为真时调用_update_policy()若更新成功则把更新后的策略放入所有policy_queues供环境侧 AgentProcessor 取用。注释特别说明每次最多抓取队列最大长度数量的轨迹确保队列中的轨迹是 on-policy 的。此外RLTrainer 还管理检查点与摘要的写入节奏_maybe_save_model()按checkpoint_interval间隔保存检查点_maybe_write_summary()按summary_freq间隔写 TensorBoard 摘要二者都确保在更新步写入而不是采样过程中写入。_increment_step()同步推进训练器步数与策略步数。四、OnPolicyTrainerPPO 算法的落地实现4.1 类定义与构造参数class OnPolicyTrainer(RLTrainer)文档明确指出The PPOTrainer is an implementation of the PPO algorithm即 OnPolicyTrainer 就是 PPO 训练器。其__init__签名def __init__( self, behavior_name: str, # 与训练器配置关联的 behavior 名 reward_buff_cap: int, # 奖励缓冲中追踪的最大奖励历史 trainer_settings: TrainerSettings, # 训练器参数 training: bool, # 是否处于训练模式 load: bool, # 是否加载模型 seed: int, # 模型初始化使用的随机种子 artifact_path: str, # 训练产物存储目录 ):源码中on_policy_trainer.py构造器将trainer_settings.hyperparameters强制转换为OnPolicyHyperparamSettings并保存seed、预留policy与optimizer字段。其职责是收集经验并训练一个 on-policy 模型。4.2 add_policy注册策略并初始化优化器def add_policy(self, parsed_behavior_id: BehaviorIdentifiers, policy: Policy) - None:实现要点若已有策略存在则输出警告你的环境包含多个 team但该训练器不支持对抗游戏如需训练对抗游戏请启用 self-play保存策略到self.policy与self.policies[behavior_id]调用create_optimizer()创建优化器并为每个 reward signal 初始化累计奖励计数器通过model_saver.register()注册策略与优化器然后initialize_or_load()按load标志决定初始化新模型或加载已有模型以policy.get_current_step()恢复训练步数保证断点续训时步数连续。4.3 _update_policyPPO 的 minibatch 更新流程这是 on-policy 训练的核心on_policy_trainer.py就绪判断_is_ready_update()检查update_buffer.num_experiences hyperparameters.buffer_size即缓冲中经验数超过buffer_size才触发更新。batch 对齐序列长度batch_size batch_size - batch_size % policy.sequence_length且保证至少一个序列max(batch_size, sequence_length)因为训练时要重塑为batch_size × sequence_length张量n_sequences即batch_size / sequence_length。优势标准化读取缓冲中的 ADVANTAGES做 z-score 标准化(advantages - mean) / (std 1e-10)。多 epoch 小批量循环按num_epoch轮次每轮对update_buffer.shuffle(sequence_length...)打乱然后切出max_num_batch个 minibatch逐个调用optimizer.update(minibatch, n_sequences)与optimizer.update_reward_signals(minibatch)把统计量汇总到batch_update_stats。统计上报对每个统计项取均值写入 stats reporter。行为克隆若配置了bc_module行为克隆额外调用bc_module.update()并上报其统计。清空缓冲_clear_update_buffer()重置 update buffer进入下一轮数据收集。4.4 与其他 on-policy 变体的关系从源码结构看PPO 与 POCA 都是 on-policy 家族OnPolicyTrainer作为通用 on-policy 基类被 ppo/trainer.py 与 poca/trainer.py 复用区别在于各自创建不同的优化器与策略。这正是on-policy训练的统一特征策略更新所消耗的经验必须来自当前策略的采样因此每次更新后缓冲会被清空重建。五、OffPolicyTrainerSAC 算法的落地实现5.1 类定义与构造参数class OffPolicyTrainer(RLTrainer)文档指出The SACTrainer is an implementation of the SAC algorithm, with support for discrete actions and recurrent networks——即 off-policy 训练器就是 SAC 实现且同时支持离散动作与循环recurrent网络。其__init__签名与 OnPolicyTrainer 完全一致behavior_name、reward_buff_cap、trainer_settings、training、load、seed、artifact_path。构造器中off_policy_trainer.py额外初始化了 off-policy 特有的节奏参数self.update_steps 1 # 策略更新次数计数 self.reward_signal_update_steps 1 # 奖励信号更新次数计数 self.steps_per_update hyperparameters.steps_per_update self.reward_signal_steps_per_update hyperparameters.reward_signal_steps_per_update self.checkpoint_replay_buffer hyperparameters.save_replay_buffer5.2 经验回放缓冲save/load replay bufferoff-policy 与 on-policy 最本质的区别在于经验可以重复利用存入回放缓冲反复采样。为此 OffPolicyTrainer 重写了模型保存相关方法def save_model(self) - None: ... # 保存最终模型并顺带保存回放缓冲 def save_replay_buffer(self) - None: ... # 将更新缓冲保存为 pickle 文件 def load_replay_buffer(self) - None: ... # 从文件加载最近一次保存的回放缓冲save_model()Saves the final training model to memory. Overrides the default to save the replay buffer.——在调用基类save_model()后若checkpoint_replay_buffer为真追加调用save_replay_buffer()。save_replay_buffer()把update_buffer序列化到os.path.join(artifact_path, last_replay_buffer.hdf5)并打印保存的文件大小日志。load_replay_buffer()从同一路径读取缓冲load_from_file后记录加载的经验数量。maybe_load_replay_buffer()会在load标志且checkpoint_replay_buffer为真时尝试加载若文件缺失FileNotFoundError或格式异常AttributeError则警告从零开始。5.3 就绪判断与更新节奏def _is_ready_update(self) - bool: return ( self.update_buffer.num_experiences self.hyperparameters.batch_size and self._step self.hyperparameters.buffer_init_steps )即缓冲中经验数达到batch_size且已走完buffer_init_steps步预热buffer warm-up。这与 on-policy 的缓冲超过 buffer_size判据完全不同。_update_policy()off_policy_trainer.py按步数比例循环更新策略只要(self._step - buffer_init_steps) / self.update_steps self.steps_per_update就继续采样 minibatch 并调用optimizer.update()每次更新update_steps 1。随后_update_reward_signals()用独立的reward_signal_steps_per_update节奏单独更新奖励信号模拟 arxiv.org/abs/1809.02925 等论文中策略更新 N 次后再更新奖励信号 N 次的做法。最后若缓冲超过buffer_size按BUFFER_TRUNCATE_PERCENT 0.8的比例截断truncate(int(buffer_size * 0.8), sequence_length)避免每次更新都触发大缓冲截断。5.4 add_policy恢复训练节奏与 OnPolicyTrainer 类似add_policy()注册策略、创建优化器、初始化模型保存器不同之处在于它还根据当前步数恢复更新节奏计数self._step policy.get_current_step() self.update_steps int(max(1, self._step / self.steps_per_update)) self.reward_signal_update_steps int(max(1, self._step / self.reward_signal_steps_per_update))这样断点续训后策略更新与奖励信号更新频率能正确衔接历史节奏。六、配置参数解析On/Off-Policy 超参数与 TrainerSettings训练器参数在 settings.py 中以attrs类定义并在TrainerSettings.structure()中根据trainer_type动态选择超参数类完成 YAML 反序列化strict_to_cls(d_copy[key], all_trainer_settings[trainer_type])同时调用check_hyperparam_schedules()校验学习率调度。6.1 通用超参数 HyperparamSettingsbatch_size: int 1024 # 每次更新使用的经验批量大小 buffer_size: int 10240 # 经验缓冲容量 learning_rate: float 3.0e-4 # 学习率 learning_rate_schedule: ScheduleType ScheduleType.CONSTANT # constant 或 linear6.2 OnPolicyHyperparamSettingsclass OnPolicyHyperparamSettings(HyperparamSettings): num_epoch: int 3 # 每轮更新中遍历缓冲的 epoch 数on-policy 训练器额外只有num_epochPPO 的多轮 minibatch 迭代次数见 4.3 节。ScheduleType枚举目前仅支持CONSTANT与LINEAR两种源码注释留有 lesson 调度的 TODO。6.3 OffPolicyHyperparamSettingsclass OffPolicyHyperparamSettings(HyperparamSettings): batch_size: int 128 # 每次采样更新的 minibatch 大小 buffer_size: int 50000 # 回放缓冲容量 buffer_init_steps: int 0 # 开始更新前需收集的步数预热 steps_per_update: float 1 # 每步平均触发的策略更新次数1 表示每步更新一次 save_replay_buffer: bool False # 是否保存回放缓冲.hdf5 reward_signal_steps_per_update: float 4 # 奖励信号更新的节奏注意 off-policy 的默认batch_size与buffer_size显著不同于 on-policySAC 用小批量128从大缓冲50000中反复随机采样sample_mini_batch这正是经验复用的体现而 PPO 需要缓冲攒够buffer_size如 12000后一次性全部用于多轮更新。6.4 TrainerSettings训练器顶层配置settings.py 中TrainerSettings的核心字段字段默认值说明trainer_typeppo训练器类型ppo / sac / poca 等hyperparameters按 trainer_type 自动选择超参数对象network_settingsNetworkSettings()网络结构hidden_units128、num_layers2、memory、normalize 等reward_signals{extrinsic: RewardSignalSettings()}奖励信号字典默认只含外部奖励checkpoint_interval500000检查点保存间隔keep_checkpoints5保留的检查点数量even_checkpointsFalse为 True 时按max_steps / keep_checkpoints均分检查点间隔max_steps500000最大训练步数time_horizon64时间视野轨迹截断步数summary_freq50000TensorBoard 摘要写入间隔threadedFalse是否线程化见 2 节init_pathNone初始化模型路径self_playNone自博弈设置behavioral_cloningNone行为克隆设置demo_path、steps、strength 等其中reward_signals支持extrinsic、gail、curiosity、rnd四种类型见RewardSignalType枚举settings.py每个信号由RewardSignalSettings定义gamma默认 0.99、strength默认 1.0与network_settings若配置中出现已废弃的encoding_size系统会警告并将其映射为network_settings.hidden_units。6.5 完整的 YAML 配置示例仓库 config/ppo/3DBall.yaml 给出了 on-policy 训练器的完整配置behaviors: 3DBall: trainer_type: ppo hyperparameters: batch_size: 64 buffer_size: 12000 learning_rate: 0.0003 beta: 0.001 epsilon: 0.2 lambd: 0.99 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: true hidden_units: 128 num_layers: 2 vis_encode_type: simple reward_signals: extrinsic: gamma: 0.99 strength: 1.0 keep_checkpoints: 5 max_steps: 500000 time_horizon: 1000 summary_freq: 12000其中beta、epsilon、lambd是 PPO 特有的优化参数KL 惩罚系数、裁剪阈值、GAE 系数属于 ppo/trainer.py 定义的 PPO 优化器专属字段。SAC 的对应示例见 config/sac/3DBall.yaml其超参数会使用buffer_init_steps、steps_per_update、save_replay_buffer等 off-policy 字段。更多字段说明可查阅 Training-Configuration-File.md。七、参数随机化、课程学习与命令行装配文档后半部分集中描述了与训练器配置紧密相关的辅助设置类它们是环境参数 → 训练过程的桥梁7.1 参数随机化采样器ParameterRandomizationSettings抽象类定义了通过EnvironmentParametersChannel向环境下发采样器设置的apply(key, env_channel)抽象方法并借助structure/unstructure静态方法与 cattrs 注册钩子完成 YAML 与对象的互转。文档列出的四个具体采样器ConstantSettings常量采样器value字段apply调用env_channel.set_float_parameter(key, value)YAML 中直接写一个 float 即可触发structure会把 float/int 转成ConstantSettings。UniformSettings均匀采样器min_value默认 0.0、max_value默认 1.0校验min_value max_valueapply调用set_uniform_sampler_parameters(key, min, max, seed)。GaussianSettings高斯采样器mean默认 1.0、st_dev默认 1.0apply调用set_gaussian_sampler_parameters(key, mean, st_dev, seed)。MultiRangeUniformSettings多区间均匀采样器intervals为[min, max]列表校验每个区间恰好两个值且 min ≤ maxapply调用set_multirangeuniform_sampler_parameters(key, intervals, seed)。对应枚举ParameterRandomizationType提供uniform、gaussian、multirangeuniform、constant四类配置中必须同时给出sampler_type与sampler_parameters否则抛出TrainerConfigError。7.2 课程学习CompletionCriteria 与 LessonCompletionCriteriaSettings判断下一课lesson是否开始的依据字段包括behavior参照的 behavior 名、measureprogress或reward默认 reward、min_lesson_length最小 episode 数默认 0、signal_smoothing奖励平滑默认 True、threshold阈值measure 为 progress 时必须介于 0~1、require_reset。核心方法need_increment(progress, reward_buffer, smoothing)返回(是否进入下一课, 新的平滑值)按 reward 度量时若启用平滑则measure 0.25 * smoothing 0.75 * measure再与阈值比较。Lesson单个课程的数据结构包含环境参数名name、采样器value与completion_criteria若 completion_criteria 为 None 则是课程链中的最后一课。EnvironmentParameterSettings一个环境参数按顺序排列的课程列表curriculum: List[Lesson]。structure会校验课程链非末课必须有completion_criteria末课不得携带completion_criteria带了只告警忽略若配置不是带curriculum的映射则视为单课课程直接用采样器配置包装成唯一的 Lesson。7.3 检查点与运行选项CheckpointSettings封装命令行级检查点选项run_id、initialize_from、load_model、resume、force、train_model、inference、results_dir提供write_path、maybe_init_path、run_logs_dir路径属性。prioritize_resume_init()解决冲突若命令行同时给了resume与initialize_from优先 resume 并告警仅 YAML 同时设置时同样优先 resume。RunOptionsmlagents-learn运行时所有选项的汇总behaviors、env_settings、engine_settings、environment_parameters、checkpoint_settings、torch_settings、debug。静态方法from_argparse(args)读取parse_command_line产生的 argparse.Namespace加载 YAML 配置文件再用命令行非默认参数覆盖 YAML 值最终构造RunOptionsTrainerSettings.structure中的deep_update_dict支持对嵌套 dict 做递归合并这正是default_settings behaviors 覆盖机制的底层实现。八、总结如何选择 On-Policy 与 Off-Policy 训练器OnPolicyTrainerPPO策略更新的经验必须来自当前策略缓冲攒满buffer_size后整体用于num_epoch轮 minibatch 更新再清空。适合大多数单智能体、环境奖励稀疏度适中的任务threadedFalse可保证严格 on-policy 语义。OffPolicyTrainerSAC经验存入大容量回放缓冲反复随机采样通过steps_per_update控制更新频率支持离散动作与循环网络并可将回放缓冲保存为last_replay_buffer.hdf5供断点续训复用适合样本效率要求高、奖励稠密或动作空间较大的任务。无论是哪一类其训练循环都统一遵循 Trainer 基类定义的轨迹队列消费 →_update_policy()→ 策略队列发布模式差异仅在于何时算就绪、如何从缓冲取数据、如何更新优化器与奖励信号。进一步阅读训练配置完整参考见 Training-Configuration-File.md训练器源码入口在 trainer/所有官方示例配置位于 config/ 下的ppo/、sac/、poca/、imitation/目录。赞分享人工智能强化学习深度学习机器学习游戏开发AI 应用【免费下载链接】ml-agentsThe Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement learning and imitation learning.项目地址https://gitcode.com/gh_mirrors/ml/ml-agents点击查看免费下载相关推荐verl 完全异步 PPO 训练框架Fully Async Policy实战指南解耦 Trainer 与 Rollouter 的流式 RL 后训练verl 完全异步 PPO 训练框架Fully Async Policy实战指南解耦 Trainer 与 Rollouter 的流式 RL 后训练 导读人工智能大模型强化学习RLHF分布式训练微调突破训练瓶颈ML-Agents分布式训练架构全解析突破训练瓶颈ML Agents分布式训练架构全解析 你是否还在为AI模型训练速度慢而烦恼面对复杂环境和大量智能体Agent时单GPU训练往往需要数天甚人工智能强化学习深度学习机器学习游戏开发AI 应用verl 全异步策略训练Fully Async Policy Trainer指南解耦 Rollouter 与 Trainer 的流式 RL 后训练verl 全异步策略训练Fully Async Policy Trainer指南解耦 Rollouter 与 Trainer 的流式 RL 后训练 ver人工智能大模型强化学习RLHF分布式训练微调创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询