SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

推薦システム初心者におすすめの手法「行列分解」とは? ~特異値分解からCB2CF法によるコールドスタート問題解決まで~

行列分解でコールドスタート問題を解決する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段階でユーザーのメタデータから推薦を実施するためのユーザーのベクトルを算出するモデルを構築します。

  1. まず、接触履歴行列\(R\)からなんらかの行列分解(SVD、WMF、BPR などなんでも構わない)アルゴリズムでユーザーのベクトル表現\(\vec{p}_u\)を算出しておきます。この計算では、接触履歴のあるユーザーに限られるため、接触が全くないユーザーについてはベクトル \(\vec{p}_u\)が計算されないことに注意します。
  2. 接触履歴のあるユーザー\(u\)について、そのユーザーのメタデータ行列\(X_u\)と\(\vec{p}_u\)の対応関係\(\vec{p}_u \sim f_\theta(X_u)\)を学習します。ここで、\(f_\theta(X_u)\)は、ユーザーのメタデータ\(X_u\)を受け取って\(n\) 次元のユーザーのベクトルを返すようななんらかの関数です(\(\theta\) がその関数のパラメータを表す)
CB2CFの構成

CB2CFの構成

 原論文では、\(f_\theta(X_u)\) の形にはニューラルネットワークを仮定し、その\(\theta\)(ニューラルネットのウェイトに相当)は残差平方和(実績値と予測値との誤差の二乗の和)

 \(\sum_u || \vec{p}_u - f_\theta(X_u) ||^2\)

を最小化するように学習されていますが、ニューラルネットワークでなくても精度よく予測できるモデルであれば、線形回帰のようなシンプルなモデルでも構いません。

 実際に接触履歴がないユーザーに対してアイテムを推薦するには、次のようにします。

  1. まず、ユーザーのメタデータ\(X_u\)から学習済みのモデル\(f_\theta(X_u)\) を使ってそのユーザーのベクトル\(\vec{p}_u\)を算出する。
  2. このユーザーのベクトルを使って、アイテムのベクトル \(\vec{q}_i\)との内積からスコア \(s_{ui} = \vec{p}_u \cdot \vec{q}_i\)を算出し、スコアの高いアイテムから推薦をする。

 CB2CFは、機械学習の手法である行列分解で得られた行列\(P, Q\)を教師データとして、さらにメタデータ\(X\)から\(P, Q\)を予測する別の問題を解きます。つまり、モデルは行列分解とメタデータからの予測モデルの二段構えの構成となっており、それぞれのフェーズでモデルの予測誤差に起因するノイズが加わります。こうした構成であるため、行列分解で加わったノイズが、後段の予測モデルで増幅されてしまうことが懸念されますが、一方でこの手法には「パラメータチューニングを分解して行うことができる」という大きな利点があります。これは、

  1. \(R\)を最も精度よく行列分解するアルゴリズムと、行列分解のパラメータ(次元数や正則化パラメータなど)を交差検証で決定する
  2. 1.で計算したユーザー/アイテムのベクトルをメタデータから予測するモデルとして、最も精度よく近似させるためのモデルパラメータを決定する。

 という方策により、問題を2段階に分けて解くことで、パラメータ探索の組み合わせ数を減らすことができ、最適な結果が得るまでの時間を短縮することができます。2.での最適化はニューラルネットワーク系のライブラリが高速かつ手軽に利用できます。

 近年、行列分解表現\(P\),\(Q\)と\(f_\theta\)を同時に学習するようなアルゴリズムも提案されており(例えばWMFの誤差関数を拡張するものなど)、若干の精度向上が報告されていますが、そのようなアプローチは得てしてハイパーパラメータの探索空間が巨大になってしまい、チューニングに大きな時間を要します。一方、CB2CFのような手軽かつ汎用的な(ニューラルネットの構造次第でメタデータの複雑さを手軽に吸収できる)方法は現場との親和性が高いのではないか、と筆者は考えています。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
現場のAIエンジニアに学ぶ推薦システム入門連載記事一覧

もっと読む

この記事の著者

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

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

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14280 2021/06/28 11:00

イベント

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

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

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

メールバックナンバー