メインコンテンツへスキップ
  1. 記事一覧/

フィードが古い投稿を埋もれさせる仕組み

· loading · loading ·
仁才徳
著者
仁才徳
韓国ソウル在住のリーダー兼ソフトウェアエンジニア

コンテンツプラットフォームで働いているので、ユーザーの目には決して見えない、ある問いについて人より長く考えています。「フィードはいつ、そのコンテンツを表示するのをやめるべきか?」という問いです。

コンテンツは古くなります。アプリを開く人は新しい情報を求めていて、フィードはそれに応えなければなりません。とはいえ、先月の素晴らしい投稿が「もう新しくない」というだけで消えるのもおかしい。このトレードオフをモデル化する定番の手法が減衰関数で、名前から想像するよりずっとシンプルです。

鮮度は大事、ただしどこでも同じではない
#

ニュースサイトやSNSのフィードを開くとき、たいてい求めているのは最新の情報です。ニュースや金融市場のような動きの速い領域では、先週のコンテンツはただの重りなので、ランキングは新しさに大きく寄ります。

ただ、どの領域もそうだとは限りません。学術論文や長編ジャーナリズムの価値は時間が経っても変わらず、むしろ上がることさえあります。コンテンツの古さはほとんどのランキングシステムで意味を持ちますが、どれだけの重みを与えるべきかは、何をランク付けしているか次第です。

指数減衰でフェードをモデル化する
#

関連性が薄れていく様子をモデル化する定番は指数減衰です。古くなるほど、体感的な価値は加速度的に落ちていきます。いちばん単純な形はこうです。

relevance = e^(-decay_rate × age)

relevance はそのコンテンツの現在の価値、decay_rate(減衰率)は価値を失うスピード、age は通常、公開からの日数です。

このモデルの良いところは、つまみが1つしかないことです。減衰率を調整するだけで、コンテンツの旬を数時間にするか、数日にするか、数週間にするかを決められます。設定項目はそれで全部です。

エンゲージメントが良いコンテンツを生かし続ける
#

古さは話の半分でしかありません。閲覧数、いいね、コメントは「実際に人が関心を持っているか」を教えてくれる指標で、これを無視したランキングは、良い投稿も悪い投稿もまとめて埋めてしまいます。解決策は単純で、両者を掛け合わせるだけです。

score = engagement × e^(-decay_rate × age)

こうすると、エンゲージメントの強い古い投稿は、平凡な新着投稿より上位に残れます。ただし減衰項が縮んでいくぶん、順位を維持するにはより多くのエンゲージメントが必要になっていきます。

実際のライフサイクルはこんな流れです。新しい投稿は鮮度ブーストをもらい、見てもらうチャンスを得る。閲覧され、いいねされ、コメントが付けばスコアは伸びる。日が経つと減衰がスコアを削っていき、エンゲージメントが続いている投稿だけが上位に残る。新しいコンテンツにはチャンスが与えられ、本当に良いコンテンツは居場所を自力で守る、という構図です。

種明かしをすれば、これで全部です。指数関数が1つ、エンゲージメント項が1つ、回すつまみが1つ。難しいのは自分たちのコンテンツに合った減衰率を決めるところで、そこは完全に判断の世界です。