Collaborative Filtering for Implicit Feedback Datasetsを読んだ

SparkやMahoutで使えるALSというのがよくわかっていなかったので調べていたのですが、単にMatrix Factorization(MF)の学習法の名前でした。そういえば聞いたことある気がしてきた・・・。

それはそれとして、Sparkのドキュメントで紹介されていた、Collaborative Filtering for Implicit Feedback Datasetsという論文が面白そうだったので読んでみました。

Matrix Factorzationのようなレーティング予測よりも、普通の協調フィルタリングのようにレコメンドすべきかどうかを予測するほうが実用上重要だよね、という話。まさにそう思っていたので、読んでよかったと思える論文でした。

概要

MFはユーザによるレーティングが教師データとして与えられていて、これを予測します。このような問題設定をExplicit Feedbackと論文では言っています。

一方で、普通の協調フィルタリングのように購入履歴や視聴履歴などから、ユーザにそれをレコメンドするべきかどうかを予測する問題設定をImplicit Feedbackと言っています。

この論文ではMFをImplicit Feedbackに対応して拡張させたよ、ということが書いてありました。

Sparkで使われているALS(MF)もImplicit Feedbackに対応しているようで、それなら充分使えるなという印象でした(レーティング予測してどうするの、ってずっと思ってた)。

結果的にツールをやったことで得られる知見もあったということです。

手法

MF(Explicit Feedback)は(r - <x,y>)2を最小化します。

xとyがそれぞれアイテム、ユーザを表すベクトルで、rがレーティングです。

Implicit Feedbackの場合、rはアクションの回数になります。レーティングはユーザのpreferenceを表すのに対して、アクションの回数はconfidenceを表すので、これらは別物だよねということが書いてあります。

なのでImplicit Feedbackの場合、rからpとcという2つの値を作ります。pはpreferenceに対応する変数でr>0なら1、それ以外は0になります。アクション回数の多さがpreferenceの高さに直結するとはいえない、という発想です。

cはconfidenceに対応する変数で1+αr(αはパラメータ)となります。こちらはアクション回数が増えると大きくなります。

そして、Implicit Feedbackではc(p - <x,y>)2を最小化します。ニ乗誤差をconfidenceで重み付けするわけです。

またExplicit Feedbackの場合、観測されない事例はなかったことにするのですが、Implicit Feedbackの場合、0として事例に加えます(ただしr=0の場合confidenceは小さいので、二乗誤差の影響は小さい)。

結果、Explicitは疎行列なのに対してImplicitは密行列になります。なので通常のALSによる学習と違って密行列でも効率的に計算する必要があります。これについてはアイテムベクトルのみに依存する密行列とユーザのconfidenceが依存する疎行列に分解していい感じにやる方法が論文に書いてあります(めんどいので省略)。

メモ

Implicit Feedbackという名前は知らなかったのですが、明らかにこういうのが必要だと思っていたので読んでよかったです。

前に、言語モデルとかレコメンデーションの学習を識別モデルでやるのは筋が悪いんじゃねという話を日記に書きました。それはExplicitな問題設定だったからで、そのために言語モデルではnegative samplingとかやらないといけなかったのですが、本論文のようにImplicitな問題設定で学習できるならわりと筋がよい気がしました。

Implicit Feedbackで言語モデルを学習させるのってよさそう感ありますけど、すでにやられているのか気になりますね。