ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
人気ページ
- 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 Spring Frameworkのアノテーション一覧
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- PHPでのファイルアップロード方法|multipart/form-dataと$_FILES 2026-08-07 17:15:57
- PHP $_SERVERとは|DOCUMENT_ROOT・PHP_SELFなど主な要素 2026-08-07 17:15:57
- Scratchのアカウントの作り方|メールアドレスとユーザー名の登録手順 2026-08-07 17:15:57
- djangoにおけるMVCアプリケーション実装例 2026-08-07 17:15:57
- Bluetoothとは|仕組み・BLEとClassicの違い・用途 2026-08-07 17:15:57
- Spring Bootのテスト入門|@SpringBootTestとJUnitでの単体・結合テスト 2026-08-07 17:15:57
- Java とは?言語仕様・JVM・主要フレームワーク一覧 2026-08-07 17:15:56
- インストール方法(Windows版) 2026-08-07 17:15:56
- APIキー取得方法 2026-08-07 17:15:56
- 【PHPフレームワーク】Laravelの使い方 2026-08-07 17:15:56
- Scratch 作品の公開方法 2026-08-07 17:15:56
- Google OAuth 2.0 認証の実装方法 2026-08-07 17:15:56
- データベースとは?RDB / NoSQL / SQL の基礎 2026-08-07 17:15:56
- インストール(eclipseプラグイン) 2026-08-07 17:15:56
- Spring Frameworkの使い方 2026-08-07 17:15:56
コメントを削除してもよろしいでしょうか?