データ解析作業の救世主! 超絶☆実験ビルドシステムmafをOSS公開しました

beam2d
リサーチャー

2013-12-25 13:39:24

Photo by midiman. Used following a Creative Commons License. Taken from https://www.flickr.com/photos/midiman/90232391/
Photo by midiman under Creative Commons License (original)

メリークリスマフ!

得居です。今日はクリスマスですね。皆様昨日はいかがお過ごしでしたでしょうか?

クリスマスということで、今日は私たちから皆様に、特にデータ解析や論文執筆、手法の比較検証のために計算機上で様々な実験をしている方々に、プレゼントがあります!

Github – pfi/maf

今日、実験結果を「ビルドする」ためのツールmafを公開しました!

mafは、PFIでもよく使われているPythonベースのビルドツールwafを実験に使うための拡張です。大まかな使い方を学ぶために、ドキュメントとサンプルも公開しています。

maf — maf 0.1 documentation
サンプル

実験手順をビルドだと思って宣言的に書くこと自体はwaf等既存のビルドツールで可能です。mafはこの手順のうち、パラメータだけが違うという部分をまとめて書くための仕組みや、実験特有の手順(プロットなど)をサポートするようなライブラリを提供しています。

例えば5-foldの交差検証を行う例は以下のような雰囲気で書けます。なんとなく何をやる実験なのかわかるでしょうか? 正確な書き方はドキュメントやサンプルを参照してください。

...  # import等

def experiment(exp):
    # 5-foldの交差検証のためにデータセットを5通りに分割
    NUM_FOLD = 5
    exp(source='dataset',
        target='train test',
        # parametersを指定することで、パラメータ付けられたタスクや
        # パラメータ付けられた出力ファイルを作ることができる
        parameters=[{'fold': i} for i in range(NUM_FOLD)}],
        # 1行1データの形式のデータセットを5通りのtrain testに分割する
        # 出力されるtrain, testは'fold'パラメータでパラメータ付けられる
        rule=maflib.rules.segment_by_line(NUM_FOLD, 'fold'))

    # 分割した各foldに対して実験
    exp(source='train',
        target='model',
        parameters=maflib.util.product({  # 全組合せを実行
            'param1': [1, 2, 3, 4],
            'param2': ['a', 'b', 'c']
        }),  # 'fold'はもう指定しなくて良い (trainに紐付いている)
        rule='my-train ${SRC} ${TGT}')

    # ここにはもうfold, param1, param2などのパラメータを指定する必要はない
    # (modelとtestに紐付いているので)
    exp(source='model test',
        target='result',
        rule='my-eval ${SRC} ${TGT}')

    # 各foldにおける実験結果における'accuracy'値の最大値を取る
    exp(source='result',
        target='max_accuracy_result',
        aggregated_by('fold'),  # foldパラメータを「潰す」
        rule=maflib.rules.max('accuracy'))

    # 結果を可視化
    exp(source='max_accuracy_result',
        target='result.png',
        rule=my_plot_fun)

# 結果をプロットする方法はmatplotlibを使って書ける
@maflib.plot.plot_by
def my_plot_fun(figure, plotdata, parameter):
    ...

my-trainとmy-evalという学習・評価コマンドさえあれば、データサイエンティストや研究者の方なら誰でもforループを使って書いたことのある面倒くさい、そして意外とややこしい交差検証が実質3行で書けます。my-trainやmy-evalのコマンド部分はpython関数で書いて指定することもできます。

maf開発の背景は、実験の複雑さです。データを解析したりアルゴリズムの比較を行う際に、実験手順をスクリプト(shell, python, ruby…)でよく書くと思います。最初は単一のデータに単一のアルゴリズムを一回適用して結果を見るだけだったりするので、直接スクリプトを書くので十分なのですが、他のデータに適用したり、他のアルゴリズムや異なる設定(パラメータ)と比べたりし始めると、実験手順と実験結果の管理に割くコストが上がっていきます。機械学習の実験だとさらにデータを複数通りに分割する必要もあったりして、データの管理も必要になります。これを最初のスクリプトの延長で書き続けると書いた本人にしか読み解けない複雑な実験スクリプトができあがったり、実験に必要な手操作が本人にしかわからなくなったりします。メンテナンス性を上げるために実験のためのドキュメントを書き始めると、管理コストはさらに上がります。

