Jump to content
  • Advertisement
Sign in to follow this  
birdtracker

Spiking Neural Network

This topic is 4831 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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_;
}
}

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!