Transformer的核心理解起來也不難,但為什么這么強呢?
本文經自動駕駛之心公眾號授權轉載,轉載請聯系出處。
Transformer的強大在于它的設計。高票答案已經詳細講解了Transformer在長距離依賴建模方面的能力,我就試著從設計方面補充一下“Transformer能夠work很好”的其他幾個原因吧。拋磚引玉,大家輕拍。
并行計算 + 強大的表達與泛化能力
傳統的循環神經網絡(RNN)在處理序列數據時需要按順序逐步計算,無法并行。而Transformer可以做到”同時計算所有位置的輸出”!它是怎樣做到的呢?
上圖是論文中 Transformer 的內部結構圖,左側為 Encoder block,右側為 Decoder block。
首先,Transformer使用位置編碼(Position Encoding)來記錄各單詞在語句中的位置或次序,位置編碼的值遵循一定規則(如由三角函數生成),每個源單詞(或目標單詞)的Word Embedding與對應的位置編碼相加(位置編碼向量與Word Embedding的維度相同)得到自己的編碼,并最終成為Encoder的輸入。
Transformer的Encoder組件由6個相同結構的Encoder串聯而成,Decoder組件也是由6個結構相同的Decoder串聯而成。最后一層Encoder的輸出將傳入Decoder的每一層。
進一步看,每個Encoder中的Multi-Head Attention,通過多個獨立的注意力頭并行計算,可以從不同的子空間中學習到不同的表示,從而使模型擁有關注語言不同方面的能力。下面是Multi-Head Attention的內部結構,
從上圖可以看到 Multi-Head Attention 包含多個 Self-Attention 層,首先將輸入X分別傳遞到 h 個不同的 Self-Attention 中,計算得到 h 個輸出矩陣。
然后,Multi-Head Attention 將它們拼接在一起 (Concat),傳入一個Linear層,得到 Multi-Head Attention 最終的輸出Z
Linear層(全連接的神經網絡層)的映射是非線性變換,它的作用是對輸入進行維度變換和特征提取。線性變換只能進行簡單的比例縮放和平移操作,而非線性變換可以引入更多的復雜性,例如曲線形狀、峰值和谷底等。這樣可以使模型更加靈活,能夠更好地適應不同類型的數據分布,從而增加模型的表達能力。
Multi-Head Attention 上方還包括一個 Add & Norm 層,Add 表示殘差連接 (Residual Connection) 用于防止網絡退化(這也是RNN的頑疾),而Norm 表示 Layer Normalization,用于對每一層的激活值進行歸一化,也就是將每一層神經元的輸入都轉成均值方差都一樣的,這樣可以加快收斂。
除了多頭機制,Transformer還使用了Feed Forward前饋網絡,它由兩個線性變換和一個非線性激活函數(通常是ReLU)組成。輸入的詞向量經過一個線性變換,將其映射到一個更高維度的空間。然后,通過ReLU進行非線性變換。最后,再經過一個線性變換,將其映射回原始的詞向量維度。通過多層前饋網絡的堆疊,模型可以學習到更復雜的特征表示,從而更好地捕捉輸入序列中的語義信息。
Transformer架構強大的表達與泛化能力使之成為GPT等大語言模型的底層核心,如果你也對Transformer和大模型感興趣,想掌握使用和開發大模型的必備技巧,最終進入這一領域,那么選擇一門相應的網課是比較快的路徑。
自注意力模型的設計
傳統序列模型在處理長序列時,由于信息的傳遞是依次進行的,容易出現梯度消失或梯度爆炸的問題,同時也無法充分捕捉到序列中不同位置之間的依賴關系。
通過引入注意力機制,我們可以對每個位置的注意力權重進行獨立計算,不需要像傳統序列模型那樣依次進行計算,從而實現全局的信息交互。這也使得自注意力模型在處理長序列時具有更高的效率。
在這個模型中,MatMul是矩陣乘法的操作。具體來說,MatMul將查詢矩陣Q與鍵矩陣K相乘,得到一個注意力分數矩陣。這個注意力分數矩陣表示了查詢與每個鍵之間的相關性或相似度,從而決定在注意力機制中分配多少注意力權重給每個鍵對應的值(Value)。通過將注意力分數矩陣與值矩陣V相乘,可以得到最終的注意力表示。
Scale是指對注意力分數進行縮放的操作。在計算注意力分數時,通常會將點積的結果除以一個縮放因子,這個縮放因子是注意力機制中的一個超參數??s放的目的是為了控制注意力分數的大小,使其更穩定和可解釋。
具體來說,計算注意力分數的公式為:Attention(Q, K) = softmax(QK^T / sqrt(d_k)) * V
其中,Q表示查詢(Query),K表示鍵(Key),V表示值(Value),d_k表示鍵的維度。在計算注意力分數時,將點積結果除以sqrt(d_k)來進行縮放。這個縮放因子可以使得注意力分數的范圍更合適,避免了點積結果過大或過小的情況。
較大的縮放因子可以增加注意力分數的范圍,使得模型更加關注不同位置之間的差異;較小的縮放因子可以減小注意力分數的范圍,使得模型更加平均地分配注意力權重。
這種注意力機制不依賴于外部的上下文信息,而是通過內部的自我關注來計算注意力權重。因此,它被稱為self-attention自注意力機制。
Mask是一種用于控制注意力機制的操作。它被用來屏蔽或限制模型在計算注意力分數時對某些位置的關注。在自注意力模型中,常見的mask操作有兩種:padding mask和sequence mask。
- Padding mask(填充掩碼):在處理變長序列時,為了保持序列的長度一致,通常會在序列的末尾添加一些特殊的填充符號(如0)。Padding mask的作用是將這些填充符號對應的位置的注意力分數設為一個很小的值(如負無窮),從而使模型在計算注意力分數時忽略這些padding符號。這樣可以避免填充的內容對計算產生干擾。
- Sequence mask(序列掩碼):在某些任務中,為了避免模型在生成序列時看到未來的信息,需要對注意力分數進行掩碼操作。Sequence mask的作用是將當前位置之后的位置的注意力分數設為一個很小的值,從而使模型只能關注當前位置之前的信息。這樣可以保證模型在生成序列時只依賴于已經生成的部分,而不會受到未來信息的影響。
通過使用mask操作,自注意力模型可以更好地處理變長序列和生成任務,并且能夠控制模型在計算注意力分數時的關注范圍。不同的任務和應用場景可能需要不同類型的mask操作。
比如在機器翻譯任務中,我們希望將一個源語言句子逐步翻譯成目標語言句子。使用sequence mask可以確保模型只能依賴于之前已生成的部分,逐步生成目標語言句子。
而在文本分類任務中,輸入的文本長度可能不一致。使用padding mask可以將填充部分的注意力權重設為0,忽略填充部分的影響,確保模型只關注真實的文本內容。
演化
如今當我們談論Transformer時,其實是在談論一個大家族。2018年年初,AllenNLP發布了一個新模型ELMo。ELMo是一種比Word2vec更好的訓練詞向量的模型。而之后的BERT、RoBERTa、XLNet、T5、ALBERT、GPT-3等模型從自然語言理解及自然語言生成等角度,不斷刷新自然語言處理領域任務的SotA(State of the Art)表現。
Transformer架構也像其他AI新技術一樣,會不斷迭代和更新,如果你也對Transformer大家族感興趣,想進入大模型開發這一熱門領域,那么通過學習一門靠譜的網課會是比較快的路徑。