見出し画像

これから推薦システムを作る方向けの推薦システム入門

イントロ

「Amazonのこの商品をチェックした人はこの商品もチェックしています」や「YouTubeのあなたへのおすすめ」、「Twitterのおすすめユーザー」などのレコメンド機能は多くのWebサービスに組み込まれております。そのレコメンドによって、ついつい商品をたくさん買ってしまったり、夜遅くまで動画を見てしまった経験はないでしょうか。

この記事では、レコメンドシステムの裏側はどのような仕組みになっているのか、そもそもレコメンドとはどういうものなのかを具体例を交えながら俯瞰できればと思います。レコメンドシステムのアルゴリズムの詳細には触れず、ビジネスにおいてどのような形で実装されているかにフォーカスしています。ネット上に公開されているレコメンドに関するスライドや記事、論文のリンクをまとめましたので、アルゴリズムの詳細などはリンク先の記事でご確認ください。

対象の読者は、自社のサービスにレコメンドシステムを組み込みたいエンジニアやデータサイエンティスト、UXデザイナーなどレコメンドに興味関心があるかたを想定しています。この記事が、レコメンドについて俯瞰して自社サービスにはどのようなレコメンドを使用すればよいかの判断の参考になれば幸いです。

(そもそも、この記事を書くきっかけは、技術書典やコミケにレコメンドに関する本を書いて参加したく、2週間に1度のペースで記事を書いていけば、本になるのではというものです。数年前からレコメンドに関する本を書きたいと思っていたのですが、まったく進捗がなかったので、2週間に1度noteに公開していき、筆が進んで欲しいと思っています。)

おかげさまで、「推薦システム実践入門 ―仕事で使える導入ガイド」というタイトルでオライリージャパンから出版されることになりました。(2022/04/07更新)

推薦システムとは

この記事では、推薦システムとは「複数の候補から価値のあるものを選び出し、意思決定を支援する仕組み」という定義で説明していきます。

Konstan 2001による「どれに価値があるかを特定するのを助ける道具」という定義と「情報推薦システム入門 -理論と実践-」の一節にある「推薦システムの分野の大きな目標は、ユーザーに(オンライン)意思決定支援を行うシステムを構築することである」をつなぎ合わせて定義しています。

例えば、AmazonやYouTubeでは、商品や動画の量が膨大にあり、その中からユーザーが自ら好むものを探し出すのは困難です。そこで、レコメンドシステムによって、ユーザーの今までの閲覧履歴を分析して、どのアイテムを好みそうかを特定して、それをついついクリックしてしまうようにわかりやすく提示することで、どのアイテムを購入/視聴するといった意思決定を支援しています。

レコメンドにおいて、たくさんあるアイテムからそのユーザーにとって価値のあるアイテムを選び出す技術はもちろん大事なのですが、ビジネスにおいては、どのようにそれらのアイテムを提示してユーザーにスムーズに意思決定をしてもらうかも大切になります。なぜそのアイテムをレコメンドするのかという推薦理由を提示したり、ユーザーが見てくれそうなタイミングでメールをしたりなどのUXデザインが大切になってきます。

レコメンドに関連する言葉で「検索」があります。どちらも「たくさんあるアイテムから価値あるアイテムを選ぶ/並べる」というもので、使用されるアルゴリズムが被ることも多く、境界が明確にあるわけではありませんが、「能動的」か「受動的」かで説明されることがあります。(WSDM 2019 Tutorial)

検索は、ユーザーが特定の検索ワードを入力して、能動的に知りたい情報や商品を探します。一方で、レコメンドはユーザーの閲覧履歴などからアイテムを提示したり、人気商品のアイテムリストを提示したりと、ユーザーは検索ワードなどを入れることなく、好みな商品に出会えることができます。AmazonやYouTubeでは、ユーザーが明確な意図を持ってサイトを訪れていなかったとしても、これまでの活動履歴を元にしたアイテムをレコメンドしてくれます。

推薦システムの種類

