生成モデルについて (E資格対策)

では書きます。



#識別モデルと生成モデル

分類をする際に2つのモデルがあります。1つは識別モデル、もう1つは生成モデルです。どのような違いがあるのでしょうか。

##識別モデル
まず識別モデル。識別モデルはデータが分かれる境界線を求めるモデルを指します。
たとえば下の図のようなデータがあったとします。
![databunp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/da72fa28-165d-0920-753e-6a905b6591c9.png)

境界線を求めるようなイメージです。

![sikibetu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/f240902d-e8a4-ac21-1ccb-bd5849bee6ab.png)

それぽくかくなら
データxがクラスyに属する確率P(y|x)をモデル化し、argmaxP(y|x)となるyを推論する。
です。


##生成モデル
未知データは与えられたデータから元のデータ分布を推定するモデルを指します。

![seisei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/f12a228a-9f51-e65e-8d60-19855a444d50.png)

生成モデルP(x|y)を考えて、argmaxP(x|y)P(y)となるyを推論するモデルです。
新しいデータを作れるのがメリット、DeepLearningを使った生成モデルはVAEとGANの2つが主流です。

#オートエンコーダー
教師なし学習器の1つ。特徴は以下の3つです。

1.入力と同じ出力
2.再構成ロス(Reconstruction Error)を使う
3.隠れ層は入力出力層より少なくする(under complete)

![AutoEncoder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/63fd951b-84cf-84bc-2da8-7d3c5c9cb52f.png)

引用：https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%80

学習データのノイズ除去、異常検知の異常個所特定、クラスタリングなどに使われます。

ここで問題点があります。
隠れ層が入出力層より少ないので、扱える情報が減ります、なぜ復元ができるのでしょうか。

##多様体
そこで多様体という考え方をします。
n次元の情報が観測時にm次元になっているという考えです。
mnistであれば784次元を2次元で表せそうじゃない、つまり一部に情報が集中しているからその情報使えば情報を少なくして表現できるよねってこと。
結果として情報圧縮のような効果が得られます。

##VAE(Variational Auto Encorder)
学習データを与えるとその学習データに似ているデータを生成する手法。
先ほどの多様体の考え方であれば中間層の潜在変数はN次元のガウス分布であると仮定します。
そのガウス分布から変数zをランダムに取ってきます。

![21_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/22ecc6f9-3711-8703-82cd-a403804d1eb3.png)

引用：https://products.sint.co.jp/aisia/blog/vol1-21

しかしVAEにも問題があって、zをランダムにとってくるのでBPができません。


###Reparametrization Trick
そこで標準正規分布(平均0、分散1)からランダムサンプリングした値を分散にかけて出力していると仮定してBPをします。
この手法をReparametrization Trickといいます。

![https___qiita-image-store.s3.amazonaws.com_0_50670_3b5d2d6b-090e-8417-386c-1324c77fe2bc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/11cb8449-56ed-5bda-2094-d61cbee369f8.png)

引用：https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24

###損失関数

```math
\begin{align}
h &= D_{KL}[q(z|x)||p(z)-E_{q(z|x)}[logp(x|z)] \\
&= D_{KL}[q(z|x)||p(z)+\beta||Y-X||^2 \\
&= D_{KL}[N(\mu (x),\sum(x))||N(0,1)]+\beta||Y-X||^2 
\end{align}
```

なんだかわからないので詳細を
$D_{KL}[N(\mu (x),\sum(x))||N(0,1)]:$Encorderが求めた正規分布が平均0分散1の標準性分布に近いか
$\beta||Y-X||^2 :$入出力間との復元誤差

つまり求めた分布と入出力の差どちらも考慮します。

#GAN

VAEでも画像生成は可能ですが、位置がずれると損失が増えるため、ぼやけて出力されます。そこでGANを使います。
GANとはDiscriminator(判別)とGenerator(データを作る側)の2つあり、Generatorが本物のデータに近いデータを作り、Discriminatorが本物か偽物か判別するものです。互いに切磋琢磨するイメージです。



![is20tech001zu004-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/e8251c2d-2abf-dea8-e301-9c30f59f956b.jpeg)

引用:https://www.imagazine.co.jp/gan%EF%BC%9A%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E3%80%80%EF%BD%9E%E3%80%8C%E6%95%99%E5%B8%AB/


##GANのメリット

VAEはピクセルの一致度を見ますが、GANでは見ないのでぼやけない
BPで更新できるため近似に必要な個所がない



##GANのデメリット
学習が難しいです。
GeneratorとDiscriminatorのいたちごっこが大事なのですがどちらかが一方的に強すぎると学習が進まなくなります。

###Mode Collapse(モード崩壊)
出力の多様性が失われ、何を入力しても同じような出力しか得られない状態を指します。
対策として
・Minibatch Discrimination
・Wasserstein GAN


###Minibatch Discrimination
DiscriminatorがGeneratorのデータをまとめて確認し、学習が進んでいるかどうか見る手法。


###Wasersteim GAN(Earth-Mover Distance)
GANは分布の距離にJSDivergenceを用いて値を小さくしますが、分布が重なっていない場合値が定数となり学習が進みません。
そこで分布を山と捉え、どれくらい砂を運ばなければならないかを考えたのがこの手法です。
これによって学習が進むようになりました。



###損失関数

$$
min_G~max_DC(D,G)=E_{x\sim pdata(x)}[logD(x)]+E_{x\sim px(x)}[log(1-D(G(z)))]
$$

です、各項を説明いたします。

$D(x):$入力データが学習データからきている確率(D(x)=1:学習データ、D(x)=0:Gから生成したデータ)
$P(x):$任意の分布
$x\sim pdata(x):$学習データの分布に従うデータ
$x\sim px(x):$Gから生成された出力の分布に従うデータ
$E(x):$期待値

$G:$最小化
$D:$最大化

$E_{x\sim pdata(x)}[logD(x)]:$学習データが与えられたらD(x)を大きく、
$E_{x\sim px(x)}[log(1-D(G(z)))]:$偽のデータが入ったときはなるべく小さくします。


##GANの種類

いかにGANの例をいくつかご紹介します。



###Unrolled GAN
DiscriminatorをK回学習した勾配でGeneratorを学習する手法。
GはDのK回先取りした結果を使うため学習バランスが取れやすい。

###Pix2Pix
画像のペアを与えると変換方法を学習する手法
GeneratorにUnetを用いています。



###Progressive GAN
画像を段階的に大きくする手法

###Stack GAN
テキストから画像生成する手法

###Cycle GAN
大量の写真から大量の写真への変換方法を学ぶ手法


###Star GAN
1つのモデルで複数の変換方法を学ぶGAN
髪の毛の色、サングラス、女性化などを1つのモデルでやります。

###Conditional GAN
GeneratorとDiscriminatorの各入力にラベル情報を混ぜて渡す手法。



##DCGAN(Deep Convolutional Generative Adversarial Networks)
きれいな画像を生成するテクニック集です。

・バッチ正則化を使う




Discriminator:
・poolingはせず、stride=2の畳み込みをする
・Leaky ReLU($\alpha=0.2$)を使う

Generator:
・Deconvolutionを使う
・FC層をなくしてGlobal Average Poolingにする
・RelUを使い、出力層だけtanhにする


ここまで。


参考文献
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24
https://products.sint.co.jp/aisia/blog/vol1-21
https://www.imagazine.co.jp/gan%EF%BC%9A%E6%95%B5%E5%AF%BE%E7%9A%84%E7%94%9F%E6%88%90%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E3%80%80%EF%BD%9E%E3%80%8C%E6%95%99%E5%B8%AB/