🤯

一から作る確率モデル:設計・実装・失敗と再出発

に公開

こんにちは!

GA technologiesのAdvanced Innovation Strategy Center(AISC)に所属している王皓と申します。

以前、noteで最尤推定に関する記事を公開させていただきました:

最尤推定を学ぶ中で、確率モデルにおけるパラメータ推定の考え方に興味を持ちました。特に、「点推定」だけでなく「不確実性を含めた推定」にも関心が広がり、その一環としてベイズ推論やMCMCといったより柔軟な手法の学習にも取り組みました。

ちょうど最近、私が担当しているプロジェクトにおいても、確率モデルを構築するというテーマがありました。
このテーマは、単純な回帰や分類モデルだけでは捉えきれない構造を多く含んでおり、確率的な構造とその中での選択のメカニズムをモデル化する必要がありました。

こうした背景から、今回のモデリングではパラメーター推定方法のひとつであるベイズ推論+MCMCという手法が非常に適していると感じ、導入を決めました。

1. はじめに:なぜ MCMC を使ったか

MCMC(Markov Chain Monte Carlo)は、ベイズ推論において複雑な事後分布をサンプリングによって近似するための代表的な手法です。

今回取り組んだ確率モデルの構築においては、従来の汎用的な機械学習手法ではなく、あえてベイズ推論+MCMCを選択しました。そこには主に次の3つの理由があります。

モデル構造を自由に設計できる

一般的な機械学習手法では、アルゴリズム側で構造が固定されているため、仮説として持っていた複雑な構造や選択メカニズムをそのまま数式化することが難しい場合があります。
今回のテーマでは、「あるイベントの発生確率が複数の要因により動的に変化する」といった構造を自分で定義・検証する必要があり、その意味でベイジアンモデリングは非常に相性の良い手法でした。

不確実性を可視化できる

ベイズ推論では、各パラメータを確率変数として扱い、観測データに基づく事後分布を推定します。
これにより、単なる点推定ではなく、「推定値にどの程度の信頼が置けるか?」といった不確実性の可視化が可能になります。
例えば、「ある特徴量が確率に与える影響は安定しているのか?」「どの程度ばらつきがあるのか?」など、確率的な視点からの解釈が可能になります。

説明性が高い

特に、ロジックの透明性や再現性が求められる場面においては、「なぜこの結果が導かれたのか?」を明示的に説明できることが重要になります。
ベイジアンモデルでは、数式構造とパラメータ推定結果が明示的に表現されるため、モデルの解釈や共有がしやすく、改善のための議論にもつなげやすいという利点があります。

2. モデル設計:オリジナル確率構造

本モデルでは、対象の発生確率を左右すると考えられる複数の要素に着目し、
それぞれに対して仮説を立て、直感的な関係性を定式化した独自の確率構造を設計しました。

設計にあたっては、各要素がどのように確率に影響するかについて、
「強くなると弱まる」「一定までは効くがその後は鈍化する」などの定性的な考察をベースとし、
構造の妥当性を実データを通じて検証できるような形式に落とし込みました。

このように、ブラックボックス的な予測アルゴリズムでは捉えきれない構造仮説に基づく設計を柔軟に実現できる点が、MCMCを用いた確率モデリングの大きな魅力であると感じました。

3. 実装:NumPyro × JAX によるベイズモデリング

実装には Python ベースの NumPyro と JAX を採用しました。

NumPyro は JAX 上に構築された確率的プログラミングライブラリで、柔軟かつ高速なベイズモデリングが可能です。JAX は NumPy 互換の数値計算ライブラリで、GPU/TPU 対応の高速演算や jit による自動最適化、PRNGKey による厳密な乱数管理が特徴です。

コード例:

import jax.numpy as jnp

import jax.random as random

import numpyro

import numpyro.distributions as dist

from numpyro.infer import MCMC, NUTS

# ===== 例としてダミーデータを作成 =====

x_data = jnp.array([1.0, 2.0, 3.0, 4.0, 5.0])

y_data = jnp.array([1.2, 1.9, 3.2, 3.8, 5.1])

# ===== モデル定義(シンプルな線形モデル) =====

def model(x, y=None):

alpha = numpyro.sample("alpha", dist.Normal(0, 1))

beta = numpyro.sample("beta", dist.Normal(0, 1))

sigma = numpyro.sample("sigma", dist.Exponential(1.0))

mu = alpha + beta * x

numpyro.sample("obs", dist.Normal(mu, sigma), obs=y)

# ===== 推論実行 =====

rng_key = random.PRNGKey(0)

kernel = NUTS(model)

mcmc = MCMC(kernel, num_warmup=500, num_samples=1000)

mcmc.run(rng_key, x=x_data, y=y_data)

