一、 公式推导

这里参考邱锡鹏大佬的《神经网络与深度学习》第三章进阶模型部分,链接《神经网络与深度学习》。
`

伪代码:

二、核心代码

def main():env = gym.make('CartPole-v0')obs_n = env.observation_space.shape[0]act_n = env.action_space.nlogger.info('obs_n {},act_n {}'.format(obs_n, act_n))model = Pgnet(obs_n, act_n)agent = Agent(net=model, obs_n=obs_n, act_n=act_n, lr=0.01, gamma=1.0)R = []Episode = []for j in range(1000):obs_list, action_list, reward_list = run_episode(env, agent)batch_obs = np.array(obs_list)batch_action = np.array(action_list)batch_reward = calc_reward_to_go(reward_list)obstotensor = torch.FloatTensor(batch_obs).view(len(batch_reward), -1)actiontotensor = torch.LongTensor(batch_action).view(len(batch_reward), )rewardtotensor = torch.FloatTensor(batch_reward).view(len(batch_reward), -1)for i in range(len(batch_reward)):obs = obstotensor[i,:]act= actiontotensor[i]reward = rewardtotensor[i]agent.learn(obs, act, reward)# if (i+1)%100 == 0:total_reward = evaluate(env, agent, render=True)print('episode%s---test_reward: %s' % (j, round(total_reward, 2)))R.append(total_reward)Episode.append(j)env.close()# 训练完毕保存网络参数torch.save(model.state_dict(), 'network_params.pth')fig, ax = plt.subplots()ax.plot(Episode, R, linewidth=3)ax.set_xlabel('epoch')ax.set_ylabel('testreward')plt.show()

三、全部代码

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import logging
import gym
import matplotlib.pyplot as pltlogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)# 将得到的回报转换成G值def calc_reward_to_go (reward_list ,gamma=0.9):# 返回每个t时刻的G值for i in range(len(reward_list) -2,-1,-1):#for以-1为倒叙生成数列reward_list[i] = gamma*reward_list[i+1]for i in range(len(reward_list)):reward_list[i] = gamma**i*reward_list[i]return np.array(reward_list)# 定义policy网络class Pgnet(nn.Module):# 这个网络是obs到action之间的映射def __init__(self, obs_n, act_n):super(Pgnet, self).__init__()self.linear1 = nn.Linear(obs_n, 24)self.linear2 = nn.Linear(24, 36)self.linear3 = nn.Linear(36, act_n)def forward(self, obs):x = F.tanh(self.linear1(obs))x = F.tanh(self.linear2(x))output = self.linear3(x)return output# 定义智能体class Agent(object):def __init__(self,net,obs_n, act_n,lr,gamma):self.model = netself.optimizer = torch.optim.RMSprop(self.model.parameters(), lr=lr)self.loss_function = nn.CrossEntropyLoss()self.obs_n = obs_nself.act_n = act_nself.gamma = gammadef sample(self,obs):#用于与环境互动时产生选择动作obs = torch.unsqueeze(torch.FloatTensor(obs), 0)                        # 送进网络之前要转换成张量,增加一维是因为有个batch在第一维度actions_prob = F.softmax(self.model.forward(obs))actions_prob = torch.squeeze(actions_prob, 0).data.numpy()act = np.random.choice(range(self.act_n), p=actions_prob)return actdef predict(self,obs):# 在预测时选择概率最大的动作obs = torch.unsqueeze(torch.FloatTensor(obs), 0)                        # 送进网络之前要转换成张量,增加一维是因为有个batch在第一维度actions_prob = self.model.forward(obs)action = torch.max(actions_prob, 1)[1].data.numpy()                     # 输出每一行最大值的索引,并转化为numpy ndarray形式# TODO为啥是不是1action = action[0]return actiondef learn(self,obs, action, reward):obs = torch.unsqueeze(obs, 0)action = torch.unsqueeze(action,0)self.optimizer.zero_grad()act_prob = self.model(obs)# action_target = F.one_hot(action, num_classes=2)# 采用交叉损失熵计算Loglog_prob = -1*self.loss_function(act_prob,action)loss = reward*log_probloss.backward()return self.optimizer.step()# 采集一轮数据的函数
def run_episode(env,agent):# 采集一个epside的数据obs_list, action_list, reward_list = [], [], []s = env.reset()#env.render()while True:a = agent.sample(s)  # 输入该步对应的状态s,选择动作s_, r, done, info = env.step(a)  # 执行动作,获得反馈# 修改奖励 (不修改也可以,修改奖励只是为了更快地得到训练好的摆杆)x, x_dot, theta, theta_dot = s_r1 = (env.x_threshold - abs(x)) / env.x_threshold - 0.8r2 = (env.theta_threshold_radians - abs(theta)) / env.theta_threshold_radians - 0.5new_r = r1 + r2obs_list.append(s)action_list.append(a)reward_list.append(new_r)s = s_if done:breakreturn obs_list,action_list,reward_list# 评估得到的policy网路
def evaluate(env, agent, render=False):# 评估训练的网路reval_reward =[]for i in range(5):obs = env.reset()episode_reward = 0while True:action = agent.predict(obs)obs, reward, done, _ = env.step(action)episode_reward += rewardif render:env.render()if done:breakeval_reward.append(episode_reward)return np.mean(eval_reward)def main():env = gym.make('CartPole-v0')obs_n = env.observation_space.shape[0]act_n = env.action_space.nlogger.info('obs_n {},act_n {}'.format(obs_n, act_n))model = Pgnet(obs_n, act_n)agent = Agent(net=model, obs_n=obs_n, act_n=act_n, lr=0.01, gamma=1.0)R = []Episode = []for j in range(1000):obs_list, action_list, reward_list = run_episode(env, agent)batch_obs = np.array(obs_list)batch_action = np.array(action_list)batch_reward = calc_reward_to_go(reward_list)obstotensor = torch.FloatTensor(batch_obs).view(len(batch_reward), -1)actiontotensor = torch.LongTensor(batch_action).view(len(batch_reward), )rewardtotensor = torch.FloatTensor(batch_reward).view(len(batch_reward), -1)for i in range(len(batch_reward)):obs = obstotensor[i,:]act= actiontotensor[i]reward = rewardtotensor[i]agent.learn(obs, act, reward)# if (i+1)%100 == 0:total_reward = evaluate(env, agent, render=True)print('episode%s---test_reward: %s' % (j, round(total_reward, 2)))R.append(total_reward)Episode.append(j)env.close()# 训练完毕保存网络参数torch.save(model.state_dict(), 'network_params.pth')fig, ax = plt.subplots()ax.plot(Episode, R, linewidth=3)ax.set_xlabel('epoch')ax.set_ylabel('testreward')plt.show()if __name__== "__main__":main()

四、训练效果

下图为某次训练效果,PG算法的训练结果很不稳定,有时表现很好,有时表现一般,所以要多尝试几次。

Pytorch 实现强化学习策略梯度Reinforce算法相关推荐

  1. 强化学习策略梯度方法之: REINFORCE 算法(从原理到代码实现)

    强化学习策略梯度方法之: REINFORCE 算法 (从原理到代码实现) 2018-04-01  15:15:42   最近在看policy gradient algorithm, 其中一种比较经典的 ...

  2. 强化学习 11 —— REINFORCE 算法推导与 tensorflow2.0 代码实现

    在上篇文章强化学习--Policy Gradient 公式推导介绍了 Policy Gradient 的推导: ∇ θ J ( θ ) ≈ 1 m ∑ i = 1 m R ( τ i ) ∑ t = ...

  3. 7. 基于策略的强化学习——蒙特卡洛策略梯度REINFORCE算法

    前6篇我们都是估计动作值函数Q,从而可以根据估计的Q值选择相应的动作.但是这样的值函数(Value Based)估计方法有着一定的限制.第一,值函数估计方法最后得到的策略是固定策略,不能应对最优策略是 ...

  4. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例

    策略梯度方法 引言 9.1 策略近似和其优势 9.2 策略梯度定理 9.2.1 梯度上升和黑箱优化 9.2.2 策略梯度定理的证明 9.3 REINFORCE:蒙特卡洛策略梯度 9.3.1 轨迹上的R ...

  5. 【深度强化学习】DRL算法实现pytorch

    DRL Algorithms DQN (deep Q network) Policiy_Gradient 策略梯度是强化学习的一类方法,大致的原理是使用神经网络构造一个策略网络,输入是状态,输出为动作 ...

  6. 【强化学习入门】梯度赌博机算法中,偏好函数更新:梯度上升公式是精确梯度上升的随机近似的证明

    本文证明强化学习入门问题:K摇臂赌博机的梯度赌博机算法中,偏好函数更新公式:Ht+1(At)=Ht(At)+α(Rt−Rt‾)(1−πt(At))H_{t+1}(A_t) = H_t(A_t) + \ ...

  7. 【强化学习】⚠️手把手带你走进强化学习 2⚠️ OPP 算法实现月球登陆器 (PyTorch 版)

    [强化学习]⚠️手把手带你走进强化学习 2⚠️ OPP 算法实现月球登陆器 概述 强化学习算法种类 PPO 算法 Actor-Critic 算法 Gym LunarLander-v2 启动登陆器 PP ...

  8. 基于Pytorch的强化学习(DQN)之REINFORCE VS A2C

    目录 1. 引言 2. 比较 3. 本质联系 1. 引言 我们前面两次学习了与baseline有关的两种算法:REINFORCE 和 A2C,仔细阅读的同学会发现两者的神经网络的结构是一致的,那么这两 ...

  9. 策略梯度REINFORCE

    策略梯度REINFORCE 理论介绍 策略梯度是一个非常直观的方法.为什么说很直观,因为它直接尝试用神经网络拟合policy,然后优化目标也直接就是期望累计收益. 用神经网络拟合policy,具体说, ...

最新文章

  1. s-sar命令(System Activity Reporter系统活动情况报告)
  2. img边框的border属性
  3. tp5.0 根据经纬度 获取附近信息_php根据前端传递的经纬度获取区域地址信息
  4. XML和JSON两种数据交换格式的比较
  5. 40个大数据学习资源,个个是干货,最后7个太给力
  6. Objective-C 深复制和浅复制与NSCopying协议
  7. 面向对象特征:封装、多态 以及 @propetry装饰器
  8. Falsk session 源码解析
  9. 最强Java面试题全部合集,涵盖BAT大厂面试必考的9大技术!-强烈建议收藏
  10. [模板] tarjan/联通分量/dfs树
  11. How to Install MariaDB 10 on CentOS 6.7
  12. 【python】Tkinter窗口可视化(二)
  13. 转:标准差(Standard Deviation) 和 标准误差(Standard Error)
  14. 全面解读Marshmallow
  15. 1138: C语言合法标识符
  16. N-gram模型详解
  17. 关于linux python3.7版本 No module named ‘_ssl‘报错
  18. 苹果android wear教程,Android Wear/Apple Watch/WatchKit智能手表开发入门教程
  19. 感悟爱情的空间说说:总有一个人,一直住在心底,却消失在生活里。
  20. 2-3-4 Tree

热门文章

  1. Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札
  2. MATLAB 输入和输出参数
  3. phpStudy环境变量
  4. 用 Flask 来写个轻博客 (1) — 创建项目
  5. 一个小Demo带你理解安卓事件分发
  6. ue4 后期处理景深_【UE4设计师】2-3后期处理效果——使用景深设置电影拍摄
  7. 修改MySQL密码策略
  8. 传智播客网络营销课程大升级,改变从“薪”开始
  9. Win11 “qq无法访问个人文件夹”解决方法(原创)
  10. 10种预防癌症的“超级”食品