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

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

Deep Energy: Using Energy Functions for Unsupervised Training of DNNsを読んだのでメモ

はじめに

Deep Energy: Using Energy Functions for Unsupervised Training of DNNsを読んだのでメモ.

気持ち

データセットの規模をスケールさせたいというモチベーション.ほぼほぼ完璧なアノテーションが自動で作れればデータセット作成に人手がほぼいらなくなりスケールさせることができ,ラベル付きデータが増えれば教師ありで学習したモデルも強くできる.そのためラベルなしデータを使ったアノテーション生成モデルの学習手法を提案するというもの.

今回はエネルギー関数を使ってsegmentationのモデルを学習するが,そもそもアノテーションではなくそのエネルギー関数を使ってsegmentationを行えばいいのではという疑問がある.この疑問に関する答えとしては実用においてはエネルギー関数を使ったsegmentationは実行速度がネックになる点が一つ.もう一つは学習ベースの方がデータごとの細かな正則化を考える必要がない点があげられる.

Deep Energy

ここでのゴールとしてはデータ\mathbf{x}が与えられた時に\mathbf{y}=\mathbf{y}(\mathbf{x})と真のラベルと一致させること.一般的なエネルギー関数を使ったsegmentationはエネルギー関数をE(\mathbf{x},\mathbf{y})とすると次の最適化問題として記述できる.

\displaystyle
\mathbf{y}(\mathbf{x})=\mathrm{arg}\min_\mathbf{y}E(\mathbf{x},\mathbf{y})

この定式化は逆問題(超解像やノイズ除去など)の課題で広く用いられているものと同一で,上記で定式化された問題を効率的に解くことのできるモデルを学習するのが目標.そこでモデルのパラメータを\mathbf{\theta}とすると\mathbf{y}=\mathbf{y}(\mathbf{x})\mathbf{y}=\mathbf{y}(\mathbf{x;\mathbf{\theta}})と書くことができる.さらにラベルなしの学習データセット\{\mathbf{x}^n\}^N_{n=1}とすると,モデルの学習は以下の最小化問題としてかける.

\displaystyle
\min_{\mathbf{\theta}}\frac{1}{N}\sum_{n=1}^NE(\mathbf{x}^n,\mathbf{y}(\mathbf{x}^n;\mathbf{\theta}))

上記定式化は逆問題において広く適用できるが,この論文では以下の2つの応用について考える.

Seeded Segmentation

応用の一つとして,ユーザーが与えたseed(前景か背景かを点や線描きで示したもの)と画像を入力として出力がsegmentationとなるようなモデルの学習について考える.

まず,画像を重み付き無向グラフG=(V,\varepsilon,W)として考える.ただし,Vは頂点で画像におけるピクセルを示し,\varepsilonはエッジを表し,今回は4近傍でのピクセルの接続を考える.エッジe_{ij}の重みはw_{ij}=e^{-\beta(I_i-I_j)^2}で与えられ,I_iはグレースケール画像のピクセルiの輝度値,\betaはスケールパラメータとして定義される.

ここで\mathbf{y}^l\in\mathbb{R}^N,\:N=|V|を各ピクセルがクラスlに所属する確率とし,\mathbf{x}^l\in\mathbb{R}^Nをクラスlに所属するseed画像とする(論文で\mathbb{R}が使われていたから同様の表記にしたが,おそらく\mathbb{R}ではなく0,1の2値かと).そこで\mathbf{x},\mathbf{y}を全クラス数Lに関してvectorizedしたもの\mathbf{Y},\mathbf{X}\in\mathbb{R}^{N\times L}とすれば目的関数は以下のように記述できる.

\displaystyle
E(\mathbf{X},\mathbf{Y})=\sum_l(\mathbf{y}^l)'\mathbf{L}\mathbf{y}^l+\lambda\sum_l(\mathbf{y}^l-\mathbf{x}^l)'\mathbf{Q}(\mathbf{y}^l-\mathbf{x}^l)

