
=================================================
NLP 問題從 LSTM 等 RNN 模型轉向 Transformer=================================================
●RNN的功能類似前饋神經網絡,是處理序列資料的首選方法,其特點是輸入
具有特定的順序,一次處理一個元素。
●RNN 的主要問題是什麼?它們對於 NLP 任務來說相當無效,
主要有兩個原因:
1.它們按順序逐一處理輸入資料。這種循環過程不使用為平行運算而設計的
現代圖形處理單元 (GPU),因此導致此類模型的訓練速度非常緩慢。
2.當元素彼此相距較遠時,它們會變得非常無效。這是因為訊息在每一步都會
傳遞,而鏈條越長,訊息在鏈條中失去的可能性就越大。
●在 NLP 中,從 LSTM 等循環神經網路 (RNN) 轉向 Transformers 的驅動力
在於這兩個主要問題,而 Transformers 能夠利用注意力機制的改進來評估
這兩個問題:
1.注意特定的詞語,無論它們有多長。
2.提高性能速度。
接下來我們來看看Transformer的工作原理。
================================================
Transformer 的工作原理
================================================
●Transformer的架構
Transformer 最初設計用於序列傳導或神經機器翻譯,擅長將輸入序列轉換為
輸出序列。它是第一個完全依賴自註意力機制來計算輸入和輸出表徵的傳導模
型,無需使用序列對齊的 RNN 或卷積。
Transformer 架構的主要核心特徵在於其保留了編碼器-解碼器模型。
如果我們開始將用於語言翻譯的 Transformer 視為一個簡單的黑盒子,它將以
一種語言(例如英語)的句子作為輸入,並輸出其英語翻譯。

然而,編碼器和解碼器實際上都是一個多層堆疊(每層的數量相同)。
所有編碼器都具有相同的結構,輸入進入每個編碼器並傳遞到下一個編碼器。
所有解碼器也具有相同的結構,並從上一個編碼器和上一個解碼器獲取輸入。
原始架構由 6 個編碼器和 6 個解碼器組成,但我們可以複製任意數量的層。
因此,我們假設每個編碼器和解碼器都有 N 層。

現在我們對整個 Transformer 架構有了大致的了解,接下來讓我們專注於編碼
器和解碼器,以便更好地理解它們的工作流程:
==============================================
編碼器工作流程
==============================================
編碼器是 Transformer 架構的基本元件。編碼器的主要功能是將輸入的 token
轉換為上下文相關的表示。與早期獨立處理 token 的模型不同,Transformer
編碼器會捕捉每個 token 相對於整個序列的上下文。
其結構組成如下:

因此,讓我們將其工作流程分解為最基本的步驟:
●編碼器輸入
步驟 1 - 輸入Embedding(嵌入)
嵌入僅發生在最底層的編碼器。編碼器首先使用嵌入層將輸入標記(單字或
子單字)轉換為向量。這些嵌入捕捉標記的語義,並將其轉換為數值向量。
所有編碼器都會接收一個向量列表,每個向量的大小為 512(固定大小)。
在底部編碼器中,該向量是詞嵌入,但在其他編碼器中,該向量是其正下方
編碼器的輸出。

步驟 2 - 位置編碼
由於 Transformer 不像 RNN 那樣具有循環機制,因此它們使用添加到輸入
嵌入中的位置編碼來提供有關序列中每個標記位置的資訊。這使它們能夠
理解句子中每個單字的位置。
為此,研究人員建議採用各種正弦和餘弦函數的組合來創建位置向量,
從而可以將該位置編碼器用於任意長度的句子。
在這種方法中,每個維度都由波的唯一頻率和偏移量表示,其值範圍
從 -1 到 1,有效地表示每個位置。

步驟 3 - 編碼器層堆疊
Transformer 編碼器由一堆相同的層組成(原始 Transformer 模型中有 6 個)。
編碼器層用於將所有輸入序列轉換為連續的抽象表示,該表示封裝了從整個序列中學習到
的資訊。此層包含兩個子模組:
(1)多頭注意力機制。
(2)完全連接的網路。
此外,它在每個子層周圍加入了殘差連接,然後進行層規範化。

步驟 4 多頭自註意力機制
在編碼器中,多頭注意力機制利用了一種稱為「自註意力」的特殊注意力機制。
這種方法使模型能夠將輸入中的每個單字與其他單字關聯起來。
例如,在一個給定的例子中,模型可能會學習將“are”與“you”聯繫起來。
這種機制允許編碼器在處理每個 token 時專注於輸入序列的不同部分。
它根據以下因素計算注意力分數(Q,K,V):
(1)Q (Question) :查詢是一個向量,它代表注意力機制中輸入序列中的特定單字或標記。
(2)K (Key) : 在注意力機制中也是一個向量,對應輸入序列中的每一個單字或
token。
(3)V (Value) : 每個值都與一個Key相關聯,並用於建立注意力層的輸出。
當 Q 和K 匹配良好時,這基本上意味著它們具有較高的注意力得分V,相應的
值會在輸出中得到強調。
第一個自注意力模組使模型能夠從整個序列中捕獲上下文資訊。它並非執行
單一的注意力函數,而是將Q、K和 V 進行 h 次線性投影。在每個投影版本
的Q、K和 V 上,注意力機制都會並行執行,產生 h 維的輸出值。

