强化学习记录——DQN跑Pendulum-v0

代码cr:MorvanZhou (Morvan) · GitHub

一、Pendulum-v0环境介绍:

钟摆以随机位置开始,目标是将其向上摆动,使其保持直立。

gym/gym/envs/classic_control at master · openai/gym · GitHub

 二、Pendulum-v0.py代码

import gym#导入gym库
import numpy as np#导入numpy模块
from RL_brain import DeepQNetwork#从RL_brain导入DeepQNetwork
ACTION_SPACE = 11#可以选取的动作有11个
env = gym.make('Pendulum-v0')#导入环境
env = env.unwrapped#env.unwrapped可以得到原始的类,原始类想step多久就多久,不会200步后失败

print(env.action_space)#输出动作信息
print(env.observation_space)#查看状态空间
print(env.observation_space.high)#查看状态的最高值
print(env.observation_space.low)#查看状态的最低值

RL = DeepQNetwork(n_actions=ACTION_SPACE, #调用DeepQNetwork:输出多少个action的Q值、
                  n_features=3,#接收多少个observation的值(用observation来预测action的值)、
                  learning_rate=0.01,#学习率
                  e_greedy=0.9,#e_greedy的值
                  replace_target_iter=100, #进行了多少步之后将targetnet的值换为最新的参数、
                  memory_size=2000,#记忆库的容量
                  e_greedy_increment=0.001,)

                  

total_steps = 0#学习步数


for i_episode in range(100):#episode循环

    observation = env.reset()#获得环境初始observation
    ep_r = 0
    while True:
        env.render()#重绘环境的一幅图像

        action = RL.choose_action(observation)#选取动作
        
        #Pendulum-v0是连续性动作。而DQN处理的是离散的,我们需要将Pendulum-v0动作离散化

        f_action = (action-(ACTION_SPACE-1)/2)/((ACTION_SPACE-1)/4)   # convert to [-2 ~ 2] float actions
        observation_, reward, done, info = env.step(np.array([f_action]))#将这一状态的动作入、获取下一状态的观测值、奖励以及是否已经终结

        reward /= 10   # normalize to a range of (-1, 0). r = 0 when get upright
        # the Q target at 竖直向上 state will be 0, because Q_target = r + gamma * Qmax(s', a') = 0 + gamma * 0



        RL.store_transition(observation, action, reward, observation_)#存储记忆:当前的observation、采取的行动、奖励、下一步的observation

        ep_r += reward
        if total_steps > 1000:#大于1000步的时候再开始学习
            RL.learn()

        if done:#完成此次episode
            print('episode: ', i_episode,#输出此时的episode
                  'ep_r: ', round(ep_r, 2),#round(number[, ndigits])number是你的数、是舍入到小数点后的位数
                  ' epsilon: ', round(RL.epsilon, 2))
            break

        observation = observation_#更迭
        total_steps += 1#步数加一

RL.plot_cost()#绘制cost


三、Double DQN——解决DQN中的过估计问题

