結果を予想しながら実験をする

朝、最近は電車で坐れないことが多く、日記の更新が滞りがち。通勤の行き帰りの時間しか日記を書く時間がないのに……。(あと、推敲する時間が取れないと、短くする余力がなく、日記が長くなる傾向がある)

午前中は学内実習のミーティング。少しずつではあるが、みなさん実験結果が出つつある。自分がいま定期的にミーティングをしているM1の人は4人で、それぞれ実装はそれなりにできてきているので、あとは時間かなあ。とにかく自分の慣れたプログラミング言語でいいのでがんがん書いて、1回の試行錯誤のサイクルを速くして、いろいろ試してみるといいと思う。

新しい言語も勉強して研究にも挑戦して、とやりたい気持ちは分かるのだが、それまで着手したことがない実装に取り組むだけで未知のことにたくさん遭遇するので、あまり冒険しないほうがいいんじゃないかな?うまく行かないとき、それがプログラミングの知識・能力的な問題か、研究に関する問題かの切り分けができなくなり、けっこう厳しいと思うし。新しいプログラミング言語をやるなら、結果がやる前から分かっていることとか、成果が出なくても問題ないタスクでチャレンジするとか、ある程度コントロールしたほうがいいと思う。(一気にいろいろ変えてもなんとかなる、すごい人もいるだろうから、全員そうしたほうがいい、という訳ではないが)

自分も学部のときシドニー大学に留学していたのだが、最初の学期に履修した科目は内容的には日本で勉強したものと同じで、英語で授業が行われるところだけ違ったのだが、そこで (英語で喋ったり、書いたりするのは全然満足にできなかったが) ちゃんとついていけて、成績もトップクラスであることが分かったので、自信を持てた、ということがあった。それで次の学期は積極的に日本で学んだことのないクラスを取り、ものすごく苦労することになったのだが、そこで出会った Syntax という名前の言語学の授業がとてもおもしろく (いま考えると類型論の授業だったような気がするが)、大学院で自然言語処理の研究をしようと思うきっかけになったので、人生分からないものである。

昼は科研費の申請書を仕上げ、明日は時間が取れるか分からないので、提出。前も書いたかもしれないが、最初4年計画で書いていたのを、具体的に書くと4年は難しかったので3年に縮めたのであるが、書き終わってみると収まりもよかったので、それくらいの長さがちょうどいいのかもしれない。ようやくどれくらいのスパンで考えてどう回せばいいのか分かってきた感じだが……。

午後は原稿執筆。筆が進まず他の記事を読んだりする。結局紙の上でアイデアを固めるフェーズと、とにかく分量を埋めるフェーズと、削ってクオリティを上げるフェーズがあるのだが、それぞれ前の段階がちゃんとしていないと進まない。

夕方は学内実習のミーティング。元々は数GBのテキストデータから抽出した情報を Python で扱おうとしているのだが、毎回「実験に時間がかかって終わらない」という報告を受けるので、その度にデバッグ

もちろん最初は小さいデータから始めるべきであり、少しずつ倍々に増やしていけば、実装が完成する前からデータ量に苦しむということはないのだが、今回はその問題はおいておく。

プログラミング的な落とし穴はいろいろあって、数千万エントリを扱おうとすると、入れるデータ構造や、配列なり辞書なりのリサイズのコスト (ハッシュの衝突が起きると線形探索になったりするので) を考えたりする必要があり、要素数が事前に分かっているなら確保しておくとか、知っていれば (プログラミング的な) 解決方法も探しようがあるが、知らないと「どうして遅いのか分からない」という状況になりがちである。そういうことを考えないでいい Hadoop みたいなフレームワークに投げるというのも一つの解決策だろうが、せっかくいろいろ試せる学生なので、こういう計算量だとかデータ構造だとかアルゴリズムだとか、頭の訓練のためにやってみるのはいいと思う。

Hadoop を使うにしても、いま自分が書いているコードは、データ量に比例する計算量なのか、それともデータ量の2乗に比例するのか、平均ケース・最悪ケースではどうか、ということを意識しないと、結局は同じ問題に行き着くので……。単に遅い、と思うのは感想であるが、理論上 O(n) のはずなのにどうやら O(n^2) かかっているようだ (あるいは速度は変わらないはずなのに、データを増やしていったらなぜか遅くなるとか)、となったら、どこかの処理が O(n^2) になっていると勘を働かせて、あやしそうなところを調べてみたり、といった機転を利かせるとよい。

実験するにしても、結果を予想しながら実験することで、予想と違ったとき「あれ、どうしてだろう」と考えることができるので、ただ漫然とやるのではなく、常に「こういう結果になるはずだ」と確認しながら進めるといいんじゃないかな。

などと偉そうに書いているが、自分もただでさえあまりコードを書いた量は多くないのに、最近は輪をかけて自らコードを書く時間がないので、もう一度がっつり書ける環境に行きたいなぁ。(ここまで書いて、「コード」を「論文」に変えても同じであることに気がついた……)