到達範囲・新しさ・far の票¶
Status: 実測を記録し、2.6 系の計画を示す。本ページは 3 つの計測と 2 つの設計を 1 つの記述にまとめ、何が確定し、何が出荷され、残りを次の系がどうするかを述べる。
reach 設定の機構は SCAN_WINDOW_REACH_DESIGN.md に、計測は benchmarks/measurements/ の下記の名前にある。
1. 一段落で¶
ベクトル走査窓は費用の上限として文書化されていた。それは新しさの優遇 (recency prior) でもあった。最新の行だけを順位付けすることで、最近の答えはどれも小さな場で勝てばよくなる。古い行に届くように窓を広げるとその優遇が消え、最近の答えで NDCG@10 が 20 点落ちた。
窓をそのままにして、その下の行を 2 本目の順位付きリストとして足すと、優遇は保たれた。出荷済みのリストは全クエリで同一だった。ただし 2 本目のリストは 1 本目と同じ強さで投票する。その 10 票が 1 票しか持たない最近の答えを押し出して、広い窓の損失の 3 分の 1 を払った。
far の行が何票投じてよいかを抑えることが、構造で調整できる最後のつまみである。それで何を得るにせよ、残る問いは far の 1 票がいくらの価値を持つべきかで、それは採点の決定である。2.6 系はそれを、いずれ必要になる時間重み付きの検索と一緒に、すでにある 1 つの計器で 1 つの設計として決める。
2. 窓の正体¶
results-scan-window-default-ab.md。LongMemEval、保存 237,654 文書、出荷既定の実 recall
経路、答えが 10,000 行の窓のどちら側にあるかでクエリを 2 層に分け、near コホートを
12 rotation、層あたり 240 対。replicate 対照は桁まで再現したので、以下の差はすべて窓によるもので、ほかの要因ではない。
| 窓 10,000 → 200,000 | Δ NDCG@10 |
|---|---|
| 答えが窓の中 (near) | −20.19 ± 1.70 |
| 答えが窓の下 (far) | +4.93 ± 0.90 |
切り捨ては起きていない。全呼び出しが 10 行返し、ゲートの fallback は発火しなかった。
near の損失は、reciprocal-rank fusion 内の順位の押し出しである。正確には、ベクトルアームは融合に上位 limit 行を渡すので、10,000 候補の中で 3 位だった最近の答えが 200,000 候補の中で 30 位になると、リストの下にいるのではなくリストから消え、票が無くなる。
同じ run のもう 2 つの結果が、以降のすべての前提になる。
窓 50,000 は 200,000 より far 層の品質を多く得た (+12.87 対 +6.06)。far の答えは深さ 20,000〜29,500 にあり、広い窓はそれらを 150,000 行多く競わせただけだからである。答えより先へ到達しても、費用だけがかかって何も得られない。
また窓 300,000 と 500,000 は、全 cell で一致した。窓がコーパスを覆えばその値は意味を失うので、大きい既定値は、コーパスがそれより小さい利用者には無償である。
結論は数ではなく、設計上の欠陥だった。1 つの設定が 2 つの仕事をしていて、そのあいだはどちらも動かせない。
3. 到達範囲を優遇から分離する¶
SCAN_WINDOW_REACH_DESIGN.md は、2 つの仕事に 2 つの設定を与えた。窓は near リストのまま、出荷どおりに順位付けされる。CPERSONA_VECTOR_REACH が far リスト (走査位置[窓, reach) の中でコサイン上位の行) を、融合の順位付きリストとしてもう 1 本足す。
既存のリストは触られないので既存の行は票を保ち、far の行は追加しかできない。時間項は意図的に持たない。far の票が near の票より軽くあるべきかは採点の問いであり、設計はそれを採点を持つ系に残した。
results-scan-window-reach-ab.md (同じ計器、同じ規則) の結果は次のとおりである。
| reach 200,000、far リスト 10 行 | Δ NDCG@10 |
|---|---|
| near | −6.67 ± 0.85 |
| far | +3.87 ± 0.88 |
構造の主張は成立した。near リストは 480 対のうち 480 で id も順序も同一、窓と等しい reach は出荷どおりの答えを厳密に再現し、replicate は桁まで再現した。near 層が失った点はすべて、 2 本のリストが存在した後の融合で失われている。
機序は far リストの票である。reciprocal-rank fusion は載っているリストごとに
1 / (k + rank + 1) を与えるので、far リストの 1 位は near リストの 1 位とまったく同じ票を持つ。
損失した 84 の near クエリでは 251 行が、それまで無かった top10 に入り、そのうち 187 (75%) は far リストの票しか持たない行だった。それらはベクトル票しか持たない最近の答えを押し出した。字句票も持つ最近の答えは、押し出されずに残った。
far の利得が小さいのは、その裏返しの理由による。1 票の far の答えは 2 票の near 行のどれにも負け、同順位の near 行とは同点で、near の側が先に融合される。
探索的な掃引で、さらに絞り込めた。near の費用は到達範囲にほとんど依らない (50,000 で −5.97、300,000 で −8.49)。一方で far の利得は強く依る (50,000 で +10.20、300,000 で +4.25)。押し出すのは 10 個の全強度の票であって、それが引かれた深さではない。
limit=100 では損失が 2 倍以上になり、押し出す行は 2 票ずつ持って来る。100 行の字句リストが、ほぼすべてと重なるからである。
出荷済: CPERSONA_VECTOR_REACH、既定 off、既定でビット一致。測定済みの費用を
behavior-contracts.md §4 に持つ opt-in である。
4. far の票を数で抑える¶
CPERSONA_VECTOR_FAR_LIMIT は、far リストが融合に届く前に min(limit, N) 行に切る。候補数の設定であり、どの far 行が投票してよいかを変え、行の採点は何も変えない。
reach の結果が残した、構造で調整できる唯一のつまみで、reach を 200,000 に固定し、far リストを
1・2・3・5・10 行にし、規則を「near は −1.0 以内、far は全長リストの利得から 1 点以内」として登録された (prereg-scan-window-far-limit-ab.md)。
results-scan-window-far-limit-ab.md (同じ計器、reach 200,000) の結果は次のとおりである。
| far 行数 | Δ near | Δ far |
|---|---|---|
| 1 | −2.73 ± 0.48 | +1.32 ± 0.70 |
| 2 | −4.35 ± 0.63 | +1.87 ± 0.79 |
| 3 | −5.06 ± 0.70 | +2.24 ± 0.85 |
| 5 | −5.61 ± 0.75 | +3.25 ± 0.91 |
| 10 | −6.67 ± 0.85 | +3.87 ± 0.88 |
対照はすべて成立した。全長リストは前回の run を桁まで再現し、near リストは全クエリで同一、損失は長さに対して単調に減った。それでもどの長さも通らなかった。far の行が 1 つでも 2.73 点かかり、規則の両側は交わらない。
理由は算術である。どのリストでも 1 位は 1 / (k + 1)、単一リストが投じうる最大の票を持つ。したがって far リストの 1 位は near リストの 1 位と同点で、2 票目を持たない 2 位以下の
near 行すべてに勝つ。
数は far の 2〜10 票目を取り除ける (それが −6.67 から −2.73 までの距離である)。だが 1 行のリストもリストであり、その 1 位は全強度で投票する。候補数のつまみはもう使い切った。残るのは、その最初の票の重みである。
出荷済: CPERSONA_VECTOR_FAR_LIMIT、既定 off (応答の limit)、既定でビット一致。reach と同じく、測定済みの効果を文書に持つ opt-in である。
5. 3 つの計測が確立したこと¶
- 窓は名前の無い recency prior である。この計器での near 層の価値は 20 点。到達範囲を伸ばす変更はどれも、その優遇を別の手段で供給するか、その値段を払うことになる。
- 優遇は候補の段階で保存できる。2 本目のリストは 1 本目の票をそのまま残す。論証ではなく、クエリごとに実測した。
- 答えより先へ届いても、費用だけで何も得られない。 窓でも far リストでも、利得は到達範囲が答えをちょうど覆うところで最大で、先へ行くほど落ちる。コーパスの末尾を越えた到達範囲は何の働きもしない。「できるだけ大きく」は、どちらの設定にも誤った形である。
- 押し出すのは行ではなく票である。全強度の far 行は、1 票の最近の答えに勝つ。そういう行が何個あるかが損失の大きさを決め、1 つがいくらの価値かが、損失があるかどうかを決める。前者は数で、調整するつまみがある。後者は重みで、まだつまみが無い。
- 深さは押し出された答えを救わない。行数を増やせば全リストが深くなり、far の行が字句票を拾う。
limit=100では損失は小さくならず、大きくなる。
6. 2.6 系の計画: 値段の付いた far の票を、新しさと一緒に設計する¶
6.1 なぜ採点の変更で、なぜ待つのか¶
これまで出荷したものはすべて、融合の算術に触れていない。リストはリストで、票は
1 / (k + rank + 1) である。far の票を near の票より軽くすることは、融合が計算するものを変える。
2.5 系が出荷するのは、既定で出荷済みの挙動を保ち、答えが動いたのは壊れたからか変わったからかを問わずに soak できる変更である。融合が票に付ける値段の変更は、採点を再定義する系のために取っておき、同じ層に触れるもう 1 つの変更と一度に設計する。
6.2 形: 1 つの prior と、その特殊例¶
recency prior とは、行がどれだけ遡った位置にあるか (走査位置か、経過時間か) の関数としての、票への重みである。既存の設定はすべて、1 つの関数の特殊例である。
prior p(row) |
出荷しているもの |
|---|---|
| 窓の中で 1、外で 0 | 窓だけ (現在の既定) |
窓の中で 1、[窓, reach) で 1、その先で 0 |
CPERSONA_VECTOR_REACH |
| 窓の中で 1、far の先頭 N 行で 1、残りで 0 | CPERSONA_VECTOR_FAR_LIMIT |
窓の中で 1、[窓, reach) で w、その先で 0 |
値段の付いた far の票 (2.6) |
| 経過時間の滑らかな関数 | recency-weighted search (2.6) |
2.6 の設計は、最後の 2 行を 1 つの機構として作る。far リストの reciprocal-rank の寄与に重み w ∈ (0, 1] を掛け、滑らかな版は窓の縁の段差を経過時間の曲線に置き換える。
段差版は、既に測った 2 点のあいだを補間する。w = 0 は出荷どおりの答え (条件 A)、w = 1 は全長の far リスト (条件 S) である。したがって測定は両端の identity 対照を無償で得て、その間の
1 次元の掃引になる。
relative-score fusion では、同じ重みが合計の前に far チャネルの正規化スコアを伸縮し、far
リストがチャネル数を増やさない。重みが 4 つ目の除数に代わるので、w → 0 で far リストは
near 行に何も課さない。
6.3 最終の再ソートを先に決めなければならない¶
本番では confidence スコアラが on である。on のとき recall の最後の段は、融合済みリスト全体を、融合の順序が残らない confidence スコアで再ソートする。先に測ったところ、confidence off で行の約 1 割が異なる 2 つの融合モードが、on では全行で一致した。
融合しか見ない far 票の重みは、本番では見えないということである。したがって 2.6 の設計は、最終再ソートを取り除くか、confidence スコアを融合スコアの関数にするかのどちらかを行い、本番が走らせるのと同じ regime で測る。これまでのベンチマークは confidence off で走っており、計画は両者が一致すると仮定せずにそう述べる。
6.4 どの条件も走らせる前に事前登録すること¶
計器はすでに 3 度使ったものである。scene-blocked の LongMemEval コーパス、near / far の 2 層、 12 rotation、replicate と identity の対照、クエリごとの retriever リスト。設計が足すのは次の 5 点である。
- 条件: reach 200,000・全長の far リストで
w ∈ {0, 0.25, 0.5, 0.75, 1}。これまでの全記録が判定された構成なので、掃引は既にある数字に対して読める。探索は reach 50,000 の対。 - 両端の identity 対照:
w = 0は条件 A を、w = 1は条件 S を、桁まで再現しなければならない。 - 規則: near 層は出荷どおりの答えから −1.0 以内、far 層はその reach で重み無しの far リストが得る値から 1 点以内。far の絶対の基準 (+5.0) は reach の値を選ぶ場面に適用し、ここでは適用しない。
- far-only の読み:
wが下がるにつれて、押し出す行が数として減るか。それが重みのすべきことであり、数にはできないことである。 - regime: confidence off で 1 回 (記録と比較可能)、§6.3 が決まった後に本番 regime で 1 回。片方で通り片方で通らない重みは、そのとおりに報告する。
6.5 展開¶
既定 off、既定でビット一致。この記述のすべての設定がそうだったとおりである。次に測定。そして、そのときに限り、既定を一括で動かす。1 つの変更と 1 つの文書更新で、到達範囲・far リストの長さ・重み・大きいコーパス向けの文書が主張してよい運用範囲をまとめて動かす。最後のものが、この線全体が存在する理由である。
6.6 2.5 系に残るもの¶
到達範囲と far リストの長さは、測定済みの費用を文書化した opt-in 設定として残る。六桁のコーパスを持つ読み手は現在それらを on にでき、何を得て何を払うかを知っている。既定は、値段の付いた far の票が最近の答えに払わせずに既定を動かせるようになるまで動かない。
7. 未決¶
- 重みは 1 つの数であるべきか、far 領域内の走査深さの関数であるべきか。探索的な掃引は、利得が「到達範囲が答えをちょうど覆うところ」に集中すると示しており、測るまでは前者を支持する。
- 時間の曲線と位置の段差が 1 つの設定を共有できるか、書き込み速度が不均一なコーパスには両方要るか。
- far の票が episode penalty とどう相互作用するか。episode penalty は既に、最新 episode との位置関係で memory を区別している。