Tensorflowでレコメンデーションシステム

はじめに

今回はTensorflowを使って、シンプルなレコメンデーションシステムの構築を行ってみる。
レコメンデーションのアルゴリズムはいくつか存在するが、今回使うのは「協調フィルタリング(Collaborative Filtering)」と呼ばれるもの。

全体像

お薦めレストランを紹介するサービスがあったとする。ユーザは、利用したレストランに対して1〜5の評価をつけることができる。
このサービスでは、ユーザが過去につけた評価から、他のお薦めレストランを紹介する機能を作りたいと考えている。
まずは話を理解しやすくするために、以下のような少ないデータで考えてみる。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-22-13-07-20

ここで、佐藤さんにはレストランBを紹介すべきなのか、それともレストランDを紹介すべきなのか。また、伊藤さんにはレストランAを紹介すべきなのか、それともレストランBを紹介すべきなのか。この部分を機械学習を使って解いてみたいと思う。

解きたい問題

上記表に対して、レストランの特徴を加えてみる。
ここでもわかりやすくする為に、あえてシンプルな特徴にしている。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-22-13-55-04

各レストランは、「オシャレ度」と「味」でその特徴を表せ、
・ レストランAはオシャレで味もよい
・ レストランB、Cは、オシャレだが味がいまいち
・ レストランD、Eは、オシャレではないが味はよい
と言うことができそうだ。
上の表をじっくり見てみると、佐藤さんは「味」よりも「オシャレ度」を気にしているように見える。その為、レストランBを紹介するのが妥当だろう。
また、伊藤さんは「オシャレ度」よりも「味」を気にして、レストランを選んでいるように見える為、レストランAを紹介するべきだろう。
つまりユーザ毎に、「オシャレ度」と「味」をそれぞれどれくらい気にしてレストランを選ぶのかがわかれば、この問題は解けるだろう。
これがユーザの特徴となる。

さて、実際にはここでひとつ大きな問題がある。
レストランを表す特徴は「オシャレ度」と「味」だけでいいのだろうか、それ以外で我々が気づいていないような特徴はないのだろうか?
またレストランが追加される度にそれぞれの点数をマニュアルでアップデートしていかないといけないのだろうか、それは主観的な点数になってしまわないだろうか?
この問題について解決する為には、レストランの特徴自体も機械学習で学習させる必要があるだろう。

つまり、今回機械学習で学ぶ必要があるのは、
・ユーザの特徴量(嗜好性)
・レストランの特徴量
の2つとなる。

Tensorflowでの実装

今回は、データが非常に少ないが、上記のデータで実装してみる。
まずは定数定義。

Tensorflowの変数定義。
レストラン、ユーザと2つの特徴量を定義していることに注意。

コスト関数の定義。
基本的には、「(レストランの特徴量 * ユーザの特徴量) – 実際のレストラン評価マトリクス」がコスト関数となるが、まだ未評価のレストランについてはコストに含めない為、「R」を計算結果行列の各エレメントにかけている。
正則化はレストランの特徴量、ユーザの特徴量の両方に対して行う。

最適化は、Tensorflowの勾配降下法のオプティマイザーで行う。

トレーニングと結果の表示

実行結果

最終的な結果としては、以下の表の通りとなった。
この結果をもとに佐藤さんにはレストランB、伊藤さんにはレストランAをお薦めとして表示してあげるようなアプリを作ればレコメンデーションシステムのできあがりである。

実際に大規模なレコメンデーションシステムを作る為には、まだまだ考慮しなければいけないことは多い。例えば、膨大な商品数とユーザ数を扱わなければいけないが、更新頻度をどうするかなど検討しなければいけない。

とはいえ、まずはレコメンデーションシステムの仕組みのイメージをつかめてもらえれば幸いである。