2017年12月10日日曜日

FEP tutorial

 Free-energy principle、いつかは理解したいと思っていた。ちょっと前に某先生(面識は皆無)がツイートしていたこれが読めそうだったので読んだ。せっかくなので練習がてらexerciseをpythonでやった。
FEPの入門的なこと書いてるサイトを見かけた覚えが無いので、万一本気で勉強しようとしてる人が通りかかった時のために次の様に記載しておく。

※間違いがあっても責任は負いかねます。
※間違いの指摘は大歓迎です。

【Excrcise 1】
#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

#平均mu, 分散sigmaの正規分布におけるxの確率
def norm_prob(x, mu, sigma):
return np.exp(-1*((x-mu)**2)/(2*sigma))/np.sqrt(2*np.pi*sigma)

#関数gはここでは入力の2乗
def g(x):
return x**2

#setting
u=2
v_p=3
sigma_u=1
sigma_p=1

v=np.linspace(0.01, 5, 500)

#vの各要素に関してその確率を求める
prob=norm_prob(v, v_p, sigma_p)*norm_prob(u, g(v), sigma_u)
prob/=np.sum(prob)
plt.plot(v, prob)
plt.show()
----------------------------------------------------------


【Exercise 2】
#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

#長さvのものは感覚器にてu=v^2として観測される
def g(v):
    return v**2

#gをphiで微分
def dgdphi(v):
    return 2*v

#Fをphiで微分
def dFdphi(v_p, sigma_p, sigma_u, phi, u):
    grad=(u-g(phi))*dgdphi(phi)/sigma_u+(v_p-phi)/sigma_p
    return grad

#setting
u=2
v_p=3
sigma_p=1
sigma_u=1
phi=v_p
delta=0.01
time=5

log=[]
log.append(phi)

for i in range(np.int(time/delta)):
    phi=phi+delta*dFdphi(v_p, sigma_p, sigma_u, phi, u)

    log.append(phi)

plt.plot(np.arange(0, len(log)*delta, delta), log)
plt.show()
----------------------------------------------------------------

【Exercise3】
#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

#setting
u=2
v_p=3
phi=[v_p,]
e_p=[0,]
e_u=[0,]
sigma_p=1
sigma_u=1
delta=0.01
time=5

def g(phi):
    return phi**2

def dgdphi(phi):
    return 2*phi

for i in range(np.int(time/delta)):
    phi.append(phi[i]+delta*(e_u[i]*dgdphi(phi[i])-e_p[i]))
    e_p.append(e_p[i]+delta*(phi[i]-v_p-sigma_p*e_p[i]))

    e_u.append(e_u[i]+delta*(u-g(phi[i])-sigma_u*e_u[i]))

x=np.arange(0, time/delta+1, 1)*delta

plt.plot(x, phi, 'b', label='phi')
plt.plot(x, e_p, 'g', label='e_p')
plt.plot(x, e_u, 'r', label='e_u')

plt.legend()

plt.show()
----------------------------------------------------------------

【Exercise4】略

【Exercise5】
#Exercise5
import numpy as np
import matplotlib.pyplot as plt

def g():
    return 5

m_phi=5
v_phi=2
learning_rate=0.01
delta=0.01
time=20
Trial=1000
sigma_i=[]
sigma_i.append(1)

for T in range(Trial):
    e_i=0
    ep_i=0
    phi_i=np.sqrt(v_phi)*np.random.randn(1)+m_phi
    sigma_temp=sigma_i[-1]
 
    for t in range(np.int(time/delta)):
        dep_i=phi_i-g()-e_i
        de_i=sigma_temp*ep_i-e_i
     
        ep_i=ep_i+dep_i*delta
        e_i=e_i+de_i*delta
 
    sigma_i.append(sigma_temp+learning_rate*(ep_i*e_i-1))

x=np.arange(0, len(sigma_i), 1)
plt.plot(x, sigma_i)
plt.show()
-----------------------------------------------------



発展的な内容に関しては紹介のみで済まされている。まあtutorialなのだから、ここをスタート地点として強くなっていかねばならんのだろう。。。

0 件のコメント:

コメントを投稿