ただし,\mathbf{Q}=diag(\sum_l\mathbf{x}^l)\in\mathbb{R}^{N\times N}とする(クラスごとのseedで与えられた前景領域のピクセル数を対角成分に持つ行列).また\mathbf{L}はグラフラプラシアンを表す(ここではL_{ij}=w_{ij}).右辺第1項はsmoothnessを表し,第2項はseedラベルとの誤差を表す.上記関数を目的関数としてモデルを学習していく.論文では上記の目的関数をCNNの出力の形に合わせて書き換えていたが,基本的に何も変わらないので割愛.

Image Matting

もう一つの応用として,前景物体のピクセルのopacityとcolorを決定することによって背景と切り分けるImage Mattingの課題を考える.入力をRGB画像\mathbf{I}とし,前景画像を\mathbf{F},背景画像を[etx:\mathbf{B}]とする.すると各ピクセルiは以下のmatting equationによって記述される.

\displaystyle
I_i=\alpha_iF_i+(1-\alpha_i)B_i

\alpha_iは各ピクセルのopacityを表し,alpha matteと呼ぶ.基本的にこのalpha matteを画像から推定することは不良設定問題になっている.そのためここでもseedを与えることで解くことを考える.seed画像を\mathbf{x}とすると目的関数は以下で表現される.

\displaystyle
E(\mathbf{x},\mathbf{\alpha})=\mathbf{\alpha}'\mathbf{L}\mathbf{\alpha}+\lambda(\mathbf{\alpha}-\mathbf{x})'\mathbf{Q}(\mathbf{\alpha}-\mathbf{x})

ここでの\mathbf{L}ラプラシアン的な行列となっていて,以下によって与えられる.

