オンライン学習の落とし穴は I/O にある

オンライン学習を使うときの問題点がOnline Learning Algorithms that Work Harderに書かれている。一言で言うと「オンライン学習は学習が速すぎるので I/O がボトルネックになる」ということであり、自分も100%同意。

なんでこんなことが起きるか、なのだが、1事例ずつ見ては最適化するオンライン学習にせよ、適当な数の事例を見ては最適化する確率的勾配降下法(Stochastic Gradient Descent)にせよ、全事例を見て最適化するバッチ学習と比べて、最適化の部分が重たかったり、全事例をメモリの載せなかったりしないといけないところを軽くするものなのだが、あまりに軽くなりすぎると、それ以外のところがボトルネックになる、ということで、それが I/O となっている、というわけ。

もっと正確に言うと、ボトルネックになるのはディスクから読み込む I/O ではなく読み込んだデータを素性に展開するところであり、それは上記記事の後半部分に書いてあるのだが、たとえば MSTParser (という係り受け解析器)では1パス目で全部の素性をディスクに書き出し、2パス目以降は書き出したファイルを使って処理を行うようにしているらしい。

コメントを見るともっといろいろ書いてあって、(Confidence Weighted という最近出てきた強力なオンライン学習器を作った人が) MSTParser でどれくらい I/O がボトルネックになっているか調べたそうで、結局素性をファイルに書き出すと素性展開に時間は取られないようになるが、今度はディスク I/O に時間がかかるようになるのだと…… :-(

一応バッチ学習では(メモリに乗り切らないので)使えないくらいの事例数を使えるという利点はオンライン化することで享受できるのだが、速度的にはどこがボトルネックになっているのか見極めた上で適用しないと、意外なところで時間がかかる、というわけで……。

あちらを立てればこちらが立たずで非常に悩ましい。こういうとき、どうしたらいいんだろうか……。