様々な設定での実験手順と実験結果、およびそれらの集約と可視化、これらを宣言的に記述して途中で生成されるファイル群の管理をうまく隠蔽することができれば、実験とそのメンテナンスにかかるコストは大幅に下がると期待できます。mafはこれらを実現することを目指して開発されました。

mafは辛い実験生活をサポートしてくれる縁の下の力持ち的な存在です。ぜひ一度試してみてください。フィードバックやPull Reqなどもお待ちしております!

技術を実用化する

岡野原 大輔
リサーチャー

2013-12-10 17:03:20

論文の最後に「この技術はこれから様々な場面で役に立つだろう」と書いてあるのを読んだり、実際に書いた人がいると思います。研究者の視点からは「十年に一度のすごい発見が起きた」場面に出くわし、世の中にどのような影響を与えるのだろうと思うこともあります。しかし殆どの技術は世の中で活かされることはありません。なぜなら技術を実用化するには非常に多くの困難が必要とされるからです。

そもそも、殆どの技術は誕生したとしても人の頭に留まっています。ものすごくいい手法を思いついた、としてもそれを言語などで外在化させない限り、その技術がその人以上に世の中に広まることはありません。有名な例でBurrows-Wheeler変換という今のゲノムシーケンシングを支える技術はWheeler氏が「あまりにも当然である」ことから論文化していませんでした。Burrowsの勧めでこの技術はDECの社内報として発表され、現在のように広く知られ使われるようになりました。他の人に伝えることで実用化は一歩進みます。

また、多くの研究者は外在化として論文になり有名雑誌に採択されることを目標とします。しかし、その段階ではそのコミュニティの人がたまたまその論文を読んでいた場合にしか知られることはありません。現在コミュニティは非常に細分化されてしまい、効果は限定的です。実用化されるには論文を雑誌に通すだけでは不十分なのです。こうしたことからSNSやマスメディアなど様々な方法を使って研究者達は自分の手法を外部に伝えるようになってきています。

最近多いのは第三者が論文を読んでブログやSNSで紹介したり、勉強会やワークショップで共有するケースです。これは技術が広まるにはすごく良いことです。紹介されなければその技術は永遠に知られず眠ったままでしょう。こうした活動のおかげで眠っていた技術が世の中で再発見されたという例は数多くあります。

私が所属しているコンピューターサイエンスの分野であれば、技術を実際にコーディングし、OSSなどで公開する例も増えてきています。技術を実際に理解できる人(能力的にも時間的にも)はごく一部なのでそれが利用可能な状態になっているのは技術の実用化にとっては大きな進歩です。

同じ分野の人に知られることはなんとかできたとしても、実用化ではありません。ここからが大きな壁になります。技術は、それを全く知らない人や業界に対して役に立つという場合が殆どであり、ここまで実現できればはじめて実用化されたといえるかもしれません。実際に利用してもらうには、製品化、サービス化が必要になります。

こうした製品化、サービス化は一見簡単そうにみえても、多くの問題がでてきます。その実現には元々の技術が解こうとしていた課題以外の無数の課題を解く必要があり、そちらの課題の方が困難だったりする場合も多くあります。

また、製品化、サービス化できても使われないかもしれません。顧客が欲しがっているものは違っているかもしれないし、気づいていないだけかもしれません。ここはシーズベースで考えているからだと言われればそうなのですが、技術がわかっている人だからこそ見える世界もあるとは思います。ユーザーが本当に何を欲しているのかを考えるのは難しいことですし、有名なフォードの言葉を借りれば「馬を乗っている人に何が欲しいかと問えばもっと早い馬が欲しいと言うだろう」という可能性もあります。

昨今、技術の新しい広がり方をみる場合が増えてきました。例えば深層学習という分野では、技術を持っている人が丸ごと企業に取り込まれるという例がいくつかみられますし(google, facebook)、使った技術をOSSで公開して広めたり、自分が所属している企業とは別の団体で広めようとしている例もあります。

最初、技術を実用化するという単純な思いからはじまった会社もいろいろあり、現在に至っています。未だ試行錯誤中です。