自分が好きなGAN(敵対的生成ネットワーク)という画像生成モデルについて、軽く話したい。(数式使ったり、モデルの詳細を記述したりとかはしないし、そもそもできないので、ふわっと読めるはず)
今や一躍有名になったstable diffusion。このモデルが登場するまで、画像生成モデルといえばGANが1番有名なモデルだったと言えると思う。
自分がGANを好きな理由の1つとして、とっても説明がしやすいことだ。GANには、Generator(生成器、以下G)とDiscriminator(識別器、以下D)がある。ものものしい単語たちだが、「Gは本物をもとに偽物をつくる人、Dは本物か偽物かを見分ける人」である。例えば犬の画像がたくさん入ったデータセットを用意する。それをGに見せて、せっせと犬っぽい画像をつくってもらう。そして、Dに本物と偽物両方をわたして、判別してもらう。そこで、「GはDを騙し、DはGを見破る」ことが求められる。
このGとDを同時に学習させていくことで、Gは「贋作スキル」が上がり、Dは「審美眼スキル」が上がるという、ともに成長していく素晴らしい関係性である。あとはこのGを取り出せば、それが画像生成モデルになっているという寸法である。
このように、GANは理論的な話を省けばこのくらいで説明がつく、とてもわかりやすいモデルである。しかも、実際にこの仕組みで高精度の画像が作れるのだ。初めてこのモデルの解説記事を読んだときはちょっと感動した。
……ただし、この理屈が上手くいけばである。このシンプルな関係性には大きなデメリットがある。学習がとってもシビアなことだ。
GANで有名な問題として、「GANの勾配消失問題」というものがある。Gが贋作をつくりはじめたころというのは、ほんとに駄作しかつくれない。犬どころか、「何だこのモザイク画像は」ってものが出力されたりする。そんな画像をDに判別してもらうと、「すべて偽物!」と返ってきてしまう。そんなフィードバックがきても、Gは何が悪いのかさえわからないので学習しようがないという、なんとも悲しい問題である。
そもそも本物か偽物かを見分けるタスクより、画像を生成するタスクの方がはるかに難しい。そのために、この「審査側が強すぎる」問題が起きうる。だから、Gをたくさん学習したあとにDをちょっと学習する、みたいな小細工に近い調整方法もあったりする。そんな感じで、GANは学習のときに考慮することがとても多く、ユーザー泣かせの代物なのだ。
余談だけど、自分はこの辺りを研究していたことがあった。Gにやる気を出させるために、「Dに手加減させる方法」を模索する話だった。とても難しくて、結果は出せなかったけど。こんな、「ディープラーニングの、画像生成の、GANの、学習安定化の、」ってニッチな分野に絞ったとて、いまやいろんな解決策が編み出されている。研究って奥が深い。
さておき自分は、こんなGANがなんとなく好きである。なんか「人間みたい」じゃないかと感じるからだ。自己批判をする部分(スーパーエゴ?)が強すぎたら諦めちゃうところとか、特に。そう考えると、学習が大変なのもなんか仕方がないかもしれない。実際、人間にとっても大変だもの。
贋作スキルと同時に審美眼スキルも伸びていくというのも、人間に捉えると辛いところかもしれない。この先満足いくものを作るには、成長した自分を越えなければならない……
ゲームを作るとき、「これって面白いかなぁ」がぽつんと頭に浮かぶときがある。1番の敵は自分なのかもしれない。それでも、それを乗り越えて作り上げることができた作品に対しては、誇っていきたいと思う。よくやった自分。
最後にGANの話に戻るけど、他にも「Dに認めてもらえた!」という経験から、偏ったものばかり作ってしまう「モード崩壊」という問題もある。が、少し辛くなるのでこの辺りでとどめておく。自分が満足いくものが作れていたらそれでいいとぼくは思う!