Learning spatial transformations through STDP (Davison, Frégnac 2006)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:64261
A common problem in tasks involving the integration of spatial information from multiple senses, or in sensorimotor coordination, is that different modalities represent space in different frames of reference. Coordinate transformations between different reference frames are therefore required. One way to achieve this relies on the encoding of spatial information using population codes. The set of network responses to stimuli in different locations (tuning curves) constitute a basis set of functions which can be combined linearly through weighted synaptic connections in order to approximate non-linear transformations of the input variables. The question then arises how the appropriate synaptic connectivity is obtained. This model shows that a network of spiking neurons can learn the coordinate transformation from one frame of reference to another, with connectivity that develops continuously in an unsupervised manner, based only on the correlations available in the environment, and with a biologically-realistic plasticity mechanism (spike timing-dependent plasticity).
Reference:
1 . Davison AP, Fr├ęgnac Y (2006) Learning cross-modal spatial transformations through spike timing-dependent plasticity. J Neurosci 26:5604-15 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Generic;
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synaptic Plasticity; Long-term Synaptic Plasticity; Unsupervised Learning; STDP;
Implementer(s): Davison, Andrew [Andrew.Davison at iaf.cnrs-gif.fr];
Search NeuronDB for information about:  GabaA; AMPA;
: NetStim with Variable Rate
: Version 2 - self-timing
: Andrew P. Davison, UNIC, CNRS, July 2004

NEURON	{ 
  ARTIFICIAL_CELL NetStimVR2
  RANGE y, interval, noise, theta
  RANGE transform, prmtr, alpha, fthetastim
  GLOBAL tchange, thetastim
  GLOBAL Rmax, sigma, Rmin
}

PARAMETER {
	noise		= 1 <0,1> : amount of randomness (0.0 - 1.0)
        theta           = 0 <0,1> : location of this cell
	tchange         = 20 (ms) : time of next firing rate change
	thetastim       = 0 <0,1> : stimulus location
	Rmax            = 60 (/s) : peak firing rate
	Rmin            = 0  (/s) : min firing rate
	sigma           = 0.4     : width of tuning curve
	transform       = 0       : determines which transformation of thetastim
				  : to use 0=none 1=multiply 2=sin 3=cos
	prmtr           = 0       : parameter for the transformtion.
	alpha           = 1       
}

ASSIGNED {
	interval (ms)
	y
	event (ms)
	rate (/s)
	fthetastim
}

CONSTANT {
	PI = 3.141592654
}

PROCEDURE seed(x) {
	set_seed(x)
}

INITIAL {
	y = 0
	if (noise < 0) {
		noise = 0
	}
	if (noise > 1) {
		noise = 1
	}
	net_send(1e-12,4) : to make sure that ControlNSVR has
			  : time to set thetastim and tchange
}	

FUNCTION invl(mean (ms)) (ms) {
	if (mean <= 0.) {
		mean = .01 (ms) : I would worry if it were 0.
	}
	if (noise == 0) {
		invl = mean
	} else {
		invl = (1. - noise)*mean + noise*mean*exprand(1)
	}
}

FUNCTION tuning_curve(theta,theta0) (ms){
	LOCAL d
	d = theta - theta0
	if (d <= -0.5) { d = d + 1 }
	if (d > 0.5) { d = d - 1 }
	rate = alpha * ( (Rmax-Rmin) * exp( (cos(2*PI*d)-1)/(sigma*sigma) ) + Rmin )
	if (rate > 1e-9) {
		tuning_curve = (1000)/rate
	} else {
		tuning_curve = 1e12
	}
}

NET_RECEIVE (w) {
	if (flag == 4) { : from INITIAL
		if (transform == 1) {
			fthetastim = prmtr*thetastim
		} else if (transform == 2) {
			fthetastim = 0.5*(sin(2*PI*thetastim + prmtr) + 1)
		} else if (transform == 3) {
			fthetastim = thetastim*thetastim
		} else if (transform == 4) {
			fthetastim = asin(2*thetastim-1)/PI
		} else if (transform == 5) {
			fthetastim = 0.5*(sin(prmtr*2*PI*thetastim) + 1)
		} else {
			fthetastim = thetastim
		}
		interval = tuning_curve(theta,fthetastim)
		event = invl(interval) - interval*(1. - noise)
		if (event < 1e-12) {
			event = 1e-12
		}
		if (event < tchange) {
			net_send(event,1)
		}
		net_send(tchange,3)
	} else {
	if (flag == 3) { : change in mean rate
		if (transform == 1) {
			fthetastim = prmtr*thetastim
		} else if (transform == 2) {
			fthetastim = 0.5*(sin(2*PI*thetastim + prmtr) + 1)
		} else if (transform == 3) {
			fthetastim = thetastim*thetastim
		} else if (transform == 4) {
			fthetastim = asin(2*thetastim-1)/(2*PI)
		} else if (transform == 5) {
			fthetastim = 0.5*(sin(prmtr*2*PI*thetastim) + 1)
		} else {
			fthetastim = thetastim
		}	
		interval = tuning_curve(theta,fthetastim)
		event = t + invl(interval) - interval*(1. - noise)
		if (event < t) {
			event = t
		}
		if (event < tchange) {
			net_send(event-t,1)
		}
		net_send(tchange-t,3)
	} else {
	if (flag == 1) { : send the next spike
		y = 2
		net_event(t)
		event = event + invl(interval)
		if (event < tchange) {
			net_send(event - t, 1)
		}
		net_send(0.1, 2)
	} else {
	if (flag == 2) {
		y = 0
	}}}}
}