実験に用いるデータはどうするべきかという疑問

ソフトウェアの更新も一人旅になってきた - ny23の日記の追記から)しかし,実装への力の込め方(プログラミング言語の習熟度)でこれだけ速度に違いがでるとなると,論文のネタ(あるいは飯のタネ)になるようなアルゴリズムの改善による高速化も,ある程度ちゃんと実装した上で議論しないと砂上の楼閣というか儚いものだ.実装(最適化)が下手な方が(あるいは,高級言語を使った方が)差が出やすいので,下手は下手のままのほうが研究者としては何かと幸せかもしれない.
以前から,精度で論文を書くよりは速度で論文を書く方が自分には合っていると思っていたが,

速度を議論する場合も,差を数字に縮退する時点でやはり情報は落ちてしまう.こちらはこちらで悩みは尽きない.id:s-yata さんも宣うように,

もある.ちなみに,速度差を示す実験に使う実装については,自分は(自分が実装に使う C++ と同等の)C/C++ 以外の実装は使わないようにしている*1.あと,C/C++ で実装されていも,実装の力加減で10倍ぐらいの速度差は簡単につくので*2,いわゆるアルゴリズムマニアというか,実装するだけの early adoptor の実装は避けて,実用を前提にした実装しか使わないようにしている*3.ベースライン的な手法はなるべく自分で(その時点の全力で)実装する.
まあ,実装をどうするかも問題だけど,実験に使うデータセットも問題で,実験に使うデータセットの取捨選択にはある種のセンスと割り切りが欠かせない.うまくいくデータセットだけで論文を書くのはやはり心苦しい.自分の過去の研究では幸いそうでない場合が多かったが,単に最初に試したデータセットでうまくいったというだけかもしれない.実際にはこのデータセットではうまくいかないということは多そうだ.
論文を量産するには,焦点を絞るというか,良くないところには目をつぶって良い所に目を向けて(多少実験の多様性が損なわれても)結果の出るデータセットで論文を書くという割り切りが必要になるのだと思うけど,まあ,なんだか虚しいのには変わりない.データセット駆動でアルゴリズムを考案する場合は,最初に選択したデータセットでは効果が出ているはずである.その後,どこまでデータセットを増やすか.データセットごとに効果が顕著だったりそうでなかったり.悩ましい.
データ中立度が高いアルゴリズム屋やデータ構造屋なら,計算量で改善が示していれば,実験はおまけと考えて,実験にはあまり拘らないのかもしれないが,自分は応用分野の研究者だからデータと離れたところでは議論できないし,計算量には現れないところで大きな差が出るのが現実なので,やはり実用的な実験を見たいし見せたい.
さらに,実験環境についても問題で,

のように,実装の最適化オプションが足りないというケースもある(このケースでは4倍ぐらい差が出た).メモリ使用量も float / double で単純に2倍差がついたりとしょうもないところで大きな差がついたりする.可能な限り公平でありたいとは思うが,度が過ぎるとストレスが溜まる.再実験の必要がない,数字だけの引用で済む精度報告の論文は楽でいいなあ(効率が良いなあ)と思ったり.
よくよく考えてみると,この悩みは精度主義の研究分野で速度で飯を食っているから(データの選択に自由度があるから)という気もしてきたな.しかし,典型的なデータセットで速度(スケーラビリティ)評価する分野でも,同じデータセット固執する限り精度評価する分野と同じような儚さがあるので,やっぱり自分でデータセットを取捨選択する方が(大変でも)気が楽だ.あんまりごちゃごちゃ考えないほうがよかったか.

*1:これは当たり前のように見えるが,Dynamic Programming for Linear-Time Incremental Parsing (ACL 2010) のようにそうでない論文もある.みんな C/C++ にしようとまでは言わないが,スクリプト言語は勘弁して欲しい.

*2:例えば,オンライン学習のデータの読み込みに std::string を多用するなどして,10倍ぐらいの速度差がつくとかよくある.メモリにデータが載った状態だとアルゴリズムの理解だけで何とかなるが,違うレイヤーの記憶領域が絡むととたんにややこしくなる.キャッシュ(あるいは変数の寿命や配置)を意識するかしないかでも結構影響があるし.

*3:某全国大会@大岡山二日目 - ny23の日記でも同じようなことを書いた.