ta-dadadadaのブログ

忘備録とポエム

第3回 Cpaw AI competition 参戦記

これ に参加させていただいたので、日記を残しておく

背景

実は弊社の方で第2回大会のピザ枠でスポンサーさせていただいてて、そのとき見学させていただいて「次は個人で絶対出るぞ!」と決意していた。 イベントが人気すぎて登録したときにはもう補欠枠だったので半分諦めていたが、最終的に繰り上がりで出場が叶った。

環境

会場提供は CyberAgent 様。立派なビルの一室で、もちろん電源も wifi も完備。

作業環境として さくらインターネット 様が提供するリモート環境がすごくて、 cpu は 12core あるわメモリは 96GB あるわで「こんなに使い切れんよ...」と面食らっていた。

問題

今回は3問。前回は4問、第1回は5問だったらしく、だんだん絞られてきている感じ。

3問の内訳は、

  1. finger count: 「手」の画像データが与えられて、「手」のうち立っている指の本数が 1,2,3 のどれかを当てる、というもの
  2. HSI: 航空写真をスペクトル分解したデータが与えられて、航空写真に写っているものが何かを当てる、というもの
  3. tourist spots: 観光地についての説明文+基礎データが与えられて、観光地のカテゴリ(寺とか美術館とか)を当てる、というもの

コンペ開始

リモート環境は さら だったので、とりあえず anaconda + 各種DLのライブラリをインストール。 インストール待ってる間にリモートから rsync するスクリプト書いたりしていた。

今回はサンプルスクリプトが与えられていた。 これが本当の本当にありがたくて、とりあえず実行すると識別率70%くらい余裕で出るというシロモノだった。

とりあえず1本サンプル回してみて「このサンプルは強い」という事実に気づいたので、とりあえず 3問ともまわしてみて submit するという RTA を敢行。 RTA では1位になったので一瞬ランキングの1位になったりしてこの時点でなんかわりと満足していた。

前処理の試行錯誤

ぱっと見 tourist spots は自然言語処理を含む感じでつらそうだな、と思ったんですけど、 前処理部分が品詞分解してつっこむだけのものだったので多少工夫できるかもな、と思ってとりあえず触ってみることにした。

いろいろやった結果品詞を動詞か名詞だけにしぼって突っ込んでみる、というのをやってみた。 実際はそのへんの「効かない」パラメータについては学習器側でいい感じにされてるはずなこともあり、大した変化にはならなかった。

次に触ったのが finger print 。今回の問題の中では一番素直そうな問題だったので触りやすそうかな、という目論見だった。 画像の normalize とかを手探りでやってみつつ、芳しい効果は得られないまま時間が経過していた。

15時後半くらいで「前処理は全くスキルがないから無理やな」という事実に気がついたので、投げ出す。

このあたりでどのサンプルスクリプトも Ridge 回帰を使っていることに気づいて、 「これ全部 RandomForest にしたらめっちゃいい感じになるんじゃね?」という雑な経験則からくるアレに基づいて順次 RandomForest に切り替える作業を始める。 この作戦自体は当たりで、いっとき順位が6位になるくらいまで健闘できた。 また、マシンパワーのおかげで GridSearch が非常に捗ったので、ちょっとずつハイパーパラメータのチューニングをしていた。

pretrain model

「学習済みモデルの convection とかを利用して前処理 -> 特徴量抽出して雑に学習器にぶちこめば素人が下手に触るより格段によいモデルができる」というのを知っていて、 finger count に適用してみるか、と思いついたのが 16時を回った頃。

ふわっと chainer の VGG モデルにつっこんでみる、というのが実装できたのが 16時半くらいのこと。 勝った!と思いながら回り始めてみたところ、 iteration speed から逆算するに競技時間内に学習が終わらない、という事実に気づいて絶望する。

学習済みモデルをもっと軽いものに置き換えられないかとか、 ideep 導入したらめっちゃ早くなるんじゃないかとか試して悪戦苦闘するも、残念ながら速度改善には至らず、この方針は諦めた。 もっと早いうちから思いついてれば間に合ったのになーという程度の見積もりだったので、ここは一番の心残り。

競技終了

最後の1時間くらいはハイパーパラメータのチューイングを回しつつ前処理の試行錯誤をしていた。 残念ながら特にブレイクスルーは得られず。

最終的なランキングは 10 位/30名 といったところだった(執筆時点で最終順位全体は公開されていないので実際はもう少し下の順位かも)。

何も知らない割には参加者平均以上の成績を残せたので、個人的には大変満足でした。

講評とか

問題の解説 + 優勝者のやったこと聞いた感じ、

  • もっとデータ見るべきだった。「効く」ところだけ抽出してぶん投げるだけでももうちょっと改善できた気がする
  • finger count はやっぱり得点源だった。もうちょっとスキルがあって、さらっと CNN 実装できてればよかった(優勝者の識別精度が 97% だったということを聞いて)

懇親会

CyberAgent 様のおしゃれなスペースに移動して🍕。

上位陣の方としゃべれたりして、とてもためになった。 機械学習にわかマンなのでついていけないなーと思いつつ、もうちょっとは勉強しなくちゃなーとかやっぱ kaggle はやっとくか、とか。 twitter 上で一方的にフォローしていた方々と形の上とはいえ面識ができてたいへんうれしかった。

運営の方や学生の方とも話せて、名刺交換までさせていただいて、実りの多い懇親会になったと思う。

感想

初学者的には本当にサンプルスクリプトに助けられた。 正直0スタートだったらデータを読み込んで最も基本的なモデルに渡す、というのをするだけで1日が終わってしまっていたと思う。 おかげで前処理の試行錯誤とか(成果はでなかったけど)、モデルの変更とかの比較的上層レイヤーの改善に集中できた。

自分でも一応「参戦」できたというのが嬉しかったし、とても楽しかった。 次回の開催を楽しみにしています。