jijzepttools.blackbox_optimization.bayesian_factorization_machine#

このファイルは 2010 年 Freudenthaler らの論文 「Bayesian Factorization Machines」(BFM) の式 (5)-(8) を実装します。 https://www.ismll.uni-hildesheim.de/pub/pdfs/FreudenthalerRendle_BayesianFactorizationMachines.pdf

### 実装方針とディスカッションでの合意事項#

  1. 単一パラメータ (unblocked) Gibbs - blockedより時間計算量的に高速。

  2. 階層型ハイパー事前分布 - モデルパラメータの正規事前分布の平均、分散にさらにハイパー事前分布を導入。

  3. warmstart - fit() を複数回呼ぶ際、直前のサンプルを初期値として継続させ、

    収束を高速化する。

    • 任意で reset_state() でリセット可。

  4. 数値安定化 - lambda(パラメータ事前分布の精度), alpha(yのノイズ精度) を [1e-6, 1e6] にクリップ。 - Posterior 分散の sqrt は min=1e-12 クランプ。

  5. GPU 対応 - device 引数で CPU/GPU 切替。 - torch 演算のみで実装し転送コスト最小化。

Classes#

BFMPriorParameters

Bayesian Factorization Machine の事前分布パラメータ

BFMModel

Bayesian Factorization Machine (二次項まで)

BFMTrainer

Module Contents#

class BFMPriorParameters#

Bayesian Factorization Machine の事前分布パラメータ

Parameters:
  • alpha0 (float) – yのノイズ精度alphaが従うガンマ分布のパラメータ

  • beta0 (float) – yのノイズ精度alphaが従うガンマ分布のパラメータ

  • alpha_lambda (float) – パラメータの正規事前分布の精度lambda_w, lambda_vが従うハイパー事前分布(ガンマ分布)のパラメータ

  • beta_lambda (float) – パラメータの正規事前分布の精度lambda_w, lambda_vが従うハイパー事前分布(ガンマ分布)のパラメータ

  • mu0 (float) – パラメータの正規事前分布の平均mu_w, mu_vが従うハイパー事前分布(正規分布)の平均

  • gamma0 (float) – パラメータの正規事前分布の平均mu_w, mu_vが従うハイパー事前分布(正規分布)の精度

  • mu_w0 (float) – バイアス項 w0が従う正規事前分布の平均

  • lambda_w0 (float) – バイアス項 w0が従う正規事前分布の精度

  • w0については他のパラメータと異なり、階層化によるshrinkageの恩恵が少ないと考えられるため、ハイパー事前分布を導入していない。

alpha0: float = 1.0#
beta0: float = 1.0#
alpha_lambda: float = 1.0#
beta_lambda: float = 1.0#
mu0: float = 0.0#
gamma0: float = 1.0#
mu_w0: float = 0.0#
lambda_w0: float = 1.0#
to_dict() dict[str, float]#

辞書形式に変換

class BFMModel(n_features: int, latent_dim: int, *, device: str | torch.device = 'cpu', prior_params: BFMPriorParameters | None = None)#

Bases: torch.nn.Module

Bayesian Factorization Machine (二次項まで)

Parameters:
  • n_features (int) – 入力特徴量数 (p)。

  • latent_dim (int) – 潜在次元数 (k)。

  • device (str or torch.device, optional) – ‘cpu’ or ‘cuda’. 既定 ‘cpu’。

  • prior_params (BFMPriorParameters, optional) – 事前分布のパラメータ。

p#
k#
dev#
hp#
mu_w0#
lambda_w0#
w0: torch.Tensor#
w: torch.Tensor#
V: torch.Tensor#
mu_w#
mu_v#
lambda_w#
lambda_v#
alpha#
theta_bar: dict[str, torch.Tensor] | None = None#
gibbs_sample(x: torch.Tensor, y: torch.Tensor, *, tune: int = 100, draws: int = 10, warm_start: bool = False, rng: torch.Generator | None = None) dict[str, numpy.ndarray]#

Unblocked Gibbs サンプリング

Parameters:
  • x ((n,p) Tensor) – デザイン行列 (疎/密どちらでも良いが Tensor)。

  • y ((n,) Tensor) – 目的変数。

  • tune (int) – バーンインスイープ数(収束したとみなすまでのスイープ数)。

  • draws (int) – tune回後のサンプルの後に取得する、平均化するサンプル数。

  • warm_start (bool) – 複数回fitを呼び出す時、直前サンプルを初期値として継続するか。

  • rng (torch.Generator) – 乱数生成器。None なら内部で生成。

reset_state() None#

warm-start をリセット(完全な再サンプルを行いたいときに使う)

class BFMTrainer(n_features: int, latent_dim: int, *, tune: int = 100, draws: int = 10, warm_start: bool = False, prior_params: BFMPriorParameters | None = None, device: str | torch.device = 'cpu')#
Parameters:
  • n_features (int)

  • latent_dim (int)

  • tune (int) – バーンイン長。

  • draws (int) – tune 後に平均化するサンプル数。 FMAに利用する際はdrawsを小さくするほど探索的になる。

  • warm_start (bool) – 直前の鎖を継続するか。

  • prior_params (BFMPriorParameters) – 事前分布のパラメータ

  • device (str | torch.device) – CPUかGPUを指定

model#
warm_start = False#
theta_bar: dict[str, numpy.ndarray] | None = None#
fit(x_np: numpy.ndarray, y_np: numpy.ndarray, *_, **__) None#

FMTrainer 互換。 *_, **__ は無視して互換性を確保 (例: n_epochs)。

predict(x_np: numpy.ndarray) numpy.ndarray#

予測値を返す。 x_np は (n, p) の NumPy 配列。