| この記事の要点 |
|
Gen.jl とは
Gen は MIT Probabilistic Computing Project が開発する Julia 言語の確率プログラミング言語(PPL)です。Stan や PyMC と同じく「確率モデルを書いて推論する」フレームワークですが、Gen は推論プログラム自体も自由に記述できるのが特徴で、研究用途で広く使われています。
確率プログラミングの基本概念
確率プログラミングは「データから未知の変数を推論する」プログラムを確率モデルとして表現します:
- 生成モデル(Generative Model): データがどう生まれるかを記述
- 事後推論(Posterior Inference): 観測データから隠れ変数の分布を求める
- マルコフ連鎖モンテカルロ(MCMC): 事後分布からサンプリング
インストール
# Julia の REPL で
using Pkg
Pkg.add("Gen")
using Gen
最初の例: 線形回帰
using Gen
# 線形回帰の生成モデル
@gen function line_model(xs::Vector{Float64})
# 傾きと切片を正規分布から
slope = @trace(normal(0, 1), :slope)
intercept = @trace(normal(0, 2), :intercept)
# 各 x に対して y を観測
n = length(xs)
for (i, x) in enumerate(xs)
@trace(normal(slope * x + intercept, 0.1), (:y, i))
end
end
xs = [-5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0]
ys = [-8.4, -7.1, -4.8, -3.7, -2.2, -0.4, 1.6, 3.4, 5.3, 7.1, 9.2]
# 観測値を choicemap に
observations = choicemap()
for (i, y) in enumerate(ys)
observations[(:y, i)] = y
end
# Importance Sampling で推論
(trace, _) = Gen.importance_resampling(line_model, (xs,), observations, 1000)
# 推定値
println("slope = ", trace[:slope])
println("intercept = ", trace[:intercept])
@gen マクロの仕組み
@gen はマクロで、関数を生成関数(Generative Function)に変換します:
@gen function my_model()
# @trace でランダム変数を記録
x = @trace(normal(0, 1), :x)
y = @trace(bernoulli(0.5), :y)
# 通常の Julia コードも書ける
z = x + (y ? 1.0 : 0.0)
# サブモデル呼び出しも可能
w = @trace(another_model(), :sub)
return z + w
end
@trace(分布, アドレス): ランダム変数をアドレス付きで実行履歴(trace)に記録します。
推論アルゴリズム一覧
| アルゴリズム | 関数 | 用途 |
|---|---|---|
| Importance Sampling | importance_sampling | シンプルな事後推論 |
| Importance Resampling | importance_resampling | 少数サンプル |
| Metropolis-Hastings | metropolis_hastings | MCMC の基本 |
| HMC | hmc | 連続変数、勾配利用 |
| MAP 最適化 | map_optimize | 最大事後確率推定 |
| Particle Filter | particle_filter | 時系列・状態空間 |
| 変分推論 | black_box_vi | 近似ベイズ |
Metropolis-Hastings の例
function block_resimulation_update(tr)
# slope を再サンプル
(tr, _) = mh(tr, select(:slope))
# intercept を再サンプル
(tr, _) = mh(tr, select(:intercept))
return tr
end
# 初期 trace を取得
(trace, _) = generate(line_model, (xs,), observations)
# MCMC を 1000 回
for i in 1:1000
trace = block_resimulation_update(trace)
end
println("Final slope: ", trace[:slope])
println("Final intercept: ", trace[:intercept])
応用例: 3D 物体姿勢推定
Gen は逆グラフィックス(Inverse Graphics)研究で多く使われます:
@gen function pose_model()
# 物体の位置・回転をサンプル
x = @trace(uniform(-5, 5), :x)
y = @trace(uniform(-5, 5), :y)
theta = @trace(uniform(0, 2π), :theta)
# レンダリング(シミュレータ呼び出し)
rendered_image = render_scene(x, y, theta)
# 観測画像との差を尤度として
for i in 1:length(rendered_image)
@trace(normal(rendered_image[i], 0.1), (:pixel, i))
end
end
他 PPL との比較
| フレームワーク | 言語 | 推論 | 得意分野 |
|---|---|---|---|
| Gen.jl | Julia | カスタム推論可 | 研究、逆グラフィックス |
| Stan | 独自 DSL | HMC / NUTS 固定 | 統計モデル全般 |
| PyMC | Python | NUTS / VI | ベイズ統計、ビジネス |
| Pyro | Python (PyTorch) | SVI / HMC | 深層生成モデル |
| Turing.jl | Julia | HMC / NUTS | Julia エコシステム統合 |
Gen の強み
- カスタム推論プログラム: 既存のアルゴリズムに縛られず自前で書ける
- ハイブリッドモデル: 連続変数・離散変数・確率的制御フローを統合
- Julia のパフォーマンス: C 並みの実行速度
- 研究フレンドリー: 論文の最新アイデアを試しやすい
学習リソース
- 公式サイト: gen.dev
- GitHub: probcomp/Gen.jl
- Tutorial: GenJulia の公式チュートリアル(線形回帰 → SLAM まで)
- 論文: Gen: A General-Purpose Probabilistic Programming System with Programmable Inference(PLDI 2019)
FAQ
Q: Gen と Turing.jl はどちらが良い?
A: 統計モデル中心なら Turing が手軽。カスタム推論やシミュレータベースのモデルなら Gen。
Q: Python から呼び出せる?
A: PyJulia で呼び出し可能ですが、推奨は Julia ネイティブ。
Q: GPU で動く?
A: 部分的に。Gen のコア自体は CPU。連続変数の HMC で勾配計算は AD(Zygote.jl)と組み合わせます。
Q: 学習曲線は?
A: Stan / PyMC より急。確率プログラミングと Julia の両方を学ぶ必要があります。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

子ページ
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38