\displaystyle
\mathbf{L}_{ij}=\sum_{n:(I,j)\in p_n}\left(\delta_{ij}-\frac{1}{|p_n|}\left(1+\left(\mathbf{I}_i-\mathbf{\mu}_n\right)'\left(\mathbf{\Sigma}_n+\frac{\varepsilon}{|p_n|}\mathbf{I}\mathbf{d}_3\right)^{-1}\left(\mathbf{I}_j-\mathbf{\mu}_n\right)\right)\right)

p_nピクセルnを中心としたパッチ(ここでは3\times 3の領域)を表し,\mathbf{\mu}_n\in\mathbb{R}^{3\times 1},\mathbf{\Sigma}_n\in\mathbb{R}^{3\times 3}はパッチ内のピクセルの平均と分散,\mathbf{Id}_3\in\mathbb{R}^{3\times 3}単位行列を表す.こちらも論文にはCNN用に書き直した式が出てくるが割愛.

まとめ

データセットアノテーション自動生成は産業応用的にも重要だなあと感じる日々.関連した研究もここ数年でかなり出てきているので色々と考えねばという気持ち.

Normalized Cut Loss for Weakly-supervised CNN Segmentation

はじめに

Normalized Cut Loss for Weakly-supervised CNN Segmentationを読んだのでメモ.生成モデル以外の論文読むのが久しぶり.

気持ち

Weakly-supervisedの枠組みにおけるsegmentationの手法は擬似的なマスクを生成してフィットさせていくことが多いが,Cross Entropyのようなロス関数を使うとミスラベルにフィットしてあんまりうまくいかない.なのでそこを解決するような新しいコスト関数が欲しいという感じ.

従来の流れ

Semi-supervisedの枠組みでの一般的なアプローチとしてはラベルに準拠するロスとヒューリスティックスな正則化項を組み合わせたコスト関数の最小化を行う.例えば一つの例としてLaplacian eigenmap regularizerを使ったコスト関数は以下のようなものがある.

\displaystyle
\sum_{p\in\Omega_\mathcal{L}}l(S_p,y_p)+\lambda\sum_{p,q\in\Omega}W_{pq}||S_p-S_q||^2

上記lはラベルy_pと点p\in\Omega_\mathcal{L}における出力値S_pを比較する一般的なコスト関数で,第2項目は正則化項でW_{pq}はあらかじめ定義されたpairwise affinitiesW=[W_{pq}]を表す.基本的に正則化項は隣接ピクセルの滑らかさを定義するようなもの.

ここからの発展としてMRFなどで知られるグラフの拘束を用いる方法が考えられた.そのような手法では以下のコスト関数が考えられる.

\displaystyle
\sum_{p\in\Omega_\mathcal{L}}-\log S_p^{y_p}+\lambda\sum_{p,q\in\Omega}W_{pq}[S_p\neq S_q]

これは言ってしまえば先ほどのコスト関数が離散になったようなもので,S_p^k\in\{0,1\}で,第二項目の[]はIverson brackets(indicator functionのようなもの.中身が真なら1で偽なら0)を表す.

ここでは上記のようなコスト関数をCNNのコスト関数に落とし込むことを考える.そのためにはコスト関数を実数に緩和する必要がある.CNNでは一般的にS_p\in[0,1]はsoftmaxの出力として得られ.これを使ってコスト関数を書き直すと以下のような2次形式のコスト関数として得られる.

\displaystyle
\sum_{p\in\Omega_\mathcal{L}}-\log S_p^{y_p}+\lambda\sum_kS^{k'}W_{pq}(1-S^k)

ここでS^k\in[0,1]でベクトルS_p\in[0,1]のk番目(クラスk)の要素S_p^kのサポートベクトルを表す.このようにMRF等で用いられる関数を実数の枠組みに拡張すればCNNの枠組みでsemi-supervisedの学習のコスト関数として使える.(ただし,論文では"We will study these losses in the future. This paper focuses on normalized cut objective."と言っているので以降あんまり関係ない)

Normalized Cut

Normalized Cutはsegmentationの課題に対して提案された一般的なグラフクラスタリングアルゴリズムらしい.spectral clustering等と同じくくりの手法でLaplacian Matrixの固有ベクトルに依存した手法になっている.基本的に以下で表される正則化項としてコスト関数に導入される.

\displaystyle
\sum_k\frac{cut(\Omega_k,\Omega/\Omega_k)}{assoc(\Omega_k,\Omega)}\equiv\sum_k\frac{S^{k'}W(1-S^k)}{d'S^k}

\Omega^kはラベルkが割り当てられたピクセルの集合を表し,S^kは2値のindicator vectordは度数ベクトルでグラフの各ノードのエッジの本数を表す.細かいことは元論文にと書いてあったのでまた次回読みたい.

提案手法

基本的な戦略は,クロスエントロピーとnormalizing cutを組み合わせたコスト関数を使ってweakly-supervised segmentationをCNNで実現するというもの.

最初に述べたように,擬似ラベルを生成してクロスエントロピーを使うと間違ったラベルにフィットしてしまうため,まずはそのような領域を効果的に無視できるpartial cross entropyを提案する.アイディアはシンプルでクロスエントロピーを以下のように書き換えるだけ.

\displaystyle
\sum_{p\in\Omega_\mathcal{L}}-\log S_p^{y_p}=\sum_{p\in\Omega}-u_p\log S_p^{y_p}

ここでp\in\Omega_Lの時u_p=1でその他は0になる.すなわち出力の全体\Omegaをコストの計算に使うのではなくラベルが振り当てられたピクセル\Omega_\mathcal{L}のみで学習を行うというもの.実験的にだがこのロスはめちゃくちゃよく機能するらしく,フルラベルを用いた際と比べて85%程度の精度が出るらしい.

次にこのpartial cross entropyに実数空間に拡張したNormalizing Cutの正則化を組み合わせた以下のコスト関数を考える.

\displaystyle
\sum_{p\in\Omega_\mathcal{L}}-\log S_p^{y_p}+\sum_k\frac{S^{k'}W(1-S^k)}{d'S^k}

Affinity matrix Wは事前に定義されていてここではガウシアンカーネルを使ったsimilarity graph.

あとはこのコスト関数を使ってクラスごとの前景領域と背景領域を少しだけ与えてあげたデータを用意して学習するだけ. 実験ではネットワークにDeepLabを使ったとのこと. 面白いのはpartial cross entropyを使えばGrabCutを使ったアノテーションによる学習より線描きしたアノテーションの方がよく動作するということ.

まとめ

Weakly-supervisedと考えると出力結果が衝撃的な美しさ.これだけできるならもうdenseなアノテーションはほとんどいらないんじゃないかという気持ちになる.

IntroVAE: Introspective Variational Autoencoders for Photographic Image Synthesis

はじめに

IntroVAE: Introspective Variational Autoencoders for Photographic Image Synthesisを読んだのでメモ.

stackGANやPGGANと違ってVAEのEncoderをGANのdiscriminatorとして扱うことでシンプルながらも高解像度の画像を生成することに成功した.

IntroVAE

さっくりと中身を紹介.

基本的にはVAEなので以下のELBOを最小化することを考える.

\displaystyle
ELBO=-\mathbb{E}_{q_\phi(z|x)}\log p_\theta(x|z)+D_{KL}(q_\phi(z|x)||p(z))

ここにGANの考えを取り入れる.具体的にはVAEのdecoderによって生成された画像をG(z')とするとこのG(z')を入力とした事後分布q(z|G(z'))D_{KL}(q_\phi(z|G(z'))||p(z)を最大化するように学習される.すなわちVAEのencoderにdiscriminatorの役割をさせるというもの.

上記の考えを取り入れた目的関数を考えると以下のようなものが考えられる.

\displaystyle
L_E(x,z)=E(x)+[m-E(G(z))]^+ \\ \displaystyle
L_G(z)=E(G(z))

ここでE(x)=D_{KL}(q_\phi(z|x)||p(z)),[x]^+=\max(0,x)を表し,mは正の値を持つハイパーパラメータ.triplet lossなど距離学習に使われる目的関数と似通った形になっている.この目的関数を用いてencoder Eとdecoder(generator) Gの間でmin-max gameを解く.つまりencoderは真の画像に対しては推定された分布のパラメータがpriorである標準ガウス分布に近くなるように,decoder(generator)により作られた画像に対しては標準ガウスから遠くなるように学習する.逆にdecoder(generator)は作った画像の分布をencoderに推定させた時,標準ガウス分布に近くなるように学習する.

オリジナルのGANの論文のnotationを使って整理すると,encoder EV(E,G)=\int_{x,z}L_E(x,z)p_{data}(x)p_z(z)dxdzを最小化,decoder GU(E,G)=\int_zL_G(z)p_z(z)dzを最小化するように学習される.

上記の目的関数をELBOと組み合わせることで最終的なintroVAEの目的関数は以下のように記述される.

\displaystyle
L_E(x,z)=E(x)+[m-E(G(Enc(x)))]^+-\mathbb{E}_{q_\phi(z|x)}\log p_\theta(x|z)\\ \displaystyle
L_G(z)=E(G(z))-\mathbb{E}_{q_\phi(z|x)}\log p_\theta(x|z)

学習の細かいパラメータ

VAEの事前分布としてはユニットガウスを使い,reconstruction errorはMSEを使ったとのこと.さらにL_Eの第2項目とL_Gの第1項目に重みパラメータ\alpha,\betaをかけてロスのバランスをとったとのこと.実験の設定では\alphaは0.5で\betaは0.0025から0.5のレンジで実験している.またモデルの構造はPGGANとほぼ同様だがresidual blockを導入している.

まとめ

顔の生成は綺麗だがLSUNのBEDROOMの生成結果はPGGANのが綺麗かなあ.ただ学習の安定性がその他の手法に比べれば格段に良さそう.

Avoiding Latent Variable Collapse with Generative Skip Modelsを読んだのでメモ

はじめに

Avoiding Latent Variable Collapse with Generative Skip Modelsを読んだのでメモ.勉強メモがわりにブログ始めてからずっと生成モデルしか勉強してない...

気持ち

VAEではdecoderが潜在変数を無視して画像を生成してしまうlatent variable collapseという現象がある.これはVAEが良いデータの表現を獲得できないことに繋がるため回避したい現象である.latent variable collapseが起こる要因は乱暴に言ってしまえば,evidence lower bound(ELBO)のKL項が最小化された結果priorp(\mathbf{z})と近似事後分布q(\mathbf{z}|\mathbf{x})がほぼ一致してしまうことによる.

この論文ではこれを回避するためにskip connectionをdecoder側に導入して,理論的にも実験的にもlatent variable collapseが回避できることを示したという話.この理論的側面が気になって読んでみた.

latent variable collapse

まず必要となる式を諸々導出や定義を行いつつlatent variable collapseが起こる理由について簡単に.

VAEのdecoderはp_\theta(\mathbf{x}|\mathbf{z})として表現され,以下で表されるニューラルネットによってparameterizeされた指数型分布族と考えられる.

\displaystyle
p_\theta(\mathbf{x}|\mathbf{z})=\mathrm{ExpFam}(\mathbf{x};\eta(\mathbf{z};\theta))
=\nu(\mathbf{x})\exp\left\{\eta(\mathbf{z};\theta)'\mathbf{x}-A(\eta(\mathbf{z};\theta))\right\}

ここでAはlog-normalizerを表す.\eta(\mathbf{z};\theta)\mathbf{z}のhierarchical function(要は多層のニューラルネット)で,以下のように表される.

\displaystyle
\mathbf{h}^{(1)}=f_{\theta_0}(\mathbf{z})\\ \displaystyle
\mathbf{h}^{(l+1)}=f_{\theta_l}(\mathbf{h}^{(l)})\\  \displaystyle
\eta(\mathbf{z};\theta)=f_{\theta_L}(\mathbf{h}^{(L)})

ただし,\mathbf{h}^{(l)}l層目の隠れ状態を表す.

次に目的関数を考える.ELBOを以下の形で与える.

\displaystyle
ELBO=\mathbb{E}_{p(\mathbf{x})}\left[\mathbb{E}_{q_\phi(\mathbf{z}|\mathbf{x})}\left[\log p_\theta(\mathbf{x}|\mathbf{z})\right]\right]-KL(q_\phi(\mathbf{z}|\mathbf{x})||p(\mathbf{z}))

上のELBOは第一項目の自由度の高さがKL項を0にする要因となっていてlatent variable collapseを起こす. Latent variable collapseをさらに理解するためadversarial autoencodersで議論されていたaggregated posterior q_\phi(\mathbf{z})を考える.aggregated posteriorは次の形で表される.

\displaystyle
q_\phi(\mathbf{x},\mathbf{z})=p(\mathbf{x})q_\phi(\mathbf{z}|\mathbf{x}) \\ \displaystyle
q_\phi(\mathbf{z})=\mathbb{E}_{p(\mathbf{x})}q_\phi(\mathbf{z}|\mathbf{x})

するとELBOは式変形により次のように表現することができる.(具体的な式変形は割愛するが,以下のELBOにaggregated posteriorの具体形を代入して整理すれば元のELBOに戻る.)

\displaystyle
ELBO=\mathbb{E}_{p(\mathbf{x})}\left[\mathbb{E}_{q_\phi(\mathbf{z}|\mathbf{x})}\left[\log p_\theta(\mathbf{x}|\mathbf{z})\right]\right]-\mathcal{I}^{VAE}_q(\mathbf{x},\mathbf{z})-KL(q_\phi(\mathbf{z})||p(\mathbf{z}))

ここで\mathcal{I}相互情報量を表していて,その定義から\mathcal{I}^{VAE}_q(\mathbf{x},\mathbf{z})=\mathbb{E}_{p(\mathbf{x})}\mathbb{E}_{q_\phi(\mathbf{z}|\mathbf{x})}\log q_\phi(\mathbf{z}|\mathbf{x})-\mathbb{E}_{q_\phi(\mathbf{z})}\log q_\phi(\mathbf{z})と計算される.KL項が0になるとういうことは上記の形で表現されるELBOにおいて

\displaystyle
\mathcal{I}^{VAE}_q(\mathbf{x},\mathbf{z})=KL(q_\phi(\mathbf{z})||p(\mathbf{z}))=0

となることを意味する.相互情報量が0であるということは\mathbf{x},\mathbf{z}が独立であることを意味していて,独立になるということはlatent variable collapseと同義.

avoid latent variable collapse

論文のメインの主張であるgenerative skip modelsについて.generative skip modelsの\eta(\mathbf{z},\theta)は以下のように表現できる.

\displaystyle
\mathbf{h}^{(1)}=f_{\theta_0}(\mathbf{z})\\ \displaystyle
\mathbf{h}^{(l+1)}=gw_l\left(f_{\theta_l}(\mathbf{h}^{(l)}),\mathbf{z}\right) \\  \displaystyle
\eta(\mathbf{z};\theta)=gw_L\left(f_{\theta_L}(\mathbf{h}^{(L)}), \mathbf{z}\right)

各層において隠れ状態と潜在変数を入力とする関数gw_lを導入した形で,ResNetやU-Netにあるいわゆるスキップコネクションと同じものと考えればいい.この論文ではgw_lを以下の形で表す.

\displaystyle
gw_l\left(f_{\theta_l}(\mathbf{h}^{(l)},\mathbf{z}\right)=\sigma\left(W_l^{(h)}f_{\theta_l}(\mathbf{h}^{(l)})+W_l^{(z)}\mathbf{z}\right)

ここで\sigmaはシグモイドやReLUといった非線形関数でWは学習される重みパラメータ.

上記のようなモデルを与えるとgenerative skip modelにおける相互情報量\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})は次のような関係を持つ.

\displaystyle
\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})\geq\mathcal{I}^{VAE}_p(\mathbf{x},\mathbf{z})

すなわち提案手法の方が相互情報量が大きくなるため潜在変数との結びつきが強くなる.証明としては,\mathbf{x}は層を重ねるごとに\mathbf{z}との関係性が薄れていくものである,すなわち,\mathcal{I}^{VAE}_p(\mathbf{x},\mathbf{h}^{(1)})\geq\mathcal{I}^{VAE}_p(\mathbf{x},\mathbf{z})が成り立つことを使う.SKIP-VAEでは全ての層に\mathbf{z}が入力されるため逆に層を重ねるごとに\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})\geq\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{h}^{(l)})と依存関係が増していく.よって\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})\geq\mathcal{I}^{VAE}_p(\mathbf{x},\mathbf{z})が成り立つ.

