跳轉到

Bayesian MCMC 瀏覽偏好模型

這個專案用貝氏 MCMC(Metropolis-Hastings)從使用者的瀏覽序列中,估計每個人各自的「類別偏好、多樣性、轉換成本」三組參數,再用這些參數預測使用者下一個會看的類別,並和幾個常見 baseline 比較預測表現。

簡單說:給一堆「誰、在哪個 session、依序看了哪些類別」的瀏覽紀錄,模型會反推出每位使用者的偏好結構,而不是只用大眾熱門度去猜。

原始碼: https://github.com/YuHsunWang/mcmc-portfolio


這個專案在解什麼問題

電商/內容瀏覽的「下一步預測」常見作法是熱門度或使用者歷史頻率,但這些都忽略了個人的偏好結構與「換類別要付出的摩擦成本」。本專案把它建模成一個帶外部選項(看完就離開)的多項 logit 選擇模型,並用 MCMC 估計每位使用者各自的參數:

參數 意義
a_u 類別偏好向量:這個人本來就偏好哪些類別
s_u 多樣性/彈性(限制為 s_u = 1 + z_u, z_u > 0):偏好集中還是分散
C_switch_u 轉換成本:在 session 內從一類跳到另一類的摩擦

轉換成本用「經驗轉移矩陣」當作 switching-friction 的代理變數。


方法概要

每次 MCMC 迭代做的事:

  1. 用 lognormal random walk 對使用者層級參數提出新值(proposal)。
  2. 計算 likelihood 與 prior 比值。
  3. 套用 Metropolis-Hastings 的 accept/reject。
  4. 更新族群層級(population-level)的超參數。
  5. 儲存後驗樣本與診斷量(acceptance rate、trace 等)。

專案同時提供兩種實作:

  • 研究用 NotebookMCMC_L1_portfolio.ipynb):完整推導與視覺化。
  • GPU-ready 向量化版本mcmc_gpu_parallel.py):用 CuPy 加速,沒有 CUDA 時自動 fallback 到 NumPy。

迭代流程圖

貝氏 MCMC 迭代流程


參數收斂過程

下圖是 realistic 稀疏興趣情境(100 位使用者、10,000 次迭代)的收斂診斷:

MCMC 收斂診斷

四個面板的解讀:

  • (a) 接受率:三組參數的 Metropolis-Hastings 接受率很快進入穩定區間(偏好 a_u 約 0.05、多樣性 s_u 約 0.89、轉換成本 C_switch 約 0.79)。a_u 接受率較低是因為它是 10 維向量、提案一次要全部接受,屬正常現象。
  • (b) 訓練準確率:在數百次迭代內就從隨機水準衝到約 0.71 並維持平穩,代表取樣器很快找到合理的參數區域。
  • (c) 族群超參數θ_switch 幾乎立即收斂,θ_s(族群多樣性)則逐步爬升後在約 3.5 上下穩定震盪——典型的階層模型 burn-in 後混合行為。
  • (d) 使用者層級軌跡:5 位抽樣使用者的多樣性參數 s_u 軌跡持續混合、沒有卡死,顯示鏈在使用者層級也有良好的探索性。

結果

包含的結果檔皆為 100 位使用者 × 10,000 次 MCMC 迭代,跑在兩種合成情境上。評估指標為 held-out 測試集上的下一類別 Top-1 / Top-3 準確率與序列相似度。

情境 MCMC Top-1 MCMC Top-3 序列相似度 對 Markov 對使用者最常看 對全域熱門
Balanced 合成 48.13% 64.73% 0.873 +0.72 pp +31.47 pp +35.27 pp
Realistic 稀疏興趣合成 67.30% 85.34% 0.814 +4.11 pp +25.63 pp +54.01 pp

Held-out benchmark 比較

重點:

  • MCMC 偏好模型在兩種情境下都穩定勝過熱門度與使用者頻率 baseline。
  • 在比較貼近真實的「稀疏興趣」情境(每人少數主要興趣、session 多停在同一意圖叢集)下,連 Markov 轉移 baseline 都被它在 Top-1、Top-3、序列相似度三項全面超越。

怎麼跑

pip install -r requirements.txt

小型 demo:

python mcmc_gpu_parallel.py --n-users 100 --n-iter 10

重現包含的稀疏情境結果:

python mcmc_gpu_parallel.py --n-users 100 --n-iter 10000 \
    --output-dir outputs_realistic_100u_10000iter

選用 GPU(依 CUDA 版本選對應套件):

pip install cupy-cuda12x

技術重點

  • 自訂 Metropolis-Hastings 取樣器,含使用者層級 + 族群層級(hierarchical)參數更新。
  • 帶外部「停止」選項的多項 logit 選擇模型。
  • 向量化/GPU-ready 實作,CuPy 不可用時自動退回 NumPy。
  • 與熱門度、使用者頻率、Markov 轉移三種 baseline 的 held-out 比較框架。
  • 使用合成瀏覽資料,可完全重現、可公開分享。

限制

  • 資料為合成資料,目的是可重現的公開展示,不是真實業務表現。
  • 轉換成本矩陣是基於轉移頻率的經驗代理,不是真實 switching cost 的因果估計。
  • 短鏈(少迭代)適合視覺化,但不足以做最終統計推論;正式推論需更長的鏈、burn-in、後驗平均與收斂診斷。