【TIPS】Attension與 CrossAttention之比較
在深度學習中,自注意力關注單一序列內的關係,而交叉注意力則將兩個不同序列之間的
元素關聯起來 ,通常用於在機器翻譯等任務中將解碼器的輸出與編碼器的輸入對齊。

●矩陣乘法 (MatMul) - 查詢和鍵的點積
一旦Q、K和 V 向量通過線性層,就會在 Q 和 K 之間執行點積矩陣乘法,
從而建立分數矩陣。
分數矩陣決定了每個單字對其他單字的強調程度。因此,每個單字都會被賦予
一個相對於同一時間步長內其他單字的分數 V。
分數 V 越高,表示關注度越高。該程序有效地將 Q 映射到其對應的 K。

●降低注意力分數的幅度
然後,透過將分數除以 Q 和 K 向量維度的平方根來縮小分數。執行此步驟是
為了確保梯度更穩定,因為 V 的乘積可能會導致過大的效應。

● 將Softmax 應用於調整後的分數
softmax函數應用於調整後的分數 V 以獲得注意力權重。
這會產生介於0到1之間的機率值。
softmax函數會強調較高的分數,同時削弱較低的分數,
從而增強模型有效確定哪些單字應該獲得更多注意力的能力。

●將Softmax 結果與值向量結合
注意力機制的下一步是將來自softmax函數的權重乘以 V 值向量,得到輸出向量。
在這個過程中,只有那些softmax分數高的單字才會保留。最後,這個輸出向量
會被輸入到線性層進行進一步處理。

最後我們就得到了Attention機制的輸出!
那麼,您可能想知道為什麼它被稱為多頭注意力?
請記住,在所有流程開始之前,我們會將 Q、K和 V值分解 h 次。這個過程被
稱為自注意力機制 (self-attention),它在每個較小的階段或「頭部」中分別進
行。每個頭部獨立運作,產生一個輸出向量。
這個整合最終會經過一個線性層,就像一個過濾器,對它們的整體性能進行
微調。其奧妙之處在於每個頭部學習的多樣性,從而以穩 K 且多方面的理解編碼器。
●標準化和殘差連接
編碼器層中的每個子層之後都會進行標準化步驟。此外,每個子層的輸出都會
添加到其輸入(殘差連接),以幫助緩解梯度消失問題,從而實現更深層的模
型。此過程也將在前饋神經網路之後重複進行。

●前饋神經網絡
標準化殘差輸出的旅程將繼續,因為它將透過逐點前饋網路進行導航,
這是進一步細化的關鍵階段。
想像一下,這個網路是由兩個線性層組成的,中間嵌入一個 ReLU 活化函數,
作為橋樑。處理完成後,輸出會走上一條熟悉的路徑:它會回環並與逐點前饋
網路的輸入合併。
這次重聚之後,雙方將進行新一輪的正常化,以確保一切都調整好,並為
下一步同步進行。

●編碼器輸出
最終編碼器層的輸出是一組向量,每個向量都以上下文理解來表示輸入
序列。此輸出隨後被用作 Transformer 模型中解碼器的輸入。
這種仔細的編碼為解碼器鋪平了道路,引導它在解碼時注意輸入中的正確單字。
你可以把它想像成建造一座塔,上面可以堆疊 N 個編碼器層。堆疊中的每一層
都有機會探索和學習注意力機制的不同方面,就像知識層一樣。這不僅是理解,
還能顯著增強 Transformer 網路的預測能力。
===================================================
解碼器工作流程
===================================================
●解碼器的功能
主要在於產生文字序列。與編碼器類似,解碼器也配備了一組類似
的子層。它擁有兩個多頭注意力層和一個逐點前饋層,並且每個子層還包括一個
周圍的殘差連接及標準化步驟。

