熱門話題
#
Bonk 生態迷因幣展現強韌勢頭
#
有消息稱 Pump.fun 計劃 40 億估值發幣,引發市場猜測
#
Solana 新代幣發射平臺 Boop.Fun 風頭正勁
為什麼會發生這種情況?模型相信有一個海馬表情符號,當然,但這為什麼會導致它輸出一個*不同*的表情符號呢?這是來自每個人最喜歡的被低估的可解釋性工具,logit lens 的線索!
在 logit lens 中,我們以一種奇怪的方式使用模型的 lm_head。通常,lm_head 用於將殘差(在模型層中構建的內部狀態)轉換為最終層後的令牌概率集。但在 logit lens 中,我們在*每一層*之後使用 lm_head - 向我們展示如果該層是最後一層,模型將輸出哪些令牌。
對於早期層,這會導致難以解釋的狀態。但隨著我們通過層的推進,模型迭代地將殘差首先朝向有助於繼續文本的概念,然後朝向最終預測。
再次查看圖像,在最後一層,我們得到了模型的實際輸出 - ĠðŁ, IJ, ł - 也就是,一個表情符號字節前綴後面跟著其餘的魚表情符號。
(由於令牌化的怪癖,它看起來像是 unicode 胡言亂語 - 不用擔心。如果你感興趣,可以問 claude 關於這行代碼:`bytes([byte_decoder[c] for c in 'ĠðŁIJł']).decode('utf-8') == ' 🐠'`)
但看看中間層發生了什麼 - 我們不僅僅得到表情符號字節!我們得到了那些*概念*,特別是海馬的概念。例如,在第 52 層,我們得到了 "sea horse horse"。稍後,在 top-k 中,我們得到了 "sea"、"horse" 和那個表情符號前綴 "ĠðŁ" 的混合。
那麼模型在想什麼?海馬 + 表情符號!它試圖構建一個海馬表情符號的殘差表示。
它為什麼要這樣做?好吧,讓我們看看 lm_head 實際是如何工作的。lm_head 是一個巨大的與令牌 ID 相關的殘差大小向量矩陣。當一個殘差被傳入時,它將與每個令牌向量進行比較,並與採樣器協調,選擇與殘差最相似的令牌 ID。(更技術性地說:這是一個沒有偏置的線性層,因此 v @ w.T 對每個反嵌入向量進行點積,然後 log_softmax 和 argmax/溫度採樣。)
因此,如果模型想要輸出單詞 "hello",它需要構建一個與 "hello" 輸出令牌的向量相似的殘差,以便 lm_head 可以將其轉換為 hello 令牌 ID。如果模型想要輸出一個海馬表情符號,它需要構建一個與海馬表情符號輸出令牌的向量相似的殘差 - 理論上可以是任何任意值,但實際上是海馬 + 表情符號,word2vec 風格。
唯一的問題是海馬表情符號並不存在!因此,當這個海馬 + 表情符號的殘差到達 lm_head 時,它會對所有向量進行點積,採樣器選擇最接近的令牌 - 一個魚表情符號。
現在,這種離散化是有價值的信息!你可以在 Armistice 的例子中看到,當令牌被自回歸地放回上下文中時,模型可以告訴它不是一個海馬表情符號。因此它再試一次,調整殘差並得到一個稍微不同的表情符號,反覆進行,直到它意識到發生了什麼,放棄,或用完輸出令牌。
但在模型從 lm_head 得到錯誤的輸出令牌之前,它並不知道 lm_head 中沒有海馬表情符號。它假設海馬 + 表情符號將產生它想要的令牌。
------------------
為了進一步推測,我想知道這是否是 RL 的一部分好處 - 它為模型提供了關於其 lm_head 的信息,而這些信息在層堆的末尾很難獲取。(記住,基礎模型並不是在自己的輸出/回放上訓練的 - 這僅在 RL 中發生。)

熱門
排行
收藏