ベイズファクター

本記事ではベイジアンモデルに対するモデル評価の指標であるベイズファクターについて理論を整理します。

まず、情報量について、エントロピーを踏まえながら理解します。次に、情報量から自由エネルギーを定義し、これが周辺尤度とも深く関連することを理解します。以上の理論的な準備を踏まえ、ベイズファクターを定義します。

後半では、具体的な確率分布を用いた計算を例に自由エネルギーやベイズファクターを計算し、それらを用いたモデル評価の性質をシミュレーションで確認します。

参考にした本はこちらです。モデル評価の指標について分かりやすい説明が並んでいます。この本によれば、モデル評価の指標は自由エネルギーに着目したもの(BIC、WBIC、ベイズファクター)と、汎化誤差に着目したもの(AIC、WAIC)に二分されるようですが、本記事ではそのうち前者の方の、ベイズファクターのみに着目して考えます。

情報量

確率がからむある試行について考えたとき、その試行の結果得られた事象が持っている情報の多さはどのくらいなのか?

事象のもつ情報の多さ、すなわち情報量を定量的に表現するための関数fの条件について考えます。

連続型の確率変数X及びその実現値xについて、情報量はP(x)に依存すると考えられることから、まず関数fP(x)を変数にとることとします。

次に、情報量をあらわすf(P(x))について望ましい性質として、以下が考えられます。

(1)P(xi)P(xj)f(P(xi))f(P(xj)) (2)f(P(xi)P(xj))=f(P(xi))f(P(xj)) (3)f(P(xi)=1)=0

(1)式は、事象が起きる確率が低い程、その事象が持つ驚きの強さ(情報量)が大きくなるような条件です。
(2)式は、2つの事象を1回の試行で同時に得るようなときと、それらの事象を2回の試行で一つひとつ得るようなときの情報量が同じになることを意味する条件です。
(3)式は、ある事象が起きる確率が1のとき、情報量が0であることを意味する条件です。

これらの条件を満たす関数として、以下の情報量が導出されます。

◆情報量 連続型の確率変数Xから実現値xが得られたときの情報量は、以下で定義される。 (4)I(X=x)=logP(X=x) 


◆情報量の証明 xRについて微分可能な関数f(x)について、条件(2)より、 f(x(1+δ))=f(x+xδ)=f(x)+f(1+δ) 二つ目の等号より、 f(x+xδ)f(x)xδ=f(1+δ)xδ 左辺は導関数の定義であるから、 f(x)=K1x ただし、K=f(1+δ)δ。 上式を積分して、 f(x)=Klogx+C ここで、条件(1)より、Kは任意の負の実数である。 また条件(3)より、C=1。 よって、K=1とすることにより(4)式が導かれる。

エントロピー

エントロピーは、前節で定義した情報量の期待値です。そのため平均情報量とも呼ばれます。

◆エントロピー

AR上で定義された確率密度関数f(x)をもつ連続型の確率変数xエントロピーH(X)を情報量の期待値として下記のとおり定義する。 (5)H(X)=Af(x)logf(x)dx

同様に、確率質量関数g(x)をもつ離散型の確率変数XのエントロピーH(X)を以下の通り定義する。 (6)H(X)=i=1ng(xi)logg(xi)

エントロピーは、情報量の期待値ですから、確率分布の分散が大きいような、不確実性の大きな条件下でより大きな値を取ることが想定されます。これをガンマ分布を例に確認してみましょう。

shapeパラメータa、rateパラメータbをもつガンマ分布

(7)Gamma(λ|α,β)=βαΓ(α)λα1eβx

の形状は、下図ようになっています。ここで、λR+,αR+,βR+です。

1つ目の図はrateパラメータ固定、shapeパラメータを変化させたときのガンマ分布の形状を示しています。また2つ目の図はshapeパラメータ固定、rateパラメータを変化させたときのガンマ分布の形状を示しています。

これらの図から、shapeパラメータが大きくなるほどまたrateパラメータが小さくなるほど分散は大きくなりそうだと確認できます。実際、以前の記事で確認した通り、ガンマ分布の分散はαβ2です。

では、同様に片方のパラメータを固定したままもう片方のパラメータを変化させたとき、エントロピーはどのように変化するでしょうか。

それを確認するため、まずガンマ分布のパラメータを変数としてエントロピーを計算します。


