最近の興味

ありすぎるのでまとめておく

アドテクへの機械学習の応用

これは会社を作ったのだからなんとか製品化できるものを見いだしたいと思っている。カルマンフィルタや粒子フィルタ、LDAやDeeplearnig等を研究している。バンディットアルゴリズムベイジアンネットも有力だと思う。
メディア分析、マーケティングデータからのナレッジ自動生成といったところも断片的にアルゴリズムを作っているという段階。早く製品リリースせねば。。
昨年やりかけたDSP/RTBとスマホネイティブのクロスプロモーションアドサーバはオープンソースにしちゃおうか迷い中。前者はOpenRTB(C++LuaとPyton)と簡単なキャンペーン情報から入札ロジックへの変換プログラムと簡単な管理画面(Node.js)、後者はリワードで良くあるインテント戻しでユーザ識別する機能とかオフラインキャッシュとか諸々実装したAndroidアプリ向けのシンプルなアドサーバ(Node.jsとPerl)。

O2O/リアルイベントに特化した情報キュレーションアプリ

これはWebクローラが必要で、ぼちぼち作っている。なるべく「イベント情報ポータル業者」から情報をパクるという方法は避けたいと思っていて、きちんと情報元から情報を取ってこられるような作りを試行錯誤している。マークアップの違いをうまく吸収してイベント情報の意味的なタグを付与してDBに登録するまでが大変。
アプリ側のキュレーションやソーシャル機能は考えるまでもなく実装すれば済むところなのであまり心配はないのだが、僕一人でやっているのでそうしたアプリ開発はさっと済ませるようになっておかねば。あと現状、Webアプリを作るときにさっと使えるのがNode.js+expressしかないので、Play2.0とdjangoのいずれかはもう少しさくさく使えるようになっておきたい。

証明駆動開発と型システムの述語論理的拡張

プログラムの動作を保証しながらコードを書けるCoqというプログラミング言語が面白そう。業務で実践活用するわけではないけど、自己啓蒙として。あとHaskellを含め現在普及してる型システムはいわば命題論理的なクラスであってCoqのそれは述語論理的な拡張を施したものと見なせるんだとか。そういうテーマにも興味ある。あと圏論コンピュータサイエンスに関わるところだけでも学びたい。Haskellプログラムの圏とか。

WebWorkerを使ったグリッド余剰計算資源の仲介サービスとビットコイン採掘によるマネタイズ

HTML5対応ブラウザに実装されているWebWorkerを使ってグリッドコンピューティング的な事が可能だと思う。従来の計算グリッドは専用の計算クライアントをインストールする方式(Folding@HOMEとか)だがWebWorkerを使えばブラウザでWebサイトにアクセスするだけで計算リソースの寄付が可能になるはず。計算処理をJS上で行うのは非効率な気もするがV8エンジンはマジで速い。Javaの2/3くらいのスピードで動作するし。
あとビジネスモデルとしては、そのWebサイトをアカウントでログインできるようにして余剰計算リソースの提供した分だけあとでグリッドを使えるようにして、計算資源の時間差取引の仲介サービスを運営するというのを考えた。クレジットポイントみたいのをやり取りする感じ。でサイト運営者は全計算リソースの2〜3割程度を仲介手数料的に徴収し、ビットコインの採掘を行ってマネタイズするというものだ。どうですか、面白そうじゃないです?

FreeFem++を使ったオレオレPDEソルバー

コンピュータ上でいろんなモノ作りを支援するCAEの分野では対象物の形状を3次元CADデータとして物理法則を偏微分方程式(PDE)としてモデル化し、その方程式を解く事で性質を分析するが、その際に有限要素法(FEM)というのが良く使われている。FEMはいわば計算のフレームワークを提供するものでPDEのタイプによって色んな工夫が必要になる。FreeFEM++はそういう部分で実装支援してくれるC++フレームワーク。流体や熱伝導や衝突変形等のシミュレーションと可視化をやってみたい。微分方程式というのは要は局所的な構造がマクロな性質を決定するようなメカニズムを記述するテクニックだと思うので、統計処理にもそういう知識が転用できるんじゃないかという期待もある。
FEMは方程式の解を物理空間上の関数とみなすオイラー法というカテゴリに含まれる手法で他に差分法や有限体積法というのがあるが、いっぽうで解を質点上の関数として解くラグランジュ法というカテゴリもあって粒子法というのが最近出てきていてそれも面白そう。

