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 件のコメント:
コメントを投稿