糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

Matrix Factorization で Bayesian Personalized Ranking を用いた implicit feedback の推定はうまくいった

Factorization Machines で Bayesian Personalized Ranking を用いた implicit feedback の推定を行いたかったけどうまくいかなかった - 糞ネット弁慶の続き.

要約

  • Bayesian Personalized Ranking が諦められない
  • pairwise な loss を考慮した Matrix Factorization で MovieLens 100K を学習・予測すると AUC が 0.8 程度を示した

手法

Matrix Factorization は ユーザ u \in U とアイテム i \in I を行列 X で表し,X を 2 つの密行列に分解 X \approx H W^T に分解する手法.
通常は分解後の行列の積を推定値とし,観測値との誤差を最小化するように分解後の行列の値を更新するが,今回は BPR を目的関数にして学習する.
レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOGを読むのが早い.

実装

レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOG
機械学習アルゴリズムのボトルネックをCythonで改善する話
勾配計算とパラメータ更新には Cython は使わず numpy を用いたが今回実験に用いたデータぐらいであれば十分な速度が出た.
また,学習データに対する誤差は愚直に BPR を計算すると重すぎる.例えば movielens 100K の cv 1 では 118596998 個のデータに対して計算が必要になる.
vasily の記事ではどうしているのだろうと実装を読むと元行列の値との二乗誤差を学習誤差としていた.これならば 80000 回の計算で済むのでとりあえず真似することした.
しかし,BPR は値の大小関係のみを考慮し、値そのものに対しては無頓着であるため,評価したアイテムに対する予測値が1を超えたり,評価していないアイテムへの予測値が0から遠ざかる(かつ,評価しているアイテムより値が小さい)場合には予測時の AUC が改善するのに学習誤差が悪化するという現象が発生しうる(と思っていたら手元で発生した,良かった)のでその点だけは忘れないようにしたい.

実験

データセットMovieLens 100K Dataset | GroupLens . 5-fold CV 用にデータが既に分かれているのでそれに従う.
元データは Rating だが, implicit feedback の状況を作りたいので,「ユーザが映画をレビューしたかどうか」とし,レビューしていた場合は '1' とする.
学習率は 0.01 ,正則化の lambda =0.01,行列分解の次元数を 10 とした時,SGD のステップ数とテストデータに対する AUC の平均値との関係を以下に記す.

ステップ数 AUC
1 * 80000 0.5025368957322833
10 * 80000 0.715481069666248
50 * 80000 0.8091419600355472

適切に学習できている.良かった.しかし通常の目的関数との比較は未知なので BPR をあえて選ぶかどうかはまた別の実験が必要だと思う.