查詢、鍵與值(query, key, value)
/ KWEER-ee, kee, and VAL-yoo /
查詢、鍵與值,是注意力機制裡每一項都要扮演的三種角色,最乾淨的類比是一次圖書館檢索。查詢,就是你要找的東西——你敲進去的檢索詞。鍵,是每本書書脊上的標籤,檢索就拿它來匹配。值,是你從架上抽出來的那本書裡實際的內容。注意力把你的查詢與每個鍵相比較,判定哪些書相關,再按各自匹配的好壞,把它們的值加權調和後遞給你。
在 Transformer 裡,每個詞元的向量分別乘以三個獨立的、學得來的權重矩陣,產出它自己的查詢、鍵、值向量。某個詞元用它的查詢去與每個詞元的鍵(包括它自己的)打分;這些分數變成注意力權重;該詞元隨後收到所有值的加權和。這種拆分是刻意的:把「我在找什麼」(查詢)與「我對外標榜什麼」(鍵)以及「我實際交付什麼」(值)分開,讓模型有自由按一個依據去匹配,卻傳遞另一樣不同的東西。
這三件套是讓注意力其餘部分變得精確的詞彙。自注意力,不過是查詢、鍵、值都來自同一序列的那種情形;交叉注意力,則是查詢來自一個序列、鍵與值來自另一個序列。懂了 QKV,便是注意力從「像魔法」到「看清其本來面目」的分水嶺:一次學得來的、基於內容的查找,後接一次加權平均。這些矩陣是學出來的,所以什麼算「匹配得好」,本身也是由訓練塑造的,並非事先寫定。
詞元「河」提供一個大致意為「我與水/地理有關」的鍵,以及一個承載其內容的值。當詞元「岸」形成一個諸如「我需要確定我的意思」的查詢時,它與「河」的鍵打出高分,於是「河」的值流入,替「岸」消解了歧義。
按鍵匹配,取出值——一次柔性的、學出來的查找。
鍵與值是刻意分開的。一個詞元可以在鍵上強烈匹配,卻貢獻一個說著相當不同之事的值——所以「注意力據以挑選的東西」與「它實際傳遞的東西」不必是同一個向量。把二者混為一談,是初學者常犯的錯。