この関係性を使えばELBOの最大化は次のような制約付きの形で表すことができる.

\displaystyle
\theta^\ast,\phi^\ast=\mathrm{arg}\max_{\theta, \phi}ELBO\:\:\:\mathrm{s.t}\:\:\:\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})\geq\delta=\mathcal{I}^{VAE}(\mathbf{x},\mathbf{z})

よってskip-vaeにおける目的関数は

\displaystyle
\mathcal{L}=ELBO+\lambda\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z}) \\
=\mathcal{H}_p(\mathbf{x})-\lambda\mathcal{I}^{SKIP-VAE}_p(\mathbf{x},\mathbf{z})+KL(q_\phi(\mathbf{x},\mathbf{z})||p_\theta(\mathbf{x},\mathbf{z}))

となる.ただし\lambdaラグランジュ乗数で\mathcal{I}_p(\mathbf{x})はデータ分布のエントロピーを表す.また最後の式の導出はaggregated posteriorで導入した関係性を使った.

まとめ

論文では目的関数導出後,4章で実験において目的関数をどう計算していくか具体的に説明していたが実装予定はないので割愛.アブストに理論的にlatent variable collapseを防ぐと書いてある割に相互情報量の不等式が雰囲気で導入されててなんだか腑に落ちない(自分の理解不足または英語力不足かも知れないけど).とは言え感覚としてはわかるので手法としては実装も容易だし優秀な気がする.