MD法を使った分子シミュレーション

昨年のノーベル化学賞はこのMD法の開発者に授与された。上で述べたFEMや粒子法は物理対象を連続体とみなしてモデル化するものなので、分子レベルのミクロな性質を直接分析することが出来ない。それには原子や分子の振る舞いをモデル化する必要があって量子化学という理論はあるがそのままでは状態数が多すぎて計算出来ないので精度よく近似する工夫が色々必要になる。原子間レベルではMO法(分子軌道法)、分子間レベルではMD法(分子動力学法)というのが使われる。そこでは微分方程式を立てるのではなく分子や原子に相当するオブジェクトをたくさん(アンサンブルと呼ぶ)作って、それらを一連の法則に従って動かす事で全体的な性質を見るという使い方をする。解きたい物理系に応じてアンサンブルに課す性質やポテンシャルエネルギー(力場という地図みたいなデータをプログラムに与えて動かす)を変える事で色んなシミュレーションが出来る。簡単な所から始めて例えば希ガスの沸点とかが分かったりすると面白そう。コードはJuliaで書くのがいいんじゃないかと思っている。
システムバイオロジー、ナノテクノロジー、新材料といった21世紀に飛躍的に進歩しそうなところの基本的な技術なのでぜひ習得して何らか関われたらいいな。

ProcessingやClojureを使ったアルゴリズムアート

絵を描いたり曲を作曲したりしてみたいってずっと思ってるのだけど、ちょっと試しては挫折するのを繰り返している。数年前に作曲をしてみようと思ったときにまず音楽理論を勉強して、大変面白かったのだがそれで良い曲が作れたわけではなかった。なのでプログラミングの延長線上で出来ないかなと思う。
Processingという言語があって、メディアアート向けの機能がそろっている。最近だとprocessing.jsなんてのも。この手の動きのあるデータを自動生成するときはLISPを使うのがいいという印象があって、ClojureでProcessingのコードやデータを生成するようなものを作ってみたいなと思う。フラクタルと現実世界の風景を組み合わせたような作品をプログラム的に作れたら面白いだろうな。
あとは既存の作品から特徴抽出して模倣するようなプログラムも面白そうだ。例えば音源のwavファイルを与えると内部で信号処理等を諸々行って楽譜と楽器構成を出力してくれるとか。使われてるボコーダやエフェクタの認識とか。

教示的プログラミング言語トランスレータ

あるプログラミング言語を学んで、それが手になじむようになってくると多くの人は他の言語に移行しずらくなったりすることが多いように思う。そこで自分のお気に入りの言語で書いたソースコードを入力すると、他の興味ある言語のソースに自動変換してくれて同じ処理をどう書けるか教えてくれるシステムがあったら面白いだろうなと思う。
もちろん言語を使い分けるメリットはそれぞれの言語がもつ特長を生かしてこそ生まれる。そこでシステムにはそれぞれのプログラミング言語における有効なコーディング方法などの知識をあらかじめ搭載しておいて、トランスレートの際にそれが適用出来そうならばユーザにその旨を教示するという機能が考えられる。そうすれば自分が慣れた言語でのコーディングが他の言語だと書き易くなるケースに遭遇することが増えて、適材適所でプログラミング言語を使い分けるようになるんじゃないかと。そういうシステムを作る事は、僕がいままで貯めた知識をかなりいかせそうなタスクだと思う。

テキサスホールデムポーカーの思考エンジンの開発

ホールデムはルールは単純なのにとても複雑で面白く世界中にプレイヤがたくさんいるので、コンピュータ思考エンジンを作るのにもってこいの題材だと思う。カナダのアルバータ大を始めとして世界では研究開発している人たちはいるけれど、機械学習の実験台としても魅力的なのででやってみたい。既にHaskellでゲームルールの処理を書いたりはしてみてるのだが、ちょっと全てをHaskellで組むのはあまりよろしくなさそうだと思い始めてる。

バンディットアルゴリズムの実装とライブラリ化

