3

自由エネルギーにかんするノート

1219
0

《自由エネルギー》は統計モデルを使ったデータで,モデル評価の指標として使われる推定量の一つです.実用上はStanなどを使って,MCMCサンプルからこれらの指標を計算することが多いと思います.

その際,解析的に計算した厳密値とPCで計算した値が一致するかどうか気になったことはないでしょうか?

そこで本ノートでは,《解析的に計算した(手計算で求めた)自由エネルギー》と《PCを使って計算した近似値》が一致するのかどうかを単純な例を使って調べます ^1 .以下,数式の例は渡辺(2012)を,計算コードの例は浜田・石田・清水(2019)を参照しました.

自由エネルギー

まずは定義を確認します.

確率モデルをp(x|w),事前分布をφ(w)とおき,事後分布を
p(w|xn)=1Zni=1np(xi|w)φ(w)と定義します.ここで関数Znは次の積分
Zn=i=1np(xi|w)φ(w)dwとして定義され,分配関数や周辺尤度(marginal likelihood)と呼ばれます.

ここで,周辺尤度の対数の符号を逆転させたものを,自由エネルギー(free energy)と定義し、記号Fnで表します.
Fn=logZn=logi=1np(xi|w)φ(w)dw
周辺尤度Znは,サンプルXnについての分布となっており(xnで積分すると1になる),私たちがモデルとして設定した確率分布とみなすことができます.

指数分布族の分配関数・自由エネルギー・事後分布

一般的に確率モデルは
p(x|w)=v(x)exp(f(w)g(x)),f(w),g(x)Rkという形で書けるとき指数分布族と言います(f(w)g(x)はベクトル値関数の内積).

ここでwの事前分布として
φ(w|ϕ)=1z(ϕ)exp(ϕf(w))という形の事前分布を考えます(ϕRkをハイパーパラメータなどと呼びます).この事前分布を《共役な事前分布》と言います.

事前分布をwで積分すると1になるので
z(ϕ)=exp(ϕf(w))dw です.

共役事前分布を使って,確率モデルが指数分布族である場合の分配関数を一般的に計算します.
Zn=i=1np(xi|w)φ(w)dw=i=1np(xi|w)1z(ϕ)exp(ϕf(w))dw=1z(ϕ)i=1n{v(xi)exp(f(w)g(xi))}exp(ϕf(w))dw=1z(ϕ)(i=1nv(xi))i=1nexp(f(w)g(xi))exp(ϕf(w))dw=1z(ϕ)(i=1nv(xi))i=1nexp(g(xi)f(w)+ϕf(w))dw=1z(ϕ)(i=1nv(xi))i=1nexp((g(xi)+ϕ)f(w))dw=1z(ϕ)(i=1nv(xi))exp{(ϕ+i=1ng(xi))f(w)}dw

ここで共役事前分布の仮定より ϕ^=ϕ+i=1ng(xi)とおけば

z(ϕ^)=exp(ϕ^f(w))dwz(ϕ+i=1ng(xi))=exp((ϕ+i=1ng(xi))f(w))dwです.

これを使えば分配関数は
Zn=(i=1nv(xi))z(ϕ^)z(ϕ)
です.ただしϕ^=ϕ+i=1ng(xi)です.

自由エネルギーFnは分配関数Znの対数の符号を反転した量だから
Fn=log((i=1nv(xi))z(ϕ^)z(ϕ))=i=1nlogv(xi)logz(ϕ^)z(ϕ)です. また事後分布は
p(w|xn)=1Zni=1np(xi|w)φ(w)=1Zn1z(ϕ)(i=1nv(xi))exp(ϕ^f(w))=((i=1nv(xi))z(ϕ^)z(ϕ))11z(ϕ)(i=1nv(xi))exp(ϕ^f(w))=1z(ϕ^)exp(ϕ^f(w))=φ(w|ϕ^)=φ(w|ϕ+i=1ng(xi))です.

この計算から,《指数分布族に対しては共役事前分布を定義でき,事後分布は共役事前分布と同じ関数となること》が分かります.ただし事前分布のハイパーパラメータはϕからϕ^=ϕ+i=1ng(xi)に変化します.g(xi)は確率モデルのカーネルですから,事後分布(のハイパーパラメータ)は,データを確率モデルというフィルターを介して学習した結果と見なせるでしょう.

正規分布の共役事前分布

正規分布のパラメータμの共役事前分布を作ってみましょう.正規分布の確率モデルp(x|w)
p(x|w)=Normal(x|μ,σ2)=12πσ2exp{(xμ)22σ2}=12πσ2exp{x22σ2}exp{μxσ2μ22σ2}=12πσ2exp{x22σ2}exp{(μ/σ2,μ2/2σ2)(x,1)}と書けるので,v(x)=12πσ2exp{x22σ2}f(w)=(μ/σ2,μ2/2σ2),g(x)=(x,1) とみなすと
p(x|w)=v(x)exp(f(w)g(x)) なので,確かに指数分布族です.

