深層学習 学習まとめ: 生成モデル

## 識別モデルと生成モデル
- 機械学習/深層学習モデルは入力･出力の目的で分類できる
    - 識別(discriminative, backward)
        - データを目的のクラスに分類する
        - データ→クラス
        - $ p(C_k \vert \boldsymbol{x}) $を求める
            - あるデータ$\boldsymbol{x}$が与えられたという条件のもとでクラス$C_k$である確率
    - 生成(generative, forward)
        - 特定のクラスのデータを生成する
        - クラス→データ
        - $ p(\boldsymbol{x} \vert C_k) $を求める
            - あるクラス$C_k$に属するという条件のもとでのデータ$\boldsymbol{x}$の分布
- 識別モデル
    - 具体的なモデルの例
        - 決定木
        - ロジスティック回帰
        - SVM
        - ニューラルネットワーク、など
    - 高次元から低次元に圧縮することになる
        - 必要な学習データは少ない
    - 画像認識などに利用される
- 生成モデル
    - 具体的なモデルの例
        - 隠れマルコフモデル
        - ベイジアンネットワーク
        - 変分オートエンコーダー(VAE)
        - 敵対的生成ネットワーク(GAN)、など
    - 低次元から高次元に拡張することになる
        - 必要な学習データは多い
    - 画像の超解像やテキスト生成などに利用される
- 識別器(Classifier)の開発アプローチ
    - 生成モデル
        - $ p(\boldsymbol{x} \vert C_k) $を推定した上で、ベイズの定理で、$ p(C_k \vert \boldsymbol{x}) $を求める
    - 識別モデル
        - $ p(C_k \vert \boldsymbol{x}) $を推定する
    - 識別関数
        - 入力値$ \boldsymbol{x} $を直接クラスに写像(変換)する関数$ f(\boldsymbol{x}) $を推定
        - 確率は計算されない(決定的な識別)


# 生成モデル

## 自己符号化器(Auto Encoder)
- 教師なし学習の一つであり、学習時の入力データは訓練データのみで教師データは利用しない
- 構造
    - 入力データから潜在変数zに変換するニューラルネットワークをEncoder、逆に潜在変数zをインプットとして元画像を復元するニューラルネットワークをDecoderとする
        - 間にzをはさみつつ、入力と出力が同じになるような学習をする(入力層と出力層のノード数が同じ)
        - zの次元が入力データより小さいため、次元削減となる
    - 出力層の活性化関数は恒等写像

## 変分自己符号化器(Variational Auto Encoder, VAE)
- 通常のオートエンコーダーの場合、何かしら潜在変数zにデータを押し込めているものの、その構造がどのような状態かわからない
- VAEはこの潜在変数zに正規分布(ガウス分布): 確率分布z~N(0, 1)を導入したもの
    - データを潜在変数zの確率分布という構造に押し込めることを可能にする
- 元のデータが似ていればzも似たようなベクトルになるような学習がなされる
- 損失関数は以下の通り
    - $ L = -\mathbb{E}_{\boldsymbol{z} \sim p(\boldsymbol{z} \vert \boldsymbol{x})} \lbrack \log p(\boldsymbol{x} \vert \boldsymbol{z}) \rbrack $
        - $ + D_{KL}(p(\boldsymbol{z} \vert \boldsymbol{x}) \Vert p(\boldsymbol{z}))$
        - うまくパースできないので二行になっているが、本来は上記二行で損失関数の定義となる
        - 第一項は復元誤差(reconstruction error)であり、入力と出力の差を小さくする
        - 第二項は非負の正則化項であり、エンコーダーが出力する潜在変数$ \boldsymbol{z} $の分布を$ \boldsymbol{z} $のモデル分布(中心が$ 0 $、標準偏差$ σ $)に近付ける
- エンコーダーとデコーダーの間には潜在変数のサンプリング処理が入るため、入力層の変数まで誤差逆伝播を行うことが困難となるが、Reparameterization Trick（再パラメータ化トリック）という手法で解決する
    - エンコーダー層によってサンプリングに利用する変数$ μ, σ $を出力するが、新たにサンプリング変数$ ε $を導入し、潜在変数$ \boldsymbol{z} $を、$ \boldsymbol{z} = μ + εσ &ensp; (ε \sim N(0, I)) $と再定義する
    - これにより、誤差逆伝播法を利用して入力層の変数まで最適化が可能となる
