第2回 Cpaw AI competitionに参加しました

Cpaw AI competitionが何かとか、Cpawとは?みたいは話は下のリンクを見て下さい

connpass.com

雑に説明すると競プロ(ハーフマラソン系)+機械学習コンペです。当日はさくらインターネットさんからCPU 12Core,メモリ96GBのマシンが貸し出されており、その上で競技に取り組みました。問題は合計4問用意されており、正解率の合計で総合順位が決定する形式でした。 ただし4問のうち1問はとても難しいらしく正解率を8倍した値が合計する時に使われる仕様でした(300+800=1100点満点)。

環境構築

クリーンインストールされたUbuntuが与えられただけだったので、まず自力で環境構築をする必要がありました。 zshをインストールしてGitHub - odanado/dotfilesをcloneすることで手軽に開発環境を作りました。 Pythonを実行する環境にはDockerとMinicondaのどちらを使うか少し考えましたが、Minicondaを選びました。Minicondaは env.yml ファイルに必要なパッケージを書いておけば、 conda env create -f env.yml で仮想環境を構築できるのでとても便利です。

Programming

この問題は6種類のいずれかのプログラミング言語で書かれたプログラムが与えられるので、そのプログラムの言語を予測する問題でした。 研究で自然言語処理をやっていたこともあってまずこの問題に手をつけました。 直感でそんなに難しくないだろうと考え、sklearnのCountVectorizerでBoWを構築、xgboostで分類しました。 精度はおおよそ97%程度で、この時点(1時間経過)では暫定1位で嬉しくなりました。

omniglot

この問題は実際のomniglotのデータセットから40種類のハングル文字を取ってきて、画像分類を行う問題でした。 この問題の難しい点は学習データが各クラス1枚しか用意されていない点でした(いわゆるone-shot learning)。 自分は最近画像の類似度計算について勉強していたこともあって、次にこの問題に取り組みました。 AKAZE特徴量を抽出して特徴点のマッチングや、テンプレートマッチングを行うコードを実装しても、ほぼチャンスレートの正解率しか得ることが出来ませんでした。

実は4問のうち特に難しいために正解率が8倍される問題はこの問題でした。

一度この問題は諦めて他の問題に移りましたが、最終的にはIMSATを使った手法を提出しました。 omniglotはMNISTと同じく手書き文字認識っぽいデータであることと、IMSATのchainer実装を運営のshunk031さんがgithubに公開していることを知っていたため、この方針を採用しました。 この選択は結果的に正解で、提出したところ8倍された正解率で31%を記録しました。

hand-RPS

この問題は真上からの手の甲の画像から、じゃんけんのグーチョキパーのどれに分類されるか予測する問題でした。 環境として提供されていたサーバにはGPUが搭載されておらず、取り組むのにためらっていましたが、CNNによる手法を試しました。 ネットワークは keras/cifar10_cnn.py at master · keras-team/keras · GitHub を使いました。
ネットワークが小さいことや学習データが多くないこともあって、数十分で10epochの学習が終わり、提出した結果98%の正解率が得られました。

cifar-100

この問題は問題名の通りデータセットにcifar-100を使った問題でした。ただ、データはcifar-100そのままではなく、クラス名は00,01,...,98,99のように連番の数字で匿名化されていました。 cifar-100に対しては様々なネットワークが提案されていますが、今回GPUがない環境でいかに精度を上げるかという点が重要だったようです。

自分はまず最初にcifar-100の学習済みモデルを探しました。学習済みモデルがあれば多数決により匿名化されたクラスを特定することができると考えたからです。30分程度探しましたが、見つからず普通に1からCNNを学習することにしました。

hand-RPSと同じネットワークを20epochほど学習させ提出したところ9%程度の正解率を得ました。これを見て自分はこの方針は良くないと思い込み、他の問題に時間を使い、これ以上の改善はできませんでした。

結果

f:id:odan3240:20180402235644p:plain 結果は3位でした。1,2位は商品が用意されていたのですごい悔しいです。

懇親会で他の方の話を聞いた結果、1位になれなかったのはcifar-100の学習epochを20で打ち切ったことだと結論付けました。これはomniglotでよい正解率を出していたことと、cifar-10,cifar-100ではモデルを数千epoch学習させることがあり、最初20epochでは良い解が得られないと考えられるからです。結果論ですが、他の問題に取り組んでいる時間に裏でcifar-100の学習を回し続けていれば十分1位が狙えたのかなと思いました。

感想

普通のコンペは競プロのマラソンマッチのように長い期間行われるのに対して、ハーフマラソンのように短い時間でコーディングが忙しいコンペでした。 コードを書いてる時や、提出した時に良い精度が出た時はとても楽しく勉強になるので、次回も開催されるなら参加したいと思いました。

kaggleやるやる詐欺辞めないとなあ