推薦システムは、まずパーソナライズあり/なしで大きく2つに分けることができます。

パーソナライズなし
人気度順、新着順などの全ユーザーに対して同じ内容を提示するものです。パーソナライズありのレコメンドに比べて、技術はすごくシンプルですが、業界によってはパーソナライズありのものより、クリック率や購入率が高い場合もあります。

パーソナライズあり
パーソナライズありのものは、ユーザーのプロフィールや過去の購入履歴などから、そのユーザーに適したアイテムを選択し提示するものです。
パーソナライズするのに、主に2種類のデータを使用します。

・1つ目がユーザーのプロフィールやアイテムのジャンルなどのコンテンツ情報です。
・2つ目がユーザーがそのサービス内で行動した行動履歴のデータです。この行動履歴を使ったレコメンドは協調フィルタリングと呼ばれています。

前者は、アイテムのテキスト情報からtfidfやword2vecなどの手法を使って類似度を計算したり、タグやカテゴリ情報から類似度を計算したりします。後者は、行列分解やアソシエーション分析、利用者間型メモリベース法といった方法がよく用いられます。

前者に比べて、後者のほうが、ユーザーの嗜好がリアルタイムに反映されていくので、よりクリックや購入がされやすいレコメンドができる傾向があります。一方で、新規ユーザーや新規アイテムに対しては、活動履歴のデータがないため、前者のコンテンツ情報を用いてレコメンドすることが多いです。(この問題は、コールドスタート問題と呼ばれ、レコメンドの研究分野で解決策について盛んに議論されています。)

レコメンドシステムの自社サービスへの組み込みについて

レコメンドシステムには、いくつか種類があることを述べましたが、具体的にどのようにどのレコメンドシステムを自社のサービスに組み込んでいくのが良いのでしょうか。各レコメンドの特徴をまとめながら、大まかな方針を解説していきます。

まずは、人気度や新着順のパーソナライズしないレコメンドから検討します。これらのレコメンドは、各ユーザの行動に関係なく、サービス全体として人気のあるアイテムや新しいアイテムをレコメンドする方法です。こちらは、実装コストが低いわりに効果が高いです。普段使っているサービスのほとんどには、これらのレコメンドが組み込まれているのではないでしょうか。
ニュースサイトのようにアイテムの入れ替わりが激しい場合に有効的ですが、アイテムに流動性がない場合は、常に同じようなアイテムが人気度や新着に表示されるので、あまり効果的ではありません。

画像1

つぎに、パーソナライズの中でも実装コストが低い閲覧履歴をそのまま表示する機能を検討します。AmazonやYoutubeでも過去に閲覧したアイテムが提示されることがあるかと思います。こちらも実装コストが低いわりに効果が高いです。特に、動画や音楽サイトなど、一度閲覧したものを再度閲覧することが多いサイトで効果的です。

画像2

そして次は、Item to Itemのレコメンドになります。こちらは、アイテムのページの下に、このアイテムをチェックしている人はこちらのアイテムもチェックしていますというものです。サイト内でのユーザーの回遊を増加し、欲しいアイテムに出会いやすくなります。
各アイテム同士の類似度の計算には、アイテムの説明文やカテゴリ情報などのコンテンツ情報をもとに計算するコンテンツベースのものと、ユーザーの行動履歴をもとに一緒にチェックされやすいアイテムは似ているものとして計算する協調フィルタリングの方法があります。一般的に、コンテンツベースのものに比べて、協調フィルタリングのほうが、カテゴリやキーワードで表現しきれない、アイテムの雰囲気やコンセプトを捉えた類似度になることが多いです。

画像4

最後に、User to Itemのレコメンドになります。こちらは、ユーザーのプロフィールや行動履歴をもとにおすすめするものです。Item to Itemの技術を使って、レコメンドすることも多いです。例えば、ユーザーが最後に閲覧したアイテムに似ているアイテム群をメールで送信するなどです。行列分解などの手法を使うと、ユーザーが過去に複数閲覧していた情報を使って、その人に最適なアイテムをレコメンドすることも可能です。

