【学习笔记】PyTorch实战 | 强化学习 | DQN | CartPole 倒立摆

PyTorch实现DQN教程:CartPole倒立摆强化学习
本文介绍了如何使用PyTorch和Gymnasium库实现深度Q学习(DQN)在CartPole-v1环境中训练一个智能体,包括环境配置、经验回放缓冲区、Q网络结构、ε-greedy策略和优化过程。最终目标是使智能体学会维持杆子直立。

简要声明


  1. 课程学习相关网址
    1. PyTorch Tutorials
    2. Reinforcement Learning (DQN) Tutorial
    3. Gymnasium Documentation
    4. Cart Pole
  2. 由于教程内容为英文,文本会进行谷歌翻译并保留部分英文专有名词,采用中文进行简要解释。
  3. 本学习笔记单纯是为了能对学到的内容有更深入的理解,如果有错误的地方,恳请包容和指正。

CartPole 倒立摆


在这里插入图片描述

  • Task:Agent 必须在两个动作(向左或向右移动推车)之间做出决定,以便连接到它的杆子保持直立。
  • 当 Agent 观察 Environment state 并选择 Action 时,Environment 会转换到新的 State,并返回 Action 的 Reward 。 在此 Task 中,每个增量 Timestep 的 Reward 为 +1,如果杆子倒下太远或小车偏离中心超过 2.4 个单位,环境就会终止。 这意味着性能更好的场景将运行更长的Duration,积累更大的回报。
  • CartPole 任务的设计使得 Agent 的 Inputs 是代表 Environment State(位置、速度等)的 4 个实值。 在不进行任何缩放的情况下获取这 4 个Inputs,并将它们传递到一个具有 2 个 Outputs的小型 Fully-connected network(全连接网络),每个 Outputs 对应一个 Action 。 Network 经过训练,可以在给定 Input state 的情况下预测每个 Action 的期望值。 然后选择具有最高期望值的Action。

环境配置


TyTorch

# create conda env
conda create -n py39pytorch201 python=3.9
conda info --envs
conda activate py39pytorch201

# install pytorch
conda install pytorch torchvision torchaudio cpuonly -c pytorch

# install jupyter notebook
conda install nb_conda -y

# install matplotlib
conda install matplotlib

具体安装过程可参考:【经验总结】NUC11的Ubuntu系统安装PyTorch | 无独显

Gymnasium

# gymnasium classic control env
pip install gymnasium[classic_control]

# install pygame
pip install pygame

# libstdcxx-ng update (这一步决定了是否能成功打开 pygame window)
conda install libstdcxx-ng=12.1.0 --channel conda-forge

Import

# 自2021年以来维护Gym的团队已将所有未来的开发转移到Gymnasium
import gymnasium as gym
import math
import random
import matplotlib
import matplotlib.pyplot as plt
from collections import namedtuple, deque
from itertools import count

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

# 这里一定要添加参数render_mode="human",不然无法打开pygame window
env = gym.make("CartPole-v1",render_mode="human")

# 设置 matplotlib
is_ipython = 'inline' in matplotlib.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

# 如果可以使用GPU,由于本人没有GPU,所以使用CPU跑程序
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

Replay Memory


使用 Experience replay 来训练 DQN。 它存储 Agent 观察到的 Transitions,允许重用这些数据。 通过随机采样,构建 Batch 的 Transitions 是不相关的。 事实证明,这极大地稳定并改进了 DQN 训练过程。

Transition

Transition - 代表 Environment 中的单个 Transition 的命名元组。 它本质上将(state,action)对映射到它们的(next_state,reward)结果。

Transition = namedtuple('Transition',('state', 'action', 'next_state', 'reward'))

ReplayMemory

ReplayMemory - 有界大小的循环缓冲区,用于保存最近观察到的 Transitions。 它还实现了 .sample() 方法,用于选择随机 Batch 的 Transitions 进行训练。

class ReplayMemory(object):

    def __init__(self, capacity):
        self.memory = deque([], maxlen=capacity)

    def push(self, *args):
        # 保存一个transition
        self.memory.append(Transition(*args))

    def sample(self, batch_size):
        return random.sample(self.memory, batch_size)

    def __len__(self):
        return len(self.memory)

DQN algorithm


Policy - Greedy

  • Environment 是确定性的,因此为了简单起见,这里提出的所有方程也都是确定性的。 在强化学习文献中,它们还包含对 Environment 的随机 Transitions 的期望。
  • 我们的目标是训练一种试图最大化折扣累积 Reward 的政策

R t 0 = ∑ t = t 0 ∞ ( γ t − t 0 ⋅ r t ) R_{t_0}=\sum_{t=t_0}^{\infty}(\gamma^{t-t_0}\cdot r_t) Rt0=t=t0(γtt0

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Chency.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值