본문 바로가기

Deep Learning Tools/Nengo

Nengo에서 PES learning을 이용해 supervised learning 구현해보기

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 의 효과가 줄어드는 것이 보인다!