◆ガンマ分布のエントロピー shapeパラメータα、rateパラメータβのガンマ分布に従う確率変数λのエントロピーは、 H(λ)=E[logλ]=E[αlogβlogΓ(α)+(α1)logλβλ]=αlogβ+logΓ(α)+(1α)E[logλ]+βE[λ] ここで、E[λ]=αβE[logλ]=ψ(α)logβを用いて、 H(λ)=αlogβ+logΓ(α)+(1α)(ψ(α)logβ)+β(αβ)=logΓ(α)+(1α)ψ(α)logβ+α ただし、ψ(x)はディガンマ関数であり、ガンマ関数を対数微分したもの。

これを用いてガンマ分布のエントロピーを図示したものが、以下になります。

一つ目の図から、ガンマ分布のエントロピーは、shapeパラメータが大きく、すなわち、分散が大きくなるにつれてエントロピーが増大していることが確認できます。
一方、二つ目の図からは、rateパラメータが小さく、すなわち分散が大きくなるにつれてエントロピーが増大していることが確認できます。

以上、分布のばらつきが大きくなるほどエントロピーが大きくなる例を確認しました。エントロピーを通して、情報量が何をはかろうとしているのかイメージしてもらえるかなと思います。

ベイズ自由エネルギー

(逆温度β=1の)ベイズ自由エネルギーは、はじめに述べた情報量について、複数の確率変数Xn=(X1,X2,,Xn)の同時確率分布の場合の拡張について考え、さらにパラメータの事前分布を想定し、パラメータを周辺化消去したものになります。

◆ベイズ自由エネルギー 確率変数Xn=(X1,X2,,Xn)とそれらの同時確率分布f(xn)が与えられたとき、ベイズ自由エネルギーFnは以下のとおり定義される。 (8)Fn=logf(xn)=logSf(xn|θ)φ(θ)dθ ここでθSRで定義されるパラメータ、φ(θ)はパラメータの事前分布、xn=(x1,x2,,xn)Xnの実現値である。

特に、Xnが独立同分布(i.i.d)であるとき、その確率関数をg(x)とすると、(8)式は

(9)Fn=logi=1ng(xi|θ)φ(θ)dθ

となります。

これまで見てきた内容を踏まえると、ベイズ自由エネルギーは、確率変数の実現値(複数)がどれくらい驚きが大きい値かを示す指標であることから、その値が小さいほど、想定したモデルがデータをうまく説明できることを意味していると理解できます。

周辺尤度

実は、(9)式は、ベイズに触れたことのある人ならばまず一回は触れたことのある関数とも関連しています。その関数とは、ベイズの定理における正規化定数、すなわち周辺尤度です。

◆事後分布と周辺尤度 標本空間ARで定義される確率変数Xnに関する確率モデルp(xn|θ)と、SRで定義されるパラメータθの事前分布φ(θ)を考えたとき、パラメータの事後分布p(θ|xn)は下記で定義される。 (10)p(θ|xn)=p(xn|θ)φ(θ)Zn Znは正規化(Sp(θ|xn)dθ=1を確約すること)の為の定数であり、周辺尤度という。 (11)Zn=Sp(xn|θ)φ(θ)dθ

特に、xn=(x1,,xn)が独立同分布(i.i.d)の確率変数からの実現値であるとき、その確率関数をf(x)とすると、

(12)p(θ|xn)= i=1nf(xi|θ)φ(θ)Zn

(12)式が成り立つとき、

(13)Zn=Si=1nf(xi|θ)φ(θ)dθ

Znはパラメータの事後分布の正規化定数であると同時に、確率変数Xnの同時確率密度になっています。

(13)AAZndx1dxn=AASi=1nf(xi|θ)φ(θ)dθdx1dxn=Sφ(θ)dθi=1nAf(xi|θ)dxi=1

よって、Znは実現値xnが得られる同時確率のθに関する周辺分布(θについて周辺化した後の分布)であり、0から1の値をとります。つまりZnは確率モデルp(xn|θ)と事前分布φ(θ)でデータをうまく説明できているかの指標になります。

(9)式と(12)式を比較すると、自由エネルギーと周辺尤度の関係が見えてきます。

◆自由エネルギーと周辺尤度の関係 自由エネルギーFnと周辺尤度Znは以下の関係にある。 (13)Fn=logZn

情報量から導かれた自由エネルギーFnは結局のところXnの同時確率の対数符号反転になることが分かります。

ベイズファクター

ベイズファクターは、2つのモデルを考えたとき、どちらの方が優勢かをはかる指標となります。

