在这一小节中,我们将学习如何使用 PyTorch
实现一个简单的强化学习项目。强化学习(Reinforcement Learning, RL)是机器学习的一个重要分支,关注的是如何基于经验和反馈来作出决策。
1. 强化学习基础
强化学习的基本思想是智能体(Agent)在环境(Environment)中进行交互,通过获得的反馈(奖励)来学习最优策略。强化学习主要由以下几个元素组成:
- 环境(Environment):智能体与之交互的场景。
- 状态(State, S):环境在某一时刻的描述。
- 动作(Action, A):智能体在某一状态下可以采取的行为。
- 奖励(Reward, R):智能体在某一状态下采取某一动作后获得的反馈。
- 策略(Policy, π):智能体基于当前状态选择动作的机制。
2. 项目概述
在这个项目中,我们将实现一个基于 Deep Q-Network
(DQN) 的智能体,该智能体将在 OpenAI 的 CartPole
环境中进行训练。我们的目标是使智能体能够有效地平衡一根竖立的杆子。
3. 环境设置
首先,我们需要安装必要的库。确保你已经安装了 PyTorch
和 gym
库。如果未安装,可以使用如下命令进行安装:
1
| pip install torch torchvision torchaudio gym
|
接下来,我们导入库并创建环境:
1 2 3 4 5 6 7
| import gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import random from collections import deque
|
4. 定义 DQN 模型
我们需要定义一个神经网络作为我们的 DQN 模型。这个模型将接收状态作为输入,并输出每个动作的 Q 值。
1 2 3 4 5 6 7 8 9 10 11
| 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)
|
5. DQN 训练算法
接下来,我们需要实现 DQN 算法的核心部分,包括经验重放(Experience Replay)和目标网络(Target Network):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = deque(maxlen=2000) self.gamma = 0.95 self.epsilon = 1.0 self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.model = DQN(state_size, action_size) self.target_model = DQN(state_size, action_size) self.update_target_model() self.optimizer = optim.Adam(self.model.parameters())
def update_target_model(self): self.target_model.load_state_dict(self.model.state_dict())
def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done))
def act(self, state): if np.random.rand() <= self.epsilon: return random.randrange(self.action_size) state = torch.FloatTensor(state) q_values = self.model(state) return np.argmax(q_values.detach().numpy())
def replay(self, batch_size): if len(self.memory) < batch_size: return minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target += self.gamma * torch.max(self.target_model(torch.FloatTensor(next_state))).item() target_f = self.model(torch.FloatTensor(state)) target_f[action] = target self.optimizer.zero_grad() loss = nn.MSELoss()(self.model(torch.FloatTensor(state)), target_f) loss.backward() self.optimizer.step() if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay
|
6. 训练智能体
现在我们可以开始训练我们的智能体。我们使用 CartPole-v1
环境,并定义训练循环:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| if __name__ == "__main__": env = gym.make('CartPole-v1') state_size = env.observation_space.shape[0] action_size = env.action_space.n agent = DQNAgent(state_size, action_size) episodes = 1000
for e in range(episodes): state = env.reset() state = np.reshape(state, [1, state_size]) for time in range(500): action = agent.act(state) next_state, reward, done, _ = env.step(action) reward = reward if not done else -10 next_state = np.reshape(next_state, [1, state_size]) agent.remember(state, action, reward, next_state, done) state = next_state if done: print(f"episode: {e}/{episodes}, score: {time}, e: {agent.epsilon:.2}") break agent.replay(32) agent.update_target_model()
|
7. 心得与未来工作
在项目的最后部分,我们可以试着总结一下智能体的训练过程,并考虑未来的改进方向,例如:
- 调整模型的结构,观察是否能提高性能。
- 引入更复杂的策略,例如
Double DQN
或 Dueling DQN
。
- 尝试其他强化学习环境,扩展项目范围。
希望通过这个小节的学习,您能够对使用 PyTorch
开发强化学习算法有一个初步的了解。