nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | 【サポーターズ勉強会】はじめての情報推薦 /「あなたにオススメ」の仕組みを理解しよう #spzcolab

はじめに

いつも心は虹色に! nikkieです。
8/10にレコメンドの勉強会に行ってきました。
レコメンドは今年はじめに前職の案件で独学で取り組みました。
もっとうまくやれたんじゃないかという思いがあるので、
レコメンド関連の勉強会で情報収集するようにしています。

勉強会の概要

【サポーターズ勉強会】はじめての情報推薦 /「あなたにオススメ」の仕組みを理解しよう - サポーターズCoLab

今や様々なサービス内で当たり前のように見られる
「おすすめ商品」や「おすすめユーザー」といった記述
この「おすすめ」のシステムを実現している情報推薦について
その概要についてお話しさせていただきます!

走り書きした勉強会メモ(scrapbox)はこちらです。
https://bit.ly/2MkDC4H
以下では、勉強会メモを抜粋し、自分の知識と合わせてまとめてみます。

情報推薦とは

経験からわからないものの中から選択しないといけないことがある。
例えば、彼女が映画を見たいと言ってきた(彼女は恋愛映画が好き)
選ばないといけないが知識がない。そんなときが推薦システムの出番

例: Amazon1

  • 特定ユーザの嗜好・好み
  • 商品に似ているもの・関連しているもの
  • レビュー文も推薦
  • 一般的に買われている商品や新着商品も推薦

推薦手法の分類・比較

今回焦点を当てる以下の2つ以外に
ポピュラリティ(人気順)やハイブリッドがある。

内容(コンテンツ)ベースフィルタリング

ユーザのプロファイルとアイテムの特徴を掛け合わせて推薦する

ユーザプロファイルの取得

  • 明示的獲得:ユーザに選択してもらう
    • 本を5段階評価2 例えば、SFばかり高評価のユーザ
  • 暗黙的獲得:ユーザに見えないところで取得されている
    • 買った、見た、お気に入り登録した 例えば、SFばかり買っていたらSFが好きとみなす

アイテムの特徴の取得

  • 本などの製品はジャンル、値段、発売年など
  • 音楽は音声解析3
  • 画像も解析した情報を使う

協調フィルタリング

他のユーザの行動履歴を利用して、好みが似ているユーザが選んだもの・好むものを推薦
本の内容はどうでもいい

「嗜好が似ている」=「似ている行動をとっている」
(本の購買行動が似ている=買った/買っていないが近い)

内容ベースと協調フィルタリングの比較

  • 協調フィルタリングが優れる
    • 多様性・セレンディピティ 「自分が知らないものを他の人が知っている」
    • ドメイン知識 アイテムの特徴のデータを持っていなくても推薦できる
  • 内容ベースフィルタリングが優れる
    • コールドスタート問題 新規ユーザのプロファイルから推薦できる
    • システムの利用者数 少人数でもOK
    • 被覆率(=推薦候補/全アイテム) 検索4できるので全アイテムが候補
    • 類似アイテム 色違い区別できる

協調フィルタリングの仕組み

メモリベース法(蓄積したデータを推薦に直接用いる)

  • 利用者間型:ユーザ間の類似度を使う
  • アイテム間型:アイテム同士の類似度5を使う

※事前に調べておいたデータの規則性を使う「モデルベース法」もある

利用者間型メモリベース協調フィルタリング

  1. 評価済みアイテムへの評価付け傾向が似ているユーザを見つける
    • ユーザ-アイテム評価値行列(列がアイテム、行がユーザ、値が評価値)
    • ピアソンの相関係数 甘口の評価者も入れば辛口の評価者がいることも考慮(各自の平均の評価を加味している)6
  2. 似ているユーザから評価値を予測
    • 各ユーザの評価値をそのまま使うのではなく、各ユーザの評価値の平均からどれだけ離れているかという値を使う
  3. 高い評価値であれば推薦する(低ければ推薦しない)

アイテム間型メモリベース協調フィルタリング

実際のサービスはアイテム数よりユーザ数が多い。
計算量を減らすため、現実にはアイテム間型が採用される。
似ているアイテムを予め計算する。

ユーザ-アイテム評価値行列を行で見るのがユーザ間型、アイテム間型は列で見る。
-> 評価値行列の転置を取って利用者間型と同様に扱うイメージ

感想

情報推薦の説明、簡潔で非常にわかりやすかったです。
独学の中で複雑に捉えすぎていた部分をシンプルに捉えなおす機会になりました!
今回の理解をもとに手を動かすなら夏山合宿で見つけたこのあたりかなと思います。
PySparkで協調フィルタリング

独学では協調フィルタリングを手を動かして理解しようとしました。
2018/03/10 Pythonもくもく自習室 #8 @ Rettyオフィス 成果発表:ユーザベースの協調フィルタリングの例を実装 · GitHub
Kamishima先生の資料が参考になりました。(今回の勉強会と重なる部分が多いという印象です)
GitHub - tkamishima/recsysdoc: Algorithms of Recommender Systems : A survey paper of recommender systems (written in Japanese)

また、参加者の方からもいろいろ教えていただきました。

  • RailsはTutorial(Twitterクローン)と並行して、GitLab(RailsOSS)のソースコードで実際の例を見るとよさそう
    • Rails Tutorialのロックインされる懸念を感じています。Twitterクローンが完璧に作れることよりもRailsを使える(使いこなせる)状態を私は目指しています
  • VueのNuxtはReactのNextに対応。(NextにインスパイアされてNuxtが出てきた)

レコメンドのわかりやすい講義が聞けただけでなく、他のエンジニアの方から刺激もいただきました。
皆さん、どうもありがとうございました!


  1. Amazonがあらゆるレコメンドを駆使しているという話は、『仕事ではじめる機械学習』の7章で読んだ記憶があります。

  2. 食べログは明示的獲得に該当しますね。

  3. Spotifyのレコメンドで使っていると読んだ記憶があります。Spotifyって機械学習をどう活用してるの?⇒元社員がQuoraで回答 | AI4U

  4. 検索も内容ベースフィルタリングというのは驚きでした。ほしいクエリと一致するものを表示するととらえられるそうです。

  5. これがアイテムの特徴による類似度ではなく、購買履歴から判定される類似度ということがポイントだと思います。

  6. 『情報推薦システム入門』 2章で読んだ記憶があります。