This commit is contained in:
ton
2023-09-14 10:28:30 +07:00
parent 2f55cdf7a7
commit 9e701cd042
3 changed files with 128 additions and 101 deletions

View File

@@ -92,10 +92,16 @@ function lifComputeParamsChange!( timeStep::CuArray,
startCol = CartesianIndices(wRec)[startIndex][2]
stopCol = CartesianIndices(wRec)[stopIndex][2]
# some RSNN neuron that has direct connection to output neuron need to get Bjk
# from output neuron that represent correct answer, the rest of RSNN get random Bjk
onW = @view(wOut[:, startCol:stopCol, sum(label), 1])
_bk = @view(bk[:, startCol:stopCol, 1])
nError = _bk .* modelError
mask = iszero.(onW)
bk_ = mask .* _bk
bkComposed = onW .+ bk_
nError = bkComposed .* modelError
nError = reshape(nError, (1,1,:,1))
# _,_,i3,_ = size(wOut)
# for i in 1:i3
# # nError a.k.a. learning signal use dopamine concept,
@@ -131,7 +137,7 @@ function lifComputeParamsChange!( timeStep::CuArray,
# println("")
# error("DEBUG lifComputeParamsChange!")
# end
# error("DEBUG lifComputeParamsChange!")
# reset epsilonRec
epsilonRec .= 0
end
@@ -167,8 +173,14 @@ function alifComputeParamsChange!( timeStep::CuArray,
startCol = CartesianIndices(wRec)[startIndex][2]
stopCol = CartesianIndices(wRec)[stopIndex][2]
# some RSNN neuron that has direct connection to output neuron need to get Bjk
# from output neuron that represent correct answer, the rest of RSNN get random Bjk
onW = @view(wOut[:, startCol:stopCol, sum(label), 1])
_bk = @view(bk[:, startCol:stopCol, 1])
nError = _bk .* modelError
mask = iszero.(onW)
bk_ = mask .* _bk
bkComposed = onW .+ bk_
nError = bkComposed .* modelError
nError = reshape(nError, (1,1,:,1))
wRecChange .+= (eta .* nError .* eRec)
@@ -291,30 +303,28 @@ end
function learn!(kfn::kfn_1, device=cpu)
# lif learn
kfn.lif_wRec, kfn.lif_neuronInactivityCounter, kfn.lif_synapseReconnectDelayCounter =
kfn.lif_wRec, kfn.lif_neuronInactivityCounter, kfn.lif_synapseReconnectDelay =
lifLearn(kfn.lif_wRec,
kfn.lif_wRecChange,
kfn.lif_exInType,
kfn.lif_arrayProjection4d,
kfn.lif_neuronInactivityCounter,
kfn.lif_synapseReconnectDelayCounter,
kfn.lif_synapseReconnectDelay,
kfn.lif_synapseConnectionNumber,
kfn.lif_synapticWChangeCounter,
kfn.lif_eta,
kfn.lif_vt,
kfn.zitCumulative,
device)
# alif learn
kfn.alif_wRec, kfn.alif_neuronInactivityCounter, kfn.alif_synapseReconnectDelayCounter =
kfn.alif_wRec, kfn.alif_neuronInactivityCounter, kfn.alif_synapseReconnectDelay =
alifLearn(kfn.alif_wRec,
kfn.alif_wRecChange,
kfn.alif_exInType,
kfn.alif_arrayProjection4d,
kfn.alif_neuronInactivityCounter,
kfn.alif_synapseReconnectDelayCounter,
kfn.alif_synapseReconnectDelay,
kfn.alif_synapseConnectionNumber,
kfn.alif_synapticWChangeCounter,
kfn.alif_eta,
kfn.alif_vt,
kfn.zitCumulative,
@@ -337,7 +347,7 @@ end
# wRecChange,
# arrayProjection4d,
# neuronInactivityCounter,
# synapseReconnectDelayCounter,
# synapseReconnectDelay,
# synapseConnectionNumber,
# synapticWChangeCounter, #TODO
# eta,
@@ -355,15 +365,15 @@ end
# eta_cpu = eta_cpu[:,:,:,1]
# neuronInactivityCounter_cpu = neuronInactivityCounter |> cpu
# neuronInactivityCounter_cpu = neuronInactivityCounter_cpu[:,:,:,1] # (row, col, n)
# synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter |> cpu
# synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu[:,:,:,1]
# synapseReconnectDelay_cpu = synapseReconnectDelay |> cpu
# synapseReconnectDelay_cpu = synapseReconnectDelay_cpu[:,:,:,1]
# zitCumulative_cpu = zitCumulative |> cpu
# zitCumulative_cpu = zitCumulative_cpu[:,:,1] # (row, col)
# # -W if less than 10% of repeat avg, +W otherwise
# _, _, i3 = size(wRec_cpu)
# for i in 1:i3
# x = 0.1 * (sum(synapseReconnectDelayCounter[:,:,i]) / length(synapseReconnectDelayCounter[:,:,i]))
# x = 0.1 * (sum(synapseReconnectDelay[:,:,i]) / length(synapseReconnectDelay[:,:,i]))
# mask = GeneralUtils.replaceLessThan.(wRec_cpu[:,:,i], x, -1, 1)
# wRec_cpu[:,:,i] .+= mask .* eta_cpu[:,:,i] .* wRec_cpu[:,:,i]
# end
@@ -376,7 +386,7 @@ end
# zitCumulative_cpu,
# wRec_cpu,
# neuronInactivityCounter_cpu,
# synapseReconnectDelayCounter_cpu)
# synapseReconnectDelay_cpu)
# wRec_cpu = wRec_cpu .* arrayProjection4d_cpu
# wRec = wRec_cpu |> device
@@ -384,10 +394,10 @@ end
# neuronInactivityCounter_cpu = neuronInactivityCounter_cpu .* arrayProjection4d_cpu
# neuronInactivityCounter = neuronInactivityCounter_cpu |> device
# synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu .* arrayProjection4d_cpu
# synapseReconnectDelayCounter = synapseReconnectDelayCounter_cpu |> device
# synapseReconnectDelay_cpu = synapseReconnectDelay_cpu .* arrayProjection4d_cpu
# synapseReconnectDelay = synapseReconnectDelay_cpu |> device
# return wRec, neuronInactivityCounter, synapseReconnectDelayCounter
# return wRec, neuronInactivityCounter, synapseReconnectDelay
# end
function lifLearn(wRec,
@@ -395,14 +405,14 @@ function lifLearn(wRec,
exInType,
arrayProjection4d,
neuronInactivityCounter,
synapseReconnectDelayCounter,
synapseReconnectDelay,
synapseConnectionNumber,
synapticWChangeCounter, #TODO
eta,
vt,
zitCumulative,
device)
# transfer data to cpu
arrayProjection4d_cpu = arrayProjection4d |> cpu
wRec_cpu = wRec |> cpu
@@ -413,20 +423,20 @@ function lifLearn(wRec,
eta_cpu = eta_cpu[:,:,:,1]
neuronInactivityCounter_cpu = neuronInactivityCounter |> cpu
neuronInactivityCounter_cpu = neuronInactivityCounter_cpu[:,:,:,1] # (row, col, n)
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter |> cpu
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu[:,:,:,1]
synapseReconnectDelay_cpu = synapseReconnectDelay |> cpu
synapseReconnectDelay_cpu = synapseReconnectDelay_cpu[:,:,:,1]
zitCumulative_cpu = zitCumulative |> cpu
zitCumulative_cpu = zitCumulative_cpu[:,:,1]
#TODO neuroplasticity, work on CPU side
wRec_cpu, neuronInactivityCounter_cpu, synapseReconnectDelayCounter_cpu =
# neuroplasticity, work on CPU side
wRec_cpu, neuronInactivityCounter_cpu, synapseReconnectDelay_cpu =
neuroplasticity(synapseConnectionNumber,
zitCumulative_cpu,
wRec_cpu,
wRecChange_cpu,
vt,
neuronInactivityCounter_cpu,
synapseReconnectDelayCounter_cpu)
synapseReconnectDelay_cpu)
@@ -444,7 +454,7 @@ function lifLearn(wRec,
# # -W if less than 10% of repeat avg, +W otherwise
# _, _, i3 = size(wRec_cpu)
# for i in 1:i3
# x = 0.1 * (sum(synapseReconnectDelayCounter[:,:,i]) / length(synapseReconnectDelayCounter[:,:,i]))
# x = 0.1 * (sum(synapseReconnectDelay[:,:,i]) / length(synapseReconnectDelay[:,:,i]))
# mask = GeneralUtils.replaceLessThan.(wRec_cpu[:,:,i], x, -1, 1)
# wRec_cpu[:,:,i] .+= mask .* eta_cpu[:,:,i] .* wRec_cpu[:,:,i]
# end
@@ -459,17 +469,17 @@ function lifLearn(wRec,
# wRecChange_cpu,
# vt,
# neuronInactivityCounter_cpu,
# synapseReconnectDelayCounter_cpu)
# synapseReconnectDelay_cpu)
# transfer data backto gpu
wRec_cpu = wRec_cpu .* arrayProjection4d_cpu
wRec = wRec_cpu |> device
neuronInactivityCounter_cpu = neuronInactivityCounter_cpu .* arrayProjection4d_cpu
neuronInactivityCounter = neuronInactivityCounter_cpu |> device
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu .* arrayProjection4d_cpu
synapseReconnectDelayCounter = synapseReconnectDelayCounter_cpu |> device
synapseReconnectDelay_cpu = synapseReconnectDelay_cpu .* arrayProjection4d_cpu
synapseReconnectDelay = synapseReconnectDelay_cpu |> device
return wRec, neuronInactivityCounter, synapseReconnectDelayCounter
return wRec, neuronInactivityCounter, synapseReconnectDelay
end
#WORKING 1) implement 90% +w, 10% -w 2) rewrite this function
@@ -479,9 +489,9 @@ function neuroplasticity(synapseConnectionNumber,
wRecChange,
vt,
neuronInactivityCounter,
synapseReconnectDelayCounter) # (row, col, n)
synapseReconnectDelay) # (row, col, n)
i1,i2,i3 = size(wRec)
error("DEBUG -> neuroplasticity $(Dates.now())")
# merge weight
@@ -518,7 +528,7 @@ function neuroplasticity(synapseConnectionNumber,
println("neuroplasticity, from $(synapseConnectionNumber*size(totalNewConn, 3)) conn, $(sum(totalNewConn)) are replaced")
# clear -1.0 marker
GeneralUtils.replaceElements!(wRec, -1.0, synapseReconnectDelayCounter, -0.99)
GeneralUtils.replaceElements!(wRec, -1.0, synapseReconnectDelay, -0.99)
GeneralUtils.replaceElements!(wRec, -1.0, 0.0) # -1.0 marker is no longer required
for i in 1:i3
@@ -531,7 +541,7 @@ function neuroplasticity(synapseConnectionNumber,
a = similar(w) .= -0.99 # synapseConnectionNumber of this neuron
mask = (!iszero).(w)
GeneralUtils.replaceElements!(mask, 1, a, 0)
synapseReconnectDelayCounter[:,:,i] = a
synapseReconnectDelay[:,:,i] = a
else
remaining = 0
if subToFireNeuron_current[1,1,i] < subToFireNeuron_toBe
@@ -540,7 +550,7 @@ function neuroplasticity(synapseConnectionNumber,
# add new conn to firing neurons pool
remaining = addNewSynapticConn!(zitMask[:,:,i], 1,
@view(wRec[:,:,i]),
@view(synapseReconnectDelayCounter[:,:,i]),
@view(synapseReconnectDelay[:,:,i]),
toAddConn)
totalNewConn[1,1,i] += remaining
end
@@ -548,12 +558,12 @@ function neuroplasticity(synapseConnectionNumber,
# add new conn to non-firing neurons pool
remaining = addNewSynapticConn!(zitMask[:,:,i], 0,
@view(wRec[:,:,i]),
@view(synapseReconnectDelayCounter[:,:,i]),
@view(synapseReconnectDelay[:,:,i]),
totalNewConn[1,1,i])
if remaining > 0 # final get-all round if somehow non-firing pool has not enough slot
remaining = addNewSynapticConn!(zitMask[:,:,i], 1,
@view(wRec[:,:,i]),
@view(synapseReconnectDelayCounter[:,:,i]),
@view(synapseReconnectDelay[:,:,i]),
remaining)
end
end
@@ -568,9 +578,8 @@ function alifLearn(wRec,
exInType,
arrayProjection4d,
neuronInactivityCounter,
synapseReconnectDelayCounter,
synapseReconnectDelay,
synapseConnectionNumber,
synapticWChangeCounter, #TODO
eta,
vt,
zitCumulative,
@@ -587,15 +596,15 @@ function alifLearn(wRec,
eta_cpu = eta_cpu[:,:,:,1]
neuronInactivityCounter_cpu = neuronInactivityCounter |> cpu
neuronInactivityCounter_cpu = neuronInactivityCounter_cpu[:,:,:,1] # (row, col, n)
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter |> cpu
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu[:,:,:,1]
synapseReconnectDelay_cpu = synapseReconnectDelay |> cpu
synapseReconnectDelay_cpu = synapseReconnectDelay_cpu[:,:,:,1]
zitCumulative_cpu = zitCumulative |> cpu
zitCumulative_cpu = zitCumulative_cpu[:,:,1] # (row, col)
# -W if less than 10% of repeat avg, +W otherwise
_, _, i3 = size(wRec_cpu)
for i in 1:i3
x = 0.1 * (sum(synapseReconnectDelayCounter[:,:,i]) / length(synapseReconnectDelayCounter[:,:,i]))
x = 0.1 * (sum(synapseReconnectDelay[:,:,i]) / length(synapseReconnectDelay[:,:,i]))
mask = GeneralUtils.replaceLessThan.(wRec_cpu[:,:,i], x, -1, 1)
wRec_cpu[:,:,i] .+= mask .* eta_cpu[:,:,i] .* wRec_cpu[:,:,i]
end
@@ -608,7 +617,7 @@ function alifLearn(wRec,
zitCumulative_cpu,
wRec_cpu,
neuronInactivityCounter_cpu,
synapseReconnectDelayCounter_cpu)
synapseReconnectDelay_cpu)
wRec_cpu = wRec_cpu .* arrayProjection4d_cpu
wRec = wRec_cpu |> device
@@ -616,11 +625,11 @@ function alifLearn(wRec,
neuronInactivityCounter_cpu = neuronInactivityCounter_cpu .* arrayProjection4d_cpu
neuronInactivityCounter = neuronInactivityCounter_cpu |> device
synapseReconnectDelayCounter_cpu = synapseReconnectDelayCounter_cpu .* arrayProjection4d_cpu
synapseReconnectDelayCounter = synapseReconnectDelayCounter_cpu |> device
synapseReconnectDelay_cpu = synapseReconnectDelay_cpu .* arrayProjection4d_cpu
synapseReconnectDelay = synapseReconnectDelay_cpu |> device
# error("DEBUG -> alifLearn! $(Dates.now())")
return wRec, neuronInactivityCounter, synapseReconnectDelayCounter
return wRec, neuronInactivityCounter, synapseReconnectDelay
end
function onLearn!(wOut,
@@ -640,7 +649,7 @@ end
# zitCumulative, # (row, col)
# wRec, # (row, col, n)
# neuronInactivityCounter,
# synapseReconnectDelayCounter) # (row, col, n)
# synapseReconnectDelay) # (row, col, n)
# i1,i2,i3 = size(wRec)
@@ -658,7 +667,7 @@ end
# println("neuroplasticity, from $(synapseConnectionNumber*size(totalNewConn, 3)) conn, $(sum(totalNewConn)) are replaced")
# # clear -1.0 marker
# GeneralUtils.replaceElements!(wRec, -1.0, synapseReconnectDelayCounter, -0.99)
# GeneralUtils.replaceElements!(wRec, -1.0, synapseReconnectDelay, -0.99)
# GeneralUtils.replaceElements!(wRec, -1.0, 0.0) # -1.0 marker is no longer required
# for i in 1:i3
@@ -671,7 +680,7 @@ end
# a = similar(w) .= -0.99 # synapseConnectionNumber of this neuron
# mask = (!iszero).(w)
# GeneralUtils.replaceElements!(mask, 1, a, 0)
# synapseReconnectDelayCounter[:,:,i] = a
# synapseReconnectDelay[:,:,i] = a
# else
# remaining = 0
# if subToFireNeuron_current[1,1,i] < subToFireNeuron_toBe
@@ -680,7 +689,7 @@ end
# # add new conn to firing neurons pool
# remaining = addNewSynapticConn!(zitMask[:,:,i], 1,
# @view(wRec[:,:,i]),
# @view(synapseReconnectDelayCounter[:,:,i]),
# @view(synapseReconnectDelay[:,:,i]),
# toAddConn)
# totalNewConn[1,1,i] += remaining
# end
@@ -688,12 +697,12 @@ end
# # add new conn to non-firing neurons pool
# remaining = addNewSynapticConn!(zitMask[:,:,i], 0,
# @view(wRec[:,:,i]),
# @view(synapseReconnectDelayCounter[:,:,i]),
# @view(synapseReconnectDelay[:,:,i]),
# totalNewConn[1,1,i])
# if remaining > 0 # final get-all round if somehow non-firing pool has not enough slot
# remaining = addNewSynapticConn!(zitMask[:,:,i], 1,
# @view(wRec[:,:,i]),
# @view(synapseReconnectDelayCounter[:,:,i]),
# @view(synapseReconnectDelay[:,:,i]),
# remaining)
# end
# end