画像4

いくつか代表的なレコメンドを説明しましたが、そもそもそのサービスにおいて、レコメンドが本当に必要なのかを検討することも重要です。例えば、アイテム数がそこまで多くない場合や、検索機能が充実している場合などは、レコメンドをわざわざ実装する必要がないこともあります。

レコメンドシステム開発に必要な3つのスキル

データサイエンティストには、「ビジネス力、データサイエンス力、データエンジニアリング力」の3つのスキルが必要だと言われていますが、レコメンドシステム開発にもこれらの3つのスキルが非常に重要で、どの1つも欠かすことができません。具体的にどのように3つのスキルが必要かを見ていきます。

ビジネス力

まずは、ビジネス観点で、レコメンドシステムを導入することで何を期待したいのかを定義することが大切です。場合によっては、レコメンドシステムがいらなかったり、人気度順のレコメンドだけで事足りたりします。具体的には、レコメンドシステムを導入することで、ユーザーのどの行動の変容を期待するのかといったKPIの策定が大切です。クリック率なのか、購入率なのか、回遊率なのか、Twitterへの投稿数なのか、どのユーザーの行動を最大化したいかによって、作成するレコメンドシステムも異なってきます。

例えば、YouTubeでは、ユーザーのトータル視聴時間をKPIとして、それが最大化するようにサービス設計がされています。視聴時間がKPIなので、ユーザーがちゃんとに長く最後まで視聴してくれる動画をレコメンドすることが重要になってきます。もし、KPIが視聴動画数でしたら、再生時間が短い動画をたくさんレコメンドするシステムの方が優れたものとして評価されることになります。(こちらの記事Measure What Mattersという書籍の中で経緯が説明されています。)

国内の事例としては、クックパッドさんやRettyさんのスライドがとてもわかりやすく、実際にレコメンドシステムをサービスに組み込むときの大変さが身にしみて伝わってきます。

データサイエンス力

明確になった解くべき課題を定式化していきます。例えば、ユーザーにどのアイテムをレコメンドするかの計算式を立てます。アイテムの在庫に限りがある場合や、古いアイテムが上位に出てくるようにしたい場合など、ビジネス的な制約を式に盛り込んでいきます。
よく使われる行列分解やFactorization Machine、Collaborative Metric Learningなどの研究は、こちらに詳しくまとまっています。最近では、強化学習を推薦システムに組み込む流れもあり、こちらのYouTubeの推薦アルゴリズムの変遷を追う〜深層学習から強化学習まで〜に詳しくまとまっています。

また、ユーザーの行動履歴を使って、計算する際には、そのデータのバイアスに注意を払う必要があります。例えば、Amazonの5つ星の評価のデータには、5つ星が多いというバイアスがあります。それは、商品に対して特別な思いがある人が評価をつけやすいという傾向があるためです。(記事)

他にも、検索エンジンの影響をうけるバイアスもあります。検索の上位に現れるものは、クリックされやすく、下位に来るものはクリックされづらいです。このデータをもとに、なんの処理もせずに行動履歴ベースのレコメンドシステムを作ると、検索エンジンの影響を受け、検索上位のものがよりレコメンドされやすくなったりします。

そのため、これらのバイアスを取り除いて、レコメンドシステムを作る必要があり、研究も盛んに行われています。こちらの「推薦/情報検索システムにおけるバイアス除去と不偏学習に関するサーベイのスライド」にとてもわかりやすくまとめられています。

データエンジニアリング力

1日1回メールでユーザーにおすすめの商品をレコメンドしたいという場合を考えると、全ユーザーに対するレコメンドリスト作成の演算が24時間以内に終了している必要があります。素晴らしいレコメンドモデルが定式化されても、計算に100時間かかるとしたら、実ビジネスで使うことはできません。
実ビジネスでよく利用されているバッチレコメンドとオンラインレコメンドの2種類に、どのようなエンジニアリング技術が必要かみていきたいと思います。

