DDPG 模型解析,附Pytorch完整代码
DDPG 模型解析
深度确定性策略梯度(DDPG, Deep Deterministic Policy Gradient)是深度强化学习中的一种重要算法,特别适用于连续动作空间的环境。它结合了深度学习和强化学习的思想,使用深度神经网络来逼近策略和价值函数,从而解决复杂的决策问题。
本文将详细解析DDPG模型,包括其基本原理、算法框架、代码示例以及一些关键技术点,帮助你更好地理解和实现DDPG算法。
目录
- 什么是DDPG?
- DDPG的基本思想
DDPG算法的结构
- Actor-Critic架构
- 确定性策略与目标网络
DDPG的核心步骤
- 策略更新
- 值函数更新
- 经验回放
- DDPG的优缺点
- DDPG代码实现
- 总结
1. 什么是DDPG?
DDPG(Deep Deterministic Policy Gradient)是一种基于策略梯度的强化学习算法,适用于具有连续动作空间的环境。与Q-learning等值函数方法不同,DDPG采用了基于策略的学习方式,直接逼近最优策略。DDPG是基于演员-评论员(Actor-Critic)架构的,它结合了深度强化学习中的价值迭代和策略优化思想。
DDPG的目标是通过最大化累积的奖励来训练一个策略,使得智能体能够在复杂环境中做出最佳决策。
2. DDPG的基本思想
DDPG的基本思想是通过两个深度神经网络来逼近值函数和策略:
- 演员网络(Actor Network):负责给出当前状态下的动作决策,是一个确定性策略(Deterministic Policy),即直接输出一个具体的动作,而不像其他强化学习方法那样输出一个动作的概率分布。
- 评论员网络(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值函数的输出,即:
这里,( \mu )是演员网络的参数,( J )是演员的目标函数。
4.2 值函数更新
评论员网络通过Q-learning来更新其Q值函数。目标是最小化Bellman误差:
这里,( Q(s, a) )是评论员网络的Q值,( Q'(s', a') )是目标评论员网络的Q值。
4.3 经验回放
经验回放是强化学习中的一个常见技术,通过存储智能体与环境交互的经验(状态、动作、奖励、下一个状态)并在训练中随机抽取批次来避免样本相关性的问题。DDPG通过经验回放池(Replay Buffer)来存储和重用经验。
4.4 目标网络软更新
为了提高稳定性,目标网络的更新是通过“软更新”进行的。目标网络的参数每次以较小的步长接近主网络的参数:
这里,( \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的原理、算法步骤以及实现方法,希望你能够在理解算法的基础上,顺利地进行代码实现与调试。
评论已关闭