指数分布族の共役事前分布は
φ(w|ϕ)=1z(ϕ)exp(ϕf(w))という形で定義可能でした.
ϕ=(ϕ1,ϕ2),f(w)=(μ/σ2,μ2/2σ2)を代入すると φ(w|ϕ)=1z(ϕ)exp((ϕ1,ϕ2)(μ/σ2,μ2/2σ2))=1z(ϕ)exp(μϕ1σ2μ2ϕ22σ2)です.ここでw=(μ,σ2)σ2は定数であると見なし,φ(w|ϕ)μだけの分布と考えれば,φ(μ|ϕ)=1z(ϕ)exp(μϕ1σ2μ2ϕ22σ2)です.φ(μ|ϕ)μの分布であるためには積分して1になる必要があるので
φ(μ|ϕ)dμ=1 より
z(ϕ)=exp(μϕ1σ2μ2ϕ22σ2)dμです.
ガウス積分を使って計算すると z(ϕ)=exp(μϕ1σ2μ2ϕ22σ2)dμ=exp(ϕ22σ2(μϕ1ϕ2)2+ϕ122ϕ2σ2)dμ=exp(ϕ122ϕ2σ2)exp(ϕ22σ2(μϕ1ϕ2)2)dμ=exp(ϕ122ϕ2σ2)2πσ2/ϕ2したがってμの共役な事前分布は
φ(μ|ϕ1,ϕ2)=(exp(ϕ122ϕ2σ2)2πσ2/ϕ2)1exp(μϕ1σ2μ2ϕ22σ2)です. 一見複雑に見えますがϕ1=0,ϕ2=1を仮定すれば,
φ(μ|ϕ1,ϕ2)=φ(μ|0,1)=(exp(022σ2)2πσ2)1exp(0σ2μ22σ2)=12πσ2exp(μ22σ2)
なので,μの共役な事前分布は正規分布であることが分かります.

自由エネルギーの具体例

具体的な確率モデルと事前分布を使って,自由エネルギーを計算してみましょう.以下の例は渡辺(2012)の例をさらに簡略化したものです.

計算のための具体例.  p(x|μ,1)=Normal(x|μ,1) φ(μ)=Normal(μ|0,1)確率モデルが平均μ,分散1の正規分布で,事前分布がμが平均0,分散1の正規分布に従うと仮定します.

さきほどの計算結果から,この事前分布は共役事前分布であることが分かります.

確率モデルが指数分布族で,事前分布が共役事前分布であるとき,自由エネルギーは
Fn=i=1nlogv(xi)logz(ϕ^)z(ϕ)と書けるのでした. 仮定より,確率モデルは
Normal(x|μ,1)=12πexp{(xμ)22}なので,v(xi)=12πexp{xi22}です.
z(ϕ)=exp(ϕ122ϕ2σ2)2πσ2/ϕ2なので,ϕ1=0,ϕ2=1およびσ2=1を代入すると
z(ϕ)=2πσ2=2π です. またϕ^=ϕ+i=1ng(xi)と定義していたのでベクトルで書けば,
ϕ^=ϕ+i=1ng(xi)(ϕ1^,ϕ2^)=(ϕ1,ϕ2)+(i=1nxi,i=1n1)なので
ϕ1^=ϕ1+i=1nxi,ϕ2^=ϕ2+i=1n1=ϕ2+nとなり z(ϕ^)=exp((ϕ1+i=1nxi)22(ϕ2+n))2π/(ϕ2+n)=exp((i=1nxi)22(1+n))2π/(n+1)です.
ゆえに仮定のもとで,自由エネルギーは Fn=i=1nlogv(xi)logz(ϕ^)z(ϕ)=i=1nlog(12πexp{xi22})log(exp((i=1nxi)22(1+n))2π/(n+1)2π)=i=1n(xi22log2π)exp((i=1nxi)22(1+n))+logn+1です.

かなりシンプルな仮定から出発したおかげで,自由エネルギーを陽表的な関数として示すことができました.ここから,モデルが複雑になると,解析的な計算が困難であることは容易に想像できるでしょう.そのため実用上はMCMCサンプルを用いた近似計算がよく使われます.

パラメータリカバリ

