教師なし学習で生成画像を制御できそうなinfoGANを試す

教師なし学習で生成画像を制御できそうなinfoGANを試してみる。
生成してみた画像がこちら

f:id:yusuke_ujitoko:20170830204845p:plain

背景

  • GANの学習ではG(Generator)とD(Discriminator)がせめぎ合いながら、ナッシュ均衡を目指す。
    結果として、
    • DはGによる生成画像と真の画像を区別するよう最適化される。
    • GはDを騙すように最適化される。

  • Gはノイズ{z}をもとに画像を生成
    この潜在変数群{z}は画像生成の種のようなもので、
    画像生成に使われる全情報を含んでいる。
  • GANが収束したとき、{z}の各変数は生成画像の特徴に対応しているはず
    • 光源の強さや線の太さなどの意味が分かりやすい特徴に対応していてほしい
    • 実際にはそうなっておらず、人間には紐解けない

  • CGANやAC-GANなどのConditional GAN
    • ラベルをノイズ{z}と合わせてGへ入力し、ラベルに対応した画像とセットで学習させる
    • 生成画像の条件をラベルで指定可能なGを構築できる。
    • しかし、画像とラベルを対応付ける手間が発生する。
  • こういった教師あり学習ではなく、教師なし学習で生成画像の特徴をコントロールできるGを構築できると面白い。
    そしてそれを試みるのがinfoGAN。

infoGAN

infoGANの構造は以下のように構築する。

f:id:yusuke_ujitoko:20170830203155p:plain:w200
  • Gに入力するノイズ{z}を、意味を獲得させる要素としてのlatent variables {c}とそれ以外の要素noise{z}に分ける。
    例えばMNISTの場合には、次のように分けると上手く行く(と書いてある)
    • noise {z} (通常のGANの場合よりも要素数を小さくする)
    • latent variables {c}
      • (0〜9)の離散値を表現するcategorical variables
      • 線の太さ、傾きなど連続値を表現するcontinuous variables

  • 通常のGANの要領で学習させると、上で述べたlatent variablesを無視して、 noiseとして生成画像を作るようになってしまう。それを避けるために、Gの生成画像とlatent variables {c}相互情報量最大を目指すようNNの構造と誤差関数を設計する。

  • 実装は割と単純
  • Dの出力として以下を用意
    • 通常の画像が本物か偽物かを示す値
    • latent variablesに対応した値
  • Gに入力したlatent variablesとの誤差を計算

生成画像を確認

infoGANはパラメータチューニングが大変。
(0〜9)を区別して生成するのすらできなかった。

縦軸:categorical variables, 横軸: continuous variables 1

f:id:yusuke_ujitoko:20170830204815p:plain

一応右にいくほど文字が太くなっていっているので、
continuous variables 1が文字の太さを示すよう学習できている…?っぽい

縦軸:categorical variables, 横軸: continuous variables 2

f:id:yusuke_ujitoko:20170830204845p:plain

continuous variables 2が文字の傾きを示すよう学習できている…?っぽい

その他

このinfoGANの発表の後,
semi-supervisedなinfoGANも提案されている.

https://arxiv.org/abs/1707.04487