ELBO（変分下限）を最大化するという意味をゼロから理解する（尤度、最尤推定）


いろいろと調べた備忘録です。


# はじめに

VAEや拡散モデルでパラメータを更新する際、対数尤度の最大化の代わりにその下限であるELBOを最大化します。
みたいな文章があるかと思います。
今まではふーんそうなんだ程度で流していましたがちゃんと理解するために調べてみました。
この記事はこの文章を理解する事がゴールです。


# 1. 対数尤度の最大化とは？
## 1-1. 尤度

まずは尤度からで、読み方は「ゆうど」と読みます。（英語だと likelihood です）
定義は以下です。

・確率：ある事象が起こる頻度
・尤度：想定している確率分布に対してある事象が起こった場合の確率

確率は事象自体に注目しますが、尤度は逆で、ある想定している前提に対して実際に起こった結果がどのぐらい妥当か（もっともらしいか）を見るイメージです。

具体例で見てみます。
表が出る確率が50%のコインがあり5回投げて「表表表表裏」と出ました。
この場合の尤度を求めてみます。
計算自体は確率を計算する場合と同じです。

$$
\frac{1}{2} \times \frac{1}{2} \times \frac{1}{2} \times \frac{1}{2} \times \frac{1}{2} \approx 0.031
$$

コインの例だと各事象は独立しているので掛けるだけですね。

## 1-2. 尤度の最大化

上記コインの例ですが、表が出る確率を変えると尤度が変わります。
この時、尤度が最大となる確率を見てみます。

``` math
\begin{aligned}
\frac{6}{10} \times \frac{6}{10} \times \frac{6}{10} \times \frac{6}{10} \times \frac{4}{10} \approx 0.052 \quad \text{(表60%)} \\
\frac{7}{10} \times \frac{7}{10} \times \frac{7}{10} \times \frac{7}{10} \times \frac{3}{10} \approx 0.072 \quad \text{(表70%)} \\
\frac{8}{10} \times \frac{8}{10} \times \frac{8}{10} \times \frac{8}{10} \times \frac{2}{10} \approx 0.082 \quad \text{(表80%)} \\
\frac{9}{10} \times \frac{9}{10} \times \frac{9}{10} \times \frac{9}{10} \times \frac{1}{10} \approx 0.066 \quad \text{(表90%)} \\
\end{aligned}
```

コインの例では、表が80%の確率で尤度が最大となりました。

:::note info
この解釈の1つですが、もしイカサマコインを疑っていた場合、このコインは80%の確率で表がでると言えます。
（ただしこの5回の結果だけで判断しているので試行回数を増やせば変わってきます）
:::

ここで最大の尤度を最尤推定量といい、最尤推定量を見つける手法の一つに最尤推定（最尤法）があります。

## 1-3. 最尤推定
あるパラメータ $\theta$ を持った確率分布 $P(x|\theta)$ において、事象 $x_1,x_2,...,x_n$ を得た場合の尤度関数は以下です。
（ただしコインのように各事象が独立している場合に限る）

``` math
\begin{aligned}
L(x_1,x_2,...,x_n|\theta) &= P(x_1|\theta) \times P(x_2|\theta) \times ... \times P(x_n|\theta) \\
&= \prod_{i=1}^{n} P(x_i|\theta)
\end{aligned}
```

コインの例だと以下のように対応します。

|記号|説明|例|
|---|---|---|
|$x$|事象|表 or 裏|
|$\theta$|（思っている）表が出る確率|80%|
|$P(x\|\theta)$|実際の確率|$P(裏\|80％)=0.2$|
|$L(x_1,x_2,...,x_n\|\theta)$|尤度|$L(表表表表裏\|80％)\approx 0.082$|

数式はコインの例を一般化しただけで、各事象の確率を掛けているだけとなります。
この尤度関数が最大となるパラメータ $\theta$ を見つける事が最尤推定の基本的な考え方です。

パラメータの見つけ方ですが、尤度関数の $\theta$ に対する偏微分が0になる地点を探すことで求めるのが一般的です。（要するに勾配降下法）

### 勾配降下法

