keras-rl DDPGAgent 完全指南:在 Keras 中实现面向连续动作空间的深度确定性策略梯度
人工智能强化学习机器学习【免费下载链接】keras-rlDeep Reinforcement Learning for Keras.项目地址https://gitcode.com/gh_mirrors/ke/keras-rl点击查看免费下载导读本文以 keras-rl 仓库中DDPGAgent的官方文档docs/templates/agents/ddpg.md 及其自动生成产物 docs/sources/agents/ddpg.md为核心骨架系统讲解 DDPGDeep Deterministic Policy Gradient在连续动作空间下的原理、Actor/Critic 网络结构约定、全部构造参数语义并借助仓库源码rl/agents/ddpg.py与示例examples/ddpg_pendulum.py深入剖析其训练循环、目标网络更新与探索噪声机制。读完本文你将能够独立用 keras-rl 为 Pendulum 等连续控制任务搭建、编译、训练并评估一个完整的 DDPGAgent。1. DDPGAgent 是什么连续动作空间版的 DQNDDPGAgent是 keras-rl 中面向连续动作空间的 off-policy 强化学习智能体其类定义位于 rl/agents/ddpg.py算法出处为 Lillicrap 等人 2015 年的论文《Continuous control with deep reinforcement learning》arXiv:1509.02971。DDPG 的核心思想可以概括为同时学习一个策略Actor和一个 Q 函数CriticActor策略网络学习一个确定性策略。它的参数更新依赖对 Q 函数使用链式法则——即把策略梯度看成「Q 值对动作的梯度」与「动作对策略参数的梯度」的复合从而朝着最大化期望回报的方向调整策略。CriticQ 函数网络像 Q-Learning 一样基于Bellman 方程更新拟合给定「状态—动作」对下的期望回报。因此从算法家族上看DDPG 可以理解为DQN 在连续动作空间上的扩展DQN 通过离散动作上的max操作选出最佳动作而连续动作空间无法穷举于是 DDPG 改用 Actor 网络直接输出最优动作Critic 则负责给出该动作的 Q 值评估。仓库 READMEREADME.md将 DDPG 列为项目已实现的核心算法之一并同样以 examples/ddpg_pendulum.py 作为官方示例。1.1 类签名来自自动生成文档rl.agents.ddpg.DDPGAgent(nb_actions, actor, critic, critic_action_input, memory, gamma0.99, batch_size32, nb_steps_warmup_critic1000, nb_steps_warmup_actor1000, train_interval1, memory_interval1, delta_rangeNone, delta_clipinf, random_processNone, custom_model_objects{}, target_model_update0.001)该签名由 docs/autogen.py 从DDPGAgent.__init__自动提取并注入模板的{{autogenerated}}占位符生成因此与 rl/agents/ddpg.py 中构造函数的真实参数完全一致。2. Actor 与 Critic 的网络结构约定DDPGAgent 对传入的两个 Keras 模型有严格的输入输出约定理解这些约定是正确使用的前提。2.1 Actor从状态观测到动作输入状态观测state observation输出动作本身连续向量。需要特别注意的是在环境step函数中被执行的「动作」正是 Actor 模型的输出。这与离散动作空间中的 DQN 形成鲜明对比——DQN 的模型学习的是 Q 函数策略从中挑选nb_actions个离散动作之一而 DDPG 的 Actor 直接回归出连续动作值。在 rl/agents/ddpg.py 的select_action中动作通过self.actor.predict_on_batch(batch).flatten()计算并要求结果形状与(nb_actions,)严格一致否则触发断言。2.2 Critic状态与动作的拼接输入输入状态观测与 Actor 所选动作的拼接concatenation输出该「状态—动作」组合下的 Q 值。其中形状为nb_actions的 Keras 输入层要通过参数critic_action_input显式传给 Agent以便它在内部定位动作输入层。2.3 构造时的输入合法性校验DDPGAgent.__init__在构造阶段就会校验模型结构rl/agents/ddpg.pyActor 或 Critic 若有多个输出直接抛出ValueErrorDDPG 要求单一输出若critic_action_input不在 critic 的输入列表中抛出ValueErrorcritic 的输入数量必须至少为 2一个动作输入、一个观测输入。这些校验意味着「Actor 多输出」「Critic 缺动作输入」「Critic 输入不足」等常见错误会在构建 Agent 时立即暴露而非等到训练中途。3. 构造参数详解含默认值与底层语义下表覆盖了构造函数中除三个网络对象外的全部参数。语义均对照 rl/agents/ddpg.py 源码核实参数默认值语义与底层实现nb_actions必填连续动作空间的维度。select_action与训练批次均断言动作形状为(batch, nb_actions)memory必填经验回放缓冲区通常为SequentialMemory见 rl/memory.pygamma0.99折扣因子用于计算r_t gamma * max_a Q(s_{t1}, a)形式的 TD 目标batch_size32每次梯度更新采样的小批量大小nb_steps_warmup_critic1000Critic 的预热步数步数未超过该值时不对 Critic 做梯度更新用于等待回放缓冲积累足够样本nb_steps_warmup_actor1000Actor 的预热步数语义同上train_interval1每多少步执行一次网络训练step % train_interval 0时触发memory_interval1每多少步向回放缓冲写入一条经验delta_rangeNone已弃用。若传入非None源码会发出DeprecationWarning并自动回退为delta_clip delta_range[1]见 rl/agents/ddpg.py请改用delta_clipdelta_clipinfHuber loss 的截断阈值。为inf时退化为纯平方误差MSE见 rl/util.pyrandom_processNone探索噪声过程。训练模式下在 Actor 输出动作上叠加sample()的噪声见 4.2 节custom_model_objects{}克隆目标网络时传递给model_from_config的自定义对象target_model_update0.001目标网络更新策略 1为软更新比例tau 1为每 N 步硬更新一次见 4.3 节3.1 参数校验与软/硬更新判定源码在__init__中对target_model_update做了归一化rl/agents/ddpg.pytarget_model_update 0抛出ValueError 1视为硬更新转为整数表示每 N 步把在线网络权重整体复制到目标网络介于(0, 1)视为软更新按(1 - tau) * old tau * new逐权重混合。delta_range与delta_clip的关系值得单独强调delta_range是历史遗留参数二元组形式当前文档与源码均推荐直接使用单标量的delta_clip。4. 关键机制与源码级原理4.1 Actor 的策略梯度链式法则的工程实现文档指出 Actor 参数更新基于「对 Q 函数应用链式法则」。在源码中这一过程通过组合模型实现rl/agents/ddpg.py取出 critic 除动作输入外的所有状态输入state_inputs在这些输入之上挂接self.actor(state_inputs)得到动作将动作填入 critic 的动作输入槽位得到combined_output critic(combined_inputs)用actor_optimizer.get_updates(paramsactor.trainable_weights, loss-K.mean(combined_output))构造更新即把「最大化 Q 均值」转化为「最小化负 Q 均值」借助链式法则把梯度从 Q 反传到 Actor 参数最终打包成actor_train_fnTensorFlow 后端时额外拼接K.learning_phase()输入。因此Actor 从未用 Keras 自带损失直接训练rl/agents/ddpg.py 用sgd mse编译 Actor 仅用于前向推断真正的策略梯度由上述组合模型显式计算。4.2 探索与平衡Ornstein-Uhlenbeck 随机过程文档强调为了平衡利用exploitation与探索exploration可以引入random_process向 Actor 输出的动作叠加噪声。原论文采用Ornstein-UhlenbeckOU过程它带有惯性、适合物理控制类问题。keras-rl 在 rl/random.py 中实现了OrnsteinUhlenbeckProcess其离散递推为x x_prev theta * (mu - x_prev) * dt current_sigma * sqrt(dt) * N(0, 1)关键参数theta回归速度、mu均值、sigma噪声强度、dt时间步长、size与nb_actions匹配的维度、sigma_min与n_steps_annealing噪声随训练步数线性退火的下限与步数见 rl/random.py 的AnnealedGaussianProcess。噪声只在训练模式下叠加select_action中if self.training and self.random_process is not Nonerl/agents/ddpg.py并断言噪声形状与动作一致。仓库还提供了更简单的GaussianWhiteNoiseProcessrl/random.py作为替代。4.3 目标网络与回放缓冲DQN 同款稳定性手段文档明确指出 DDPG 与 DQN 一样使用经验回放replay buffer与目标网络target networks回放缓冲backward中按memory_interval将(observation, action, reward, terminal)写入 memoryrl/agents/ddpg.py训练时从SequentialMemory.sample(batch_size)抽取不重复的随机批次rl/memory.py。SequentialMemory内部使用自研RingBuffer而非deque以避免随机访问性能问题。目标网络compile时用clone_model复制出target_actor与target_criticrl/agents/ddpg.py。训练中 critic 的 TD 目标由target_actor.predict_on_batch(state1_batch)产生目标动作、再经target_critic得到target_q_values最终构成targets reward gamma * target_q_values * terminal1rl/agents/ddpg.py。软更新实现软更新模式下critic 优化器被包装为AdditionalUpdatesOptimizer其get_updates会在普通梯度更新之外追加get_soft_target_model_updates返回的权重混合更新rl/util.py 与 rl/util.pyactor 侧同样把软更新并入actor_train_fn的updates。硬更新模式则在backward中按step % target_model_update 0调用update_target_models_hardrl/agents/ddpg.py。4.4 Critic 的损失带截断的 Huber lossCritic 以clipped_error为损失rl/agents/ddpg.py即对 TD 误差施加huber_lossrl/util.pydelta_clip inf时退化为0.5 * (y_true - y_pred)^2MSE有限值时误差小于delta_clip用平方项、超过则用线性项提升对大误差的鲁棒性对 TensorFlow 使用tf.select/tf.where对 Theano 使用T.switch。compile还会自动把mean_q追加进指标列表rl/agents/ddpg.py用于观测训练中 Q 值的平均水平示例中额外传入的metrics[mae]也会被加入。4.5 训练时机与预热逻辑backwardrl/agents/ddpg.py是训练循环的核心按memory_interval写入经验仅在step nb_steps_warmup_critic或step nb_steps_warmup_actor且step % train_interval 0时采样训练critic 更新在step nb_steps_warmup_critic后生效actor 更新在step nb_steps_warmup_actor后生效——两个网络可独立预热这正是参数表中两个 warmup 参数分开的原因全部计算采用向量化实现state0_batch、action_batch、reward_batch、terminal1_batch、state1_batch五个批次并有大量形状断言reward_batch.shape (batch_size,)、action_batch.shape (batch_size, nb_actions)等用于提前发现维度错误。4.6 模型持久化Actor 与 Critic 分开存权重save_weights/load_weightsrl/agents/ddpg.py会把传入的文件名拆分为xxx_actor.h5f与xxx_critic.h5f两个文件分别保存。load_weights在加载完成后还会调用update_target_models_hard()同步目标网络。5. 实战示例Pendulum 连续控制完整可运行文档最后指引读者参考 DDPG 的 Pendulum 示例。仓库中的 examples/ddpg_pendulum.py 是一个完整、可直接运行的脚本下面按步骤拆解。5.1 环境准备ENV_NAME Pendulum-v0 env gym.make(ENV_NAME) np.random.seed(123) env.seed(123) assert len(env.action_space.shape) 1 nb_actions env.action_space.shape[0]Pendulum-v0的动作空间是一维连续空间故nb_actions 1断言保证动作空间为向量形式。5.2 构建 Actor确定性策略网络actor Sequential() actor.add(Flatten(input_shape(1,) env.observation_space.shape)) actor.add(Dense(16)) actor.add(Activation(relu)) actor.add(Dense(16)) actor.add(Activation(relu)) actor.add(Dense(16)) actor.add(Activation(relu)) actor.add(Dense(nb_actions)) actor.add(Activation(linear))要点输入为观测加Flatten展平输出层为linear激活且输出维度等于nb_actions保证动作可以是任意连续值。5.3 构建 Critic状态-动作 Q 网络action_input Input(shape(nb_actions,), nameaction_input) observation_input Input(shape(1,) env.observation_space.shape, nameobservation_input) flattened_observation Flatten()(observation_input) x Concatenate()([action_input, flattened_observation]) x Dense(32)(x) x Activation(relu)(x) x Dense(32)(x) x Activation(relu)(x) x Dense(32)(x) x Activation(relu)(x) x Dense(1)(x) x Activation(linear)(x) critic Model(inputs[action_input, observation_input], outputsx)要点critic 是Model而非Sequential显式声明[action_input, observation_input]两个输入动作输入层action_input稍后作为critic_action_input传入 Agent输出维度固定为 1单个 Q 值。5.4 组装 Agent记忆、噪声与配置memory SequentialMemory(limit100000, window_length1) random_process OrnsteinUhlenbeckProcess(sizenb_actions, theta.15, mu0., sigma.3) agent DDPGAgent(nb_actionsnb_actions, actoractor, criticcritic, critic_action_inputaction_input, memorymemory, nb_steps_warmup_critic100, nb_steps_warmup_actor100, random_processrandom_process, gamma.99, target_model_update1e-3) agent.compile(Adam(lr.001, clipnorm1.), metrics[mae])几个值得注意的配置点SequentialMemory(limit100000, window_length1)容量 10 万条经验、观测窗口长度为 1Pendulum 是低维向量观测不需要帧堆叠OU 噪声参数theta.15, mu0., sigma.3与原论文设定一致示例把 warmup 从默认的 1000 步调低到 100 步以加速在简单任务上的收敛compile接受单个优化器如Adam此时 Actor 与 Critic 会各自持有该优化器的一个副本critic_optimizer clone_optimizer(optimizer)见 rl/agents/ddpg.py也可以传入两个优化器的列表分别用于 Actor 与 Critic如集成测试 tests/integration/test_continuous.py 中的agent.compile([Adam(lr1e-3), Adam(lr1e-3)])。5.5 训练、保存与评估agent.fit(env, nb_steps50000, visualizeTrue, verbose1, nb_max_episode_steps200) agent.save_weights(ddpg_{}_weights.h5f.format(ENV_NAME), overwriteTrue) agent.test(env, nb_episodes5, visualizeTrue, nb_max_episode_steps200)fit训练 50000 步visualizeTrue会渲染画面源码在 rl/core.py 中通过Visualizer回调实现示例注释提示可视化会显著拖慢训练且Ctrl C可安全中断save_weights按 4.6 节规则落盘两个权重文件test在trainingFalse模式下运行rl/core.py此时不叠加探索噪声、不写回放缓冲纯评估 5 个回合。6. 测试与验证从单元测试到集成测试仓库对 DDPGAgent 提供了两层自动化验证可作实现正确性的佐证单元测试tests/rl/agents/test_ddpg.py覆盖单观测输入test_single_ddpg_input与多观测输入test_multi_ddpg_input两种场景。后者通过MultiInputProcessor(nb_inputs2)让 Actor/Critic 接收两个观测输入验证了 4.1 节组合模型对多输入 critic 的通用性。集成测试tests/integration/test_continuous.py在真实Pendulum-v0环境中用双优化器配置训练 400 步并测试 2 个回合从端到端验证「构建网络 → 组装 Agent → 编译 → 训练 → 测试」全链路可运行。7. 常见问题与使用建议为什么 Actor 输出层用linear而非tanh文档与示例均采用linear输出因为 DDPG 的确定性策略应能输出任意连续值若环境动作有界可结合环境自身的 clip 机制或自定义处理器处理。warmup 步数太小的后果SequentialMemory.sample在样本不足无法「无放回抽样」时会发出警告并退化为有放回抽样rl/memory.py因此 warmup 应保证缓冲中积累足够多样的经验。delta_range与delta_clipdelta_range已弃用会触发DeprecationWarning并自动回退为delta_clip delta_range[1]新代码请直接使用delta_clip。权重文件命名保存/加载时文件名会被拆分为*_actor.*与*_critic.*两个文件缺失其一将导致加载失败加载后目标网络会自动硬同步。多观测输入的适配当环境返回多路观测如多摄像头画面时需要为 Actor 与 Critic 设计多输入 Keras 模型并配合MultiInputProcessor单元测试 tests/rl/agents/test_ddpg.py 给出了可复用的模板。8. 延伸阅读算法原文《Continuous control with deep reinforcement learning》Lillicrap et al., 2015即文档「References」部分所引论文对应 arXiv:1509.02971keras-rl 文档体系的生成方式见 docs/autogen.py本文档正文即由模板 docs/templates/agents/ddpg.md 中的{{autogenerated}}占位符自动填充DDPGAgent类签名与 docstring 而来同仓库的其他连续控制算法NAFrl/agents/naf.md以及离散动作空间对照实现 DQNrl/agents/dqn.md与 SARSArl/agents/sarsa.md训练/评估循环的通用行为fit、test、compile的完整参数说明见 rl/core.py 与 docs/sources/agents/overview.md。赞分享人工智能强化学习机器学习【免费下载链接】keras-rlDeep Reinforcement Learning for Keras.项目地址https://gitcode.com/gh_mirrors/ke/keras-rl点击查看免费下载相关推荐连续深度Q学习(NAF)keras-rl中处理连续动作空间的终极指南连续深度Q学习 NAF keras rl中处理连续动作空间的终极指南 在强化学习领域处理连续动作空间一直是个技术难点。传统的DQN算法只能处理离散动作而现人工智能强化学习机器学习bilibili-api弹幕处理完全指南从获取到下载再到ASS字幕转换bilibili api弹幕处理完全指南从获取到下载再到ASS字幕转换 想要高效处理B站视频弹幕吗bilibili api弹幕处理功能为你提供完整的解决方案Easy-RL 深度确定性策略梯度DDPG与 TD3连续动作空间强化学习原理与 Pendulum 实战指南Easy RL 深度确定性策略梯度DDPG与 TD3连续动作空间强化学习原理与 Pendulum 实战指南 导读 本文是蘑菇书 Easy RL 第 12教程机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考