์ด์ „ Tutorial 2์—์„œ ์„ค๊ณ„๋œ LIF neuron model์€ ๋ณต์žกํ•˜๊ณ  hyper parameter์˜ ์กฐ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ถ”์ ์€ ์–ด๋ ต๊ณ  SNN์œผ๋กœ์˜ ํ™•์žฅ์„ ํ•  ์‹œ ๋” ๋ณต์žกํ•ด ์ง์œผ๋กœ ๋‹จ์ˆœํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

LIF neuron model ๋‹จ์ˆœํ™”

๊ฐ์‡ ์œจ : $\beta$

Euler ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด passive membrane ๋ชจ๋ธ์˜ ํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

\[V_m(t+ฮ”t)=V_m(t)+ฯ„ฮ”t(โˆ’V_m(t)+I(t)R)\]

์ด๋•Œ ์ž…๋ ฅ ์ „๋ฅ˜ $I(t)$๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•œ๋‹ค.

\[V_m(t+ฮ”t)=V_m(t)โˆ’\frac{ฮ”t}{ฯ„}V_m(t)\]

์ด๋•Œ ๋ง‰์ „์œ„์˜ ๊ฐ์‡ ์œจ์„ $\beta$๋ผ๊ณ  ํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

\[\beta = \frac{V_m(t+\triangle t)}{V_m(t)}=1-\frac{\triangle t}{\tau}\]

๊ฐ€์ค‘ ์ž…๋ ฅ ์ „๋ฅ˜

t๊ฐ€ ์‹œํ€€์Šค์˜ ์˜ ์‹œ๊ฐ„ ๋‹จ๊ณ„๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด $\triangle t = 1$๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ hyper parameter์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด $R = 1$๋กœ ๊ฐ€์ •ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์ด ์ถœ๋ ฅ๋œ๋‹ค.

\[\beta = 1 - \frac{1}{C} \to (1-\beta)I_{in}=\frac{1}{\tau}I_{in}\]

์ด๋•Œ $1-\beta$๋ฅผ ์ž…๋ ฅ ์ „๋ฅ˜์˜ ๊ฐ€์ค‘์น˜๋ผ๊ณ  ๋ณด๋ฉฐ membrane ์ „์œ„์— ์ˆœ๊ฐ„์ ์œผ๋กœ ๊ธฐ์—ฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋˜ํ•œ ์‹œ๊ฐ„ ๊ตฌ๊ฐ„์ด ์งง์•„์„œ neuron์€ ํ•˜๋‚˜์˜ Spike๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

\[V(t+1) = \beta V(t) + (1-\beta)I_{in}(t+1)\]

deeplearning์—์„  ์ž…๋ ฅ์˜ ๊ฐ€์ค‘์น˜ ๊ณ„์ˆ˜๊ฐ€ ํ•™์Šต ๊ฐ€๋Šฅํ•œ parameter๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋•Œ ์‹ ํ˜ธ $V(t)$์™€ ๊ฐ€์ค‘์น˜ W์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹จ์ˆœํ™” ํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜์„ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

\[V(t+1) = \beta V(t) + WX(t+1)\]

Spikint & Reset

๋ง‰ ์ „์œ„๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ๋‰ด๋Ÿฐ์ด ์ถœ๋ ฅ ์ŠคํŒŒ์ดํฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

\[S[t] = 1, if \;\;V(t)>V_{thr} \\ \;\;\;0, otherwise\]

Spike๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด membrane ์ „์œ„๋Š” ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ ๊ฐ์†Œ์— ์˜ํ•œ ๋ฆฌ์…‹(reset by substraction) ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

\[V(t+1) = \beta V(t) + WX(t+1)-S(t)V_{thr}\]

์ด๋•Œ W๋Š” ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฉฐ $V_{thr}$์€ ์ข…์ข… 1๋กœ ์„ค์ •๋œ๋‹ค.


def leaky_integrate_and_fire(mem, x, w, beta, threshold=1):
  spk = (mem > threshold)  # ๋ง‰ ์ „์œ„๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด spk=1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0
  mem = beta * mem + w * x - spk * threshold
  return spk, mem
delta_t = torch.tensor(1e-3)
tau = torch.tensor(5e-3)
beta = torch.exp(-delta_t / tau)
print(f"The decay rate is: {beta:.3f}")
num_steps = 200

# ์ž…๋ ฅ/์ถœ๋ ฅ ์ดˆ๊ธฐํ™” ๋ฐ ์ž‘์€ ์Šคํ… ์ „๋ฅ˜ ์ž…๋ ฅ
x = torch.cat((torch.zeros(10), torch.ones(190) * 0.5), 0)
mem = torch.zeros(1)
spk_out = torch.zeros(1)
mem_rec = []
spk_rec = []
# ๋‰ด๋Ÿฐ ํŒŒ๋ผ๋ฏธํ„ฐ
w = 0.4
beta = 0.819

# ๋‰ด๋Ÿฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
for step in range(num_steps):
  spk, mem = leaky_integrate_and_fire(mem, x[step], w=w, beta=beta)
  mem_rec.append(mem)
  spk_rec.append(spk)

Updated: