機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Neural Autoregressive Flowsを読んだのでメモ

はじめに

Neural Autoregressive Flowsを読んだのでメモ.表裏一体の関係にあったMAFとIAFを統合して一般化したneural autoregressive flow(NAF)を提案した論文.

お気持ち

この論文で問題としているのは,Variational InferenceにおいてIAFやMAFなどかなり質の良いモデルが作れるようになっているが,局所解の影響を受けやすいというところ(mode collapseのような現象).その原因は変換に使える関数の形が制限されていることにあるため,そこをもっとrichなものにして解決しようというもの.

その上で気をつけないといけないのはnormalizing flowを使った変分推定ではKLダイバージェンスの勾配はモンテカルロ推定などをしなければならないため以下の計算は扱いやすい必要がある.

ただし,p_Xはデータ分布でp_Yは近似事後分布,p_{target}は潜在変数\mathbf{y}の真の分布を表す.

Neural Autoregressive Flows

ここでは論文のnotationとは少し異なることに注意.

基本的にはAutoregressive Flowで用いられる変換の関数fニューラルネットに変えるというもの.すなわち

\displaystyle
y_t=f(x_t|\mathbf{x}_{1:t-1})=DNN(x_t|\phi(\mathbf{x}_{1:t-1}))

とする.何をしているかというと,入力はx_tスカラーでNNの重みが\mathbf{x}_{1:t-1}を入力とする関数から得られ,そこからy_tが計算されるというもの.つまりニューラルネットの構造としてはスカラーを入力としてスカラーを出力する.ここではこの重みを擬似パラメータと呼ぶ.この定式化の嬉しいところは,\frac{\partial y_t}{\partial x_t}と擬似パラメータの勾配が逆伝播によってもとまるというところ.

さらにここではfの構造として二つ,deep sigmoidal flows(DSF)とdeep dense sigmoidal flows(DDSF)というものを導入する. DSFは以下で定義される.

\displaystyle
y_t=\sigma^{-1}(\underbrace{w^T}_{d_{1\times d}}\sigma(\underbrace{a}_{d\times 1}\underbrace{x_t}_{1\times 1}+\underbrace{b}_{d\times 1})))

ここで\sigmaシグモイド関数を表し,\sigma^{-1}はlogit関数.logit関数を最後に使う理由はy_tの値が不当に0にならないようにするため.また\sum_iw_{i,j}=1,\:w_{i,j}>0,\:a_{s,t}>0,\:b\in\mathbb{R}^dとして定義される.またdは隠れ層のユニット数でw,aはsoftmaxの出力とsoftplusまたはexpの出力から得られる.ただし,DSFは隠れ層1層の入出力がスカラーMLPとして考えられるため表現力には限界がある.

そこでその問題を解決するためにDDSFは出力をベクトルとするようなモデルとして定義する.

\displaystyle
h^{l+1}=\sigma^{-1}(\underbrace{w^{l+1}}_{d_{l+1}\times d_{l+1}}\sigma(\underbrace{a^{l+1}}_{d_{l+1}}\odot \underbrace{u^{l+1}}_{d_{l+1}\times d_l}\underbrace{h^l}_{d_l}+\underbrace{b^{l+1}}_{d_{l+1}}))

ただし,d_0=d_L=1,\:\sum_ju_{kj}=1を満たしbを除き全て正の値を持つ.

ここで一つ問題が生じていて,DDSFの計算には\mathcal{O}(d^d)の擬似パラメータが必要となる.すると隠れ層の次元dが大きくなると実践的に計算が難しくなるため,conditional batch-normalizationなるものを使って関数f\mathcal{O}(d^2)の統計パラメータと\mathcal{O}(d)の擬似パラメータで表現したらしい.実際のところ実験においてはconditional weight normalizationを使ったとのこと.詳しくはappendixにあるそうだがちょっとしたtips的なところは興味ないので割愛.

まとめ

一応最後にNAFがuniversal density approximatorだという主張があったが証明の部分がピンとこなかったのでこのメモでは割愛してしまった.

Flow関連の生成モデルに関してある程度主要な部分はsurveyできたと思うからアウトプットとして論文書きたいなという気持ち.

Masked Autoregressive Flow for Density Estimationを読んだのでメモ

はじめに

Masked Autoregressive Flow for Density Estimationを読んだのでメモ.

お気持ち

Inverse Autoregressive Flowと密接な関係があるReal NVPの一般化手法Masked Autoregressive Flowを提案したぜということ.

密度推定の課題ではnormalizing flowやautoregressive modelがうまくいっているが,autoregressive modelは変数のオーダーにセンシティブな部分がありそこが欠点である.実際にFigure 1に例が載っていて,ターゲットの分布とモデルの分布の変数のオーダーを等しくしてもautoregressive modelは真の分布にフィットできず,フィットするのに適したオーダーを知るすべもないので良くない.さらに並列計算もあまり有効ではないがそれはMasked Autoencoder for Distribution Estimation(MADE)が解決した. Normalizing flowにおいてはInverse Autoregressive Flow(IAF)などのモデルは変分推定に基づいて作られているため密度推定に最適なものになっていない.

だからこの辺うまいこと統合して密度推定に適したものを作りたいというのが気持ち.

Masked Autoregressive Flow

まず,導入として自己回帰モデルをnormalizing flowの枠組みで考える.

はじめにガウス分布でparameterizedされた自己回帰モデルを考える.すると,x_iの分布は

\displaystyle
p(x_i|\mathbf{x}_{1:i-1})=\mathcal{N}(x_i|\mu_i,(\exp\alpha_i)^2) \\ \displaystyle
\mu_i=f_{\mu_i}(\mathbf{x}_{1:i-1}),\:\alpha_i=f_{\alpha_i}(\mathbf{x}_{1:i-1})

と表すことができる.ただし,fは平均と標準偏差の対数を計算するなんらかの関数.上記のモデルからデータを生成する際にはreparameterization trickから

\displaystyle
x_i=u_i\exp\alpha_i+\mu_i\\ \displaystyle
u_i\sim\mathcal{N}(0,1)

という計算を行えばいい.この式を考えてみれば,確率変数\mathbf{u}からデータ\mathbf{x}への写像を与えていることになるため,モデルとしては\mathbf{x}=f(\mathbf{u})として書くことができる.さらにこの関数は簡単に逆変換がu_i=(x_i-\mu_i)\exp(-\alpha_i)のように記述でき,その逆変換のヤコビアン自己回帰モデルの構造から三角行列になる.よって行列式

\displaystyle
\left|\mathrm{det}\left(\frac{\partial f^{-1}}{\partial\mathbf{x}}\right)\right|=\exp\left(-\sum_i\alpha_i\right)

として簡単に計算ができる.この辺りはInverse Autoregressive Flowと同様の話.

ここでflowとして自己回帰モデルを記述し,モデルを積み重ねて深層構造にすることで改善を行う.自己回帰モデルM_1,\dots,M_Kと与えられたとき,モデルM_kの乱数\mathbf{u}_kの密度をM_k+1でモデル化するモデルを考える.これは最終的には乱数\mathbf{u}_kを標準ガウス分布モデリングすることになるが,モデルを積み重ねることで柔軟性を持ったモデルを作ることができる.この論文では関数f_{\mu_u},f_{\alpha_i}をMADEを使ったアプローチで構成し,それをMasked Autoregressive Flow(MAF)とする.

IAFとの関係

今までの流れで定義されたMAFはほぼほぼIAFと同じ形をしていて,違うのはガウス分布のパラメータの計算が何を入力とするかだけ.MAFは上で書いたように\mathbf{x}_{1:i-1}から計算されるのに対し,IAFは\mathbf{u}_{1:i-1}から計算される.この違いは計算のコストに大きく現れ,MAFはデータ点\mathbf{x}の密度分布p(\mathbf{x})を一つのパスから計算できるが,サンプリングにはデータ点の次元数Dのパスが必要になる.それに対しIAFは逆になる.このことからMAFは密度推定のためにデザインされていることが伺える.

理論的な面としては,初期の分布を[tex:\pi}を使って表せば,MAFにより計算される密度分布は変数変換の公式から

\displaystyle
p_x(\mathbf{x})=\pi_u(f^{-1}(\mathbf{x}))\left|\mathrm{det}\left(\frac{\partial f^{-1}}{\partial \mathbf{x}}\right)\right|

となるのに対し,IAFは

\displaystyle
p_u(\mathbf{u})=\pi_x(f(\mathbf{u}))\left|\mathrm{det}\left(\frac{\partial f}{\partial \mathbf{u}}\right)\right|

となる.ここから以下の関係が成り立つ.

\displaystyle
D_{KL}(\pi_x(\mathbf{x})||p_x(\mathbf{x}))=D_{KL}(p_u(\mathbf{u})||\pi_u(\mathbf{u}))

証明はsupplementary materialにあったが簡単だったので割愛.基本的にはD_{KL}(\pi_x(\mathbf{x})||p_x(\mathbf{x}))\mathbf{u}=f(\mathbf{x})で変数変換することでD_{KL}(p_u(\mathbf{u})||\pi_u(\mathbf{u}))の形になることを導くだけ.

この後も論文中では色々書いてあったが,要するにIAFは変分推定を使って問題を解いていて,MAFはnormalizing flowとして問題を解いているくらいの違いだと思う.そこの違いで出口が潜在変数になるかデータになるか変わってくると言ったところ.

realNVPとの関係

realNVPはNICEをベースにaffine coupling layerを使って拡張したモデルで,affine coupling layerは今まで定義された変数を使えば以下の形で定義される.

\displaystyle
\mathbf{x}_{1:d}=\mathbf{u}_{1:d},\:\mathbf{x}_{d+1:D}=\mathbf{u}_{d+1:D}\odot\exp\mathbf{\alpha}+\mathbf{\mu}

式を見ればわかるようにIAFヤMAFとほぼほぼ同じ形をしていて,実際MAFの特別な場合とみなすことができる.realNVPでは\mathbf{x}を二つに分けて一つは恒等写像されるが,IAFやMAFでは自己回帰性を満たすためのマスクによりi\leq dについては恒等写像i\gt dについては変換が行われるため,realNVPの柔軟性を持つ一般化としてみなすことができる.ただし,realNVPはデータの生成も密度の推定もone forward passで計算できるため利点も存在する.

Conditional MAF

ここではサンプルのペア(\mathbf{x}_n,\mathbf{y}_n)が与えられた時の条件付き分布p(\mathbf{x}|\mathbf{y})の推定を行うタスクについて考える.自己回帰モデルはこの問題に自然に拡張することが可能.確率における連鎖律から自己回帰モデルではp(\mathbf{x}|\mathbf{y})=\prod_ip(x_i|\mathbf{x}_{1:i-1},\mathbf{y})として条件付き分布を書くことが可能で,入力の変数を拡張するだけで記述できる.

まとめ

realNVPの一般化としてIAFを定義したというところか.密度推定を意識してモデリングされているからタスク次第で,IAFとMAFの優劣はつかない感じか.MAFはSupplementary materialに生成した画像載っていたが全然うまくいってなかったところを見るとIAFの方がモデルの形式からも生成には向いている?(IAFは生成画像が載ってないからわからないが。。。)ただそれにしてもモデルの形式上は大差ないGlowがあれだけ綺麗に画像を生成できたのは何が起きているのか気になる.

Improved Variational Inference with Inverse Autoregressive Flow

はじめに

Improved Variational Inference with Inverse Autoregressive Flowを読んだのでメモ.

変分推定

論文に章立ててあるのと復習も含め何度も書くことが重要かなということでおさらい.

観測変数を\mathbf{x},潜在変数を\mathbf{z}とし,同時分布をp(\mathbf{x},\mathbf{z})とする.データセット\mathbf{X}=\{\mathbf{x}^1,\dots,\mathbf{x}^N\}が与えられた時,以下の周辺尤度の最大化をしたいというのが目標.

\displaystyle
\log p(\mathbf{X})=\sum_i^N\log p(\mathbf{x}^{(i)})

一般的には上のような周辺尤度は解析的に計算困難な場合が多い.そこで解決策の一つとしてq(\mathbf{z}|\mathbf{x})で表される推論モデルと呼ばれるものを導入し,変分下限を最適化することが考えられる.すなわちある観測\mathbf{x}に対し以下の周辺対数尤度の変分下限を最適化する.

\displaystyle
\log p(\mathbf{x})\geq\mathbb{E}_{q(\mathbf{z}|\mathbf{x})}[\log p(\mathbf{x},\mathbf{z})-\log q(\mathbf{z}|\mathbf{x})]=\mathcal{L}(\mathbf{x};\mathbf{\theta})

\mathbf{\theta}p,qに関するモデルパラメータを表す.さらに式変形を行えば,

\displaystyle
\mathbb{E}_{q(\mathbf{z}|\mathbf{x})}[\log p(\mathbf{x},\mathbf{z})-\log q(\mathbf{z}|\mathbf{x})] \\ \displaystyle
=\mathbb{E}_{q(\mathbf{z}|\mathbf{x})}[\log p(\mathbf{z}|\mathbf{x})p(\mathbf{x})-\log q(\mathbf{z}|\mathbf{x})] \\ \displaystyle
=\log p(\mathbf{x})-D_{KL}(q(\mathbf{z}|\mathbf{x})||p(\mathbf{z}|\mathbf{x}))

として書き換えることができる.この式を最適化する方法は数多く存在していて,VAEのreparameterizationなどはその一例.ここで注意としては,一般的に潜在変数が多変数のモデルにおいてはq(\mathbf{z}_a,\mathbf{z}_b|\mathbf{x})=q(\mathbf{z}_a|\mathbf{x})q(\mathbf{z}_b|\mathbf{z}_a,\mathbf{x})のように分解できることを仮定としておく.

変分下界を最適化する上で必要な性質としては(1)q(\mathbf{z}|\mathbf{x})が効率的に計算できること(2)そこから効率的にサンプリングできることの二つがあげられる.例えば,\mathbf{z}が高次元の場合,効率的に計算するために並列計算できることが望ましく,実践的にはq(\mathbf{z}|\mathbf{x})を等方性のガウス分布などに制限することが多い.ただし,q(\mathbf{z}|\mathbf{x})は真の分布p(\mathbf{z}|\mathbf{x})に一致できるような柔軟性が必要でもある.

Normalizing flow

散々勉強したけど今一度.Normalizing flowは前述したように計算効率と分布の柔軟性を兼ね備えたq(\mathbf{z}|\mathbf{x})を得る方法で,変数変換を何度も用いることで単純な分布を複雑な形にしようというもの.つまり初期の分布q(\mathbf{z}_0|\mathbf{x})を球面ガウス分布などで考えて,\mathbf{z}_t=\mathbf{f}_t(\mathbf{z}_{t-1},\mathbf{x})のように変数変換を行っていくというもの.この時変数変換された確率密度は公式によって以下の形で与えられる.

\displaystyle
\log q(\mathbf{z}_T|\mathbf{x})=\log q(\mathbf{z}_0|\mathbf{x})-\sum_t^T\log\mathrm{det}\left|\frac{d\mathbf{z}_t}{d\mathbf{z}_{t-1}}\right|

Normalizing flowの問題点の一つとして変数変換の関数fに強い制約があることがあげられる.

Inverse Autoregressive Transformations

この論文では自己回帰モデルガウス版を変数変換に使ったnormalizing flowを考える.

自己回帰モデルにおける変数を\mathbf{y}とし,ガウス分布のパラメータを\mu_i(\mathbf{y}_{1:i-1}),\sigma_i(\mathbf{y}_{1:i-1})と表す.自己回帰の構造から,j\geq iの時にはi,jに依存関係がないため\partial[\mathbf{\mu}_i,\mathbf{\sigma}_i]/\partial\mathbf{y}_i=[0,0]が成り立つ.(これはヤコビアンが三角行列になることを意味している).

上記のようなモデルからサンプリングを行うには,\mathbf{\epsilon}\sim\mathcal{N}(0,\mathbf{I})とすればreparameterizationにより,y_i=\mu_i(\mathbf{y}_{1:i-1})+\sigma_i(\mathbf{y}_{1:i-1})\epsilon_iとしてサンプリングすることができる.ただし,基本的に変分推論においては事後分布からのサンプリングが必要となるため上記のサンプリングが効率に行えたところであまり嬉しさはない.ここで嬉しいのは逆変換が\epsilon_i=\frac{y_i-\mu_i(\mathbf{y}_{1:i-1})}{\sigma_i(\mathbf{y}_{1:i-1})}として記述が可能なことで,このように逆変換が簡単にかけることはnormalizing flowの文脈においてはとても嬉しい.ここではこのような自己回帰モデルの逆変換をinverse autoregressive flowと呼ぶ.

上記二つの性質から,reparameterizationをすればnormalizing flowで必要なヤコビアン行列式の対数は

\displaystyle
\log\mathrm{det}\left|\frac{d\mathbf{\epsilon}}{d\mathbf{y}}\right|=\sum_i^D-\log\sigma_i(\mathbf{y})

として計算ができることがわかる.

Inverse Autoregressive Flow

ここではモデルの全体像を見る.基本的にはinverse autoregressive transformationをnormalizing flowに適用する.処理の流れは論文中のAlgorithm 1とFigure 2によくまとまっている.まず標準正規分布から\mathbf{\epsilon}をサンプリングし,初期の潜在変数\mathbf{z}_0

\displaystyle
\mathbf{z}_0=\mathbf{\mathbf{\mu}}_0+\mathbf{\sigma}_0\odot\mathbf{\epsilon}

と計算する.ただし,\mathbf{\mu}_0,\mathbf{\sigma}_0はEncoderNNの出力として得られる.その後t>0の潜在変数を

\displaystyle
\mathbf{z}_t=\mathbf{\mu}_t+\mathbf{\sigma}_t\odot\mathbf{z}_{t-1}

として計算していく.ここでの\mathbf{\mu}_t,\mathbf{\sigma}_tはEncoderNNとは別なAutoregressiveNNから計算される.ここでは\frac{d\mathbf{\mu}_t}{d\mathbf{z}_{t-1}},\frac{d\mathbf{\sigma}_t}{d\mathbf{z}_{t-1}}が対角成分0の三角行列となるようにすることでニューラルネットに自己回帰としての性質を持たせる.結果として\frac{d\mathbf{z}_t}{d\mathbf{z}_{t-1}}は対角成分に\mathbf{\sigma}_tを持つ三角行列となるため,t番目のflowにおける行列式\prod_i^D\sigma_{t,i}として計算ができる.以上から,normalizing flowにより得られる確率密度はq(\mathbf{z}_0|\mathbf{x})が標準ガウス分布であることに注意すれば

\displaystyle
\log q(\mathbf{z}_T|\mathbf{x})=-\sum_i^D\left(\frac{1}{2}\epsilon_i^2+\frac{1}{2}\log2\pi+\sum_t^T\log\sigma_{t,i}\right)

として計算される.

ちなみに実験的な部分として,計算の安定性からautoregressiveNNの出力を\mathbf{m}_t,\mathbf{s}_tとし,\mathbf{\sigma}_t=\mathrm{sigmoid}(\mathbf{s}_t)として分散を計算する.さらに潜在変数は\mathbf{z}_t=\mathbf{\sigma}_t\odot\mathbf{z}_{t-1}+(1-\mathbf{\sigma}_t)\odot\mathbf{m}_tとして計算するといいらしい.あと自己回帰の要請を満たすためにautoregressiveNNはMADEなどを使ったとのこと.

個人的に悩んだところとして目的関数である変分下限のp(\mathbf{z}|\mathbf{x})がどこから得られるのかわからなかった.例えばオリジナルのVAEだとそもそもp(\mathbf{z})になっていて\mathbf{x}で条件付けられてなく,標準正規分布としている.この論文ではp(\mathbf{z}|\mathbf{x})もモデルから得られて,q(\mathbf{z}|\mathbf{x})p(\mathbf{z}|\mathbf{x})の違いはどっち向きに流すかだけ.すなわち\mathbf{z}\rightarrow\mathbf{x}\mathbf{x}\rightarrow\mathbf{z}のどっちの処理から得られた潜在変数かという感じ.Figure 3を見ればなんとなくわかる.

まとめ

だいぶnormalizing flowが見えてきたかなというところ.あともう2本くらい読んだら一旦この辺の勉強は終了かな.

MADE: Masked Autoencoder for Distribution Estimationを読んだのでメモ

はじめに

MADE: Masked Autoencoder for Distribution Estimationを読んだのでメモ.flow-basedな生成モデルが面白かったのでその一種であるautoregressive flowも勉強したいと思いとりあえず読んで見た.

お気持ち

この論文ではAutoregressive models(自己回帰モデル)の計算コスト問題に着目している.自己回帰モデルは数式的に扱いやすい形でテストデータ\mathbf{x}に対して正確にp(\mathbf{x})を計算することが可能だが1ピクセルずつ生成していくためニューラルネット以上に計算コストがかかる場合がある.そこでAutoencoder(自己符号化器)を使ってシンプルな形で記述したいというのがこの論文の気持ち.

Masked Autoencoders

ここではD次元の2値データを考える.そのような場合に,基本的な自己符号化器の目的関数を考えると以下のようなクロスエントロピーで表される.

\displaystyle
l(\mathbf{x})=\sum_d^D-x_d\log\hat{x}_d-(1-x_d)\log(1-\hat{x}_d)

ただし,\hat{\mathbf{x}}は再構成されたデータ.自己符号化器の問題点は隠れ層の次元が入力の次元以上になると,データのコピーが起こり完璧に再構成してしまうということ.これはデータ分布を捉えることができていないことを意味しており,上記の対数尤度関数が正確でないことを意味する.すなわち上記の関数を用いて自己符号化器で分布を推定することはできないことを意味している.

そこでここでは自己符号化器に分布を推定する能力を持たせることを考える.そこでまずはデータ分布を以下の形で記述する.

\displaystyle
p(\mathbf{x})=\prod_d^Dp(x_d|\mathbf{x}_{\lt d})

ただし,\mathbf{x}_{\lt d}=[x_1,\dots,x_{d-1}].ここで元々のクロスエントロピーに代入すると,

\displaystyle
-\log p(\mathbf{x})=\sum_d^D-x_d\log p(x_d=1|\mathbf{x}_{\lt d})-(1-x_d)\log p(x_d=0|\mathbf{x}_{\lt d})=l(\mathbf{x})

となる.これはx_dの推定結果が\mathbf{x}_{\lt d}のみに依存すれば自己符号化器がデータの分布を表現することができることを意味している.ちなみに上記のような,前の系列から現在の状態を推定していくようなモデルを自己回帰モデルという.

次に上記のような自己回帰性を持った自己符号化器の構成方法考える.とにかく注意するのはx_dx_{\gt d}と関係を持たないようにすること.すなわち推定結果\hat{x}_dx_d,\dots,x_Dの間にcomputational path(いい日本語が思いつかなかった)を持たないようにする.そうするために,自己符号化器の重みをマスクしてそのようなコネクションの重みを0にしてしまおうというのがアイディア.式で記述すると,

