building v0.0.6
This commit is contained in:
@@ -34,7 +34,8 @@ using .learn
|
|||||||
|
|
||||||
""" version 0.0.6
|
""" version 0.0.6
|
||||||
Todo:
|
Todo:
|
||||||
[1] use abs(wRec) suring neuron init
|
[*1] if neuron not fire for a long time, reduce it conn strength
|
||||||
|
[DONE] use abs(wRec) during neuron init
|
||||||
[2] implement dormant connection and pruning machanism. the longer the training the longer
|
[2] implement dormant connection and pruning machanism. the longer the training the longer
|
||||||
0 weight stay 0.
|
0 weight stay 0.
|
||||||
[] using RL to control learning signal
|
[] using RL to control learning signal
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ function (kfn::kfn_1)(m::model, input_data::AbstractVector)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# generate noise
|
# generate noise
|
||||||
noise = [GeneralUtils.randomChoiceWithProb([true, false],[0.0, 1.0])
|
noise = [GeneralUtils.randomChoiceWithProb([true, false],[0.2, 0.8])
|
||||||
for i in 1:length(input_data)]
|
for i in 1:length(input_data)]
|
||||||
# noise = [rand(rng, Distributions.Binomial(1, 0.5)) for i in 1:10] # another option
|
# noise = [rand(rng, Distributions.Binomial(1, 0.5)) for i in 1:10] # another option
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ function (kfn::kfn_1)(m::model, input_data::AbstractVector)
|
|||||||
|
|
||||||
return sum(kfn.firedNeurons_t1[kfn.kfnParams[:totalInputPort]+1:end])::Int,
|
return sum(kfn.firedNeurons_t1[kfn.kfnParams[:totalInputPort]+1:end])::Int,
|
||||||
logit::Array{Float64},
|
logit::Array{Float64},
|
||||||
[n.v_t1 for n in kfn.outputNeuronsArray],
|
[i for i in kfn.neuronsArray[end].wRec[1:10]],
|
||||||
[sum(i.wRec) for i in kfn.outputNeuronsArray],
|
[sum(i.wRec) for i in kfn.outputNeuronsArray],
|
||||||
[sum(i.epsilonRec) for i in kfn.outputNeuronsArray],
|
[sum(i.epsilonRec) for i in kfn.outputNeuronsArray],
|
||||||
[sum(i.wRecChange) for i in kfn.outputNeuronsArray]
|
[sum(i.wRecChange) for i in kfn.outputNeuronsArray]
|
||||||
|
|||||||
23
src/learn.jl
23
src/learn.jl
@@ -71,7 +71,7 @@ function compute_wRecChange!(n::lifNeuron, wOut::AbstractVector, modelError::Flo
|
|||||||
# ΔwRecChange .+= (0.2*(abs(sum(n.wRec)) / length(n.wRec)))
|
# ΔwRecChange .+= (0.2*(abs(sum(n.wRec)) / length(n.wRec)))
|
||||||
# end
|
# end
|
||||||
n.wRecChange .+= ΔwRecChange
|
n.wRecChange .+= ΔwRecChange
|
||||||
# reset_epsilonRec!(n)
|
reset_epsilonRec!(n)
|
||||||
end
|
end
|
||||||
|
|
||||||
function compute_wRecChange!(n::alifNeuron, wOut::AbstractVector, modelError::Float64)
|
function compute_wRecChange!(n::alifNeuron, wOut::AbstractVector, modelError::Float64)
|
||||||
@@ -88,8 +88,8 @@ function compute_wRecChange!(n::alifNeuron, wOut::AbstractVector, modelError::Fl
|
|||||||
# end
|
# end
|
||||||
n.wRecChange .+= ΔwRecChange
|
n.wRecChange .+= ΔwRecChange
|
||||||
|
|
||||||
# reset_epsilonRec!(n)
|
reset_epsilonRec!(n)
|
||||||
# reset_epsilonRecA!(n)
|
reset_epsilonRecA!(n)
|
||||||
# n.alphaChange += compute_alphaChange(n.eta, nError)
|
# n.alphaChange += compute_alphaChange(n.eta, nError)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ function compute_wRecChange!(n::integrateNeuron, error::Float64)
|
|||||||
# end
|
# end
|
||||||
n.wRecChange .+= ΔwRecChange
|
n.wRecChange .+= ΔwRecChange
|
||||||
n.bChange += ΔbChange
|
n.bChange += ΔbChange
|
||||||
# reset_epsilonRec!(n)
|
reset_epsilonRec!(n)
|
||||||
# n.alphaChange += compute_alphaChange(n.eta, error)
|
# n.alphaChange += compute_alphaChange(n.eta, error)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -165,8 +165,21 @@ function learn!(n::T, firedNeurons, nExInType) where T<:computeNeuron
|
|||||||
# end
|
# end
|
||||||
# set weight that fliped sign to 0 for random new connection
|
# set weight that fliped sign to 0 for random new connection
|
||||||
n.wRec .*= nonFlipedSign
|
n.wRec .*= nonFlipedSign
|
||||||
# capMaxWeight!(n.wRec) # cap maximum weight
|
# n.wRec = wRecMaxWeight!(n, max=1.0) # cap maximum weight
|
||||||
|
|
||||||
|
# check for non firing. if neuron not fire for too long, reduce all connection strength
|
||||||
|
if n.id ∈ firedNeurons
|
||||||
|
n.notFireCounter = n.notFireTimeOut
|
||||||
synapticConnStrength!(n, "updown")
|
synapticConnStrength!(n, "updown")
|
||||||
|
elseif n.id ∉ firedNeurons && n.notFireCounter != n.notFireTimeOut
|
||||||
|
n.notFireTimeOut += 1
|
||||||
|
synapticConnStrength!(n, "updown")
|
||||||
|
elseif n.id ∉ firedNeurons && n.notFireCounter == n.notFireCounter
|
||||||
|
synapticConnStrength!(n, "down")
|
||||||
|
else
|
||||||
|
error("undefined condition line $(@__LINE__)")
|
||||||
|
end
|
||||||
|
|
||||||
neuroplasticity!(n, firedNeurons, nExInType)
|
neuroplasticity!(n, firedNeurons, nExInType)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export calculate_α, calculate_ρ, calculate_k, timestep_forward!, init_neuron,
|
|||||||
reset_epsilonRecA!, synapticConnStrength!, normalizePeak!, reset_wRecChange!,
|
reset_epsilonRecA!, synapticConnStrength!, normalizePeak!, reset_wRecChange!,
|
||||||
firing_rate_error!, firing_rate_regulator!, update_Bn!, cal_firing_reg!,
|
firing_rate_error!, firing_rate_regulator!, update_Bn!, cal_firing_reg!,
|
||||||
neuroplasticity!, shakeup!, reset_learning_no_wchange!, adjust_internal_learning_rate!,
|
neuroplasticity!, shakeup!, reset_learning_no_wchange!, adjust_internal_learning_rate!,
|
||||||
gradient_withloss, capMaxWeight!, connStrengthAdjust
|
gradient_withloss, capMaxWeight, connStrengthAdjust, wRecMaxWeight!
|
||||||
|
|
||||||
using Statistics, Random, LinearAlgebra, Distributions, Zygote, Flux
|
using Statistics, Random, LinearAlgebra, Distributions, Zygote, Flux
|
||||||
using GeneralUtils
|
using GeneralUtils
|
||||||
@@ -404,9 +404,14 @@ end
|
|||||||
|
|
||||||
""" Cap maximum weight of each neuron connection
|
""" Cap maximum weight of each neuron connection
|
||||||
"""
|
"""
|
||||||
function capMaxWeight!(v::Vector{Float64}, max=1.0)
|
function capMaxWeight(v::Vector{Float64}, max=1.0)
|
||||||
originalSign = sign.(v)
|
originalSign = sign.(v)
|
||||||
v = originalSign .* GeneralUtils.replaceMoreThan.(abs.(v), max)
|
return originalSign .* GeneralUtils.replaceMoreThan.(abs.(v), max)
|
||||||
|
end
|
||||||
|
|
||||||
|
function wRecMaxWeight!(n::computeNeuron; max=1.0)
|
||||||
|
originalSign = sign.(n.wRec)
|
||||||
|
n.wRec = originalSign .* GeneralUtils.replaceMoreThan.(abs.(n.wRec), max)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -425,11 +430,6 @@ end
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
src/types.jl
10
src/types.jl
@@ -253,7 +253,7 @@ function kfn_1(kfnParams::Dict)
|
|||||||
try # input neuron doest have n.subscriptionList
|
try # input neuron doest have n.subscriptionList
|
||||||
for (i, sub_id) in enumerate(n.subscriptionList)
|
for (i, sub_id) in enumerate(n.subscriptionList)
|
||||||
n_ExInType = kfn.neuronsArray[sub_id].ExInType
|
n_ExInType = kfn.neuronsArray[sub_id].ExInType
|
||||||
n.wRec[i] *= n_ExInType
|
n.wRec[i] = abs(n.wRec[i]) * n_ExInType
|
||||||
# add id exin type to kfn
|
# add id exin type to kfn
|
||||||
if n_ExInType < 0
|
if n_ExInType < 0
|
||||||
push!(kfn.nInhabitory, sub_id)
|
push!(kfn.nInhabitory, sub_id)
|
||||||
@@ -364,6 +364,9 @@ Base.@kwdef mutable struct lifNeuron <: computeNeuron
|
|||||||
firingRateError::Float64 = 0.0 # local neuron error w.r.t. firing regularization
|
firingRateError::Float64 = 0.0 # local neuron error w.r.t. firing regularization
|
||||||
firingRate::Float64 = 0.0 # running average of firing rate in Hz
|
firingRate::Float64 = 0.0 # running average of firing rate in Hz
|
||||||
|
|
||||||
|
notFireTimeOut::Int64 = 100 # consecutive count of not firing. Should be the same as batch size
|
||||||
|
notFireCounter::Int64 = 0
|
||||||
|
|
||||||
""" "inference" = no learning params will be collected.
|
""" "inference" = no learning params will be collected.
|
||||||
"learning" = neuron will accumulate epsilon_j, compute Δw_rec_change each time
|
"learning" = neuron will accumulate epsilon_j, compute Δw_rec_change each time
|
||||||
correct answer is available then merge Δw_rec_change into wRecChange then
|
correct answer is available then merge Δw_rec_change into wRecChange then
|
||||||
@@ -458,6 +461,9 @@ Base.@kwdef mutable struct alifNeuron <: computeNeuron
|
|||||||
firingRateError::Float64 = 0.0 # local neuron error w.r.t. firing regularization
|
firingRateError::Float64 = 0.0 # local neuron error w.r.t. firing regularization
|
||||||
firingRate::Float64 = 0.0 # running average of firing rate, Hz
|
firingRate::Float64 = 0.0 # running average of firing rate, Hz
|
||||||
|
|
||||||
|
notFireTimeOut::Int64 = 100 # consecutive count of not firing. Should be the same as batch size
|
||||||
|
notFireCounter::Int64 = 0
|
||||||
|
|
||||||
tau_a::Float64 = 100.0 # τ_a, adaption time constant in millisecond
|
tau_a::Float64 = 100.0 # τ_a, adaption time constant in millisecond
|
||||||
beta::Float64 = 0.15 # β, constant, value from paper
|
beta::Float64 = 0.15 # β, constant, value from paper
|
||||||
rho::Float64 = 0.0 # ρ, threshold adaptation decay factor
|
rho::Float64 = 0.0 # ρ, threshold adaptation decay factor
|
||||||
@@ -744,7 +750,7 @@ function init_neuron!(id::Int64, n::alifNeuron, n_params::Dict,
|
|||||||
n.synapticStrength = rand(-4.5:0.01:-4, length(n.subscriptionList))
|
n.synapticStrength = rand(-4.5:0.01:-4, length(n.subscriptionList))
|
||||||
|
|
||||||
n.epsilonRec = zeros(length(n.subscriptionList))
|
n.epsilonRec = zeros(length(n.subscriptionList))
|
||||||
n.wRec = randn(rng, length(n.subscriptionList)) / 100 # TODO use abs()
|
n.wRec = randn(rng, length(n.subscriptionList)) / 100
|
||||||
n.wRecChange = zeros(length(n.subscriptionList))
|
n.wRecChange = zeros(length(n.subscriptionList))
|
||||||
|
|
||||||
# the more time has passed from the last time neuron was activated, the more
|
# the more time has passed from the last time neuron was activated, the more
|
||||||
|
|||||||
Reference in New Issue
Block a user