Spiking Neural Network

Started by
7 comments, last by Timkin 18 years, 8 months ago
I am trying to find information on spiking neural networks. Has anyone here used them or have information about them? I have been googling and reading some books about it for my masters thesis and already have some good resources, but any additional info is good info. I am going to try closing the loop on a variety of plants and achieve some useful learning. I will be using Spike Timing Dependent Plasticity (STDP) as a learning function, but have no clue how to direct training. STDP is method of increasing or decreasing the weighting of a synapse based on the time of arrival of a spike to a neuron in relation to that neuron firing. If anyone has experience with this, I'd be interested to see what you have.
Advertisement
what language are you implementing this in? I know about ANNs but I have not heard of that one, which paradigm is it similar to BP, Feed-forward, SOM?
Related to the last time the neuron fired, or when it fires next?

Do you do the weight modification when each spike arrives or each time the neuron fires?

If you increase the weight when the time difference is short and decrease when it's long, that might lead to making the neuron oversensetive to the incoming signal... it seems like increasing the weight if the signal hasn't been heard for a long time might change the neuron's function a lot, though.
tried this link yet?
Looks like in one of their papers, they throw The Kitchen Sink at it.

Random distribution -> evolutionary and "particle swarm" (parameter space attraction)

The final goal described is to try to get the network setup at a point where it can train itself (by progressing the network to a point where the learning algorithm is embedded in the network itself). That's a pretty big goal.
hi,


What masters are you doing?


theres not that much info on web pages out there as the topic is mostly research orientated, citeseer has a few papers on a quick search, I recommend looking though the bibliographies of these papers and going from there.
[happy coding]
Quote:Original post by lonesock
tried this link yet?


nice link! Check out what I found there. It's only 136 lines!

import java.util.Random;public class SpikingNeuralNet{    protected class Signal implements Comparable     {        private int destination_;        private float arrivalTime_, energy_;        public int destination() { return destination_; }         public float arrivalTime() { return arrivalTime_; }        public float energy() { return energy_; }                public Signal(int destination, float energy, float arrivalTime)        {            destination_ = destination;            energy_ = energy;            arrivalTime_ = arrivalTime;        }                public int compareTo(Object other)        {	            return (arrivalTime_ < ((Signal) other).arrivalTime_) ? -1 : 1;        }    }    protected int numNeurons_;    public float[][] weights_;    public float[][] delays_;    protected float[] energies_;    protected float[] lastUpdateTimes_;    protected PriorityQueue signalQueue_;    protected int numFires_;         public int numNeurons() { return numNeurons_; }    public int numFires() { return numFires_; }    public int numUnhandledSignals() { return signalQueue_.size(); }        public SpikingNeuralNet(SNNParams params)    {        numNeurons_ = params.numNeurons();        weights_ = new float[numNeurons_][numNeurons_];        delays_ = new float[numNeurons_][numNeurons_];        energies_ = new float[numNeurons_];        lastUpdateTimes_ = new float[numNeurons_];        signalQueue_ = new PriorityQueue();                // copy params        for(int i = 0; i < numNeurons_; ++i)        {            for(int j = 0; j < numNeurons_; ++j)            {                weights_[j] = params.weights_[j];                delays_[j] = params.delays_[j];            }        }    }        public void prepareToRun()    {        numFires_ = 0;        signalQueue_ = new PriorityQueue();                for(int i = 0; i < numNeurons_; ++i)        {            energies_ = 0;            lastUpdateTimes_ = 0;        }    }        // returns the arrival time of the earliest signal in the queue    public float firstSignalTime()    {                    Signal firstSignal = (Signal)signalQueue_.peekMin();        return firstSignal.arrivalTime();    }        public boolean signalQueueIsEmpty()    {        return signalQueue_.isEmpty();    }        // handle the first signal in the signal queue, which may cause a neuron to fire    public void handleFirstSignal()    {        // get the first signal        Signal signal = (Signal)signalQueue_.removeMin();                // get which neuron it is going to        int dest = signal.destination();                // decay the neuron's energy from last time energy was added        energies_[dest] *= (float) Math.pow(Math.E,            lastUpdateTimes_[dest] - signal.arrivalTime());                    // add the signal energy        energies_[dest] += signal.energy();                // change the neurons last update time        lastUpdateTimes_[dest] = signal.arrivalTime();                // check if the signal causes the neuron to fire        if(energies_[dest] > 1.0f)            fireNeuron(dest, lastUpdateTimes_[dest]);     }        // to stabilize the dynamics of the network, make signals weaker the more unhandled signals    // there are    protected float stabilityCoef() { return 1.0f / ((float)numUnhandledSignals() + 1.0f); }        // handle neuron firing at fireTime    public void fireNeuron(int neuron, float fireTime)    {        // recoil        energies_[neuron] = -1.0f;                // send signals to other neurons        for(int i = 0; i < numNeurons_; ++i)        {                     // normalize energy by the number of unhandled signals            // so that the dynamics of the network are stable            float energy = weights_[neuron] * stabilityCoef();                        // dont send a signal if there is no energy            if(energy == 0.0f) continue;                        // the signal arrives delay after it was sent            float arrivalTime = fireTime + delays_[neuron];                        signalQueue_.add(new Signal(i, energy, arrivalTime));        }                // System.out.print(neuron);                ++numFires_;    }}
I'll be using c and Matlab. Matlab will be for development work, c for the speed.

I've seen that link before and had forgotten about it. I'll read some of the papers when I get a chance. This is going to be interesting, I'm going for my MSEE with a controls focus. I'm also working full time and I'm married. Hopefully I'll still be married by the time I'm done with this project...lol.

STDP basically is a reinforcement tool. If a spike arrives before the neuron fires, that signal path is strengthened and vice versa. I'm not exactly sure how I'll implement it. I'm also not sure how I'll be able to perform training with it. I don't know of any method I can use to close the loop otherwise...I want to be able to keep it stable and promote stability inducing behavior. Maybe I just need to find a way to give it some Electronic Dopamine. Yeah...that'd be easy...

Anyhow, thanks for responding. I appreciate any kind of feedback.
I'm writing a paper at the moment on Intelligent Control and how to utilise neural-based models in closed loop control frameworks. It's due for submission at the end of next week. I expect that it will be accepted and thus you can have a copy after September 1st (acceptance notification). Send me an email or PM if you want to discuss some of the issues you're finding in your research.

Cheers,

Timkin

This topic is closed to new replies.

Advertisement