はじめに
「深層生成モデルを巡る旅」シリーズ第3回はみなさんお待ちかねの(?)GANです.
GANは綺麗な画像を生成することに長けており, その人気はFlowやVAEと比べても圧倒的です. その一方で, 世にはGANの研究があふれていて, 画像生成に限っても把握するのが困難な状態になっています. 本記事では, 元祖から最新の研究に至る歴史の中で重要と思われるものをジャンル別に紹介したいと思います.
今回も画像生成のみを扱います.
GANの基本
GANそのものについての解説は日本語のものに限っても既に多数あるので, ここでは簡単に触れることとし, 後に続く各手法の紹介に集中したいと思います. ご存じの方は飛ばしてください.
全体像
A Beginner's Guide to Generative Adversarial Networks (GANs) | Skymind
GANは生成器(Generator)と識別器(Discriminator)という2つのニューラルネットからなります.
生成器はランダムなノイズ画像から偽物の画像を生成し, 識別器は画像が教師データに含まれる「本物」か否かを判定します.
式で表すなら, 生成器は識別器の正解率を最小化するように, 識別器は正解率を最大化するように学習していきます.
ここで, は教師データからサンプルしたデータ, はランダムノイズ, はから生成したデータです. はが本物(教師データからのサンプル)であると判断する確率で, はが本物でないと判断する確率です.
目的関数を, について最大化, (を固定して)について最小化, と交互に繰り返して両者の性能を高めていきます. 「切磋琢磨」のイメージです.
以上のように, イメージするのはそれほど難しくありませんが, 2つのニューラルネットを交互に訓練して最適解に至るのが難しそうですよね.
実際, 一方のモデルが悪いままもう一方が強化されてうまくいかないというような問題が起きやすいそうです.
VAE・Flowとの比較
ここで, 第1回の図をもう一度見てみましょう.
Flow-based Deep Generative Models.
VAEやFlowと比較した時のGANの最大の特徴は, Encoderを持たないことです.
代わりに, 識別器を設けて生成器の教師信号に使っています. Encoder-Decoderによる再構成ではなく, このような形である種の官能評価を実現することで, GANは「実際にありそうな画像」を生成することに非常に長けています.
一方, 密度推定を行わないためデータセットに含まれる一部のモードが無視されてしまうモード崩壊が起きやすいです(極端な例だと, MNISTで特定の数字ばかり生成するなど). また, 識別器が強くなりすぎて生成器が学習できないなど, 学習の安定性にも課題があります.
様々なGAN
20種類の重要なGANたちを, 「画像品質」「学習方法」「生成画像の操作」「画像変換」「その他の応用」という軸で分けてみました(独断と偏見です).
画像品質
最初は, 花型とも言える画像品質を向上させる研究を見ていきましょう.
もう1年前になってしまいますが, GANの父であるGoodfellowがこの節で書きたいことをだいたいまとめてくれています.
4.5 years of GAN progress on face generation. https://arxiv.org/abs/1406.2661 https://arxiv.org/abs/1511.06434 https://arxiv.org/abs/1606.07536 https://arxiv.org/abs/1710.10196 https://arxiv.org/abs/1812.04948
画像は左から順にGAN, DCGAN, Coupled GAN, PGGAN, StyleGANです.
"Vanilla" GAN [Goodfellow+, 2014]
元祖GANは先に説明した通りなので, 生成結果のみを示します.
それぞれの画像において, 一番右の列は隣の列から最も近い教師画像です.
c), d)はともにCIFAR-10の画像ですが, c)は全結合, d)はCNNのモデルで生成した結果です. CIFA-10になるとなかなか苦しそうですね.
Deep Convolutional GAN [Radford+, 2015]
先ほどのGANをfully-convolutionalにするなどのテクニックを加えてより高品質な画像を生成できるようにしたものがdeep convolutional GAN (DCGAN) です.
生成器は4層の転置畳込み(逆畳み込み)というシンプルな構造になっています.
このシンプルな構造ゆえ, TensorFlow, PyTorch, Chainerなどの主要フレームワークでチュートリアルとして使われています. 小さい画像なら普通のGPU1枚で動くということもあって, 個人レベルでは最も人気のGANという印象があります. いろいろな方がいろいろな画像を生成していておもしろいので, 興味のある方は調べてみてください. 私も過去にChainerのサンプルコードを少しいじって寿司の画像を生成したことがあります(SushiGAN).
こちらはLSUNの寝室の画像で学習したものです. 64x64くらいの画像は結構綺麗に生成できます.
また, DCGANに限られた機能ではありませんが, 潜在空間上でzどうしを足し引きすることで, 画像空間上で意味のある演算をすることも可能です.
Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
Self-Attention GAN [Zhang+, 2018]
単純な畳込みは局所的な演算しかできないので, 層をとても深くしないと画像上の離れた点間で一貫性を保つのが難しいのですが, self-attention GAN (SAGAN) は, 特徴マップの変換に自己注意機構 (self-attention mechanism) を加えたことで画像の大域的な情報を表現することに成功しました.
今度はImageNetの128x128の画像を綺麗に生成しています(クラス指定あり).
なお, 自己注意機構の他にも, ヒンジ損失の導入, スペクトル正規化(後述), two-timescale update rule (TTUR; 生成器と識別器で異なる学習率を使うこと)といった工夫があり, これらはすべて後のBigGANに継承されています.
ちなみに, この論文の第二著者にはGoodfellowがいます.
Self-Attention Generative Adversarial Networks
Progressive GAN [Karras+, 2018]
GANの学習を動かしてみた方は実感があると思いますが, 単純に画像の解像度を上げようとすると, 学習が不安定になったり, モード崩壊が起きやすくなったりします. そこで, 学習初期は4x4の低解像度で始めて, 徐々に層を追加しながら1024x1024の高解像度画像を生成できるようにするのがprogressive growing GAN (PGGAN) です.
層を追加するときには下図の(a), (b), (c)の順に, αの値を大きくしながら「ソフトに」追加します.
この他にも, 識別器にミニバッチ内の標準偏差を入れて多様性を向上させるなどの工夫を入れて, 1024x1024の画像を生成した結果がこちらです!
CelebAの顔が芸能人らしくなっているのもわかりますね. なお, この学習に使われているCelebA-HQというデータセットは, この研究のために新たに作られたものです.
Progressive Growing of GANs for Improved Quality, Stability, and Variation
StyleGAN [Karras+, 2019]
StyleGANはPGGANの著者陣による最新作で, 生成器にスタイル変換由来のAdaIN (adaptive instance normalization) というモジュールを採用し, 高画質でリアルな画像を生成することに成功しました.
PGGAN (a)と比べると, StyleGAN (b)は次のような特徴があります.
- マッピングネットワークと合成ネットワークからなる
- マッピングネットワークで正規分布に従う潜在変数を学習可能な分布に従う中間潜在変数に変換する
- 合成ネットワークの最初の入力はすべての要素が1のテンソルで固定する
- 合成ネットワークの途中のAdaIN層で, 中間潜在変数をアフィン変換してからスタイルとして取り込む
- 髪の毛先の動きのような確率的な要素を反映させるため, 合成ネットワークの随所でノイズを足す
AdaIN層では元の特徴マップの平均と分散をスタイル特徴マップに合わせるような操作を行います.
生成結果は驚くべきクオリティです. ぜひ動画でご覧ください.
顔のリアルさもさることながら, 顔を変化させていく過程のどこを切り取っても極めて自然な画像になっているところが, これまでのGANとは一線を画しています.
潜在変数をと2つ用意して, 合成ネットワークのある層で入力をからに切り替えることで, 顔のスタイルを混ぜることもできます.
また, StyleGANの訓練データとして, CelebA-HQよりも年齢や人種の多様性に富んだFFHQというデータセットを作成しました.
A Style-Based Generator Architecture for Generative Adversarial Networks
BigGAN [Brock+, 2019]
本節の最後に紹介するBigGANは, 基本的にはSAGANをより大きなスケールでやってみたというものです.
まず, ImageNetの512x512の画像でSAGANのベースラインに対してバッチサイズを8倍, チャンネル数を1.5倍にしたところ, これだけでFrechet Inception Distance(低いほうが良い)とInception Score(高いほうが良い)が大幅に改善しました.
さらに, クラス変数に対する埋め込み共有, 重みの直交性による正則化, 潜在変数の分割などのテクニックを加えて性能を改善しています.
生成結果はこちらです.
Large Scale GAN Training for High Fidelity Natural Image Synthesis
学習方法
ここまで, GANによる美しい生成結果を載せてきましたが, 実際は鴨の水掻きよろしく丹念なチューニングが必要です. 次は, 学習の安定化やモード崩壊の防止に向けた, 学習方法に注目した研究を紹介していきます.
ここからは短めに書きます. 詳細は元論文をご参照ください.
Unrolled GAN [Metz+, 2017]
Unrolled GANは先に識別器のパラメータ更新を回行い, その損失で生成器のパラーメータ更新をしてから, 識別器のパラメータを1回更新時に戻す(unroll)というものです. これは賢い識別器で生成器を導くイメージで, モード崩壊を起きにくくする効果があるそうです.
次の図で, 上段がUnrolled GAN, 下段が通常のGANです. Unrolled GANではターゲットのすべてのモード(クラスタ)を再現できています.
Unrolled Generative Adversarial Networks
Wasserstein GAN [Arjovsky+, 2017]
通常のGANの目的関数は, 最適な識別器の下ではJensen-Shannonダイバージェンスと捉えることができます. しかし, JSダイバージェンスは2つの分布(訓練画像と生成画像)が重ならない部分では発散してしまい, 勾配消失が起きやすくなります. そこで, 分布に重なりがないところでも滑らかな(Lipschitz連続な)Wasserstein距離を目的関数に使ったのがWasserstein GAN (WGAN) です. WGANの訓練では, 識別器はW距離を推定し, 生成器が推定されたW距離を最小化します. また, W距離で要請されるLipschitz制約を満たすため, 識別器の重みをクリッピングします. 詳しくは論文のほか, [10-12]も参考になるかもしれません.
通常のGANとWGANの学習曲線を比較してみます. このように, JSダイバージェンスは途中でスパイクが入って不安定ですが,
W距離は学習初期からずっと滑らかになっています.
識別器の損失に勾配に関する正則化(gradient penalty)を入れたWGAN-GPという改良版もあります.
Spectrally Normalized GAN [Miyato+, 2018]
GANの登場以来進められてきた学習の安定性のための研究(WGANなど)の中で, 識別器のLipschitz連続性が重要であるということが指摘されていました. そこで, 識別器の各層のスペクトルノルムを正規化してLipschitz連続性を保証したのがSpectrally Normalized GAN (SNGAN) です.
具体的には, 重み行列を最大特異値で割るという操作をしています.
これで各層がLipschitz連続になり, 全体としてもLipschitz連続性が保たれます.
実験では, バッチ正規化やWGAN-GPなど他の正規化・正則化手法と比較しても高性能でハイパーパラメータに頑健であることが示されました.
また, 調節すべきパラメータもスケーリングファクターのみと使いやすいところも特徴です. 執筆時点で被引用数690で, BigGANにも採用されるなど, かなり人気で効果の実証された手法です.
Spectral Normalization for Generative Adversarial Networks
HoloGAN [Nguyen-Phuoc+, 2019]
HoloGANは, StyleGANの生成器を元に, 3次元構造を考慮した画像生成を可能にしました. HoloGANの合成ネットワークは図のように, 3次元畳込み, 3次元の回転, 3次元畳込み, 2次元への写像, 通常の2次元畳込み, という構造になっています.
画像生成の背後に3D表現を陽に設けることで, 潜在変数で角度を調節できるようになります. ただし, 識別器に与えるのは2次元画像なので, 訓練データに3Dモデルは必要ありません.
このようにCelebAの顔画像を並べて回転させることができます.
車の360度回転もこの通りです.