バッチレコメンド
バッチレコメンドは、前述のように、1日1回や1週間に1回など決まったタイミングでユーザーに対して、レコメンドリストを提供するものです。
レコメンドリスト作成に必要な処理としては、レコメンドモデルの学習、レコメンドモデルによる予測の2ステップがあります。

レコメンドモデルの学習は、毎回、学習し直したほうが、新規アイテムに対してもレコメンドが可能になるので良いのですが、学習に時間がかかる場合は、妥協して1週間に1度の学習にすることもあります。データ量が多くなく、シンプルなモデルならSQLのみでも可能ですし、行列分解などの手法を試したい場合はPythonのimplicitというライブラリでお手軽に試すことができます。データが大量にある場合は、SparkやBigQueryで計算することもあります。BigQueryでは、アソシエーション分析や最近では行列分解によるレコメンドも可能です。

レコメンドのモデルによる予測は、ユーザーが何人いるかによって計算の仕方は変わってきます。ユーザーが10万人いて、1人1人にレコメンドリストを作る場合、1人あたりのレコメンドリスト作成時間を1秒とすると、愚直にやろうとすると10万秒=27.8時間かかってしまいます。これを高速化するためには、並列処理をしたり、1人あたりのレコメンドリスト作成時間を減少させる必要があります。ベクトルの類似度を計算するようなレコメンドシステムでは、AnnoyやNmslib, Faissなどの近似最近傍探索で、正確性を一部犠牲にすることで時間を短縮することができます。近似最近傍探索に関してはこちらの資料に理論から実装まで詳しく解説されています。(最後のページのPythonおすすめANN手法選択フローチャートが、どのライブラリを使うかの参考になります。)

オンラインレコメンド
オンラインレコメンドでは、ユーザーの直近の行動履歴を即時に反映したレコメンドリストを作るものになります。ユーザーの行動履歴を即時に反映させるには、さまざまなエンジニアリングの技術が必要になってきます。

例えば、Instagramのオンラインレコメンドでは、ベクトルの類似度計算にFaissを使いアイテムをざっくり抽出し、そのあとに3段階のランキングを行い、最終的な推薦リストを作成しています。ランキング部分では、蒸留したモデル、軽いニューラルネットワーク、ディープラーニングを使って、500の候補があったときに、順にモデルを適用し、150,50,25と候補を絞っていきます。Instagramでは、IGQLというレコメンドに特化した独自のプラットフォームを作っています。

国内では、メルカリさんやZOZOさんの事例がGoogle Cloud Platform上でどういうアーキテクチャで近傍探索を実現しているかの参考になります。これらは画像を入力として類似アイテムを検索する画像検索ですが、ベクトルベースのオンラインレコメンドエンジンを作る際にも参考になります。

レコメンドについて必要な3つのスキルに説明してきました。これらの3つのスキルを兼ね備えた人はほぼいないので、それぞれのスキルを持った人々が密にコミュニケーションしながら、レコメンドシステムを作っていくことになると思います。実際にサービスに組み込む際には、ビジネスの仮説が急遽に変わったり、レコメンドモデルが思ったより精度が出なかったり、計算に3日かかったりと、思うようにいかないことが多々あると思いますが、3つのロールの方々が協力することで解決したり、一部妥協しながら着地点をみつけることで、80%の完成度でもリリースしてしまうことが重要だと思います。(オフラインでの精度検証がリリース後のオンラインでの成果と相関しないこともあり、実際に、リリースしてから、ユーザーのログを検証したほうが、改善プロセスが早く回ることがあります。)

レコメンドのトレンド

