---
title: 代数的エフェクトで確率的プログラミングを実装する
tags: 
author: [lotz](https://convert.docswell.com/user/lotz)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PJXVD6GYEX.jpg?width=480
description: 代数的エフェクトで確率的プログラミングを実装する by lotz
published: November 14, 24
canonical: https://convert.docswell.com/s/lotz/KEX89G-2024-11-14-192235
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PJXVD6GYEX.jpg)

代数的エフェクトで
確率的プログラミングを
実装する
2024/11/9 lotz


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3JKQX144JD.jpg)

速習モナド
C を圏として、C 上のモナドは自己関手 T : C → C と自然変換 η : 1C → T
と自然変換 μ : T2 → T の三つ組 (T, η, μ) であり以下の等式を満たすもの
μ ○ Tμ = μ ○ μT
μ ○ Tη = μ ○ ηT
monad in nLab


# Page. 3

![Page Image](https://bcdn.docswell.com/page/LE3P5QLDJ5.jpg)

確率モナド
• Meas を対象に可測空間、射に可測関数を持つ圏とする
• Meas の対象Xに対し GX を X 上の全ての確率測度の集合とすると、
これは再び可測空間になる
• ηX : X → GX を X 上のディラック測度を与える関数とする
• μX : GGX → GX を”確率分布の期待値”をとる操作と考える
• (G, η, μ) はモナドとなり Giry Monad と呼ばれる
Giry monad in nLab


# Page. 4

![Page Image](https://bcdn.docswell.com/page/8EDLD9N2JG.jpg)

確率モナドの実装例
確率モナドをHaskellで実装する例
https://twitter.com/lotz84_/status/1852633696089899016


# Page. 5

![Page Image](https://bcdn.docswell.com/page/V7P2XZ5L78.jpg)

確率モナドの応用
確率モナドを使えば確率変数の合成が容易になり
確率的プログラミングの記述が洗練される


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2JVDLWP6JQ.jpg)

確率的プログラミング
• シミュレーションだけでなくパラメータの推定にも用いられる
• プログラムの実行順序が逆転する
van de Meent, Jan-Willem, et al. &quot;An introduction to probabilistic programming.&quot;
arXiv preprint arXiv:1809.10756 (2018).
パラメータ
パラメータ
プログラム
プログラム
出力
出力


# Page. 7

![Page Image](https://bcdn.docswell.com/page/5EGYXDP2EL.jpg)

代数的エフェクト
• 計算エフェクトを代数的に表現できる
• 計算エフェクトの実行（実装）はハンドラに分離される
• Haskell での実装として Freer と Open Union を使った
Extensible Effects がある
ff
ff
Algebraic E ectsとExtensible E ectsの違いってなんや? 関係あんの?


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4JQM81297P.jpg)

ProbFX
• 代数的エフェクトを使った確率的プログラミングの実装
• 同じコードでシミュレーションも推論もできるマルチモーダルな性質
を備えている
• ProbFX2もあるが今回は触れない
Nguyen, Minh, et al. &quot;Modular probabilistic models via algebraic effects.&quot;
Proceedings of the ACM on Programming Languages 6.ICFP (2022): 381-410.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/K74V2RPRJ1.jpg)

ProbFXの再実装
• ProbFXではエフェクトシステムとOpen Unionが自前で実装されている
• 既存ライブラリを使って再実装を行い本質的な部分を抽出したい
• 使用するライブラリは以下
• freer-simple
• extensible
https://github.com/min-nguyen/prob-fx


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LJ13MQ9V7G.jpg)

ProbFXによるモデルの記述
• coinFlip は表が出る確率 p のコインの裏表を表す確率モデル
• 確率 p は [0, 1] の一様分布に従う


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GJWP3MQ372.jpg)

サンプリングの実行
• Model をどのように実行するかはハンドラが決める
• runSimulate というハンドラを使用し確率モデルからサンプリングする


# Page. 12

![Page Image](https://bcdn.docswell.com/page/4EZKVQWGE3.jpg)

runSimulate
• Model を Sampler に変換するためのハンドラ
• runSimulate もまたいくつかのハンドラの合成として実装される


# Page. 13

![Page Image](https://bcdn.docswell.com/page/Y76Q56GQ7V.jpg)

handleCore
• Env はモデルの外からパラメータを与える拡張可能レコード
• handleCore は Env を利用し Model の持つ二つのエフェクト
（ObsReader, Dist ）を実行するためのハンドラ


# Page. 14

![Page Image](https://bcdn.docswell.com/page/G75RY6V2E4.jpg)

handleRead
• ObsReader はパラメータをリストから1つずつ取得するエフェクト
• handleRead は Env から1ずつパラメータを取り出して Ask を実行する


# Page. 15

![Page Image](https://bcdn.docswell.com/page/9J2DGM31JR.jpg)

handleDist
• handleDist は Model における確率分布のエフェクト Dist を実行する
• Env によって観測値が与えられている場合は Observe に、与えられ
ていない場合は Sample に仕分けする


# Page. 16

![Page Image](https://bcdn.docswell.com/page/DEY2VX14EM.jpg)

traceSamples
• traceSamples は確率モデルの実行時に確率分布から値がサンプリン
グされた場合、その情報を記録するためのハンドラ
• Sample エフェクトの後に処理を差し込む動きをするため、エフェク
トは消費しない


# Page. 17

![Page Image](https://bcdn.docswell.com/page/VJN8M12678.jpg)

handleObs
• Observe エフェクトを実行する
• シミュレーションにおいては観測値をそのまま返すだけ


# Page. 18

![Page Image](https://bcdn.docswell.com/page/YE9KN51RE3.jpg)

handleSamp
• Sample エフェクトだけとなった Eff を Sampler に変換するハンドラ
• 実態は PrimDist で指定された確率分布からサンプリングを行う実装


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GE8RKY4GJD.jpg)

runSimulate（再掲）
• Model を Sampler に変換するためのハンドラ
• runSimulate もまたいくつかのハンドラの合成として実装される


# Page. 20

![Page Image](https://bcdn.docswell.com/page/LELKZ46XJR.jpg)

推論の実行
• 同じ確率モデル coinFlip を使ってシミュレーションだけでなく推論も
実行できる
• mh がMCMCによる推論を実行するためのハンドラになっている


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4JM2VK53JW.jpg)

MISC
• 再実装した完全なコードは こちらのGist にある
• Haskell による確率的プログラミングの実装にはモナドトランス
フォーマーを利用した monad-bayes もある


# Page. 22

![Page Image](https://bcdn.docswell.com/page/PJRM2X3RE9.jpg)

まとめ
• 確率モナドは確率的プログラミングの実装に役立つ
• 確率的プログラミングの実装に代数的エフェクトが使える
• ハンドルによってシミュレーションと推論を切り替えられる
マルチモーダルな性質を備えた確率モデルの実装が可能