這些組件的功能類似於編碼器的層,但有一個不同之處:解碼器中的每個多頭
注意層都有其獨特的使命。
解碼器過程的最後涉及一個線性層,作為分類器,頂部有一個softmax函數來
計算不同單字的機率。
Transformer 解碼器具有專門設計的結構,透過逐步解碼編碼資訊來產生
此輸出。
值得注意的是,解碼器以自回歸的方式運行,並以起始標記啟動其進程。
它巧妙地使用先前生成的輸出列表作為輸入,並與編碼器的輸出(其中包含
來自初始輸入的注意力資訊)協同工作。
這種連續的解碼過程一直持續到解碼器到達一個關鍵時刻:產生一個標記,
標誌著輸出創建結束。
●解碼器輸入
步驟 1. 輸出嵌入
在解碼器的起始行,該過程與編碼器的過程相同。在這裡,輸入首先經過一個
嵌入層
步驟 2. 位置編碼
嵌入之後,與編碼器類似,輸入經過位置編碼層。此序列旨在產生位置嵌入。
然後將這些位置嵌入引入解碼器的第一個多頭注意層,在那裡精確計算特定於
解碼器輸入的注意分數。
步驟 3. 解碼器層堆疊
解碼器由一堆相同的層組成(原始 Transformer 模型中為 6 層)。每層包含三個
主要子組件:
步驟 4. 掩蔽自註意力機制
這類似於編碼器中的自註意力機制,但有一個關鍵的區別:它阻止位置關注
後續位置,這意味著序列中的每個單字不受未來標記的影響。
例如,在計算單字「are」的注意力分數時,重要的是「are」不會被序列中的
後續單字「you」所影響。

步驟 5. 編碼器-解碼器多頭注意力或交叉注意力
在解碼器的第二個多頭注意力層中,我們看到了編碼器和解碼器元件之間獨特的
相互作用。在這裡,編碼器的輸出同時充當查詢和鍵的角色,而解碼器第一個多
頭注意力層的輸出則充當值。
這種設定有效地將編碼器的輸入與解碼器的輸入對齊,使解碼器能夠識別和強調
編碼器輸入中最相關的部分。
接下來,第二層多頭注意力的輸出將透過逐點前饋層進行細化,從而進一步增強
處理。

在這個子層中,查詢來自上一個解碼器層,鍵和值來自編碼器的輸出。這使得解
碼器中的每個位置都能專注於輸入序列中的所有位置,從而有效地將來自編碼器
的信息與解碼器中的信息整合在一起。
步驟 6 前饋神經網絡
與編碼器類似,每個解碼器層都包含一個完全連接的前饋網絡,分別且相同地應
用於每個位置。
步驟 7 線性分類器和 Softmax 產生輸出機率
資料通過變換器模型的旅程最終通過最後一個線性層,該層起到分類器的作用。
此分類器的大小對應於所涉及的類別總數(詞彙表中包含的單字數)。
例如,在 1000 個不同的類別代表 1000 個不同單字的場景中,分類器的輸出
將是一個包含 1000 個元素的陣列。
然後將該輸出引入softmax層,將其轉換為一系列機率分數,每個分數介於0到
1之間。這些機率分數中的最高值是 K,其對應的索引直接指向模型預測為序列
中的下一個單字。

●標準化和殘差連接
每個子層(掩蔽自注意力、編碼器-解碼器注意力、前饋網路)後面都有一個標準化
步驟,每個子層還包括一個周圍的殘差連接。
●解碼器的輸出
最後一層的輸出被轉換成預測序列,通常透過線性層然後是softmax來產生詞
彙的機率。
解碼器在其操作流程中,將新產生的輸出合併到其不斷增長的輸入清單中,然後
繼續解碼過程。此循環重複進行,直到模型預測出特定的標記,並發出完成訊號。
預測機率最高的標記被指定為結論類,通常由結束標記表示。
再次提醒,解碼器並不局限於單層。它可以由 N 層構成,每一層都基於從編碼器
及其前幾層接收到的輸入建構。這種分層架構允許模型分散關注點,並在其注意
力頭中提取不同的注意力模式。
這種多層次的方法可以顯著增強模型的預測能力,因為它對不同的注意力組合有
了更細緻的理解。
最終的架構如下圖(來自原始論文)

===============================================
●結論
總而言之,Transformers 已經成為人工智慧 NLP 領域的一項重大突破。
這些模型透過其獨特的自註意力機制有效地管理序列數據,其性能超越了傳統的
RNN。它們能夠更有效率地處理長序列,並實現資料並行處理,從而顯著加快了
訓練速度。
谷歌的 BERT 和 OpenAI 的 GPT 系列等先驅模型體現了 Transformers 在增強搜
尋引擎和生成類人文本方面的變革性影響。
因此,它們已成為現代機器學習中不可或缺的一部分,推動了人工智慧的發展,
並開闢了技術進步的新途徑。
本文摘譯自 https://www.datacamp.com/tutorial/how-transformers-work
========================================
【視頻】Illustrated Guide to Transformers Neural Network:
A step by step explanation
【視頻】How Attention Mechanism Works in Transformer Architecture
【視頻】Cross Attention - Method Explanation - Math Explained
【視頻】Coding a Transformer from scratch on PyTorch,
with full explanation, training and inference.
【TIPS】此一視頻的完整程式碼請見 :
https://github.com/hkproj/pytorch-transformer?tab=readme-ov-file
