行列分解でコールドスタート問題を解決するCB2CF法
第1回でも述べた「コールドスタート問題」とは、行動履歴が十分溜まっていないユーザー/アイテムについて推薦システムの精度が悪くなってしまうという問題で、特に
- 新規登録されたユーザーに対して何を推薦すればいいか分からない
- 新規登録されたアイテムが推薦されないので、それらのアイテムに対するレーティングや閲覧のデータが集まらない。
といった状況が発生しがちです。このような状況においては、ユーザー/アイテムについてのメタデータに基づいて推薦結果を作成する、というシステマティックな方法があります。ここでは、今まで述べてきた行列分解の手法から簡単にそのような推薦を行うことができるCB2CF(Content-based to Collaborative Filtering)すなわち「内容ベース法から協調フィルタリング法(行列分解のように行動履歴だけを用いる推薦手法)への変換」という手法について紹介します。
この方法は非常に直感的で、実は我々は脳内でCB2CFを行っています。レストランの例に戻ると、履歴行列
\(R=\left(\begin{matrix}1 & 0 & 1\\0 & 1 & 1\\1 & 1 & 1\end{matrix}\right)\)
から
\(\begin{aligned}\vec{p}_1 &= (1.35 , 0.35) \\\vec{p}_2 &= (0.35 , 1.35) \\\vec{p}_3 &= (1.21 , 1.21) \\\end{aligned}\)
というユーザーの表現を得たのでした。ユーザー1が中華料理好き、ユーザー2がフレンチ好き、ユーザー3が中華・フレンチどちらもそこそこ好き、というメタデータを事前に知っている我々は、これを以て「第1成分は中華好き度のようなもの、第2成分はフレンチ好き度のようなものなのでは」という解釈を得ました。この「(協調フィルタリング法である)行列分解の結果\(\vec{p}\)あるいは\(\vec{q}\)とメタデータの対応関係を類推する」という手続きが CB2CFです。
例えば、どの料理が好きかというメタデータは既知であるが、接触履歴がないため、行列分解の対象とすることができないユーザーに対しても推薦を実施するためにCB2CFを適用するとします。CB2CFでは次の2段階でユーザーのメタデータから推薦を実施するためのユーザーのベクトルを算出するモデルを構築します。
- まず、接触履歴行列\(R\)からなんらかの行列分解(SVD、WMF、BPR などなんでも構わない)アルゴリズムでユーザーのベクトル表現\(\vec{p}_u\)を算出しておきます。この計算では、接触履歴のあるユーザーに限られるため、接触が全くないユーザーについてはベクトル \(\vec{p}_u\)が計算されないことに注意します。
- 接触履歴のあるユーザー\(u\)について、そのユーザーのメタデータ行列\(X_u\)と\(\vec{p}_u\)の対応関係\(\vec{p}_u \sim f_\theta(X_u)\)を学習します。ここで、\(f_\theta(X_u)\)は、ユーザーのメタデータ\(X_u\)を受け取って\(n\) 次元のユーザーのベクトルを返すようななんらかの関数です(\(\theta\) がその関数のパラメータを表す)
CB2CFの構成
原論文では、\(f_\theta(X_u)\) の形にはニューラルネットワークを仮定し、その\(\theta\)(ニューラルネットのウェイトに相当)は残差平方和(実績値と予測値との誤差の二乗の和)
\(\sum_u || \vec{p}_u - f_\theta(X_u) ||^2\)
を最小化するように学習されていますが、ニューラルネットワークでなくても精度よく予測できるモデルであれば、線形回帰のようなシンプルなモデルでも構いません。
実際に接触履歴がないユーザーに対してアイテムを推薦するには、次のようにします。
- まず、ユーザーのメタデータ\(X_u\)から学習済みのモデル\(f_\theta(X_u)\) を使ってそのユーザーのベクトル\(\vec{p}_u\)を算出する。
- このユーザーのベクトルを使って、アイテムのベクトル \(\vec{q}_i\)との内積からスコア \(s_{ui} = \vec{p}_u \cdot \vec{q}_i\)を算出し、スコアの高いアイテムから推薦をする。
CB2CFは、機械学習の手法である行列分解で得られた行列\(P, Q\)を教師データとして、さらにメタデータ\(X\)から\(P, Q\)を予測する別の問題を解きます。つまり、モデルは行列分解とメタデータからの予測モデルの二段構えの構成となっており、それぞれのフェーズでモデルの予測誤差に起因するノイズが加わります。こうした構成であるため、行列分解で加わったノイズが、後段の予測モデルで増幅されてしまうことが懸念されますが、一方でこの手法には「パラメータチューニングを分解して行うことができる」という大きな利点があります。これは、
- \(R\)を最も精度よく行列分解するアルゴリズムと、行列分解のパラメータ(次元数や正則化パラメータなど)を交差検証で決定する
- 1.で計算したユーザー/アイテムのベクトルをメタデータから予測するモデルとして、最も精度よく近似させるためのモデルパラメータを決定する。
という方策により、問題を2段階に分けて解くことで、パラメータ探索の組み合わせ数を減らすことができ、最適な結果が得るまでの時間を短縮することができます。2.での最適化はニューラルネットワーク系のライブラリが高速かつ手軽に利用できます。
近年、行列分解表現\(P\),\(Q\)と\(f_\theta\)を同時に学習するようなアルゴリズムも提案されており(例えばWMFの誤差関数を拡張するものなど)、若干の精度向上が報告されていますが、そのようなアプローチは得てしてハイパーパラメータの探索空間が巨大になってしまい、チューニングに大きな時間を要します。一方、CB2CFのような手軽かつ汎用的な(ニューラルネットの構造次第でメタデータの複雑さを手軽に吸収できる)方法は現場との親和性が高いのではないか、と筆者は考えています。