Glow: Generative Flow with Invertible 1×1 Convolutionsの実装をした

はじめに

生成モデルの勉強も落ち着いたので理解深めるためにPytorchでGlowを実装した話(コードは載せてないので注意).

所感

著者のコードは幸いgithubに公開されていたので実装自体はそこまで難しくなかった.予定外だった(ちゃんと論文読めばわかるけど)のがglowがめちゃくちゃメモリを食うこと(論文の高解像度の顔画像を生成しようとすると確か600層くらいの畳み込みが必要.基本モデル的に使われているdepth=32のL=3のモデルでもかなりメモリを食う).論文にのっていないことがいくつかあったので,コードを見返さないでいいようにまとめとく.

畳み込みについて

論文にも書いてあることとしては,coupling layerのNNの構成は3層の畳み込みになっているが,最終層は0で初期化されていることとinvertible convは回転行列で初期化されていることには注意. またFigure 2のmulti-scaleの実装でz_iの従うガウス分布のパラメータをゼロ初期化した畳み込みで推定している.ゼロ初期化以外の畳み込みについては平均0,分散0.05のガウス分布を使って初期化が行われていた.

衝撃なのがinvertible convは論文ではLU分解をしてパラメータを保持してヤコビアンの計算を簡単にすると書いてあったが(というかこれが一つのコントリビューションに思えたが),実装のdefaultはLU分解しないものになっていた.LU分解するデメリットとしてP,L,U,sと一つの重み行列Wを4つのパラメータで保持しなければならないのでメモリをめっちゃ食う.LU分解しないと行列式を計算するのに多少コストがかかるがそれ以上にメモリを抑えられるから計算機が限られている限り普通に畳み込みしたほうがいい.

