プロバビリスティックプログラミング入門
プロバビリスティックプログラミング入門
Section titled “プロバビリスティックプログラミング入門”このページは、Prob Comp チームが扱いたい問題を理解するための共通入口として、
プロバビリスティックプログラミング
probabilistic programming の最小限の見取り図を置くものです。
チーム固有の実装方針やツール選定までは、まだこのリポジトリ内で十分に定義できていません。 そのため本ページでは、まず分野の基礎を整理しつつ、 「なぜ不確実さをプログラムで扱いたいのか」を掴むことを優先します。
一言でいうと何か
Section titled “一言でいうと何か”プロバビリスティックプログラミングは、 不確実な仮説を含むモデルを書き、観測データを与えて、ありそうな説明を推論する ためのプログラミングのやり方です。
普通のプログラムは、入力が決まれば出力を1つ返します。 一方でプロバビリスティックプログラムは、 「まだ分からない量」 「ノイズが混ざる観測」 「複数の説明候補」 をそのままモデルに残したうえで、 観測後にどの仮説がどれくらいもっともらしいかを更新します。
なぜ Prob Comp チームに関係があるのか
Section titled “なぜ Prob Comp チームに関係があるのか”Prob Comp チームの方向性を、ごく大まかに言えば次のように捉えると分かりやすいと思われます。
- 現実世界の不確実さを、後段の実装で握りつぶさずに最初から表現したい
- 推論対象の構造と、推論アルゴリズムの選択を分けて考えたい
- 単一の点推定ではなく、分布や信頼の厚みを持った出力を扱いたい
- 新しい観測が来たときに、信念を逐次更新できる形でシステムを設計したい
これはまだチームの正式な設計原則として検証した文章ではありません。 ただ、プロバビリスティックプログラミングを学ぶ入口としては、この4点を仮の共通理解に置くと入りやすいはずです。
flowchart LR
A["生成モデルを書く"] --> B["観測データを与える"]
B --> C["推論を回す"]
C --> D["事後分布を得る"]
D --> E["予測・説明・意思決定に使う"]
重要なのは、最後に欲しいものが「唯一の正解」ではなく、 観測後にどの仮説がどれくらい支持されるか という分布になることです。
3つの基本要素
Section titled “3つの基本要素”1. 生成モデル
Section titled “1. 生成モデル”まず、「世界がどうやってデータを生むか」という仮説を書きます。
たとえばコイン投げなら、
「コインの表の出やすさ bias は未知」
「各投擲は bias に従って表か裏かが出る」
という形です。
ここで大事なのは、未知の量を ? のまま放置せず、
確率分布を持つ変数として宣言することです。
2. 観測 conditioning
Section titled “2. 観測 conditioning”次に、実際に見えたデータをモデルへ与えます。
「10回投げたら 7 回表だった」という観測は、
モデルにとっては世界の断片情報です。
観測を与えることで、
ありえそうな bias の範囲が狭まっていきます。
3. 推論 inference
Section titled “3. 推論 inference”推論は、観測後にありそうな仮説を求める処理です。
ここで行われるのは単なる数値計算ではなく、
観測前の信念 prior を、観測後の信念 posterior に更新する作業です。
使うアルゴリズムは1つではありません。 MCMC、変分推論、SMC など複数あり、 モデルの形や速度要求によって向き不向きがあります。
いちばん小さい例
Section titled “いちばん小さい例”bias ~ Beta(1, 1)
for i in range(10): flip[i] ~ Bernoulli(bias)
observe(flip, [1, 1, 1, 1, 1, 1, 1, 0, 0, 0])
return biasこの疑似コードで言いたいことは次の3点です。
biasは固定値ではなく、まず分布を持つ未知変数として置く- コインの結果は
biasに従って生成されると仮定する - 実際の観測を与えたあと、
biasのありそうな範囲を返す
結果は「bias = 0.7 が正解」と一点で返るとは限りません。
むしろ、
「0.5 よりは高そうだが、0.95 と断言するほどではない」
という幅つきの信念こそが重要です。
ふつうの機械学習と何が違うのか
Section titled “ふつうの機械学習と何が違うのか”| 観点 | プロバビリスティックプログラミング | 典型的な予測モデル |
|---|---|---|
| 主眼 | 世界の生成過程を明示して推論する | 入力から出力への写像精度を上げる |
| 不確実さ | モデルの中心に置く | 後から信頼度を足すことが多い |
| 出力 | 分布、事後予測、仮説比較 | 点推定、スコア、クラス |
| 解釈 | 仮説や前提を説明しやすい | 高性能でも内部解釈が難しいことがある |
もちろん両者は対立ではありません。 機械学習モデルを部品として確率モデルに入れることもありますし、 逆に確率モデルの一部を予測器として使うこともあります。
どんな問題に向いているか
Section titled “どんな問題に向いているか”- 観測ノイズが大きく、真の状態を直接見られない問題
- 少量データでも、事前知識をモデルに入れたい問題
- 「なぜその予測なのか」を構造込みで説明したい問題
- 新しい観測が入るたびに信念を更新したい問題
- 反実仮想や潜在変数を含む推論をしたい問題
逆に、次のような場面では過剰設計になる可能性があります。
- ルールが完全に固定され、不確実さをほぼ考えなくてよい処理
- とにかく超低遅延の点推定だけが必要な処理
- モデル仮定の説明可能性より、大量データでの純粋な予測精度を優先する処理
入門時点で押さえたい問い
Section titled “入門時点で押さえたい問い”入門者が最初に考えるとよい問いは、実装詳細より先に次のものです。
- 自分は「世界がどうデータを生む」と仮定しているか
- どの変数が直接観測できて、どの変数が潜在なのか
- 欲しいのは点予測なのか、分布なのか、仮説比較なのか
- 観測が増えたときに、どう信念更新したいのか
- その不確実さは aleatoric なのか、epistemic なのか
この整理が曖昧なままツールから入ると、 「Stan を使うべきか」「Pyro を使うべきか」「Gen を使うべきか」 という議論だけが先行しやすいです。
学び始める順番
Section titled “学び始める順番”最初は大きなモデルより、小さい例を順に積むほうがよいと思われます。
- コイン投げやサイコロで
priorとposteriorの更新に慣れる - Beta-Bernoulli や Gaussian のような基本分布で、観測が信念をどう変えるかを見る
- 潜在変数を1つ含むモデルで「直接見えないものを推論する」感覚を掴む
- MCMC と変分推論の違いを、速さと近似の観点から比べる
- 自分たちの実問題を、小さい生成モデルへ落とし直してみる
ツール選定を見る前に知っておきたいこと
Section titled “ツール選定を見る前に知っておきたいこと”PPL は1つの言語やフレームワーク名ではありません。 同じ「確率モデルを書く」という方向でも、かなり設計思想が違います。
- Stan: 静的で堅牢なモデリングに強く、古典的ベイズ統計の文脈で学びやすい
- Pyro: Python と深層学習の文脈に寄せやすい
- Gen: 生成モデルと推論プログラムの分離を強く意識している
ここは今後、Prob Comp チームの関心領域に合わせて比較ページを別途足したいところです。
- The Design and Implementation of Probabilistic Programming Languages
- Stan Documentation
- Pyro Documentation
- Gen Documentation
- Probabilistic Machine Learning book site
まだ曖昧な点
Section titled “まだ曖昧な点”- このページは、Prob Comp チームの内部方針を直接確認して書いたものではなく、分野の入門整理として書いている
- チームが重視する実問題、推論速度、説明責任、運用制約まではまだ反映できていない
- ツール比較や実装例は別ページに分けたほうが読みやすそうだが、まだ未着手
そのため、このページの status は seed にしてあります。