糞糞糞ネット弁慶

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

Factorization Machines で Bayesian Personalized Ranking を用いた implicit feedback の推定を行いたかったけどうまくいかなかった

何故上手くいかなかったのか,あとから再現できるよう忘れないために書く.

要約

  • 回帰や分類ではなく, Bayesian Personalized Ranking にもとづく Factorization Machines を試したい
  • 実装はibayer/fastFM を使い,データに MovieLens 100K を選び実験するも AUC が 0.5 程度から改善しない
  • どう考えても自分の使い方が間違っている

導入

Factorization Machines (ICDM 2010)という手法がある.
元論文の説明は昔書いた記事(Factorization Machines (ICDM 2010) 読んだ - 糞ネット弁慶)を自分でも見返したりしている.

それとは別の話で BPR (Bayesian Personalized Ranking) と呼ばれる目的関数があり,特に implicit feedback と呼ばれる状況において有効である,とされている.
BPR: Bayesian Personalized Ranking from Implicit Feedback (UAI 2009)
レコメンドアルゴリズム(BPR)の導出から実装まで - Start Today Technologies TECH BLOG

implicit feedback の例としては,ユーザがある動画を閲覧したかどうか,というデータである.
例えば,ユーザ u_1 が 全 item i_1, ..., i_M のうち,i_1, i_2, i_3 だけを閲覧していたとする.
この時,BPR では「閲覧しなかったものより閲覧したものの方が優れている」という仮定をおき,そのようなスコアを出力する関数を学習する.
つまり,なんらかのスコアを返す関数 f(u, i) について,

f(u_1, i_1) > f(u_1, i_4), f(u_1, i_1) > f(u_1, i_5), ..., f(u_1, i_1) > f(u_1, i_M),
f(u_1, i_2) > f(u_1, i_4), f(u_1, i_2) > f(u_1, i_5), ..., f(u_1, i_2) > f(u_1, i_M),
f(u_1, i_3) > f(u_1, i_4), f(u_1, i_3) > f(u_1, i_5), ..., f(u_1, i_3) > f(u_1, i_M)

といった形の pairwise なデータを作り,この差の和が最大になるように学習を行う.

あとは予測対象の (u, i) に対して学習した関数を適用し,スコアを得たならば AUC なり top-K なりが計算できる.
この時,関数は Ranking を学習するものであるため,値の大小関係のみが重要であり,値そのものをなんらかの形では利用できないことは注意する必要がある.

好奇心から BPR を試してみたかったが手頃な実装が見当たらなかった.ちょうどいいところに BRP を目的関数に取る Factorization Machins の実装があったので実験することにした.

実装

pairwise なデータを作るところで愚直に list を使うと重いので np.array を長めに確保して切り詰めるというしょうもないことをやっている.

実験

データは MovieLens 100K Dataset | GroupLens を使った. 5-fold CV 用にデータが既に分かれているのでそれに従う.
元データは Rating だが, implicit feedback の状況を作りたいので「ユーザが映画をレビューしたかどうか」とし,レビューしていた場合は '1' とする.
特徴ベクトルはシンプルにユーザとアイテムとを one-hot encoding したものを concat している.なので今回の場合は 943 + 1682 次元.
学習率は 0.01 ,正則化パラメータはデフォルト値,行列分解の次元数を 20 とした時,SGD のステップ数と AUC の平均値との関係を以下に記す.

ステップ数 AUC
10 0.491907136
50 0.491988281
100 0.491724715

明らかにまともに学習できていない.学習率や次元数を変えてみたが改善しない.何か失敗していると思われるが原因が分からない.