LU分解した際には,sについては\log|s|\mathrm{sign}(s)のように対数で保持して符号は別で持っていた.この辺もちょっと疑問に思ったあたりだけど,そうしておけばヤコビアンの対数がすぐに計算できるからいいということでしょう.

畳み込みのパディングはadd_edge_paddingという関数で行われている.処理としては入力と同一サイズで0初期化された行列を作りパディングされた部分のみ1の値を持つ変数を作った後チャネル方向にconcatするというもの.パディングされた領域には別途バイアスを加えたいというものかと.

Act normについて

couplingのNNの関数について論文だと(自分が見逃していなければ)畳み込み3層とReLUを使ったと書いてあるが実装を見ると最後の畳み込み以外reluの前にactnormを加えていた(これに関してはdefaultがそうなっているだけで実験のときには使ってないかもしれない). またゼロ初期化した畳み込みに対しては畳み込み計算後にスケーリングの処理(学習可能な係数をかける処理)を行なっていた(couplingの畳み込み以外もゼロ初期化畳み込みは全てスケーリング処理が入る).ただし,パラメータは対数の形で持っていて演算の際にはexpをかける.多分スケーリングで符号を変えたくないから.これはNICEの論文に書いてあったスケーリングと同じことなのか?

Squeezeについて

論文内では図にのってるだけで触れられてないsqueezeの処理(RealNVPの論文で説明されているから割愛したのか).基本的にはバッチxチャネルx縦x横の入力に対しfactorと呼ばれる整数値を用意して(実装では2)入力をバッチxチャネルx縦/factorx横/factorにreshapeした後,バッチxチャネルxfactorxfactorx縦/factorx横/factorに並び替えて,バッチx(チャネルxfactorxfactor)x縦/factorx横/factorのようにチャネルに含めるような処理を行う(当然逆変換もできる).ただし実装では入力がバッチx縦x横xチャネルになっているので注意.実際にはfactor 2の場合はチェッカーボード状にピクセルをサンプリングしてチャネル方向にくっつけるというもの.

