Synaptic scaling balances learning in a spiking model of neocortex (Rowan & Neymotin 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:147141
Learning in the brain requires complementary mechanisms: potentiation and activity-dependent homeostatic scaling. We introduce synaptic scaling to a biologically-realistic spiking model of neocortex which can learn changes in oscillatory rhythms using STDP, and show that scaling is necessary to balance both positive and negative changes in input from potentiation and atrophy. We discuss some of the issues that arise when considering synaptic scaling in such a model, and show that scaling regulates activity whilst allowing learning to remain unaltered.
Reference:
1 . Rowan MS, Neymotin SA (2013) Synaptic Scaling Balances Learning in a Spiking Model of Neocortex Adaptive and Natural Computing Algorithms, Tomassini M, Antonioni A, Daolio F, Buesser P, ed. pp.20
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell; Neocortex V1 interneuron basket PV GABA cell; Neocortex fast spiking (FS) interneuron; Neocortex spiny stellate cell; Neocortex spiking regular (RS) neuron; Neocortex spiking low threshold (LTS) neuron; Abstract integrate-and-fire adaptive exponential (AdEx) neuron;
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; Python;
Model Concept(s): Synaptic Plasticity; Long-term Synaptic Plasticity; Learning; STDP; Homeostasis;
Implementer(s): Lytton, William [bill.lytton at downstate.edu]; Neymotin, Sam [Samuel.Neymotin at nki.rfmh.org]; Rowan, Mark [m.s.rowan at cs.bham.ac.uk];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell; Neocortex V1 interneuron basket PV GABA cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
/
stdpscalingpaper
batchscripts
mod
README
alz.hoc
autotune.hoc *
basestdp.hoc *
batch.hoc *
batch2.hoc *
batchcommon
checkirreg.hoc *
clusterrun.sh
col.dot *
col.hoc *
comppowspec.hoc *
condisconcellfig.hoc *
condisconpowfig.hoc *
declist.hoc *
decmat.hoc *
decnqs.hoc *
decvec.hoc *
default.hoc *
drline.hoc *
e2hubsdisconpow.hoc *
e2incconpow.hoc *
filtutils.hoc *
geom.hoc *
graphplug.hoc *
grvec.hoc *
init.hoc *
labels.hoc *
load.hoc *
local.hoc *
makepopspikenq.hoc *
matfftpowplug.hoc *
matpmtmplug.hoc *
matpmtmsubpopplug.hoc *
matspecplug.hoc *
network.hoc *
nload.hoc *
nqpplug.hoc *
nqs.hoc *
nqsnet.hoc *
nrnoc.hoc *
params.hoc
plot.py
plotbatch.sh
plotbatchcluster.sh
powchgtest.hoc *
python.hoc *
pywrap.hoc *
redE2.hoc *
run.hoc
runsim.sh
setup.hoc *
shufmua.hoc *
sim.hoc
simctrl.hoc *
spkts.hoc *
stats.hoc *
stdpscaling.hoc
syncode.hoc *
vsampenplug.hoc *
writedata.hoc
xgetargs.hoc *
                            
// $Id: powchgtest.hoc,v 1.11 2010/10/10 23:18:02 samn Exp $ 


// make an nqs that has changes in power spectra as a function of hubs - uses data from batch.hoc60,62,63
// and relies on load.hoc87

newbatch=1
rcsopen("load.hoc",87)

declare("nqforig","o[2]")
nqforig=new NQS("/u/samn/intfcol/data/10oct10.10sep25.02_ISEED_1234_DVSEED_534023_SIMTYP_0_DISCONCOL_1__nqpmtm_E_I_MINUS_ALL_HUB_TYPES_B.nqs")
nqforig[1]=new NQS("/u/samn/intfcol/data/10sep25.02_ISEED_1234_DVSEED_534023_SIMTYP_0_DISCONCOL_1__nqpmtmpow_A.nqs")

objref vav[2][3][CTYPi],vev[2][3][CTYPi],vnhubs,vty,vf1,vf2//indices into vav,vev same meaning as into dbase
{vnhubs=new Vector() vnhubs.indgen(1,10,1)}
{vty=new Vector() vty.append(E2,I2,E4,I4,E5R,E5B,I5,E6,I6)}
{vf1=new Vector() vf1.append(4,12,30) vf2=new Vector() vf2.append(12,30,100)}
objref lop1,lop2,le
{lop1=new List() lop1.append(new String(">=")) lop1.append(new String(">")) lop1.append(new String(">="))}
{lop2=new List() lop2.append(new String("<=")) lop2.append(new String("<")) lop2.append(new String("<="))}
{le=new List() le.append(new String("E")) le.append(new String("I"))}

//dbase stores baseline level of power for each column, in theta, beta, gamma bands
double dbase[numcols][CTYPi][vf1.size] // 3rd dim = 0:theta,1:beta,2:gamma, 3rd dim = column 

for i=0,8 { // store the baseline values in dbase
  for vtr(&j,vty) { ic=ice(j)
    for k=0,2 { 
      {f1=vf1.x(k)  f2=vf2.x(k)}
      if(ic) {
        sprint(tstr,"C%dintraE",i)
      } else {
        sprint(tstr,"C%dintra%sMINUS%s",i,le.o(ic).s,CTYP.o(j).s)
      }
      if(!nqforig[ic].select("f",lop1.o(k).s,f1,"f",lop2.o(k).s,f2)) print "PROB!!!!!!!!!!!!!!!!!!!!!!"
      dbase[i][j][k]=nqforig[ic].getcol(tstr).sum
    }
  }
}

objref nqchg // nqs stores percent changes from baseline after alterations
nqchg=new NQS("ty","nhubs","col","pchange","minf","maxf")
for i=0,nqbatch.v.size-1 {
  nq=nqbatch.get("nqpmtm",i).o
  SIMTYP=nqbatch.get("SIMTYP",i).x
  NHUBS=nqbatch.get("NHUBS",i).x
  ic=ice(SIMTYP)
  for j=0,numcols-1 {
    if(ic) sprint(tstr,"C%dintraE",j) else sprint(tstr,"C%dintraEMINUS",j)
    for k=0,2 {
      {f1=vf1.x(k) f2=vf2.x(k)}
      if(!nq.select("f",lop1.o(k).s,f1,"f",lop2.o(k).s,f2)) print "BORP!!!!!!!!!!!!!!!!!!!!!!!!!"
      pchg = 100.0 * (nq.getcol(tstr).sum - dbase[j][SIMTYP][k]) / dbase[j][SIMTYP][k]
      nqchg.append(SIMTYP,NHUBS,j,pchg,f1,f2)
    }
  }  
}

//* mkavgerr - setup avg+/-stderr
proc mkavgerr () { local i,j,k,ic,fidx,f1,f2
  for vtr(&i,vty) { 
    ic=ice(i)
    for j=0,2{vav[ic][j][i]=new Vector() vev[ic][j][i]=new Vector() vav[ic][j][i].label(CTYP.o(i).s)}
  }
  for fidx=0,2 {
    f1=vf1.x(fidx) f2=vf2.x(fidx)
    for vtr(&i,vty) { ic=ice(i)
      for j=1,10 {
        if(!nqchg.select("ty",i,"minf",f1,"maxf",f2,"nhubs",j)) {
          print "didn't find ", CTYP.o(i).s, " minf ", f1, " maxf " , f2 , " nhubs " , j
        }
        vav[ic][fidx][i].append(nqchg.getcol("pchange").mean)
        vev[ic][fidx][i].append(nqchg.getcol("pchange").stderr)
      }
    }
  }
}
mkavgerr()
//* drit(
proc drit () { local f1,f2,i,j,k,fidx,ic
  fidx=$1 f1=vf1.x(fidx) f2=vf2.x(fidx)
  ic=$2 j=0
  for vtr(&i,vty) if( (ic && ice(i)) || (!ic && !ice(i)) ) {
    g.color(j+1)
    vav[ic][fidx][i].mark(g,vnhubs,"O",12,j+1,1)
    vav[ic][fidx][i].ploterr(g,vnhubs,vev[ic][fidx][i],5,j+1,4)
    if(ic) {
      vav[ic][fidx][i].plot(g,vnhubs,j+1,1)
    }
    j+=1
  }
}
//* prit - print out stats
proc prit () { local i,j,fidx,f1,f2
  nqchg.verbose=0
  for fidx=0,2 {
    {f1=vf1.x(fidx) f2=vf2.x(fidx)}
    for vtr(&i,vty) for j=1,10 if(nqchg.select("ty",i,"nhubs",j,"minf",f1,"maxf",f2)) {
      print CTYP.o(i).s," ",j," hubs, ",f1," - ",f2," Hz : ",nqchg.getcol("pchange").mean,"+/-",nqchg.getcol("pchange").stderr
    }
  }
  nqchg.verbose=1
}