真の分布が確率モデルに対して正則であり,事後分布が正規分布に近似できる場合,積分のラプラス近似の手法を用いて,自由エネルギーを近似的に求められます.それが,BIC(Bayesian Information Criterion)であり,最尤推定から得られる最大対数尤度を用いた単純な式として,BIC=i=1nlogp(xi|w^ML)+d2lognと定義されます.ただし,dはモデルのパラメータ数です.このとき,Eq(Xn)[BIC]=Eq(Xn)[Fn]+O(1).が成立します.つまり,サンプルサイズに依存しない1のオーダーの差はあるものの,BICは平均的に自由エネルギーによく近似します.

正則でないモデルにおいても,自由エネルギーの近似値を導出できるのがWBIC(Widely Applicable Bayesian Information Criterion)です.

これは,経験対数損失 Ln(w)=1ni=1nlogp(xi|w)n倍について,逆温度がβ=1/lognのときの事後分布によって期待値をとったものとして定義されます.つまり,WBIC=nLn(w)[i=1np(xi|w)βφ(w)i=1np(xi|w)βφ(w)dw]dwです.このとき, Eq(Xn)[WBIC]=Eq(Xn)[Fn]+O(log(logn)).が成立します.log(logn)のオーダーの差は残りますが,WBICは平均的に自由エネルギーに近似します.

そのほか,MCMCサンプルから自由エネルギーを推定する手法としてブリッジ・サンプリング(bridge sampling)があります.

うえで計算した自由エネルギーの厳密値と,WBICやブリッジサンプリングからの計算が一致するかどうかを確認してみましょう.

以下のようなデータを使い,データを生成する未知の分布を確率モデルで推測します.「未知」と言いつつ,ここでは《正解》が分かっているデータをRで作成します.

      n = 500
y <- rnorm(n)
data1 <- list(y=y,n=n)
    

確率モデルと事前分布は
y[i]Normal(μ,1)i=1,2,,nμNormal(0,1)
です.パラメータの事後分布をMCMCで計算するためのStanコード(fe.stan)は,以下の通りです.

      data{
int n;// no. of respondents real y[n];//
}

parameters {
real mu;
}

model {
target += normal_lpdf(mu|0,1);
target += normal_lpdf(y|mu,1);
}
    

後でブリッジサンプリングを使うために,target記法で書いている点に注意してください.つぎにWBICをMCMCサンプルから計算するためのコード(wbic.stan)です.

      data{
int n;// no. of respondents real y[n];//
}

parameters {
real mu;
}

model {
target += normal_lpdf(mu|0,1);
target += (1/log(n))*normal_lpdf(y|mu,1);
}

generated quantities{
vector[n] log_lik;
for(i in 1:n){
log_lik[i] = normal_lpdf(y[i]|mu,1);
}
    }
    

WBICは逆温度β1/lognであるときの事後分布を使った経験対数損失(のn倍)の平均値なので,確率モデルを1/logn倍しています.

以上のStanコードを次のようなRコードで実行します.

      library(rstan)
library(bridgesampling)

# define WBIC function 
WBIC.mcmc<-function(x){-mean(rowSums(x))}

############################################################
# compile and sampling
############################################################
model <- stan_model(file='model/fe.stan')
fit <- sampling(model,data=data1,iter = 10500, warmup =500, seed=1234,chains = 5)
bs<-bridge_sampler(fit,method="warp3")
-logml(bs)

model.wbic <- stan_model(file='model/wbic.stan')
fit.wbic <- sampling(model.wbic,data=data1,iter = 5500, warmup =500, seed=1234,chains = 3)
WBIC.mcmc(rstan::extract(fit.wbic)$log_lik)
    

計算した結果です.

      # ブリッジサンプリングから計算した自由エネルギー
# [1] 706.8302, n=500 MCMCsample=40000
# [1] 706.8301, n=500 MCMCsample=50000
# MCMCサンプルから計算したWBIC
# 706.7799, n=500
    

そして最後に解析的に解いた自由エネルギーにデータをあてはめて計算します(ここが今回のノートのハイライトです).

      a1 <- -sum(log(1/sqrt(2*pi)*exp(-y^2/2)))
nume <- sqrt((2*pi)/(n+1))*exp((sum(y^2))/(2*(n+1)))
a2 <- -log(nume/sqrt(2*pi))
a1+a2
# [1]   707.0134  自由エネルギーの厳密値
    

ほぼ一致しました.ちょびっとズレていますが誤差の範囲でしょう.これで安心してブリッジサンプリングやWBICが使えますね.

文献
  • 浜田宏・石田淳・清水裕士, 2019, 『社会科学のためのベイズ統計モデリング』朝倉書店.
  • 渡辺澄夫, 2012, 『ベイズ統計の理論と方法』コロナ社.
投稿日:2020119
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. 自由エネルギー
  2. 指数分布族の分配関数・自由エネルギー・事後分布
  3. 正規分布の共役事前分布
  4. 自由エネルギーの具体例
  5. パラメータリカバリ