使用PyTorch实现深度Q网络(DQN)的深度强化学习示例

本文介绍了如何使用PyTorch实现深度Q网络(DQN)进行深度强化学习。通过定义神经网络模型表示Q函数,并创建代理类执行DQN算法,包括选择动作、存储经验及学习更新。示例中,应用DQN于OpenAI Gym的CartPole环境,目标是维持小车平衡。
摘要由CSDN通过智能技术生成

深度强化学习是一种结合了深度学习和强化学习的方法,它使用深度学习模型来表示和学习环境的复杂性,同时使用强化学习的方法来进行决策和优化。下面是一个使用PyTorch实现的深度Q网络(DQN)的例子,这是一种常用的深度强化学习算法。  首先,我们需要定义一个神经网络模型来表示Q函数。这个模型接收一个状态作为输入,输出每个动作的Q值。

import torch
import torch.nn as nn

class DQN(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(DQN, self).__init__()
        self.fc1 = nn.Linear(input_dim, 128)
        self.fc2 = nn.Linear(128, 128)
        self.fc3 = nn.Linear(128, output_dim)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        return self.fc3(x)

然后,我们需要定义一个代理类来实现DQN的学习算法。这个类需要实现以下几个主要的方法:

  • select_action:根据当前的状态和Q函数选择一个动作。
  • store_transition:存储一次转移的经验,包括当前状态、动作、奖励和下一个状态。
  • learn:从存储的经验中随机抽取一批经验,
深度强化学习是一种将深度学习和强化学习相结合的技术,可以用于解决许多复杂的控制问题。在这里,我将给出一个使用PyTorch实现深度强化学习的简单示例代码。代码将使用DQN算法来解决经典的CartPole问题。 首先,我们需要导入所需的库: ```python import random import numpy as np import gym import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from collections import deque ``` 接下来,我们需要定义智能体的神经网络模型。在这个例子中,我们将使用一个简单的全连接网络,它将接收状态作为输入,并输出每个可能的动作的Q值。在这里,我们定义了一个名为DQN的类,它继承自PyTorch的nn.Module类: ```python class DQN(nn.Module): def __init__(self, state_dim, action_dim): super(DQN, self).__init__() self.fc1 = nn.Linear(state_dim, 64) self.fc2 = nn.Linear(64, 64) self.fc3 = nn.Linear(64, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x ``` 然后,我们需要定义一个经验回放缓冲区,它将存储智能体的经验,以便我们可以从中随机抽样来训练神经网络。在这里,我们使用Python的deque库来实现缓冲区: ```python class ReplayBuffer(): def __init__(self, capacity): self.buffer = deque(maxlen=capacity) def push(self, state, action, reward, next_state, done): self.buffer.append((state, action, reward, next_state, done)) def sample(self, batch_size): state, action, reward, next_state, done = zip(*random.sample(self.buffer, batch_size)) return np.array(state), np.array(action), np.array(reward), np.array(next_state), np.array(done) def __len__(self): return len(self.buffer) ``` 接下来,我们需要定义一个函数来执行智能体的动作,这个函数将负责根据当前状态选择一个动作。在这里,我们将使用epsilon-greedy策略,该策略以epsilon的概率随机选择一个动作,以1-epsilon的概率选择当前Q值最大的动作: ```python def select_action(state, epsilon): if random.random() < epsilon: return env.action_space.sample() else: state = torch.FloatTensor(state).unsqueeze(0).to(device) q_value = policy_net(state) return q_value.max(1)[1].item() ``` 然后,我们需要定义训练函数。在这个函数中,我们将执行一系列动作,并将经验存储在经验回放缓冲区中。然后,我们将从缓冲区中抽样一批经验,并使用它来训练神经网络。在这里,我们将使用Huber损失函数来计算Q值的误差: ```python def train(batch_size, gamma): if len(buffer) < batch_size: return state, action, reward, next_state, done = buffer.sample(batch_size) state = torch.FloatTensor(state).to(device) next_state = torch.FloatTensor(next_state).to(device) action = torch.LongTensor(action).to(device) reward = torch.FloatTensor(reward).to(device) done = torch.FloatTensor(done).to(device) q_value = policy_net(state).gather(1, action.unsqueeze(1)).squeeze(1) next_q_value = target_net(next_state).max(1)[0] expected_q_value = reward + gamma * next_q_value * (1 - done) loss = F.smooth_l1_loss(q_value, expected_q_value.detach()) optimizer.zero_grad() loss.backward() optimizer.step() ``` 最后,我们可以开始训练我们的智能体。在这个例子中,我们将使用CartPole-v0环境,并将训练1000个回合。每个回合将持续最多200个时间步长,并且我们将使用Adam优化器来训练我们的神经网络。在每个回合结束时,我们将更新目标网络,并将epsilon逐渐减小,以使智能体在训练过程中变得更加自信: ```python env = gym.make('CartPole-v0') state_dim = env.observation_space.shape[0] action_dim = env.action_space.n device = torch.device("cuda" if torch.cuda.is_available() else "cpu") policy_net = DQN(state_dim, action_dim).to(device) target_net = DQN(state_dim, action_dim).to(device) target_net.load_state_dict(policy_net.state_dict()) optimizer = optim.Adam(policy_net.parameters(), lr=1e-3) buffer = ReplayBuffer(10000) batch_size = 128 gamma = 0.99 epsilon_start = 1.0 epsilon_final = 0.01 epsilon_decay = 500 for i_episode in range(1000): state = env.reset() epsilon = epsilon_final + (epsilon_start - epsilon_final) * np.exp(-i_episode / epsilon_decay) for t in range(200): action = select_action(state, epsilon) next_state, reward, done, _ = env.step(action) buffer.push(state, action, reward, next_state, done) state = next_state train(batch_size, gamma) if done: break if i_episode % 20 == 0: target_net.load_state_dict(policy_net.state_dict()) print("Episode: {}, score: {}".format(i_episode, t)) ``` 这就是使用PyTorch实现深度强化学习的基本代码。当然,这只是一个简单的例子,实际上,深度强化学习的应用非常广泛,并且还有很多优化技术可以用来提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘家旺1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值