iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0

第三篇直接把信心塞進票重,結果很刺激:信心方向正確時,準確率可以大幅上升;方向反過來,也能把多數決拖得很慘。

不過在判斷方向之前,還有一個比較不起眼的問題要處理。不同題目的信心分數,常常根本不在同一把尺上。

模型在簡單題可能回傳 0.99、0.98、0.97;碰到難題只剩 0.55、0.54、0.53。難題裡的 0.55 明明已經是最高信心,直接和前一題的 0.97 比,卻會被當成弱訊號。今天先把 γ 放在旁邊,只處理信心尺度。

我只保留同一題裡的順序

假設一題取樣四次,信心是:

[0.20, 0.70, 0.70, 0.90]

排序後,0.20 是第 1 名,0.90 是第 4 名。兩個 0.70 卡在第 2 與第 3 名,所以各自拿平均排名 2.5:

[1.0, 2.5, 2.5, 4.0]

這種處理叫 midrank。平手的軌跡拿到相同位置,不會因為原始陣列順序不同而改變票重。上一篇才處理過平手偏差,這裡當然不能又把它偷偷放回來。

從排名轉成常態分數

只有排名還不夠。取樣 4 次時,排名範圍是 1 到 4;取樣 40 次時則是 1 到 40。TACT 會再做一次 van der Waerden 轉換:

題內排名與 van der Waerden 分數

R 是題內平均排名,m 是這題的軌跡數,Φ⁻¹ 是標準常態分布的反累積分布函數。分母用 m+1,可以避開 0 和 1,否則最小與最大排名會被轉成負無限與正無限。

轉換後,我再用這一題實際算出的平均值與標準差做標準化:

標準化 van der Waerden 分數

為什麼特別強調「實際算出來」?沒有平手時,m=4 的原始常態分數標準差大約是 0.62,m=40 則接近 0.95。若直接套一個固定常數,γ 的實際強度會跟取樣預算一起飄。每題各自標準化後,φ 都以 0 為中心,標準差為 1。

Python 實作

程式和論文使用同一個定義。rankdata(..., method="average") 負責 midrank,norm.ppf 負責 Φ⁻¹

import numpy as np
from scipy.stats import norm, rankdata

def vdw_scores(
    confidences: list[float] | np.ndarray,
    eps_sd: float = 1e-8,
) -> np.ndarray:
    c = np.asarray(confidences, dtype=float)

    if c.ndim != 1 or c.size == 0:
        raise ValueError("confidences must be a non-empty vector")
    if not np.all(np.isfinite(c)):
        raise ValueError("confidences must be finite")

    ranks = rankdata(c, method="average")
    normal_scores = norm.ppf(ranks / (c.size + 1))
    sd = float(np.std(normal_scores))

    if sd <= eps_sd:
        return np.zeros_like(normal_scores)

    return (normal_scores - normal_scores.mean()) / sd

拿剛才的三組輸入測試:

cases = [
    [0.1, 0.2, 0.3, 0.4],
    [0.2, 0.7, 0.7, 0.9],
    [0.7, 0.7, 0.7, 0.7],
]

for confidence in cases:
    print(np.round(vdw_scores(confidence), 3))

輸出是:

[-1.354 -0.408  0.408  1.354]
[-1.414 -0.000 -0.000  1.414]
[ 0.000  0.000  0.000  0.000]

第二列的兩個 0.70 得到完全相同的分數。第三列更重要:信心全部平手時,標準差是 0,程式直接回傳全零。TACT 的票重為:

TACT 單票權重

φ 全為 0 時,每一票的權重都是 1。即使全域 γ 不等於 0,這一題仍會退回普通 Self-Consistency。

單調改變信心尺度,結果不會動

題內排名還有一個實用好處。只要轉換函數嚴格單調遞增,排名就不會變。原始信心、信心的三次方與信心的對數,最後會得到相同的 φ:

c = np.array([0.21, 0.48, 0.73, 0.91])

assert np.allclose(vdw_scores(c), vdw_scores(c ** 3))
assert np.allclose(vdw_scores(c), vdw_scores(np.log(c)))

這讓投票器不必相信模型回傳的絕對刻度。只要同一題裡的相對順序還在,後續計算就不受尺度拉伸影響。

有個例外很容易被忽略:先把信心四捨五入到小數點後一位,可能製造原本不存在的平手。四捨五入不是嚴格單調轉換,排名資訊真的會消失。我會保存模型回傳的原始值,只在顯示時取小數位數。

TACT 在單調變換與異質信心條件下的測試

圖:TACT 的壓力測試。單調壓縮、過度自信與冪次變換改變信心刻度,題內排名仍保留順序;真正困難的是不同子群的方向不一致,以及錯誤答案群出現高信心回音。

排名也沒有把問題全部解掉

van der Waerden 分數在軌跡數很多時接近常態形狀;m=4 時就只有四個可能值。題內標準化修正了尺度,沒有憑空增加樣本,也不會告訴我們高信心究竟偏向正確還是錯誤。

下一篇才開始估方向。我會在有答案標籤的開發集裡,比較正確與錯誤軌跡的題內排名,從 AUC 接到 Somers' D。那個帶正負號的統計量,會決定 γ 應該朝正向、反向,或乾脆留在 0。

論文預印本:TACT: Trust-Anchored Confidence Tempering for Self-Consistency Voting in Large Language Models


上一篇
Day 3|信心加權只改幾行,為什麼反而更容易投錯?
系列文
從多數決到可信投票:30 天打造 TACT 大語言模型推理聚合方法4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言