◆ベイズファクター 2つの異なるモデルM0M1を考えたとき、ベイズファクターBF10は2つの異なるモデルの周辺尤度の比として定義される。 (14)BF10=p(xn|M1)p(xn|M0) ここで、p(xn|M)はモデルMにおける周辺尤度である。また(14)式を変形することで、自由エネルギーを用いても定義される。 (15)BF10=exp(FM0FM1) ここで、FMはモデルMにおける自由エネルギーである。

定義より、BF10はモデルM0に比べてモデルM1がどの程度うまくデータを説明できているかを表しており、1より大きい値をとるにつれてM1の方が優勢になっていくことが分かります。

ベイズファクターの評価基準には以下のよく知られたものがあります。

Jeffreys(1961)

BFij Mjに反する証拠の強さ
13.2 あまりあるとは言えない(Not worth than a bare mention)
3.210 十分ある(Substantial)
10100 強くある(Strong)
>100 決定的にある(Decisive)

Kass and Raftery(1995)

BFij Mjに反する証拠の強さ
13 あまりあるとは言えない(Not worth than a bare mention)
320 肯定的である(Positive)
20150 強くある(Strong)
>150 決定的にある(Very strong)

ベイズファクターを計算する

ベイズファクターの計算は解析的には困難な場合が多いですが、共役事前分布を用いて解析的に計算できる場合もあります。

memo

共役事前分布とは、事前分布と尤度関数を設定したとき、尤度関数のパラメーターの事後分布が事前分布と同じ関数系になるような事前分布のことである。

以下では、AR+で定義される独立同分布のn個の連続型確率変数Xn=(X1,,Xn)からの実現値xn=(x1,,xn)をもとに、確率変数Xnの分布を推定することを考えます。候補モデルには事後分布を解析的に計算可能なモデルを2つ用意し、どちらのモデルが優勢かをベイズファクターによって判断することを考えます。

モデル1は上述の共役事前分布による事後分布の解析的計算が可能なモデルです。尤度関数には指数分布を設定し、事前分布にはガンマ分布を用いました。

◆モデル1 (16)xiExponential(γ)    i=1,,n (17)γGamma(α,β)

◆指数分布の共役事前分布がガンマ分布であることの証明 尤度関数をパラメータγの指数分布 p(xn|γ)=i=in(γexp(γxi)) パラメータγの事前分布をshapeパラメータα、rateパラメータβのガンマ分布 p(γ)=βαΓ(α)γα1eβγ とするとき、パラメータγの事後分布は、以下の通りガンマ分布である。 p(γ|xn)p(xn|γ)p(γ)=i=in(γexp(γxi))βαΓ(α)γα1eβγ=γnexp(γi=1nxi)βαΓ(α)γα1eβγ=βαΓ(α)γn+α1exp((β+i=1nxi)γ)βn+αΓ(n+α)γn+α1exp((β+i=1nxi)γ)=Gamma(n+α,β+i=1nxi)

モデル2は、モデル1と同様、尤度関数に指数分布を設定します。一方、事前分布については設定しないこととします。

◆モデル2 (18)xiExponemtial(γ)    i=1,,n

ベイズファクターは周辺尤度または自由エネルギーのモデル間比較を行うので、次に上記2モデルの周辺尤度・自由エネルギーを計算します。

モデル1の周辺尤度p(xn|M1)は、

p(xn|M1)=0p(xn|γ)φ(γ)dγ=0Exponential(xn|γ)Gamma(γ|α,β)dγ=0i=in(γexp(γxi))βαΓ(α)γα1eβγdγ=βαΓ(α)0γn+α1exp(γ(β+i=1nxi))dγ=βαΓ(α)0(γβ+i=1nxi)(n+α1)eγ1β+i=1nxidγ     ((β+i=1nxi)γ=γ)=βαΓ(α)(β+i=1nxi)n+α0γ(n+α1)eγdγ=βαΓ(n+α)Γ(α)(β+i=1nxi)n+α     ()=βαn!(β+i=1nxi)n+α     (Γ(s+1)=sΓ(s))

自由エネルギーFM1は、

(19)FM1=log(p(xn|M1))=αlogβi=1ni+(n+α)log(β+i=1nxi)

同様に、モデル2の周辺尤度p(xn|M2)と自由エネルギーFM2を求めます。

ここで、モデル2についてはパラメーターに事前分布を設定していないので、周辺尤度の計算の際にパラメータで周辺化する必要がありません。よって、

p(xn|M2)=Exponential(xn|γ)=i=1nγexp(xiγ)=γnexp(i=1nxiγ) (20)FM2=log(p(xn|M2))=nlogγ+i=1nxiγ