mcmc.print_summary()

4. 苦労した事

事前分布の設計に苦戦

今回の取り組みでは、私自身が MCMC を初めて扱うということもあり、「パラメータの事前分布をどう設定すべきか?」にかなりの時間を割きました。

正規分布の平均や分散、Beta 分布のパラメータなどは、書籍に載っているような「一般論」では対応できない場面が多く、モデルの構造や実データとの相性を見ながら、一つひとつ試行錯誤するしかありませんでした。

特に、分布の幅が広すぎるとサンプラーが発散しやすく、逆に狭すぎるとパラメータがデータに応じて十分に動かなくなり、事前分布に強く引っ張られてしまうという問題がありました。

実際、最初に設定していた w ~ Normal(0, 1) のような、一見ごく一般的な事前分布であっても、特徴量のスケールやモデル構造との相性によっては log-likelihood が急激に変動し、サンプラーが NaN を返したり、事後分布が収束せず発散するケースが頻発しました。

こうした問題への具体的な対処としては、以下のような工夫を行いました:

  • 事前分布の分散を調整(例:Normal(0, 0.3) に変更し、変動の暴れを抑制)

  • 特徴量をすべて [-1, 1] の範囲にスケーリングし、オリジナル確率構造の爆発を抑制

  • 同構造の出力値(確率)が極端になるケースについては、clip もしくはサンプル除外によって安定化を図る

など、正解がなく「とにかく試すしかない」世界に苦労しつつ、何とかモデルを成立させました。

構造の「説得力」問題:自分にとって自然でも、他人にとっては不自然

今回もう一つ悩ましかったのは、「自分が自然だと思って設計した構造が、他者にとっては直感に反する」というギャップでした。
本モデルでは、複数の要素に対して、それぞれ確率への影響メカニズムを仮定し、独自の構造を導入しました。

こうした構造は、設計者自身の専門知や業務経験に基づけば「当然の発想」として受け入れられる一方で、
他の分野の研究者や実務者にとっては、「なぜその構造が自然なのか?」が伝わらず、説明を要する“不思議なモデル”に映ることもあります。

そのため、

  • 数式的な整合性(非線形構造として妥当か)

  • 仮説としての納得感(現場の観察や理論的背景と一致するか)

  • 複数構造の組み合わせ方(重なりによる効果の直感的説明)

といった観点から、構造の合理性を多面的に補強する工夫が求められました。
MCMC はこうした仮説の“説明と検証”を並行して進められる点でも、非常に有効だったと感じています。

5. 結果:事後分布の不安定性とその要因

今回構築したモデルは、構造上は現場感覚に即した合理的な設計であったものの、MCMCによって得られた事後分布は安定性に欠ける結果となりました。

主な要因としては以下の2点が挙げられます:

  • 予測したい確率に対する二重の非線形構造が重なったことで、パラメータ空間における識別性が低下し、一部のパラメータが過剰に相関しやすい構造となってしまいました。その結果、サンプラーが一部の軸に沿って収束しづらくなり、発散や遷移の遅延が生じやすい状況となりました。

  • 訓練データのバランスの悪さ
    実データ自体が非常に偏った構造であり、確率構造を学習するうえで十分な情報が得られないケースが多く、収束が難しい要因となりました。

6. おわりに:モデルは失敗したが、得たものは大きかった

今回紹介したモデルは、最終的には実務応用に耐えうる形に仕上げることができず、“失敗”といえる結果に終わりました。しかしながら、この取り組みを通じて得た学びは非常に大きかったと感じています。

  • MCMCを通じて、確率モデルの設計・実装・収束検証の一連のプロセスを体系的に体験することができた

  • 特に、数式構造をゼロから設計する際に求められる「ロジックの妥当性」と「実装の安定性」の両立の難しさを痛感した

  • 一見すると“当然”に思える構造も、他者の視点では「なぜそうなるのか?」と問われることで、仮説の説明力や理論的整合性を磨く契機になった

そして何より、今回のモデルでの反省点を活かし、構造を大幅に簡素化した改良モデルを後日開発しました。

その結果、パラメータ推定の安定性が大きく向上し、MCMC による収束も確認できるようになりました

確率モデルの世界は、柔軟であるがゆえに設計の自由度が高く、同時に「設計者の責任」が強く問われる世界でもあります。だからこそ、失敗の経験そのものが、次の成功への土台になるということを実感したプロジェクトでもありました。

本記事のご紹介は以上となります。同じく AISC での取り組みは他にもご紹介していますので、もしご興味があれば、ぜひこちらものぞいてみてください!あわせて、GAテクノロジーズグループの公式noteもぜひご覧ください!

株式会社GA technologies

Discussion