Beyond Accuracy」という予測精度を重視するのではなく、多様性や新規性、セレンディピティ、公平性などを考慮したレコメンドの研究も盛んです。フィルターバブルやエコーチェンバーといったレコメンデーションの負の側面についても議論されており、社会や個人にとって良いレコメンドとは何かという問いに、データサイエンティストや社会学者などが垣根を超えて、立ち向かっています。(記事
また、ユーザーにどのようにアイテムを提示するかのUX観点での研究も盛んです。レコメンドは最終的にユーザーに購入/視聴などの行動をしてもらうことが大切です。ナッジなどの行動経済学の知見を推薦システムに適用する研究もあります。

今後の記事について

レコメンドシステムの概要について説明してきました。しかし、具体的にレコメンドエンジンがどのようにサービスに組み込まれているか分からないと、想像がしづらいかと思います。

次回以降は、NetflixやAirbnb, Spotifyなどのサービスに使われているレコメンドシステムの事例を具体的にご紹介していけたらと思います。レコメンドシステムは、業界によって、特色があり、それについても説明していけたらと思います。

現在考えている次回以降の記事タイトルはこちらです。

・Netflixを題材に動画レコメンドの裏側について
  ・同じ映画でも、ユーザーごとに表示するサムネイル画像を変える
  ・多様性があるレコメンド
・Spotifyを題材に音楽レコメンドの裏側について
  ・ユーザーからのフィードバックを貰う仕組み
  ・ディープラーニングを使ったコールドスタート問題解決
・Pairsを題材に双方向レコメンドの裏側について
  ・双方向レコメンド
  ・全体最適 vs 個人最適
・Zalandoを題材に洋服レコメンドの裏側について
  ・画像の特徴量を使ったレコメンド
  ・洋服のコーディネートを考慮したレコメンド
・Airbnbを題材にリアルタイムレコメンドの裏側について
  ・Embeddingによる推薦
  ・ランキング学習について

レコメンドに関する参考文献

レコメンドの参考資料についてまとめました。(これも追加したほうが良いものがありましたら、お知らせください。)

神嶌先生のレコメンドについての解説資料スライド
推薦システムについて、とても詳しくまとまっています。スライドには、図や表も多く、分かりやすいので、レコメンドについて勉強をし始めたいかたにおすすめです。

私のブックマーク(情報推薦システム)
奥先生による推薦システムの研究についての学会や論文、書籍、データセットについてのリンク集です。こちらの講義スライドも分かりやすいです。

RecSys
推薦システムのトップカンファレンスです。毎年、GoogleやAmazon、Twitterなどの企業や大学で推薦システムについて研究/開発してる方々が集まっています。こちらから過去の学会発表の動画が見れます。ワークショップでは、旅行レコメンドやニュースレコメンドなどテーマごとに開催されているので、自社のサービスに関連するワークショップの資料は参考になります。

情報推薦システム入門 -理論と実践-
数式はそこまで多くなく、推薦システムの概要について説明した書籍です。2010年に発売された本なので、最近のレコメンド手法に関しては載っていませんが、「オンライン消費者の意思決定」という章で人の意思決定モデルについて経済学や社会心理学観点から説明しており、ビジネスに活用する際に参考になります。

推薦システム: 統計的機械学習の理論と実践
バンディットアルゴリズムや行列分解が詳しく数式で説明されています。実サービスに組み込むことを前提に書かれているので、サービス導入時の留意点や、オフラインでの評価の仕方についても書かれています。

Courseraのレコメンドシステムについての講義
協調フィルタリングやGroup lensプロジェクトで有名なミネソタ大学のJoseph A Konstanさんによる授業です。

Gunosyさんのレコメンド論文紹介スライド
最近のレコメンド論文についても紹介されていて勉強になります。

Wantedlyさんの推薦システムに関する勉強会資料
論文以外にもライブラリや記事などがまとまっていて勉強になります。

Netflixの技術ブログ
Netflixは、2006年に「Netflix Prize」という良い推薦システムを作ったチームに100万ドルの賞金を授与するというコンペティションを開催したりと昔から推薦システムに力を入れています。技術ブログには、レコメンド以外の記事も多いですが、Netflixの裏側のレコメンドについて説明した記事もあります。

Spotifyの技術ブログ
Spotifyも推薦システムに力を入れています。Spotifyは楽曲が自動で選曲されたりと、レコメンドがSpotifyのUXのコア部分になっています。

この記事が気に入ったらサポートをしてみませんか?