\displaystyle
h(\mathbf{x})=g(\mathbf{b}+(\mathbf{W}\odot\mathbf{M}^\mathbf{W})\mathbf{x}) \\ \displaystyle
\hat{\mathbf{x}}=\mathrm{sigm}(\mathbf{c}+(\mathbf{V}\odot\mathbf{M}^\mathbf{V})h(\mathbf{x}))

となる.\mathbf{W},\mathbf{V}はencoderとdecoderを重み行列で,\mathbf{b},\mathbf{c}はバイアス項.g,\mathrm{sigm}はReLU等の活性化関数とsigmoid関数を表す.また,今回のアイディアの中心である\mathbf{M}はマスクを表す. 自己回帰性を満たす自己符号化器を作るために,まず隠れ層における各ユニットに1からD-1までの整数値mを割り振り,k層目の各ユニットが接続可能な入力のユニット数をm(k)(つまり\lt dを満たす最大の整数)とする.この時,p(x_d|\mathbf{x}_{\lt d})の関係から各重みに対するマスクは以下で与えらえる.

\displaystyle
M_{k,d}^\mathbf{W}=1_{m(k)\geq d}=
\left\{
\begin{array}{}
1 \:\: if\: m(k) \geq d \\
0 \:\: otherwise
\end{array}
\right.

要は現在参照しているユニットkの最大接続数が入力のユニットに割り振られた番号dより大きければ1を,それ以外は0を持つようなマスクを作りますということ.最大接続数が系列におけるインデックスdに相当する,すなわちp(x_d|\mathbf{x}_{\lt m(k)})となっているため,自己回帰の要請を満たすようなマスクになっていることがわかる.(論文ではdecodeする際の\mathbf{M}^\mathbf{V}における定式化も書いているが基本は同じなので割愛.)

マスク\mathbf{M}グラフ理論における隣接行列と同じ性質を持つため,\mathbf{M}^{\mathbf{V},\mathbf{W}}=\mathbf{M}^\mathbf{V}\mathbf{M}^\mathbf{W}のように行列積を取ればM_{d',d}^{\mathbf{V},\mathbf{W}}は入力から出力までのパスの数を表すことになる.このM_{d',d}^{\mathbf{V},\mathbf{W}}を用いれば自己回帰の要請を満たしているかが確認可能で,もしd'\leq dならM_{d',d}^{\mathbf{V},\mathbf{W}}=0となっている必要がある.なので,行列積をように書き下してやれば, \displaystyle
M_{d',d}^{\mathbf{V},\mathbf{W}}=\sum_k^KM_{d',k}^\mathbf{V}M_{k,d}^\mathbf{W}=\sum_k^K1_{d'\lt m(k)}1_{m(k)\leq d}
と表される.そのため,d'\leq dならばd'\lt m(k)m(k)\leq dを同時に満たすことはないため自己回帰の要請を満たしていることが証明される.

このマスクを使った自己符号化器は各ユニットにm(k)を与えてやるだけで構成可能で,この論文における実験では1からD-1までの値を一様にサンプリングすることで決めたらしい.また,自然に多層構造にも拡張ができる(論文にはちゃんと立式してあるがくどくなるので割愛.マスクの条件文をl層とl-1層目での比較に置き換えるのみ).

まとめ

マスク次第でかなり性能にばらつきが出そうだけどうどうだろうか.実験読めば書いてあるかもしれないけど今後何かに使うわけではないので今回はスルーでいいやという感じ.

flow-based generative modelsの勉強メモ まとめ

flow-basedな生成モデルの勉強メモのまとめ.全て論文ベース.

Glow: Generative Flow with Invertible 1×1 Convolutionsを読んだのでメモ

はじめに

Glow: Generative Flow with Invertible 1×1 Convolutionsを読んだのでメモ. VAEやAdamでお馴染みのDr. DP.Kingmaの論文.生成された顔画像が高周波成分までしっかりと表現しており衝撃的.

位置付け

イントロダクションに生成モデルについて完結まとまっていたのでまずはそこから. まず,尤度に基づいた方法は以下の3種類に分類される.

  • Autoregressive models
  • Variational autoencoders
  • Flow-based generative models

Autoregressive modelsはモデルの簡潔さに利点があるが,並列性(GPUで高速化できるかどうか)に限界があり計算量の観点から高次元のデータ生成はやりにくい.また,VAEは並列性に優れているが最適化が難しい.それぞれ利点と欠点がある.ではflow-based generative modelsはどうかというところ.flow-basedには以下の4つの利点があるとのこと(問題点は触れられてなかったが,モデル立てる上で逆変換とヤコビアン行列式の計算に制約があることか).

  • 潜在変数の推定と対数尤度を評価に近似が入らない
  • 推定と生成においてGPUで並列化可能
  • downstreamなタスクにおいて有用な潜在変数空間を持つ
  • メモリ効率が良い

そこでこのflow-basedの良さに目をつけ,generative flowであるGlowを提案している.

Flow-based Generative Models

何度もメモを残したが今一度flow-based generative modelsについて.\mathbf{x}を未知の分布\mathbf{x}\sim p^*(\mathbf{x})を持つ高次元の確率変数とし,そのような確率変数をデータセット\mathcal{D}からi.i.dに取得したとする.この時パラメータ\mathbf{\theta}を持つモデルp_\mathbf{\theta}(\mathbf{x})で近似することを考える.\mathbf{x}が離散データの場合には,最小化する対数尤度関数は

\displaystyle
\mathcal{L}\mathcal(D)=\frac{1}{N}\sum_i^N-\log p_\mathbf{\theta}\mathbf{x}^{(i)}

で与えられる.連続の場合には近似的に

\displaystyle
\mathcal{L}\mathcal(D)\simeq\frac{1}{N}\sum_i^N-\log p_\mathbf{\theta}\tilde{\mathbf{x}}^{(i)}+c

として与えられる.ただし\tilde{\mathbf{x}}^{(i)}=\mathbf{x}^{(i)}+u,\:u\sim\mathcal{U}(0,a),\:c=-M\log a満たす(M\mathbf{x}の次元で,aはデータの離散具合から決定される).

Flow-basedモデルにおいては生成過程は以下のように定義される.

\displaystyle
\mathbf{z}\sim p_\mathbf{\theta}(\mathbf{z}) \\ \displaystyle
\mathbf{x}=\mathbf{g}_\mathbf{\theta}(\mathbf{z})

つまるところ確率変数の変数変換.基本的にはp_\mathbf{\theta}(\mathbf{z})は扱いやすい密度関数である多変量の球面ガウス分布p_\mathbf{\theta}(\mathbf{z})=\mathcal{N}(\mathbf{z};0,\mathbf{I})などを考える.一つの強い制約として関数g_\mathbf{\theta}全単射でなければならない.すなわち\mathbf{z}=f_\mathbf{\theta}(\mathbf{x})=g_\mathbf{\theta}^{-1}(\mathbf{x})という関係が成り立つ必要がある.

上記の関係から,データ\mathbf{z}と潜在変数\mathbf{z}には次のような関係が成り立つ.

\displaystyle
\mathbf{x}\overset{f_1}{\longleftrightarrow}\mathbf{h}_1\overset{f_2}{\longleftrightarrow}\mathbf{h}_2\dots\overset{f_K}{\longleftrightarrow}\mathbf{z}

そこからおなじみの変数変換の公式を使えば以下の対数密度関数が得られる.

\displaystyle
\log p_\mathbf{\theta}(\mathbf{x})
=\log p_\mathbf{\theta}(\mathbf{z})+\log|\mathrm{det}(d\mathbf{z}/d\mathbf{x})|
=\log p_\mathbf{\theta}(\mathbf{z})+\sum_i^K\log\left|\mathrm{det}\left(\frac{d\mathbf{h}_i}{d\mathbf{h}_{i-1}}\right)\right|

ただし,\mathbf{h}_0=\mathbf{x},\:\mathbf{h}_K=\mathbf{z}として定義. 一般的なアプローチとしてヤコビアンの計算を楽にするためにヤコビアンが三角行列になるような変換を選ぶ.

Glow

ここから本題のGlow.Glowは以下の3つのモジュールから構成されており,それらをRealNVPと同様にマルチスケールに組み合わせている.

  • actnorm
  • invertible 1\times1 convolution
  • coupling layer

Actnormは誤解を恐れず言えばbatch normの正規化の単位がチャネルになったもの.スケールとバイアスパラメータは一番最初のミニバッチの平均と分散を使って初期化を行う (data dependent initializationとして別な論文で議論されている初期化方法らしい).またcoupling layerはNICEやRealNVPで使われていたaffine coupling layerを使っている.

この論文のメインのコントリビューションはタイトルにもあるようinvertible 1\times1 convolution.一言で言えば,変数変換における制約(逆変換可能)とヤコビアン行列式の計算しやすさを持つ畳み込み.invertible convolutionは適当な回転行列で初期化されるc\times cの重みを持つ.回転行列として初期化するのは行列式を1にしたいため(学習はじめは変数変化によって分布が変化しないようにということかと).それに対しh\times w\times c次元の入力データ\mathbf{h}が与えられた時,ヤコビアン行列式は以下のように計算ができる.

\displaystyle
\log\left|\mathrm{det}\left(\frac{d\mathrm{conv2D}(\mathbf{h};\mathbf{W})}{d\mathbf{h}}\right)\right|=hw\log|\mathrm{det}(\mathbf{W})|

しかし,このままでは計算コストのオーダーとして\mathcal{O}(c^3)となるので一工夫としてLU分解を使う. LU分解は正方行列を上三角行列\mathbf{U}と下三角行列\mathbf{L}の行列積に分解するというもの.

\displaystyle
\mathbf{W}=\mathbf{P}\mathbf{L}(\mathbf{U}+\mathrm{diag}(\mathbf{s}))

\mathbf{P}は置換行列で\mathrm{diag}(\mathbf{s})\mathbf{s}を対角成分に持つ対角行列,\mathbf{L}は対角成分が1の下三角行列.注意として,\mathrm{diag}(\mathbf{s})が吐き出されているため\mathbf{U}の対角成分はゼロになっている.このように分解ができれば\log|\mathrm{det}(\mathbf{W})|=\sum\log|\mathbf{s}|と計算ができるため,計算コストのオーダーが\mathcal{O}(c)になる.このLU分解が成り立たなければいけないため,初期値を回転行列としLU分解を計算して,分解によって現れた各々の値を最適化していく.ただし置換行列だけは固定とする(ここも工夫の一つ).論文のTable 1に各々のモジュールの計算式が載っているから一応そこをみれば何やっているかはすぐわかる.

まとめ

Glowを読んだ.基本的にはRealNVPの枠組みにinvertible convを追加したという話の気がする(あとact normも).それだけでRealNVPに比べてここまで生成結果がよくなるのも驚き.一部腑に落ちない点として,逆変換を行うときにconvの重み行列の逆行列を求める必要があるがそこの計算量については言及されてなかったのはどうなのか(学習後に一度求めてしまえば後は関係ないからいいのか?).

何はともあれflow-basedな生成モデルは確率変数の変数変換の使い方が個人的にとても賢く思えて,ここ最近で一番勉強していて楽しかった.

Density estimation using Real NVPを読んだのでメモ

はじめに

DENSITY ESTIMATION USING REAL NVPを読んだのでメモ.

前に読んでメモしたNICEの改善手法.なのでNormalizing flowの細かいところやNICEに関わることは以前の記事を参照.

real-valued non-volume preserving(real NVP)

まずnotationがわりにnormalizing flowによる分布を以下に.

\displaystyle
\log p_X(x)=\log p_Z(f(x))+\log\left|\mathrm{det}\left(\frac{\partial f(x)}{\partial x^T}\right)\right|

Real NVPでは基本的にはNICEで提案されたaffine coupling layerをベースに以下の変数変換に用いる.

\displaystyle
y_{1:d}=x_{1:d},\:y_{d+1:D}=x_{d+1:D}\odot\exp(s(x_{1:d}))+t(x_{1:d})

Dはデータ数を表しており,s,tはscaleとtranslationを表し\mathbb{R}^d\rightarrow\mathbb{R}^{D-d}の関数になっている.\odotアダマール積で定義されている.

上記のようなaffine coupling layerを定義するとヤコビアン

\displaystyle
\frac{\partial y}{\partial x^T}=
\begin{bmatrix}
\mathbb{I}_d & 0 \\
\frac{\partial y_{d+1:D}}{\partial x^T_{1:d}} & \mathrm{diag}(\exp[s(x_{1:d})])
\end{bmatrix}

として計算ができる(amp;と出るのははてなブログの表示上のバグのよう).ただし,\mathrm{diag}(\exp[s(x_{1:d})])は対角成分が\exp[s(x_{1:d})]の対角行列.よって分布の計算に必要なヤコビアン行列式\exp[\sum_js(x_{1:d})_j]として計算される.この論文ではs,tはCNNとして構成する. また,NICEの時と同様に逆変換も以下のように簡単に定義ができる.


x_{1:d}=y_{1:d},\:x_{d+1:D}=(y_{d+1:D}-t(y_{1:d}))\odot\exp(-s(y_{1:d}))

NICEではカップリング層で変換されるデータは片方のみで固定だったが,層ごとに交互に変換するデータを入れ替えることで両方のデータを変換する.層単位で見れば片方の変数は固定なので同様に逆変換をすることができる.

あとは実装する上でマルチスケール化等のモデルに関する工夫をおこなっているが本質とは関係ないので割愛.(午後の眠い時間に読んだせいで読みきれなかったとは言えない)

まとめ

Real NVPは数式的にどうこうというよりも強いモデルを作るためのニューラルネットワーク周りのモデルの組み方に重点をおいている感じでいわゆるビジョン系に多いやってみた論文感が強かった気がする. そういう意味ではreal NVPや関連手法を何かに応用する時にはちゃんと読み込みたいところ.