dqn强化学习

cathy_mu cathy_mu     2022-09-29     618

关键词:

pytorch比tenserflow简单。

所以我们模仿用tensorflow写的强化学习。

学习资料:

要点

Torch 是神经网络库, 那么也可以拿来做强化学习, 之前我用另一个强大神经网络库 Tensorflow 来制作了这一个 从浅入深强化学习教程, 你同样也可以用 PyTorch 来实现, 这次我们就举 DQN 的例子, 我对比了我的 Tensorflow DQN 的代码, 发现 PyTorch 写的要简单很多. 如果对 DQN 或者强化学习还没有太多概念, 强烈推荐我的这个DQN动画短片, 让你秒懂DQN. 还有强推这套花了我几个月来制作的强化学习教程!

模块导入和参数设置

这次除了 Torch 自家模块, 我们还要导入 Gym 环境库模块, 如何安装 gym 模块请看这节教程.

import torch
import torch.nn as nn
from torch.autograd import Variable
import torch.nn.functional as F
import numpy as np
import gym

# 超参数
BATCH_SIZE = 32
LR = 0.01                   # learning rate
EPSILON = 0.9               # 最优选择动作百分比
GAMMA = 0.9                 # 奖励递减参数
TARGET_REPLACE_ITER = 100   # Q 现实网络的更新频率
MEMORY_CAPACITY = 2000      # 记忆库大小
env = gym.make(CartPole-v0)   # 立杆子游戏
env = env.unwrapped
N_ACTIONS = env.action_space.n  # 杆子能做的动作
N_STATES = env.observation_space.shape[0]   # 杆子能获取的环境信息数

神经网络

DQN 当中的神经网络模式, 我们将依据这个模式建立两个神经网络, 一个是现实网络 (Target Net), 一个是估计网络 (Eval Net).

class Net(nn.Module):
    def __init__(self, ):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(N_STATES, 10)
        self.fc1.weight.data.normal_(0, 0.1)   # initialization
        self.out = nn.Linear(10, N_ACTIONS)
        self.out.weight.data.normal_(0, 0.1)   # initialization

    def forward(self, x):
        x = self.fc1(x)
        x = F.relu(x)
        actions_value = self.out(x)
        return actions_value

DQN体系

简化的 DQN 体系是这样, 我们有两个 net, 有选动作机制, 有存经历机制, 有学习机制.

class DQN(object):
    def __init__(self):
        # 建立 target net 和 eval net 还有 memory

    def choose_action(self, x):
        # 根据环境观测值选择动作的机制
        return action

    def store_transition(self, s, a, r, s_):
        # 存储记忆

    def learn(self):
        # target 网络更新
        # 学习记忆库中的记忆
class DQN(object):
    def __init__(self):
        self.eval_net, self.target_net = Net(), Net()

        self.learn_step_counter = 0     # 用于 target 更新计时
        self.memory_counter = 0         # 记忆库记数
        self.memory = np.zeros((MEMORY_CAPACITY, N_STATES * 2 + 2))     # 初始化记忆库
        self.optimizer = torch.optim.Adam(self.eval_net.parameters(), lr=LR)    # torch 的优化器
        self.loss_func = nn.MSELoss()   # 误差公式

    def choose_action(self, x):
        x = Variable(torch.unsqueeze(torch.FloatTensor(x), 0))
        # 这里只输入一个 sample
        if np.random.uniform() < EPSILON:   # 选最优动作
            actions_value = self.eval_net.forward(x)
            action = torch.max(actions_value, 1)[1].data.numpy()[0, 0]     # return the argmax
        else:   # 选随机动作
            action = np.random.randint(0, N_ACTIONS)
        return action

    def store_transition(self, s, a, r, s_):
        transition = np.hstack((s, [a, r], s_))
        # 如果记忆库满了, 就覆盖老数据
        index = self.memory_counter % MEMORY_CAPACITY
        self.memory[index, :] = transition
        self.memory_counter += 1

    def learn(self):
        # target net 参数更新
        if self.learn_step_counter % TARGET_REPLACE_ITER == 0:
            self.target_net.load_state_dict(self.eval_net.state_dict())
        self.learn_step_counter += 1

        # 抽取记忆库中的批数据
        sample_index = np.random.choice(MEMORY_CAPACITY, BATCH_SIZE)
        b_memory = self.memory[sample_index, :]
        b_s = Variable(torch.FloatTensor(b_memory[:, :N_STATES]))
        b_a = Variable(torch.LongTensor(b_memory[:, N_STATES:N_STATES+1].astype(int)))
        b_r = Variable(torch.FloatTensor(b_memory[:, N_STATES+1:N_STATES+2]))
        b_s_ = Variable(torch.FloatTensor(b_memory[:, -N_STATES:]))

        # 针对做过的动作b_a, 来选 q_eval 的值, (q_eval 原本有所有动作的值)
        q_eval = self.eval_net(b_s).gather(1, b_a)  # shape (batch, 1)
        q_next = self.target_net(b_s_).detach()     # q_next 不进行反向传递误差, 所以 detach
        q_target = b_r + GAMMA * q_next.max(1)[0]   # shape (batch, 1)
        loss = self.loss_func(q_eval, q_target)

        # 计算, 更新 eval net
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()

