糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

The YouTube video recommendation system (Recsys 2010) 読んだメモ

The YouTube video recommendation system

概要

youtubeにおける動画推薦の話.
アルゴリズムを一言で表現すると,協調フィルタリングではなく,動画をノード,類似度をエッジに持つ重み付き無向有向グラフにおける幅優先探索みたいな感じ.

関連論文

読んでないけど
Video suggestion and discovery for youtube

目的

ユーザにビデオを推薦する.

課題

  • 動画にメタデータが無かったり,あっても少ない
    • 動画コーパスはアクティブユーザ数と同じぐらいの桁しかない(動画本数に比べて桁違いに少ないと言いたいのでは)
  • 大抵の動画は10分以下と短く,そのためユーザの行動も短くノイジー
    • 購入(Amazon)やレンタル(Netflix)ははっきりした行動でいいですね
  • 動画の「寿命」が短い
    • 流行に敏感な推薦が必要

システム

  • 動画の新しさなどを考慮し
  • ユーザの行動に対する関連性と多様性を考慮し
  • 「何故その動画が推薦されたか?」を提示

できるようなシステムが目標.

使用する変数

二種類考えられる.

  • content data : タイトルや説明などのメタデータも含めた動画データ
  • user activity : explicitとimplicitに分かれる
    • explicit : 動画を評価したり,お気に入りに入れたり,動画の投稿者を購読(お気に入り登録みたいなもの?)したりなどの行動
    • implicit : 動画を見たり,一時停止したりなどの行動

これらの変数もかなりノイジー.例えば動画視聴だったら,全て見たからと言ってその動画を気に入ってるとは必ずしも言えないし,そもそもシステム側でユーザの動画視聴を検知する前にブラウザが閉じられてしまうこともある.

アルゴリズム

Related Videos

動画について関連するrelated videos集合をまずは考えることにする.これは全ユーザ共通で使う.
全ユーザの行動を一定時間で区切り(ex.24h),その区切り(session)の中で同時に見られた動画を数え上げる.動画について,を同時に見られた回数だとすると

とする.は正規化のために必要で,普通だと動画に対して観られた回数とするととするが,に関する全てでが共通して出てきて面倒なのでとしてしまう.
で,あとはについてが大きい上位N件をとするけれども,一部の動画は再生数が少なすぎるのでここでrの最小値に閾値を設定して足切りする.
実際はこれはもっと面倒で,ノイジーだったりpresentation biasがあったり(説明が無いので勝手に想像すると,既に動いてる推薦システムによって推薦される動画は再生されやすいのでその影響を除きたい,という事ではないだろうか),更に使えるデータ(動画の再生時間やタイムスタンプ,メタデータ)も考慮しているとか.

Generationg Recommendation Candidates

次はユーザの行動を考慮して推薦をする.
ユーザが見たり,"liked"を押したり,プレイリストに追加した動画の集合をseed set とする(明記はされていないがこれも一定時間で区切っているのだろう).
このseed setの各動画について関連動画集合とする(グラフで例えるとseed setにおける各隣接要素).普通ならこのだけでも十分なんだけど,これだと多様性に欠けてしまい,seed setにほとんど似た動画しか得られない.ユーザの興味には沿ってるが,ユーザが新しい動画を見つけるのには失敗してしまう.
なのでとして,とする(グラフで例えるとseed setから深さNまでの幅優先探索).Nはそんなに大きくしなくても十分な量,多様性を持つ動画集合が得られる.ここでどの動画がどのseed setから得られたかを忘れずに保持しておく.

Ranking

が得られたらそれらをランキングしていく.三種類(video quality,user specificity,diversification)の観点から考慮し,ランキングの時点でまず二つを使う.

  • video quality : 再生数,レーティング,コメント,likeやshareの数,アップロード日時
  • user specificity : ユーザ固有の興味にマッチしているかをseed videoの再生数や再生時間などを使って計算

これらを線形で組み合わせてにランク付けができる.ここから少数の動画のみをユーザに提示するわけだが,ここでは単純に上位から非表示するのではなく,ここで関連性と多様性(diversification)のバランスを取る.ユーザは本来なら様々な興味を持っているなので,ここであまりに似すぎている動画を取り除く.簡単な方法ではひとつのseed videoに関連する動画の数を制限する,同じチャンネル(投稿者)の動画の数を制限するなどである.もっと凝った方法では(明記していないが)トピックごとの動画クラスタリング,内容の分析などを使っている.

interface

一番重要.推薦時にseed videoへのリンクを貼ることによってユーザに納得してもらう.また,を大量に計算して表示時に絞るという方式を取っているので推薦リストの表示件数を変えてもすぐ反映できる.

実装

ガッツリ計算したいので,オンラインで計算せずにバッチ処理してる.視聴と推薦への反映に対するタイムラグには,一日に数回計算しなおす事で対応してる.
システムとしては

  1. データ収集
  2. 推薦候補生成
  3. 推薦

の三種類に分かれている.Bigtable+MapReduce使いまくり.3つ目で得られるデータは比較的サイズが小さい(Gbyteオーダ)のでread-only Bigtalbleに突っ込んである.推薦のリクエストに対するボトルネックはネットワークの転送部分.

評価

A/B testやった(これができるのがシステム提供者の強みだろう).
21日間計測したらベースラインと比較してクリック率(CTR)が207%向上した.

どんなfeature使ってるかとかはさすがに教えてくれないんですね.