Hadoop を使うべき場合・使うべきでない場合

id:ny23 さんが動的ダブル配列を使って Wikipedia のテキスト処理を高速化なんてのを書いている。たぶんこれのエントリを見る前にMapReduce と四身の拳を見た方がコンテクストが分かると思う。Hadoop 使ってなんでもできそう! Hadoop の勉強したい!なんて思っている人は読んでみるとよい。

自分の考えについて書いておくと、自分は誰も彼も Hadoop 使いたがる状況には辟易している。ほとんどの人には不要なはずだし、そもそも Hadoop は(ny23 さんも書かれているが)メモリに乗り切らない大規模データを扱いたいときに効力を発揮するのであって、メモリに乗り切るくらいのサイズであれば、データ構造を工夫したり適切なアルゴリズムを選択した方が遥かによい(id:tsubosaka さんも実験されていたが)。たとえデータが大規模であったとしても、たとえば形態素解析なんかのタスクでは、単純に頻度で足切りしてキーのサイズを減らしてメモリに乗り切るようにする、というほうが圧倒的に汎用的な手法であり、ほとんどの場合それでうまくいく。id:ny23 さんのエントリや id:tsubosaka さんのエントリにこそブックマークがつくべきであって、自分の書いた Hadoop の記事にブックマークがつくのは、日本のエンジニア的には由々しき事態だと思う。特に学生さんは空間・時間計算量の見積もり、適切なデータ構造・アルゴリズムの選択がちゃんとできる人になってほしいのだが……。

自分が今年度始めた勉強会でも修士の人たちの有志に Hadoop を使って大規模計算の演習をしてもらっているのだが、メインの目的は「大規模データを使うのは面倒くさいよ、ちゃんとアルゴリズムを工夫しないと性能も出ないし、大規模化する前にアルゴリズムを考えましょうね」ということを学んでほしい、と思っているからである。Hadoop を使えば簡単に大規模化できますよ、とか、手軽に高速になりますよ、と言いたいわけではない(これまでの実習に参加してくれた人は分かったと思うが……)。

ではなぜ大規模データをそのまま使いたいのか。自分の経験からすると、係り受け解析より上の解析はどうやってもスパースになってしまうので、大規模化せざるを得ないと思うし(頻度で足切りすると消えてしまう素性がたくさんある)、逆に大規模にデータが手に入るようになったからこそ、以前不可能であった意味解析ができるのではなかろうか、と思うのである。どのあたりが分水嶺になっているかというと、ちょうと係り受け解析が中間地点で、そこから下はいかにコンパクトにモデルを作るかが重要だったり、解析速度が速くないと使えなかったりする領域だが、係り受け解析より上のレイヤーは、まだ精度的に使えるものでもないし、なぜ使えないのかというと上記のようなデータのスパースネスがものすごく大きな問題であるから、というのが自分の答えである。(あと大きな問題としては統語構造をどのように機械学習の枠組みに乗せるかという問題もある。部分木や部分グラフの類似度の定義とか、高速なそれらの計算に加え、自動で分類に有効な部分木をどのように選択するかとか。)

そこから先が実は痛いところで、やはり検索エンジンなりの企業で扱えるデータと、大学で扱えるデータの量は雲泥の差であって、なおかつ実験に使えるノード数も大学ではたかが知れている。せいぜい中規模のデータが関の山であって、1台の計算機のメモリには載らないが、かといって分散処理が必要かどうかは微妙なサイズのデータがいいところであろう。それでもやらざるを得ないのが現状であって、1台で処理できるサイズのデータでなんとかできるタスクをやる、というのも現実的な方向であろう。というか、どこかで書いたように、自分で言うのもなんだが、大規模化して得られるものはそこまで多くない(労多くして得るものは少ない)ので、みんながみんな大規模化に向かうのはあまりお勧めしない。Hadoop (MapReduce) が必要な環境、そして使って意味のある状況はかなり特殊な場合であり、なぜか(たとえば数TBのデータが手元にあるわけでもない人たちに)注目されているのが自分でも謎である。

昨日紹介した @murawakiさんも gxp for NLPersという、自然言語処理で並列分散計算するツール、そしてどういうときにしたくなるかという話を書いているのだが、いろいろと問題があることが分かる(どれも大規模データを使ったことのある人はみんなうなずけるような問題が書いてある)。こういう問題点、みんなで共有したほうがいいと思うのだが、なかなか難しくてみんな独立にやっていて、研究会やら年次大会やらで会ったときにちょこちょこと情報交換したりする、みたいな感じになっている。GoogleYahoo!Microsoft みたいな企業は全体でやっているのだから、日本で個々の大学に分かれてやっていても到底太刀打ちできず、もっと一緒にやったほうがいいのだろう(でも同じ大学でフロアが違うだけでも一気に交流が途絶えてしまうのがいかんともしがたい)。さもなければ、この分野で勝負しないという選択のほうがよほど賢明である。

少し話は変わるが、@amedama くんが学会がうまくいってないケースが増えてるような気がしてうんざりする話について書いている。彼の言うように、自然言語処理は(他の分野はいざ知らず)応用できてナンボの世界なので、それが基礎理論であっても実践的な手法であってもよいのだが、多くの人が「この研究真似したい! 自分のプロダクトで試してみたい! このツール/ライブラリ/テクニック使いたい!」と思ってくれるものでないと意味がない。

アカデミアの中で小さくまとまる論文だと、たとえばその分野のトップレベルの会議のいちばん新しい年度の論文を見て「こんな新しい手法出てきていい精度も出しているそうだど、ここがまだ未解決だからこれをやれば来年の投稿シーズンに間に合うだろう」みたいなのが典型的に「真似される」論文で、それはそれでそこまで悪いものでもないのかもしれないが、大学以外でも「真似したく」なるようなものを大学人は作らないといけないのではなかろうか?

そういうのとは別にdaiti-m さんのように理論的におもしろい話をしている人もいるし、そういう方向に突っ走る人がいるのはすばらしいことだが、なかなかそうならない場合が多くて難しい。情報系なんてできてまだ100年も経っていないコミュニティなので、まだまだ最適な形で落ち着くという感じでもないのだろうが(国際会議のほうが論文誌より国際的には評価が高い、というのも情報系の独特な基準)、言語について深い洞察を与えてくれるような革新的な理論でなければ、ちゃんと他の分野の人なり企業の人なりに使ってもらえるものを出していかないと、(いまでこそ若い人たちも興味を持って参入してきてくれるが)長い目で見ると回復不能なくらいダメージを受けてしまうのではないかな。