では、上記(19)(20)式を用いて一つの観測値を例にベイズファクターを計算しましょう。

いま、独立同分布の確率変数の組X5から実現地xn=(0.198,0.561,0.572,0.094,0.213)が得られたとします。このとき、α=3β=1としたときのモデル1と、γ=3としたときのモデル2のどちらがよいモデルであるのかを自由エネルギーを用いて比較します。

このときのモデル1の自由エネルギーは、

FM1=3log1i=15i+(5+3)log(1+i=15xi)=2.972677

モデル2の自由エネルギーは、

FM2=nlogγ+i=1nxiγ=5log3+3i=15xi=4.914

よって、パラメータに事前分布を設定したモデル1の方がデータをよく説明出来ていることが分かります。また、ベイズファクターを求めると

exp(FM2FM1)=6.967966

となることから、モデル1の方がやや優勢であると判断することができます。

ベイズファクターの性質を確認する

もうすこし掘り下げて、参考文献を参考に、設定したモデルに対しどのようなデータが得られた時に自由エネルギーの値が大きく(小さく)なるのか見ていきます。ここでは、前節と同じ例を用いて、Xnに真の分布を設定し、モデル1(α=3,β=1)、モデル2(γ=3)の比較を行います。

まず、実現値の数をn=30とし、真の分布を

X30Exponential(8)

としたとき。実現値の組を1000回発生させ、FM1FM2をそれぞれ1000回計算し、結果を要約したものが以下になります。

モデル1の方が自由エネルギーがが小さい傾向にあります。
解釈としては、事前分布を設定しない単純なモデルであるモデル2は、γ=3と真のモデルとパラメータがやや異なっているので、当てはまりが比較的悪いのに対し、事前分布を設定したより複雑なモデルであるモデル1は、モデル2に比較しより広い範囲の実現値をカバーできるため、ということになります。

一方、実現値をモデル2のパラメータ3に合わせた場合、結果は以下のように変わってきます。

X30Exponential(3)

今度はモデル2方が自由エネルギーが小さくなりました。このことから、自由エネルギーは、モデルを複雑にすれば小さくなりやすいというわけではなく、データの当てはまりが良い場合については、より単純なモデルほど小さくなる傾向にあることがわかります。

この傾向を再確認するため、実現値の数をn=1とし、実現値を0.1から3まで与えたときの2つのモデルの自由エネルギーを確認したところ、以下のような結果になりました。

単純なモデルであるモデル2が想定している値である0.1から0.8あたりまでが得られた場合、モデル2の自由エネルギーの方が小さくなり、それ以外の範囲では複雑なモデルであるモデル1の方が自由エネルギーが小さくなることが分かります。このことから、自由エネルギー(ベイズファクター)を用いたモデル評価では過学習(データにフィットするようむやみにモデルを複雑にし過ぎること)を抑えることができると言えます。またこの例からも分かるように、自由エネルギーがパラメーターに対し周辺化した値であることから、自由エネルギー(ベイズファクター)を用いたモデル評価では事前分布が大きく影響する、ということが分かります。

おわりに

以上、ベイズファクターについてみていきました。

ベイズファクターはパラメータに対し周辺化した尤度である周辺尤度に基づいて計算されますが、モデルの設定によってはこの計算が解析的に行えない場合があります。この場合、MCMCの結果からWBICを計算したり、ブリッジ・サンプリングを行うことで近似的に周辺尤度を計算する方法が提案されているようです。今後勉強し、まとめていこうと思っています。

また別の始点(汎化誤差)に着目したモデル評価の指標であるWAIC等についても、もう一度整理し投稿したいと思っています。

最後に、関数形の確認やシミュレーションの為に用いたRコードを載せておきます。


library(tidyverse)
library(ggplot2)

# ガンマ分布の形状を確認 -------------------------------------------------------------

#形状パラメータaを動かしたときのガンマ分布の確率密度

alpha <- seq(.5, 100, by=5)
p <- ggplot(data.frame(X=c(0, 40)), aes(x=X)) + theme_bw(base_size=11)+
  mapply(
    function(alpha,beta,co) geom_line(data=data.frame(X=x <- seq(0.1,40,0.05), Y=dgamma(x,shape=alpha,rate=beta)), aes(x=X,y=Y, color=co)),
    alpha,4,alpha) +
  coord_cartesian(ylim=c(0,0.75)) + labs(color="α", x="λ",y="Gamma(λ | α,β=4)")
p

