検索もしていないのに、当ててくる
YouTubeを開いたら、おすすめ欄に「あ、これ見たかったやつだ」が並んでいて、なんで分かるの?と思ったことないですか?
検索していないし、そのジャンルが好きだとどこかに打ち込んだ覚えもない。なのに、なぜか先回りで当ててくる。しかも一つや二つではなく、画面いっぱいに。
「履歴を見てるから」の、その先
「そりゃ視聴履歴を見てるからでしょ」と言われれば、まあそのとおりなわけですが、話はそこで終わりません。実際にYouTubeが手がかりにしているのは、見た・見ないだけではありません。どれだけの時間再生したか、サムネイルをクリックしたか、検索やチャンネル登録、高評価やアンケートへの回答まで、多様な行動と満足度のシグナルを組み合わせています。
だって自分は「自分がどんなジャンルが好きか」を、一度もアプリに入力していない。履歴に残るのは「この動画は最後まで見た」「これは途中でやめた」という、○×に近い記録だけです。好みのラベルは一枚も渡していない。
この「○×に近い記録」は、話を分かりやすくするために単純化した見方です。現実の記録はもっと豊かで、再生時間やクリック、後で見る、といった度合いのある反応が混ざっています。だから「見ていない動画」も、単純に「嫌い」という負の答えとは限りません。まだ出会っていないだけ、というマスも大量に含まれます。ここでは仕組みの芯をつかむために、あえて○×の表として眺めてみます。
好みを一つも教えていないのに、どうして「たぶんこれが好き」を先回りできるのか。ここに、ちょっとした不思議があります。
好みは、入力されていない
ここで一つの見方を試してみます。全ユーザーの視聴記録を、一枚の巨大な表だと思ってみる。縦にユーザー、横に動画を並べて、見たマスに印を付けた表です。動画は何百万本もあって、ほとんどのマスは空(まだ見ていない)。
この空いたマスを埋めるのが「おすすめ」だ、で終わらせると面白くありません。本当に面白いのは埋め方のほうです。誰も「好みの種類」を書き込んでいないのに、この表を眺めるだけで「隠れた好みの軸」が自動で浮かび上がってくる、という見方で解釈できるか、やってみましょう。
筋道はこうです。似た動画を見ている人どうしは、表の行(その人の○×の並び)が似てきます。この「似た並び」をたくさん集めると、後から数個の軸だけを取り出せる。誰も名前を付けていないのに、表の形そのものから軸が立ち上がる、という読み方です。
その軸に「アウトドア寄り 対 インドア寄り」「じっくり派 対 短尺派」といった名前を当てたくなりますが、これはあくまで説明のためのイメージです。実際に取り出される軸は複数の特徴が混ざり合っていて、人間がきれいな一語で名付けられるとは限りません。ここでは分かりやすさのために、仮の名前を付けて眺めているだけ、と思ってください。
同じ話が、色々な「おすすめ」で効く
この見方が効くのはYouTubeだけではありません。
Netflixが次に見る映画を出してくるのも、Amazonが「この商品を買った人はこちらも」と並べるのも、音楽アプリが知らない曲を差し込んでくるのも、根っこは似ています。「みんなの選択の表」から少数の好みの軸を取り出して、その軸の上で近い人・近いモノを探す、という同じ動きです。
この「表からこっそり軸を取り出す」発想は、AIが言葉の意味を扱うときにもそっくり顔を出します。
表を、二枚の細長い表のかけ算に分けてみる
では、この「軸を取り出す」を式で見てみます。記号が出てきますが、そのつど日常語に置き換えていくので大丈夫です。
巨大な視聴表を $R$ と呼びます。$R$ は縦がユーザー、横が動画。これを、
$$R \approx U V^\top$$
という形に「分ける」ことを考えます。$\approx$ は「だいたい等しい」という記号です。右側の二つを、こう読みます。
- $U$ は「ユーザー × 好みの軸」の細長い表。各ユーザーが、さっきの隠れた軸(じっくり派、アウトドア寄り…)の上でどこにいるか、という座標です。
- $V$ は「動画 × 好みの軸」の細長い表。各動画が、同じ軸の上でどこにいるか、という座標です($V^\top$ は $V$ を縦横ひっくり返したもの、くらいの意味です)。
分厚い表 $R$ を、二枚の細長い表のかけ算で近づける。この操作を行列分解と呼びます。
ひとつ補っておくと、この行列分解はYouTubeの中身そのものではありません。おすすめの仕組みを理解するための模型です。YouTubeが公表しているおすすめの作りは、まず候補を絞る段と、その候補を細かく並べ替える段に分かれた、深層学習ベースの多段システムだとされています。ここでの行列分解は、推薦システムに共通する「記録から特徴を取り出し、その特徴を使って候補との相性を測る」という発想を、見通しよく取り出した模型だと思ってください。

ここで効いてくるのが、軸の数です。何個にするかはモデルによって異なりますが、動画の数(何百万)よりはるかに少ない次元に圧縮します。つまり「自分の好み」は、元の何百万次元よりずっと少ない、ひと並びの数字に押し込められている、ということになります。
一つの対象が数十個の座標の並びで表される、という考え方は、AIが単語を扱うときにも同じように現れます。
そして、まだ見ていない動画をおすすめするかどうかは、
$$\hat{r}_{ui} = p_u \cdot q_i$$
で決めます。$p_u$ は自分の座標(軸の上の位置)、$q_i$ は動画の座標。この二つの $\cdot$、つまり内積は、二つのベクトルの「向きの近さ」と「それぞれの大きさ」の両方を反映した相性スコアです。向きがそろっているほど、そして各ベクトルが大きいほど、値は大きくなります。自分のベクトルと同じ方向に強く伸びている動画ほどこの値が大きくなり、反対方向ならベクトルが大きくても値は上がりません。だから「見たかったやつ」が上に来ます。なお、向きの近さだけを取り出したいときは各ベクトルの長さを1にそろえて比べます。この正規化をしない限り、内積そのものはコサイン類似度とは違う量である点に注意してください。

自分の好みは、誰が書き出したのか
そう考えると、少し不思議な気持ちになりませんか。
自分の好みは自分だけのもの、と思っていた。でも実際には、それは「みんなの視聴表」を分解して出てきた数十個の座標として書き出されていて、しかもその軸は自分ではなく、表の形が勝手に決めたものだったりします。
自分では言葉にできていなかった「なんとなくの好み」が、数字の座標としてはとっくに書き出されているのかもしれません。次におすすめがピタリと当たったとき、それは自分のどの軸を言い当てたんだろう、と覗いてみたくなりませんか?
あわせて読みたい関連記事。



