From 413b3fe5649cd00e0565ed89d177431dec7cdec5 Mon Sep 17 00:00:00 2001 From: "Randall C. O'Reilly" Date: Wed, 12 Jun 2024 14:13:59 -0700 Subject: [PATCH] first impl of linear regression synaptic ca gives a 4x speedup and learning performance is consistently _improved_ relative to prior, across ra25, deep_fsa, and objrec, which usually means that it is genuinely better. Lots more work to be done to explore the space but this is an encouraging start! --- axon/enumgen.go | 43 ++++++++++++++++++++++ axon/learn.go | 20 +++++++++++ axon/pathparams.go | 55 ++++++++++++++++------------- axon/rand.go | 4 +-- axon/shaders/Makefile | 2 +- axon/shaders/gpu_dwt.spv | Bin 94300 -> 102348 bytes axon/shaders/gpu_dwtfmdi.spv | Bin 14496 -> 14668 bytes axon/shaders/gpu_dwtsubmean.spv | Bin 31504 -> 31692 bytes axon/shaders/gpu_gather.spv | Bin 41928 -> 42100 bytes axon/shaders/gpu_newstate_pool.spv | Bin 36128 -> 36300 bytes axon/shaders/gpu_sendspike.spv | Bin 53408 -> 53580 bytes axon/shaders/gpu_synca.spv | Bin 58980 -> 59824 bytes axon/shaders/gpu_wtfmdwt.spv | Bin 17084 -> 17256 bytes axon/typegen.go | 4 ++- examples/deep_fsa/params.go | 3 +- examples/kinaseq/kinaseq.go | 41 ++++++++------------- examples/kinaseq/neuron.go | 4 +-- examples/kinaseq/sim.go | 2 +- examples/objrec/params.go | 1 + examples/ra25/params.go | 9 ++--- kinase/params.go | 2 +- 21 files changed, 125 insertions(+), 65 deletions(-) diff --git a/axon/enumgen.go b/axon/enumgen.go index abe9eb8dc..6df6e6543 100644 --- a/axon/enumgen.go +++ b/axon/enumgen.go @@ -135,6 +135,49 @@ func (i *LayerTypes) UnmarshalText(text []byte) error { return enums.UnmarshalText(i, text, "LayerTypes") } +var _SynCaFunsValues = []SynCaFuns{0, 1, 2} + +// SynCaFunsN is the highest valid value for type SynCaFuns, plus one. +const SynCaFunsN SynCaFuns = 3 + +var _SynCaFunsValueMap = map[string]SynCaFuns{`StdSynCa`: 0, `LinearSynCa`: 1, `NeurSynCa`: 2} + +var _SynCaFunsDescMap = map[SynCaFuns]string{0: `StdSynCa uses standard synaptic calcium integration method`, 1: `LinearSynCa uses linear regression generated calcium integration (much faster)`, 2: `NeurSynCa uses simple product of separately-integrated neuron values (much faster)`} + +var _SynCaFunsMap = map[SynCaFuns]string{0: `StdSynCa`, 1: `LinearSynCa`, 2: `NeurSynCa`} + +// String returns the string representation of this SynCaFuns value. +func (i SynCaFuns) String() string { return enums.String(i, _SynCaFunsMap) } + +// SetString sets the SynCaFuns value from its string representation, +// and returns an error if the string is invalid. +func (i *SynCaFuns) SetString(s string) error { + return enums.SetString(i, s, _SynCaFunsValueMap, "SynCaFuns") +} + +// Int64 returns the SynCaFuns value as an int64. +func (i SynCaFuns) Int64() int64 { return int64(i) } + +// SetInt64 sets the SynCaFuns value from an int64. +func (i *SynCaFuns) SetInt64(in int64) { *i = SynCaFuns(in) } + +// Desc returns the description of the SynCaFuns value. +func (i SynCaFuns) Desc() string { return enums.Desc(i, _SynCaFunsDescMap) } + +// SynCaFunsValues returns all possible values for the type SynCaFuns. +func SynCaFunsValues() []SynCaFuns { return _SynCaFunsValues } + +// Values returns all possible values for the type SynCaFuns. +func (i SynCaFuns) Values() []enums.Enum { return enums.Values(_SynCaFunsValues) } + +// MarshalText implements the [encoding.TextMarshaler] interface. +func (i SynCaFuns) MarshalText() ([]byte, error) { return []byte(i.String()), nil } + +// UnmarshalText implements the [encoding.TextUnmarshaler] interface. +func (i *SynCaFuns) UnmarshalText(text []byte) error { + return enums.UnmarshalText(i, text, "SynCaFuns") +} + var _DAModTypesValues = []DAModTypes{0, 1, 2, 3} // DAModTypesN is the highest valid value for type DAModTypes, plus one. diff --git a/axon/learn.go b/axon/learn.go index 1946bd534..ec96a0d56 100644 --- a/axon/learn.go +++ b/axon/learn.go @@ -682,9 +682,26 @@ func (ls *LRateParams) Init() { ls.UpdateEff() } +// SynCaFuns are different ways of computing synaptic calcium (experimental) +type SynCaFuns int32 //enums:enum + +const ( + // StdSynCa uses standard synaptic calcium integration method + StdSynCa SynCaFuns = iota + + // LinearSynCa uses linear regression generated calcium integration (much faster) + LinearSynCa + + // NeurSynCa uses simple product of separately-integrated neuron values (much faster) + NeurSynCa +) + // TraceParams manages parameters associated with temporal trace learning type TraceParams struct { + // how to compute the synaptic calcium (experimental) + SynCa SynCaFuns + // time constant for integrating trace over theta cycle timescales -- governs the decay rate of syanptic trace Tau float32 `default:"1,2,4"` @@ -696,9 +713,12 @@ type TraceParams struct { // rate = 1 / tau Dt float32 `view:"-" json:"-" xml:"-" edit:"-"` + + pad, pad1, pad2 float32 } func (tp *TraceParams) Defaults() { + tp.SynCa = LinearSynCa tp.Tau = 1 tp.SubMean = 0 tp.LearnThr = 0 diff --git a/axon/pathparams.go b/axon/pathparams.go index c1d44483b..b65e9707c 100644 --- a/axon/pathparams.go +++ b/axon/pathparams.go @@ -277,8 +277,7 @@ func (pj *PathParams) GatherSpikes(ctx *Context, ly *LayerParams, ni, di uint32, // DoSynCa returns false if should not do synaptic-level calcium updating. // Done by default in Cortex, not for some other special pathway types. func (pj *PathParams) DoSynCa() bool { - if pj.PathType == RWPath || pj.PathType == TDPredPath || pj.PathType == VSMatrixPath || - pj.PathType == DSMatrixPath || pj.PathType == VSPatchPath || pj.PathType == BLAPath { + if pj.Learn.Trace.SynCa != StdSynCa || pj.PathType == RWPath || pj.PathType == TDPredPath || pj.PathType == VSMatrixPath || pj.PathType == DSMatrixPath || pj.PathType == VSPatchPath || pj.PathType == BLAPath || pj.Learn.Hebb.On.IsTrue() { return false } return true @@ -338,28 +337,36 @@ func (pj *PathParams) DWtSyn(ctx *Context, syni, si, ri, di uint32, layPool, sub // Uses synaptically integrated spiking, computed at the Theta cycle interval. // This is the trace version for hidden units, and uses syn CaP - CaD for targets. func (pj *PathParams) DWtSynCortex(ctx *Context, syni, si, ri, di uint32, layPool, subPool *Pool, isTarget bool) { - // credit assignment part - caUpT := SynCaV(ctx, syni, di, CaUpT) // time of last update - syCaM := SynCaV(ctx, syni, di, CaM) // fast time scale - syCaP := SynCaV(ctx, syni, di, CaP) // slower but still fast time scale, drives Potentiation - syCaD := SynCaV(ctx, syni, di, CaD) // slow time scale, drives Depression (one trial = 200 cycles) - pj.Learn.KinaseCa.CurCa(ctx.SynCaCtr, caUpT, &syCaM, &syCaP, &syCaD) // always update, getting current Ca (just optimization) - - rb0 := NrnV(ctx, ri, di, SpkBin0) - sb0 := NrnV(ctx, si, di, SpkBin0) - rb1 := NrnV(ctx, ri, di, SpkBin1) - sb1 := NrnV(ctx, si, di, SpkBin1) - rb2 := NrnV(ctx, ri, di, SpkBin2) - sb2 := NrnV(ctx, si, di, SpkBin2) - rb3 := NrnV(ctx, ri, di, SpkBin3) - sb3 := NrnV(ctx, si, di, SpkBin3) - - b0 := 0.1 * (rb0 * sb0) - b1 := 0.1 * (rb1 * sb1) - b2 := 0.1 * (rb2 * sb2) - b3 := 0.1 * (rb3 * sb3) - - pj.Learn.KinaseCa.FinalCa(b0, b1, b2, b3, &syCaM, &syCaP, &syCaD) + var syCaM, syCaP, syCaD, caUpT float32 + switch pj.Learn.Trace.SynCa { + case StdSynCa: + caUpT = SynCaV(ctx, syni, di, CaUpT) // time of last update + syCaM = SynCaV(ctx, syni, di, CaM) // fast time scale + syCaP = SynCaV(ctx, syni, di, CaP) // slower but still fast time scale, drives Potentiation + syCaD = SynCaV(ctx, syni, di, CaD) // slow time scale, drives Depression (one trial = 200 cycles) + pj.Learn.KinaseCa.CurCa(ctx.SynCaCtr, caUpT, &syCaM, &syCaP, &syCaD) // always update, getting current Ca (just optimization) + case LinearSynCa: + rb0 := NrnV(ctx, ri, di, SpkBin0) + sb0 := NrnV(ctx, si, di, SpkBin0) + rb1 := NrnV(ctx, ri, di, SpkBin1) + sb1 := NrnV(ctx, si, di, SpkBin1) + rb2 := NrnV(ctx, ri, di, SpkBin2) + sb2 := NrnV(ctx, si, di, SpkBin2) + rb3 := NrnV(ctx, ri, di, SpkBin3) + sb3 := NrnV(ctx, si, di, SpkBin3) + + b0 := 0.1 * (rb0 * sb0) + b1 := 0.1 * (rb1 * sb1) + b2 := 0.1 * (rb2 * sb2) + b3 := 0.1 * (rb3 * sb3) + + pj.Learn.KinaseCa.FinalCa(b0, b1, b2, b3, &syCaM, &syCaP, &syCaD) + case NeurSynCa: + gain := float32(1.0) + syCaM = gain * NrnV(ctx, si, di, CaSpkM) * NrnV(ctx, ri, di, CaSpkM) + syCaP = gain * NrnV(ctx, si, di, CaSpkP) * NrnV(ctx, ri, di, CaSpkP) + syCaD = gain * NrnV(ctx, si, di, CaSpkD) * NrnV(ctx, ri, di, CaSpkD) + } SetSynCaV(ctx, syni, di, CaM, syCaM) SetSynCaV(ctx, syni, di, CaP, syCaP) diff --git a/axon/rand.go b/axon/rand.go index 53d0a6367..9c239b6e1 100644 --- a/axon/rand.go +++ b/axon/rand.go @@ -2,7 +2,6 @@ package axon import ( "cogentcore.org/core/vgpu/gosl/slrand" - "cogentcore.org/core/vgpu/gosl/sltype" ) //gosl:hlsl axonrand @@ -32,8 +31,7 @@ func GetRandomNumber(index uint32, counter slrand.Counter, funIndex RandFunIndex var randCtr slrand.Counter randCtr = counter randCtr.Add(uint32(funIndex)) - var ctr sltype.Uint2 - ctr = randCtr.Uint2() + ctr := randCtr.Uint2() return slrand.Float(&ctr, index) } diff --git a/axon/shaders/Makefile b/axon/shaders/Makefile index d1aca2dce..ef3063528 100644 --- a/axon/shaders/Makefile +++ b/axon/shaders/Makefile @@ -2,7 +2,7 @@ # The go generate command does this automatically. all: - cd ../; gosl -exclude=Update,UpdateParams,Defaults,AllParams,ShouldShow cogentcore.org/core/math32/v2/fastexp.go cogentcore.org/core/etable/v2/minmax ../chans/chans.go ../chans ../kinase ../fsfffb/inhib.go ../fsfffb github.com/emer/emergent/v2/etime github.com/emer/emergent/v2/ringidx rand.go avgmax.go neuromod.go globals.go context.go neuron.go synapse.go pool.go layervals.go act.go act_prjn.go inhib.go learn.go layertypes.go layerparams.go deep_layers.go rl_layers.go pvlv_layers.go pcore_layers.go prjntypes.go prjnparams.go deep_prjns.go rl_prjns.go pvlv_prjns.go pcore_prjns.go hip_prjns.go gpu_hlsl + cd ../; gosl -exclude=Update,UpdateParams,Defaults,AllParams,ShouldShow cogentcore.org/core/math32/fastexp.go cogentcore.org/core/math32/minmax ../chans/chans.go ../chans ../kinase ../fsfffb/inhib.go ../fsfffb github.com/emer/emergent/v2/etime github.com/emer/emergent/v2/ringidx rand.go avgmax.go neuromod.go globals.go context.go neuron.go synapse.go pool.go layervals.go act.go act_prjn.go inhib.go learn.go layertypes.go layerparams.go deep_layers.go rl_layers.go pvlv_layers.go pcore_layers.go prjntypes.go prjnparams.go deep_prjns.go rl_prjns.go pvlv_prjns.go pcore_prjns.go hip_prjns.go gpu_hlsl # note: gosl automatically compiles the hlsl files using this command: %.spv : %.hlsl diff --git a/axon/shaders/gpu_dwt.spv b/axon/shaders/gpu_dwt.spv index abf2004abf4f73591fe1415fde51810b328b7ebe..531f0e18f99766e1385a95732b0c321ea49f1dc6 100644 GIT binary patch literal 102348 zcmbT92b^9-x&IfkyP*?$525$od%}in0!awj5KvLGBulcAW(q}6v0yKND0Z<6Htb!o zASxE@UBTW^uy_C8?>X=9-O1dI_kRB8-nsL8e$PDfd(O<9ne)EyhC5-?{U-MGY|_)y zvrW&xx1!?Ou4mJRvECAU%bxzm9-KWi`^dHHmK=Hf2}j#*o1O_)jc;4p^no{}tQa0$ zDX(`Dyxew_sT7qg6Zjw7UyQS_XY-z3@Vcv4j~qF)Zq53|>(;LsS#tLJ%Pt#PbL9Hb zmFsNd|Mc|C9a+C-)yi2{tp&^UQx9Fea(MOHk%sK+*`kLVYWtdh(f{b}vgNCW>5j1T-%ptV0i7(4d<|pamO^=)*EogHrzHFaK|;= zwi|HAH{7HRxDy)A@f*`PvEjDgfIA6p%bp$J#vjMo!&i^2nK!&pV}H&g znxVUWI+wFYhS#{D67Rg7y?)JFdrf}M-N1seHqPC=^~
  • c%;DbB5Qg8NF&O&bb?$ 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 Tt#{Nvfkn}Ge3|cbd>;FM>_4wx literal 94300 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%0DUUiKF)~aPG!Z@89tH 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%0DvX=O(YdobtaN^7D{aUrzZ) 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 diff --git a/axon/shaders/gpu_dwtfmdi.spv b/axon/shaders/gpu_dwtfmdi.spv index 614a45e87bd27f66c1f372687d893d865065c854..7b97926c3c878e7c77e49f5863d6c44ae258c963 100644 GIT binary patch delta 345 zcmZ2bc&2E>J&t--25ANe2(HX?P6RU97+An!j6ilsVkwXhQNsk}2bU)KrY7bA#n`}V zn1NzGsfk5-AsIzLCR{HIknK`};Ijhx1&Jwev)CYfLk3Z>CWr;>5J4jbhRtf6WkQV7 zlLN(tMM2I3X;%hf5g_&eIcM@iMTiVY4@gD^DkC#_qnPmK4bmx0q7G0YNgxeVc3`un z+;S$yhRGKdgeU({;Bn*zN`mw+0QweWvJjBX0~OnVB*qIBI{*}O2L_NKkPq_2gUyDD Su^h}?Kqob7$S+=?$qxW_o-GRi delta 187 zcmX?8w4iXqJq~Ra25ANe2uUnuU}Inf^BI9c!KF#Qsfl?&F*dLm(_~praW-b4j7!Pp zBF-|Q%@#5hOpFGTH_8b!ZrFTOZaI@^0Z^j{&n9l!+@7u?rcTyepK2SGF@{(jT%gbDE`|2hAAwtLUH=WF|S*KFNW z(^8uo+n6LZNs=6x{84Nf({@sQ(!tJk_N-~+yO0e@T}7wYIbAc@kND*DnK5}{ch@v@ z4Hci-bYj~fht**@<=TCb_3Wp2T{;q(7LUx=bfm?D^QGx+JC267k5{pMoWC0hA*TJW;+E>5bg0kJA>U3wv5e-;HKLm9{_Kh;|{G{wnRF zbQjtb&7vyp;`H!qS_}7}Sq$c6mE8;XzGm*tboas4o41`VTkZXz9!v(>?WCP~0BDPQ zJ_tV!=%?)lFbibQl0pdkh!nK=tH&w4fYIpgH+8+bz%`1;iu7+EH@s&;% zAdiDHfGyG?TKNQATU7ca{B)q7wwr8@7JB6)~JjX_*fpQ1l#O~Ec z>(;@oa4Bf#nH<9B!I{90XjevcFTk}&{EKiaRv+=}?O%0*OE5-)m*DGx7kU}#g_O>S zo!9`Z%1gciUIp5^kY(Uyv~2`o^9$JooGopeeLsycT(7}(@NkFgb)b8 z_L!CT;M&$@v+zD#UChD_u$xN1zORGM^~ol<`D9 zi*a_z9OjHC@>$Bhzeba3G?DGLwaTb^Gu*ab2CC=5XDDUWeGD%HFXW_uf^_+8+CBy9 z%q=%hk@G7G4Oii4wV#19n3q-mIovAL8}tRzBucAssJ;YKfO)yJoMRGS=rIk6m zdw-ppsg=3)*m||Bv{x&8f7P`2?B!EwD};W($NT6_bi?2Czy9Z3=eo|h&NH{|s~gx` z*HmAbFgB&Sl+uyux8bIiwi6rDS*-jn>gr96X-sWx#D%@nCUtksMQf~SmAtF%n8tcM zXJ1hrY5V=8>K{`UR9a3(IG1f_V#%E*fT3#N)HRi+%SfZ^G^E4x<2#$jjV}TQ@{Z2t z69!BErr3&hPHIS(uxVe5VuFgS`%TuYLU6 zkM;WpJ_CC__$yUvwu8HLv%Uei$FDsdmgZw`%(wQm&RQ%3LquMQT>^|&U(0D~Hvx4| zyBX{EH$L@SfSM=DN3q_>wR)VkG@mrD_2^qsmX_3I`9jnIlw~D#dA=U?Hk9QhHP3g< zYt3#)$w7Zn*&T52YvyYU?M}G5dE4o!)!qfhfN4O#owPG|1ATGNd*G)6yQ1%jJSuz*Zk6tjU*hZV z$-v9#kK*2dXFB7j{U%(|KLnw@1^4IZpMf~!ZMd=eJjA)#2F3yp(I2z&4qV?zF$?d) z)rwij(t9lYtW4*2pk`(AJ~rCw_krzpvlp?&9{}6zllerkPa99H8R{nOi=ZL52!J$E5^X z?I*xQi;L<%gIb;K z7^)xPYQ<2cpWuGBUEj|@&BEka(d9k9{|1Ce{0rQ~NAO>^&+sd#1E+vJz-KV#4Bpl_ z{XRz|*Sfa#9;S^h`XqL6COG(n(+RTW3NZ&-*Q>B5(MFP$@D(7E48o0Bjdf3dvDWVA H>J!1gm7S9d diff --git a/axon/shaders/gpu_gather.spv b/axon/shaders/gpu_gather.spv index d10314d3b42908dc3874284633d67ceb1da97c1a..ab7365e8ccc13f1669acec6ee55e9cc35be9d456 100644 GIT binary patch delta 274 zcmX?coaxI6rVU0K_N)xf3=j}pndh7cWU?`^fW;Vr?2yD#ARnTJ3CIsFP4Z1m%ma$C zfz>cij@1yCWdX{#lpu7n0{I1rDG;5L59$arI!`_*AiTLjL&11*Ks3wbC!PX8p@&u= ziH+_cGSFFg^MdFKCQ%2VUJsy+jzF3nh?Rl(z-HaJ|!> w#TFom@j%5kOcqQO7CZoyaR+)U6)4IE#1A%`CNhdJb1?wjRiM1tr?f^70C%4;bpQYW delta 195 zcmexzg6YI@rVU0K+AIvt3=j~KSjxc0zzXIw0)>K0lYCPX^MGP(U@@l2g&N{)%s?5J zlFi37)QlNjCJQ)uNOS>_j^1F> zMtJj$mGn-@_!@0CWvV$P6gO1;olgJYlk8lJI1Y vBpzKJsK^E+RlHEK13)o%pqEmCd^R9{usJu0Q;eC5!G1DhiSp*2iYX!h@Vqb2 delta 193 zcmX>zn`yx;rVZEB#aS5a86Y4ev6O+0ffdYWoXn^pEXM?t@JUT9$_vRT0;yqRfT(5$ zvRz6xXKCy**<2D^!6a$`6z~9QwFT1bK&%YJ8#Xg0EN9{^V1!7S0fo3GFH92VciZqyK$WdX{#lpu7n0{I1rDG;5LA94yax=x+)SJ%IK(18H_3RtDk&n;jFEGif#e-2;-c0Sa+Jr6wSWaYMxxOcqQL rR^5Ok!wZ!;02FfvdM*#hX9MB~n>|x>#hJMnTqiS@D{tkTe< delta 197 zcmX@Jhs!8*!(m_SDcxR!FBS&64A|8HA0~Pv@#?s diff --git a/axon/shaders/gpu_synca.spv b/axon/shaders/gpu_synca.spv index a1332daec25b50e37be3a0f2248eaf8336be8c06..b7dca2a6c05fba4307b14b27b5551b27ab76fe71 100644 GIT binary patch literal 59824 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 literal 58980 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 LTR+X8uJ(Tb$kQC! diff --git a/axon/shaders/gpu_wtfmdwt.spv b/axon/shaders/gpu_wtfmdwt.spv index b5583932d73d9021f76c6c0c00ab58bcee4432b2..63337c4a142b5bf4731b12bae4c7518f51b9c05c 100644 GIT binary patch delta 329 zcmdnf%J`y8#%=7Sb#DvB?z6YKz>1D3S1`}gl`C>;9~3$F(U?s&GR_Q1Q|sp8!8Bkg4_bq ztqjB0NW-KKY+fj{oJq3*=y;G6H&BWT zh(Wq0Ac=v*L1GIg7s?B(Za|XZg~}WNin#+rLJP|9`H=}dm8p}6^; H`aLNCAYv(& delta 196 zcmaFS#<-`IaYGn~I17Ua0|bO5mNKw0u!8xFlN&jN<(PmHKBit5;Xvdc>r|_0cmz1RtDk?n{8#6Gbt7@LZrBXLR?U(1|%`= y$sgr~IeDNm3nnWn2n%ii%DV%t(*laJ0r7>+t_rdo%xnxIlRv79Ztl{!Cj|fzh#!3b diff --git a/axon/typegen.go b/axon/typegen.go index 5cd82a0b2..34a6af4b5 100644 --- a/axon/typegen.go +++ b/axon/typegen.go @@ -106,7 +106,9 @@ var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.SWtParams" var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.LRateParams", IDName: "l-rate-params", Doc: "LRateParams manages learning rate parameters", Directives: []types.Directive{{Tool: "gosl", Directive: "start", Args: []string{"learn"}}}, Fields: []types.Field{{Name: "Base", Doc: "base learning rate for this pathway -- can be modulated by other factors below -- for larger networks, use slower rates such as 0.04, smaller networks can use faster 0.2."}, {Name: "Sched", Doc: "scheduled learning rate multiplier, simulating reduction in plasticity over aging"}, {Name: "Mod", Doc: "dynamic learning rate modulation due to neuromodulatory or other such factors"}, {Name: "Eff", Doc: "effective actual learning rate multiplier used in computing DWt: Eff = eMod * Sched * Base"}}}) -var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.TraceParams", IDName: "trace-params", Doc: "TraceParams manages parameters associated with temporal trace learning", Fields: []types.Field{{Name: "Tau", Doc: "time constant for integrating trace over theta cycle timescales -- governs the decay rate of syanptic trace"}, {Name: "SubMean", Doc: "amount of the mean dWt to subtract, producing a zero-sum effect -- 1.0 = full zero-sum dWt -- only on non-zero DWts. typically set to 0 for standard trace learning pathways, although some require it for stability over the long haul. can use SetSubMean to set to 1 after significant early learning has occurred with 0. Some special path types (e.g., Hebb) benefit from SubMean = 1 always"}, {Name: "LearnThr", Doc: "threshold for learning, depending on different algorithms -- in Matrix and VSPatch it applies to normalized GeIntNorm value -- setting this relatively high encourages sparser representations"}, {Name: "Dt", Doc: "rate = 1 / tau"}}}) +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.SynCaFuns", IDName: "syn-ca-funs", Doc: "SynCaFuns are different ways of computing synaptic calcium (experimental)"}) + +var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.TraceParams", IDName: "trace-params", Doc: "TraceParams manages parameters associated with temporal trace learning", Fields: []types.Field{{Name: "SynCa", Doc: "how to compute the synaptic calcium (experimental)"}, {Name: "Tau", Doc: "time constant for integrating trace over theta cycle timescales -- governs the decay rate of syanptic trace"}, {Name: "SubMean", Doc: "amount of the mean dWt to subtract, producing a zero-sum effect -- 1.0 = full zero-sum dWt -- only on non-zero DWts. typically set to 0 for standard trace learning pathways, although some require it for stability over the long haul. can use SetSubMean to set to 1 after significant early learning has occurred with 0. Some special path types (e.g., Hebb) benefit from SubMean = 1 always"}, {Name: "LearnThr", Doc: "threshold for learning, depending on different algorithms -- in Matrix and VSPatch it applies to normalized GeIntNorm value -- setting this relatively high encourages sparser representations"}, {Name: "Dt", Doc: "rate = 1 / tau"}, {Name: "pad"}, {Name: "pad1"}, {Name: "pad2"}}}) var _ = types.AddType(&types.Type{Name: "github.com/emer/axon/v2/axon.LRateMod", IDName: "l-rate-mod", Doc: "LRateMod implements global learning rate modulation, based on a performance-based\nfactor, for example error. Increasing levels of the factor = higher learning rate.\nThis can be added to a Sim and called prior to DWt() to dynamically change lrate\nbased on overall network performance.", Fields: []types.Field{{Name: "On", Doc: "toggle use of this modulation factor"}, {Name: "Base", Doc: "baseline learning rate -- what you get for correct cases"}, {Name: "pad"}, {Name: "pad1"}, {Name: "Range", Doc: "defines the range over which modulation occurs for the modulator factor -- Min and below get the Base level of learning rate modulation, Max and above get a modulation of 1"}}}) diff --git a/examples/deep_fsa/params.go b/examples/deep_fsa/params.go index 48f058daf..a23738472 100644 --- a/examples/deep_fsa/params.go +++ b/examples/deep_fsa/params.go @@ -83,8 +83,9 @@ var ParamSets = netparams.Sets{ }}, {Sel: "Path", Desc: "std", Params: params.Params{ + "Path.Learn.Trace.SynCa": "LinearSynCa", "Path.Learn.Trace.SubMean": "0", // 0 > 1 -- even with CTCtxt = 0 - "Path.Learn.LRate.Base": "0.03", // .03 > others -- same as CtCtxt + "Path.Learn.LRate.Base": "0.02", // .03 > others -- same as CtCtxt "Path.SWts.Adapt.LRate": "0.01", // 0.01 or 0.0001 music "Path.SWts.Init.SPct": "1.0", // 1 works fine here -- .5 also ok "Path.Com.PFail": "0.0", diff --git a/examples/kinaseq/kinaseq.go b/examples/kinaseq/kinaseq.go index c0ad7c797..78ca983a8 100644 --- a/examples/kinaseq/kinaseq.go +++ b/examples/kinaseq/kinaseq.go @@ -8,23 +8,15 @@ import ( "fmt" "math/rand" "reflect" + "strings" "cogentcore.org/core/math32" "cogentcore.org/core/math32/minmax" - "cogentcore.org/core/tensor" "cogentcore.org/core/tensor/stats/stats" - "github.com/emer/emergent/v2/decoder" "github.com/emer/emergent/v2/elog" "github.com/emer/emergent/v2/etime" ) -const ( - NBins = 20 - CyclesPerBin = 10 - NOutputs = 3 - NInputs = NBins + 2 // per neuron -) - // KinaseNeuron has Neuron state type KinaseNeuron struct { // Neuron spiking (0,1) @@ -42,7 +34,7 @@ type KinaseNeuron struct { TotalSpikes float32 // binned count of spikes, for regression learning - BinnedSpikes [NBins]float32 + BinnedSpikes [4]float32 } func (kn *KinaseNeuron) Init() { @@ -58,13 +50,14 @@ func (kn *KinaseNeuron) StartTrial() { for i := range kn.BinnedSpikes { kn.BinnedSpikes[i] = 0 } + // kn.CaSyn = 0 // note: better fits with carryover } // Cycle does one cycle of neuron updating, with given exponential spike interval // based on target spiking firing rate. func (kn *KinaseNeuron) Cycle(expInt float32, params *ParamConfig, cyc int) { kn.Spike = 0 - bin := cyc / CyclesPerBin + bin := cyc / 50 if expInt > 0 { kn.SpikeP *= rand.Float32() if kn.SpikeP <= expInt { @@ -143,8 +136,11 @@ type KinaseState struct { // Standard synapse values StdSyn KinaseSynapse - // Linearion synapse values + // Linear synapse values LinearSyn KinaseSynapse + + // binned integration of send, recv spikes + BinnedSums [4]float32 } func (ks *KinaseState) Init() { @@ -160,8 +156,6 @@ func (kn *KinaseState) StartTrial() { } func (ss *Sim) ConfigKinase() { - ss.Linear.Init(NOutputs, NInputs*2, 0, decoder.IdentityFunc) - ss.Linear.LRate = ss.Config.Params.LRate } // Sweep runs a sweep through minus-plus ranges @@ -268,20 +262,14 @@ func (ss *Sim) TrialImpl(minusHz, plusHz float32) { } ks.StdSyn.DWt = ks.StdSyn.CaP - ks.StdSyn.CaD - ks.Send.SetInput(ss.Linear.Inputs, 0) - ks.Recv.SetInput(ss.Linear.Inputs, NInputs) - ss.Linear.Forward() - out := make([]float32, NOutputs) - ss.Linear.Output(&out) - ks.LinearSyn.CaM = out[0] - ks.LinearSyn.CaP = out[1] - ks.LinearSyn.CaD = out[2] + for i := range ks.BinnedSums { + ks.BinnedSums[i] = 0.1 * (ks.Recv.BinnedSpikes[i] * ks.Send.BinnedSpikes[i]) + } + + ss.CaParams.FinalCa(ks.BinnedSums[0], ks.BinnedSums[1], ks.BinnedSums[2], ks.BinnedSums[3], &ks.LinearSyn.CaM, &ks.LinearSyn.CaP, &ks.LinearSyn.CaD) ks.LinearSyn.DWt = ks.LinearSyn.CaP - ks.LinearSyn.CaD if ks.Train { - targ := [NOutputs]float32{ks.StdSyn.CaM, ks.StdSyn.CaP, ks.StdSyn.CaD} - sse, _ := ss.Linear.Train(targ[:]) - ks.SSE = sse ss.Logs.LogRow(etime.Train, etime.Cycle, 0) ss.GUI.UpdatePlot(etime.Train, etime.Cycle) ss.Logs.LogRow(etime.Train, etime.Trial, ks.Trial) @@ -308,7 +296,6 @@ func (ss *Sim) Train() { ss.Logs.LogRow(etime.Train, etime.Condition, ss.Kinase.Condition) ss.GUI.UpdatePlot(etime.Train, etime.Condition) } - tensor.SaveCSV(&ss.Linear.Weights, "trained.wts", '\t') } func (ss *Sim) ConfigKinaseLogItems() { @@ -320,7 +307,7 @@ func (ss *Sim) ConfigKinaseLogItems() { tn := len(times) WalkFields(val, func(parent reflect.Value, field reflect.StructField, value reflect.Value) bool { - if field.Name == "BinnedSpikes" { + if strings.HasPrefix(field.Name, "Binned") { return false } return true diff --git a/examples/kinaseq/neuron.go b/examples/kinaseq/neuron.go index 24b4ade76..0e90c30b2 100644 --- a/examples/kinaseq/neuron.go +++ b/examples/kinaseq/neuron.go @@ -189,10 +189,10 @@ func (ss *Sim) NeuronUpdate(nt *axon.Network, inputOn bool) { syni := uint32(0) pj := ly.RcvPaths[0] - snCaSyn := pj.Params.Learn.KinaseCa.SpikeG * axon.NrnV(ctx, ni, di, axon.CaSyn) + snCaSyn := pj.Params.Learn.KinaseCa.CaScale * axon.NrnV(ctx, ni, di, axon.CaSyn) pj.Params.SynCaSyn(ctx, syni, ri, di, snCaSyn, updtThr) - rnCaSyn := pj.Params.Learn.KinaseCa.SpikeG * axon.NrnV(ctx, ri, di, axon.CaSyn) + rnCaSyn := pj.Params.Learn.KinaseCa.CaScale * axon.NrnV(ctx, ri, di, axon.CaSyn) if axon.NrnV(ctx, si, di, axon.Spike) <= 0 { // NOT already handled in send version pj.Params.SynCaSyn(ctx, syni, si, di, rnCaSyn, updtThr) } diff --git a/examples/kinaseq/sim.go b/examples/kinaseq/sim.go index a45af3426..b5b0f2d14 100644 --- a/examples/kinaseq/sim.go +++ b/examples/kinaseq/sim.go @@ -56,7 +56,7 @@ type Sim struct { Config Config // Kinase SynCa params - CaParams kinase.CaParams + CaParams kinase.SynCaParams // Kinase state Kinase KinaseState diff --git a/examples/objrec/params.go b/examples/objrec/params.go index 29465c105..b60798c2d 100644 --- a/examples/objrec/params.go +++ b/examples/objrec/params.go @@ -69,6 +69,7 @@ var ParamSets = netparams.Sets{ }}, {Sel: "Path", Desc: "yes extra learning factors", Params: params.Params{ + "Path.Learn.Trace.SynCa": "LinearSynCa", "Path.Learn.LRate.Base": "0.2", // 0.4 for NeuronCa; 0.2 best, 0.1 nominal "Path.Learn.Trace.SubMean": "1", // 1 -- faster if 0 until 20 epc -- prevents sig amount of late deterioration "Path.SWts.Adapt.LRate": "0.0001", // 0.005 == .1 == .01 diff --git a/examples/ra25/params.go b/examples/ra25/params.go index 6f86b9a94..e4a224be3 100644 --- a/examples/ra25/params.go +++ b/examples/ra25/params.go @@ -41,10 +41,11 @@ var ParamSets = netparams.Sets{ }}, {Sel: "Path", Desc: "basic path params", Params: params.Params{ - "Path.Learn.LRate.Base": "0.1", // 0.1 learns fast but dies early, .02 is stable long term - "Path.SWts.Adapt.LRate": "0.1", // .1 >= .2, - "Path.SWts.Init.SPct": "0.5", // .5 >= 1 here -- 0.5 more reliable, 1.0 faster.. - "Path.Learn.Trace.SubMean": "0", // 1 > 0 for long run stability + "Path.Learn.Trace.SynCa": "LinearSynCa", + "Path.Learn.LRate.Base": "0.05", // 0.1 learns fast but dies early, .02 is stable long term + "Path.SWts.Adapt.LRate": "0.1", // .1 >= .2, + "Path.SWts.Init.SPct": "0.5", // .5 >= 1 here -- 0.5 more reliable, 1.0 faster.. + "Path.Learn.Trace.SubMean": "0", // 1 > 0 for long run stability }}, {Sel: ".BackPath", Desc: "top-down back-pathways MUST have lower relative weight scale, otherwise network hallucinates", Params: params.Params{ diff --git a/kinase/params.go b/kinase/params.go index dae3dd5cb..488b7b3f5 100644 --- a/kinase/params.go +++ b/kinase/params.go @@ -240,7 +240,7 @@ func (kp *SynCaParams) CurCa(ctime, utime float32, caM, caP, caD *float32) { // FinalCa uses a linear regression to compute the final Ca values func (kp *SynCaParams) FinalCa(bin0, bin1, bin2, bin3 float32, caM, caP, caD *float32) { - if bin0+bin1+bin2+bin3 < 0.1 { + if bin0+bin1+bin2+bin3 < 0.01 { *caM = 0 *caP = 0 *caD = 0