SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現場のAIエンジニアに学ぶ推薦システム入門

レコメンドアルゴリズム「BPR」による推薦システムの実装と、SVD・WARP手法との比較【推薦システム入門】


  • X ポスト
  • このエントリーをはてなブックマークに追加

 データをもとに、ユーザーが気に入りそうなアイテムを推薦する推薦システムは、通販サイトや求人サイトなど、生活のいたるところで利用されています。本連載では推薦システムについて学びたい開発者やデータサイエンティスト、およびプロダクトのユーザー体験を向上させたいと考えている方向けに、接触履歴情報のみを用いる「暗黙的フィードバック」を使った推薦システムの概要と代表的なアルゴリズム、およびそれらの長所と短所を解説します。第2回と第3回は、行列分解の手法のうち、最も基本的なアルゴリズムである特異値分解(SVD)と重みつき行列分解(WMF)について理論的な背景とコードの実装例を解説しました。今回は、WMFと同じくポピュラーであるBayesian Personalized Rankingという手法について解説し、コード例を示します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

Bayesian Personalized Rankingとは

 第2回と第3回で説明した行列分解の方法(SVD、WMF)は行列\(R\)の近似を直接見つけにいく手法でした。これらのアプローチでは、接触のない組み合わせ\(R_{ui}=0\)について \(\vec{p}_u \cdot \vec{q}_i\)で近似した時の精度が低すぎても高すぎても良い推薦結果とならず、ちょうどバランス良い精度で近似する必要がありました。これは「接触がない」ということが必ずしも「対象のアイテムがユーザーにとって興味がない」ということを意味していないためです。

 今回紹介するBayesian personalized ranking(BPR)では、\(R_{ui}\)が0や1を取るのは、そのユーザーにとってのアイテムに対する興味の順序関係を示唆しているだけで、予測値が精緻に0や1になるように予測することを考えない、という違った見方をします。すなわち、ユーザー\(u\)を固定した時、あるアイテム\(i\)については\(R_{ui} = 1\)であり、また別アイテム\(j\)については\(R_{uj}=0\)となっているのは、ユーザー \(u\)にとってはアイテム \(i\) が \(j\) より重要であったからだ、と考えます。このことをアイテムの比較の記号 \(>_u\) を使って \(i >_u j\)と書くことにします。

 例として、行がユーザー、列がアイテムに対応する接触履歴の行列 \(R\) が、

\[ R = \left(\begin{array}{ccc} 1 & 0 & 0 \\ 1 & 1 & 0 \\ & \cdots & \end{array}\right) \] 

と与えられた場合、BPRで\(R\)を以下のように読み替えます:
  • ユーザー1はアイテム1をアイテム2より好む:\(1 >_1 2\)
  • ユーザー1はアイテム1をアイテム3より好む:\(1 >_1 3\)
  • ユーザー1がアイテム2とアイテム3のどちらをより好むかは未知(これを決定して推薦する必要がある)
  • ユーザー2はアイテム1をアイテム3より好む:\(1 >_2 3\)
  • ユーザー2はアイテム2をアイテム3より好む:\(2 >_2 3\) ...

 その上で、より好むアイテムの方が、そうでないアイテムよりもユーザー/アイテムのベクトルの内積が大きくなる確率モデルを考えることが、BPRの考え方の基本となります。具体的には、ユーザー\(u\)に対する2つのアイテム\(i,j\)の好みについて\(i>_u j\)(つまりアイテム\(j\)より\(i\)の方を好む)という関係が成り立つかどうかの確率\(p(i>_u j)\)が、次のように\(\vec{p}_u, \vec{q}_i, \vec{q}_j\)の3つのベクトルを用いて、求められると考えます。

