{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Understanding Neurogym Task\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/neurogym/neurogym/blob/master/examples/understanding_neurogym_task.ipynb)\n", "\n", "This is a tutorial for understanding Neurogym task structure. Here we will go through\n", "1. Defining a basic OpenAI gym task\n", "2. Defining a basic trial-based neurogym task\n", "3. Adding observation and ground truth in neurogym tasks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Installation\n", "\n", "Only needed if running in Google colab. Uncomment to run." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# # Install gym\n", "# ! pip install gym\n", "\n", "# # Install neurogym\n", "# ! git clone https://github.com/gyyang/neurogym.git\n", "# %cd neurogym/\n", "# ! pip install -e ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### OpenAI gym tasks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Neurogym tasks follow basic [OpenAI gym](https://gym.openai.com/) tasks format. Each task is defined as a Python class, inheriting from the ```gym.Env``` class.\n", "\n", "In this section we describe basic structure for an OpenAI gym task.\n", "\n", "In the ```__init__``` method, it is necessary to define two attributes, ```self.observation_space``` and ```self.action_space``` which describe the kind of spaces used by observations (network inputs) and actions (network outputs)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sample random observation value\n", "[0.28708524 0.2543813 ]\n", "Sample random action value\n", "1\n" ] } ], "source": [ "import warnings\n", "warnings.filterwarnings(\"ignore\") # to suppress warnings\n", "\n", "import numpy as np\n", "import gym\n", "\n", "class MyEnv(gym.Env):\n", " def __init__(self):\n", " super().__init__() # Python boilerplate to initialize base class\n", "\n", " # A two-dimensional box with minimum and maximum value set by low and high\n", " self.observation_space = gym.spaces.Box(low=0., high=1., shape=(2,))\n", " \n", " # A discrete space with 3 possible values (0, 1, 2)\n", " self.action_space = gym.spaces.Discrete(3)\n", " \n", "# Instantiate an environment\n", "env = MyEnv()\n", "print('Sample random observation value')\n", "print(env.observation_space.sample())\n", "print('Sample random action value')\n", "print(env.action_space.sample())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another key method that needs to be defined is the ```step``` method, which updates the environment and outputs observations and rewards after receiving the agent's action.\n", "\n", "The ```step``` method takes ```action``` as inputs, and outputs \n", " the agent's next observation ```observation```,\n", " a scalar reward received by the agent ```reward```,\n", " a boolean describing whether the environment needs to be reset ```done```, and\n", " a dictionary holding any additional information ```info```.\n", " \n", "If the environment is described by internal states, the ```reset``` method would reset these internal states. This method returns an initial observation ```observation```." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class MyEnv(gym.Env):\n", " def __init__(self):\n", " super().__init__() # Python boilerplate to initialize base class\n", " self.observation_space = gym.spaces.Box(low=-10., high=10., shape=(1,))\n", " self.action_space = gym.spaces.Discrete(3)\n", " \n", " def step(self, action):\n", " ob = self.observation_space.sample() # random sampling\n", " reward = 1. # reward\n", " done = False # never ending\n", " info = {} # empty dictionary\n", " return ob, reward, done, info\n", " \n", " def reset(self):\n", " ob = self.observation_space.sample()\n", " return ob" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we define a simple task where actions move an agent along a one-dimensional line. The reward is determined by the agent's location on this line." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Reward')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "def get_reward(x):\n", " return np.sin(x) * np.exp(-np.abs(x)/3)\n", "\n", "xs = np.linspace(-10, 10, 100)\n", "plt.plot(xs, get_reward(xs))\n", "plt.xlabel('State value (observation)')\n", "plt.ylabel('Reward')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class MyEnv(gym.Env):\n", " def __init__(self):\n", " # A one-dimensional box with minimum and maximum value set by low and high\n", " self.observation_space = gym.spaces.Box(low=-10., high=10., shape=(1,))\n", " \n", " # A discrete space with 3 possible values (0, 1, 2)\n", " self.action_space = gym.spaces.Discrete(3)\n", " \n", " self.state = 0.\n", " \n", " def step(self, action):\n", " # Actions 0, 1, 2 correspond to state change of -0.1, 0, +0.1 \n", " self.state += (action - 1.) * 0.1\n", " self.state = np.clip(self.state, -10, 10)\n", " \n", " ob = self.state # observation\n", " reward = get_reward(self.state) # reward\n", " done = False # never ending\n", " info = {} # empty dictionary\n", " return ob, reward, done, info\n", " \n", " def reset(self):\n", " # Re-initialize state\n", " self.state = self.observation_space.sample()\n", " return self.state" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An agent can interact with the environment iteratively." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "env = MyEnv()\n", "ob = env.reset()\n", "ob_log = list()\n", "reward_log = list()\n", "for i in range(1000):\n", " action = env.action_space.sample() # A random agent\n", " ob, reward, done, info = env.step(action)\n", " ob_log.append(ob)\n", " reward_log.append(reward)\n", " \n", "plt.plot(ob_log, reward_log)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trial-based Neurogym Tasks\n", "\n", "Many neuroscience and cognitive science tasks have trial structure. ```neurogym.TrialEnv``` provides a class for common trial-based tasks. Its main difference from ```gym.Env``` is the ```_new_trial()``` method that generates abstract information about a new trial, and optionally, the observation and ground-truth output. Additionally, users provide a ```_step()``` method instead of ```step()```.\n", "\n", "The ```_new_trial()``` method takes any key-word arguments (```**kwargs```), and outputs a dictionary ```trial``` containing relevant information about this trial. This dictionary is accesible during ```_step``` as ```self.trial```.\n", "\n", "Here we define a simple task where the agent needs to make a binary decision on every trial based on its observation. Each trial is only one time step." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import neurogym as ngym\n", "from neurogym import TrialEnv\n", "\n", "class MyTrialEnv(TrialEnv):\n", " def __init__(self):\n", " super().__init__()\n", " self.observation_space = gym.spaces.Box(low=-1., high=1., shape=(1,))\n", " self.action_space = gym.spaces.Discrete(2)\n", "\n", " self.next_ob = np.random.uniform(-1, 1, size=(1,))\n", "\n", " def _new_trial(self):\n", " ob = self.next_ob # observation previously computed\n", " # Sample observation for the next trial\n", " self.next_ob = np.random.uniform(-1, 1, size=(1,))\n", " \n", " trial = dict()\n", " # Ground-truth is 1 if ob > 0, else 0\n", " trial['ground_truth'] = (ob > 0) * 1.0\n", " \n", " return trial\n", " \n", " def _step(self, action):\n", " ob = self.next_ob\n", " # If action equals to ground_truth, reward=1, otherwise 0\n", " reward = (action == self.trial['ground_truth']) * 1.0\n", " done = False\n", " info = {'new_trial': True}\n", " return ob, reward, done, info" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial 0\n", "Received observation [0.45315209]\n", "Selected action 0\n", "Received reward [0.]\n", "Trial 1\n", "Received observation [0.418608]\n", "Selected action 0\n", "Received reward [0.]\n", "Trial 2\n", "Received observation [-0.30473682]\n", "Selected action 1\n", "Received reward [0.]\n", "Trial 3\n", "Received observation [0.94499442]\n", "Selected action 1\n", "Received reward [1.]\n", "Trial 4\n", "Received observation [-0.90813549]\n", "Selected action 1\n", "Received reward [0.]\n", "Trial 5\n", "Received observation [0.51512945]\n" ] } ], "source": [ "env = MyTrialEnv()\n", "ob = env.reset()\n", "\n", "print('Trial', 0)\n", "print('Received observation', ob)\n", "\n", "for i in range(5):\n", " action = env.action_space.sample() # A random agent\n", " print('Selected action', action)\n", " ob, reward, done, info = env.step(action)\n", " print('Received reward', reward)\n", " print('Trial', i+1)\n", " print('Received observation', ob)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Including time, period, and observation in trial-based tasks\n", "\n", "Most neuroscience and cognitive science tasks follow additional temporal structures that are incorporated into ```neurogym.TrialEnv```. These tasks typically\n", "1. Are described in real time instead of discrete time steps. For example, the task can last 3 seconds.\n", "2. Contain multiple time periods in each trial, such as a stimulus period and a response period.\n", "\n", "To include these features, neurogym tasks typically support setting the time length of each step in ```dt``` (in ms), and the time length of each time period in ```timing```.\n", "\n", "For example, consider the following binary decision-making task with a 500ms stimulus period, followed by a 500ms decision period. The periods are added to each trial through ```self.add_period()``` in ```self._new_trial()```. During ```_step()```, you can check which period the task is currently in with ```self.in_period(period_name)```." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "class MyDecisionEnv(TrialEnv):\n", " def __init__(self, dt=100, timing=None):\n", " super().__init__(dt=dt) # dt is passed to base task\n", " \n", " # Setting default task timing\n", " self.timing = {'stimulus': 500, 'decision': 500}\n", " # Update timing if provided externally\n", " if timing:\n", " self.timing.update(timing)\n", " \n", " self.observation_space = gym.spaces.Box(low=-1., high=1., shape=(1,))\n", " self.action_space = gym.spaces.Discrete(2)\n", "\n", " def _new_trial(self):\n", " # Setting time periods for this trial\n", " periods = ['stimulus', 'decision']\n", " # Will add stimulus and decision periods sequentially using self.timing info\n", " self.add_period(periods)\n", "\n", " # Sample observation for the next trial\n", " stimulus = np.random.uniform(-1, 1, size=(1,))\n", " \n", " trial = dict()\n", " trial['stimulus'] = stimulus\n", " # Ground-truth is 1 if stimulus > 0, else 0\n", " trial['ground_truth'] = (stimulus > 0) * 1.0\n", " \n", " return trial\n", " \n", " def _step(self, action):\n", " # Check if the current time step is in stimulus period\n", " if self.in_period('stimulus'):\n", " ob = np.array([self.trial['stimulus']])\n", " reward = 0. # no reward\n", " else:\n", " ob = np.array([0.]) # no observation\n", " # If action equals to ground_truth, reward=1, otherwise 0\n", " reward = (action == self.trial['ground_truth']) * 1.0\n", " \n", " done = False\n", " # By default, the trial is not ended\n", " info = {'new_trial': False}\n", " return ob, reward, done, info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Running the environment with a random agent and plotting the agent's observation, action, and rewards" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Logging\n", "log = {'ob': [], 'action': [], 'reward': []}\n", "\n", "env = MyDecisionEnv(dt=100)\n", "ob = env.reset()\n", "log['ob'].append(ob)\n", "for i in range(30):\n", " action = env.action_space.sample() # A random agent\n", " ob, reward, done, info = env.step(action)\n", " \n", " log['action'].append(action)\n", " log['ob'].append(ob)\n", " log['reward'].append(reward)\n", " \n", "log['ob'] = log['ob'][:-1] # exclude last observation\n", "# Visualize\n", "f, axes = plt.subplots(3, 1, sharex=True)\n", "for ax, key in zip(axes, ['ob', 'action', 'reward']):\n", " ax.plot(log[key], 'o-')\n", " ax.set_ylabel(key)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Setting observation and ground-truth at the beginning of each trial\n", "\n", "In many tasks, the observation and ground-truth are pre-determined for each trial, and can be set in ```self._new_trial()```. The generated observation and ground-truth can then be used as inputs and targets for supervised learning.\n", "\n", "Observation and ground_truth can be set in ```self._new_trial()``` with the ```self.add_ob()``` and ```self.set_groundtruth``` methods. Users can specify the period and location of the observation using their names. For example, ```self.add_ob(1, period='stimulus', where='fixation')```.\n", "\n", "This allows the users to access the observation and groundtruth of the entire trial with ```self.ob``` and ```self.gt```, and access their values with ```self.ob_now``` and ```self.gt_now```.\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "class MyDecisionEnv(TrialEnv):\n", " def __init__(self, dt=100, timing=None):\n", " super().__init__(dt=dt) # dt is passed to base task\n", " \n", " # Setting default task timing\n", " self.timing = {'stimulus': 500, 'decision': 500}\n", " # Update timing if provided externally\n", " if timing:\n", " self.timing.update(timing)\n", " \n", " # Here we use ngym.spaces, which allows setting name of each dimension\n", " name = {'fixation': 0, 'stimulus': 1}\n", " self.observation_space = ngym.spaces.Box(\n", " low=-1., high=1., shape=(2,), name=name)\n", " name = {'fixation': 0, 'choice': [1, 2]}\n", " self.action_space = ngym.spaces.Discrete(3, name=name)\n", "\n", " def _new_trial(self):\n", " # Setting time periods for this trial\n", " periods = ['stimulus', 'decision']\n", " # Will add stimulus and decision periods sequentially using self.timing info\n", " self.add_period(periods)\n", "\n", " # Sample observation for the next trial\n", " stimulus = np.random.uniform(-1, 1, size=(1,))\n", " \n", " # Add value 1 to stimulus period at fixation location\n", " self.add_ob(1, period='stimulus', where='fixation')\n", " # Add value stimulus to stimulus period at stimulus location\n", " self.add_ob(stimulus, period='stimulus', where='stimulus')\n", " \n", " # Set ground_truth\n", " groundtruth = int(stimulus > 0)\n", " self.set_groundtruth(groundtruth, period='decision', where='choice')\n", " \n", " trial = dict()\n", " trial['stimulus'] = stimulus\n", " trial['ground_truth'] = groundtruth\n", " \n", " return trial\n", " \n", " def _step(self, action):\n", " # self.ob_now and self.gt_now correspond to\n", " # current step observation and groundtruth\n", "\n", " # If action equals to ground_truth, reward=1, otherwise 0\n", " reward = (action == self.gt_now) * 1.0\n", " \n", " done = False\n", " # By default, the trial is not ended\n", " info = {'new_trial': False}\n", " return self.ob_now, reward, done, info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sampling one trial. The trial observation and ground-truth can be used for supervised learning." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Trial information {'stimulus': array([-0.77779679]), 'ground_truth': 0}\n", "Observation shape is (N_time, N_unit) = (10, 2)\n", "Groundtruth shape is (N_time,) = (10,)\n" ] } ], "source": [ "env = MyDecisionEnv()\n", "_ = env.reset()\n", "\n", "trial = env.new_trial()\n", "ob, gt = env.ob, env.gt\n", "\n", "print('Trial information', trial)\n", "print('Observation shape is (N_time, N_unit) =', ob.shape)\n", "print('Groundtruth shape is (N_time,) =', gt.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualizing the environment with a helper function." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Run the environment for 2 trials using a random agent.\n", "fig = ngym.utils.plot_env(env, num_trials=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### An example perceptual decision-making task\n", "\n", "Using the above style, we can define a simple perceptual decision-making task (the PerceptualDecisionMaking task from neurogym)." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "class PerceptualDecisionMaking(ngym.TrialEnv):\n", " \"\"\"Two-alternative forced choice task in which the subject has to\n", " integrate two stimuli to decide which one is higher on average.\n", "\n", " Args:\n", " stim_scale: Controls the difficulty of the experiment. (def: 1., float)\n", " sigma: float, input noise level\n", " dim_ring: int, dimension of ring input and output\n", " \"\"\"\n", " metadata = {\n", " 'paper_link': 'https://www.jneurosci.org/content/12/12/4745',\n", " 'paper_name': '''The analysis of visual motion: a comparison of\n", " neuronal and psychophysical performance''',\n", " 'tags': ['perceptual', 'two-alternative', 'supervised']\n", " }\n", "\n", " def __init__(self, dt=100, rewards=None, timing=None, stim_scale=1.,\n", " sigma=1.0, dim_ring=2):\n", " super().__init__(dt=dt)\n", " # The strength of evidence, modulated by stim_scale\n", " self.cohs = np.array([0, 6.4, 12.8, 25.6, 51.2]) * stim_scale\n", " self.sigma = sigma / np.sqrt(self.dt) # Input noise\n", "\n", " # Rewards\n", " self.rewards = {'abort': -0.1, 'correct': +1., 'fail': 0.}\n", " if rewards:\n", " self.rewards.update(rewards)\n", "\n", " self.timing = {\n", " 'fixation': 100,\n", " 'stimulus': 2000,\n", " 'delay': 0,\n", " 'decision': 100}\n", " if timing:\n", " self.timing.update(timing)\n", "\n", " self.abort = False\n", "\n", " self.theta = np.linspace(0, 2*np.pi, dim_ring+1)[:-1]\n", " self.choices = np.arange(dim_ring)\n", "\n", " name = {'fixation': 0, 'stimulus': range(1, dim_ring+1)}\n", " self.observation_space = ngym.spaces.Box(\n", " -np.inf, np.inf, shape=(1+dim_ring,), dtype=np.float32, name=name)\n", " name = {'fixation': 0, 'choice': range(1, dim_ring+1)}\n", " self.action_space = ngym.spaces.Discrete(1+dim_ring, name=name)\n", "\n", " def _new_trial(self, **kwargs):\n", " # Trial info\n", " trial = {\n", " 'ground_truth': self.rng.choice(self.choices),\n", " 'coh': self.rng.choice(self.cohs),\n", " }\n", " trial.update(kwargs)\n", "\n", " coh = trial['coh']\n", " ground_truth = trial['ground_truth']\n", " stim_theta = self.theta[ground_truth]\n", "\n", " # Periods\n", " self.add_period(['fixation', 'stimulus', 'delay', 'decision'])\n", "\n", " # Observations\n", " self.add_ob(1, period=['fixation', 'stimulus', 'delay'], where='fixation')\n", " stim = np.cos(self.theta - stim_theta) * (coh/200) + 0.5\n", " self.add_ob(stim, 'stimulus', where='stimulus')\n", " self.add_randn(0, self.sigma, 'stimulus', where='stimulus')\n", "\n", " # Ground truth\n", " self.set_groundtruth(ground_truth, period='decision', where='choice')\n", "\n", " return trial\n", "\n", " def _step(self, action):\n", " new_trial = False\n", " # rewards\n", " reward = 0\n", " gt = self.gt_now\n", " # observations\n", " if self.in_period('fixation'):\n", " if action != 0: # action = 0 means fixating\n", " new_trial = self.abort\n", " reward += self.rewards['abort']\n", " elif self.in_period('decision'):\n", " if action != 0:\n", " new_trial = True\n", " if action == gt:\n", " reward += self.rewards['correct']\n", " self.performance = 1\n", " else:\n", " reward += self.rewards['fail']\n", "\n", " return self.ob_now, reward, False, {'new_trial': new_trial, 'gt': gt}" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "env = PerceptualDecisionMaking(dt=20)\n", "fig = ngym.utils.plot_env(env, num_trials=2)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }