はじめに
- 暗黙的評価が得られている場合の推薦の問題について、スタンダードとされるアルゴリズムを理解し実際に使ってみたい
- アイテムの購買有無のデータから、ユーザーが今後購入するアイテムを予測するkaggleのH&Mのcompetitionを見つけたので、やってみる
- 推薦アルゴリズム初心者のため、拙い記事ではありますが、初心者として重要だと思ったポイントをまとめるようにします
手法
- 今回は、各アイテムをどのユーザーがいつ購入したかのトランザクションのデータが与えれている
- 暗黙的評価であり、購入がないアイテムについては、好まないから購入しなかったのか、アイテムを知らないかったからかがわからない
- 購入なしを$0$として学習すると、購入がない理由はさまざまであるのに、購入がない=興味なしという前提をおいた学習になってしまう
- 暗黙的評価の代表的な手法であるALS、BPRを試す
ALS(Alternating Least Squares)
前提:MF
- ALSの前提として、まずMF(Matrix Factorization)を理解する
- MFでは、ユーザーアイテム行列$r$($R_{u, i}$が各ユーザーxアイテムの組み合わせの評価となる)を、ユーザー行列$P$とアイテム行列$Q$の積で近似する
$$
R \approx P Q^T
$$ - この次元削減をおこなうことで、すべてのユーザー同士の相関係数から評価を重み付けるようなナイーブな協調フィルタリングよりも、よりロバストに・より計算量を減らして推論をすることが可能となる
- $P$, $Q$の各ベクトルは下記の損失関数を最小化することで求めます
$$
\min_{P, Q} \sum_{(u, i) \in K} (R_{u,i} - P_u^T Q_i)^2 + \lambda (|P_u|^2 + |Q_i|^2)
$$
- ここで、$K$は観測されたユーザーアイテムのペアの集合を表し、$\lambda$は正則化パラメータ
- 明示的評価の場合は、$R_{u,i}$が大きい場合と低い場合が両方得られている場合はこの手法でよいが、購入回数のような暗黙的評価では、購入した場合のデータしかない
- そのため、上記をそのまま適用すると、PとQは正則化の範囲でできるだけ大きな値をとるように学習されるだけになる
ALS
-
そこで、暗黙的評価に適した形で上記の損失関数のを修正したものがALS
-
ALSでは「そのアイテム評価がどれくらい信用できるか」という信頼度の概念を導入する
$$
C_{u,i} = 1 + \alpha R_{u,i}
$$ -
ここで、$\alpha$は、評価によってどれくらい信頼度が変化するかを定義するパラメータ
-
この$C_{u,i}$を用いて、ALSの損失関数は以下のように書き換えられる
-
ここで、$p_{u,i}$は購入があれば1・なければ0の二値変数で、信頼度$C_{u,i}$とは分離して扱う
$$
\min_{P, Q} \sum_{u, i} C_{u,i} (p_{u,i} - P_u^T Q_i)^2 + \lambda (|P_u|^2 + |Q_i|^2)
$$
- 上の式が、MFと異なる点は大きく2つあると解釈する
- 1:各アイテム評価の二乗誤差に信頼度$C_{u,i}$がかかっている
- 2:未評価の場合のデータ$(u, i) \notin K$も損失関数に入っている
- これにより、購入があったアイテムを重視しながらも、購入がなかったアイテムの情報も活用して予測することが可能となる
BPR
- 続いて、他の暗黙的評価の代表的な手法であるBPRについても理解する
- ALSでは、各アイテムの絶対的な選好を予測していましたが、BPRでは、すべてのアイテム組み合わせにおいて、ユーザーがどちらのアイテムを好むかを予測することを目的とする(ランキング学習)
- 各ユーザーについて「購入があったアイテム」は、「購入がなかったアイテム」よりもユーザーの選好度が高いと考える
- 「購入があったアイテム同士」「購入がなかったアイテム同士」については比較ができないため、学習データには含めない
- 学習に使うことができるデータ($i,j$のどちらかの購入があるデータ)下記のように定義する
$$
I_u^{+} := {i \in I: (u, i) \in S}\
D_S :={(u, i, j)|i\in I_u^+, j\in I \setminus I_u^+}
$$
-
各アイテム間の嗜好性の大小関係を表す変数を定義する:$\gt_{u}\in I^2$、$i\gt_{u}j$は、ユーザー$u$がアイテム$i$をアイテム$j$よりも好むことを表すものとする
-
MAP推定(最大事後確率推定)の枠組みで、パラメータの事後分布を最大化する
$$
p(\Theta|>_u) \propto p(>_u|\Theta)p(\Theta)
$$
- ここで、尤度関数は、各ユーザーは独立で、かつ同一ユーザーにおけるアイテムの組み合わせも独立であると仮定して、以下のように定義される(本当はもう少し導出が詳細なのだが、ここでは省略する)
$$
\prod_{u\in U}p(>u|\Theta) = \prod{(u, i, j) \in D_S}p(i\gt_{u}j|\Theta)
$$
-
このu,i,jごとの選好確率を、シグモイド関数を用いて下記のようにモデリングする
$$
p(i\gt_{u}j|\Theta) = \sigma(\hat{x}_{uij}(\Theta))
$$ -
以上をまとめると、BPR-OPTとして下記の目的関数(最大化)が定義される
\begin{aligned}
\ln p(\Theta | \gt_{u}) &= \ln p(\gt_{u} | \Theta ) p(\Theta ) \\
&= \ln \prod_{(u, i, j) \in D_S} \sigma(\hat{x}_{uij}) p(\Theta) \\
&= \sum_{(u, i, j) \in D_S} \ln \sigma(\hat{x}_{uij}) + \ln p(\Theta) \\
&= \sum_{(u, i, j) \in D_{S}} \ln \sigma(\hat{x}_{uij}) - \lambda \|\Theta\|^{2}
\end{aligned}
- MFを用いる場合は、$\hat{x}_{uij}$を下記のように定義する
\hat{x}_{uij} = x_{u,i} - x_{u, j} = P_u^T Q_i - P_u^T Q_j
- BPRの優れている点は、各ユーザーごとに、購入されやすいものからアイテムを知りたいという背景の中で、それを直接最適化しにいけるという点
問題設定(kaggleサイトのほとんど和訳)
- 教師データの直後の期間から7日間で、各ユーザーがどの品目の購入をするかを予測する
- 指標はMAP@12を用いる
$$
MAP@12 = \frac{1}{U}\Sigma_{u=1}^{U}\frac{1}{min(m, 12)}\Sigma_{k=1}^{min(n, 12)}P(k) \times rel(k)
$$
-
$U$:ユーザーの総数
-
$P(k)$: $k$番目の推薦アイテムまでにおける適合率
-
$n$:ユーザーに推薦されたアイテムの数
-
$m$:ユーザーが購入した品目の数
-
$rel(k)$: 品目$k$がユーザーに購入された場合に1となる指示関数
-
データセット等はkaggleのサイトを参照
結果
- 実際に、H&Mの品目の購入に対して予測を実施した(localでは直近1週間をtestとして検証した上で、publicに提出した)
- late submissinoのprivate scoreが下記となった
- optunaによって、ALSは次元数、BPRは次元数・学習率・正則化項の重みのチューニングを実施した(BPRの方が計算が速いため、BPRの方がより多くの項目をチューニング対象とした)
| 手法 | MAP@12 |
|---|---|
| ALS | 0.0042 |
| BPR | 0.0023 |
- (ランク上位の人には到底及んでいない)
- BPRがALSよりも低くなった理由は考察が必要
ネクスト
- ユーザー特徴量・アイテム特徴量も加味したい
- competitionで高いスコアを出す観点では、ハイパーパラメータチューニングとアンサンブルが必須になってくるので、それをある程度実施した上で検討したい