Conditional Variational Autoencoder

はじめに

 今回は生成モデルの一種であるConditional Variational Autoencoder(CVAE)を紹介する。最初に定式化を行い、その後、PythonフレームワークであるPixyzを用いた実装例を示す。最初の例として、適当な数字を指定するとその手書き文字画像を自動生成するモデルを見る。次に、手書き文字画像を与えるとその数字を予測するモデルを取り上げる。

ベイズの変分推論

 N個の観測値のペア\{x_n,y_n\}_{n=1}^{N}を考える。X=\{x_1,\cdots,x_N\},Y=\{y_1,\cdots,y_N\}とし潜在変数zを考え、これら3つの同時確率分布p(X,Y,z)にベイズの定理を適用する。

(1)    \begin{equation*} p(z|X,Y)=\frac{p(Y|X,z)p(z)}{p(Y|X)} \end{equation*}

式変形の途中でp(X|z)=p(X)を用いた(観測値Xと潜在変数zは独立である)。事後確率p(z|X,Y)をベイズの変分推論により求める。p(z|X,Y)を近似する関数としてパラメータ\phiを持つ関数q_{\phi}(z|X,Y)を導入し、次のKullback-Leibler Divergenceを最小にすることを考える。

(2)    \begin{equation*} D_{KL}\left[q_{\phi}(z|X,Y)||p(z|X,Y)\right] \equiv \int dz\; q_{\phi}(z|X,Y)\ln{\frac{q_{\phi}(z|X,Y)}{p(z|X,Y)}} \end{equation*}

右辺を変形すると

(3)    \begin{equation*} D_{KL}\left[q_{\phi}(z|X,Y)||p(z|X,Y)\right]= D_{KL}\left[q_{\phi}(z|X,Y)||p(z)\right]-E_{q_{\phi}(z|X,Y)}\left[\ln{p(Y|X,z)}\right]+\ln{p(Y|X)} \end{equation*}

となる。ここで、E_{q_{\phi}(z|X,Y)}\left[\cdot\right]q_{\phi}(z|X,Y)についての期待値を表す。右辺の第3項は\phiに依存しないので、右辺を\phiについて最小にするには次式を最小にすれば良い。

(4)    \begin{equation*} L\left[\phi\right]\equiv D_{KL}\bigl[q_{\phi}(z|X,Y)||p(z)\rbig]-\matchbb{E}_{q_{\phi}(z|X,Y)}\left[\ln{p(Y|X,z)}\right] \end{equation*}

ところで、L\left[\phi\right]を用いて式(3)を変形すると

(5)    \begin{equation*} \ln{p(Y|X)}=D_{KL}\left[q_{\phi}(z|X,Y)||p(z|X,Y)\right]-L\left[\phi\right] \end{equation*}

を得る。Kullback-Leibler Divergenceは常に0以上であるから

(6)    \begin{equation*} \ln{p(Y|X)}\geq -L\left[\phi\right] \end{equation*}

となる。左辺の量p(Y|X)はEvidenceと呼ばれる量であり、この対数の下限が-L\left[\phi\right]であることを上式は示している。この下限をEvidence Lower Bound(ELBO)と呼ぶ。すなわち、ELBOを最大することと、D_{KL}\left[q_{\phi}(z|X,Y)||p(z|X,Y)\right]を最小にすることとは等価である。いずれにせよ、式(4)を最小するような\phiを見つけることが目標になる。

深層生成モデル

 確率分布q_{\phi}(z|X,Y)を正規分布で表し、そのパラメータである平均\mu_{\phi}と分散\sigma_{\phi}^2をネットワークを用いて計算する。

(7)    \begin{equation*} q_{\phi}(z|X,Y)=\mathcal{N}(z|\mu_{\phi},\sigma_{\phi}^2) \end{equation*}

ここで、\mu_{\phi},\sigma_{\phi}X,Yの関数であり、パラメータ\phiはネットワークの各種重みに相当する。ネットワークを用いて表現された生成モデルを深層生成モデルと呼ぶ。ここでは手書き文字画像のデータセットMNISTを用いて、次の二通りの生成モデルを考える。

  1. Xを数字、Yを画像とみなす。このとき、p(Y|X,z)は数字Xと潜在変数zから画像Yを生成するモデルになる。この生成モデルを「生成モデル1」と呼ぶことにする。p(Y|X,z)としてベルヌーイ分布を仮定する。

    (8)    \begin{eqnarray*} p_{\theta}(Y|X,z) &=& \prod_{n=1}^{N}p(y_n|\eta_{\theta}(X,z)) \\ &=& \prod_{n=1}^{N}\prod_{m=1}^{M}{\rm Bern}(y_{n,m}|\eta_{\theta}(X,z)) \end{eqnarray*}

    mは個々の画素を指定する番号である。ベルヌーイ分布{\rm Bern}(y|\eta)は次式で定義される。

    (9)    \begin{equation*} {\rm Bern}(y|\eta)=\eta^y(1-\eta)^{1-y} \end{equation*}

    ここで、\eta\eta\in(0,1)を満たす実数である。ベルヌーイ分布は0か1のいずれかを生成する。すなわち、MNIST画像を2値画像とみなすということである(実際はグレイ画像だけど)。パラメータ\eta_{\theta}を、入力をX,zとするネットワークで計算する。\thetaはネットワークの重みを表す。

  2. Xを画像、Yを数字とみなす。このとき、p(Y|X,z)は画像Xと潜在変数zから数字Yを生成するモデルになる。この生成モデルを「生成モデル2」と呼ぶことにする。p(Y|X,z)としてカテゴリカル分布を仮定する。

    (10)    \begin{equation*} p_{\theta}(Y|X,z)=\prod_{n=1}^{N}{\rm Cat}(y_n|\eta_{\theta}(X,z)) \end{equation*}

    パラメータ\eta_{\theta}を、入力をX,zとするネットワークで計算する。\thetaはネットワークの重みを表す。カテゴリカル分布は次式で定義される確率分布である。

    (11)    \begin{equation*} {\rm Cat}(y|\eta)=\prod_{k=1}^{K}\pi_k^{s_k} \end{equation*}

    ただし、s_kは0か1のどちらかの値をとり、かつ\sum_{k=1}^{K}s_k=1である。また、\pi_kは、\pi_k\in(0,1)、かつ\sum_{k=1}^{K}\pi_k=1を満たす実数である。yは1からKまでのいずれかの整数値を取る。

生成モデル1、生成モデル2のどちらのモデルにおいてもp(z)として標準正規分布を仮定する。

(12)    \begin{equation*} p(z)=\mathcal{N}(z|0,1) \end{equation*}

ここまでの様子を図にすると以下のようになる。

結果

 深層生成モデルのためのPythonフレームワークPixyzを用いて実装した。ソースはここにある。最初に、標準正規分布p(z)から発生させた乱数zと数字5(=x)のペアから生成した手書き文字画像(=y)を示す(生成モデル1)。

左図は1epochの訓練後、右図は10epochの訓練後の生成画像である。64個の乱数を発生させ、それぞれに対応する画像を示した。次に再構成画像を示す。q_{\phi}(z|X,Y)のあとp_{\theta}(Y|X,z)により再構成された画像Yに相当する。

左図下の段は1epochの訓練後の再構成画像、右図下の段は10epochの訓練後の再構成画像である。上の段は左右ともに元画像である。

 次に、画像と乱数を与えて、数字をあてる生成モデル(予測器)の精度を示す。これは生成モデル2の結果である。

各エポックの終わりにp(z)から乱数zを発生させ(訓練データについては5万個、テストデータについては1万個)、訓練データ・テストデータが持つ画像Xを用いて、カテゴリカル分布p_{\theta}(Y|X,z)によりラベルを予測し、精度を測定した。特に優れた結果になるわけではないが、生成モデルを予測器として使えるのは純粋に面白いと思う。

Pixyzの特長

 今回の生成モデル1のソースコードを取り上げ、Pixyzの特長を解説する。まず最初に、q_{\phi}(z|X,Y)を実装した部分である。

先に説明したように

(13)    \begin{equation*} q_{\phi}(z|X,Y)=\mathcal{N}(z|\mu_{\phi},\sigma_{\phi}^2) \end{equation*}

と仮定した。これを表現するため、正規分布クラスNormalを継承している(2行目)。さらに、平均locと分散scaleをネットワークで計算させている(13から16行目)。Normalを継承したクラスは、メソッドforwardlocscaleを返さなければならない仕様になっている。この約束により、クラスInferenceは正規分布として働くことができる。

 次にp_{\theta}(Y|X,z)を実装した部分である。コード内でXYの表記が逆になっているのは実装上の都合のためである。読み替えて見てほしい。

先に見たようにベルヌーイ分布を用いて

(14)    \begin{equation*} p_{\theta}(Y|X,z)=\prod_{n=1}^{N}{\rm Bern}(y_n|\eta_{\theta}) \end{equation*}

と仮定した。これを表現するため今度はBeroulliクラスを継承している(2行目)。そしてパラメータ\eta_{\theta}を計算するためネットワークを用いている(12から14行目)。probs\eta_{\theta}に相当する。メソッドforwardprobsを返すことにより、クラスGeneratorはベルヌーイ分布として働くことができる。

 二つの例で見たように、あらかじめ用意されている確率分布NormalBernoulliを継承することで容易に目的とする確率分布を実装することができる。これら2つの確率分布、p_{\theta}(Y|X,z), q_{\phi}(z|X,Y)から計算される最小にすべき量

(15)    \begin{equation*} L\left[\phi\right]\equiv D_{KL}\bigl[q_{\phi}(z|X,Y)||p(z)\rbig]-\matchbb{E}_{q_{\phi}(z|X,Y)}\left[\ln{p(Y|X,z)}\right] \end{equation*}

は以下のようにコーディングされる。

2行目でp_{\theta}(Y|X,z)を、5行目でq_{\phi}(z|X,Y)を、8行目でp(z)(標準正規分布)を作っている。そして、11行目で式(15)を計算している。KullbackLeiblerExpectationLogProbはいずれもPixyzが用意しているモジュールである。12行目では、勾配降下法を行うためのモデルを作っている。このように、ほぼ理論式のままコーディングできるエレガントさがPixyzの大きな特長である

まとめ

 今回は生成モデルの1つであるConditional Variational Autoencoder(CVAE)を取り上げ、確率分布のパラメータを計算する過程にネットワークを導入した。このようにネットワークを利用した生成モデルを深層生成モデルと呼ぶ。さらに、MINISTを用いた応用例をPixyzを用いて実装し、その結果を示した。Pixyzを用いると、ほぼ理論式のままコーディングすることができる。深層学習の中でも深層生成モデルは今後も発展する分野であると考えている。
 

Kumada Seiya

Kumada Seiya

仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

アーカイブ

カテゴリー

PAGE TOP