ディープな生成モデルは知らざるを知らずと為せるのか？

[**DO DEEP GENERATIVE MODELS KNOW
WHAT THEY DON’T KNOW? (Nalisnick et.al.)**](https://openreview.net/forum?id=H1xwNhCcYm)を読んだので要約とメモ。

筆者の理解と疑問は<font color="LightSteelBlue">青色</font>でメモしている。
ちゃんと理解するには**[Glow: Generative Flow with Invertible 1x1 Convolutions(Kingma & Dhariwal, 2018)](https://arxiv.org/abs/1807.03039)**を読む必要がありそう。
#本文
##概要
デプロイ後のニューラルネットは訓練データと異なる分布の入力にさらされることがある。ニューラルネットが高い確信度で間違った回答をする入力データを簡単に生成できることは、多くの研究が示している。生成モデルは新しい、**分布外の**入力の検出に使える入力特徴量の密度をモデリングしているので、そんな誤った確信に強いと考えられている。<font color="LightSteelBlue">"特徴量の密度をモデリング"というのがピンとこなかったが、密度=分布で、生成モデルが学習データの分布を学習していることだと思う。</font>
本論文ではこの仮定を検証する。フローベースモデル、VAE、PixelCNNによって学習された密度は**犬、トラック、馬（CIFAR-10）のような一般的な物の画像と、番地(SVHN)の画像とを識別できない**ことがわかった。前者で訓練したモデルが、後者に高い尤度を割り当ててしまう。<font color="LightSteelBlue">フローベースはGlowのこと</font>
さらに、よく使われるデータセットをペアにすることでこの現象の証拠を発見した（FashionMNISTとMNIST, CelebAとSVHN, ImageNetとCIFAR-10/CIFAR-100/SVHN）。周辺尤度を使って直接訓練・評価を行うので、フローベースの生成モデルに特に焦点を当てて解析した。フローベースモデルを定数体積の変形(constant-volume transformations)に制限してもこの現象は維持された。<font color="LightSteelBlue">"体積一定"かとも思ったが、後で入力によらないっていう話をしているので、xの変数じゃないという意味で"定数体積"にした。</font>
これらの変換は理論的に解析でき、データの位置と分散、およびモデルの曲率によって尤度の違いを説明できることを示す。本結果は、ディープ生成モデルからの密度推定を、訓練データの分布に類似した入力を特定するのに使用することに対して警告するものである。**分布外の**入力に対するモデルの振る舞いが理解されるまでは。

##1.イントロ
ディープラーニングは、条件付き分布$p(y|\boldsymbol{x})$のモデリングではうまくいく。$\boldsymbol{x}$が訓練データの分布からサンプルされたときはモデル$p(y|\boldsymbol{x})$は正確だが、それ以外の分布からの場合に正しく動作する保証はない。MNISTを回転させるだけで別のクラスと識別するなど(**Louizos & Welling (2017)**)。
表向きは、確信度の高い間違った予測を回避するには$\boldsymbol{\theta}$をパラメータとして訓練データの真の分布$p^{\*}(\boldsymbol{x})$を近似するために密度モデル$p(\boldsymbol{x};\boldsymbol{\theta})$を訓練して、$p( \boldsymbol{x}; \boldsymbol{\theta} )$よりも密度が十分低い予測を捨てる方法がある。直感的に言うと、識別モデル$p(y|\boldsymbol{x})$は信頼できる判断のために十分なサンプルをその領域で見ていない。<font color="LightSteelBlue">その領域=回転したMNISTのような未知の入力</font>
このアイデアは様々な論文や**(Bishop, 1994)** 、パネルディスカッションで提案されている**(AABI) 2017 (Blei et al., 2017)**
異常検知は正確な密度が必要な良い例である。その他には情報正則化(information regularization) **(Szummer & Jaakkola, 2003)**、 開集合認識(open set recognition) **(Herbei & Wegkamp, 2006)**,　不正確性推定(uncertainty estimation), 共変量シフト(covariate shift)検出, 能動学習(active learning)<font color="LightSteelBlue"> <a href=https://www.slideshare.net/shuyo/introduction-to-active-learning-25787487>この資料</a>が詳しかった。効果がありそうなデータを選別して学習させるみたいな手法</font>, モデルベース強化学習(model-based reinforcement learning)および転移学習などがある。<font color="LightSteelBlue">この辺の例はほぼ知らない。</font>
これらの応用は多岐に渡るが、VAE **(Kingma & Welling, 2014; Rezende et al., 2014)**, GAN **(Goodfellow et al., 2014)**, 自己回帰モデル **(van den Oord et al., 2016b;a)**<font color="LightSteelBlue">前の時刻の出力が現在の処理に影響するやつ</font>, invertible latent variable model **(Tabak & Turner, 2013)**等の形をとる。最後の２つ（自己回帰とinvertible）は近似推定が必要なく周辺尤度を直接計算できるので特にうれしい。
本論文では、よく調整されたモデルは訓練データに対して他のデータよりも高い尤度を割り当てるだろうと予測して、ディープ生成モデルが異常検知に使えるか調査した。しかしこれは誤りであった。VAE, 自己回帰モデル, フローベース生成モデルを**CIFAR-10 (Krizhevsky & Hinton, 2009)**,で訓練したが、いずれも**SVHN (Netzer et al., 2011)**に対してより高い尤度を出力した。SVHNの数字は犬や馬などCIFARとは外見が非常に異なるので、この結果は直感的ではないし、問題がある。しかし、CIFAR-10とSVHNに限らず**CelebAとImageNet**でも同様であった。
周辺密度を直接計算できるフローベースモデルで、この現象についてさらに調査を進めた。最初の実験ではlog-determinant-Jacobian項<font color="LightSteelBlue">(ヤコビ行列の行列式のlog)</font>が**分布外の**集合が高い密度を持つ原因と見られたが、この現象が定数体積フロー(**constant-volume flows**)でも成り立つことがわかった。<font color="LightSteelBlue">問題の原因を突き止めるために、フローベースモデルの計算式を展開して、その中のlog-determinant-Jacobian項が原因だった、という話。５章参照。</font>
本論文では次に、この振る舞いが入力分布の分散とモデルの曲率で説明できることを解析的に説明する。知りうる限り、本論文は多様な画像データセットとディープ生成モデルに関してこの直感的じゃない現象を報告した最初の論文である。さらに、フローベースモデルでの実験は、「定数体積と体積可変の変換の効果」のような重要な実験の変数を分離する。<font color="LightSteelBlue">定数体積の場合と、そうじゃない場合、などで切除実験をやった。</font>
最後に、解析により、２つのデータセットの間のモデル密度のギャップを量化するための一般的な表現を示す。この設定でのモデルの振る舞いを理解することは実世界へデプロイする際に重要なので、ディープ生成モデルの**訓練分布外の**性質についてのさらなる研究を促して本論文を終わる。

##2. 背景
記法の導入と先行研究について記す。行列は太字の大文字($\boldsymbol{X}$), ベクトルは太字の小文字($\boldsymbol{x}$), スカラーは小文字($x$)。生成モデルに着目しているので、すべての観測を$\boldsymbol{X}= \\{\boldsymbol{x}_n\ \\} _{n=1}^{N}$とする。$\boldsymbol{x}$はすべての特徴と、もしあるならラベルを含んだベクトル。$N$個のサンプルはすべて独立・同一に、$X$で表記される台を持つ未知の(unknown)分布から引き出されるとする$\boldsymbol{x} \sim p^\*(\boldsymbol{x})$。<font color="LightSteelBlue">サンプルは同じ分布から独立にサンプルを取った＝i.i.d ([朱鷺の杜Wiki](http://ibisforest.org/index.php?%E7%8B%AC%E7%AB%8B)より)</font>
モデルの密度関数を$p(\boldsymbol{x;\theta})$で表す。$\boldsymbol{\theta} \in \boldsymbol{\Theta}$はモデルパラメータ。モデルの尤度を

```math
p( \boldsymbol{X ; \theta}) = \prod_{n=1}^{N}{p(\boldsymbol{x_n ; \theta})}
```
とかく。

###2.1 ニューラル生成モデルの訓練
訓練データ$\boldsymbol{X}$とモデルクラス$\\{ p(\cdot ; \boldsymbol{\theta}): \boldsymbol{\theta} \in \Theta \\}$があるとする。<font color="LightSteelBlue">$\theta$は決まっていて、入力は任意なモデルの表記だろう</font>
モデルを真の未知なデータ分布$p^\*(\boldsymbol{x})$に最も近づけるパラメータ$\theta$を見つけたい。<font color="LightSteelBlue">生成モデルなので、$\theta$を調節することで、関係ない入力をいれてx（正解データ）のようなデータを出力するモデルを作りたい</font>
このギャップ<font color="LightSteelBlue">(真の分布と現在のモデルが出力するデータの分布のギャップ)</font>をカルバック・ライブラーダイバージェンス(KLD)で、次のように書く。

```math
KLD[p*(\boldsymbol{x})|| p(\boldsymbol{x;\theta})] = \int p^{*}(\boldsymbol{x}) log \frac{p^{*}(\boldsymbol{x})}{p(\boldsymbol{x; \theta})} d\boldsymbol{x} \approx - \frac{1}{N} log p(\boldsymbol{X; \theta}) - \mathbb{H}[p ^*] \tag{1}
```

最右辺の第１項は平均log尤度であり、第２項は真の分布のエントロピーである。後者は定数なので、KLDを最小化するとデータのlog密度を最大化するパラメータ設定を見つけることになる。<font color="LightSteelBlue">log尤度とlog密度は同じものを指すのか。</font>
つまり、

```math
\begin{align}
\boldsymbol{\theta^{*}}& = arg max_{\theta} log p(\boldsymbol{X;\theta}) \\
&= arg max_{\theta} \sum_{n=1}^{N}  logp(\boldsymbol{x_n;\theta})

\end{align}
```
$p(\boldsymbol{x_n;\theta})$は単独では確率としての解釈はできないことに注意。<font color="LightSteelBlue">$\prod p(x_n; \theta)$が尤度、logをつけて$\sum$になったのがlog尤度。尤度は確率ではない。$\prod$全体でモデル自体のもっともらしさを表しているもの、ということか。少し怪しい</font>
モデル密度から確率そのものを取り出すには、なんらかの領域$\boldsymbol{\Omega}$ で積分する必要がある。つまり、$P( \boldsymbol{\Omega} )= \int_{\Omega}p(\boldsymbol{x;\theta})d \boldsymbol{x}$となる。モデルの最適化中にデータにノイズを加えることでこの積分を模すことができ、密度モデルに確率により近いなにかを出力させることになる**(Theis et al., 2016)**

```math:
log \int p(\boldsymbol{x_n}+\boldsymbol{\delta};\boldsymbol{\theta})p(\boldsymbol{\delta}) d\boldsymbol{\delta} \geq \mathbb{E}_{\delta}[log p(\boldsymbol{x_n}+ \boldsymbol{\delta};\boldsymbol{\theta})] \approx log p(\boldsymbol{x_n}+\boldsymbol{\tilde{\delta}};\boldsymbol{\theta})
```
ここで$\boldsymbol{\tilde{\delta}}$は$p(\boldsymbol{\delta})$からのサンプルである。<font color="LightSteelBlue">$\delta$はノイズ。$x_n$に加えている</font>
得られた目的関数は下界であり、<font color="LightSteelBlue">(元の目的関数を）</font>最適化の対象に適したものにしている
実験中のすべてのモデルはノイズありで訓練している。密度と確率の間のこの曖昧さがあるので、今後はたとえ$\boldsymbol{X}$が訓練データとは別の分布から来たものでも$log p(\boldsymbol{X}+\boldsymbol{\tilde{\Delta}};\boldsymbol{\theta})$を`log尤度`と呼ぶ。

密度モデルの選択に関して、$p(\boldsymbol{x_n};\boldsymbol{\theta})$について標準の密度関数、例えばガウシアンなどを選ぶことができる。しかしこれらは実世界でよく見かける高次元の複雑なデータセットをモデリングするのに不適である。なので、モデル密度をなんらかのキャパシティの大きい関数$f$でパラメタ化したい。$f$にはよくニューラルネットが使われる。これにより、モデルはいくらかコンパクトな表現になり、勾配上昇法で最適化できる。本論文では３つの(自己回帰、潜在変数、可逆(invertible)モデル)ニューラル生成モデルの変種で実験を行った。自己回帰については、**PixelCNN(van den Oord et al., 2016b)**について実験したが、この定義については元論文を参照されたい。<font color="LightSteelBlue">未読。</font>
潜在変数モデルは、**VAE(Kingma & Welling, 2014; Rezende et al., 2014)**である。使用した正確なモデルについては**Rosca et al. (2018)**参照。最後に、可逆フローベース生成モデルを３つ目のクラスとして使った。これを最もよく研究したので、次に詳細を定義する。

###2.2 変数変換による生成モデル (GENERATIVE MODELS VIA CHANGE OF VARIABLES)
VAEとその他の生成モデルは観測された変数潜在変数との結合分布で定義されるが、もう一つ変数変換による方法がある。このケースでは、$x$と$z$は同じものであり、積空間$X \times Z$の概念はすでにない。$f 
: X \mapsto Z$をデータ空間$X$から潜在空間$Z$への微分同相写像(diffeomorphism)とする。<font color="LightSteelBlue">微分同相写像は、写像$f: U \mapsto V$が、全単射であり、fもその逆の$f^{-1}: V \mapsto U$も微分可能。というのが定義。fがニューラルネットのとき、全単射が成り立つのかとおもったが、入力xをうまいこと表現したのが潜在変数zなので多分なりたつんだろう。</font>$f$を使うことは$z$上での積分を$x$上の積分として計算可能にする。逆も成り立つ。

```math
\begin{align}
\int_{\boldsymbol{z}} p_z(\boldsymbol{z}) d\boldsymbol{z} &= 
\int_{x} p_z(f(\boldsymbol{x}))\left| \frac{\partial\boldsymbol{f}}{\partial{\boldsymbol{x}}}\right|d\boldsymbol{x} \\
&=\int_x p_x(\boldsymbol{x})d \boldsymbol{x} \\
&=\int_z p_x(f^{-1}(\boldsymbol{z})) \left| \frac{\partial \boldsymbol{f}^{-1}}{\partial \boldsymbol{z}}\right| d\boldsymbol{z} \tag{2}
\end{align}
```
<font color="LightSteelBlue">xとzが交換できると思うと、成り立ってるような気がする</font>
ここで$|\frac{\partial{\boldsymbol{f}}}{\partial{\boldsymbol{x}}}|$と$|\frac{\partial{\boldsymbol{f}^{-1}}}{\partial{\boldsymbol{z}}}|$は代替手段のもとで体積を調節する体積要素として既知である。<font color="LightSteelBlue">よくわからない</font>
特に、変化が座標に関するものであるとき、体積要素は微分同相写像のヤコビ行列の行列式であり、これを$|\frac{\partial{\boldsymbol{f}}}{\partial{\boldsymbol{x}}}|$と書く。
<font color="LightSteelBlue">ヤコビ行列の行列式がヤコビアンらしい。[(こちら参照)](https://mathtrain.jp/jacobian)$\frac{\partial{\boldsymbol{f}}}{\partial{\boldsymbol{x}}}$がヤコビ行列で、絶対値記号は行列式。体積要素~に関しては行列式の計算が体積計算になっているって話かな。</font>

変数変換の式は生成モデリングにとって強力なツールである。分布$p(\boldsymbol{x})$を完全に、自由に定義できる補助分布$p(\boldsymbol{z})$と$f$に関して定義できるから。変数変換モデルのパラメータを、$\phi$を微分同相写像のパラメータとして、$\boldsymbol{\theta}=\\{ \phi, \psi \\}$とする。つまり$f(\boldsymbol{x};\phi)$。また、$\psi$を補助分布のパラメータとする。つまり、$p(\boldsymbol{z};\psi)$。モデルに関して次のように最尤推定できる。

```math
\begin{align}
\boldsymbol{\theta}^{*}&=argmax_{\theta} log p_x(\boldsymbol{X};\boldsymbol{\theta}) \\
&=arg max_{\phi, \psi} \sum_{n=1}^{N} log p_z (f(\boldsymbol{x_n};\boldsymbol{\phi});\boldsymbol{\psi}) +log \left| \frac{\partial{\boldsymbol{f_{\phi}}}}{\partial{\boldsymbol{x_{n}}}} \right|  \tag{3}
\end{align}
```
$\psi$を最適化することは自明なモデルにならないように慎重にやる必要がある。例えば、分散に制約をかけないと、最適化は$p(z;\psi)$を一様分布に近づけてしまう。<font color="LightSteelBlue">p()は(3)式の最右辺の$p_z$のこと。制約なしだと分散が広がり続けるということだと思うが、なぜそうなるんだろう？</font>
そのため、多くの実装は$\psi$を固定する（通常は標準ガウシアン）。<font color="LightSteelBlue">標準ガウシアン=正規分布から取るという意味？</font>
これから先はそれを固定したものとして扱う。故に$\psi$は式から省略する。訓練後、サンプルはモデルから逆変換で取り出すことができる
$\boldsymbol{\tilde{x}}= f^{-1}(\boldsymbol{\tilde{z}};\boldsymbol{\phi}), \quad \boldsymbol{\tilde{z}} \sim p(\boldsymbol{z})$
<font color="LightSteelBlue">潜在変数zを$f^{-1}$で逆変換してサンプルxを得る</font>
特定の形の$f$に関して、最近の研究ではアフィンカップリングレイヤー(ACL)からの全単射を構築している**(Dinh et al., 2017)**<font color="LightSteelBlue">カップリングレイヤ、先のヤコビ行列の話、フローベースモデル等については**Glow: Generative Flow with Invertible 1x1 Convolutions (Kingma et.al. , 2018)** を読んだら良いっぽい。</font>

これは$\boldsymbol{x}$を平行移動とスケーリングの操作で変形する。特に、ACLは次の形を取る：

```math
f_{ACL}(\boldsymbol{x};\boldsymbol{\phi})=[exp \{s(\boldsymbol{x_d};\boldsymbol{\phi_s}) \} \odot \boldsymbol{x_{:d}} + t(\boldsymbol{x_{:d}};\boldsymbol{\phi_{t}}, \boldsymbol{x_{d:}}]
```
ここで$\odot$は要素ごとの積。この変形は最初に入力ベクトルを半分に分割する。つまりpythonのシンタックスを使えば、
$\boldsymbol{x}=[\boldsymbol{x_{:d}},\boldsymbol{x_{d:}}]$

ベクトルの後半は２つの任意のニューラルネットに入力される（紐付いたパラメータと一緒に）が、その出力は$\phi$を重みとバイアスの集まりとして$t(\boldsymbol{x_{d:}} ; \boldsymbol{\phi_{t}})$　と$s(\boldsymbol{x_{d:}} ; \boldsymbol{\phi_{s}})$と書ける。最後に、出力は、入力の最初の半分を一つのニューラルネットの出力でスケーリングして$(1)$で形成される。つまり

```math
exp \{ s(\boldsymbol{x_{d:}} ; \boldsymbol{\phi_{s}}) \} \odot \boldsymbol{x_{:d}}
```

$(2)$がニューラルネットによるスケーリング操作の結果を平行移動する。つまり

```math
(\cdot) + t(\boldsymbol{x_{d:}};\boldsymbol{\phi_{t}})
```
$(3)$は$\boldsymbol{x}$の後半を前方にコピーし、$f_{ACL}(\boldsymbol{x};\boldsymbol{\phi})$の後半にする。つまり、$f_{d:}=\boldsymbol{x_{d:}}$である。ACLはリッチな階層的変形のためにスタックされ、潜在表現$z$はこのスタックの出力である。つまり、$z_n=f(\boldsymbol{x_n}; \boldsymbol{\phi})$である。コピー操作で同じ要素が繰り返し使われないように、ACL間ではパーミュテーションの操作が必要となる。$f$を完全な変形を書くために添字なしで使用し、$\phi$はすべての構成要素のレイヤを記述するためにオーバーロードした。<font color="LightSteelBlue">この辺よくわからない。**Glow: Generative Flow with Invertible 1x1 Convolutions (Kingma et.al. , 2018)** を読んだら見直すかもしれない。</font>

このクラスの変形は体積要素が評価して１になる必要がなく、各入力$\boldsymbol{x}$について変化しうるので、**非体積保存(non-volume preserving: NVP)**として知られる**(Dinh et al., 2017)**。非ゼロではあるが、ヤコビアンのlog行列式は**tracable**である:

```math
log| \frac{\partial{\boldsymbol{f}_{\phi}}}{\partial{\boldsymbol{x}}} |= \sum_{j=d}^{D} s_j(\boldsymbol{x}_{d:};\boldsymbol{\phi}_s)
```
<font color="LightSteelBlue">tracableわからなかった。</font>
**(Dinh et al. (2015))**の先行研究で示されているように、微分同相な変形は平行移動操作だけで定義でき、この変形は**体積保存（volume preserving: VP）**である。体積の項は１であり、ゆえに尤度計算に影響がない。本論文では、定数体積(constant-volume:CV)と呼ぶフローの別のクラスを実験するが、これは体積が、保存はされないが、すべての$\boldsymbol{x}$にわたって一定である。<font color="LightSteelBlue">もしconstantを”体積一定”と約すと、保存されないのに"一定"っておかしいので、”定数”のはず。</font>
フローベース生成モデルの実装については付録A参照。

##3. 動機となった観測(MOTIVATING OBSERVATIONS)
ディープな生成モデルが進化しているので、訓練データセットと別の分布から入力が来た時のモデルの量化能力をテストしようとした。この**分布外**のデータに対するキャリブレーションは応用上必要不可欠である(もし生成モデルを識別モデルの入力をフィルタするために使っているなら)し、能動学習でも同様である。実験のため、**(Kingma & Dhariwal (2018))**で説明されているものと同じGlowアーキテクチャをFashionMNISTとCIFAR-10で訓練した(１つのGPUに収まるくらいに小さいということ以外は)。それから次元数が等しいが、異なる２つのデータセット(MNIST(28x28)とSVHN(32x32x3))のテスト分割に対する、**log尤度（値が大きいほどよい）**と**bits-per-dimension(BPD, 値が低いほどよい)**を計算した。<font color="LightSteelBlue">fashionMNISTとMNISTの次元数が等しく、CIFAR-10とSVHNの次元数が等しい。訓練したデータと同じ形状だけど別の分布からデータが来た時の能力をみようとしている</font>
モデルを訓練したデータではないので、モデルがこのデータに対して低い確率を出力することを期待している。<font color="LightSteelBlue">Glowが画像を生成すると思っていたのだが、尤度を出力するらしい。</font>
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/e98ee2d2-d9ee-f278-5663-17112a142481.png>
図１：**分布外**のテスト。MNIST, FashionMNIST, SVHN, CIFAR-10で、Glowから計算されたLog尤度(bit/次元で表記)

FashionMNISTとMNISTから始める。図１の左表が訓練データ(FasionMNIST-Train), **分布内**のテストデータ(FashionMNIST-Test), **分布外**のデータ(MNIST-Test) それぞれの平均BPD。結果は、MNISTが最も低いBPDを示しており、FashionMNISTの訓練、テストよりも1bit以上も小さい。これが平均を歪めている外れ値によるものかを確かめるため、Log尤度の(正規化された)ヒストグラムを図２(a)に示す。MNIST(赤い棒グラフ)が明らかに、システマティックにプロットの右手側にシフトしているのがわかる(最も尤度が高い)。<font color="LightSteelBlue">外れ値によるものではない。</font>

CIFAR-10とSVHNについて、図１の右表が訓練データ(CIFAR10-Train), **分布内**テストデータ(CIFAR10-Test), **分布外**データ(SVHN-Test)のBPDを示す。再び、SVHNのBPDが**分布内**のデータセット２つよりも1bit小さいという現象が見られる。図２(b)は同様のlog尤度のヒストグラムである。明らかに、SVHNの例は(赤い棒)高い尤度を持ち、結果は外れ値によるものではない。

図2の(c),(d)はCelebAとImageNetについて示している。CelebAで訓練したGlowは、それまで見たことのないSVHN(赤い棒)により高い尤度を割り当てている。同様に、ImageNetで訓練した時、GlowはSVHNのテストセット(赤い棒), CIFAR-10(黄色), CIFAR-100(緑)に高い尤度を割り当てている。SVHNのケースでは違いが非常に大きいが、CIFARに関しては普通程度である。**この現象は対称ではない。**例えば、CIFAR-10は　SVHNで訓練されたGlowについて高い尤度を持つことはない（付録の図６参照）。同様の動作は**Dinh et al. (2017)**で定義されたRNVP変換でも見られる

<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/dbbd9ade-53e2-dfcd-721c-e2c164253e93.png>
図２：Glowのlog尤度のヒストグラム。FashionMNISTとMNIST(a), CIFAR10とSVHN(b), CelebA と SVHN (c), ImageNet と CIFAR-10/100/SVHN (d)。

次に、他の一般的なディープ生成モデル(PixelCNN, VAE)でも起こるのかテストした。log尤度の評価方法がまだopen problemなのでGANは比較に含めなかった。**図３**はこれらのモデルに関する、上述と同様のヒストグラムであるが、CIFAR-10の訓練(黒)とテスト(青)と、SVHNのテスト(赤)に関して、$logp(\boldsymbol{x})$ の評価値の分布を示している。
全てのプロットで、(程度の差はあるが)以前同様に赤い棒が右側にシフトしており、訓練データと似ていない入力を検出できない現象はこれらの種類の違うモデルでも起こることがわかる。SVHNの画像がCIFAR-10のものより高い尤度を出すことは一貫している。<font color="LightSteelBlue">一貫して高いならそれで検出できなくもない気もする</font>
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/a79f8e86-5e2d-b8a8-26d0-d15e1eac64a4.png>
図3: CIFAR10で訓練し、SVHNでテスト：pixelCNNとVAEで計算されたlog尤度。VAEは**Rosca et al. (2018)**で説明されているもの。

## 4. フローベースモデルを深掘りする
CIFAR-10とSVHNでの現象をPixelCNN, VAE, Glowで見たが、ここでは可逆生成モデル(**invertible generative models**)に対象を絞る。以下の理由で実験的に制御しやすいから。:

1. VAEと違って周辺尤度を直接計算できる<font color="LightSteelBlue">これはよく理解していない。</font>
2. フローベースモデルで使う変換はヤコビアンの制約があって、それが解析を簡単にする

訓練サンプルではない(**分布外**サンプル)の尤度が高いことをさらに解析するために、変数変換式の各項の尤度への貢献具合を報告する。まず、**体積要素**がSVHNの高尤度の主要因とみられたが、定数体積フロー(**constant-volume flows**)を使ったさらなる実験でもその問題は再現した。

###変数変換の目的関数を分解する
変数変換の目的関数そのものを調べる。**分布外**入力が来たとき2つの項の両方が高い値になるのか、片方なのか。構成要素である$logp(\boldsymbol{z})$と$log |\frac {\partial{\boldsymbol{f}_{\phi}}}{\partial{\boldsymbol{x}}} |$を図4のNVP-Glowに関して報告する。
**(a)**は前者の、**(b)**は後者のヒストグラムを示している。
$p(\boldsymbol{z})$は期待通りである。赤棒(SVHN)は明らかに**左**に寄っており、潜在分布の下では尤度は低いことがわかる。<font color="LightSteelBlue">p(z)は問題ない</font>
**体積要素**を見ると、これが問題の原因のようだ。**(b)**で、SVHNのlog体積(log-volume)の評価値が著しく**右**(高い値)に寄っている。$p(\boldsymbol{z})$のSVHNの評価値がCIFAR-10より少し小さいだけだったので、結果としてSVHNは高い尤度になる。<font color="LightSteelBlue">原因は体積要素(第2項のこと)だった。</font>
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/3a6683f7-1868-fb00-5b30-311a245fe223.png>
**図4：**
(a) NVP-Glowのlog尤度の分解($log p(z)$) データはCIFAR-10とSVHN
(b) NVP-Glowのlog尤度の分解(次式)。 CIFAR-10とSVHN

```math
log |\frac{\partial{\boldsymbol{f}_{\phi}}}{\partial{\boldsymbol{x}}}|
```
(c)CV(体積一定)Glow でのlog尤度の評価値。同じくCIFAR-10とSVHN
(d)訓練中のCV-GlowのBPD。CIFAR-10で訓練、SVHNでテスト。いたるところで問題の現象が起き、早期終了させても防げないことがわかる。

###体積が犯人なのか？
上記に加えて、変数変換の目的関数は(ヤコビアンの最大化を奨励するので)<font color="LightSteelBlue">データ空間</font>$X$での変動に敏感になる。この動作は微分ベースの正則化の長い歴史と全く矛盾する。入力方向への敏感さは**減少させたい**。 例えば**Girosi et al. (1995)**と**Rifai et al.(2011)**はそれぞれ、分類器と、オートエンコーダについて、ネットワークのヤコビアンのフロベニウスノルムにペナルティを科すことを提案している。<font color="LightSteelBlue">フロベニウスノルムについては[こちら](https://mathtrain.jp/frobeniusnorm)参照。$L^2$ノルムに似ている</font>

体積項を実験的に制御するため、Glowを定数体積変換**(constant-volume (CV) transformations)**で訓練した。アフィンレイヤを平行移動だけを使うように変更したが(**Dinh et al.,2015**)、1x1convolutionはそのまま。logヤコビアン(log-determinant-Jacobian)は$HW \sum_{k} log |\boldsymbol{U_k}|$となる。ここで$|\boldsymbol{U_k}|$はk番目のフローに関する畳み込みの重み$\boldsymbol{U_k}$の行列式。これにより体積要素はすべての$\boldsymbol{x}$で定数になり、その効果を独立できる。<font color="LightSteelBlue">体積要素がxの変数じゃないってことを言ってる</font>
これをCV-Glow（constant-volume Glow)と呼ぶ。図４の**(c), (d)**が結果。**(c)**は$logp(\boldsymbol{x})$のヒストグラム。図２同様、SVHN（赤）が訓練データCIFAR-10より高い尤度。**(d)**はCV-Glow訓練中のSVHNとCIFAR-10のBPD。曲線に交差する箇所がない。

###その他の実験(ランダム、定数画像、アンサンブル)
**(Sønderby et al., 2017; van den Oord et al., 2018)**は生成モデルが定数の入力に高い尤度を割り当てると言っている。これについて実験し、付録の図８にNVP-GlowでのBPDを示した。定数は本論文のモデルでも高い尤度であることが確認できた。ランダム入力との比較も行った。

パラメータを平均すれば問題の現象は軽減できるという仮説を立てた。パラメータ空間全体で積分するのが理想的だが、Glowにとっては解析的にも、計算量的にも難しい。**Lakshminarayanan et al. (2017)**は離散のアンサンブル<font color="LightSteelBlue">(複数モデルの出力の平均)</font>が異常な入力に対する過剰な確信を防ぎ、かつ実装しやすいことを示している。これを採用して、Glowモデルを５個独立に訓練し、そのテストデータに対する尤度を平均することにした。多様性のために各モデルはパラメータの初期値が異なる。付録の図９はアンサンブルで平均した$logp(\boldsymbol{x})$のヒストグラム。結果は以前とほぼ同じ。
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/2058ce40-a572-7921-a9f9-a6a45de13b9c.png>
**図9**

<font color="LightSteelBlue">つまり平均しても問題は解決しなかった。</font>

##5. 二次の解析
log尤度の期待値の差を**線形化する**ことで、この現象をさらに解析する。<font color="LightSteelBlue">線形化：与えられた点での、対象の関数の線形近似を求めること。ここではテイラー展開のことを言っている</font>
いずれも$X$上に台を持つ２つの分布を考える：
<font color="LightSteelBlue">台：ある関数の出力が０にならないような入力の集合。ここではGlowが0じゃない尤度を割り当てることができる入力データで構成されたデータセットの分布という意味だと思う。</font>

* 訓練分布$\boldsymbol{x} \sim p^*$
* それと似ていない分布$\boldsymbol{x} \sim q$

生成モデルを$p(\boldsymbol{x};\boldsymbol{\theta})$として、敵対する分布$q$は$\mathbb{E_{q}} [log p (\boldsymbol{x};\boldsymbol{\theta})] - \mathbb{E}_{p^*} [log p (\boldsymbol{x};\boldsymbol{\theta})] > 0$ 
のときに訓練データの分布よりも高い尤度を持つ。これは直接解析しづらいので、内点x<sub>0</sub>でlog尤度の二次の<font color="LightSteelBlue">テイラー</font>展開を行う。

```math
log p(\boldsymbol{x};\boldsymbol{\theta}) \approx  log p(\boldsymbol{x_0};\boldsymbol{\theta}) + \nabla_{x_0} log p(\boldsymbol{x_0};\boldsymbol{\theta})^{T} (\boldsymbol{x}-\boldsymbol{x_0}) + \frac{1}{2} Tr \{ \nabla_{x_0}^{2} log p(\boldsymbol{x_0};\boldsymbol{\theta}) (\boldsymbol{x}-\boldsymbol{x_0})^{T} \}

```
これを両方の尤度に適用し、期待値を取り、共通項をキャンセルしたものが次式。

```math
\begin{align}
0 &\lt \mathbb{E_{q}} [log p (\boldsymbol{x};\boldsymbol{\theta})] - \mathbb{E}_{p^*} [log p (\boldsymbol{x};\boldsymbol{\theta})] \\
&\approx \nabla_{x_0} log p(x_0;\boldsymbol{\theta})^{T} (\mathbb{E_q}[\boldsymbol{x}]-\mathbb{E_p^{*}}\boldsymbol{x}) + \frac{1}{2} Tr \{ \nabla_{x_0}^{2} log p(\boldsymbol{x_0};\boldsymbol{\theta}) (\boldsymbol{\sum_q}-\boldsymbol{\sum_{p^*}}) \} \tag{4}
\end{align}
```
<font color="LightSteelBlue">ここは言ってる通り変形すれば行けそう</font>
ここで$\boldsymbol{\sum}=\mathbb{E}[(\boldsymbol{x}-\boldsymbol{x_0})(\boldsymbol{x}-\boldsymbol{x_0})^{T}]$は共分散行列であり、$Tr \\{ \cdot \\}$はトレース。展開が正確なのは$x_0$の周辺のみなので、次に$\mathbb{E_q}[\boldsymbol{x}]=\mathbb{E_p^{\*}}[\boldsymbol{x}]=\boldsymbol{x_0}$を仮定する。これは強い仮定に見えるが、モデルに入力する前にデータは中心化されるので、それほど実際とかけ離れたものではない。特にSVHNとCIFAR-10についてはこの仮定が成立していた。**図5(a)**はCIFAR-10(緑)とSVHN(オレンジ)の各軸の経験的な平均。SVHNの平均はすべてCIFAR-10の範囲に入っており、どの軸同士で差をとっても最大38以下だった。<font color="LightSteelBlue">CIFAR-10とSVHNの平均画像が似たような感じだった。</font>
平均が等しいとして次式を得る：

```math
\begin{align}
0 &\lt \mathbb{E_{q}} [log p (\boldsymbol{x};\boldsymbol{\theta})] - \mathbb{E}_{p^*} [log p (\boldsymbol{x};\boldsymbol{\theta})] \\
&\approx \frac{1}{2} Tr \{ \nabla_{x_0}^{2} log p(\boldsymbol{x_0};\boldsymbol{\theta}) (\boldsymbol{\sum_q}-\boldsymbol{\sum_{p^*}}) \} \\
&= \frac{1}{2} Tr \bigl\{ \bigl[ \nabla_{x_0}^{2} log p_z(f(\boldsymbol{x_0};\boldsymbol{\phi})) + \nabla_{x_0}^{2} log | \frac{ \partial{ \boldsymbol{f_{\phi}}}}{\partial{\boldsymbol{x_0}}}| \bigr](\boldsymbol{\sum_q}-\boldsymbol{\sum_{p^*}}) \bigr\} \tag{5}
\end{align}
```
<font color="LightSteelBlue">平均が等しいので(4)式の２行目第１項が消えて、第二項のlogp()を展開した</font>
２行目は生成モデルがフローベースであると仮定している。

###CV-Glowの解析
$(5)$式をCV-Glowの解析に使い、尤度の違いがモデル曲率とデータの二次モーメント<font color="LightSteelBlue">(分散)</font>で説明できるかどうかを見る。二階微分の項は球状潜在密度(**spherical latent density**)でCV-Glowをすごくシンプルにする。
<font color="LightSteelBlue">球状潜在密度: 潜在変数を白色化する、みたいな意味だろうか？あとモデル曲率もわからない。</font>
入力チャネル数C, フローのインデックスkとして、C x Cのカーネル$\boldsymbol{U_k}$があり、微分は$\frac{\partial{f_{h,w,c}}}{\partial{x_{h,w,c}}}=\prod_k \sum_{j=1}^{C} u_{k,c,j}$で表す。hとwは高さと幅、jはk番目のフローの1x1convolutionカーネルのカラム。二階微分は、$\frac{\partial^2{f_{h,w,c}}}{\partial{x_{h,w,c}^2}}=0$なので、

```math
\begin{align}
Tr &\{ \nabla_{x_0}^{2} log p(\boldsymbol{x_0};\boldsymbol{\theta}) (\boldsymbol{\sum_q}-\boldsymbol{\sum_{p^*}}) \} \\
&=\frac{\partial^2}{\partial{z^2}} log p(\boldsymbol{z};\boldsymbol{\psi}) \sum_{c=1}^{C} \bigl(\prod_{k=1}^{K} \sum_{j=1}^{C} u_{k,c,j} \bigr)^2 \sum_{h,w}(\sigma_{q,h,w,c}^{2} -\sigma_{p^*, h,w,c}^2)
\end{align}
```

導出は付録G。**(Dinh et al., 2015;2017; Kingma & Dhariwal, 2018)**に従い、フローモデルで一般的な潜在分布であるガウシアンのlog密度の二階微分と経験的な分散に代入して、次式を得る。

```math
\begin{align}

\mathbb{E}_{SVHN} &[log p(\boldsymbol{x};\boldsymbol{\theta})] - \mathbb{E}_{CIFAR10}[log p(\boldsymbol{x};\boldsymbol{\theta})] \\
&\approx \frac{-1}{2 \sigma_{\psi}^{2}}[\alpha_{1}^{2} (49.6 -61.9) + \alpha_{2}^{2} (52.7-59.2) +\alpha_{3}^{2} (53.6 -68.1)] \\
&= \frac{1}{2 \sigma_{\psi}^2}[\alpha_1^2 \cdot 12.3 + \alpha_2^2 
 \cdot 6.5 + \alpha_3^2 \cdot 14.5 ] \geq 0  \tag{6} \\
&where  \quad \alpha_c = \prod_{k=1}^K \sum_{j=1}^C u_{k,c}

\end{align}
```
$\sigma_{\psi}^2$は潜在分布の分散。最後の行の式が0以上なので、すべての$\alpha_c^2 \geq 0$である。等号成立は$\sigma_{\psi}^2 \rightarrow \infty$ または、起こりそうにないが、すべての畳込みカーネルのすべてのチャネルで一つ以上すべて0の行が存在する時。したがって、今導出した二次式はSVHNがCIFAR-10よりも高い尤度を出すことをすでに予測している。<font color="LightSteelBlue">SVHNの尤度の期待値からCIFARのを引いて、結果が常に0以上だから。</font>
さらに、式が非負であることを強調するためにCV-Glowのパラメータを定数にしているが、これはGlowのアンサンブルが単体とほとんど同じ尤度差になり、**(図9)**その差が訓練中相対的に一定だった**(図4b)**ことを裏付けている。さらに、$\frac{\partial^2 log p(\boldsymbol{z};\boldsymbol{\psi})}{\partial{z^2}}$ は、いかなる**log-concaveな密度関数**についても負になり、潜在密度をラプラスやロジスティックに変えても結果が変わらない。<font color="LightSteelBlue">concaveな関数pはlogとってもconcaveで、２回微分して負だから？潜在密度はzのことで、z=f(x)なんだと思う。このfを変えても結果が同じっていうことかな?</font>

結論として、SVHNは単にCIFAR-10の**内部**に位置しており(平均がほぼ同じで分散が小さい)、ゆえに尤度が高くなる。これは**図2の(c)(d)**でも成立する。**図5(a)**で、ImageNet, CIFAR, SVHNはほとんど平均が重なっており、ImageNetが最も分散が大きい。よって、SVHNとCIFARはImageNetで訓練したモデルでImageNetよりも高い尤度になると予想できるが、これは**図2(d)**で見たことと一致している。さらに、尤度差の程度は分散の差と合致する。SVHNは明らかに分散が最も小さく、尤度が最も大きい。つまり、**分散を小さくすることで人為的に尤度を上げることができる。**RGB画像では、分散を小さくすることは**グレー化**(ピクセルの値を128に近づける)することと等しい。**図5(b)**は、これを行ってCIFAR-10とSVHNの両方で尤度が大きくなったことを示す。潜在変数の分散をへらすこともこれと同じ効果を持つ(付録の図12)。
<img src=https://qiita-image-store.s3.amazonaws.com/0/296108/9b6e0a9a-142b-8550-e9b9-42f980c026bf.png>
**図5：**経験分布とグレー化。ピクセル値は0-255を256で除して0-1に変換している。

##6.関連研究 
本論文は最近の生成モデルの評価に関する研究の多くにインスパイアされている。

* **Theis et al. (2016)**：高い尤度が、見た目的に良いサンプルを生成するのに**必要でも十分でもない**ことを示した。**分布外**入力には言及なし
* **Szegedy et al., 2014**:敵対的入力(気づかれないほど小さい修正でモデルが正しく機能しなくなる入力)に関する研究
* **Tabacof et al. (2016)** , **Kos et al. (2018)**: 生成モデルに対する Adversarial attack
* **Hendrycks & Gimpel, 2017; Lakshminarayanan et al., 2017; Liang et al.,2018**: 識別モデルが**分布外**の入力に対して高確信度で誤ることを報告している。

著者らが知る限り、生成モデルのロバスト性については研究されていない。
本研究と同時にディープ生成モデルの異常検知能力をテストした研究がある

* **Shafaei et al. (2018)**:PixelCNN++が信頼できる検出に使えないことを示した。フローベースについては言及していない。
* **Škvára et al. (2018)** VAEとGANをkNN(k近傍法)と実験的に比較し、VAEとGANは、既知の外れ値をハイパラ選択に使用できるときのみ、kNNを超えることを示した。

本研究と最も類似するのは

* **Choi & Jang (2018)**: Glowに関するCIFAR-10 vs SVHNの問題を報告(本研究と独立に、*動機となった観測*を確認した)。対策として、生成モデルのアンサンブルをadversarial objectiveで訓練し、アンサンブル経由で渡辺-赤池情報量基準(WAIC)を計算することでテストする方法を提案している。本研究が現象の原因理解が目的だが、彼らは検出手法の提供を目的としており、相補的な研究である。アフィンカップリングレイヤを使用しており、NVP(非体積保存)になるため、**CV-Glowの解析**の(6)式の結果は彼らのモデルには当てはまらない。

##7. 議論
Glow **(Kingma & Dhariwal, 2018)**とその前身であるRNVP flow **(Dinh et al., 2017)**は生成物がはっきりしている、周辺尤度の直接計算、というメリットがある。しかし、本文で示したように、**訓練分布外**の入力で使用する場合、尤度単体では訓練集合か、それに似た入力かを特定できない。さらに、５章の解析で示したように、パラメータ設定や潜在密度の選択にかかわらず、(定数体積flowの場合は)、SVHN vs CIFAR-10の問題がついて回る。**モデルは高レベルの意味ではく、低レベルのstatisticsを見ているらしい。**これがディープ生成モデルの病とは言わないが、改善の必要がある。これは容量に関係なくどんな生成モデルにも問題になりうる。したがって、**分布外**の入力に対する敏感さがより理解できるまでは、生成モデルの利点を主張しすぎないことが必要である。


#本記事のまとめ

* 現在のディープ生成モデルによる尤度を、入力が訓練データからか、そうでないかの判定には使えない。（間違う）

##展望

* Glowを読む