変分ベイズに関する復習

## はじめに
[前回](https://qiita.com/kento1109/items/10026d96f2634ba36362)は、エントロピー・KL divergenceに関する基本的なことを復習しました。
今回は、変分ベイズに関する基本的なことを書いていこうと思います。

変分ベイズをまとめると、以下の通りです。
（自分なりの大まかな解釈です。）

- 今、自分たちはAについて知りたい。しかし、Aを直接知ることは困難
- なので、良く分からないAを計算せず、計算可能なBについて考える
- BをなるべくAに近づけるよう形で定義したい
- ある基づいてBをAに近づけていく
- 十分にAに近づいたBは、もはや自分たちが知りたかったAと見なせる

少しざっくりしてますが、こんな風に理解しています。

では、この内容を具体的に考えていきます。

## 目的
目的は、観測データから未知の変数を求めることです。
$y$ を観測データ、$z$を推定したい未知の変数とすると、この問題は

```math
p(z|y)
```
の事後確率分布を計算する問題となります。
これを解析的に求めるのが困難な場合に変分ベイズが活躍します。


## 準備
解析的に求めるのが困難な事後分布 $p(z|y)$ は、より簡単な分布 $q(z)$ に近似するとします。
今後、 $p(z|y)$ を直接計算することを諦めて、代わりに $q(z)$ を計算します。
しかし、 $q(z)$ がどんな分布でも良いわけではなく、可能な限り $p(z|y)$ に近づけることを目指します。
確率分布を、 $q(z)$ と $p(z|y)$ がどれだけ近い確率分布であるかは、以下の**KLダイバージェンス**式で計算できます。

```math
KL[q(z)|p(z|y)]
```

つまり、上記のKLダイバージェンスの最小化問題を解くことで、 $p(z|y)$ に近似した $q(z)$ を計算することが可能となります。

## 変分下限の導出
KLダイバージェンスの最小化問題を解くことで最適な $q(z)$ を計算出来ることが分かりました。
しかし、これを求めるためには、 $p(z|y)$ を計算する必要があります。変分ベイズは、これが解析的に計算できない場合の手法でした。つまり、KLダイバージェンスの最小化問題も同様に解析的に求めるのことは困難です。
そこで、別のアプローチを考えます。

まず、事後分布の**対数周辺尤度 $\log p(y)$** に関して変分下限を計算します。
これは、イェンセンの不等式を使って以下のように計算できます。

```math
\begin{align}
\log p(y)&=\log\left[\int p(y,z)dz\right]\\
&=\log\left[\int q(z)\frac{p(y,z)}{q(z)}dz\right]\\
&\ge\int q(z)\log\frac{p(y,z)}{q(z)}dz
\end{align}
```
これを $q(z)$ の**汎関数**として、$F[q(z)]$ とおきます。
汎関数とは、「**関数の関数（関数を引数にする関数）**」です。

ここまでで**対数周辺尤度 $\log p(y)$** はよく分かりませんが、とりあえず**変分下限 $F[q(z)]$** よりは大きくなるということがイェンセンの不等式を使って分かりました。
目的の分布である $q(z)$ は変分下限 $F[q(z)]$ の中で出現しています。
ただし、この段階では $q(z)$ をどうすべきかは不明です。

## KLダイバージェンスの導出
次に、対数周辺尤度と変分下限の差を計算してみます。

```math
\begin{align}
\log p(y)-F[q(z)]&=\int q(z)\log p(y)dz-\int q(z)\log\frac{p(y,z)}{q(z)}dz\\
&=\int q(z)\log\frac{p(y)q(z)}{p(y,z)}dz\\
&=\int q(z)\log\frac{q(z)}{p(z|y)}dz\\
&=KL[q(z)|p(z|y)]
\end{align}
```
$q(z)$ は、確率密度関数なので、以下の条件を満たします。

```math
\int q(z)dz=1
```
※式変形のため、１行目の $\log p(y)$ にこれを掛けています。

さて計算すると、この差は「**$q(z)$ と $ p(z|y)$ のKLダイバージェンス**」であることが分かりました。
「**対数周辺尤度と変分下限の差**」が求めることが難しかったKLダイバージェンスになっています。
対数周辺尤度 $\log p(y)$ は $q(z)$ と関係ないので、計算する意味はありません。
大事なのは、**変分下限**の方です。
「**対数周辺尤度=変分下限（最大値）の時、KLダイバージェンスは0（最小）**」となります。
この時の $q(z)$ が、 $ p(z|y)$ に最も近似した分布になっているということです。

絵にすると以下のイメージです。
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/204732/62f4bff8-188e-5f6d-c190-3250b6e03ea5.png">
引用元：[Variational Bayesian inference](https://kaybrodersen.github.io/talks/Brodersen_2013_03_22.pdf)

## オイラーの方程式
$q(z)$ と $ p(z|y)$ のKLダイバージェンスを最小化するためには、「汎関数（変分下限） $F[q(z)]$ を最大化」すれば良いということが分かりました。
次の関心は、「**どのように汎関数を最大化するのか**」という点です。
ここで役に立つのが、「**オイラーの方程式**」という微分方程式です。
例えば、汎関数 $F[q(x)]=\int f(x,q)dx$ の極値を与える $q$ は以下の方程式を解くことで得られることが知られています。

```math
\frac{\partial f(x,q)}{\partial q(x)}=0
```
これを利用することで解析できない積分計算を考えずに近似分布を求めることが可能となります。

## 近似分布の計算
では、オイラーの方程式の用いて汎関数の極値を求めます。
今回は、求めたい分布の隠れ変数を２つとします。
つまり、近似したい分布は、

```math
q(z)=q_1(z_1)q_2(z_2)
```
となります。（各隠れ変数は独立性を仮定します。）
※求めたい分布を隠れ変数ごとに分解した分布の積で近似させます。

まず、汎関数 $F[q_1,q_2]$ は以下のように書けます。

```math
\int\int q_1(z_1)q_2(z_2)\log\frac{p(y,z_1,z_2)}{q_1(z_1)q_2(z_2)}dz_1dz_2
```

目的の分布 $q_1(z_1), q_2(z_2)$ ですが、両方をいっぺんに求めることはできません。
各分布ごとに「オイラーの方程式」を使って最適な分布を求めていきます。
まず、$ q_1(z_1) $ を求めます。

ここで、$ q_1(z_1) $ に関係の無い $ q_2(z_2) $ を固定します。
 すると、汎関数 $F[q_1,q_2]$ は $ q_1(z_1) $ に関して次のような式となります。

```math
\begin{align}
F[q_1]&=\int f(q_1,z_1)dz_1\\
f(q_1,z_1)&=\int q_1(z_1)q_2(z_2)\log\frac{p(y,z_1,z_2)}{q_1(z_1)q_2(z_2)}dz_2
\end{align}
```
以下、オイラーの方程式で汎関数の極値を計算します。

```math
\begin{align}
\frac{\partial f(q_1,z_1)}{\partial q_1(z_1)}&=\int q_2(z_2)\log\frac{p(y,z_1,z_2)}{q_1(z_1)q_2(z_2)}dz_2=0\\
&=\int\{q_2(z_2)\log p(y,z_1,z_2)-\log q_1(z_1)-\log q_2(z_2)\}dz_2=0\\
&=\int q_2(z_2)\log p(y,z_1,z_2)dz_2-\int q_2\log q_1(z_1)dz_2-\int q_2\log q_2(z_2)dz_2=0\\
&=\int q_2(z_2)\log p(y,z_1,z_2)dz_2-\log q_1(z_1)-\log q_2(z_2)\\
\log q_1(z_1)&=\int q_2(z_2)\log p(y,z_1,z_2)dz_2-\log q_2(z_2)
\end{align}
```
右式の２項目は $ q_1(z_1) $ に関係が無いので、定数とみなすと、

```math
\begin{align}
\log q_1(z_1)&\propto\int q_2(z_2)\log p(y,z_1,z_2)dz_2\\
q_1(z_1)&\propto\exp\left[\int q_2(z_2)\log p(y,z_1,z_2)dz_2\right]
\end{align}
```
と計算できる。
同様に $ q_2(z_2) $ は下記のように計算できる。

```math
q_2(z_2)\propto\exp\left[\int q_1(z_1)\log p(y,z_1,z_2)dz_1\right]
```

ここで、確率分布のある関数に関する期待値を以下で定義します。

```math
\langle f(x)\rangle=\int f(x)p(x)dx
```

すると、 $ q_1(z_1),q_2(z_2) $ は以下のように書くことが出来ます。

```math
q_1(z_1)\propto\exp\left[\log \langle p(y,z_1,z_2)\rangle_{q_2(z_2)}\right]\\
q_2(z_2)\propto\exp\left[\log \langle p(y,z_1,z_2)\rangle_{q_1(z_1)}\right]
```

近似分布を分解した１つの分布の計算は、
「**同時確率分布に関して自分以外の近似分布で期待値を取る**」
ということが変分ベイズのポイントかと思います。

これを交互に計算することで、少しずつ真の分布に近づけます。

##さいごに
変分ベイズの仕組みが何となく分かりました。
次は、実際にこれを使った推論問題に取り組みたいと思います。

参考：

- [Variational Bayesian inference](https://kaybrodersen.github.io/talks/Brodersen_2013_03_22.pdf)
- [変分ベイズの定式化から近似事後分布の導出まで](http://www.nejicolab.com/akip/?tag=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92)
- [作って遊ぶ機械学習。（変分近似（Variational Approximation）の基本（２））](http://machine-learning.hatenablog.com/entry/2016/01/23/130017)