条件付き確率分布の表現方法についてメモ

記事というよりは個人的なメモですが、条件付き確率分布の表現方法について調べた範囲でまとめます。

# ここでの条件付き確率分布の定義
$y\in \mathbb{R}^D$についての条件付き確率分布$p(y\mid x)$のことです。ただしここで条件$x$は**数ベクトル**$x\in\mathbb{R}^L$とします。
# どんなところで出てくる？
$\\{(x_i, y_i)\\}_{i=1}^n$のように$x$と$y$のペアが複数与えられているときに、条件付き確率分布$p(y\mid x)$を推定する問題をConditional density estimationと呼びます[^CNF]。これは回帰の一般化とみなせます。$y=f(x)$となるような$f$を推定するのが通常の回帰で、この場合は$x$に対して$y$の特定の値しか推定できないわけですが、Conditional density estimationは$x$に対する出力$y$を確率的に表現しています。特に$p(y\mid x)$が多峰であれば、その後の意思決定をその多峰性を考慮して行えるわけですね。
[^CNF]: Conditional Density Estimation with Normalizing Flows https://siboehm.com/assets/img/nfn/Bachelorarbeit_Simon_Boehm.pdf


Conditional Density Estimationはストレートにデータから条件付き確率分布を推定するような問題ですが、$x$か$y$が潜在変数であるような状況も考えられます。例えば変分オートエンコーダ(Variational Autoencoder: VAE)では、いわゆるエンコーダは特定の観測データに対する潜在変数を確率的に推定するため、$x$がデータで$y$が潜在変数となっている条件付き分布$p(y\mid x)$を推定しているわけです。逆にデコーダは$x$が潜在変数で$y$が観測データになっているような$p(y\mid x)$を推定しています。


ざっと今回調べてみた動機としてはこんなところです。$p(x\mid y)$を表現するためにどんな方法があるのか、いくつか見ていきたいと思います。

# どんな表現方法がある？
## パラメトリックなやり方
一番シンプルなやり方としてはパラメトリックに表現してしまう方法でしょう。パラメトリックに確率分布を表現してしまえば、そのパラメータ$\theta$を変えることで確率分布が変化するわけです。そこでパラメータ$\theta$を入力$x$の関数としてしまおうということを考えます。例えば次のようにガウス分布で表現してみます。
$$p(y\mid x)=\mathcal{N}\left(y\mid \mu(x), \Sigma(x)\right)$$
この場合はガウス分布のパラメータである平均と共分散行列を条件$x$を入力とする関数としています。VAEのエンコーダやデコーダはこのような形になっていて、この関数をニューラルネットで構築しています。
ただ、conditional density estimationを解く場合に、このようなガウス分布の仮定はあまり適切でないです。なぜならただの回帰でなくわざわざconditional density estimationをやる場合は、やはり多峰性を表現したいというのが大きな動機としてあるからです。ガウスのような単峰の分布を仮定してしまうと確率的に表現するうまみが薄れてしまうわけですね。
ということで、パラメトリックでも多峰性を表現しうる形が望ましいわけです。素朴に考えると混合分布を使うのも選択肢としてあるわけですが、コンポーネント数の決定や学習自体が難しかったりするのでなかなか悩ましい問題です。近年ではパラメトリックでありながら多峰性を表現しうるということでnormalizing flow[^NF]が確率分布の表現方法として注目を集めています。これを条件付き確率分布の表現として適用しようという話もあるようです[^CNF]。これも結局、normalizing flowのパラメータを条件$x$の関数としてモデル化しましょうという話のようです。
[^NF]: Normalizing Flowの理論と実装 https://qiita.com/opeco17/items/62192b4dd1cd9cbaa170
## ノンパラメトリックなやり方
パラメトリックだと多峰性の柔軟な表現が難しいので、ノンパラメトリックなやり方を検討しましょう。ここではカーネル密度推定を考えます。通常の確率分布の推定、つまり条件付けされていない確率分布$p(y)$をカーネル密度推定する時は、観測されているデータ$\\{y_i\\}_{i=1}^n$を用いて次のように$p(y)$が表現されます。
$$p(y)=\frac{1}{n} \sum_i k(y\mid y_i)$$
ここで$k(y\mid y')$はカーネル関数と呼ばれ、$y'$で条件付けられる確率分布が用いられます。典型的なものとしては$k(y\mid y')=\mathcal{N}(y\mid y', \Sigma)$のようなガウス分布です。つまり、データ点の数だけカーネル関数を用意しておいて、その混合で表現しようというわけです。

これを条件付き分布に拡張してみます[^PRML]。ここではconditional density estimationの状況を考えて、$\\{(x_i, y_i)\\}$が得られているとします。この同時分布$p(x,y)$を次のようにカーネル密度推定で定義します。
$$p(x, y)=\frac{1}{n} \sum_i k_{xy}(x, y\mid x_i, y_i)$$
ここでカーネル関数$k_{xy}(x, y\mid x', y')$は

```math
\begin{align}
k_{xy}(x, y\mid x', y')&=k_x(x\mid x')k_y(y\mid y')\\
k_x(x\mid x')&=\mathcal{N}(x\mid x', \Sigma_x)\\
k_y(y\mid y')&=\mathcal{N}(y\mid y', \Sigma_y)
\end{align}
```

のように、$x$と$y$それぞれのカーネル関数の積の形で表現しておきます。すると条件付き分布$p(y\mid x)$は次のようになります。

```math
\begin{align}
p(y\mid x)&=\frac{p(x,y)}{p(x)}\\
&=\frac{p(x,y)}{\int p(x,y)dy}\\
&=\frac{\frac{1}{n}\sum_i k_{xy}(x,y\mid x_i,y_i)}{\frac{1}{n}\sum_i k_{x}(x\mid x_i)}\\
&=\frac{1}{K(x)}\sum_i k_{xy}(x,y\mid x_i,y_i)
\end{align}
```

ここで$K(x)=\sum_i k_{x}(x\mid x_i)$と定義しています。つまり入力$x$に応じて規格化する$K(x)$が変化するようなカーネル密度推定の形になっているわけですね。これで多峰性も表現できる形になりました。
[^PRML]: Pattern Recognition and Machine Learning https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/ にならって導出しました。

# 最後に
特にconditional density estimationをやりたい場合は、多峰性をどう表現するかというところが鍵になってくると考えられます。ノンパラは柔軟な表現ではありますが、高次元に弱かったりデータが増えると計算コストがどうしても増えたりしてしまうのがネックです。今回あまり説明しませんでしたが、パラメトリックだけど多峰性を表現しうるnormalizing flowは有力な選択肢になるかも知れません。