こんにちは、ソフトウェアエンジニアの冨田恭平です。
今回は、蓄積したデータの応用例として弊社が開発しているECサイトでのレコメンドシステムの仕組みを紹介します。
レコメンドシステムとは
世の中には様々なレコメンドシステムが存在しますが、今回はECサイトの商品個別ページを開いたユーザーに対してn個のおすすめ商品を表示するようなレコメンドシステムを想定します。
ECサイトのスタッフのおすすめ商品リストを固定で表示してもレコメンドと言えますが、現在では個々の商品やユーザーごとに異なるおすすめリストを表示することが当たり前となっています。大手ECサイトであるAmazon.comでは、1998年からアイテムベース協調フィルタリングを使用したレコメンドを行っており1、レコメンド経由での商品閲覧は全体の30%程度にも及ぶと推測されています2。FLYWHEELでも、協調フィルタリング等の複数の手法を組み合わせ個々のユーザーに合わせた商品をおすすめ(パーソナライズ)できるようなレコメンドシステムを開発しています。
また、レコメンドシステムはユーザー数や商品数が大きくなっても問題なく動くようなスケーラビリティを備えている必要があります。例えば有名なECサイトである楽天市場の場合などは2.5億点以上の商品を取り扱っています3。コンピュータ1台で1つの商品のおすすめリスト作成に0.1秒4かかるとしたら、全ての処理を終えるのには9ヶ月以上の時間が必要です。このような事態を避けるため、レコメンドシステムを開発するにはスケーラビリティに注意して開発を進める必要があります。
レコメンド手法の分類
レコメンド手法は様々なものが提案・使用されてていますが、大まかに下記のように分類することができます56。
- 協調フィルタリング。ユーザーの商品評価ログ(商品レビュー、購入履歴、閲覧履歴など)を使用した推薦方法です。対象となるユーザーに似ているユーザーが高く評価した商品をおすすめする方法(ユーザーベース)や、対象商品を高く評価したユーザーが他にも高く評価した商品をおすすめする方法(アイテムベース)があります。ユーザーとアイテムを軸で評価が値となる行列から直接類似度を計算する実装、行列分解やword2vecなどの分散表現を学習して類似度計算を行う実装などが存在しています。現在でも広く使われている手法で、データが十分にある場合は良いレコメンドができると言われていますが、新しく追加された商品は評価が蓄積されるまでおすすめできないという問題点もあります(コールドスタート問題)。
- 内容ベースフィルタリング。商品名や商品カテゴリ、商品説明文などを元に、ユーザーが過去に気に入った商品と類似した商品を探しておすすめする手法です。協調フィルタリングとは異なり、商品データがあれば評価のログが存在しなくても商品をおすすめすることができます。
- デモグラフィックベース。ユーザーのデモグラフィックを使用しておすすめを行う手法です。例えばあらかじめおすすめ商品のリストを複数パターン用意しておき、ユーザーの年齢や性別に応じて出し分ける形などが考えられます。少数のユーザー属性によって結果を出し分ける場合は比較的単純な仕組みで運用できる一方で、協調フィルタリングほどパーソナライズした結果を提示することはできません。
- 知識ベース。ドメイン知識等を用いておすすめする商品を決定する手法です。ユーザーにいくつか質問をして旅行先をおすすめするAirbnb Trip Matcher7などは知識ベースのレコメンドの一例といえます。蓄積されているデータが少ないときにはログから学習する手法(協調フィルタリングなど)よりも良い性能となる傾向がありますが、データが増えるにつれ性能的にはそれらの手法に劣ってしまうことが多いようです。また、実装にドメイン知識を用いるので、他のドメインへ手法を流用することが容易ではありません。
- ハイブリッド型。上記手法やその他の手法の長短を補う形で複数組み合わせたレコメンドシステムはハイブリッド型と呼ばれています。
FLYWHEELでの2段階レコメンドシステム
今回のECサイトのケースにおいて、FLYWHEELでは協調フィルタリングと内容ベースフィルタリング等を組み合わせたハイブリッド型のレコメンドシステムを開発しています。また、おすすめ商品候補を生成する第1段階と、おすすめ商品候補をランキングして最終的におすすめする商品を決定する第2段階に分かれたアーキテクチャとなっています。
この2段階のアーキテクチャはYouTubeのおすすめ機能にも採用されており8、次のようなメリットが考えられます。
- 第1段階は定期的(1日1回など)に実行されれば良いので、大規模なデータにも対応できる。
- 第2段階でユーザーごとにパーソナライズしたおすすめリストを表示できる。
- 複数の手法や情報源で用意したおすすめ商品候補を混ぜて利用できる。新たな手法で生成した候補の追加も容易である。
第1段階: おすすめ候補の生成
第1段階ではおすすめを表示したい全商品に対して、おすすめ商品として表示しうる候補を100個〜1000個ほど選びます。候補の生成には先に紹介した複数の手法を組み合わせることが可能で、実際に私たちもいくつかの手法を組み合わせています。
アイテムベース協調フィルタリング
ユーザーにある程度購入されている商品に関しては、アイテムベース協調フィルタリングでおすすめ商品候補の生成が可能です。
アイテムベース協調フィルタリングでの具体的な候補計算方法はAmazonの論文9で紹介されています。今回私たちは、ユーザー\(u\)が商品\(i\)を過去に購入した回数を\(c_{ui}\)としたときの評価値を\(r_{ui} = \log c_{ui}\)とし、この値に対して協調フィルタリングを適用しました。具体的には、商品\(i\)についてのおすすめ候補を生成するには、商品\(i\)への評価を表したベクトル
$$I_i = (r_{0i}, r_{1i}, \cdots, r_{mi})^T$$
に対して\(\cos(I_i, I_j)\)が最大となるような商品\(j\)を100個〜1000個程度計算しました。
Amazonの論文で述べられている通り、実用上は商品数N、ユーザー数Mの場合の計算量はO(NM)となります。商品数やユーザー数が大規模になってくると1台のマシンで処理するには時間がかかりすぎるので、弊社ではApache Sparkを使用して分散環境で候補の計算をしています。
内容ベースフィルタリング
アイテムベース協調フィルタリングは過去の購入履歴を元に候補を生成していました。この場合コールドスタート問題と呼ばれる、1度も購入されていない商品はおすすめ候補に挙げられないという欠点が存在しています。その欠点をカバーするため、商品ごとに特徴ベクトルを計算し、コサイン類似度とk近傍法(K-Nearest Neighbor)を使って似ている商品を見つけておすすめ候補としました。商品の特徴ベクトルには、商品名や商品説明文に書かれている単語の出現頻度を集計し、さらにWikipediaから学習したIDF(Inverse Document Frequency)で重み付けしたものを使用しました。
この内容ベースフィルタリングも先ほどの協調フィルタリングと同様にApache Sparkで分散させて処理をしており、さらに近似近傍探索(Approximate Nearest Neighbor)を利用して近似解を求める代わりに高速に処理が終わるような実装にしています。
第2段階: おすすめ候補のランキング
レコメンドシステムの第2段階では、実際にユーザーが商品個別ページにアクセスした時点で、あらかじめ用意しておいた1000個以下のおすすめ商品候補から、ユーザーに合った商品をn個選びます。既にユーザーが購入済みの商品を取り除くといった作業もこの時点で行います。おすすめ商品候補をランキングする手法もいくつか考えられますが、ここでは2つ紹介します。
1つ目は第1段階でおすすめ商品候補を計算する際に使用したスコアを活用する方式です。おすすめ商品候補を協調フィルタリングと内容ベースフィルタリングの2種類の方法で計算しており、商品\(i\)の類似度がそれぞれ\(S_i^\mathrm{CF}\)と\(S_i^\mathrm{TEXT}\)だったとします。これらのスコアを組み合わせる方法は多くありますが、例えば単純に線型に結合したスコア\(s_i = \alpha_\mathrm{CF} S_i^\mathrm{CF} + \alpha_\mathrm{TEXT} S_i^\mathrm{TEXT}\)を計算して、このスコアを元にランキングを行うことができます。この際、係数の\(\alpha_\mathrm{CF}\)と\(\alpha_\mathrm{TEXT}\)はオフライン評価やA/Bテストなどのオンライン評価を通して決定する必要があります。
2つ目はユーザーの閲覧履歴を使用した協調フィルタリングやそれに類する手法を活用する方法です。以前の記事で紹介したログのセッション化が適切に行われている場合、各ユーザーが1つのセッションの中でどのような商品をどのような順番で閲覧したかの列を取得することができます。この閲覧履歴の列を教師データとしてword2vecとして知られるskip-gramモデル学習すると、前後に似た商品が閲覧されているような商品 (=似た商品) が上位に現れるようなランキングを行うことができます。さらにユーザーの直近の閲覧履歴も使用してランキングを行った場合、ランキング結果を直前に閲覧した商品によって変化させる (=パーソナライズする) ことも可能になります。
おすすめ商品候補のランキングに使われているわけではないですが、word2vecを使ったレコメンドシステムはMicrosoftの論文10で提案されていたり、リクルートのメディア11やAnghamiの音楽推薦機能12等でも活用されているようです。
まとめ
今回は私たちが開発しているECサイト向けのレコメンドシステムの概要を紹介しました。複数の手法を組み合わせたハイブリッド型のレコメンドシステムであり、おすすめ商品候補の用意とそのランキングという2段階に分かれたシステムにすることで取扱商品数やユーザー数が大規模になってもスケールするよう設計しました。
自己紹介
冨田恭平
2014年、新卒でMicrosoft Developmentに入社。WindowsチームにてIMEとパーソナルアシスタントCortana、AI and Research Groupにて女子高生AIりんなの開発に携わる。2018年よりFLYWHEELに参加。
Notes
- Two Decades of Recommender Systems at Amazon.com, https://www.computer.org/csdl/mags/ic/2017/03/mic2017030012.html ↩
- Estimating the Causal Impact of Recommendation Systems from Observational Data, https://www.microsoft.com/en-us/research/publication/estimating-the-causal-impact-of-recommendation-systems-from-observational-data/ ↩
- 2018年10月1日時点、https://www.rakuten.co.jp/ より取得 ↩
- 実際はユーザー数の増加に伴って商品1つのリスト作成に要する時間も増加していくことが多いです ↩
- Recommender Systems: Introduction and Challenges, https://link.springer.com/chapter/10.1007/978-1-4899-7637-6_1 ↩
- Recommender systems survey, https://www.sciencedirect.com/science/article/pii/S0950705113001044 ↩
- https://press.airbnb.com/tripmatcher ↩
- Deep Neural Networks for YouTube Recommendations, https://ai.google/research/pubs/pub45530 ↩
- Amazon.com Recommendations Item-to-Item Collaborative Filtering, https://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf ↩
- ITEM2VEC: NEURAL ITEM EMBEDDING FOR COLLABORATIVE FILTERING, https://arxiv.org/abs/1603.04259. この論文では閲覧履歴ではなく購入履歴を元にしたおすすめ商品リスト生成を提案している。 ↩
- リクルート式 自然言語処理技術の適応事例紹介, https://www.slideshare.net/recruitcojp/ss-56150629 ↩
- Using Word2vec for Music Recommendations, https://towardsdatascience.com/using-word2vec-for-music-recommendations-bb9649ac2484 ↩