- 学習に際しては、ノイズを加えた状態でzを生成する
    - これによって汎用性が高くなる

## VQ-VAE (Vector Quantised-VAE)
- VAEの派生技術
- 自然界の様々な事物の特徴を捉えるには離散変数の方が適しているという発想から、潜在変数zが離散的な数値となるように学習が行う
    - これによって従来のVAEで起こりやすいとされるposterior collapse(VAEをPixel CNNなどの強力なデコーダーと組み合わせた時に、潜在変数がデータの特徴をうまく捉えることが出来なくなる現象)の問題を回避する
- EncoderとDecoderの間に、Encoderの出力を離散的な潜在変数に対応させるベクトル量子化処理(VQ: Vector Quantization)を行う
- Encoderの出力$\boldsymbol{z_e}(\boldsymbol{x})$と、予め用意しておいた埋め込みベクトル(embedding vector)とのユークリッド距離を計算し、最も距離が近い(=最も似ている)埋め込みベクトルに置き換える
    - $ \boldsymbol{z_q}(\boldsymbol{x}) = \boldsymbol{e_k}, where &ensp; k = argmin_j \Vert \boldsymbol{z_e}(\boldsymbol{x}) - \boldsymbol{e_j} \Vert _2 $
    - ここで$\boldsymbol{e_k}$は最も距離が近い埋め込みベクトル
- VQ-VAEを階層構造にすることでさらに高解像度画像を生成できるようにしたVQ-VAE2と呼ばれる技術も開発されている

## GAN(Generative Adversarial Nets)
- Generator(生成器)とDiscriminator(識別器)を競わせて学習する生成&識別モデル
    - Generator: 乱数からデータを作成
        - 乱数$ \boldsymbol{z} $から$ G(\boldsymbol{z}) $を生成するように学習する
    - Discriminator: 入力データが真データ(学習データ)であるかを識別
        - 入力が$ G $が生成したサンプル$ G(\boldsymbol{z}) $であるか、あるいは訓練データ$ \boldsymbol{x} $であるか判断できるように学習する
        - 出力は、入力が訓練データ$ \boldsymbol{x} $である確率
- Dは正しく判別したいし、GはDに誤判断させたいという2プレイヤーのミニマックスゲーム
    - 一人は自分の勝利する確率を最大化する作戦を取る
    - もう一人は相手が勝利する確率を最小化する作戦を取る
- GANでは価値関数$V$に対し、Dが最大化、Gが最小化を行う
    - $ \underset{G}{min} &ensp; \underset{D}{max} V(D, G) =  $
        - $ \mathbb{E}_{\boldsymbol{x}\sim p _{data}(\boldsymbol{x})}[\log D(\boldsymbol{x})] + $
        - $ \mathbb{E}_{\boldsymbol{z}\sim p_z(\boldsymbol{z})}[\log (1- D((G(\boldsymbol{z}))] $
        - $ \boldsymbol{z} $が乱数(Gへの入力)、$G(\boldsymbol{z})$は生成データ
        - $ \boldsymbol{x} $が真データ(Dへの入力)
        - $ p_z(\boldsymbol{z}) $はGの入力である乱数が従う確率分布
        - $ p _{data}(\boldsymbol{x}) $は、訓練データの従う確率分布
        - 第一項は本物のデータに対して識別器が本物であると判断する確率の対数の期待値
        - 第二項は生成器の出力である偽のデータに対して識別器が偽物であると判断する確率の対数の期待値
    - バイナリークロスエントロピーと同様な発想
        - $ L = -\sum y \log \hat{y} + (1-y) \log (1 - \hat{y})$
        - 真データを扱う時($y=1$)は、第一項が残り、生成データを扱う時($y=0$)は第二項が残る
- 最適化手法
    - Discriminatorの更新
        - Generatorのパラメーター$θ_g$を固定
        - 真データと生成データをm個ずつサンプル
        - $θ_d$を勾配上昇法(Gradient Ascent)で更新(Dは価値関数を最大化しようとしているので「上昇法」)
            - $ \dfrac{∂}{∂θ_d}\dfrac{1}{m}[\log[D(\boldsymbol{x})] + \log[1 - D(G(\boldsymbol(z))]] $
    - Generatorの更新
        - Discriminatorのパラメーター$θ_d$を固定
        - 生成データをm個ずつサンプル
        - $θ_g$を勾配降下法(Gradient Descent)で更新
            - $ \dfrac{∂}{∂θ_g}\dfrac{1}{m}[\log[1 - D(G(\boldsymbol(z))]] $
    - Discriminatorの更新を複数回行うごとに、Generatorの更新を1回行う(毎回ペアで行うわけではない)
    - 生成データと真データがそっくりな状況とは、$p_g = p_{data}$
        - この時に価値関数が最適化されており、$ \underset{G}{min} V$は最小値となっている
        - 最適な生成器と識別器の両方が得られた場合、識別器の出力は真のデータか生成データかを識別する閾値、すなわち$ 0.5 $となる

## DCGAN(Deep Convolutional GAN)
- GANを利⽤した画像生成モデル
    - GANは優れた生成能力を持つが、学習が容易ではない
    - DCGANでは、GANの枠組みをCNNに適用し、学習を安定化させるためのテクニックを採用している
- いくつかの構造制約により生成品質を向上
    - Generator
        - Pooling層の代わりに転置畳み込み層(Transposed Convolution)を使用し、乱数を画像にアップサンプリング
        - 最終層はtanh関数(-1~1)、その他はReLU関数で活性化
    - Discriminator
        - Pooling層の代わりに畳み込み層を使用
        - Leaky ReLU関数で活性化、最終層はsigmoid関数(0~1)
    - 共通事項
        - 中間層に全結合層を使わない
        - バッチ正規化を適用
- 応用技術
    - Fast Bi-layer Neural Synthesis of One-Shot Realistic Head Avatars: 1枚の顔画像から動画像(Avatar)を高速に生成するモデル
        - 初期化部と推論部からなる
            - 初期化: ⼈物の特徴を抽出、1アバターにつき⼀回の計算コスト
            - 推論: 所望の動きを付ける、時間フレーム分だけの計算コスト
        - 初期化の計算コストは重いが、推論の計算コストが小さいのでリアルタイムで推論できる
            - 推論部は緻密な輪郭と粗い顔画像を別々に生成し結合することで、計算コストを下げている

## Conditional GAN(CGAN)
- GANの生成したいデータに条件をつける
    - 条件はラベルで指定(例: 「犬」という条件で犬の画像を生成する)
- 基本的なネットワークはGANと同様
    - ただし、DおよびG双方に新しい入力(条件パラメーター)が追加となる

## pix2pix
- CGANと同様の考え方
- 条件としてラベルではなく、画像を用いる
    - 条件画像が入力され、何らかの変換を施した画像を出力する
    - つまり、画像の変換方法を学習
- 条件画像xと真の何らかの変換が施された画像yのペアが学習データとなる
- CGANと同様に、DおよびG双方に新しい入力(条件画像)が追加となる
- pix2pixにおける工夫
    - GeneratorでU-Netを使用し、物体の位置を抽出
        - U-Netはセマンティックセグメンテーションを実現するEncoder-decoder
            - スキップ接続で物体の位置情報をDecoderに伝達し、連結する
    - 損失関数にL1正則化項を追加
        - 画像の高周波部分(色の変化が顕著な部分)を学習し、Generatorが生成した画像がぼやけることを防ぐ
    - PatchGAN
        - 条件画像をパッチに分けて，各パッチにpix2pixを適応
            - 正確な高周波成分の強調による視覚的一致性の向上
            - L1正則化項の効果を向上

## その他のGANモデル
- LAPGAN (Laplacian Pyramid of Generative Adversarial Networks)
    - CNNを使ったモデルで、低解像度の画像を学習し、徐々に高解像度の画像を学習するような多段構造のネットワークを作成することで、高解像度の画像を作成することに成功した
    - 初めは画像を生成するモデルとして発案されたが、近年では動画や音楽などのタスクにも応用されている
- ACGAN (Auxiliary Classifier Generative Adversarial Network)
    - Generatorに入力ノイズとしてのベクトルと入力画像のクラス情報を同時に与え、Discriminatorが生成画像の真偽に加えてクラスの判別も行う