過去に記事にしているのでそれをそのまま引用します。
以前の記事：[0から理解する誤差逆伝播法](https://qiita.com/pocokhc/items/401ff11ac4090dcc2a4f#%E5%8B%BE%E9%85%8D%E9%99%8D%E4%B8%8B%E6%B3%95)


勾配降下法は関数の最小値（または最大値）を見つける最適化手法です。
ある関数を微分すると、特定の地点xの接線の傾き（勾配）を得ることができます。
この傾きはxに対する出力の方向と強さを表しています。

![bb-a1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396150/d62844bf-9bd5-3e75-bb43-3f166652e5f1.png)

出力を増やしたい場合は勾配方向に値を増やし、出力を減らしたい場合は勾配とは逆方向に値を増やして出力をコントロールし、出力が最小となる点を探す手法が勾配降下法です。

尤度は最大値を求めたいので符号を反対にして適用します。

## 1-4. 対数尤度の最大化

尤度関数ですが計算を簡単にするために対数を取ることが多いです。
理由は、関数の最大化は対数を取っても結果が変わらず、かつ計算が簡単になる場合が多いからです。

例えば先ほどの尤度関数は対数を取ると以下のように簡単になります。（積から和の形に変わります）

``` math
\begin{aligned}
\log L(\theta) &= \log(\prod_{i=1}^{n} P(x_i|\theta)) \\
&= \sum_{i=1}^{n} \log P(x_i|\theta)
\end{aligned}
```

また確率分布によっては対数を取らないとそもそも計算できないなど、個別に理由があるかと思います。


参考
・[リンゴで理解する 尤度 とは~離散確率から正規分布まで~(医療職からデータサイエンティストへ)](https://www.medi-08-data-06.work/entry/yudo)
・[最尤推定量とは？初めての人にも分かりやすく解説(AVILEN)](https://avilen.co.jp/personal/knowledge-article/maximum-likelihood-estimation/)
・[【統計学】尤度って何？をグラフィカルに説明してみる。(Qiita)](https://qiita.com/kenmatsu4/items/b28d1b3b3d291d0cc698)



# 2. ELBO

VAEや拡散モデルでは対数尤度を最大化するようにパラメータを更新します。
ただ尤度関数はニューラルネットワークで表現されて、かつそれぞれの手法に特化した確率分布を前提においているので簡単には計算できないようです。
その場合に尤度関数を最大化する手法がELBOとなります。

## 2-1. 対数尤度の計算が大変な理由

尤度関数が連続値の場合（確率分布が確率密度関数における尤度）、尤度を求める式が積ではなく積分になります。

$$
L(\theta) = \int P(x|\theta)
$$

積分の尤度関数は複雑な場合が多く、解析的に解くのは難しいようです。
（この後微分をして最大値を求めるので難しくなさそうな気がしますが…、多分素人考えで簡単ではないのでしょう）


## 2-2. 積分が含まれる尤度関数を解く方法

積分が含まれる尤度関数を解く方法の一つにELBO(Evidence Lower BOund)があります。
まず以下のように式を変形します。

``` math
\begin{aligned}
\log L(\theta) &= \log \int P(x|\theta) \\
&= \log \int Q(x|\theta)\frac{P(x|\theta)}{Q(x|\theta)} \quad \text{(1)}\\
&\geq \int Q(x|\theta) \log \frac{P(x|\theta)}{Q(x|\theta)} \quad \text{(2)} \\
&= L'(\theta) \quad \text{(変分下限)}
\\
\end{aligned}
```

(1) $\frac{Q(x|\theta)}{Q(x|\theta)}=1$ をかけています  
(2) イェンセンの不等式

イェンセンの不等式については難しかったので参考記事をみてください。
イェンセンの不等式を適用する事で、尤度を変分下限という値の不等式で置き換えることができます。
これにより尤度は必ず変分下限以上の値になる事が保証されます。
ですので、尤度を最大化する代わりに変分下限を最大化することで間接的に尤度を最大化する手法がELBOとなります。
（変分下限の式は積分の中にlogが入っています。logは積分の中に入れたほうが計算が簡単になる場合が多いようです）

参考のVAEの記事ではVAEの変分下限を実際に計算しているので具体例はそちらを見てみてください。


参考
・[イェンセン(Jensen)の不等式の直感的理解(Qiita)](https://qiita.com/kenmatsu4/items/26d098a4048f84bf85fb)
・[Variational Autoencoder徹底解説(Qiita)](https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24#3-vae%E3%81%AE%E7%90%86%E8%AB%96%E7%9A%84%E3%81%AA%E6%A6%82%E8%A6%81)


## 最後に

拡散モデルを調べていたらまたELBOが出てきたので調べてみました。
特に尤度という概念を普段使わないのでなかなか理解できず…
今回ある程度そこが分かった気になれたのでよかったと思います。
誰かの助けになれば幸いです。