【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)

简介: 【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留言留下QQ~~~

一、带基线的REINFORCE

REINFORCE的优势在于只需要很小的更新步长就能收敛到局部最优,并保证了每次更新都是有利的,但是假设每个动作的奖赏均为正,则每个动作出现的概率将不断提高,这一现象会严重降低学习速率,并增大梯度方差

根据这一思想,我们构建一个仅与状态有关的基线函数,保证能够在不改变策略梯度的同时,降低其方差,带基线的REINFORCE算法是REINFORCE算法的改进版,原则上,与动作无关的函数都可以作为基线,但是为了对所有动作值都比较大的状态,需要设置一个较大的基线来区分最优动作和次优动作:对所有动作值都比较小的状态,则需要设置一个比较小的基线。由此用近似状态值函数代表基线,当回报超过基线值时,该动作的概率将提高,反之降低

二、结果与分析

1:实验环境设置

带基线的REINFORCE算法其网络结构,参数设置以及实验环境与REINFORCE一样,在算法中,近似状态值函数参数W的学习率为0.001,REINFORCE和带基线的REINFORCE效果对比如下图

在短走廊环境下,带基线的REINFORCE收敛的更快,并且更为稳定,

在CartPole环境下,两个算法的波动都比较大,带基线的更为明显,这是因为CartPole环境更为复杂。

三、代码

部分代码如下

import torch.nn as nn
import torch.nn.functional as F
import gym
import torch
from torch.distributions import Categorical
import torch.optim as optim
from copy import deepcopy
import numpy as np
import argparse
import matplotlib.pyplot as plt
from _DUPLICATE_LIB_OK"]="True"
render = False
class Policy(nn.Module):
    def __init__(self,n_states, n_hidden, n_output):
        super(Policy, self).__init__()
        self.linear1 = nn.Linear(n_states, n_hidden)
        self.linear2 = nn.Linear(n_hidden, n_output)
 #这是policy的参数
        self.reward = []
        self.log_act_probs = []
        self.Gt = []
        self.sigma = []
#这是state_action_func的参数
        # self.Reward = []
        # self.s_value = []
    def forward(self, x):
        x = F.relu(self.linear1(x))
        output = F.softmax(self.linear2(x), dim= 1)
        # self.act_probs.append(action_probs)
        return output
env = gym.make('CartPole-v0')
n_states = env.observation_space.shape[0]
n_actions = env.action_space.n
policy = Policy(n_states, 128, n_actions)
s_value_func = Policy(n_states, 128, 1)
alpha_theta = 1e-3
optimizer_theta = optim.Adam(policy.parameters(), lr=alpha_theta)
gamma = 0.99
seed = 1
e)
    plt.ylabel('Run Time')
    plt.plot(epi, run_time)
    plt.show()
if __name__ == '__main__':
    running_reward = 10
    i_episodes = []
    for i_episode in range(1, 10000):
        state, ep_reward = env.reset(), 0
        if render: env.render()
        policy_loss = []
        s_value = []
        state_sequence = []
        log_act_prob = []
        for t in range(10000):
            state = torch.from_numpy(state).unsqueeze(0).float()  # 在第0维增加一个维度,将数据组织成[N , .....] 形式
            state_sequence.append(deepcopy(state))
            action_probs = policy(state)
            m = Categorical(action_probs)
            action = m.sample()
            m_log_prob = m.log_prob(action)
            log_act_prob.append(m_log_prob)
            # policy.log_act_probs.append(m_log_prob)
            action = action.item()
            next_state, re, done, _ = env.step(action)
            if render: env.render()
            policy.reward.append(re)
            ep_reward += re
            if done:
                break
            state = next_state
        running_reward = 0.05 * ep_reward + (1 - 0.05) * running_reward
        i_episodes.append(i_episode)
        if i_episode % 10 == 0:
            print('Episode {}\tLast length: {:2f}\tAverage length: {:.2f}'.format(
                i_episode, ep_reward, running_reward))
        live_time.append(running_reward)
        R = 0
        Gt = []
        # get Gt value
        for r in policy.reward[::-1]:
            R = r + gamma * R
            Gt.insert(0, R)
        # update step by step
        for i in range(len(Gt)):
            G = Gt[i]
            V = s_value_func(state_sequence[i])
            delta = G - V
            # update value network
            alpha_w = 1e-3  # 初始化
            optimizer_w = optim.Adam(s_value_func.parameters(), lr=alpha_w)
            optimizer_w.zero_grad()
            policy_loss_w = -delta
            policy_loss_w.backward(retain_graph=True)
            clip_grad_norm_(policy_loss_w, 0.1)
            optimizer_w.step()
            # update policy network
            optimizer_theta.zero_grad()
            policy_loss_theta = - log_act_prob[i] * delta
            policy_loss_theta.backward(retain_graph=True)
            clip_grad_norm_(policy_loss_theta, 0.1)
            optimizer_theta.step()
        del policy.log_act_probs[:]
        del policy.reward[:]
        if (i_episode % 1000 == 0):
            plot(i_episodes, live_time)
    np.save(f"withB", live_time)
    policy.plot(live_time)

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1月前
|
机器学习/深度学习 存储 数据管理
面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现
循环状态空间模型(Recurrent State Space Models, RSSM)由 Danijar Hafer 等人提出,是现代基于模型的强化学习(MBRL)中的关键组件。RSSM 旨在构建可靠的环境动态预测模型,使智能体能够模拟未来轨迹并进行前瞻性规划。本文介绍了如何用 PyTorch 实现 RSSM,包括环境配置、模型架构(编码器、动态模型、解码器和奖励模型)、训练系统设计(经验回放缓冲区和智能体)及训练器实现。通过具体案例展示了在 CarRacing 环境中的应用,详细说明了数据收集、训练过程和实验结果。
83 13
面向强化学习的状态空间建模:RSSM的介绍和PyTorch实现
|
4月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
523 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
6天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
114 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
1月前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
217 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
6月前
|
机器学习/深度学习 并行计算 PyTorch
优化技巧与策略:提高 PyTorch 模型训练效率
【8月更文第29天】在深度学习领域中,PyTorch 是一个非常流行的框架,被广泛应用于各种机器学习任务中。然而,随着模型复杂度的增加以及数据集规模的增长,如何有效地训练这些模型成为了一个重要的问题。本文将介绍一系列优化技巧和策略,帮助提高 PyTorch 模型训练的效率。
595 0
|
2月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
4月前
|
机器学习/深度学习 缓存 PyTorch
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
这篇文章是关于如何下载、安装和配置Miniconda,以及如何使用Miniconda创建和管理Python环境的详细指南。
865 0
pytorch学习一(扩展篇):miniconda下载、安装、配置环境变量。miniconda创建多版本python环境。整理常用命令(亲测ok)
|
4月前
|
PyTorch TensorFlow 算法框架/工具
手把手教你-MAC笔记本安装Pytorch环境
手把手教你-MAC笔记本安装Pytorch环境
192 0
|
4月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
478 0
|
6月前
|
机器学习/深度学习 存储 算法
强化学习实战:基于 PyTorch 的环境搭建与算法实现
【8月更文第29天】强化学习是机器学习的一个重要分支,它让智能体通过与环境交互来学习策略,以最大化长期奖励。本文将介绍如何使用PyTorch实现两种经典的强化学习算法——Deep Q-Network (DQN) 和 Actor-Critic Algorithm with Asynchronous Advantage (A3C)。我们将从环境搭建开始,逐步实现算法的核心部分,并给出完整的代码示例。
492 1

推荐镜像

更多