欢迎访问宙启技术站
智能推送

PyTorch实现强化学习算法

发布时间:2023-12-23 09:10:18

PyTorch 是一个基于 Python 的机器学习库,它提供了丰富的工具和函数,以便更方便地实现各种深度学习算法。强化学习(Reinforcement Learning)是机器学习领域的一个重要分支,该算法通过与环境的交互来学习最优策略。以下是一个使用 PyTorch 实现强化学习算法的简单示例。

首先,我们需要定义一个环境,用于模拟强化学习的任务。这里我们以一个简单的格子世界游戏为例。该游戏中,智能体(Agent)需要在一个5x5的方格中移动,目标是找到一个宝藏。智能体可以执行四个动作:上、下、左、右。每个动作都有一个确定性的结果,智能体可以获得一个奖励或者罚分。智能体需要通过探索不同的动作来学习到一个最优策略,以最大化获得奖励的期望值。

下面是一个简化的环境类的实现:

import numpy as np

class GridWorld:
    def __init__(self):
        self.grid_size = 5
        self.agent_pos = np.array([0, 0])
        self.target_pos = np.array([4, 4])
        self.done = False
    
    def reset(self):
        self.agent_pos = np.array([0, 0])
        self.done = False
    
    def step(self, action):
        if self.done:
            raise Exception("Game over, please reset the environment.")
        
        if action == 'up' and self.agent_pos[0] > 0:
            self.agent_pos[0] -= 1
        elif action == 'down' and self.agent_pos[0] < self.grid_size - 1:
            self.agent_pos[0] += 1
        elif action == 'left' and self.agent_pos[1] > 0:
            self.agent_pos[1] -= 1
        elif action == 'right' and self.agent_pos[1] < self.grid_size - 1:
            self.agent_pos[1] += 1
            
        reward = -1 if np.array_equal(self.agent_pos, self.target_pos) else 0
        
        if reward == 0:
            return self.agent_pos, reward, self.done
        
        self.done = True
        return self.agent_pos, reward, self.done

接下来,我们使用 PyTorch 构建一个神经网络,作为智能体的策略网络。这里我们使用一个简单的全连接网络,输入是智能体的状态,输出是动作的概率分布。

import torch
import torch.nn as nn

class PolicyNetwork(nn.Module):
    def __init__(self):
        super(PolicyNetwork, self).__init__()
        
        self.fc1 = nn.Linear(2, 32)
        self.fc2 = nn.Linear(32, 32)
        self.fc3 = nn.Linear(32, 4)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = torch.softmax(self.fc3(x), dim=-1)
        return x

然后,我们定义一个训练函数,使用蒙特卡洛策略梯度算法训练智能体。

def train(num_episodes):
    env = GridWorld()
    policy = PolicyNetwork()
    optimizer = torch.optim.Adam(policy.parameters(), lr=0.01)
    
    for episode in range(num_episodes):
        states = []
        actions = []
        rewards = []
        
        env.reset()
        
        state = torch.tensor(env.agent_pos, dtype=torch.float32)
        
        while not env.done:
            action_prob = policy(state)
            action = np.random.choice(range(4), p=action_prob.detach().numpy())
            next_state, reward, done = env.step(['up', 'down', 'left', 'right'][action])
            
            states.append(state)
            actions.append(action)
            rewards.append(reward)
            
            state = torch.tensor(next_state, dtype=torch.float32)
        
        returns = [sum(rewards[i:]) for i in range(len(rewards))]
        
        optimizer.zero_grad()
        
        for i in range(len(returns)):
            state = states[i]
            action = actions[i]
            return_i = returns[i]
            
            action_prob = policy(state)
            log_prob = torch.log(action_prob[action])
            loss = -log_prob * return_i
            loss.backward()
        
        optimizer.step()
    
    return policy

最后,我们可以使用训练好的策略网络玩一局游戏:

policy = train(1000)
env = GridWorld()
env.reset()

state = torch.tensor(env.agent_pos, dtype=torch.float32)
print("Start position: ", env.agent_pos)

while not env.done:
    action_prob = policy(state)
    action = np.random.choice(range(4), p=action_prob.detach().numpy())
    next_state, reward, done = env.step(['up', 'down', 'left', 'right'][action])
    state = torch.tensor(next_state, dtype=torch.float32)
    print("Next position:", next_state)
    
print("Done! Total reward:", reward)

以上就是使用 PyTorch 实现强化学习算法的一个简单示例。通过定义环境、构建神经网络和训练函数,我们可以训练一个智能体在格子世界游戏中学习到一个最优策略,并测试其性能。当然,这只是一个简单的示例,实际的强化学习算法会更加复杂,但基本的思路是相通的。强化学习的一个主要挑战是平衡探索与利用的关系,同时最大化长期奖励的期望值。