强化学习_PolicyGradient(策略梯度)_代码解析

使用策略梯度解决离散action space问题。

一、导入包,定义hyper parameter

import gym
import tensorflow as tf
import numpy as np
from collections import deque

#################hyper parameters################、
#discount factor
GAMMA = 0.95
LEARNING_RATE = 0.01

二、PolicyGradient Agent的构造函数:

1、设置问题的状态空间维度,动作空间维度;

2、序列采样的存储结构;

3、调用创建用于策略函数近似的神经网络的函数,tensorflow的session;初始或神经网络的weights和bias。

def __init__(self, env):
        #self.time_step = 0
        #state dimension
        self.state_dim = env.observation_space.shape[0]
        #action dimension
        self.action_dim = env.action_space.n
        #sample list
        self.ep_obs, self.ep_as, self.ep_rs = [],[],[]
        #create policy network
        self.create_softmax_network()

        self.session = tf.InteractiveSession()
        self.session.run(tf.global_variables_initializer())

三、创建神经网络:

这里使用交叉熵误差函数,使用神经网络计算损失函数的梯度。softmax输出层输出每个动作的概率。

tf.nn.sparse_softmax_cross_entropy_with_logits函数先对 logits 进行 softmax 处理得到归一化的概率,将lables向量进行one-hot处理,然后求logits和labels的交叉熵:

其中为label中的第i个值,为经softmax归一化输出的vector中的对应分量,由此可以看出,当分类越准确时,所对应的分量就会越接近于1,从而的值也就会越小。

因此,在这里可以得到很好的理解(我自己的理解):当在time-step-i时刻,策略网络输出概率向量若与采样到的time-step-i时刻的动作越相似,那么交叉熵会越小。最小化这个交叉熵误差也就能够使策略网络的决策越接近我们采样的动作。最后用交叉熵乘上对应time-step的reward,就将reward的大小引入损失函数,entropy*reward越大,神经网络调整参数时计算得到的梯度就会越偏向该方向。

    def create_softmax_network(self):
        W1 = self.weight_variable([self.state_dim, 20])
        b1 = self.bias_variable([20])
        W2 = self.weight_variable([20, self.action_dim])
        b2 = self.bias_variable([self.action_dim])

        #input layer
        self.state_input = tf.placeholder(tf.float32, [None, self.state_dim])
        self.tf_acts = tf.placeholder(tf.int32, [None, ], name=‘actions_num‘)
        self.tf_vt = tf.placeholder(tf.float32, [None, ],  name="actions_value")
        #hidden layer
        h_layer = tf.nn.relu(tf.matmul(self.state_input,W1) + b1)
        #softmax layer
        self.softmax_input = tf.matmul(h_layer, W2) + b2
        #softmax output
        self.all_act_prob = tf.nn.softmax(self.softmax_input, name=‘act_prob‘)
        #cross entropy loss function
        self.neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,labels=self.tf_acts)
        self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided loss
        self.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(self.loss)

    def weight_variable(self, shape):
        initial = tf.truncated_normal(shape) #truncated normal distribution
        return tf.Variable(initial)

    def bias_variable(self, shape):
        initial = tf.constant(0.01, shape=shape)
        return tf.Variable(initial)

四、序列采样:

def store_transition(self, s, a, r):
    self.ep_obs.append(s)
    self.ep_as.append(a)
    self.ep_rs.append(r)

五、模型学习:

通过蒙特卡洛完整序列采样,对神经网络进行调整。

def learn(self):
    #evaluate the value of all states in present episode
    discounted_ep_rs = np.zeros_like(self.ep_rs)
    running_add = 0
    for t in reversed(range(0, len(self.ep_rs))):
        running_add = running_add * GAMMA + self.ep_rs[t]
        discounted_ep_rs[t] = running_add
    #normalization
    discounted_ep_rs -= np.mean(discounted_ep_rs)
    discounted_ep_rs /= np.std(discounted_ep_rs)

    # train on episode
    self.session.run(self.train_op, feed_dict={
         self.state_input: np.vstack(self.ep_obs),
         self.tf_acts: np.array(self.ep_as),
         self.tf_vt: discounted_ep_rs,
    })

    self.ep_obs, self.ep_as, self.ep_rs = [], [], []    # empty episode data

六、训练:

# Hyper Parameters
ENV_NAME = ‘CartPole-v0‘
EPISODE = 3000 # Episode limitation
STEP = 3000 # Step limitation in an episode
TEST = 10 # The number of experiment test every 100 episode

def main():
    # initialize OpenAI Gym env and dqn agent
    env = gym.make(ENV_NAME)
    agent = Policy_Gradient(env)

  for episode in range(EPISODE):
    # initialize task
    state = env.reset()
    # Train
    for step in range(STEP):
        action = agent.choose_action(state) # e-greedy action for train
        #take action
        next_state,reward,done,_ = env.step(action)
        #sample
        agent.store_transition(state, action, reward)
        state = next_state
        if done:
            #print("stick for ",step, " steps")
            #model learning after a complete sample
            agent.learn()
            break

    # Test every 100 episodes
    if episode % 100 == 0:
        total_reward = 0
        for i in range(TEST):
            state = env.reset()
            for j in range(STEP):
                env.render()
                action = agent.choose_action(state) # direct action for test
                state,reward,done,_ = env.step(action)
                total_reward += reward
                if done:
                    break
          ave_reward = total_reward/TEST
          print (‘episode: ‘,episode,‘Evaluation Average Reward:‘,ave_reward)

