Transformer: Attention mechanism & Positional embedding === ## Attention mechanism 注意力機制 最基本sequence to sequence的任務的時候,會用encoder將inout sequence的內容**壓縮/轉換**成一個context vector,通常這個context vector就是inoput sequence的最後一個hidden state,因為最後一個hidden state理論上是繼承了前面所有東西的記憶(整個序列的精華/集大成),然後decoder才會用context vector去生出output sequence ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*zC4Ap5Atj_WCd3iX) :::info - 問題:記憶長期資訊很困難,而且最早的資訊會被削弱 - 解法:Attention mechanism → 不再只依賴單一 context vector,而是根據每一步的output去**動態地關注**input的不同位置 ::: ### Q, K, V 每一個 input 都有三組權重去算出 Q, K, V,其實計算方法一樣,只是關注的重點不同。 |元素 | 在 attention 裡的角色 | 比喻| | -------- | -------- | -------- | |Query (Q) | 我要找的資訊 | 你要找的主題,例如「貓的睡眠習性」 |Key (K) | 資料庫的標籤 | 每本書的目錄卡:標題、主題 |Value (V) | 實際要讀取的資訊 | 書的內容(正文) 1. Key(K)用來決定「誰重要」 每個詞的 Key 向量會和當前詞的 Query 做比對(內積), 如果相似度(分數)不高 → 表示這個詞「對現在不重要」。 2. Score 不高 → Value 的內容就「貢獻得少」 雖然每個詞都有 Value,但 attention 機制會根據比對分數(attention weight)來加權。 所以如果你的 Key 不吸引人,你的 Value 就不會被「看重」。 :::success Key 決定你能不能「被注意」,Value 決定你「提供了什麼」—— 被注意得不夠,內容再好也沒人聽你說。 ::: ### 加入 Attention 的 Encoder-Decoder 訓練流程 :::info - Q (Query):Decoder 的當前 hidden state - K (Key):Encoder 每個詞的 hidden state - V (Value):Encoder 的 hidden state 經過加權 ::: 1. Encoder 輸入序列:每個詞會產生一個 hidden state:$[h₁, h₂, ..., hₙ]$ → 這些是 Key 2. Decoder 產生第 $t$ 個輸出詞:有一個 decoder hidden state $s_t$ → 這是 Query($t$ 指得是時間步) 3. 計算每個 Encoder hidden state 的 score(相似度加權分數) > $score_i = similarity(s_t, h_i)$ 4. 對所有 score 做 softmax 得到注意力權重 $α$:每個 $α_i$ 表示input sequence 中第 $i$ 個詞對應output的「重要性」 5. 用 $α$ 加權 Encoder 的 hidden states 得到 context vector → 這裡得到 Value > $context = Σ α_i * h_i$ 6. Decoder 用這個 context + $s_t$ 預測下一個詞 ![](https://miro.medium.com/v2/resize:fit:1100/format:webp/0*yeaVRZ3C9Cx5gCfu =50%x) <p align="center" style="color: gray; font-size: 0.9em;"> 注意力架構圖 </p> align="center"> 每一次要計算下一步時,會用前一步來跟encoder的hidden state算score,然後得到context vector然後再產出該時間步的結果。 ![IMG_1523](https://hackmd.io/_uploads/HJ_GbVk1ee.jpg) ### Score的常見算法 1. 內積相似度 Dot product similarity 計算 Q 和 K 變換後的向量之間的內積來衡量它們的相似度。內積越大,表示越相似。 ![截圖 2025-04-06 下午3.46.01](https://hackmd.io/_uploads/r1CvZ3yCkl.png =50%x) 2. 餘弦相似度 Cosine similarity 考慮到向量的長度,計算兩個向量之間夾角餘弦值,夾角越小方向越一致,相似度越高。 ![截圖 2025-04-06 下午3.46.08](https://hackmd.io/_uploads/r1y9b2y0yx.png =50%x) 3. 矩陣乘法調整 Linear transformation 將原始的 Q 和 K 透過機器自學的參數矩陣 𝑊 進行線性調整之後再求內積相似度。 ![截圖 2025-04-06 下午3.46.14](https://hackmd.io/_uploads/Sk4MG2JCye.png =50%x) 4. 向量拼接 Concatenation 先將 Q 和 K 拼接(concat)起來,然後經過自學的參數矩陣 𝑊 進行線性調整,再透過 activation function 做非線性的轉換,最後乘以一個權重矩陣 𝑉 生成最終的輸出,使得輸出結果回到跟輸入序列相同的長度。 ![截圖 2025-04-06 下午3.46.23](https://hackmd.io/_uploads/BJ1EX2JAye.png =50%x) ## Self-attention vs. Multi-head attention 1. Q 和 K 做內積($q ⋅ k$) - 看 Query 和每個 Key 的相似度(關聯性高不高)。 - 相似度越高,表示越「值得注意」。 2. 算出每個詞的注意力權重(softmax) - 把前面算的的相似度轉成 0~1 之間的比重。 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*9v4LfghlGYynhMYEAr1GMQ.png) 3. 權重乘上 Value,加總起來,最後得到最終的注意力輸出。 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*fEzNWgidGdKx4Xez4C0_TQ.png) 在上圖就只有處理一個組input $a^1$ 還有其 $q^1, k^1, v^1$。 如果同時處理多組input 就會是multi-head attention,如下圖,不同組input也會去各自捕捉他們之間的關聯。 ![](https://i.imgur.com/3n8xNLP.png) 多個平行的 self-attention 計算出來的注意力輸出,最後會全部 concat 起來,再做線性轉換的處理後成為最終結果。 ![](https://i.imgur.com/4jfotwi.png) :::info 小比喻: - Self-attention 就像是「一個人」用「一種視角」去理解一段文字。 - Multi-head attention 就像是有很多人,每個人用自己獨特的觀點,一起來讀同一段文字,最後綜合大家的意見。 ::: ## Positional embedding Transformer 不像 RNN、LSTM 那樣有「時間順序」的概念,它在處理句子時是一次看。所一整句,所以會需要positional embedding 去處理詞的「順序」。 Positional embedding 就是把「詞的位置」編碼成一個向量,然後加到詞的語意向量上。 ![](https://ithelp.ithome.com.tw/upload/images/20201003/20129616rWuOBa4aY7.png) ### Fixed vs. learnable 1. Fixed Positional Encoding(固定位置編碼) 用 sine 和 cosine 函數來產生固定的位置向量: ![](https://ithelp.ithome.com.tw/upload/images/20201003/20129616y6k7dWsJcW.png) - 優點:因為是用公式算,可以直接處理比訓練時「更長的句子」,不會因為沒看過的位置就失效(泛化能力好) - 缺點:無法針對特定語料調整位置資訊 2. Learnable Positional Encoding(可學習式位置編碼) 用一個「位置查表」的方式,跟詞的 embedding 一樣,讓模型自己學每個位置的向量。 - 優點:可以針對特定語言、文本結構、自定義任務去調整位置夾帶的信息 - 缺點:無法泛化到更長句子(例如:如果訓練時只給模型看過 512 個位置,它就不知道第 513 個詞該用什麼位置向量) ### Absolute vs. relative 1. Absolute Positional Encoding(絕對位置編碼) 每個固定位置(例如:第一個詞、第二個詞…)都對應到一個獨特的向量,這種編碼通常會是前面的固定位置編碼的方式。 - 優點:實作簡單,結構清楚(使用sin, cos 的數學公式計算)能處理任意長度句子 - 缺點:較不擅長捕捉詞與詞間的「相對關係」,對長距離依賴效果有限(例如:當主詞跟動詞離得很遠的時候,就很難抓到這兩個字的語意關聯、結構) 2. Relative Positional Encoding(相對位置編碼) 這種編碼強調序列元素之間相對距離。所以不是關注字詞是「句子的第幾個詞」,而是更在意兩個字詞之間「相隔幾個位置」。 - 優點:更自然地模擬語言中的「關係性」 - 缺點:實作較複雜,需要額外設計查表或邏輯 --- **後記想法** 模型本身並不會知道什麼是「問」或「答」的概念,它只是學到用怎樣的向量運算組合能讓最後的 loss 達到最小。 這些語意功能的角色(Query, Key Value)都是「 emergent behavior」(從訓練中自發出現的行為)是模型在大量語料中學出來的「有用結構」,人類再幫它貼上合理的解釋。 Transformer 的 Attention 機制就像一台數學工廠: - 它並不知道什麼叫語意、問答、重點 - 它只是根據數據學會了:「我這樣計算,效果就比較好」 - 我們人類從外面觀察它的行為,說:「喔~它在做類似問問題、找重要資訊的事欸~」 ## References 1. [28. 注意力機制(Attention mechanism)](https://medium.com/programming-with-data/28-%E6%B3%A8%E6%84%8F%E5%8A%9B%E6%A9%9F%E5%88%B6-attention-mechanism-f3937f289023) 2. [深入理解 Attention 機制(上)- 起源](https://medium.com/@funcry/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-attention-%E6%A9%9F%E5%88%B6-b40be0985e84) 3. [Attention Mechanism(注意力機制)](https://marssu.coderbridge.io/2020/11/30/attention-sequence-to-sequence/) 4. [ML : Self-attention](https://medium.com/@x02018991/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-self-attention-fa6897080a0a) 5. [[AI學習筆記] 李宏毅課程 Multi-head Self-Attention 機制解說](https://andy6804tw.github.io/2021/05/03/ntu-multi-head-self-attention/) 6. [[鐵人12:Day 20] Transformer 3:模型架構 (2)](https://ithelp.ithome.com.tw/m/articles/10248303) 7. [Positional Encoding](https://www.kaggle.com/code/lianghsunhuang/positional-encoding#%E6%8E%A2%E7%B4%A2%E4%BD%8D%E7%BD%AE%E7%B7%A8%E7%A2%BC%EF%BC%9A%E7%B5%95%E5%B0%8D%E8%88%87%E7%9B%B8%E5%B0%8D%E4%BD%8D%E7%BD%AE%E7%B7%A8%E7%A2%BC%E7%9A%84%E7%90%86%E8%A7%A3%E8%88%87%E5%AF%A6%E7%8F%BE)