你理解的控制LLM幻覺的方法可能是錯的
那什么是粗暴的控制LLM的幻覺的方法呢?
正常你們大家學到的應該是
temperature=0
top_k=1
top_p=0.1類似這種的但是這種是不是能解決幻覺呢?很顯然在做的各位試過,應該是沒什么效果的。為什么呢?
正常來講,我們不是把生成next token的概率放到最大的那個token上了嗎?
今天先回憶個概念LLM是靠什么來決定next_token生成的,
就是Logit,就是softmax你的前向計算的最后一層(這么表達不精確,但是你可以認為就算最后一層了)
過了output之后呢?要和詞表做一個矩陣乘,得到一個logit,但是這個不能直接用,需要給softmax轉換為對應詞的概率,就是我剛才的公式
(不理解transformer架構的兄弟可以參考我以前的博文,草履蟲也能學懂得Transformer系列
??https://mp.weixin.qq.com/s/Qi9-SqTGk5yHkF0WQ1CdYQ?token=1866303267&lang=en_US??
如果志在玩大模型,至少目前Transformer還是繞不開的基礎)
1- 為什么temperature要設置低
溫度采樣是一種基本技術,可控制 token 選擇的隨機性。它的工作原理是在應用 softmax 函數之前縮放 logits(未歸一化的預測分數)。
其中:P(xi)是選擇 token ii的概率,Z i是選擇token ii的 logit,T就是溫度參數了
較低的溫度(T < 1)使分布更加尖銳,傾向于高概率 token。較高的溫度(T > 1)會使分布變平,增加選擇較低概率 token 的機會。
2- TOP P 和K 呢?
這就不仔細講了,TOP是核采樣,就是排序計算累加概率,知道累加概率超過p剩下的就不要了,然后歸一化,從里面選出來TOPK 不用說了把,選K個歸一化。
一般的理解認為,如果把上述的設置都設置為最嚴格的,比如設置topK=0,TOP_P=1, 先把這兩個參數廢掉,然后temperature=0.0 就應該是絕對無幻覺的答案了,如文章開頭說的,事實上是不行的,下面講一下為什么?因為LLM還有兩個比較關鍵的概念,當然你也可以說這倆概念是人為加上的,引入這些概念的就是entropix采樣:
第一個注意力熵entropy:
理解語言模型中的熵
在語言模型的上下文中,熵衡量模型預測中的不確定性或隨機性。它量化了概率分布在可能的下一個 token 上的分散程度。
其中 pi是第 i 個 token 的概率。
較高的熵值表示模型對下一個 token 不確定,概率分布在許多選項上。相反,較低的熵表示模型更有信心,概率集中在較少的 token 上。
注意力熵方差 (Varentropy)
熵方差(Varentropy),或熵的方差,衡量了在單個位置上,不同可能的 token 之間的信息內容(驚奇度)變化有多大。它提供了對模型不確定性和其對給定上下文的預測多樣性的洞察。
熵方差的計算涉及以下步驟:
步驟 1:計算概率和對數概率
使用 softmax 計算當前位置上每個可能的 token 的概率,并計算它們的對數概率。
步驟 2:計算熵
計算當前位置概率分布的熵。
步驟 3:計算熵方差
對于每個可能的 token,計算其信息內容(負對數概率)與平均信息內容(熵)之間的平方差。用它們的概率加權這些差異并將它們加總。
熵方差在識別模型正在考慮驚奇度水平非常不同的 token 的情況時特別有用。高熵方差可能表明上下文復雜或模糊,模型的預測更加多樣化或不確定。
在采樣決策中的意義
熵和熵方差的組合在 Entropix 的采樣策略中起著至關重要的作用。以下是它們如何影響決策過程:
- 低熵,低熵方差:表示高置信度和一致性。Entropix 在這些情況下可能會使用貪婪采樣。
- 高熵,低熵方差:表明一致的不確定性。這可能會觸發插入澄清(clarification insertion)或增加探索。
- 低熵,高熵方差:表示不同程度的置信度。Entropix 可能會采用探索采樣來調查不同的可能性。
- 高熵,高熵方差:代表高度不確定性和不一致性。這種情況通常會導致使用調整參數的高不確定性采樣。
在 Transformer 模型中,注意力通常以多頭注意力(multi-head attention)的形式實現。這意味著注意力機制并行應用多次,允許模型同時關注輸入的各個不同方面。
Transformer 模型中的每個注意力頭計算一組注意力分數,確定在生成每個輸出 token 時,要將多少注意力放在輸入的不同部分。
注意力熵用于量化注意力在不同 token 上的不確定性或分散程度。
較高的注意力熵表示模型的注意力分散在許多 token 上,而較低的熵表示模型專注于少數特定的 token。
而如果分散在許多token上,也就是所謂的熵分散,代表模型此時根本不知道哪個token更合適
這個時候你比如temperature=0.0,你是選擇了一個所謂概率最高的,但是你其實也限制了模型探索的能力,這也是幻覺可能產生的開始
注意力一致性 (Agreement)
注意力一致性衡量不同注意力頭之間的注意力模式的一致程度。它通過將每個頭的注意力分布與平均注意力分布進行比較來計算
較低的一致性表明不同的頭正在關注輸入的各個不同方面,這可能表明上下文復雜或模糊。
這是第二個引入幻覺的可能性,因為上下文的理解不確認
我們今天介紹的Entropix 使用這些基于注意力的指標來指導其采樣決策。例如:
- 較高的注意力熵可能導致采樣中增加探索。
- 較低的注意力一致性可能導致溫度或 top-k 參數的調整。
所以大家基本就能看明白了,如果模型不確認哪個token最優,那就增加一些探索的可能性,比如對上下文模糊,那就動態調整模型的配置參數
交互強度 (Interaction Strength)
交互強度定義為 Transformer 模型中所有層、頭和位置的注意力分數的絕對值的平均值。在數學上,它可以表示為:
L代表層數,H是注意力頭,N是序列長度,Alhji就是第l層第h頭種從位置i到位置j的注意力分數
較高的交互強度值表示序列中 token 之間存在更強的關系
交互強度在 Entropix 的自適應采樣過程中起著至關重要的作用。它影響采樣策略的幾個關鍵方面:
- 溫度調整:較高的交互強度可能導致溫度升高,當 token 之間連接緊密時,促進更多樣化的輸出。
- Top-k 參數:交互強度用于動態調整 top-k 參數,從而根據 token 關系的強度允許更多或更少的候選 token。
- 探索與利用:在交互強度較高的場景中,采樣策略可能會傾向于更具探索性的行為,以捕獲 token 之間復雜的聯系。
說白了,我token之間交互強度高,證明我們之間的注意力更高,需要輸出更多元化,人話說就是更多探索路徑,來捕捉復雜的注意力
下面是entropix的完整采樣過程:
如上圖所示
數據流和決策過程
Entropix 系統在文本生成過程中遵循特定的流程:
步驟 1:Token 生成
語言模型處理輸入 token 并生成 logits 和注意力分數。
步驟 2:指標計算
指標計算器基于模型輸出計算熵、熵方差、注意力熵、注意力一致性和交互強度。
步驟 3:策略選擇
自適應采樣器分析計算出的指標,并選擇最合適的采樣策略。
步驟 4:參數調整
根據選擇的策略和指標,動態調整采樣參數(溫度、top-k、top-p、min-p)。
步驟 5:Token 采樣
應用選擇的采樣策略來選擇下一個 token。
步驟 6:迭代
從步驟 1 開始重復該過程,并加入新生成的 token。
采樣策略
Entropix 采樣方法的核心是其策略選擇邏輯。該系統持續評估模型的輸出指標,并為每個 token 生成步驟選擇最合適的采樣方法。
自適應采樣
當 logits 的熵和熵方差沒有落入極端類別時(與觸發專門采樣技術的場景不同),自適應采樣策略就會啟動。它旨在平衡探索和利用,適應當前的上下文和模型狀態。
自適應采樣過程
步驟 1:計算指標
首先,模型的 logits 和注意力分數中計算各種指標:
- Logits 熵和熵方差
- 注意力熵和熵方差
- 注意力一致性
- 交互強度
步驟 2:調整采樣參數
基于這些指標,動態調整采樣參數:
- 溫度
- Top-p(核采樣閾值)
- Top-k
- 最小概率閾值 (min_p)
步驟 3:生成多個樣本
使用調整后的參數生成多個候選 token。樣本數量是可配置的,默認為 12。(現在不是流行帶搜索的中間過程嗎,你可以理解為帶搜索的token生成)。
步驟 4:樣本評分
每個樣本都根據兩個因素評分:
- 來自模型 logits 的對數概率
- 從計算出的指標導出的置信度分數
步驟 5:選擇最佳樣本
得分最高的樣本被選為最終輸出 token。
生成多個樣本后,每個樣本都使用對數概率和置信度分數的組合進行評分:
def score_sample(sample):
log_prob = jnp.sum(jax.nn.log_softmax(logits) * jax.nn.one_hot(sample, logits.shape[-1]))
confidence_score = (
(1 - metrics["logits_entropy"]) * 0.1 +
(1 - metrics["attn_entropy"]) * 0.2 +
(1 - metrics["logits_varentropy"]) * 0.3 +
(1 - metrics["attn_varentropy"]) * 0.4 +
metrics["agreement"] * 0.5 +
metrics["interaction_strength"] * 0.6
)
return log_prob + confidence_score
此評分函數平衡了 token 的可能性(log_prob)和從各種指標導出的置信度度量。置信度分數中每個組件的權重可以根據經驗結果進行調整。
現在回到最開始我們說的集中情況來分析:
1-如果熵和熵方差都非常低時,模型對其預測非常有信心。在這種情況下,使用貪婪采樣,說白了模型知道它在干什么,它對自己的答案也足夠確認,那就選擇概率最高的,就是標準的logit。
2- 如果熵高,但是熵方差低,證明模型是不確定的,但是其不確定性是一致的,所以需要澄清,這個澄清就是以特殊token的形式。
如果插入了澄清token,那么下一個token就會動態調整temperature,用更高的溫度拿到更大的多樣性,來進行采樣,找到最合理的token!
其實某種程度上有點像李飛飛的S1的wait token。
3- 另外如果,模型熵很低,證明它很確認,但是熵的方差高,就證明它本身就看到了很多不同的可能性,那采樣的temperature就直接升高(基于交互強度指標)就可以了,top k當然也順手就給升了。
4- 如果熵和熵方差都高,記憶是又不確定,又看到了好多的可能性,那就直接下猛藥,但是其實和3的請款一樣,也是升temperature,但是是基于熵方差的強度來調整temperature,而不是注意力一致性,另外此時因為熵升高,所以要降低top-p的參數來讓它收斂。
這就是entropix的思路,通過動態的采樣參數和澄清token來實現fitting化的采樣保證模型的輸出更合理化,更少幻覺,其實entropix的思路在OAI的o系列是有引入類似的概念的。
比如你們使用o系列api就會發現一個申請的問題,temperature和top p k都不允許設置
原因就是來自于這,所以大家理解了為什么temperature=0.0和有沒有幻覺并沒有本質聯系的原因了嗎?
本文轉載自????熵減AI????,作者:周博洋