DQN基于Q-Learning,Q-Learning中有QmaxQmax会导致Q现实当中的过估计(overestimate)。而Double DQN就是用来解决出现的过估计问题的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: DQN (Deep Q-Network) 是一种基于深度神经网络的强化学习算法,它可用于解决强化学习环境中的问题。PyTorch 是一个开源的深度学习框架,提供了一种简单而强大的方式来构建和训练神经网络模型。CartPole-v0 是 OpenAI Gym 提供的一个强化学习环境,目标是控制一个摆杆平衡在垂直位置上。 在使用 PyTorch 实现 DQN 解决 CartPole-v0 问题时,需要首先定义一个深度神经网络模型作为 Q 函数的近似。这个模型通常包含若干隐藏层和一个输出层,用于预测在给定状态下采取各个动作的 Q 值。 然后,需要定义一个经验回放(Experience Replay)的缓冲区,用于存储智能体在环境中的经验,包括当前状态、动作、奖励和下一个状态。 接下来,使用 epsilon-greedy 策略选择动作,epsilon 表示随机探索的概率,即以一定概率选择随机动作,以一定概率选择当前 Q 值最大的动作。 将选择的动作应用于环境中,观察下一状态和奖励,并将这些经验存储到经验回放缓冲区中。 每隔一定步数,从经验回放缓冲区中采样一批数据,然后利用这些样本数据来更新神经网络的参数。DQN 使用经验回放的方式进行训练,这样可以减少样本间的相关性,提高样本的利用效率。 通过反向传播算法计算损失函数,并利用优化器更新神经网络的参数,使得神经网络的输出 Q 值逼近真实的 Q 值。 重复进行上述步骤,直到智能体能够有效地平衡摆杆,或者达到预定的训练次数。 在实际实现 DQN 算法过程中,还需要注意学习速率、discount factor 等超参数的选择,以及选择合适的损失函数和优化器来训练神经网络模型。 总结来说,使用 PyTorch 实现 DQN 来解决 CartPole-v0 问题,需要先定义一个深度神经网络模型作为 Q 函数的近似,然后利用经验回放的方式进行训练,通过反向传播算法来更新神经网络参数,使模型能够逼近真实的 Q 值,最终达到使摆杆平衡的目标。 ### 回答2: DQN(深度Q网络)是一种强化学习算法,用于解决各种控制问题,包括CartPole-v0这个经典的强化学习环境。PyTorch是一种深度学习框架,可以方便地构建神经网络模型。 在使用PyTorch实现DQN解决CartPole-v0问题时,我们首先需要定义网络模型。可以使用PyTorch提供的nn模块创建一个多层感知机网络,包含输入层、若干隐藏层和输出层。这个网络的输入是CartPole-v0环境的状态,输出是动作的Q值。使用ReLU作为激活函数可以增加网络的非线性表示能力。 定义好网络模型后,我们需要定义DQN的训练过程。首先,根据当前环境状态输入网络获取各个动作的Q值,然后选择Q值最大的动作作为当前的行动。执行动作后,环境将返回下一个状态、奖励和是否结束的信息。将这些信息存储在经验回放缓冲区中。 接下来,我们从经验回放缓冲区中随机采样一批数据,包括之前的状态、行动、奖励和下一个状态。然后,使用目标网络(Target Network)计算下一个状态的Q值,并根据贝尔曼方程计算当前状态的目标Q值。通过最小化当前状态的动作Q值和目标Q值的差距,更新网络的参数。 在DQN的训练过程中,还需要设置超参数,包括学习率、批大小、epsilon-greedy策略的参数等。为了提高收敛速度和稳定性,可以使用经验回放和目标网络两个技术。 最后,通过多次迭代训练,不断优化网络参数,直到DQN模型在CartPole-v0环境上能够稳定地获得较高的得分。 总之,使用PyTorch实现DQN算法解决CartPole-v0问题需要定义网络模型、训练过程和超参数,并使用经验回放和目标网络等技术进行优化,以提高性能和稳定性。 ### 回答3: DQN是一种使用深度神经网络进行强化学习的算法,它使用PyTorch框架实现,在CartPole-v0环境中非常有用。 CartPole-v0是一个经典的强化学习问题,任务是控制一个平衡杆,使其在变化的条件下保持平衡。这个环境具有四个状态变量:杆的角度、杆的速度、小车的位置和小车的速度。在每个时间步骤,智能体可以向左或向右施加力来控制小车的动作。目标是使杆保持在竖直位置,并且尽可能长时间地保持平衡。 DQN算法使用了深度神经网络来估计每种动作的Q值函数。在PyTorch中,我们可以使用nn.Module类创建深度神经网络模型,可以包含一些全连接层和非线性激活函数。DQN算法还使用了经验回放机制和目标网络来提高训练效果。 在CartPole-v0中,我们可以使用PyTorch中的torchvision.transforms对环境状态进行处理。然后,我们可以使用DQN模型以一定的epsilon-greedy策略来选择动作,并与环境进行交互。每个时间步之后,我们从经验回放缓冲区中随机样本一批数据,然后计算损失并更新网络参数。我们还会定期更新目标网络的权重,以确保稳定的学习过程。 通过使用DQN算法和PyTorch框架,我们可以在CartPole-v0环境中实现高效的强化学习训练。我们可以通过调整网络结构、超参数和训练步骤来提高性能,并使智能体在该环境中获得长时间平衡杆的能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值