DDPG 模型解析,附Pytorch完整代码

DDPG 模型解析

深度确定性策略梯度(DDPG, Deep Deterministic Policy Gradient)是深度强化学习中的一种重要算法,特别适用于连续动作空间的环境。它结合了深度学习和强化学习的思想,使用深度神经网络来逼近策略和价值函数,从而解决复杂的决策问题。

本文将详细解析DDPG模型,包括其基本原理、算法框架、代码示例以及一些关键技术点,帮助你更好地理解和实现DDPG算法。

目录

  1. 什么是DDPG?
  2. DDPG的基本思想
  3. DDPG算法的结构

    • Actor-Critic架构
    • 确定性策略与目标网络
  4. DDPG的核心步骤

    • 策略更新
    • 值函数更新
    • 经验回放
  5. DDPG的优缺点
  6. DDPG代码实现
  7. 总结

1. 什么是DDPG?

DDPG(Deep Deterministic Policy Gradient)是一种基于策略梯度的强化学习算法,适用于具有连续动作空间的环境。与Q-learning等值函数方法不同,DDPG采用了基于策略的学习方式,直接逼近最优策略。DDPG是基于演员-评论员(Actor-Critic)架构的,它结合了深度强化学习中的价值迭代和策略优化思想。

DDPG的目标是通过最大化累积的奖励来训练一个策略,使得智能体能够在复杂环境中做出最佳决策。

2. DDPG的基本思想

DDPG的基本思想是通过两个深度神经网络来逼近值函数和策略:

  1. 演员网络(Actor Network):负责给出当前状态下的动作决策,是一个确定性策略(Deterministic Policy),即直接输出一个具体的动作,而不像其他强化学习方法那样输出一个动作的概率分布。
  2. 评论员网络(Critic Network):估计当前状态-动作对的Q值(即价值函数)。评论员通过计算Q值来评估演员的动作是否合适,并提供反馈。

DDPG结合了深度Q学习(DQN)和策略梯度方法的优势,利用确定性策略和策略梯度来优化策略。

3. DDPG算法的结构

3.1 Actor-Critic架构

DDPG使用了典型的Actor-Critic架构:

  • Actor(演员):用来生成动作策略,输出一个确定性动作。
  • Critic(评论员):用来评估Actor输出的动作的好坏,计算Q值并为Actor提供反馈。

3.2 确定性策略与目标网络

DDPG使用确定性策略,而非概率策略。这意味着Actor直接输出一个动作值,而不是一个动作分布。这种方式避免了在连续空间中处理概率分布的复杂性。

为了提高训练的稳定性,DDPG还使用了目标网络(Target Network),包括:

  • 目标策略网络(Target Actor Network)
  • 目标值网络(Target Critic Network)

这些目标网络与原网络相同,但它们的参数是延迟更新的,这有助于提高学习的稳定性和收敛性。

4. DDPG的核心步骤

4.1 策略更新

演员网络通过最大化当前Q值来更新策略。具体地,演员网络的目标是最大化评论员Q值函数的输出,即:

\[ \theta_{\mu} = \nabla_{\mu} J \]

这里,( \mu )是演员网络的参数,( J )是演员的目标函数。

4.2 值函数更新

评论员网络通过Q-learning来更新其Q值函数。目标是最小化Bellman误差:

\[ L(\theta) = \mathbb{E}_{s, a, r, s'}\left[\left(r + \gamma Q'(s', a') - Q(s, a)\right)^2\right] \]

