Learning Objectives
- 用 softmax 把一組分數換成加起來等於 1 的權重
- 說明 query、key、value 在注意力計算中的角色
- 用 numpy 手算一次 scaled dot-product attention
- 說明手設向量和真實模型向量的差別,不過度解讀注意力權重
同一個字要參考不同的上下文
「他把書放在桌上」和「他在書店打工」,處理「書」這個位置時,該參考的旁邊的字不一樣。程式要把一句話變成數字計算,也會遇到這個問題:每個位置要從句子裡的其他位置取得多少資訊?
注意力機制(attention)是回答這個問題的一種計算方法:替每個位置算出一組權重,再依權重把其他位置的資訊加起來。2017 年的論文 Attention Is All You Need(Vaswani 等人)提出完全以注意力為主的 Transformer 架構,現在常見的大型語言模型多半是這條路線的延伸。
這一課用 numpy 親手算一次,所以你會看到它其實是內積、softmax 和加權平均的組合。
先說清楚這一課的限制:
- 這一課不呼叫模型,向量是我們手設的示意值,四個維度還刻意取名叫「人、物品、動作、地點」,方便你追蹤。真實模型的向量是訓練時學出來的,維度很多,也沒有人替它們命名。
- 這裡只算一層、一組權重。真實模型有很多層,還有其他元件;OpenAI 也沒有公開
gpt-5.6-luna的內部細節,所以這一課不是在描述任何特定模型。 - 算出權重不代表模型「理解」了句子。權重只是這一步計算的結果。
需要的 numpy 只有陣列、@(內積與矩陣乘法)與 np.exp。機器學習的基礎請看機器學習軌。
逐步看:softmax 把分數變成權重
分數可以是任何實數,但權重要是正數、加起來等於 1。請看哪一步做到這件事,以及分數差距改變時權重怎麼變。
Query、key、value
注意力的計算有三種向量,可以用查資料來比喻:
| 向量 | 比喻 | 用途 |
|---|---|---|
| query(q) | 你要找什麼 | 目前這個位置提出的查詢 |
| key(k) | 每筆資料的標籤 | 和 query 比對,算出相符的程度 |
| value(v) | 每筆資料的內容 | 依權重加起來,成為輸出 |
和字典查詢的差別是:字典只拿回一筆完全相符的內容,注意力則是每一筆都拿一些,相符程度越高拿得越多。
計算只有四步,寫成論文的公式是 Attention(Q, K, V) = softmax(QKᵀ / √d_k) V:
- 內積: query 和每個 key 做內積,方向越接近分數越高。
- 縮放: 除以
√d_k(d_k是 key 的維度)。 - softmax: 把分數變成權重。
- 加權平均: 用權重把 value 加起來。
下面的句子是「小安把書放在桌上」,先手動切成六段,我們只看「放」這個位置。
逐步看:算一個位置的注意力
每個數字都很簡單,可以自己心算對照。「放」的 query 是手設的:主要在找物品,其次找地點。請看最後權重最高的是哪個字。
逐步看:一次算完整句
每個字都提出自己的 query(手設)。用矩陣可以一次算完,不需要迴圈。這種 query、key、value 都來自同一個句子的情況,叫做自注意力(self-attention)。
這個計算沒有用到字的順序
剛才的算式裡,每個字只靠向量互相比對,完全沒有用到它排在第幾個。把句子打亂,每個字的權重分配不會變,只是排列跟著換位置。所以論文另外把位置資訊加到輸入向量裡。
真實模型和這個範例還有幾個差別:
- 向量是學出來的。query、key、value 由同一個位置的向量分別乘上三個學出來的矩陣得到,不是人設定的。
- 論文同時算多組注意力再合併(multi-head),每組可以看不同的關係,並且一層一層疊起來。
- 這裡的維度只有 4,還有名稱;真實模型的維度很多,單一維度通常也沒有這麼乾淨的意義。
逐步看:為什麼要除以 √d_k
這裡用隨機向量做個小實驗:維度變大時,內積的分布怎麼變?不除和除以 √d_k,softmax 的結果差多少?
縮放的原因
論文的作者推測:維度大時,內積的數值也會變大,把 softmax 推到梯度很小的區域,訓練就不容易進行,所以除以 √d_k 抵銷這個效果。上面的實驗看到的是前半段:不除時分數差距太大,權重幾乎集中在一個字上。
梯度與訓練在機器學習軌的神經網路課會學到,這一軌不會用到。
實作:寫出 attention 函數
完成兩個函數,不使用迴圈:
softmax(x):把一維陣列變成權重。attention(q, K, V):照上面的四步計算,回傳(權重, 輸出向量)。
這題不呼叫模型,資料是手設的,可以自由修改來觀察結果,但比對答案時要改回原本的數字。
小測驗:注意力的計算
這段程式會印出什麼?
這段程式會印出什麼?
query、key、value 裡,哪一個是依權重加起來、成為輸出的內容?
依照論文,為什麼要除以 √d_k?
關於本課範例的權重,下面哪個說法最恰當?
重點整理
- softmax 把任意分數變成加起來等於 1 的權重;差距放大時分布變集中,縮小時變平均。
- 注意力的四步:query 和 key 做內積、除以
√d_k、softmax、對 value 加權平均。 - 自注意力讓每個位置都混入其他位置的資訊;計算本身沒有順序,所以模型另外加入位置資訊。
- 本課的向量是手設的示意值;真實模型的向量是學出來的,權重也不等於模型的理由或理解。
下一課: 模型最後要從所有 token 裡選出下一個。下一課看真實的候選機率,以及 temperature 與 top_p 怎麼影響選擇。