最適化について

optimizerはAdamで各パラメータはいわゆるdefault値を使って重み減衰はなし.ただし,最初の10epochの間で学習率を0からdefault値の0.001に線形に変化させている.resnetとかでもwarm upは使われていたけどここまで極端なのはやっぱり学習が難しいからなのか.

その他

coupling等でデータを二つに分ける際にはチャネルを半分に分けるだけ(論文にも書いてあったけど一応). 後normalizing flowは逆関数が定義されているから,ちゃんと元に戻るか試して見るのがdebugになる.

細かいところだと著者実装では画像から潜在変数方向のactnormの計算がぱっと見はz=(x+b)*sになっていて論文に書いてある式と一致していないが,初期化の段階でbを負の平均,sを標準偏差の逆数を使って行なっているため実質z=(x-b)/sをしているのと等しく論文の記述通りの計算をしていることになる(なんでこんな回りくどい実装になっているかは不明).

学習結果

mnistでちょこっと学習させたモデルで補間をやってみた.

f:id:peluigi:20180831124354p:plain

f:id:peluigi:20180831124402p:plain

f:id:peluigi:20180831124409p:plain

概ねできてるっぽい.

まとめ

ざっと殴り書いたけどこんな感じ.実装見る限りtensorflowは畳み込みのチャネル等を入力のデータのサイズに合わせて勝手に初期化してくれるみたいなのでパラメータ追うのが結構しんどかった. もうちょっといろいろ遊んでみたいところ.

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は密度推定のためにデザインされていることが伺える.

理論的な面としては,初期の分布を\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があれだけ綺麗に画像を生成できたのは何が起きているのか気になる.