nengo 5주차
목록
PES 논문 - 잡생각
기존 PES 논문은 좀 수학적으로 weight upadate 가 수렴하는지 증명이 주된 내용인거 같음.
PES 가 error 가 적어지는 방향으로 갈꺼는 자명한데, 3가지 의문이 생겼다.
- layer가 쌓이면 어떻게 되는지?
- biological plausible 한지? (backpropagation 과는 다르게 SNN에 적용되는 rule은 biological plausible 해야한다고 생각함.)
- rate coding 안쓰고 temporal coding으로도 가능한지?
1,3 답은 아직 모르겠지만,
2에 대하여 생각해보았다. (완벽답변x)
일단 어느정도 대응되는 개념인 backpropagation에 대하여 논하면, backpropagation 은 실제 뇌에도 일어나는지 의견이 분분하다. 내 느낌상 negative 쪽이 훨씬 더 많고 내 생각도 direct 하게는 일어나지 않을꺼라 생각한다. 일단 backpropagation이 일어나지 않을꺼라고 많이 이야기 하는 이유는, biologically plausible 하지 않기 때문이다. 대표적 이유로는
- global 하게 적용은 비실제적
- 실제 synpase는 단방향
- label 문제 → 누가 label을 어디서 정해주나
- 타이밍 및 스파이크 문제
(물론 실제 action potential 의 backpropagtion 현상도 있고 chemically feedback 등이 있어서 가능할 수도 있다.)
PES 는 backpropagation 과 다를까?
아래 링크에 어느정도 답변이 되어있다.

backpropagation 처럼 global 한 느낌이 아니라 local 느낌이라 좀더 biologically plausible 하다는 내용이다.
어느정도 맞긴하지만 어찌됐든 PES는 실험적 으로 관측되지 않은 내용이고, backpropagtion 보다는 좀 더 plausible 하지만 error vector 와, label 들이 plausible 하지 않은거 같아서 잘 모르겠다.
그래도 아래 논문을 보면
PES + BCM learning rule ⇒ homostatic PES (hPES) rule 로 정의해서
STDP 는 물론 triplet STDP 까지 이론적으로 동등함을 이야기 하고 있다.
이 논문을 읽고 실험으로도 관측된 learning 현상인 STDP 와 근접한 결과를 보고 조금 마음이 열리게 되었다.
PES code
transform = -1 대신 function lambda x: -x 사용해도 괜찮은지 check
→ 괜찮음.
(+PES 대신 RLS 와 비교하고자 하였으나 내 생각대로 안되어서 일단 나중에)

code
model2 = nengo.Network() with model2: inp = nengo.Node(WhiteSignal(60, high=5), size_out=1) #input pre = nengo.Ensemble(60, dimensions=2) nengo.Connection(inp, pre[0]) nengo.Connection(inp, pre[1]) post = nengo.Ensemble(60, dimensions=2) conn = nengo.Connection(pre, post, function=lambda x: np.repeat(np.random.random(1),2)) inp_p = nengo.Probe(inp) pre_p = nengo.Probe(pre, synapse=0.01) post_p = nengo.Probe(post, synapse=0.01) error = nengo.Ensemble(60, dimensions=2) error_p = nengo.Probe(error, synapse=0.03) nengo.Connection(post, error) nengo.Connection(pre[0], error[0], function=lambda x: -x) nengo.Connection(pre[1], error[1], transform=-1) conn.learning_rule_type = nengo.PES() nengo.Connection(error, conn.learning_rule) with nengo.Simulator(model2) as sim2: sim2.run(10.0) plt.figure(figsize=(16, 12)) plt.subplot(2, 2, 1) plt.plot(sim2.trange(), sim2.data[inp_p].T[0], c='k', label='Input') plt.plot(sim2.trange(), sim2.data[pre_p].T[0], c='b', label='Pre') plt.plot(sim2.trange(), sim2.data[post_p].T[0], c='r', label='Post') plt.ylabel("function = lambda x: -x") plt.legend(loc='best') plt.subplot(2, 2, 2) plt.plot(sim2.trange(), sim2.data[error_p].T[0], c='b') plt.ylim(-1, 1) plt.legend(("Error[0]"), loc='best') plt.subplot(2, 2, 3) plt.plot(sim2.trange(), sim2.data[inp_p].T[0], c='k', label='Input') plt.plot(sim2.trange(), sim2.data[pre_p].T[1], c='b', label='Pre') plt.plot(sim2.trange(), sim2.data[post_p].T[1], c='r', label='Post') plt.ylabel("transform = -1") plt.legend(loc='best') plt.subplot(2, 2, 4) plt.plot(sim2.trange(), sim2.data[error_p].T[1], c='b') plt.ylim(-1, 1) plt.legend(("Error[1]"), loc='best')
nengo_dl
tensorflow keras에 LIF neuron만 추가된거같아 흠...
maxpooling 안했넹
- LIF neuron 은 단지 activation function 같은 느낌으로 쓰는 느낌인데, input → frequency 로 바꾸는 rate coding 이겠죠...?
→ rate coding 확인.
- LIF neuron은 미분이 안될텐데, 어떻게 gradient descent 기반 weight update 를 하는건지?
→ 현우님이 NEF를 정리해주시면서 LIF tuning curve가 activation function 처럼 사용되는것을 알게됌.
- 기존 CNN 과 다르게 특별한 점이 있나...?
Uploaded by N2T