Memory Module: Results and Methods



First Stage Goal: Simulate to a partial extent neural activity involved in memory processes. Specifically, create a neural network that recreates the spiking activity recorded from in vivo hippocampus regions of rats. Later this network can be used to recreate activity changes that occur in memory and perhaps other recorded tasks.

Future goals are included here.

Code for the project is in on Github here.

**Update**: The project has successfully been converted into using GPU computing with CARLSim in C++. CPU computing only mode is also availible by changing GPU_MODE to CPU_MODE in the main file. The python original version using NEST is included in the python_version folder.

Update #2: The simulation has now been corrected for a miscalculation in the firing rates. A parameter in the izhikevich neuron parameters was additionally corrected.


Below are what appear to be the most common results, randomness in the simulation causes lower results in some runs which is being looked into, see calculations for details.

EC3->EC5 feedforward layers spiking
1872/1919.25 = 97.54% accuracy $*$

EC5->CA1 feedforward layers spiking
7948/8985.894 = 88.45% accuracy $*$

Overall accuracy
97.54% * 88.45% = 86.27% $*$

$*$ Accuracy is reported on firing rates from the experiment compared to their reproduction in the simulation with a fitted model of synapse weights. Data was not split into train, test, or cross validation sets but future work can include that.

See results_calculations for more specific details.

Collecting recordings

Hippocampus rat recordings were extracted from open access data here. Existing code for importing the data was converted to octave and the octave commands used were as follows:
Where {File} = base data file, {Electrode} = recording probe number, T = spike times, G = cluster representing putitive neuron
Examples of use are in code below.

1.) Numbers of putitive neurons were found with neuron_counts.m. Example output is in example_analyses.

2.) Amounts of spikes for given time ranges were found using count_spikes.m, spiking from all electrodes in a dataset section were found with elect_spikes.m. The time range chosen for analysis was the first 2000000 ms.

3.) Which brain region the parts of the data were derived from were found using the /hc-3/hc3-metadata-tables/hc3-tables.xlsx document.
For example (e1 = electrode 1):
topdir | animal | e1 | e2 | e3 | e4
ec012ec.11 | ec012 | EC3 | EC3 | EC5 | EC5

From the 3 steps above spike rates of neurons and info. about brain region included for the neurons was gathered.

Neural Network Modeling

This CARLSim simulation source code is here.

A spiking neural network was created in CARLSim to simulate the activity of the hippocampus neurons.

Izhikevich neurons were used along with example values reported for pyramidal neurons from Simple, biologically-constrained CA1 pyramidal cell models using an intact, whole hippocampus context. That neuron type comprised the main portion of the data used here. A value was listed for the "d" parameter as 10 pA. In the simulations "d = 10" because it was unclear any other conversion should occur. Material reviewed to understand the "d" parameter more include "Simple Model of Spiking Neurons" and d values in example neuron types and it seems common that d is a number 10.0 < d < 0.001 . Possibly the value should be represented in the sim differently but it was unclear that was needed.

The neuron spiking rates were normalized to create each representitive group containing the same estimated number of neurons. For example the most neurons per a brain regoin recorded were 30 and due to that brain regions with less than 30 had their spike rates multiplied to increase the representitve rate to 30 neurons. This allowed for a more straitforward mathmatical way to connect neural net layers representing regions.

  • Creating Spiking in the Network

Feed forward synapses were created that represent spiking in layers leading to spiking in later ones. Ratios of spiking between layers were found by dividing each layer's spiking rate by it's prior one. This created the goal effects to simulate with synapses between layers.

Greater detail was achived by separating firing rates into individual subsection groups based on experimental results. For example a group of 7 neurons were recorded in the EC5 layer as firing an estimated 494.5834 spikes and 7 EC3 neurons fired 331.5366 . Therefore the spike ratio between layers was 494.5834 / 331.5366 = 1.4918 .

The original rat hippocampus experiment included detailed recording of 67 neurons accross 3 layers. This simulation has been scaled up to include 1,500 neurons across the 3 layers. The expected firing rates have been multiplied accordingly. The sample of data used from the original experiment was during 2000 seconds but the simulation is run for 20 seconds for computational efficiency, expected firing results were adjusted for that also.

  • Optimizing Synapse Weights

create_syn_weights() is used for computing optimized synapse weights, it uses parameter values based on multiple polynomial regression fitting.

A multiple polynomial regression tool was used to automatically determine what synapse weights should be based on initial firing rate and ratio between layers wanted. Testing revealed successful values for synapse weights and a data set was created to automatically predict weights using regression for future analyses. The testing included manual trial and error of attempting different synapse values to achive target results. Data sets are in synapse_weights_data.

  • Creating Synapses

create_syn() generates synapse weights based on multiple parameters such as fire rate ratio between layers and computed synapse weights.

A strategy was chosen due to computational practicality to create synapse weights leading to one layer causing firing in the next by creating a number of synapse connections that corresponds to the ratio targeted. For example for a 0.5 ratio the initial layer caused spiking in 50% of the second layer's synapses. It was designated that mainly the only spiking in layers was triggered from the synapses connected to them, layers had very little spiking due to an external current except for the first one.

For each ratio interval over 1 (e.g. 2.0, 3.0, 4.0) synapses with a preset delay were added to create a capacity to increase spiking. Such a system caused a staggered time sequence of spikes firing. After testing the delay selected was 5ms due to achiving good results. For example a ratio of 2.3 causes synapses to fire in the later layer 100% for a 0ms delay, 100% for a 5ms delay, and 30% for a 10ms delay.

Capturing Results

Firing rate results are measured and reported from spike_monitors objects.

Future work

  • Plotting of spike raser plots and electrical signal graphs.
  • A known issue is that the maximum values of firing rate change between layers is limited by the amount (albeit high) and type of synapses permitted in the software. Exploration can be done for ways to achive higher accuracy through creating different synapse types and increasing the synpases availible.
  • Additional future goals are included in the project outline.

Media references: