表題のとおりです! Kaggle に初参戦し、銀メダルを獲得しました。
コンペ内容
このコンペはちょっと特殊というか実験的なコンペで、 “どれだけリアルな犬画像を生成できるか” を競うものでした。 おもしろそうだったので気軽に参加したのですが、案の定いろいろ問題が発生していて若干いわく付きのコンペになってしまったようです…
データセット
与えられるのは、犬種と画像がペアになった犬画像 10,000 枚でした。ここから GAN や VAE を学習して生成した画像を提出します。 画像サイズは 64x64 と比較的ちいさいため、Kernel only でもあつかいやすいコンペでした。
評価指標
生成した画像のリアルさは、GAN の研究でも一般的に広くつかわれている FID (を改変したもの) を使って評価されます。 ざっくりいうと
- ImageNet で学習済みの Inception Network を用意する。最終層は取り除く。
- リアル画像を Inception Network に通して特徴ベクトルを得る。
- 生成画像を Inception Network に通して特徴ベクトルを得る。
- 両者の特徴ベクトルの分布が似通っていれば、生成画像はリアルに近いと考える。
というものです。
解法のキーワード
細かい解法は discussion にゆずるとして、ざっくり以下のようなキーワードが頻出でした。
- DCGAN
- Conditional GAN
- Spectrum Norm
- Self Attention GAN
- Relativistic GAN
- Progressive GAN (64x64 だったのであまり活用されず)
最終的な自分の解法は
- Self Attention GAN
- Hinge Loss
- Spectrum Norm (in Generator/Discriminator)
- Discriminative Learning Rate (Generator と Discriminator で LR を分ける。)
という感じにおちつきました。 CV もへったくれもないコンペだったので、ひたすら実験を回すだけでしたが、論文をちゃんと読みながら進めたので、あるていど筋のよい人間ハイパラチューニングをすることができたのではないかとおもいます。
https://www.kaggle.com/agatan/sagan-resnet-annots
問題になったこと
おもに「生成しているということの定義が曖昧」であることに着目した論争がまきおこっていました。
- リアル画像をランダムに二枚えらび、
a * 0.99 + b * 0.01
でブレンドした画像を提出する
というのが最初におこなわれました。評価指標的にはこれで圧倒的なスコアがだせてしまっていました。 さすがにそれはだめでしょう、ということで GAN や VAE を使ってくれ、と運営からのお達しがありました。
が、
- Conditional GAN として学習する。ただし、10,000 クラス(= 1 画像 1 クラス) として学習する。
- 生成時には
[0.99, 0.01, 0, 0, 0, ...]
というクラスであるという入力をつくって画像を生成する。- ほとんど 1 枚目の画像とおなじだがちょっとだけ異なる画像で生成される。
という方法で似たようなことが実現できてしまう、という問題提起があがりました。 これは明確な線引きがむずかしく、クラス数が 1000 ならいいのか?などの議論がまきおこりました。 結局与えられたデータセット内の犬種をクラスとして使うのはあり、という結論になりましたが、いまいち基準ははっきりせず、最終的には運営が LB の上位については全件チェックし明確に違反しているものは弾く、という方針になりました。
こういう経緯があったので、Public LB は実質的に機能しておらず、僕もコンペ終了間際まで LB では 200 位より下だったと記憶しています。
まとめ
いろいろいわくつきのコンペではありましたが、初参加でおもいっきり楽しむことができ、結果も残せたのは素直にうれしくおもっています。 GAN はまったく触ったことがなかったので、かたっぱしから論文を読んで再現実装していくプロセス自体がたのしく勉強にもなったので参加してよかったです!。