#rateパラメータbを動かしたときのガンマ分布の確率密度

beta <- seq(.5, 10, by=.5)
p <- ggplot(data.frame(X=c(0, 40)), aes(x=X)) + theme_bw(base_size=11)+
  mapply(
    function(alpha,beta,co) geom_line(data=data.frame(X=x <- seq(0.1,6,0.01), Y=dgamma(x,shape=alpha,rate=beta)), aes(x=X,y=Y, color=co)),
    4,beta,beta) + labs(color="β", x="λ",y="Gamma(λ | α=4,β)")
p

# ガンマ分布のエントロピーを確認 -------------------------------------------------------------

H_gamma <- function(a, b){
  return(lgamma(a) + (1-a) * digamma(a) - log(b) + a)
}

# 形状パラメータaを動かしたとき

p <- ggplot() + geom_path(data=data.frame(X=x <- seq(0.1,100,0.1), Y=H_gamma(x,1)), aes(x=X,y=Y))

p <- ggplot() + theme_light(base_size=11) + mapply(
  function(beta,co) geom_path(data=data.frame(X=x <- seq(0.1,50,0.1), Y=H_gamma(x,beta)), aes(x=X,y=Y, color=co)),
  seq(0.01,10,len=20), seq(0.01,10,len=20)
  ) + labs(color="β", x="α",y="H(Gamma(α,β))")
p

#rateパラメータbを動かしたときのガンマ分布のエントロピー

p <- ggplot() + theme_light(base_size=11) + mapply(
  function(alpha,co) geom_path(data=data.frame(X=x <- seq(0.1,50,0.1), Y=H_gamma(alpha,x)), aes(x=X,y=Y, color=co)),
  seq(0.1,10,len=20), seq(0.1,10,len=20)
) + labs(color="α", x="β",y="H(Gamma(α,β))")
p

# ベイズファクターの計算 -------------------------------------------------------------

x <- round(rexp(5, 3),3)
x <- 0.01

F_model1 <- function(X,alpha,beta){
  return(-alpha*log(beta) -sum(log(seq(1, length(X)))) + (length(X) + alpha) * log(beta + sum(X)) )
}

F_model2 <- function(X, gamma){
  return( -length(X) * log(beta) + sum(X) * gamma )
}

gamma <- 3
alpha <- 3
beta <- 1


#計算結果
exp(-F_model1(X=x, alpha=alpha, beta=beta)
 + F_model2(X=x, gamma=gamma))

# lineplot ---------------------------------------------------------------

F_model1_p <- function(X,alpha,beta){
  return(-alpha*log(beta) + (1 + alpha) * log(beta + X) )
}

F_model2_p <- function(X, gamma){
  return( -1 * log(beta) + X * gamma )
}

p <- ggplot() + theme_light(base_size=11) + mapply(
    function(gamma) geom_line(data=data.frame(X=x2 <- seq(0.1,3,0.01), Y=F_model2_p(x2,gamma)), aes(x=X,y=Y,lty="model2")),
    gamma
  ) + mapply(
    function(alpha,beta) geom_line(data=data.frame(X=x2 <- seq(0.1,3,0.01), Y=F_model1_p(x2,alpha,beta)), aes(x=X,y=Y,lty="model1")),
    alpha,beta
  ) + labs(x="x",y="Free Energy")
p

# boxplot -----------------------------------------------------------------

n <- 30 #sample size

gamma_prime <- 1
set.seed(123)
m1 <- c()
m2 <- c()
for(i in 1:1000){
  x <- rexp(n,gamma_prime)
  m2[i] <- sum(-dexp(x,3,log=T))
  m1[i] <- F_model1(x,alpha=alpha,beta=beta)
}
mean(m1)
mean(m2)

plot_title <- ggtitle("Comparison of free energy",
                      sprintf("Real param = %.0f",gamma_prime))

p <- data_frame(M1=m1,M2=m2) %>%
  gather(key = "x",value = "y") %>%
  ggplot() +
  geom_boxplot(aes(x,y),lwd=0.5,outlier.shape = 21, outlier.size = 0.5) +
  theme_light() + xlab("") + ylab("") +
  theme(legend.text=element_text(size=4),
        legend.title=element_text(size=8,face="bold"),  
        axis.text=element_text(size=6),
        axis.title=element_text(size=8,face="bold"),
        strip.text.x = element_text(size=6,face="bold"),
        legend.position = "right") + plot_title
p

コメントを書く


※ コメントは承認されると表示されます

承認されたコメント一覧