本文書のソースファイル,実行形式の google colab ファイル は, https://github.com/ShinAsakawa/ShinAsakawa.github.io/blob/master/2020gajumarutugaru/2020_0415Friston_in_detail.ipynb にあります
import numpy as np
import scipy
import matplotlib.pyplot as plt
%matplotlib inline
上式で マイナスが付いている理由は 確率変数の値域は $[0,1]$ であるため,その対数変換した値は $\log(x)\le0$ となるからです。 負になると直感的に意味が取り難いので正の値にするために付加されます。 そもそも確率変数 $x$ の期待値とは変数が離散的であれ連続的であれ次式で与えられます:
$$ E[X] = \sum_i x_i p(x_i), \hspace{2em} \left(= \int x f(x)\;dx\right) $$plt.figure(figsize=(6,8))
x = np.linspace(0.01,1)
plt.plot(x, np.log(x), 'r', label="log(x)")
plt.plot(x, -np.log(x), 'g', label="-log(x)")
plt.legend()
$p(X_i)$ でも $f(x)$ でも確率(密度関数)を表すと考えればエントロピーとは確率密度関数の対数の期待値,すなわち (1) 式で 確率密度関数を対数変換した 量であることが分かります。
文献によっては KL ダイバージェンスを上式いずれかで定義していています。エントロピーの定義式
復習を兼ねてフリストンの自由エネルギー原理の概略を以下に再掲します。
上図 B に出てくる式の説明ですが, $$ F=-\left<\ln p(\tilde{s},\vartheta\vert m)\right>_q + \left<\ln q(\vartheta\vert\mu)\right>_q $$ において,左辺第一項 すなわち $$ \left<\ln p(\tilde{s},\vartheta\vert m)\right>_q $$ は,エントロピーの定義式です。$\left<\right>$ は物理学でいう アンサンブル平均 ですので,次のように **も** 書くことができます。 $$ -\int p(\tilde{s},\vartheta\vert m) \log(p\tilde{s},\vartheta\vert m)\;dp $$ 同様に 左辺第2項は以下のように書くことができます $$ -\int q(\vartheta\vert\mu)\log q(\vartheta\vert\mu)\;dq $$ ただし $\log$ と $\ln$ を敢えて混同して用いています。
一方で 予測誤差を最小化する行動 に出てくる式 $D$ がカルバック=ライブラーダイバージェンスです。 従って,以下のように書き換えることが可能です。 $$ F= -\int q(\vartheta\vert\mu)\log\left[\frac{q(\vartheta\vert\mu}{p(\vartheta)}\right]\;dq $$ 上式は,上位層からみた,下位層の信号の推論になっています。
import scipy.stats as stats
M = 200
N = 100
x = np.linspace(0, M, M+1 >> 1)
mean1 = 150; mean2 = 50
var = 16.
plt.figure(figsize=(18,6))
p = 0.5 * N * stats.norm.pdf(x, mean1, var) + 0.5 * N * stats.norm.pdf(x, mean2, var)
plt.plot(x, p, label='p(z|x)')
plt.bar(x, p)
plt.legend()
plt.show()
plt.figure(figsize=(18,6))
var = 25
q = N * stats.norm.pdf(x, (mean1 + mean2)/2, var)
plt.plot(x, q, 'r', label='q(z)')
plt.bar(x, q)
plt.legend()
plt.show()
plt.figure(figsize=(18,6))
p = 0.5 * N * stats.norm.pdf(x, mean1, var) + 0.5 * N * stats.norm.pdf(x, mean2, var)
plt.plot(x, p, label='p(z|x)')
plt.bar(x, p)
var = 36
q = 0.5 * N * stats.norm.pdf(x, (mean1+mean2)/2, var)
plt.plot(x, q, 'r', label='q(z)')
plt.bar(x, q)
plt.legend()
plt.show()
#plt.plot(x, N * stats.norm.pdf(x, mean2, var)) #
#plt.savefig('jdla_gtest_ideal.png')
import scipy.stats as stats
M = 200 # 問題数
N = 100
x = np.linspace(0, M, M+1 >> 1) # 設問数を 1 問刻みに x 軸とする
plt.figure(figsize=(18,6))
var = 25
q = N * stats.norm.pdf(x, (mean1 + mean2)/2, var)
plt.plot(x, q, 'r', label='q(z)') # , fillstyle='full')
plt.bar(x, q)
plt.legend()
plt.show()
mean1 = 150; mean2 = 50
var = 16.
plt.figure(figsize=(18,6))
p = 0.6 * N * stats.norm.pdf(x, mean1, var) + 0.4 * N * stats.norm.pdf(x, mean2, var)
plt.plot(x, p, label='p(z|x)') # , fillstyle='left')
plt.bar(x, p)
plt.legend()
plt.show()
plt.figure(figsize=(18,6))
p = 0.6 * N * stats.norm.pdf(x, mean1, var) + 0.4* N * stats.norm.pdf(x, mean2, var)
plt.plot(x, p, label='p(z|x)')
plt.bar(x, p)
q = 0.5 * N * stats.norm.pdf(x, mean1, 1.2 * var)
plt.plot(x, q, 'r', label='q(z)')
plt.bar(x, q)
plt.legend()
plt.show()
#plt.plot(x, N * stats.norm.pdf(x, mean2, var)) #
#plt.savefig('jdla_gtest_ideal.png')
以上長々とお付き合いいただきまして,ありとうございます。 フリストンの自由エネルギー原理の説明に基づいて ASD の社会的刺激の認知過程,感覚入力の推論と上位層からの感覚入力の生成モデルとを KL ダイバージェンスの 2 つ,前向き KL ダイバージェンス と 逆向き KL ダイバージェンス として説明して見ました。
ご批判,ご意見などお寄せいただければ嬉しゅうございます。