\[ p(i>_u j) = \sigma(s_{ui} - s_{uj})= \sigma( \vec{p_u}\cdot\vec{q}_i - \vec{p_u}\cdot\vec{q}_j) \] 

 ここで\(\sigma\)はシグモイド関数であり、\(s_{ui} - s_{uj}\)の値が正に大きいほど確率は1に近づき、負に大きいほど確率は0に近づきます。つまりアイテム\(j\)より\(i\)のスコアが大きいほどこの確率値が1となります。このようにBPRはSVD、WMFが1人のユーザーと1つのアイテムの関係からベクトルを構成するのとは異なり、1人のユーザーと、そのユーザが接触したアイテム、接触しなかったアイテムの3つ組の関係からベクトルを再構成するスタンスをとります。

 この前提から、BPRの場合の誤差関数は、実際に\(i >_u j\)が観測されている組み合わせについての対数尤度\(\log p(i>_u j)\)を大きくするという方針に基づいて、

\[ L_{\mathrm{BPR}} = - \sum_{u} \sum_{i \in I_u ^+} \sum_{j \in I_u ^-}\log \sigma( s_{ui} - s_{uj} ) + \frac{\lambda_{\mathrm{user}}}{2} \sum_{u=1} ^U | \vec{p}_u | ^ 2 + \frac{\lambda _{\mathrm{item}}}{2}\sum_{i=1} ^I |\vec{q}_i|^2 \] 

と書かれます。ここで、\(I _u ^+\) はユーザ\(u\)に対して \(R_{ui}=1\) となる \(i\) の集合(つまりユーザー\(u\)が接触したアイテムの集合)、\(I _u ^-\) は \(R_{uj}=0\) となる集合(ユーザー\(u\) が接触しなかったアイテムの集合)をそれぞれ表します。そのため、\(\sum_{i \in I_u ^+} \sum_{j \in I_u ^-}\) は \(i >_u j\) となる全ての組み合わせ \((i,j)\) についての和になります。第2項・第3項は正則化のために導入されるものです。

\(P\), \(Q\)の導出

 \(L_{\mathrm{BPR}}\)の最小化は\(L_{\mathrm{WMF}}\)のそれよりも複雑になります。というのも、\(u\) を固定する時、\(L_{\mathrm{BPR}}\)の第1項に存在する和\(\sum_{i \in I_u ^+} \sum_{j \in I_u ^-}\)は \(N_u \times (I - N_u)\)項の足し合わせたものになっています。\(N_u = |I^+_u|\)は\(u\)の接触済みアイテム数です。多くの場合、各ユーザーが接触したアイテム数は全アイテムのごく一部に限られることから\(I\gg N_u\)となるので、和の組み合わせはほぼ\(N_u I\)個となります。ここから全ユーザー\(u\)で和を取ると、組み合わせ数は \((\sum_u N_u) \times I = \mathrm{NNZ} \times I\)となります。ここで、\(\mathrm{NNZ}\)は\(R\)の非ゼロ要素数、すなわち全接触数となります。

 この和の計算に必要な計算量は\(O(\mathrm{NNZ} \times I)\)であって、最適なパラメータを得るためにはこの計算を反復させる必要があり、非常に時間がかかります。そこで、原論文では確率的勾配降下法(以下、SGD)を用いた最適化が提案されています。この方法では、和\(\sum_u \sum_{i \in I_u ^+} \sum_{j \in I_u ^-} \log \sigma(s_{ui} - s_{uj})\)を計算する代わりに、

  1. \(R_{ui} = 1\)となる\((u, i)\)をランダムに抽出する
  2. 1.の\((u, i)\)に対して、\(j_{s} \in I_u ^-\) をランダムに抽出する。これを負例サンプリング(negative sampling)という。
  3. \(L _ {\mathrm{BPR}}\)を (定数) \( \times \log \sigma(s _ {ui} - s _ {uj})\)と近似する。
  4. 3.の勾配に基づいて\(\vec{p}\), \(\vec{q}\)を更新

 という近似を行います。なお、多くの実装では、全てのユーザーについて必ずパラメータを更新したい、という目的のため、1.でランダム抽出は行わず、\(R_{ui}\)で接触のあった\(R_{ui}=1\)となるユーザー/アイテムの組み合わせを順番に選び出すロジックになっています。

 このようにSGDの実装にはさまざまなバリエーションがありますが、パラメータ更新の対象が抽出されたユーザー/アイテムに限定されることから、SGDによる最適化は理論上の計算量オーダーがWMFよりも少ないという利点があります。その一方で、SGDを採用することによってチューニングが必要なパラメータが新たに導入されるため、パラメータの数がWMFと比較して増加します。\(L_{\mathrm{BPR}}\)に存在するパラメータ\(n\),\(\lambda_{\mathrm{user}}\),\(\lambda_{\mathrm{item}}\)に加えてSGDに関連するパラメータの探索も必要となり、探索対象が広くなるため、optunaなどのフレームワークによる最適化にはある程度の試行回数が必要です。このため、例えば近年の網羅的なサーベイでは、全体としての精度はWMFに見劣りするようです。

BPRと関連する手法

 BPRが実施するのと同様に、負例サンプリングとSGDによるパラメータ更新を用いて行列分解を計算する方法には、他にも以下のようなバリエーションがあります。

  • WARP (Weighted Approximate-Rank Pairwise):WARPはBPRとは独立した文脈で導入された手法ですが、負例サンプリングとSGDによるパラメータ更新という点では同じものです。ただし、以下の二つの工夫を負例サンプリングとSGD更新について施しており、より効率的な学習ができる(場合がある)と期待されます。
    1. \((u,i) \in I_u^+\) に対して\(j_{s} \in I_u ^-\) を負例サンプリングする際、\(I_u^-\)から完全にランダムにサンプルするのではなく、ある程度「惜しい」アイテムのみを有効な負例と認める。ここでアイテム\(j\)が「惜しい」とは、\(s_{ui} - s_{uj} < 1\)、すなわち\(i\)に対するスコア差が1未満であると定義されます。
    2. 負例に対するスコア値\(\left\{s_{uj}\right\}_{j \in I_u^-}\)と比較して、より後ろに来てしまう\((u,i)\)ほどSGDの更新を強くする。これは「多くの負例アイテムに負けてしまう、弱い正例ほどなるべく強く救済する」という意味合いを持ちます。
  • SGD-MF:2020年に出た論文です。この論文で強力なベースラインとして紹介されたのは、BPRとよく似た以下のような最適化手続きで行列分解を行うモデルです。
    1. 正例 \((u,i)\) に対し、一度に\(m\)個の負例 \(\left\{j_k\right\}_{k=1}^{m}\)を一様にサンプリングする
    2. \(L = \log \sigma(s_{ui}) - \sum_{k=1}^m \log(1 - \sigma(s_{uj_k}))\) + (正則化項)から勾配を計算してパラメータ更新
    整数パラメータ\(m\)は非常に重要で、次元などのパラメータと並んでしっかりチューニングする必要があります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
BPR vs. SVD vs. WARPの比較

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現場のAIエンジニアに学ぶ推薦システム入門連載記事一覧

もっと読む

この記事の著者

大槻 知貴(株式会社ビズリーチ)(オオツキ トモキ)

 株式会社ビズリーチ(Visionalグループ) CTO室 AIグループ所属 NTTデータ数理システム、AIベンチャーを経て、2018年にビズリーチ入社。データサイエンス業務に従事し、Visionalグループにおける機械学習関連機能のR&Dを担当。理学博士(物理学)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

中江 俊博(株式会社ビズリーチ)(ナカエ トシヒロ)

 株式会社ビズリーチ(Visionalグループ) CTO室 AIグループ所属 NTTデータ数理システムにてデータ分析の受託案件を多数担当。その後、IoTスタートアップを経て、2019年にビズリーチ入社。レコメンドシステムなど機械学習関連の実装作業に従事。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15361 2022/04/14 11:02

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング