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
### 実装方針とディスカッションでの合意事項#
単一パラメータ (unblocked) Gibbs - blockedより時間計算量的に高速。
階層型ハイパー事前分布 - モデルパラメータの正規事前分布の平均、分散にさらにハイパー事前分布を導入。
warmstart - fit() を複数回呼ぶ際、直前のサンプルを初期値として継続させ、
収束を高速化する。
任意で reset_state() でリセット可。
数値安定化 - lambda(パラメータ事前分布の精度), alpha(yのノイズ精度) を [1e-6, 1e6] にクリップ。 - Posterior 分散の sqrt は min=1e-12 クランプ。
GPU 対応 - device 引数で CPU/GPU 切替。 - torch 演算のみで実装し転送コスト最小化。
Classes#
Bayesian Factorization Machine の事前分布パラメータ |
|
Bayesian Factorization Machine (二次項まで) |
|
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 #
- predict(x_np: numpy.ndarray) numpy.ndarray #
予測値を返す。 x_np は (n, p) の NumPy 配列。