训练

按照 Qlearning 的形式进行 off-policy 的更新. 我们进行回合制更行, 一个回合完了, 进入下一回合. 一直到他们将杆子立起来很久.

dqn = DQN() # 定义 DQN 系统

for i_episode in range(400):
    s = env.reset()
    while True:
        env.render()    # 显示实验动画
        a = dqn.choose_action(s)

        # 选动作, 得到环境反馈
        s_, r, done, info = env.step(a)

        # 修改 reward, 使 DQN 快速学习
        x, x_dot, theta, theta_dot = s_
        r1 = (env.x_threshold - abs(x)) / env.x_threshold - 0.8
        r2 = (env.theta_threshold_radians - abs(theta)) / env.theta_threshold_radians - 0.5
        r = r1 + r2

        # 存记忆
        dqn.store_transition(s, a, r, s_)

        if dqn.memory_counter > MEMORY_CAPACITY:
            dqn.learn() # 记忆库满了就进行学习

        if done:    # 如果回合结束, 进入下回合
            break

        s = s_

 

004-dqn

什么是DQN今天我们会来说说强化学习中的一种强大武器,DeepQNetwork简称为DQN.GoogleDeepmind团队就是靠着这DQN使计算机玩电动玩得比我们还厉害.  强化学习与神经网络 之前我们所谈论到的强化学习方法都是比较传统的方式,... 查看详情

chatgpt使用拓展资料:强化学习dqn单模型双模型doubledqnduelingdqn

ChatGPT使用拓展资料:强化学习DQN单模型、双模型目录强化学习基础Q-LearningDQN单模型DQN双模型DoubleDQNDuelingDQNTransformers拓展资料强化学习基础在开始学习DQN之前,我们需要了解一些强化学习的基础知识。强化学习是一种机器学习方... 查看详情

强化学习库tianshou——dqn使用(代码片段)

强化学习库tianshou——DQN使用tianshou是清华大学学生开源编写的强化学习库。本人因为一些比赛的原因,有使用到强化学习,但是因为过于紧张与没有尝试快速复现强化学习的代码,并没有获得很好的成绩,故尝试... 查看详情

pytorch-21强化学习(dqn,deepqlearning)教程(代码片段)

要查看图文并茂的教程,请移步:http://studyai.com/pytorch-1.4/intermediate/reinforcement_q_learning.html本教程演示如何使用PyTorch在OpenAIGym的手推车连杆(CartPole-v0)任务上训练深度Q-学习的智能体(DeepQLearning(DQN)agent 查看详情

强化学习库tianshou——dqn使用(代码片段)

强化学习库tianshou——DQN使用tianshou是清华大学学生开源编写的强化学习库。本人因为一些比赛的原因,有使用到强化学习,但是因为过于紧张与没有尝试快速复现强化学习的代码,并没有获得很好的成绩,故尝试... 查看详情

dqn(deepq-learning)入门教程(零)之教程介绍

...,可以一试,然后发现,要用到DQN,再然后,又发现其是强化学习的知识,然后,就入坑了。别人的学习流程是强化学习——>Q-learning——>DQN——>??Fly,我学习流程TM是??Fly——>CNN——>DQN——>Q-learning——>强化学... 查看详情

