デーティングレコメンドシステム
レコメンドシステム
この記事は eureka Engineering Advent Calendar 2017 の20日目の記事です。
19日目高橋さんの「【オレが】GraphQLを用いたgo実装について解説するぜ【考える】」はでした。
はじめに
皆さん、初めまして。SREチームのサーバーサイド機械学習エンジニアJamesです。イギリス人ですが、もう4年日本に住んでます。今回は少しレコメンドシステムの話をします。
レコメンドシステム
検索システムはユーザーが指定する条件のベースでアイテムを表示するアルゴリズムです。条件によく合うアイテムを表示できれば、ユーザーは満足です。レコメンドシステムは似ている技術ですけど、ユーザーが指定せず、適切なものをおすすめるアルゴリズムです。レコメンドする目的はユーザーが検索しそうなものだけじゃなくて、セレンディピティも大事です。ユーザーが明確に自分が欲しいものをおすすめせずに、検索して見つける可能性が高いので、欲しいことが知らないものもおすすめするのが大事です。
コンテントベースフィルタリング
コンテントベースフィルタリングはユーザーの今までの挙動を使って何が欲しいか推測するフィルタリングです。Amazon.comのコンテントベースフィルタリングは特にわかりやすいです。Sci-fiの映画をAmazonで数回検索すれば、次トップページに閲覧すると別のSci-fiの映画におすすめられる確率が高いです。やすい家具を数回買えば、やすい家具をおすすめられると思います。
コンテントベースフィルタリングシステムの特に良いところは作りやすいです。ユーザーの今まで好きなものの共通点ベースで新しいアイテムをおすすめるコードは誰でも書けるはずです。新しいアイテムが追加されたら、プロパティ次第すぐユーザーにおすすめられます。あとは、結果はユーザーに説明しやすいです。「このアイテムが好きだったのでこのアイテムはどうですか?」は誰でもわかると思います。
コンテントベースのシステムの問題はほとんどのレコメンドシステムが苦しむ「User Cold Start Problem」です。ユーザーは履歴がなければおすすめできないです。それに、ユーザーにおすすめるアイテムは今までのアイテムに似ているので、ユーザーはもう今までの検索で見た確率が割と高いです。コンテントベースシステムでセレンディプティが普通にあまりないです。
協調フィルタリング
この頃、コンテントベースフィルタリングより協調フィルタリングが普通です。協調フィルタリングはいろんなユーザーの好みを比べておすすめするシステムです。例えば、ユーザーAはアイテムXとYとZが好きで、ユーザーBはアイテムXとYが好きならユーザーBは多分ユーザーAに似ているので、アイテムZは良いおすすめになります。
ユーザーとアイテムは何億あれば問題はもうちょっと難しくなります。ユーザー・アイテムマトリックスを作成すれば、ユーザーが見たことないアイテムが好きかどうかを推測する方法が色々研究されています。特に、2009年、Netflixのレコメンドシステムを10%改善できるチームは100万ドルもらえる「Netflix Prize」が発表された後で、協調フィルタリングのテックニークが色々研究されました。この頃、線形代数からのSingular Value Decompositionのもとで作られたLatent Factor ModelsとディープラーニングからきたRestricted Boltzmann Machinesの結果は高く評価されてます。
履歴が長いユーザーを履歴が長いアイテムをおすすめるため、協調フィルタリングはすごく良い結果が出せますから、この頃他のシステムより人気になってます。ただ、協調フィルタリングはCold Start Problemが特に難しいです。新しくユーザーは履歴がないので、プロフィールなど書いてもおすすめできないです。新しいユーザーにうまくおすすめできなければ、ユーザーがやめる可能性が高くなるので特に大事なところです。
Netflix、Amazonなどが使ってるアルゴリズムは公開されてないんですが、ハイブリッドシステムを使っている可能性が高いです。新ユーザーは自分のプロフィールと他の情報のベースでコンテンツベースレコメンドシステムにおすすめされます。履歴が増えながら、協調フィルタリングの方が使われます。
デーティングのレコメンド
オンラインデーティングのためにレコメンドシステムをデザインするのは特に難しい問題になります。普通のレコメンドシステムはアイテムをユーザーにレコメンドします。1ユーザー次第でレコエンドが成功します。デーティングはかわりに2人(ユーザーとおすすめされる人)が満足しないとダメです。ユーザーに好きそうな人をおすすめしても、おすすめされる人はユーザーが好きじゃなければ、ユーザーは悲しくなってサービスを使わなくなる可能性があります。
今までの相互レコメンドシステムはだいたい共通点ベースで作られます。共通点がある人はお互いに話しやすいのは間違ってないので、出るレコメンドの質は悪くないと思います。ただ、この作戦は短所もいっぱいあります:
- 自分に似てない人を探しているユーザーのレコメンドは悪くなります。(英語で「Opposites Attract」という決まり文句があります:お互いに似てない人はよく付き合うという意味です)
- セレンディピティーがないです。ユーザーはデーティングサイトをジョインしたら、普通に自分と同じ趣味・興味がある人を探します。レコメンドはユーザーが検索エンジンでも見つけれます。
- デーティングサイトだと性格より写真のほうが大事です。共通点ベースは写真が使えないです。
結局共通点ベースでレコメンドするのはコンテントベースフィルタリングです。普通のアイテムレコメンドだと協調フィルタリングはコンテントベースフィルタリングより結果が出ます。ただ、相互協調フィルタリングはまだあまり研究されてないです。
結論
ユーザーアイテムレコメンドシステムは2カテゴリーに分けてます:コンテントベースレコメンドと協調フィルタリングです。大きいサイト(Amazon, Netflixなど)は普通にハイブリッドシステムを使ってます:Cold Start Problemを超えるためにコンテントベース、ユーザーが履歴を貯めたあとで協調フィルタリングはメインです。一般的に履歴があるユーザーなら協調フィルタリングの方が結果が出ます。
デーティングはユーザーアイテムじゃなくて、ユーザーユーザーなので複雑度は結構あがります。今まで研究ペーパーに出る相互レコメンドシステムはほとんどコンテントベースなので、短所が色々あります。ユーザー・ユーザー協調フィルタリングを作って、Pairsのレコメンドアルゴリズムを世界中最高のデーティングレコメンドシステムにしたいと思います!