確率的プログラミングその3、Making Money Using Mathを読んだ
dipplの話とか難しいなぁ、とか行ってたら、なんかomo先生がHaskell使えば余裕ですよ!Erik Meijerも言ってた!とか言ってこの文書のurlを勧めてきた。
その時はHaskell厨乙、とか思ってちらっと見ただけでスルーしてたが、その後別の所でACM Queueで一番読まれた記事だよ!みたいなツイートが流れてきて、へぇ、と思って読んで見る事にしたら、これが素晴らしかった。
なお右上のリンクからpdfが落とせて、これだと文字化けとかも無いのでオススメ。
まず、以前確率的プログラミングその2、probmodsの最後で自分が書いたぼんやりした認識がもっとずっとちゃんと書かれていて、しかもエレガントで感動した。
JPTのような物、と自分が言っていた事をlistモナドのような物、として扱う。 これがリストで無い事は誰の目にも明らかだが、モナドである事は無限の長さでルックアップが一瞬な何かと思えば当然な訳で、これは直感的でありながら本質的に正しい説明だ。
そしていまいちスッキリしていなかったsampleがLINQのクエリ式のfromに相当する、と書いてあって、なるほど、と納得した。 モナドのシンタックスシュガーが素晴らしいのは、一度このやり方に慣れてしまえば、向こう側の世界とこちら側の世界がわかりやすく分かれる所だよなぁ。 そしてwebpplではなかなか理解出来ないのも当然だなぁ、と思った。
非常に気持ち悪いconditionもLINQに直せばただのwhere句で何をやるかは明白(実装はそうでも無いが)。
こうして基礎となる部分をLINQ式で説明したあとに、webpplにつなげる。 気持ち悪い部分は全て理解出来て、自分の知らないうちにwebpplの入門が終わっていた事を知る。 素晴らしい。
これだけ短い文書でありながら、確率的プログラミングの基礎としてはほぼ全てを網羅していて、しかもとても分かりやすく本質的な所が理解出来る。 高い抽象度は数学ヲタクどもの自己満足では無くて、こうやって物事を凄く分かりやすく説明するのに役立つだろう?と示してみる事で、 関数型言語凄いだろう、というポジショントークまで出来ている。 おっさんたるものこういう文書が書きたいものだ。
自分には良くわからなかった所
Figure 2のあたりは良くわからなかった。rejecting samplingとかimportance samplingとかは、以前一通り理解したはずなのだが。 たぶんこの文書を理解出来るほどはしっかり理解出来ていないんだろうなぁ。そのうち復習したい。
最後の強化学習のくだりも良くわからなかった。強化学習知らないので仕方ない。そろそろやらんとなぁ。
雑感
Erik Meijerは凄い奴だなぁ、と思った。 凄く最近の流行りを非常に根本の所から理解していて、他とはレベルの違う解説をしてみせる。 これは20年位前の彼のパーサーコンビネーターのpdfの頃からそうだったが、 ちゃんと今流行ってる話題でやって見せる所が凄い。 Voltaとかやってた頃はろくでも無い事やってるなぁ、くらいの認識だったが、Rx以後は本当にいい感じだよねぇ、Erik。
webpplの既存の解説の難解さとこの解説の分かりやすさの違いの根底に、 関数型プログラミングの知識が根付いているのは印象的だ。 自分はこれまでの人生で関数型プログラミングの知識が実務で明らかに必要、 と感じたのはパーサーコンビネーター使う時とSpark使う時くらいで、 両者もその辺なしでもとりあえずは生き残れる感じだった。 だが今回は割と開幕のsampleとconditionの所で出てきてしまうので、 迂回するのはまぁまぁ困難に思う。 もし確率的プログラミングの時代が来たら、 プログラマは初めて関数型プログラミングの知識を必須とされる所に立たされるのでは無かろうか。
一方で確率的プログラミングが流行るのか?というのもかなり疑わしい気がする。 この文書を理解出来るのは、おそらくプログラマの3%くらいじゃないか。 この文書で扱う話題を全部無視して、中をまったく理解せずにコードを書く事も不可能では無い。 だがそれは、なんだか分からない所で試行錯誤しながらコード書く事になるので、 何もわからずにググってコピペして動かないのを勘でいじって動かすやばいwebプログラマと、大多数が同レベルになってしまう。 皆がそんな風に書いたコードで役に立つプロダクションが作れるとは思えない。 でもこれを理解出来る人材を集めるのは、かなり絶望的じゃないか。
この文書はモナドを相当ちゃんと理解してないと読めないだけでなく、 さらに確率計算も相当慣れていないと読めない。 後者は基本的な積の法則やベイズルール、同時確率などを理解しているだけで十分なので凄く難しいという訳じゃない。 だが、プログラマは普通そのくらい分かるか?というと、そうとは言い切れない気がする。 特に同時確率のあたりの知識をちゃんと持っている人は、機械学習屋くらいにかぎられるのでは無いか?
自分個人としては、必要としている物には馴染みが深いので、 流行ってくれると活躍しやすいとは思う。 LINQは実務でも結構使ってて、自分でSelectMany書いた事も何度かあるので、 ちゃんと根本から理解出来ていると思う。 やっぱり実際に書いてデバッグした経験があるかどうかの差はでかいよね。 やってて良かったC#。 無駄にPGMとかに凝ってた時代があるおかげで、Joint Probability Tableを使ったシステムには馴染みが深い。 課題で自分で実装もしているし、勉強会の当番だった為、Beleaf propagation周辺の証明は全部自分で出来るようにもなっている。 PRMLも結構がっつりやったおかげで、確率計算も機械学習屋としては結構自信がある方と言える。
ただ自分の事はおいといて、確率的プログラミングが流行ったら、やばい時代が来るなぁ、と思う。流行るかな?どうかな?