割と色んなアルゴリズムOSSのライブラリとして公開されている中で、バンディット問題だけはまだそんなに出そろってないように思う。研究レベルで色んなアルゴリズムが考案されているがプロダクションレベルのものはあまり見かけない。でもバンディット問題はビジネスの世界のありとあらゆる場面に適用可能な汎用的な問題であり、アルゴリズムの性能さえよければすぐに活用されうる類のものだと思う。上のポーカーの思考エンジンと合わせてバンディットアルゴリズムの実装とライブラリ化をしてみたいなって思う。

計算代数・グレブナー基底を使ったロボットのアームや姿勢の制御

5年くらい前からやろうやろうと思ているので早くやること。

イミュータブルなデータの並列処理をHaskell/Clojure/F#で

関数型言語は並列処理に向いている」とお題目のように耳にするのだけど、実際のところJavaC++でスレッド書いた方が速い気がするのでちゃんとその本質的なところを実践して身につけたい。software transaction memoryとかevaluation strategyとかdataflow DSLとかそういうところを使いこなせるように。Kindleで3冊洋書を買って読んでバックグラウンドの知識は得たところ。例題があるといいのだが、いいタスクはないだろうか。もう始めから時系列処理とか機械学習とかをやっちゃうべきか。

TopCoderでハイレートの人なら常識的に知ってるアルゴリズム網羅的習得

TopCoderは才能の面も大きいとは思うが、ハイレートの人と比べてまだ自分はアルゴリズムの知識が不足していると感じる。特にグラフ関連と数学関連のアルゴリズムが弱い。レッドコーダーになる目標を立てたものの相対的に興味が落ちてきてるので毎日強制的に30分とか時間をとるべきか。

C++をもっとちゃんとやる

C++は将棋ソフトの開発して以来しばらく使ってないので、eigenやアルマジロといった最近のライブラリを使って高効率なプログラムを書くスキルを身につけたい。何か題材を見つける必要があるけど何がいいんだろう。他の言語で書いてアルゴリズムの理解が出来たものをどんどんC++化していくという形にすべきか。

BUGSとStanを使ったベイズモデリングの実践演習

BUGSは教科書通りに3つくらいやってみただけでまだまだ。Stanはインストールすらしてない。最新のデータ分析スキルを身につけておきたいのでコンスタントに練習しないといけない。BUGS Book買ってやるかなぁ。

Deep Learningの実践的スキルの習得

Deeplearningはいわゆる次元削減をシステマティックに自動的にやる技術だと思うので、これを習得する事はかなり汎用性のあるスキルになると思われる。色んなメディアデータに合わせてネットワークを構築したりチューニングしたりっていうのを少しずつやっていきたい。

機械学習の包括的な理論的背景の勉強

甘利先生の情報幾何学や渡辺先生の特異モデルの理論のような、機械学習を包括的に見渡せる理論を習得して普段の開発における手法選択やパラメータチューニングにおける理論的な裏付けを強めたい。多様体や代数幾何や関数解析の知識が必要になると思われるので簡単じゃないだろうけど、40歳くらいまでにはこういうところはきちんと分かる人になっておきたいなって思う。

論文や教科書に載ってる数式変形をMathematicaで出来るようにする

Mathematica Home 8というのを数年前に買ったがあまり使っていない。RやMatlabと違ってMathematicaMapleは数式そのものの処理が出来るところが特徴なので、特にPRMLに乗っているような数式をMathematicaを使って自由自在に変形できるスキルを身につけたい。
いわば「かな漢字変換」を使う事で漢字を覚えておかなくてもよくなったように、Mathematicaを使う事で理論的な式変形を簡単にトレースできるようになりたい。

他にも

まだまだあるかも。思い出したら追加していく。

  • MCMCの実装。GSやHMC・NUTSなど実際に書いて理解する。CUDAやHadoop上の高速化とか。
  • 自然言語文章生成。データジャーナリズムというのが流行りつつある。ナレッジ自動生成結果を文章化。
  • Active Learning試す
  • 計算代数統計試す。研究が進められているものの一つ、分割表におけるp値を漸近的にカイ自乗値として推定するのではなく正確検定で網羅的に計算するとき計算量が爆発するのをグレブナー基底を求めてそいつの上をMCMCすることで真のp値の分布からのサンプリングで推定可能になるという手法。