本文へ移動
X解体新書
第10章第四部10分

合計したあとの調整

新人枠の条件が大きく変わった。作者の減衰とフォロー外割引は vm-ranker の再計算で掛かる。

この章で分かること

  • 新人枠が「1件だけの席」であること、新しい条件が分かる
  • 連投が不利になる度合いを数値で言える
  • どの調整がどのサービスで掛かるかを説明できる

項目を合計したあと、いくつかの調整が順番に掛かります。ここを知らないと「点数が高いはずなのに」の説明がつきません。

その前に ─ オフセット変換

まず、合計値が負になった投稿の扱いです。負のスコアは 0 〜 0.001 という狭い帯域に線形に圧縮され、正のスコアには 0.001 が足されます。scoring.rs:161-170

調整① 新人枠 ─ 1リクエストにつき1件

「新人アカウントが全体的に優遇される」仕組みではありません。

effective[best_idx] = effective[best_idx].max(target);
掛け算ではなく max。1件だけを引き上げます。author_cold_start.rs:330-331

target は「点数の降順で16番目のスコア」です。公開既定では、毎回のリクエストで条件を満たす投稿の中から1件を選んで、16位相当まで持ち上げます。選び方は今回、単純な点数順からトンプソンサンプリングに変わりました。

条件前回今回
返信でない・リポストでない必須必須
著者のフォロワー数1,000人以下50,000人以下
ホームでの表示回数1,000回未満200回未満
点数付き候補内の順位上位85%以内上位97%以内
投稿の年齢一部実験群で24時間2時間以内
引き上げ先16位相当16位相当(15〜16の範囲)
選び方点数が最大の1件トンプソンサンプリングで上位2件から
param.rs:589-662 author_cold_start.rs:296-324

調整② 同じ作者の連投は減点される

同じ著者の投稿が並ぶと、2本目以降に倍率が掛かります。

1.000
1本目
0.625
2本目
0.438
3本目
0.344
4本目
0.297
5本目
0.273
6本目

倍率 = (1 − 0.25) × 0.5k + 0.25(vm-ranker の静的既定)

kは同じ作者で自分より上位にある投稿の本数です。scoring.rs:183-185

k は「同じ作者で、自分より上位にある投稿の本数」です。1本目は減衰なし、2本目で0.625倍、3本目で0.4375倍。下限は0.25倍です。

調整③ フォロー外は0.75倍

フォローしていないアカウントの投稿には ×0.75 が掛かります。

状況倍率
フォロー中 × オリジナル投稿1.00
フォロー中 × 返信・リポスト0.75
フォロー外0.75
トピック指定時のフォロー外0.50
値は vm-ranker の静的既定です。home-mixer のミラーには含まれません。params.rs:187-216

適用の順番と、サービスの分担

home-mixer
  Phoenix予測 → Σ(予測値 × 係数) → オフセット変換
  → 新人枠の候補を1件決める
vm-ranker(home-mixer から呼ばれる)
  Σ(予測値 × 係数) → オフセット変換
  → 新人枠の引き上げ
  → 同一作者の減衰(×0.75·0.5^k+0.25)
  → フォロー外割引(×0.75)
  → DPP多様化(選外は0)
vm_ranker.rs:84-136 scoring.rs:282-328

ほかに、実験用の仕組みも vm-ranker にあります。係数の個人別のゆらぎ(WeightPerturbationSigma)、著者別の探索ボーナス、予測の補正(debias)です。公開既定ではどれも無効で、値は0です。params.rs:157-168 params.rs:199-204 params.rs:254-265

下の計算機で、計算を「vm-ranker の調整込み」に切り替えて、つまみを動かしてみてください。同じ予測でも、減衰と割引で結果がどれだけ変わるかが見えます。「home-mixer の基本スコア」では、この2つは掛かりません。新人枠と多様化は含まれていないので、実際のフィードの順位を再現するものではありません。

スコア計算機

左は「AIがそう予測した確率や秒数」で、実際の回数ではありません。公開されている既定値で、コードと同じ順番に計算します。あなたの実際のフィードの順位を再現するものではありません。

  • 40.00%×0.66=+0.264
  • 5.00%×5=+0.250
  • 3.00%×1=+0.030
  • 0.60%×5=+0.030
  • 0.40%×20=+0.080
  • 0.50%×5=+0.025
  • 0.80%×2=+0.016
  • 0.30%×4=+0.012
  • 12.00%×0.3=+0.036
  • 4.00%×0.2=+0.008
  • 6.00%×0.05=+0.003
  • 5.00%×0.02=+0.001
  • 1.00%×0.05=+0.001
  • 45.00%×0.05=+0.023
  • 25秒×0.006=+0.150
  • 1.5秒×0.4=+0.600
  • 10.00%×0=+0.000
  • 0.05%×-52.272=-0.026
  • 0.02%×-31.2=-0.006
  • 0.02%×-58.8=-0.012
  • 0.01%×-234=-0.023
  • 55.00%×-0.02=-0.011
計算結果
1.4505
プラスの合計
+1.528
マイナスの合計
−0.079
差引
+1.449
オフセット変換+0.001
1.4505
同一作者の減衰この計算では掛かりません
適用なし
フォロー外割引この計算では掛かりません
適用なし

home-mixer が手元で計算する基本スコアです。本番の最終スコアは、このあと vm-ranker で計算し直されます。

新人枠の引き上げ、探索ボーナス、debias、DPP多様化、公開されていない実験設定は含みません。

計算手順 scoring.rs:69-140

オフセット scoring.rs:161-170

既定値 param.rs:396-514減衰なし value_model.rs:45-48