强化学习dqn经验回放是什么

经验重放:强化学习由于state之间的相关性存在稳定性的问题,因为智能体去探索环境时采集到的样本是一个时间序列,样本之间具有连续性,所以需要打破时间相关性,解决的办法是在训练的时候存储当前训... 查看详情

强化学习dqn经验回放是什么

经验重放:强化学习由于state之间的相关性存在稳定性的问题,因为智能体去探索环境时采集到的样本是一个时间序列,样本之间具有连续性,所以需要打破时间相关性,解决的办法是在训练的时候存储当前训... 查看详情

强化学习-q-learningsarsa和dqn的理解

本文用于基本入门理解。 强化学习的基本理论:R,S,A这些就不说了。 先设想两个场景: 一。1个5x5的格子图,里面有一个目标点, 2个死亡点二。一个迷宫,  一个出发点, 3处分叉点,5个死角,1条活... 查看详情

dqn处理cartpole问题——使用强化学习,本质上是训练mlp,预测每一个动作的得分

代码:#-*-coding:utf-8-*-importrandomimportgymimportnumpyasnpfromcollectionsimportdequefromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.optimizersimportAdamfromkeras.utils.vis_utilsim 查看详情

基于pytorch的强化学习(dqn)之baseline基本概念

目录1.引言2.数学推导2.1引理2.2改进的策略梯度2.3蒙特卡罗模拟3.baseline的选择1.引言我们前面讲过策略梯度下降算法 ,现在来介绍一种加快收敛速度的方法:设置Baseline。2.数学推导我们之前推导过状态价值函数梯度的公... 查看详情

强化学习(十三)策略梯度(policygradient)(代码片段)

    在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习。这种ValueBased强化学习方法在很多领域都得到比较好的应用,但是ValueBased强化学习方法也有很多局限性,因此在另一些场景... 查看详情

深度强化学习(deepreinforcementlearning)入门:rlbase&dqn-ddpg-a3cintroduction

转自https://zhuanlan.zhihu.com/p/25239682过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题。子曰:温故而知新,在进一步深入研究和应用DRL前,阶段性的整理下相关知识点。本文集中在DRL的model-free... 查看详情

强化学习笔记experiencereplay经验回放

 1回顾:DQNDQN笔记State-actionValueFunction(Q-function)_UQI-LIUWJ的博客-CSDN博客DQN是希望通过神经网络来学习Q(s,a)的结果,我们输入一个人状态s,通过DQN可以得到各个action对应的Q(s,a)通常用TD来求解DQN其中rt是实际进行交互得到... 查看详情

深度强化学习-dqn算法原理与代码(代码片段)

DQN算法是DeepMind团队提出的一种深度强化学习算法,在许多电动游戏中达到人类玩家甚至超越人类玩家的水准,本文就带领大家了解一下这个算法,论文的链接见下方。论文:Human-levelcontrolthroughdeepreinforcementlearning... 查看详情

tensorflow2.0|基于深度强化学习(dqn)实现动态柔性作业车间调度问题(dfjsp)(代码片段)

...bydeepreinforcementlearning》论文详情可见:论文阅读|《用强化学习求解带插单的动态FJSP》其他相关阅读可见个人CSDN专栏之《论文阅读与实现》,如:论文阅读|《基于加权Q 查看详情

(pytorch复现)基于深度强化学习(cnn+duelingnetwork/dqn/ddqn/d3qn/per)的自适应车间调度(jsp)

为了深入学习各种深度学习网络和强化学习的结合,实现了一下下列文章:ResearchonAdaptiveJobShopSchedulingProblemsBasedonDuelingDoubleDQN|IEEEJournals&Magazine|IEEEXplore状态、动作、奖励函数及实验的简单介绍可参考: 查看详情

深度强化学习-duelingdqn算法原理与代码(代码片段)

...还不太了解的话,可以参考我的这篇博文:深度强化学习-DQN算法原理与代码,里面详细讲述了DQN算法的原理和代码实现。本文就带领大家了解一下DuelingDQN算法,论文链接见下方。论文:http://proceedings.mlr.press/v... 查看详情