EVRLLib is a library implementing policy gradient algorithms in Reinforcement Learning.
The library contains two packages: simulators (contains routines for sampling trajectories from environments and simulators) and RLAgents (all the implementations of RL Agents are located there).
- Reinforce
- Reinforce with state-dependent baselines
- A2C
- EV (Empirical Variance Minimization)
- EVv (variance)
- EVm (2nd moment)
torch >= 1.7.1
numpy >= 1.17.2
gym >= 0.18.0
if you are planning to work with Minigrid environments (supported by GymSimulators since they have gym-like interface), then
gym-minigrid >= 1.0.2
Download the archive, then being in root folder call
pip install -e .Agent's init() method has following arguments:
- list_policy_net: List[torch.nn.Module] -- list of policies nets, modelling the policy
- value_net: torch.nn.Module -- value network
- simulator: simulator -- simulator object
- n_trajectories: int -- number of trajectories in MC estimate of the gradient
- policy: str -- distribution to sample actions for continuous env
- device: str -- device to use with torch
- baseline_loss: str -- loss to use for baseline training (ONLY IF EVM USED) var: full empirical variance 2ndMoment: only the second moment
- nTrajectoriesForGradVar: int -- number of trajectories to evaluate gradient variance
Agent's train() method has following arguments:
- n_epochs: int -- number of epochs
- max_step: int -- maximum length of sampled trajectory from the simulator
- lr: float -- learning rate, parameter of the optimizer
- eval_func: func -- function for evaluation: accepts current agent and return statistics after agent.evaluate(n_samples, max_step)
- eval_per_epochs: int -- perform eval_func each eval_per_epochs epochs
- step_size: int -- scheduler stepsize, parameter of the optimizer
- gamma: float -- discounting factor
- entropy_const: float -- const by which the policy entropy is multiplied
- verbose: int -- verbosity parameter, set this positive and print meanRewards every verbose epochs
- count_grad_variance: int -- count gradient variance each count_grad_variance epochs. -1 value disables this option
Here is a simple example, how to use simulator and RLagent for training in gym environment:
# import main libraries
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.nn.functional as F
from hdirllib.simulators import pythonSimulators as pySim
import hdirllib.rlagents.ReinforceA2C as ReinforceA2C
import time
import pickle
import gym
import matplotlib.pyplot as plt
env_name = "CartPole-v1" # choose environment
env = gym.make(env_name)
simulator = pySim.GymSimulator(env) # initialize simulator
# create simple policy and simple baseline
class PolicyValuePair:
def __init__(self):
policyNet1 = nn.Sequential(
nn.Linear(simulator.stateSpaceShape[0], 128),
nn.Linear(128, simulator.actionSpaceN),
nn.Softmax(dim=-1)
)
self.policyNet = [policyNet1]
self.valueNet = nn.Sequential(nn.Linear(simulator.stateSpaceShape[0], 128), nn.ReLU(), nn.Linear(128, 1))
polval = PolicyValuePair()
policyNets = polval.policyNet
valueNet = polval.valueNet
# initialize A2C agent
agent = ReinforceA2C.ReinforceA2CBaseline(
policyNets,
valueNet,
simulator,
n_trajectories=2,
nTrajectoriesForGradVar=2
)
# function for intermediate evaluation (not necessary)
def evaluation_A2C(current_agent):
env_eval = gym.make(env_name)
simulator_eval = pySim.GymSimulator(env_eval)
agent_eval = ReinforceA2C.ReinforceA2CBaseline(current_agent.policyNets, current_agent.valueNet,
simulator_eval, n_trajectories=2)
stats = agent_eval.evaluate(n_samples=5, max_step=3000)
return stats
logsA2C = agent.train(
n_epochs=600,
lr=1e-3,
max_step=200,
verbose=50,
entropy_const=0.075,
step_size=750,
gamma=0.99,
eval_func=evaluation_A2C,
eval_per_epochs=100,
count_grad_variance=-1
)After training is completed, logsA2C contain different statistics. For example:
plt.figure(figsize=(13, 7))
plt.grid()
plt.ylabel("Reward")
plt.xlabel("Epoch")
plt.plot(pd.Series(logsA2C['meanRewards']).rolling(10).mean())