ChainerでGANのチュートリアルを書いてみた
Intoroduction
このチュートリアルではgenerarive adversarial network(GAN)を使って画像を生成します。ご存じの方も多いと思いますが、GANはdeep learningを用いた生成モデル(generative model)の一種で、よくある応用例に画像生成があります。昨今有名な線画自動着色サービスPaintsChainerもGANの技術が応用されています。
このチュートリアルでわかることは以下の通りです。
- 生成モデル(generative model)とは
- GANと他の生成モデルとの違い
- GANの仕組み
- Chainerを使ったDCGANの実装
生成モデル (generative model)とは
数理モデルといった場合、対象のふるまいを数式で記述することである。 特に、機械学習の文脈の場合、対象のふるまいをからの変換 で表現し、モデルとする。
したがって、モデルの学習とは、与えられた訓練データを元に変換を得ることである。教師なし学習の場合、訓練データは入力データのセットを元に変換を得る。教師あり学習の場合、訓練データは入力データと出力データのペアのセットを元に変換を得る。例えば、画像を犬か猫かに分類するといった分類問題の教師あり学習考えてみよう。訓練データは入力画像とそれに対応する出力ラベルとなる。
生成モデルと言った時、モデル化の対象は訓練データを生成する確率分布 である。最も単純な生成モデルは、訓練データを生成する確率分布 を変換でモデル化することである。その場合、のとにそれぞれ以下を割り当てる。
- :訓練データ
- :訓練データを生成する尤度
上記設定では、確率分布 自体を陽にモデル化しているので、尤度を計算することができる。尤度を計算できればその最大化もできるので、モデルの学習工程が単純という利点がある。しかし、尤度を計算できるだけではサンプリングを行うことはできないため、別途サンプリングをするための工程が必要であるという欠点がある。
そもそも、尤度は単にモデルの学習に必要なだけで、実用ではに従うサンプリングをしたいだけの場合も多い。その場合、確率分布を直接モデル化せず、サンプリングしやすいように他の対象をモデル化する場合がある。1つ目は、潜在変数を導入して確率分布、をモデル化する場合である。後述するVAEはこれに属する。2つ目は、潜在変数を導入してに従うサンプル生成器をモデル化する。GANはこれに属する。 これらのモデルは、分布潜在変数を乱数に基いて生成することで、確率分布 を満たす訓練データをサンプリングできる。例えば、画像生成の場合、潜在変数から画像を生成する確率分布 を計算し、尤もらしい画像を生成結果として出力する。
このように定義された生成モデルをどのように使うかというと、以下の用途を挙げることができる。
- 創作活動の補助(線画着色など)
- 人に対するインターフェイスの提供(自然文生成など)
- データ作成コストの削減(シミュレータとしての利用など)
注意
GANと他の生成モデルとの違い
NIPS2016でのGANのチュートリアル[2]に説明があるように、以下の図のように主な生成モデルを分類することができる。
GANの他にも有名な生成モデルとして、Fully visible belief networks (FVBNs)、Variational autoencoder (VAE)などがある。
Fully Visible Belief Networks (FVBNs)
FVBNsは以下の式のように、訓練データを生成する確率分布 をベイズの定理を使って1次元の確率分布に分解する。
最初の1次元 を除く他の次元は、それ以前に生成された自身のデータを条件に生成しているので、自己回帰モデルと言うこともできる。 FVBNsの一種であるPixcelRNN、PixcelCNNは1次元の分布関数をそれぞれRecurrent Neural Networks(RNN)、Convolutional Neural Networks(CNN)でモデル化している。FVBNsの長所は、陽に計算可能な尤度を用いて学習できることだ。短所は、各次元をシーケンシャルにしか生成できないのでサンプリングが高コストなことだ。
Variational Auto-Encoder (VAE)
VAEは以下の式のように、訓練データを生成する確率分布 をモデル化する。この時、は潜在変数を使って2つの確率分布、をモデル化している。
だけを用いてモデルを学習する場合、
を計算できる必要があるが、 上記式に積分が含まれるため計算困難である。そのため、
を
で近似する。
その結果、尤度の下限を計算が可能になり、尤度の下限を最大化することで学習を行う。VAEの長所は、サンプリングが低コストなこと、を使用して潜在変数の推定ができることだ。短所は、確率分布 の計算が困難なこと、学習に近似値を用いていることだ。
Generarive Adversarial Networks (GAN)
GANは、FVBNsやVAEと異なり、訓練データを生成する確率分布 を陽にモデル化しない。その代わりに、潜在変数を使って に従う生成器をモデル化する。それとは別に、生成器によるサンプルと真のデータの識別器を作る。識別器を学習しつつ、識別できないように生成器も学習する。 GANの長所は、サンプリングが低コストなこと、画像生成で state-of-the-artであること。短所は、そもそも確率分布を一切モデル化していないので確率分布 の計算ができないこと、潜在変数の推論ができないことだ。
GANについて詳しく
GANの仕組み
上記で説明したように、GANは潜在変数を使ってに従う生成器自体をモデル化する。そして、生成器によるサンプルと真のデータの識別器を作る。つまり、生成器と判別器という2つのネットワークが登場する。
学習時にすべきことは、真の分布から生成されたサンプルと生成器から生成されたサンプルの分布をマッチングすることである。
画像
GANでは、ゲーム理論のナッシュ均衡のアイデア元に、分布がマッチするような生成器を学習する。具体的には、識別器を学習しつつ、識別できないように生成器も学習していく。
上記を直感的に説明する時の例として、紙幣の偽造者と警察の関係が頻繁に使用される。偽造者は本物の紙幣とできるだけ似ている偽造紙幣を造る。警察は本物の紙幣と偽造紙幣を見分けようとする。次第に警察の能力が上がり、本物の紙幣と偽造紙幣をうまく見分けられるようになったとする。その時、偽造者は偽造紙幣を使えなくなってしまうため、更に本物に近い偽造紙幣を造るようになる。警察は本物と偽造紙幣を見分けられるようにさらに改善し…という風に繰り返していくと、最終的には偽造者は本物と区別が付かない偽造紙幣を製造できるようになる。
数式を用いて学習工程を説明すると以下のとおりである。 まず、識別器は、真のモデルか識別する確率であるので以下のように表記できる。
この時、真の分布から生成されたサンプルと
生成器から生成されたサンプル
(のこと)の分布をマッチングするということは、2つの分布の相違度を最小化するということである。 よく使用される分布間の相違度の定義として、Jensen-Shannon Divergence
が存在する。
と
の
は識別器を使って以下のように書ける。
上記 を識別器に対しては最大化し、生成器に対しては最小化すれば、
真の分布から生成されたサンプルと
生成器から生成されたサンプル
のマッチングができる。
実際に学習を行うときは、識別器と生成器を交互に更新することで上記min-max問題をときます。
DCGANとは
このあたりがわかりやすい 。 はじめてのGAN
Chainerを使ったDCGANの実装
- chainer/examples/dcgan at master · chainer/chainer · GitHub
参考文献
- [1] Generative model - Wikipedia
- [2] [1701.00160] NIPS 2016 Tutorial: Generative Adversarial Networks
作業ログ
作業用参考文献
- Generative Adversarial Networks (GAN) の学習方法進展・画像生成・教師なし画像変換
- はじめてのGAN
- ご注文は機械学習ですか?
- Generative Models
- http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture13.pdf
- 生成モデルの Deep Learning
- 論文紹介 Pixel Recurrent Neural Networks
ひとまずchainer-gan-libを動かしてみよう
- これ pfnet-research/chainer-gan-lib
- なんか久しぶりにcupy, chainerをupdateしてみたら動かなかったので再install。
pip install -e . --no-cache-dir
とかやったらうまくいった。今まで使っていたpython setup.py develop
ではうまくinstallできなかった。 - あとちゃんとpyenv virtualenvをつかってみた 参考
動かした結果
- 1000 epoch
- 10000 epoch
1000epochから10000epochで生成される画像に変化があるので学習はしてそう。夢に出てきそうな謎画像が生成された。
関連論文を読んで見る
- [1406.2661] Generative Adversarial Networks
- [1701.00160] NIPS 2016 Tutorial: Generative Adversarial Networks
- チュートリアルには、他のgenerative modelとの比較があるなど詳しい。
- Generative Models
- この図がわかりやすい