PES learning의 경우, synapse 조절을 통해 target neuron의 발화를 모사할 수 있도록 학습한다.
그래서 PES learning을 이용한 간단한 supervised learning을 구현해보자.
Network의 구조는 다음과 같다.
위 구조를 보면, postsynaptic neuron의 경우 presynaptic neuron의 input과, white Gaussian noise를 입력으로 받는다.
Postsynaptic neuron의 경우엔 1초마다 주기적으로 발화하도록 input을 받는다.
목적은, PES 학습을 통해 noise input의 synapse를 약화시키는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import numpy as np import matplotlib.pyplot as plt %matplotlib inline import nengo from nengo.dists import Choice from nengo.utils.ensemble import tuning_curves from nengo.utils.matplotlib import rasterplot from nengo.processes import WhiteSignal def input_one_hot(t): if(t % 1 == 0): return 1 else: return 0 model = nengo.Network() with model: input_node = nengo.Node(output=input_one_hot) pre_neuron = nengo.Ensemble(1, dimensions=1, max_rates = [100] * 1, intercepts=[0] * 1) pre_neuron.encoders = Choice([[1]]) nengo.Connection(input_node, pre_neuron) noise = nengo.Node(WhiteSignal(50, high=10), size_out=1) noise_neuron = nengo.Ensemble(1, dimensions=1, max_rates = [100] * 1, intercepts=[0] * 1) noise_neuron.encoders = Choice([[1]]) nengo.Connection(noise, noise_neuron) post_neuron = nengo.Ensemble(1, dimensions=1, max_rates = [100] * 1, intercepts=[0] * 1) post_neuron.encoders = Choice([[1]]) error = nengo.Ensemble(1, dimensions=1) nengo.Connection(pre_neuron, post_neuron, transform=1) #conn = nengo.Connection(noise_neuron, post_neuron, transform=1) #nengo.Connection(post_neuron, error) #nengo.Connection(pre_neuron, error, transform=-1) #conn.learning_rule_type = nengo.PES(learning_rate=0.001) #nengo.Connection(error, conn.learning_rule) input_p = nengo.Probe(input_node) noise_p = nengo.Probe(noise) error_p = nengo.Probe(error) pre_p = nengo.Probe(pre_neuron) post_p = nengo.Probe(post_neuron) noise_spike_p = nengo.Probe(noise_neuron.neurons) pre_spike_p = nengo.Probe(pre_neuron.neurons) post_spike_p = nengo.Probe(post_neuron.neurons) with nengo.Simulator(model) as sim: sim.run(10.0) | cs |
먼저, PES learning 관련 코드를 주석처리하여 돌려보자.
각 neuron은 모두 1이 넘은 input에 대해서만 발화하도록 설정되었다.
1 2 3 4 5 6 7 8 9 10 | plt.figure(figsize=(12, 10)) plt.subplot(3, 1, 1) rasterplot(sim.trange(), sim.data[pre_spike_p]) plt.xlim(0, 10) plt.subplot(3, 1, 2) rasterplot(sim.trange(), sim.data[noise_spike_p]) plt.xlim(0, 10) plt.subplot(3, 1, 3) rasterplot(sim.trange(), sim.data[post_spike_p]) plt.xlim(0, 10) | cs |
첫 번째 figure는 presynaptic neuron의 raster plot이고, 두 번째는 noise neuron, 세 번째는 postsynaptic neuron이다.
Postsynaptic neuron의 활성은 noise neuron과 presynaptic neuron의 합으로 나타난다.
여기서 위 코드의 주석을 해제하고 돌려보자.
시간이 지날 수록 noise input 의 효과가 줄어드는 것이 보인다!
'Deep Learning Tools > Nengo' 카테고리의 다른 글
[작성 중] Neuron의 backpropagation과 supervised learning (0) | 2019.04.08 |
---|---|
Nengo로 one-hot-vector에 반응하는 one-hot-neuron 만들기 (0) | 2018.11.28 |
Nengo synapse에 PES learning 적용 예제 (0) | 2018.11.26 |
Prescribed Error Sensitivity (PES) learning rule (0) | 2018.11.10 |
Bienenstock, Cooper, and Munro (BCM) learning rule (0) | 2018.11.10 |