JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

注意力這個想法

在自注意力之前、在 Transformer 之前,只有一個簡單的問題:我該注意哪些詞?認識作為一種軟的、可學習的查表的注意力——並看清為什麼那個舊的固定長度摘要非走不可。

一切的起點:那個瓶頸

在上一段階梯裡,你認識了循環神經網路,以及它逐步讀取序列的工作。要翻譯一個句子,經典的序列到序列結構讓一個編碼器讀完整個輸入,把它壓縮進一個固定長度的向量——一種被壓扁的摘要——再由解碼器把它展開成輸出。它確實管用,曾一度是最先進的方法。但請留意這個設計裡那股安靜的暴力:無論是五個詞還是五十個詞,*每一個*句子都被硬擠進同樣長度的一個向量。

想像有人要你讀一段話,然後逐字逐句地把它用另一種語言寫下來——但你讀的時候只能用一張便利貼,而且不許回頭看原文。對一句短語來說,沒問題。但對一句又長又繞的句子,便利貼會寫滿;等你讀到結尾,開頭附近的細節早已模糊。這就是固定長度摘要問題,它不是一個你能調一調就消除的小毛病,而是寫進了架構本身的形狀裡。

讓模型回頭看

解法自然得幾乎讓人不好意思。與其逼編碼器交出一份凍結的摘要,不如把它逐步產生的*全部*表示都保留下來——每個輸入詞一個向量——並讓解碼器在需要時隨時伸手去那一堆裡取用。當它要生成下一個輸出詞時,它會問:在所有輸入詞裡,*此刻*哪些重要?這個問題——「我該注意哪些詞?」——正是整個注意力機制的種子。

具體來說:當把「the cat sat on the mat」翻譯成法語、而模型正在決定「sat」對應的詞時,它應當重重地依賴輸入詞 *sat*,只輕輕地看一眼 *the* 或 *mat*。注意力給每個輸入詞一個權重——一個數字,表示它對當前正在生成的詞有多相關——然後按這些比例把各個輸入向量混合在一起。得到的是一份新鮮的摘要,為這一刻量身定製,而不是一張凍結的、整句反覆重用的便利貼。

請留意這種心態上的轉變。模型不再需要預先把整句話背下來。它只需在每一步知道*該往哪裡看*——而原始資訊始終原封不動地擺在那裡,隨時可取。我們用一次壓縮的動作,換來了一次選擇性檢索的動作。

加權聚焦:一次柔性平均,而不是只挑一個

下面是微妙而漂亮的地方。注意力*並不*只指向一個勝出的詞、對其餘視而不見。那會是一種硬選擇——挑出唯一最相關的輸入,只用它。注意力反而把焦點*柔性地*鋪開:也許 70% 給 *sat*,15% 給 *cat*,剩下一點點散在其它所有詞上,所有權重加起來等於 1。輸出是所有輸入向量的加權混合。這正是人們稱它為注意力的原因——焦點是一條平滑的分布,而不是一個開關。

為什麼要軟、不要硬?有兩個原因,都很深。第一,真實語言本就充滿歧義——「它」也許主要指一個名詞,又有幾分指向另一個,而混合能誠實地捕捉這一點。第二,也更實際:軟混合是可微的——你可以對它求梯度,用反向傳播端到端地訓練這些權重,正如你在普通網路裡學過的那樣。硬選擇沒有可供跟隨的有用斜率。正是這份平滑,讓注意力變得*可學習*。

原始的相關性分數怎樣變成一組乾淨、加起來等於 1 的權重?用一個你已經認識的函數:softmax。它把任意一串數字變成加起來為一的正分數,並溫和地放大較大的那些。把相關性分數送進 softmax,出來的就是注意力權重,可以直接拿去混合。

柔性查表:查詢、鍵與值

還有一種更清爽的方式來理解這一切,它也是本段階梯接下來要用的框架。想像一次普通的字典查找。你有一個查詢(你要找什麼)、一組(東西被歸檔時貼的標籤),以及一些(內容本身)。你拿查詢去和各個鍵比對,找到匹配的那一個,返回它的值。注意力就是這件事的*柔性*版本——一次查詢-鍵-值查找,只不過你得到的不是一個精確匹配,而是對所有項的一次加權混合。

模型怎樣衡量一個查詢與某個鍵「合不合」?兩者都不過是向量——空間裡的點,就是你早先認識的那種嵌入——所以它用一個相似度分數。最簡單的選擇是點積:當兩個向量指向同一方向時它很大,方向不一致時則小甚至為負。把查詢和每個鍵打分,用 softmax 把這些分數變成權重,再對各個值取加權和。這三行配方就是注意力的核心。

# soft lookup over a memory of (key, value) pairs
scores  = [ dot(query, k) for k in keys ]   # how well query fits each key
weights = softmax(scores)                    # positive, sum to 1
output  = sum( w * v for w, v in zip(weights, values) )  # weighted blend
# one exact key would give weights like [0,0,1,0]; attention stays soft
三行寫盡注意力:打分、歸一化、混合。硬查找會跳到某一個值;軟查找則按相關性把它們全部混合起來。

下一篇會揭開讓它威力暴漲的轉折:查詢、鍵和值不必來自兩個不同的句子。讓*同一個*句子裡的每個詞都發出自己的查詢,同時又充當其它詞的鍵和值,你就得到了自注意力——Transformer 的引擎。但整座大廈,都建立在你剛剛搭起的這個樸素想法之上:一次允許模糊的查表。

注意力是什麼——又不是什麼

一旦看到那些權重,人們很容易把它們讀作模型的*理由*。研究者甚至會把注意力畫成熱力圖,稱之為解釋。這裡要當心。注意力權重顯示的是*資訊從哪裡被收集而來*,這有啟發性,但它並不是模型為何做出某個決定的忠實交代。關於把注意力當作解釋的大量文獻已經表明:你常常可以打亂這些權重,卻得到同樣的答案。注意力是一種為資訊選路的機制,而不是一扇通向心靈的窗。

第二個誠實的提醒:注意力本身並沒有發明智能。它最早(約 2014 年)是被*加裝*到循環翻譯模型上的,使它們明顯變好——那是一次改進,還不是一場革命。革命來得更晚,當研究者去問:能不能把循環結構整個扔掉,*只*保留注意力?那個故事,以及它背後那個著名的論文標題,留給後面的指南。眼下,請抵擋那種氣喘吁吁的說法:注意力是一個絕妙的好想法,而不是魔法。