Haskell でProbabilistic programming

  • 昨日の記事HaskellをベースにしたProbabilistic programmingであるHARUKAのメモをした
  • HaskellでのProbabilistic programmingについて、このドラフトペイパーに基づいて少し勉強する(ドラフトペイパーの中でFalse positive, True positiveの使い方が間違っていて、大丈夫かー、と思わないでもないけれど…)
  • どうしてProbabilistic programmingか
    • 確率事象を扱うとき、バリエーションがあってそれぞれに合わせて実装することは簡単だが、そうすると、それらを使ってやりたい本来の確率的・ベイズ的考え方が実装に見えてこない。とくに代数部分が見えなくなる。その課題を解決してくれるのがProbabilistic programming
    • 分布:離散、連続、パラメタ数不定
    • 測度のバリエーション
    • フィルター
    • 推定プロセスの構造化
    • サンプリング方法のバリエーション
  • どんな感じなの?
    • 確率密度分布・確率質量分布は、サポート(台)があって、そこに実数値が対応づいたものとみなせる
    • サポートはその要素数が有限個であろうと無限個であろうとリストとして持てる
    • リストは、Haskellではリストモナド。リストという箱に要素が格納されていて、関数を作用したりするときには、リストモナドから要素を取り出して、作用して、リストモナドとして返す、という作り
    • この「確率密度・確率質量」という値を持ったサポートの1要素、もたくさんあって、それをリストモナド(的に)持つ。これが確率モナド
  • どうしてモナド
    • モナドの考え方は広く計算機処理に使われるが、Haskellでは多用するし、モナドを前面に出した説明がされることが多い
    • 処理順序・処理方法のハンドリングルールのようなもの。どんどん一般化すると、半順序があるところに、処理系列を定めると、半順序に沿って処理するのもありだし、「処理」と「処理対象の値の変遷」とを分離して、「処理」の層だけかいつまんだりすることも可能にしたくなるが、そのときに、「箱」としてのモナドのみを連結再構成する、というのはよい考え