TikTokのレコメンドエンジン
😃 TikTokのレコメンドってどうなってるの?
😃 しばらく触ってないけど、自分の好みとのマッチ度が高いし、フィードをたどってる間にも自分の好みに合わせて出てくる動画が変わってた記憶
🐹 TikTokはね!ベクトル検索の進化版って感じ
しくみ
🐹 TikTokのレコメンドの仕組みをさらっとまとめると:
① データ収集
🐹 まず、ユーザーの行動履歴をこれでもかというくらい調べる
- どの動画をどれくらい視聴したか(最後まで見た?途中で離脱?)
- いいね ❤️、コメント 💬、シェア 🔄
- スクロール速度(パッと飛ばした動画は「興味ない」と判断されやすい)
- 検索ワード 🔍
- フォローしてるクリエイターや、使ってる音楽
② 特徴量化
🐹 AIに学習させやすいように、動画やユーザーを「特徴ベクトル」に変換するんだ
- 動画の特徴 → タグ、音楽、字幕、ジャンル、映像解析(何が映ってるか👀)
- ユーザーの特徴 → 興味分野(猫🐈好きか、ダンス💃好きか…)
③ モデルによる推薦
🐹 ここで登場するのが推薦アルゴリズムで、コンテンツのベクトルとユーザーのベクトルを比較して、ユーザーの好みにマッチする動画を推薦する
TikTokは特に「視聴維持率(どれくらい長く見たか)」を最重要指標にしてるって言われてる。最後まで見た動画は「超好き」と判断されやすいんだよね。
④ リアルタイム改善
🐹 ユーザーが数本の動画を見ただけで、その場でレコメンドが調整される。だから初めて使った人でも「なんでこんなに好みわかってるの?!」ってなるの。
コンテンツベクトルの作り方
😃 ほうほう
😃 基本はベクトルで類似度を測ってるんだね
😃 コンテンツのベクトルってどう作るの?
🐹 メタデータ(テキスト)は普通のテキスト用のエンコーダー、音声はOpenAIのWhisper、動画はCLIPとか、それぞれツール使えばベクトル化できるよ
🙄 CLIPって聞いたことあるな。動画をベクトル化できるんだ
🐹 厳密には画像とテキストを同じベクトル空間で表現できるツールなんだ。動画の場合は何箇所かハイライト画像を切り取ってそれをエンベッドすることが多い
🤔 各動画でメタデータ、音声、動画それぞれのベクトルをとって、「メタデータと音声が近いから近い」みたいに判定するの?
🐹 いんや、全部統合して複合ベクトルっていうものを作ることが多いよ
😃 ベクトルだとそんなこともできるんだ
🐹 うん、[メタデータベクトル,音声ベクトル, 動画ベクトル]てな感じで全部単純にくっつけて超でっかい次郎系ベクトル🍜にすることもできるし、
🐹 「メタデータ0.2」「音声0.3」「動画0.5」みたいに重みをつけて加重平均をとる方法もあるし、
🐹 機械学習で勝手に重みをつけるニューラル統合っていう方法もある
ユーザーの好みにマッチングする方法
😃 コンテンツの特徴を正しくベクトル化できたら、ユーザーの嗜好に合わせてその中から最適なものを選べばいいわけだよね
😃 ユーザーの嗜好もベクトルなの?
🐹 そうだよ!
🐹 いろいろ方法はあるけど、一つ目はユーザー自体をユーザーが過去に見た動画の集合体としてベクトル化する方法
😃 過去に見た動画のベクトルの平均を取るみたいなこと?
🐹 うん、それは平均プーリングって言われる方法だけど、
🐹 「最後まで見たか」「いいねしたか」で重みづけしたり、履歴の新しさで重みづけしたりもできる
🐹 あとは、ユーザーをコンテンツのベクトルで表現するんじゃなくて、別のベクトル空間に埋めこんでからユーザーベクトルとコンテンツベクトルの内積をとるっていう方法もある
🐹 これはTwo-Towerっていう方法で、YoutubeやAmazonも使ってる
😃 その場合はユーザーのベクトルはコンテンツには存在しないものも使えるんだよね
🐹 そう!
🐹 属性系: 性別・年齢層・言語・国・デバイス種別
🐹 行動系: 最近の視聴履歴、いいね履歴、視聴時間の傾向
🐹 文脈系: 時間帯(朝/夜)、曜日、接続場所
🐹 これ全部ユーザーのベクトルに入れられる
😃 それはめっちゃ便利そう
Two-Towerの正体
🥸 ねぇ聞くけど、Two-Towerだとユーザーとコンテンツそれぞれエンコーダーがあるんだよね
🐹 そう、ユーザーはユーザー情報を128次元ベクトルに変換して、
🐹 コンテンツはコンテンツ情報を128次元ベクトルに変換する
😃 最終的にはその128次元空間で比較するんだね
🐹 そうだよ
🤔 でも、単純に128次元にしただけだと、ユーザーTowerとコンテンツTowerでベクトルが似てるからといってマッチ度が高いってことにはならないよね
🤔 どうやったらマッチ度が高いときだけ似たベクトルを出すようになるの?
🐹 それはね!学習させるんだ
🤔 学習??
🤔 ユーザーとコンテンツのエンコーダーをってこと?
🐹 そう!
🐹 まず正例(ユーザーと、そのユーザーが好きっぽいコンテンツ)と負例(ユーザーと、そのユーザーが興味ないっぽいコンテンツ)をたくさん用意する
🐹 それを損失関数に食わせて、損失値を出す
🐹 損失値を使って、逆伝播(backpropagation)を走らせると、モデルのパラメーターが更新される
🐹 その結果、次の学習ステップで出てくるユーザーとコンテンツのベクトルがちょっと変わる
🐹 学習を繰り返すうちに、「正例は近い/負例は遠い」ようにベクトル配置が整っていく
依存性MAXの秘訣
🙄 損失...? 逆電波...?
🙄 なんかよくわかんないけど、エンコーダー自体のパラメーターを最適化するってことね
🤔 でも、学習が必要ってことはそんなに頻繁に更新できないよね
🤔 アップデートのタイミングとかで更新される感じ?
🐹 そうだね、TikTokとかは逐次学習してるみたい?だけどそれはコストがかかるから
🐹 小規模サービスは一日数回とか、数日に一回とか、学習データを溜めておいて、バッチで回す感じ
😃 でも、そのモデルさえあれば、ユーザーがアクセスしてきたときに、瞬時におすすめが出せるんだね
🐹 そう!ユーザーTowerとコンテンツTowerのパラメーターは固定されてるから、新しいコンテンツやユーザーのベクトルは数ミリ秒で計算できる
😃 そんなに早いんだ
😃 じゃぁTikTokはさぁ、ユーザーが一本動画を見るだけでもユーザーベクトルを更新してる可能性ある?
🐹 あるある!Tower自体は変わらないけど、既存のユーザーベクトルに、コンテンツのベクトルを重ね合わせて暫定的なユーザーベクトルを作ってる可能性はある
🐹 それならリアルタイムでできるからね
😃 だから動画を数本見ただけでユーザーに追随してくる感じがするのかな
🐹 そうだね、数本見るだけでドンピシャの動画が出てくるから、依存性MAXってわけ