自然言語処理と機械学習こそが最強の学問

CSの大学院生が真の最強学問である自然言語処理と機械学習の内容を書いていく予定。時々全然違う分野の記事も書くかもしれない。

Kaggleに参加してみた

Kaggleはデータ分析のコンペを実施しているサイトで、企業の実際のデータを分析したり、機械学習系の学会のデータを解析したりするなどさまざまなタイプのコンペがあって、なかなか面白いです。TopCoder SRMとかのアルゴリズム系のコンテストは数時間で終わりますが、こっちは数週間から数ヶ月間続きます。さらによい成績を残せば、かなり賞金が出るものもあります。たとえば、いまやっているMasterCardのコンペで、賞金が10万ドルです。(これをちょっとやってみたかったのですが、rating制限があってできませんでした)

気軽?に始められるコンペのうち、MNISTの手書き数字認識のコンペがあって、指示通りにトレーニングデータとテストデータをダウンロードして、ニューラルネットワーク(NN)で参加してみた。一度目のsubmitで、92%程度の正解率で全体順位1700人1350あたりでした。

参加後にランキングに目を通すと、初めてKaggleのすごさにいくつか気がつきました。まず、参加者全体の平均実力が高い。自分的に92%の精度はそこまで悪くないと思ったのですが、順位は見ての通り下です。つぎに、ベースラインの設定が高い。このコンペではRandom ForestやKNN(k=10)が使われていて、いずれも96%程度の正解率で、俺のNNちゃんが余裕で負けています。最後に、上位者たちのレベルがすさまじい。このコンペでテストに使われているデータは数万件あるはずなのに、上位者10人程度が何と全部正解させている!データのうちかなり書き方が崩れているものもあって、人間ですら100%は絶対無理なのに、全正解者がいることはいまでも信じられません。しかも、一位の人1回めのsubmissionでこれをたたき出してしまっています。もう強すぎてなにも言えない。

このままでは引き下がれないので、NNを進化させて、Autoencoderにしてみました。実装はNNをベースにすればすぐにできるのですが、Autoencoderはパラメータ調整がかなり辛くて、特徴をつかむために一日ぐらいかかりました。最終的にpretrainingで784次元を70次元に下げ、次に普通のNNで70-50-10で計算して、二度目のsubmissionをしました。結果は94%の正解率で、全体順位はちょっとあがったけど、あいかわらず1300ぐらいです。ベースラインぐらいには勝てると思ったのですが、やはり壁があつい。

落ち着いてForumを読んでみると、どうやらこの課題に関しては、普通のNNの正解率はRandom Forestとかに比べるとよくないらしいです。それでもあえてNNで参加している勇者の中に、隠れ層のニューロン数をなんと数百個に設定している人がいました。理由は90年代の論文の中にMNISTデータに対して、隠れ層を500個に設定するといいよと言っているものがあったかららしい。俺の場合は100前後ですら収束に相当時間がかかったのに、500個とか下手すれば一週間ぐらい訓練させなければいけません。そこまで設定するからには、やはり並列処理でがんばるか、GPUを使わないといけないのでしょうか。

とりあえず、いまのAutoencoderはまだ一番簡単なもので、sparseもdropoutもしていないので、バージョンアップしてもう一度参戦します!