Day 8 把不穩的辨別度往 0 收縮,留下 D̃。正值表示高信心較常答對,負值表示高信心反而容易答錯,0 則停在普通 Self-Consistency。
方向有了,票重要放大多少還沒決定。最省事的做法是把 γ 丟進一組候選值試跑,再挑開發集最高分;TACT 想避開這層搜尋,所以用一個工作模型把 D̃ 映射成 γ。
Day 5 已經用過 D=2AUC-1,因此收縮後的 AUC 可以寫成 (1+D̃)/2。
假設同一題內,正確與錯誤軌跡的 van der Waerden 分數 φ 各自近似常態分布,兩邊共用類別內變異數 s²。令兩個平均值的差為 Δ=μ₁-μ₀,再定義標準化分離度 u=Δ/s。
等變異常態模型下,AUC 和 u 的關係是:
Φ 是標準常態累積分布函數。D̃=0 時,AUC 是 0.5,u 也等於 0。負 D̃ 會得到負 u,方向自然被保留下來。
Day 4 把每題的 φ 標準化成整體平均 0、變異數 1。這個「整體」混合了正確與錯誤軌跡,所以 s² 不一定等於 1。
令 p̄ 為開發集中單條軌跡答對的比例。混合分布的變異數可以拆成類別內變異與兩類平均差造成的變異:
整理後得到:
s² = 1 / [1 + p̄(1-p̄)u²]
當正確與錯誤軌跡分得越開,整體變異中就有越多來自兩組平均值的距離,單一類別內的 s² 反而小於 1。
這裡的 p̄ 是所有開發軌跡的正確比例,不是最終題目準確率,也不是 Self-Consistency 的得分。實作會把它限制在 [0.05, 0.95],避免極端小樣本把修正推到奇怪的邊界。
兩個等變異常態分布的 log likelihood ratio 對 φ 是線性的。和 φ 相乘的斜率為 Δ/s²,它正好可以當成指數票重的係數:
票重仍是前幾篇看過的形式:
w_i = exp(γ φ_i)
γ 為正,高排名信心票變重;γ 為負,低排名信心票變重。類別先驗會影響 likelihood ratio 的截距,但同一題所有候選票共享那個常數,投票 argmax 真正需要的是斜率。
令:
z = Φ⁻¹((1 + D̃) / 2)
因為 u=√2z,前面的式子可以直接化簡成:
預設 p̄=1/2 時更短:
這裡沒有再訓練一個迴歸器,也沒有搜尋 {0.25, 0.5, 1, 2, 4}。輸入只有前面算好的 D̃ 與 p̄。
以下使用 p̄=0.5,先不套上限:
D̃ z γ
0.00 0.000 0.000
0.10 0.126 0.178
0.25 0.319 0.462
0.50 0.674 1.057
0.75 1.150 2.097
0.90 1.645 3.568
0.95 1.960 4.737
-0.50 -0.674 -1.057
映射是奇函數,D̃ 換號時 γ 也跟著換號。接近 0 時,γ 平順地從 0 長出來;D̃ 接近 ±1,probit 會快速變大。
因此實作必須先把 D̃ 夾在 (-1, 1) 內,還要對 γ 設上限。TACT-dev 使用 γ_max=4,label-free 使用 γ_max=2。上表的 D̃=0.95 原始 γ 為 4.737,dev 路徑實際只會使用 4。
截斷不是排版上的小修飾。估計飽和時,真正進入投票的是 γ_max,推導出的原始幅度已經不再主導結果;實驗解讀時要把「公式輸出」和「截斷後使用值」分開記錄。
下面的程式直接使用化簡後的式子:
import numpy as np
from scipy.stats import norm
def gamma_from_d_tilde(
d_tilde: float,
p_bar: float | None = 0.5,
gamma_max: float = 4.0,
) -> float:
if gamma_max <= 0:
raise ValueError("gamma_max must be positive")
d = float(np.clip(d_tilde, -1.0 + 1e-9, 1.0 - 1e-9))
z = float(norm.ppf((1.0 + d) / 2.0))
if p_bar is None:
gamma = np.sqrt(2.0) * z
else:
p = float(np.clip(p_bar, 0.05, 0.95))
gamma = z * np.sqrt(
2.0 + 4.0 * p * (1.0 - p) * z ** 2
)
return float(np.clip(gamma, -gamma_max, gamma_max))
測試符號、0 錨點和上限:
assert gamma_from_d_tilde(0.0) == 0.0
assert gamma_from_d_tilde(0.5) > 0.0
assert gamma_from_d_tilde(-0.5) < 0.0
assert np.isclose(
gamma_from_d_tilde(-0.5),
-gamma_from_d_tilde(0.5),
)
assert gamma_from_d_tilde(0.95, gamma_max=4.0) == 4.0
無標籤路徑不知道真正的 p̄,因此傳入 None,省略混合變異修正,使用 γ=√2z。以 D̃=0.9 為例,未修正值約 2.326,p̄=0.5 時則是 3.568。後者大約高 53%,所以缺少標籤時不能假裝知道基準正確率。

圖:將真實信心—正確性耦合從負值掃到正值。γ 的符號決定票重往哪個方向傾斜;接近零時,各方法回到 SC 附近,離零越遠才有足夠訊號拉開差距。
van der Waerden 分數在軌跡數夠多時才逐漸接近常態。每題只有 4 條軌跡時,φ 就只有四個離散值;等變異常態模型不會突然變成精確真相。題內使用實際標準差能修正尺度,補不了分布形狀。
γ 因而是工作模型下的推導值,不是對所有 LLM、所有取樣預算都成立的神諭。需要用不同 K、不同模型能力和不同信心來源做壓力測試,也要保留網格搜尋作為比較基準。推導的價值在於少一層結果導向調參,並讓正負方向、0 錨點和單調性可以逐項檢查。
Day 10 會把目前散在九篇裡的步驟收回同一個公式:題內排名、pooled D、保守 SE、死區收縮、probit link 和最終投票。接著會把公式逐段對到一份能執行的 TACT-dev 程式。
論文預印本:TACT: Trust-Anchored Confidence Tempering for Self-Consistency Voting in Large Language Models