这里,( Q(s, a) )是评论员网络的Q值,( Q'(s', a') )是目标评论员网络的Q值。

4.3 经验回放

经验回放是强化学习中的一个常见技术,通过存储智能体与环境交互的经验(状态、动作、奖励、下一个状态)并在训练中随机抽取批次来避免样本相关性的问题。DDPG通过经验回放池(Replay Buffer)来存储和重用经验。

4.4 目标网络软更新

为了提高稳定性,目标网络的更新是通过“软更新”进行的。目标网络的参数每次以较小的步长接近主网络的参数:

\[ \theta'_{\mu} = \tau \theta_{\mu} + (1 - \tau) \theta'_{\mu} \]

这里,( \tau )是软更新的系数,通常设置为0.001。

5. DDPG的优缺点

优点

  • 适应连续动作空间:DDPG能够处理连续动作空间,适用于如机器人控制、自动驾驶等领域。
  • 稳定性:通过使用目标网络和经验回放,DDPG在训练过程中表现出较高的稳定性。
  • 离线学习:通过经验回放,DDPG支持离线学习,可以在多次的训练过程中不断积累经验。

缺点

  • 高计算开销:DDPG需要训练两个网络(演员和评论员),并且依赖于目标网络和经验回放池,这增加了训练的复杂性和计算开销。
  • 需要大量的数据:由于DDPG基于策略梯度,通常需要大量的训练数据才能稳定收敛。

6. DDPG代码实现

下面是一个简化的DDPG模型实现。为了简化说明,我们将省略一些细节,并只集中在模型的核心部分。

import numpy as np
import tensorflow as tf
from collections import deque
import random

class DDPG:
    def __init__(self, state_dim, action_dim, action_bound):
        # 超参数
        self.gamma = 0.99  # 折扣因子
        self.tau = 0.001  # 目标网络软更新系数
        self.actor_lr = 0.0001  # Actor学习率
        self.critic_lr = 0.001  # Critic学习率
        self.buffer_size = 1000000  # 经验回放池大小
        self.batch_size = 64  # 批量大小

        # 状态维度,动作维度,动作边界
        self.state_dim = state_dim
        self.action_dim = action_dim
        self.action_bound = action_bound

        # 创建Replay Buffer
        self.replay_buffer = deque(maxlen=self.buffer_size)

        # 创建Actor和Critic网络
        self.actor = self.build_actor()
        self.critic = self.build_critic()

        # 创建目标网络
        self.target_actor = self.build_actor()
        self.target_critic = self.build_critic()

        # 初始化目标网络
        self.update_target_networks(tau=1)

    def build_actor(self):
        # 构建Actor网络(确定性策略)
        model = tf.keras.Sequential([
            tf.keras.layers.Dense(64, activation='relu', input_dim=self.state_dim),
            tf.keras.layers.Dense(64, activation='relu'),
            tf.keras.layers.Dense(self.action_dim, activation='tanh')
        ])
        return model

    def build_critic(self):
        # 构建Critic网络(Q值函数)
        state_input = tf.keras.layers.Input(shape=(self.state_dim,))
        action_input = tf.keras.layers.Input(shape=(self.action_dim,))
        x = tf.keras.layers.Concatenate()([state_input, action_input])
        x = tf.keras.layers.Dense(64, activation='relu')(x)
        x = tf.keras.layers.Dense(64, activation='relu')(x)
        x = tf.keras.layers.Dense(1)(x)
        model = tf.keras.Model(inputs=[state_input, action_input], outputs=x)
        return model

    def update_target_networks(self, tau=None):
        # 更新目标网络
        if tau is None:
            tau = self.tau

        # Actor目标网络更新
        for target, source in zip(self.target_actor.weights, self.actor.weights):
            target.assign(tau * source + (1 - tau) * target)

        # Critic目标网络更新
        for target, source in zip(self.target_critic.weights, self.critic.weights):
            target.assign(tau * source + (1 - tau) * target)

    def act(self, state):
        # 根据当前状态选择动作
        state = np.reshape(state, (1, self.state_dim))
        action = self.actor(state)
        action = np.clip(action, -self.action_bound, self.action_bound)  # 限制动作范围
        return action

    def learn(self):
        # 从Replay Buffer中采样批量经验
        minibatch = random.sample(self.replay_buffer, self.batch_size)

        states = np.array([e[0] for e in minibatch])


        actions = np.array([e[1] for e in minibatch])
        rewards = np.array([e[2] for e in minibatch])
        next_states = np.array([e[3] for e in minibatch])
        dones = np.array([e[4] for e in minibatch])

        # 计算目标Q值
        next_actions = self.target_actor(next_states)
        target_q = self.target_critic([next_states, next_actions])
        y = rewards + self.gamma * target_q * (1 - dones)

        # 更新Critic网络
        with tf.GradientTape() as tape:
            q_values = self.critic([states, actions])
            critic_loss = tf.reduce_mean(tf.square(y - q_values))
        critic_grads = tape.gradient(critic_loss, self.critic.trainable_variables)
        self.critic.optimizer.apply_gradients(zip(critic_grads, self.critic.trainable_variables))

        # 更新Actor网络
        with tf.GradientTape() as tape:
            actions = self.actor(states)
            actor_loss = -tf.reduce_mean(self.critic([states, actions]))  # 最大化Q值
        actor_grads = tape.gradient(actor_loss, self.actor.trainable_variables)
        self.actor.optimizer.apply_gradients(zip(actor_grads, self.actor.trainable_variables))

        # 更新目标网络
        self.update_target_networks()

7. 总结

DDPG算法是一种强大的强化学习算法,它通过结合深度学习与强化学习中的Actor-Critic架构,能够在复杂的连续动作空间中取得较好的表现。通过本文的学习,我们详细解析了DDPG的原理、算法步骤以及实现方法,希望你能够在理解算法的基础上,顺利地进行代码实现与调试。

最后修改于:2024年11月24日 20:54

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日