├── README.md ├── Test_results.ipynb ├── agent.py ├── learner.py ├── logz.py ├── plot.py └── utilities.py /README.md: -------------------------------------------------------------------------------- 1 | # Optimal-bidding-policy-using-Policy-Gradient-in-a-Multi-agent-Contextual-Bandit-setting 2 | ## Problem Definition 3 | We consider the multi-agent competitive contextual bandit setting where each agent must learn a policy that maps from the state to action space such that each agent’s expected reward is maximized given the other agents’ bidding policy. We also assume that none of the agents have any visibility to the actions of the other agents. 4 | 5 | Concretely, we consider a 2 agent setting (this can be easily extended to a multi-agent setting) where each agent submits bids comprising price-quantity tuples for a product in the day-ahead market. The market regulator stacks up the bids of all the agents to construct the supply curve. The demand curve is similarly constituted and the market clearing price and quantities are obtained. Agents which bid at prices less than the market clearing prices get their quantities sold in the day ahead market and earn income. The agent’s profit is computed by deducting the cost of production which is assumed to be the product of the marginal cost of production and the quantity sold. 6 | 7 | In determining an optimal policy so as to maximize its expected profit, the agent must take into account the value of the state that influences both its cost of production and the demand curve. For instance, oil prices could determine the cost of production while weather conditions could influence the shape and position of the demand curve for the product. 8 | 9 | In a single agent setting, this would constitute a contextual bandit problem where the agent simply needs to learn a mapping from the state space to the action space in a stationary environment. In a multi-agent setting, apart from state, the agent’s profit will also be influenced by the bids submitted by competing agents. These bids are not visible and would be part of the agent’s environment. Since agents will continue to explore and tweak their policies, each agent’s environment will be non-stationary. In the multi-agent setting, therefore, the agents must explore policies and arrive at a Nash Equilibrium at which point none of the agent has an incentive to change its policy given the other agent’s bidding policy. 10 | 11 | Given that the agent’s profit is a non-linear function of the state (and the actions of the other agent), we use a neural network to learn a parameterized policy for each agent. We then use a policy gradient algorithm, [REINFORCE](http://www-anw.cs.umass.edu/~barto/courses/cs687/williams92simple.pdf), to jointly optimize each agent’s policy network until we attain a Nash equilibrium. 12 | 13 | ## Algorithm for multi-agent contextual bandits 14 | The base algorithm of the basic multi-agent bidding problem is presented below: 15 | * Randomly initialize all the agents’ policy networks 16 | * Repeat until convergence 17 | * Generate a batch of states and for each state, sample each agent’s action based on the current state of its policy network 18 | * Submit the state-action tuples to the regulator to get the corresponding batch of rewards for each agent 19 | * Use REINFORCE to update each agent’s policy network parameters 20 | 21 | As noted in [1](https://www.ri.cmu.edu/wp-content/uploads/2017/06/thesis-Chou.pdf), we find that modelling the policy using the Beta distribution instead of the Gaussian improves training. This is especially useful in settings where the action space is constrained within a range, say the range of positive real numbers, and using the Gaussian creates training inefficiencies. Finally, the variance of the reward can be mitigated by partitioning the state space and training separate agent models for each sub-space. This idea has been explored in the full blown MDP setting as well in [2](https://arxiv.org/abs/1711.09874). 22 | 23 | ## Technology Stack 24 | We implement the model using Tensorflow. We have taken helper code for implementing REINFORCE with a baseline from [CS294 Assignment 2](http://rll.berkeley.edu/deeprlcourse/f17docs/hw2_final.pdf). 25 | 26 | -------------------------------------------------------------------------------- /Test_results.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 14, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Running experiment with seed 87\n" 13 | ] 14 | } 15 | ], 16 | "source": [ 17 | "%run learner.py -n 25000 -b 25 -l 3 -s 32 -lr 1e-3 --exp_name trial" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 3, 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "data": { 27 | "image/png": "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\n", 28 | "text/plain": [ 29 | "" 30 | ] 31 | }, 32 | "metadata": {}, 33 | "output_type": "display_data" 34 | }, 35 | { 36 | "data": { 37 | "image/png": "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\ngg==\n", 38 | "text/plain": [ 39 | "" 40 | ] 41 | }, 42 | "metadata": {}, 43 | "output_type": "display_data" 44 | } 45 | ], 46 | "source": [ 47 | "%run plot.py data/trial_08-03-2018_20-52-49 --value AverageProfit_agt1 AverageProfit_agt2" 48 | ] 49 | } 50 | ], 51 | "metadata": { 52 | "kernelspec": { 53 | "display_name": "Python 3", 54 | "language": "python", 55 | "name": "python3" 56 | }, 57 | "language_info": { 58 | "codemirror_mode": { 59 | "name": "ipython", 60 | "version": 3 61 | }, 62 | "file_extension": ".py", 63 | "mimetype": "text/x-python", 64 | "name": "python", 65 | "nbconvert_exporter": "python", 66 | "pygments_lexer": "ipython3", 67 | "version": "3.6.1" 68 | } 69 | }, 70 | "nbformat": 4, 71 | "nbformat_minor": 2 72 | } 73 | -------------------------------------------------------------------------------- /agent.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import tensorflow as tf 3 | from utilities import * 4 | 5 | class Agent(object): 6 | def __init__(self,env,n_layers,size,lr,name): 7 | self.ob_dim=env.state_dim 8 | self.ac_dim=env.action_dim 9 | self.name=name 10 | self.n_layers=n_layers 11 | self.size=size 12 | self.lr=lr 13 | self.c1=0.0 14 | self.c2=100.0 15 | self.HR=HR 16 | self.build() 17 | 18 | def _create_placeholders(self): 19 | with tf.variable_scope(self.name): 20 | self.actions=tf.placeholder(shape=[None, self.ac_dim],name="actions",dtype=tf.float32) 21 | self.states=tf.placeholder(shape=[None, self.ob_dim],name="state",dtype=tf.float32) 22 | self.adv=tf.placeholder(shape=[None],name="adv",dtype=tf.float32) 23 | 24 | def _policy_parameters(self): 25 | alpha,beta=policy_network(self.states,self.ac_dim,self.name,n_layers=self.n_layers,size=self.size) 26 | return alpha,beta 27 | 28 | def _compute_logprob(self,alpha,beta): 29 | with tf.variable_scope(self.name): 30 | sy_z1 = (self.actions-self.c1)/self.c2 31 | logprob=tf.reduce_sum((alpha-1.0)*tf.log(sy_z1)+(beta-1.0)*tf.log(1-sy_z1)+tf.lgamma(alpha+beta)-tf.lgamma(alpha)-tf.lgamma(beta),axis=1) 32 | return logprob 33 | 34 | def _create_feed_dict(self,states,advantages,actions): 35 | return {self.states: states, 36 | self.adv: advantages, 37 | self.actions:actions} 38 | 39 | def _add_loss_op(self,logprob): 40 | total_loss = -tf.reduce_mean(logprob*self.adv) + tf.reduce_mean(logprob)*0.1 41 | update_op = tf.train.AdamOptimizer(self.lr).minimize(total_loss) 42 | return total_loss,update_op 43 | 44 | def build(self): 45 | self._create_placeholders() 46 | self.alpha,self.beta=self._policy_parameters() 47 | self.logprob=self._compute_logprob(self.alpha,self.beta) 48 | self.loss,self.train_op=self._add_loss_op(self.logprob) 49 | 50 | def sample_actions(self,session,states): 51 | alpha,beta = session.run([self.alpha,self.beta],feed_dict={self.states:states}) 52 | prices = np.random.beta(alpha,beta)*self.c2+self.c1 53 | mean_prices = alpha/(alpha+beta)*self.c2+self.c1 54 | return prices,mean_prices 55 | 56 | def improve_policy(self,session,states,advantages,actions): 57 | feed_dict=self._create_feed_dict(states,advantages,actions) 58 | loss,_ = session.run([self.loss,self.train_op],feed_dict=feed_dict) 59 | return loss 60 | -------------------------------------------------------------------------------- /learner.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import tensorflow as tf 3 | import logz 4 | import scipy.signal 5 | import os 6 | import time 7 | import inspect 8 | from multiprocessing import Process 9 | from utilities import * 10 | from agent import * 11 | 12 | 13 | def get_rewards(env,ag1_prices,ag2_prices): 14 | actions=np.concatenate((ag1_prices,ag2_prices),axis=1) 15 | rewards = env.get_rewards(actions) 16 | ag1_rewards = rewards[:,0] 17 | ag2_rewards = rewards[:,1] 18 | return ag1_rewards,ag2_rewards 19 | 20 | 21 | #learn Nash Eq policy & reward for an agent given another agent's deterministic policy 22 | def get_Nash_reward(sess,agent1_Nash,agent2,env): 23 | batch_size=50 24 | 25 | for itr in range(1000): 26 | s = env.samplestates(batch_size) 27 | 28 | ag1_prices,_=agent1_Nash.sample_actions(sess,s) 29 | 30 | # we now sample actions deterministically for agent 2 31 | _,ag2_prices=agent2.sample_actions(sess,s) 32 | 33 | ag1_rewards,ag2_rewards=get_rewards(env,ag1_prices,ag2_prices) 34 | 35 | ag1_adv = normalize(ag1_rewards) 36 | 37 | _=agent1_Nash.improve_policy(sess,s,ag1_adv,ag1_prices) 38 | 39 | #get smart reward for policy learnt by agent 40 | _,_,m1_m,_,_,_=get_smart_rewards(sess,agent1_Nash,agent2,env) 41 | 42 | return m1_m 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | #given agents' policies, compute the degree of deviation from the true Nash equilibrium 51 | def assess_policy_accuracy(sess,agent1,agent1_Nash,agent2,agent2_Nash,env): 52 | #keep agent 2's policies fixed and learn agent 1's policies from scratch 53 | print("Computing Nash Soln for Agent 1") 54 | ag1_nash=get_Nash_reward(sess,agent1_Nash,agent2,env) 55 | print("Agent1's Nash Profit: " + repr(ag1_nash)) 56 | 57 | _,_,m1_m,m2_m,_,_=get_smart_rewards(sess,agent1,agent2,env) 58 | print("Agent1's MARL profit: " + repr(m1_m)) 59 | 60 | 61 | ag1_acc= m1_m/(ag1_nash) 62 | print("Agent1 Accuracy: "+ repr(ag1_acc)) 63 | 64 | #keep agent 1's policies fixed and learn agent 2's policies from scratch 65 | print("Computing Nash Soln for Agent 2") 66 | ag2_nash=get_Nash_reward(sess,agent2_Nash,agent1,env) 67 | print("Agent2's Nash Profit: " + repr(ag2_nash)) 68 | 69 | print("Agent2's MARL profit: " + repr(m2_m)) 70 | ag2_acc= (m2_m)/(ag2_nash) 71 | print("Agent2 Accuracy: "+ repr(ag2_acc)) 72 | 73 | return ag1_acc,ag2_acc 74 | 75 | 76 | 77 | #get rewards when both agents bid at their smart policies 78 | def get_smart_rewards(sess,agent1,agent2,env): 79 | 80 | s = env.getNextObservations(5000) 81 | 82 | ag1_prices,ag1_mean=agent1.sample_actions(sess,s) 83 | ag2_prices,ag2_mean=agent2.sample_actions(sess,s) 84 | 85 | m1,m2=get_rewards(env,ag1_prices,ag2_prices) 86 | m1_m,m2_m=get_rewards(env,ag1_mean,ag2_mean) 87 | 88 | 89 | ag1_p = np.mean(ag1_mean,axis = 0) 90 | ag2_p = np.mean(ag2_mean,axis = 0) 91 | 92 | return np.mean(m1),np.mean(m2),np.mean(m1_m),np.mean(m2_m),ag1_p,ag2_p 93 | 94 | 95 | 96 | 97 | 98 | #============================================================================================# 99 | # Use Policy Gradient Theorem to modify both agents' policies 100 | #============================================================================================# 101 | def train_PG(exp_name='', 102 | batch_size = 250, 103 | n_episodes=25000, 104 | learning_rate=1e-3, 105 | logdir=None, 106 | seed=0, 107 | # network arguments 108 | n_layers=2, 109 | size=64 110 | ): 111 | 112 | env = Environment() 113 | agent1=Agent(env,n_layers,size,learning_rate,"agent1") 114 | agent2=Agent(env,n_layers,size,learning_rate,"agent2") 115 | agent1_Nash=Agent(env,3,32,1e-2,"agent1_Nash") 116 | agent2_Nash=Agent(env,3,32,1e-2,"agent2_Nash") 117 | 118 | 119 | start = time.time() 120 | 121 | # Configure output directory for logging 122 | logz.configure_output_dir(logdir) 123 | 124 | # Log experimental parameters 125 | args = inspect.getargspec(train_PG)[0] 126 | locals_ = locals() 127 | params = {k: locals_[k] if k in locals_ else None for k in args} 128 | logz.save_params(params) 129 | 130 | 131 | # Set random seeds 132 | tf.set_random_seed(seed) 133 | np.random.seed(seed) 134 | 135 | n_iter = n_episodes // batch_size 136 | 137 | #========================================================================================# 138 | # Tensorflow Engineering: Config, Session, Variable initialization 139 | #========================================================================================# 140 | 141 | tf_config = tf.ConfigProto(inter_op_parallelism_threads=1,intra_op_parallelism_threads=1) 142 | sess = tf.Session(config=tf_config) 143 | sess.__enter__() # equivalent to `with sess:` 144 | tf.global_variables_initializer().run() #pylint: disable=E1101 145 | 146 | #========================================================================================# 147 | # Training Loop 148 | #========================================================================================# 149 | 150 | 151 | 152 | for itr in range(n_iter): 153 | print("********** Iteration %i ************"%itr) 154 | #simulate a batch of temperature-gas price states 155 | s = env.samplestatess(batch_size) 156 | 157 | ag1_prices,_ =agent1.sample_actions(sess,s) 158 | ag2_prices,_ =agent2.sample_actions(sess,s) 159 | 160 | 161 | #====================================================================================# # Feed agents' actions into the market simulator and obtain corresponding rewards 162 | #====================================================================================# 163 | #Convert agent RTM actions to corresponding prices 164 | ag1_rewards,ag2_rewards=get_rewards(env,ag1_prices,ag2_prices) 165 | 166 | #====================================================================================# 167 | # 168 | # Advantage Normalization 169 | #====================================================================================# 170 | ag1_adv = normalize(ag1_rewards) 171 | ag2_adv = normalize(ag2_rewards) 172 | 173 | 174 | #====================================================================================# 175 | # 176 | # Performing the Policy Update 177 | #====================================================================================# 178 | #update policy parameters for agent1 179 | #if (itr % 20 < 10): 180 | loss1=agent1.improve_policy(sess,s,ag1_adv,ag1_prices) 181 | #update policy parameters for agent2 182 | #else: 183 | loss2=agent2.improve_policy(sess,s,ag2_adv,ag2_prices) 184 | 185 | 186 | # Log diagnostics 187 | logz.log_tabular("Time", time.time() - start) 188 | logz.log_tabular("Iteration", itr) 189 | logz.log_tabular("AverageProfit_agt1", np.mean(ag1_rewards)) 190 | logz.log_tabular("AverageProfit_agt2", np.mean(ag2_rewards)) 191 | 192 | 193 | logz.log_tabular("Agt1_StdReturn", np.std(ag1_rewards)) 194 | logz.log_tabular("Agt2_StdReturn", np.std(ag2_rewards)) 195 | 196 | logz.log_tabular("Agt1_MaxReturn", np.max(ag1_rewards)) 197 | logz.log_tabular("Agt2_MaxReturn", np.max(ag2_rewards)) 198 | 199 | logz.log_tabular("Agt1_MinReturn", np.min(ag1_rewards)) 200 | logz.log_tabular("Agt2_MinReturn", np.min(ag2_rewards)) 201 | 202 | 203 | logz.dump_tabular() 204 | logz.pickle_tf_vars() 205 | 206 | m1,m2,m1_m,m2_m,ag1_p,ag2_p=get_smart_rewards(sess,agent1,agent2,env) 207 | print("Agent1 Stochastic Profit: "+ repr(m1)) 208 | print("Agent2 Stochastic Profit: "+ repr(m2)) 209 | 210 | print("Agent1 Deterministic Profit: "+ repr(m1_m)) 211 | print("Agent2 Deterministic Profit: "+ repr(m2_m)) 212 | 213 | print("Agent1 Mean Price") 214 | print (ag1_p) 215 | print("Agent2 Prices") 216 | print (ag2_p) 217 | 218 | print("Assessing degree of deviation from Nash Eq") 219 | ag1_imp,ag2_imp=assess_policy_accuracy(sess,agent1,agent1_Nash,agent2,agent2_Nash,env) 220 | print("Agent1 Accuracy: "+ repr(ag1_imp)) 221 | print("Agent2 Accuracy: "+ repr(ag2_imp)) 222 | 223 | 224 | 225 | 226 | def main(): 227 | import argparse 228 | parser = argparse.ArgumentParser() 229 | parser.add_argument('--exp_name', type=str, default='vpg') 230 | parser.add_argument('--n_episodes', '-n', type=int, default=25000) 231 | parser.add_argument('--batch_size', '-b', type=int, default=5) 232 | parser.add_argument('--learning_rate', '-lr', type=float, default=1e-2) 233 | parser.add_argument('--seed', type=int, default=1) 234 | parser.add_argument('--n_experiments', '-e', type=int, default=1) 235 | parser.add_argument('--n_layers', '-l', type=int, default=3) 236 | parser.add_argument('--size', '-s', type=int, default=64) 237 | 238 | 239 | args = parser.parse_args() 240 | 241 | if not(os.path.exists('data')): 242 | os.makedirs('data') 243 | logdir = args.exp_name + '_' + time.strftime("%d-%m-%Y_%H-%M-%S") 244 | logdir = os.path.join('data', logdir) 245 | if not(os.path.exists(logdir)): 246 | os.makedirs(logdir) 247 | 248 | 249 | return args, logdir 250 | 251 | def train_func(args, seed, logdir): 252 | train_PG( 253 | exp_name=args.exp_name, 254 | batch_size=args.batch_size, 255 | n_episodes=args.n_episodes, 256 | learning_rate=args.learning_rate, 257 | logdir=os.path.join(logdir,'%d'%seed), 258 | seed=seed, 259 | n_layers=args.n_layers, 260 | size=args.size 261 | ) 262 | 263 | if __name__ == "__main__": 264 | args, logdir = main() 265 | __spec__ = "ModuleSpec(name='builtins', loader=)" 266 | for e in range(args.n_experiments): 267 | seed = args.seed + e 268 | print('Running experiment with seed %d'%seed) 269 | p = Process(target=train_func,args= (args,seed,logdir,)) 270 | p.start() 271 | p.join() 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | -------------------------------------------------------------------------------- /logz.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | """ 4 | 5 | Some simple logging functionality, inspired by rllab's logging. 6 | Assumes that each diagnostic gets logged each iteration 7 | 8 | Call logz.configure_output_dir() to start logging to a 9 | tab-separated-values file (some_folder_name/log.txt) 10 | 11 | To load the learning curves, you can do, for example 12 | 13 | A = np.genfromtxt('/tmp/expt_1468984536/log.txt',delimiter='\t',dtype=None, names=True) 14 | A['EpRewMean'] 15 | 16 | """ 17 | 18 | import os.path as osp, shutil, time, atexit, os, subprocess 19 | import pickle 20 | import tensorflow as tf 21 | 22 | color2num = dict( 23 | gray=30, 24 | red=31, 25 | green=32, 26 | yellow=33, 27 | blue=34, 28 | magenta=35, 29 | cyan=36, 30 | white=37, 31 | crimson=38 32 | ) 33 | 34 | def colorize(string, color, bold=False, highlight=False): 35 | attr = [] 36 | num = color2num[color] 37 | if highlight: num += 10 38 | attr.append(str(num)) 39 | if bold: attr.append('1') 40 | return '\x1b[%sm%s\x1b[0m' % (';'.join(attr), string) 41 | 42 | class G: 43 | output_dir = None 44 | output_file = None 45 | first_row = True 46 | log_headers = [] 47 | log_current_row = {} 48 | 49 | def configure_output_dir(d=None): 50 | """ 51 | Set output directory to d, or to /tmp/somerandomnumber if d is None 52 | """ 53 | G.output_dir = d or "/tmp/experiments/%i"%int(time.time()) 54 | assert not osp.exists(G.output_dir), "Log dir %s already exists! Delete it first or use a different dir"%G.output_dir 55 | os.makedirs(G.output_dir) 56 | G.output_file = open(osp.join(G.output_dir, "log.txt"), 'w') 57 | atexit.register(G.output_file.close) 58 | print(colorize("Logging data to %s"%G.output_file.name, 'green', bold=True)) 59 | 60 | def log_tabular(key, val): 61 | """ 62 | Log a value of some diagnostic 63 | Call this once for each diagnostic quantity, each iteration 64 | """ 65 | if G.first_row: 66 | G.log_headers.append(key) 67 | else: 68 | assert key in G.log_headers, "Trying to introduce a new key %s that you didn't include in the first iteration"%key 69 | assert key not in G.log_current_row, "You already set %s this iteration. Maybe you forgot to call dump_tabular()"%key 70 | G.log_current_row[key] = val 71 | 72 | def save_params(params): 73 | with open(osp.join(G.output_dir, "params.json"), 'w') as out: 74 | out.write(json.dumps(params, separators=(',\n','\t:\t'), sort_keys=True)) 75 | 76 | def pickle_tf_vars(): 77 | """ 78 | Saves tensorflow variables 79 | Requires them to be initialized first, also a default session must exist 80 | """ 81 | _dict = {v.name : v.eval() for v in tf.global_variables()} 82 | with open(osp.join(G.output_dir, "vars.pkl"), 'wb') as f: 83 | pickle.dump(_dict, f) 84 | 85 | 86 | def dump_tabular(): 87 | """ 88 | Write all of the diagnostics from the current iteration 89 | """ 90 | vals = [] 91 | key_lens = [len(key) for key in G.log_headers] 92 | max_key_len = max(15,max(key_lens)) 93 | keystr = '%'+'%d'%max_key_len 94 | fmt = "| " + keystr + "s | %15s |" 95 | n_slashes = 22 + max_key_len 96 | print("-"*n_slashes) 97 | for key in G.log_headers: 98 | val = G.log_current_row.get(key, "") 99 | if hasattr(val, "__float__"): valstr = "%8.3g"%val 100 | else: valstr = val 101 | print(fmt%(key, valstr)) 102 | vals.append(val) 103 | print("-"*n_slashes) 104 | if G.output_file is not None: 105 | if G.first_row: 106 | G.output_file.write("\t".join(G.log_headers)) 107 | G.output_file.write("\n") 108 | G.output_file.write("\t".join(map(str,vals))) 109 | G.output_file.write("\n") 110 | G.output_file.flush() 111 | G.log_current_row.clear() 112 | G.first_row=False 113 | -------------------------------------------------------------------------------- /plot.py: -------------------------------------------------------------------------------- 1 | import seaborn as sns 2 | import pandas as pd 3 | import matplotlib.pyplot as plt 4 | import json 5 | import os 6 | 7 | """ 8 | Using the plotter: 9 | 10 | Call it from the command line, and supply it with logdirs to experiments. 11 | Suppose you ran an experiment with name 'test', and you ran 'test' for 10 12 | random seeds. The runner code stored it in the directory structure 13 | 14 | data 15 | L test_EnvName_DateTime 16 | L 0 17 | L log.txt 18 | L params.json 19 | L 1 20 | L log.txt 21 | L params.json 22 | . 23 | . 24 | . 25 | L 9 26 | L log.txt 27 | L params.json 28 | 29 | To plot learning curves from the experiment, averaged over all random 30 | seeds, call 31 | 32 | python plot.py data/test_EnvName_DateTime --value AverageReturn 33 | 34 | and voila. To see a different statistics, change what you put in for 35 | the keyword --value. You can also enter /multiple/ values, and it will 36 | make all of them in order. 37 | 38 | 39 | Suppose you ran two experiments: 'test1' and 'test2'. In 'test2' you tried 40 | a different set of hyperparameters from 'test1', and now you would like 41 | to compare them -- see their learning curves side-by-side. Just call 42 | 43 | python plot.py data/test1 data/test2 44 | 45 | and it will plot them both! They will be given titles in the legend according 46 | to their exp_name parameters. If you want to use custom legend titles, use 47 | the --legend flag and then provide a title for each logdir. 48 | 49 | """ 50 | 51 | def plot_data(data, value="AverageReturn"): 52 | if isinstance(data, list): 53 | data = pd.concat(data, ignore_index=True) 54 | sns.set(style="darkgrid", font_scale=1.5) 55 | sns.tsplot(data=data, time="Iteration", value=value, unit="Unit", condition="Condition") 56 | plt.legend(loc='best').draggable() 57 | plt.show() 58 | 59 | 60 | def get_datasets(fpath, condition=None): 61 | unit = 0 62 | datasets = [] 63 | for root, dir, files in os.walk(fpath): 64 | if 'log.txt' in files: 65 | param_path = open(os.path.join(root,'params.json')) 66 | params = json.load(param_path) 67 | exp_name = params['exp_name'] 68 | 69 | log_path = os.path.join(root,'log.txt') 70 | experiment_data = pd.read_table(log_path) 71 | 72 | experiment_data.insert( 73 | len(experiment_data.columns), 74 | 'Unit', 75 | unit 76 | ) 77 | experiment_data.insert( 78 | len(experiment_data.columns), 79 | 'Condition', 80 | condition or exp_name 81 | ) 82 | 83 | datasets.append(experiment_data) 84 | unit += 1 85 | 86 | return datasets 87 | 88 | 89 | def main(): 90 | import argparse 91 | parser = argparse.ArgumentParser() 92 | parser.add_argument('logdir', nargs='*') 93 | parser.add_argument('--legend', nargs='*') 94 | parser.add_argument('--value', default='AverageReturn', nargs='*') 95 | args = parser.parse_args() 96 | 97 | use_legend = False 98 | if args.legend is not None: 99 | assert len(args.legend) == len(args.logdir), \ 100 | "Must give a legend title for each set of experiments." 101 | use_legend = True 102 | 103 | data = [] 104 | if use_legend: 105 | for logdir, legend_title in zip(args.logdir, args.legend): 106 | data += get_datasets(logdir, legend_title) 107 | else: 108 | for logdir in args.logdir: 109 | data += get_datasets(logdir) 110 | 111 | if isinstance(args.value, list): 112 | values = args.value 113 | else: 114 | values = [args.value] 115 | for value in values: 116 | plot_data(data, value=value) 117 | 118 | if __name__ == "__main__": 119 | main() 120 | -------------------------------------------------------------------------------- /utilities.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | import numpy as np 4 | import subprocess 5 | import tensorflow as tf 6 | 7 | def normalize(data, mean=0.0, std=1.0): 8 | n_data = (data - np.mean(data)) / (np.std(data) + 1e-8) 9 | return n_data * (std + 1e-8) + mean 10 | 11 | #outputs parameters of Beta distribution 12 | def policy_network( 13 | input_placeholder, 14 | output_size, 15 | scope, 16 | n_layers=3, 17 | size=32, 18 | activation=tf.tanh, 19 | output_activation=None 20 | ): 21 | 22 | with tf.variable_scope(scope): 23 | out = input_placeholder 24 | for _ in range(n_layers): 25 | out = tf.layers.dense(inputs=out, units=size, activation=activation) 26 | out_1 = tf.layers.dense(inputs=out, units=size, activation=activation) 27 | 28 | out_cont = tf.layers.dense(inputs=out_1, units=output_size, activation=output_activation) 29 | alpha = tf.log(tf.exp(out_cont)+1.0)+1.00 30 | 31 | out_cont1 = tf.layers.dense(inputs=out_1, units=output_size, activation=output_activation) 32 | beta = tf.log(tf.exp(out_cont1)+1.0)+1.00 33 | 34 | return alpha,beta 35 | 36 | #template for a generic environment class for the multi-agent contextual bandit setting 37 | #the environment object should sample states from the state distribution,and 38 | #fetch rewards for the actions submitted by the agents 39 | class Environment: 40 | def __init__(self,seed=32): 41 | 42 | 43 | #sample state based on initial distibution 44 | def samplestates(self, batch_size): 45 | 46 | return s 47 | 48 | #implement function that takes actions of all the agents and outputs corresponding rewards 49 | def get_rewards(self, actions): 50 | 51 | return rewards 52 | --------------------------------------------------------------------------------