PyData NYC参加レポート
PyData Tokyoオーガナイザーのシバタアキラ(@madyagi)です。
本家のPyDataカンファレンス
日本では先月始まったPyDataコミュニティーですが、実は2012年に始まっている本家のアメリカのPyDataコミュニティーとの交流は未だ始まっていませんでした。折しも本家では半年に一度行われるPyDataカンファレンスが2014年11月22日から23日の日程でニューヨークで行われることになっており、オーガナイザーの田中と2人で行った研究発表も兼ね、参加してきました。
カンファレンスのアジェンダはこちらからご覧いただけます。
登壇者はビッグデータのインフラをフル活用しているエンジニアから、並列計算にはまったく興味のない研究者まで非常に幅広く。Pythonのツールを使ってできる新しいことや、研究発表を行っていました。
今回のカンファレンスからのハイライト
今回私が参加したセッションの中から、特に注目に値すると思ったものをいくつかピックアップしてお伝えしたいと思っています。
ビッグデータへのインターフェースとしてのPython
PyDataオーガナイズの母体ともなっている、Continuum Analytics(Numpyの開発者だったTravis Oliphant氏がCEO)のエンジニアの発表の多くが、分析インフラに関してのお話でした。
彼らはBlazeというライブラリで、既存のNumpyやPandasといったインターフェイスレイヤーを拡張することで、同一インターフェイスでさまざまなデータバックエンドへのアクセスを可能にしようとしていました。
具体的には、このような形で、データと計算を別々に定義することがポイントです。
>>> from blaze import TableSymbol, compute >>> accounts = TableSymbol('accounts', '{name: string, amount: int}') >>> tsum=accounts.amount.sum() >>> from pandas import DataFrame >>> df = DataFrame([['Alice', 100], ['Bob', -200], ['Charlie', 300], ['Dennis', 400], ['Edith', -500]], columns=['name', 'amount']) >>> compute(tsum, df) 100
そうすることで、仮にデータの入っているバックエンドが変わったとしても(下記の場合、DataFrameから、numpy.ndarrayに変換している)同じ形で計算を行うことができます:
>>> from blaze import into >>> L = into(np.ndarray, df) >>> compute(tsum, L) 100
オンメモリーのデータ・タイプだけでなく、SQL、MongoDB、Sparkなどにもすでに対応しているということで、いろいろな使い方ができそうですが、一方で、チュートリアルからちょっと外れたことをするとすぐにうまく行かなくなったりして、まだ開発段階という感じが強かったです。
Sympy
Blazeの開発者のRocklin氏が関わっているのが、Sympyという記号計算ライブラリです。SageやMathematicaなどのように、数式を記号的に処理するライブラリです。例を見てみると一目瞭然です:
>>> from sympy import * >>> from sympy.abc import x, y, z >>> expr = sin(x)**2 + 2*cos(x) >>> expr sin2(x)+2cos(x)
例えば、これを微分し、xに1を代入して、50桁の精度で計算してみると
>>> ezpr=expr.diff() 2*sin(x)*cos(x) - 2*sin(x) >>> expr.subs(x,1).evalf(50) -0.77364454279011131790898477734885315654287115014885
このような計算が非常に簡単にできてしまいます。先ほどのBlazeと違い、Sympyは非常に開発が進んで安定したライブラリです。計算式は、さまざまな言語で書き出すことも可能です:
>>> from sympy import latex, fcode, ccode >>> latex(expr) '2 \\sin{\\left (x \\right )} \\cos{\\left (x \\right )} - 2 \\sin{\\left (x \\right )}' >>> fcode(expr) #fortran ' 2*sin(x)*cos(x) - 2*sin(x)' >>> ccode(expr) #c '2*sin(x)*cos(x) - 2*sin(x)'
Beaker
今回私が見たセッションの中でも特に面白かったのがこのセッションです。Beakerというオープンソースのプログラムで、PythonだとiPython notebookに近いものです。何ができるのかというと、複数の言語を同時に走らせることで、それぞれの言語の得意とすることを組み合わせることができるというものです。Beaker.appをインストールすると、ローカルホストで、ノートブックが立ち上がり、ブラウザを通じてプログラムを実行できるようになります。例を見てみましょう、ここではPythonを使って、ランダムなグラフのデータを生成しています。
最後の行で、
beaker.graph = {"nodes":nodes, "links": links}
となっているところがポイントで、ここで、生成したデータをbeakerという変数に渡しています。このbeakerという変数がこのノートブック上どこからでもアクセスできるようになっています。次に、唐突ですが、HTMLでスタイルを定義します。
そして、今度はJavaScriptでd3を使ったビジュアライゼーションを書きます
ここで、先ほどのbeaker変数からデータを取り出しているのが分かります。このように複数の言語を組み合わせる上で、データを書き出したり読み出したりすることが非常に簡単に1つのノートブックから行うことができます。結果として現れるのがこのようなビジュアライゼーションです:
このように、それぞれの言語の強みを活かし、複数の言語を同時に操ることができるという、非常に新しいアイディアが会場を沸かしていました。ところで、このプログラムを発表していたScott Draves氏は、以前はGoogle Mapsにも関わっていた方で、またSoftware Artistとして、非常に美しいビジュアルを生成するプログラムを書いてきたことでも知られている人物です。
ディープラーニングを使ったサムネイル生成
2日間のセッションのプログラムには、私も発表者として参加しました。PyData Meetup #1でもテーマとして扱ったディープラーニングを使ったミニプロジェクトの発表です。私がCEOを務めている白ヤギコーポレーションのニュースサービス、「カメリオ」では、ニュースの見出しに横長のサムネイルを切り出して使っています。その横長の形ゆえ、重要な部分が切り取られてしまうという問題が以前から発生していたのでした:
このため、今回のプロジェクトでは、各イメージの中にある「面白そうなもの」を特定し、画像内の面白さマップを作ることで、その部分を中心にした切り出しを可能にするというものです。ディープラーニングを使うためには、まず面白そうなものが入っている領域を切りださなくてはなりません。この技術はセグメンテーションという手法を使って最近大きく進歩し、Selective Searchというアルゴリズムを使うことで、従来のSliding Windowと呼ばれるBrute Force的な切り出しから大幅に改善することができました。大体それぞれのイメージから200位の領域が切りだされます。下図の赤い四角がそれです:
ここで切りだされた各領域にディープラーニングのライブラリであるCaffeを使って、すでにトレーニングがされているネットワークを使います。そうすることで、人間に取ってより興味の対象となる領域に高いスコアを割り当てることができるようになります。このようにして計算されたスコアをヒートマップ化したものが下図になります:
ネコや、女の子の顔の部分が特に赤く(スコアの高い)判定がされていることが分かるかと思います。このようにして特に「面白い」と判定された領域を最も多く含むようなサムネイルの切り出しをすることで、以前のように重要な部分を切り落としてしまうということを減らすことができます。
実際には、この手法はまだ実用にはあと一歩というところです。というのも、標準的なCPUを使うと、一枚の写真を処理するのに、数分かかってしまうのです。特に処理時間の大半を占めるCaffeはGPUでの動作をさせたり、スピードアップをすることが可能なため、そのような形で今後実用化を検討していきたいと思っています。
なお、この分析に関するより詳しい詳細は、「カメリオ開発者ブログ」でご覧いただけます。
PyDataオーガナイザーとも今後の運営について意見交換
今回PyData NYCに参加したのには、もう一つ理由がありました。運営者の方との面談です。PyData Tokyoを初めて以来、本家のUSコミュニティーとは未だお話ができていなかったのです。
あるセッションの後に前述の主宰者のTravis Oliphantに声をかけたところ、「いいねぇ、そういうふうにどんどん広げていきたいんだよ」とノリノリのお返事。さらに、事務局のLiah Silenさんからも、「そういう活動はWelcomeよ、スピーカー呼んだり手伝えることがあったら何でも言ってね」と拍子抜けするくらいウェルカムな雰囲気で、今後のコラボレーションが楽しみになりました。今後も「PythonとDataを通じて、世界中のエキスパートと繋がれる」コミュニティーを目指して頑張りたいと思います。