if __name__ == ‘__main__‘:
  main()

reference:

https://www.cnblogs.com/pinard/p/10137696.html

https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/policy_gradient.py

原文地址:https://www.cnblogs.com/jasonlixuetao/p/10926502.html

时间: 2024-10-30 03:50:11

强化学习_PolicyGradient(策略梯度)_代码解析的相关文章

《深入浅出强化学习:原理入门_郭宪方勇纯》高清PDF+源代码

资源链接:https://pan.baidu.com/s/1y6Fl0zUymMySZZhmBToy2Q<深入浅出强化学习:原理入门>高清PDF+源代码高清PDF,284页,带书签目录,彩色配图,文字可以复制.配套源代码.<深入浅出强化学习:原理入门>,作者: 郭宪 / 方勇纯 ,用通俗易懂的语言深入浅出地介绍了强化学习的基本原理,覆盖了传统的强化学习基本方法和当前炙手可热的深度强化学习方法.高清PDF如图: 原文地址:http://blog.51cto.com/14063572/

百度正式发布PaddlePaddle深度强化学习框架PARL

去年,斯坦福大学神经生物实验室与 EPFL 联合举办了一场强化学习赛事--人工智能假肢挑战赛(AI for Prosthetics Challenge),希望将强化学习应用到人体腿部骨骼仿真模拟模型的训练. 经过激烈的角逐,最终来自百度大脑的 NLP 技术团队一举击败众多强劲对手,以9980分的成绩夺得冠军! 近日,百度正式发布在赛事夺冠中起到关键作用的深度强化学习框架  PaddlePaddle PARL,同时开源了基于该框架的 NeurIPS 2018强化学习赛事的完整训练代码.点击"阅读原

强化学习-策略迭代代码实现

1. 前言 今天要重代码的角度给大家详细介绍下策略迭代的原理和实现方式.本节完整代码GitHub. 我们开始介绍策略迭代前,先介绍一个蛇棋的游戏 它是我们后面学习的环境,介绍下它的规则: 玩家每人拥有一个棋子,出发点在图中标为"1"的格子处. 依次掷骰子,根据骰子的点数将自己的棋子向前行进相应的步数.假设笔者的棋子在"1"处,并且投掷出"4",则笔者的棋子就可以到达"5"的位置. 棋盘上有一些梯子,它的两边与棋盘上的两个格子相

强化学习之猜猜我是谁--- Deep Q-Network ^_^

Deep Q-Network和Q-Learning怎么长得这么像,难道它们有关系? 没错,Deep Q-Network其实是Q-Learning融合了神经网络的一种方法 这次我们以打飞机的一个例子来讲解Deep Q-Network,什么打飞机?嘻嘻,我们接着看 简要 Deep Q-Network简称DQN 神经网络有什么作用呢,在Q-Learning中我们使用Q表来记录经验的,通过神经网络我们就不需要Q表了,当我们把状态和动作输入到神经网络中时,经过神经网络的分析等到action,在环境复杂的下

Python学习_列表解析和Lambda表达式

1.根据要求创建列表threes_and_fives(列表值包括1到15中能够被3或者5正常的数) threes_and_fives=[x for x in range(1,16) if x%3==0 or x%5==0] 2.lambda表达式实例(剔除掉列表中的"X") garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX" message

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

强化学习之智能出租车项目总结

项目介绍 这是优达学院机器学习课程的第4个实习项目,需要训练智能出租车学习交通规则,然后安全可靠地到达目的地.项目通过循序渐进的方式展开,从熟悉基本的领域知识开始,再以随机动作来直观感受智能车的状态,也是在这一步,让初学者有了心潮澎湃的感觉,"车终于动了!",是的,从0开始一路走来,以游戏闯关的方式,终于来到了4级,第一次体验了传说中的"智能"了,也许是"眼见为实"吧,小车在自己算法的控制之下行动,是一种很美好的感受.然后项目通过引导,让大家开始

强化学习(八)价值函数的近似表示与Deep Q-Learning

在强化学习系列的前七篇里,我们主要讨论的都是规模比较小的强化学习问题求解算法.今天开始我们步入深度强化学习.这一篇关注于价值函数的近似表示和Deep Q-Learning算法. Deep Q-Learning这一篇对应Sutton书的第11章部分和UCL强化学习课程的第六讲. 1. 为何需要价值函数的近似表示 在之前讲到了强化学习求解方法,无论是动态规划DP,蒙特卡罗方法MC,还是时序差分TD,使用的状态都是离散的有限个状态集合$\mathbb{S}$.此时问题的规模比较小,比较容易求解.但是假

强化学习杂谈

目录 强化学习从入门到放弃 杂谈 MDP MP MRP MDP Planning by Dynamic Programming iterative policy evaluation policy iteration value iteration 蒙特卡洛 and TD Monte-Carlo Policy Evaluation TD:Temporal-Difference Learning MODEL FREE control GLIE MC Control Updating Action-