深度解析:從自注意力到編碼器-解碼器實戰(zhàn))
1. 項目概述為什么Transformer值得你花時間深挖如果你正在學習深度學習尤其是自然語言處理或者計算機視覺那么“Transformer”這個詞你一定繞不過去。我第一次系統(tǒng)學習Transformer就是跟著李宏毅老師的課程和筆記。當時的感覺是這個模型結(jié)構(gòu)清晰但細節(jié)極多從自注意力機制到位置編碼從編碼器-解碼器架構(gòu)到各種變體每一個環(huán)節(jié)都藏著設(shè)計者的巧思。很多人覺得Transformer難是因為它不像CNN或RNN那樣有直觀的“局部感受野”或“時間步”概念。但恰恰是這種擺脫了傳統(tǒng)歸納偏見的架構(gòu)讓它成為了一個強大的通用特征提取器從文本翻譯到圖像分類再到今天的多模態(tài)大模型幾乎無處不在。這份筆記的核心價值在于它不僅僅是公式的羅列而是試圖串聯(lián)起“為什么這么設(shè)計”的邏輯鏈條。對于初學者它能幫你建立對Transformer的整體認知理解自注意力如何實現(xiàn)全局依賴建模對于有一定基礎(chǔ)的學習者它能帶你深入理解層歸一化、殘差連接、前饋網(wǎng)絡(luò)等子模塊的設(shè)計精妙之處以及它們?nèi)绾喂餐饔脕矸€(wěn)定深層網(wǎng)絡(luò)的訓練。無論是想看懂論文里的模型圖還是想親手實現(xiàn)一個簡易的Transformer這份筆記都能提供一個扎實的起點。接下來我會結(jié)合李老師的講解框架和我自己的實踐體會帶你拆解Transformer的每一個核心部件。2. 核心架構(gòu)全景與設(shè)計哲學拆解2.1 從序列建模的困境到自注意力的破局在Transformer出現(xiàn)之前處理序列數(shù)據(jù)如句子、時間序列的主流是循環(huán)神經(jīng)網(wǎng)絡(luò)RNN及其變體LSTM、GRU。RNN的核心問題是順序計算帶來的低效——你必須等前一個時間步計算完才能計算下一個這無法利用現(xiàn)代GPU的大規(guī)模并行計算能力。此外盡管LSTM通過門控機制緩解了長程依賴問題但對于非常長的序列信息在一步步傳遞中仍然會衰減或爆炸。Transformer的答案非常直接拋棄循環(huán)完全依賴注意力機制特別是自注意力來建立序列中所有元素兩兩之間的關(guān)系。你可以把它想象成在一個會議室里開會。RNN的模式是每個人只能聽前一個人說完再輪到自己發(fā)言。而Transformer的模式是會議一開始每個人同時將自己想說的Value寫下來同時也會準備一個關(guān)于“我是誰”的自我介紹Query和一個關(guān)于“我想聽誰”的意向表Key。然后每個人通過對比自己的Query和所有人的Key來決定應(yīng)該從每個人的發(fā)言Value中聽取多少信息。這個過程是同時發(fā)生的完美并行。這種設(shè)計的直接優(yōu)勢是極高的并行度序列中所有位置的Query-Key-Value計算可以同時進行。全局視野每個輸出位置都能直接“看到”輸入序列的所有位置一步到位建立長程依賴避免了信息傳遞的衰減??山忉屝宰⒁饬?quán)重矩陣可以直觀地展示模型在處理一個詞時更“注意”句子中的哪些其他詞。2.2 Encoder-Decoder框架的Transformer實現(xiàn)Transformer整體采用了經(jīng)典的編碼器-解碼器架構(gòu)但內(nèi)部全部由自注意力層和前饋神經(jīng)網(wǎng)絡(luò)層堆疊而成。編碼器的作用是將輸入序列如一個英文句子映射為一個蘊含了上下文信息的連續(xù)表示序列。一個編碼器層由兩個子層構(gòu)成多頭自注意力層讓序列中的每個詞都能與其他所有詞交互信息。前饋神經(jīng)網(wǎng)絡(luò)層一個獨立作用于每個位置的全連接網(wǎng)絡(luò)通常是兩層MLP中間有一個ReLU激活用于進行特征變換。每個子層外面都套著一個“殘差連接”和“層歸一化”即LayerNorm(x Sublayer(x))。這是穩(wěn)定深層網(wǎng)絡(luò)訓練的關(guān)鍵我們后面會詳細講。解碼器的作用是基于編碼器的輸出和已生成的部分輸出序列來生成下一個詞或標記。它比編碼器多了一層注意力機制帶掩碼的多頭自注意力層確保在預(yù)測第i個位置時只能“看到”第1到i-1個位置的信息防止信息泄露這是自回歸生成的關(guān)鍵。多頭交叉注意力層它的Query來自解碼器上一層的輸出而Key和Value來自編碼器的最終輸出。這讓解碼器在生成每一個詞時都能有選擇地聚焦于輸入序列的相關(guān)部分。前饋神經(jīng)網(wǎng)絡(luò)層與編碼器中的相同。編碼器和解碼器都可以堆疊N層原論文中N6通過層層抽象提取越來越復(fù)雜的特征和關(guān)系。注意很多初學者容易混淆“自注意力”和“交叉注意力”。簡單記法自注意力的Query, Key, Value都來自同一序列要么全是輸入要么全是已生成的輸出交叉注意力的Query來自一個序列如解碼器Key和Value來自另一個序列如編碼器輸出。3. 核心組件深度解析與實操要點3.1 自注意力機制從Scaled Dot-Product說起自注意力是Transformer的靈魂。它的計算過程可以分解為以下幾步我們以一個序列長度為n特征維度為d_model的輸入X為例線性變換生成Q, K, V這是第一步也是決定模型容量的一步。# 假設(shè) X 的形狀為 (n, d_model) # 定義三個權(quán)重矩陣 W_Q, W_K, W_V形狀均為 (d_model, d_k) 或 (d_model, d_v) # 通常 d_k d_v d_model / h其中h是注意力頭數(shù) Q X W_Q # 形狀 (n, d_k) K X W_K # 形狀 (n, d_k) V X W_V # 形狀 (n, d_v)這里W_Q,W_K,W_V是可學習的參數(shù)矩陣。它們的作用是將輸入投影到不同的“語義空間”Query空間用來詢問、Key空間用來被匹配、Value空間承載實際信息。計算注意力分數(shù)Score計算每個Query對所有Key的匹配程度。# 計算點積分數(shù)矩陣形狀為 (n, n) scores Q K.T # (n, d_k) (d_k, n) - (n, n)點積越大表示Query和Key的向量方向越相似關(guān)聯(lián)度越高??s放Scale這是一個非常關(guān)鍵但容易被忽略的步驟。scaled_scores scores / sqrt(d_k)為什么需要縮放點積的結(jié)果會隨著維度d_k的增大而增大。假設(shè)Q和K的分量是獨立隨機變量均值為0方差為1那么點積結(jié)果的方差就是d_k。方差過大會導致Softmax函數(shù)的梯度變得非常小因為Softmax會將大部分概率集中到極少數(shù)值上這不利于模型訓練。除以sqrt(d_k)可以將方差拉回1左右穩(wěn)定梯度流。應(yīng)用Softmax獲取權(quán)重# 對每一行每個Query對應(yīng)的所有分數(shù)做Softmax使其和為1 attention_weights softmax(scaled_scores, dim-1) # 形狀 (n, n)現(xiàn)在attention_weights[i, j]就表示第i個位置在生成輸出時應(yīng)該“注意”第j個位置的程度。加權(quán)求和得到輸出output attention_weights V # (n, n) (n, d_v) - (n, d_v)最終每個位置的輸出都是所有位置Value向量的加權(quán)和權(quán)重由該位置與所有位置的匹配度決定。實操心得多頭注意力原論文中并沒有使用一個大的d_model維度的單頭注意力而是將其“拆分”成h個頭。具體操作是將d_model維的Q、K、V分別通過h個不同的線性變換投影到d_k,d_k,d_v維度通常d_k d_v d_model / h然后在每個頭上獨立進行上述的自注意力計算得到h個形狀為(n, d_v)的輸出。最后將這h個輸出在特征維度上拼接起來再通過一個線性層W_O映射回d_model維。為什么需要多頭這類似于CNN中的多個濾波器。不同的注意力頭可以學習到不同類型的依賴關(guān)系。例如在語言模型中有的頭可能更關(guān)注語法結(jié)構(gòu)如主謂一致有的頭可能更關(guān)注指代關(guān)系如代詞指向哪個名詞有的頭可能更關(guān)注固定搭配。多頭機制讓模型擁有更強的表征能力。3.2 位置編碼賦予序列順序信息自注意力機制本身是“排列不變”的它不考慮詞與詞之間的相對或絕對位置。打亂輸入序列的順序得到的注意力權(quán)重矩陣也會相應(yīng)打亂但計算模式不變。這對于理解語言是致命的因為“貓追老鼠”和“老鼠追貓”的意思完全不同。因此Transformer必須顯式地注入位置信息。原論文使用的是正弦余弦位置編碼PE(pos, 2i) sin(pos / 10000^(2i/d_model)) PE(pos, 2i1) cos(pos / 10000^(2i/d_model))其中pos是位置索引0, 1, 2...i是維度索引。對于每個位置pos其編碼是一個d_model維的向量每一維對應(yīng)一個不同頻率的正弦或余弦波。這種編碼方式的優(yōu)點相對位置關(guān)系可學習對于固定的偏移量kPE(posk)可以表示為PE(pos)的線性函數(shù)這意味著模型可以輕易地學會關(guān)注相對位置。能處理比訓練時更長的序列由于是確定性函數(shù)生成即使遇到訓練時未見過的更長序列也能計算出其位置編碼。注意事項位置編碼直接與詞向量相加而不是拼接。相加操作可以理解為在同一個語義空間中為詞向量附加了一個位置“偏置”?,F(xiàn)在也有很多研究使用可學習的位置編碼即一個位置嵌入矩陣這在某些任務(wù)上可能表現(xiàn)更好但失去了正弦編碼的外推性。對于初學者理解并實現(xiàn)正弦版本是更重要的。在視覺Transformer中位置編碼同樣關(guān)鍵。對于圖像需要將二維坐標映射為一維序列的位置或者使用二維的正弦編碼。3.3 殘差連接與層歸一化訓練深度網(wǎng)絡(luò)的穩(wěn)定器Transformer的編碼器和解碼器每一層都有兩個核心操作Add和Norm。這指的是殘差連接和層歸一化。它們的順序通常是LayerNorm(x Sublayer(x))也被稱為“Pre-Norm”結(jié)構(gòu)后來也有“Post-Norm”的變體。殘差連接就是將子層自注意力或前饋網(wǎng)絡(luò)的輸入x和輸出Sublayer(x)直接相加。它的核心作用是緩解深度神經(jīng)網(wǎng)絡(luò)中的梯度消失/爆炸問題。梯度在反向傳播時除了要經(jīng)過子層內(nèi)部的權(quán)重矩陣還多了一條“捷徑”——恒等映射。這確保了即使子層的梯度很小信號也能直接傳回底層使得深層網(wǎng)絡(luò)得以訓練。層歸一化是對單個樣本在特征維度上進行歸一化。對于一個特征向量x計算其均值和方差然后進行標準化最后應(yīng)用縮放和平移參數(shù)gamma和beta。LN(x) gamma * (x - mean) / sqrt(var eps) beta為什么用層歸一化而不是批歸一化批歸一化BN在同一個批次內(nèi)對每個特征通道跨樣本進行歸一化這在序列長度可變、批次大小可能較小的NLP任務(wù)中效果不穩(wěn)定。層歸一化LN只依賴單個樣本自身與批次大小無關(guān)更適合RNN、Transformer這類變長序列模型。它能穩(wěn)定每層輸入的分布加速收斂。實操心得Pre-Norm vs Post-Norm原論文Post-Normx Sublayer(LayerNorm(x))。這種結(jié)構(gòu)有時在非常深的網(wǎng)絡(luò)中訓練不穩(wěn)定?,F(xiàn)在主流Pre-NormLayerNorm(x Sublayer(x))。梯度流更順暢訓練更穩(wěn)定已成為大多數(shù)Transformer變體的默認選擇。在實現(xiàn)時務(wù)必注意這個順序。4. 前饋網(wǎng)絡(luò)、輸出層與訓練推理細節(jié)4.1 前饋神經(jīng)網(wǎng)絡(luò)位置級感知機在自注意力層之后Transformer還有一個前饋神經(jīng)網(wǎng)絡(luò)。它是一個獨立應(yīng)用于每個位置序列中的每個詞的兩層全連接網(wǎng)絡(luò)。FFN(x) max(0, xW1 b1)W2 b2其中W1將維度從d_model映射到d_ff通常d_ff 4 * d_modelW2再映射回d_model。中間使用ReLU激活。它的作用是什么自注意力層的作用是“混合”不同位置的信息可以看作一種廣義的“卷積”。而前饋網(wǎng)絡(luò)則負責對每個位置混合后的特征進行非線性變換和升維/降維增強模型的表達能力。你可以把它理解為每個詞在經(jīng)過全局信息交互后自己再進行一次深度思考。4.2 輸出層從連續(xù)向量到離散詞匯解碼器的最后一層輸出是一個d_model維的向量序列。要把它變成我們想要的詞需要經(jīng)過一個線性層和一個Softmax層。線性層一個形狀為(d_model, vocab_size)的權(quán)重矩陣W_out將每個位置的d_model維向量映射到詞匯表大小的維度上。這個操作可以理解為計算該位置對應(yīng)詞匯表中每個詞的“得分”。logits decoder_output W_out.T # 形狀 (seq_len, vocab_size)Softmax層對logits在最后一個維度詞匯表維度上應(yīng)用Softmax將其轉(zhuǎn)換為概率分布。probs softmax(logits, dim-1) # 形狀 (seq_len, vocab_size)這樣probs[i, j]就表示在第i個時間步生成詞匯表中第j個詞的概率。訓練時我們使用交叉熵損失比較模型預(yù)測的概率分布和真實的“one-hot”標簽即目標詞。同時一個重要的技巧是標簽平滑即將真實標簽的1稍微調(diào)低如0.9將剩余的0.1均勻分給其他詞這可以防止模型對預(yù)測過于自信提升泛化能力。推理時如機器翻譯、文本生成我們使用自回歸的方式。從起始符sos開始將當前已生成的序列輸入解碼器得到下一個詞的概率分布然后根據(jù)策略選取下一個詞如貪婪搜索取概率最大的或束搜索保留多個候選將其追加到序列后再輸入模型循環(huán)往復(fù)直到生成結(jié)束符eos。4.3 掩碼訓練與推理的關(guān)鍵約束Transformer中有兩種重要的掩碼填充掩碼由于批次中的序列長度不一我們需要用特殊符號pad將短序列填充到統(tǒng)一長度。在計算注意力時這些填充位置不應(yīng)該參與。具體做法是在計算Softmax之前將這些位置對應(yīng)的注意力分數(shù)設(shè)置為一個極大的負數(shù)如-1e9這樣經(jīng)過Softmax后這些位置的權(quán)重就幾乎為0。# attention_scores 形狀 (batch_size, num_heads, seq_len, seq_len) # padding_mask 形狀 (batch_size, 1, 1, seq_len) 在pad位置為True attention_scores attention_scores.masked_fill(padding_mask, -1e9)序列掩碼因果掩碼僅用于解碼器的自注意力層。為了保證自回歸屬性在預(yù)測第t個位置時模型只能“看到”第1到t-1個位置。這通過一個下三角矩陣主對角線及以上為-inf以下為0來實現(xiàn)。# 生成一個下三角布爾矩陣包含對角線 seq_len query.size(-2) causal_mask torch.tril(torch.ones(seq_len, seq_len)).bool() # 取反使得未來位置為True以便填充 -inf causal_mask ~causal_mask attention_scores attention_scores.masked_fill(causal_mask, -1e9)5. 動手實現(xiàn)一個簡易Transformer核心代碼塊理解的最好方式是實踐。下面我們用PyTorch勾勒出Transformer幾個核心組件的關(guān)鍵代碼。這不是一個完整的、可運行的模型但包含了最核心的邏輯幫助你建立代碼層面的直覺。import torch import torch.nn as nn import math class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super().__init__() assert d_model % num_heads 0 self.d_model d_model self.num_heads num_heads self.d_k d_model // num_heads # 定義線性變換層生成Q, K, V self.W_q nn.Linear(d_model, d_model) # 實際實現(xiàn)中會拆分成num_heads個這里為清晰起見 self.W_k nn.Linear(d_model, d_model) self.W_v nn.Linear(d_model, d_model) # 輸出投影層 self.W_o nn.Linear(d_model, d_model) def forward(self, query, key, value, maskNone): batch_size query.size(0) # 1. 線性投影并分頭 Q self.W_q(query).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) K self.W_k(key).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) V self.W_v(value).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2) # 2. 計算縮放點積注意力 # scores shape: (batch_size, num_heads, seq_len, seq_len) scores torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k) # 3. 應(yīng)用掩碼如果提供 if mask is not None: scores scores.masked_fill(mask 0, -1e9) # 4. Softmax得到注意力權(quán)重 attention_weights torch.softmax(scores, dim-1) # 5. 加權(quán)求和 # context shape: (batch_size, num_heads, seq_len, d_k) context torch.matmul(attention_weights, V) # 6. 合并多頭 context context.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model) # 7. 輸出投影 output self.W_o(context) return output, attention_weights class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len5000): super().__init__() pe torch.zeros(max_len, d_model) position torch.arange(0, max_len).unsqueeze(1).float() div_term torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model)) pe[:, 0::2] torch.sin(position * div_term) pe[:, 1::2] torch.cos(position * div_term) pe pe.unsqueeze(0) # shape: (1, max_len, d_model) self.register_buffer(pe, pe) # 這不是可學習參數(shù)但會隨模型保存/加載 def forward(self, x): # x shape: (batch_size, seq_len, d_model) return x self.pe[:, :x.size(1), :] class TransformerEncoderLayer(nn.Module): def __init__(self, d_model, num_heads, d_ff, dropout0.1): super().__init__() self.self_attn MultiHeadAttention(d_model, num_heads) self.feed_forward nn.Sequential( nn.Linear(d_model, d_ff), nn.ReLU(), nn.Linear(d_ff, d_model) ) self.norm1 nn.LayerNorm(d_model) self.norm2 nn.LayerNorm(d_model) self.dropout nn.Dropout(dropout) def forward(self, src, src_maskNone): # Pre-Norm 結(jié)構(gòu) # 1. 多頭自注意力子層 attn_output, _ self.self_attn(src, src, src, src_mask) src src self.dropout(attn_output) # 殘差連接 src self.norm1(src) # 層歸一化 # 2. 前饋網(wǎng)絡(luò)子層 ff_output self.feed_forward(src) src src self.dropout(ff_output) # 殘差連接 src self.norm2(src) # 層歸一化 return src代碼解讀與注意事項分頭操作在MultiHeadAttention中我們通過.view()和.transpose()操作將(batch_size, seq_len, d_model)的張量轉(zhuǎn)換為(batch_size, num_heads, seq_len, d_k)這樣每個頭就能獨立計算注意力。掩碼應(yīng)用時機在計算完注意力分數(shù)scores之后Softmax之前應(yīng)用掩碼。將需要屏蔽的位置填充一個極大的負值-1e9Softmax后這些位置的權(quán)重會趨近于0。位置編碼的注冊PositionalEncoding中的pe是一個緩沖區(qū)使用register_buffer注冊。這意味著它不是模型的可學習參數(shù)但會成為模型狀態(tài)字典的一部分隨模型一起保存和加載。Pre-Norm結(jié)構(gòu)在TransformerEncoderLayer中我們實現(xiàn)了現(xiàn)在更流行的Pre-Norm結(jié)構(gòu)即先進行層歸一化再進入子層最后殘差連接。注意殘差連接后一般會跟一個Dropout層用于正則化。Dropout的應(yīng)用在原論文中Dropout被廣泛應(yīng)用在詞嵌入后、注意力權(quán)重后、前饋網(wǎng)絡(luò)ReLU激活后等。這是防止過擬合的重要手段。6. 常見問題、調(diào)參心得與擴展方向6.1 訓練Transformer的典型問題與排查損失不下降或震蕩檢查學習率Transformer通常需要配合熱身策略。使用一個較小的初始學習率在訓練初期線性或余弦增加到設(shè)定值然后再衰減。Adam優(yōu)化器默認的lr1e-3可能偏大嘗試5e-4或1e-4并配合熱身。檢查梯度使用torch.nn.utils.clip_grad_norm_進行梯度裁剪防止梯度爆炸。范數(shù)閾值通常設(shè)置在0.5到5.0之間。檢查數(shù)據(jù)確保輸入輸出序列的對應(yīng)關(guān)系正確特別是掩碼應(yīng)用是否正確。一個錯誤的填充掩碼可能導致模型學習不到有效信息。檢查初始化權(quán)重初始化很重要。Transformer通常使用Xavier均勻初始化或He初始化。驗證集性能差過擬合增加Dropout適當增大注意力Dropout和前饋網(wǎng)絡(luò)Dropout的比例原論文用0.1。增加標簽平滑這被證明是非常有效的正則化手段。使用更激進的數(shù)據(jù)增強對于NLP任務(wù)可以是隨機替換、刪除、交換詞語對于CV任務(wù)則是經(jīng)典的圖像增強。訓練速度慢檢查批次大小在GPU內(nèi)存允許的情況下盡量使用大的批次大小能更好地利用GPU并行能力。使用混合精度訓練使用torch.cuda.amp進行自動混合精度訓練可以顯著減少顯存占用并加速計算。優(yōu)化注意力計算對于超長序列標準的注意力計算復(fù)雜度是O(n^2)顯存和計算都無法承受。可以研究稀疏注意力、局部注意力或線性注意力等變體。6.2 關(guān)鍵超參數(shù)的經(jīng)驗之談超參數(shù)典型值/范圍作用與影響調(diào)參建議d_model (模型維度)512, 768, 1024表征向量的維度直接影響模型容量。資源允許下越大越好但需與層數(shù)平衡。768是BERT-base的常用值。num_layers (層數(shù))6, 12, 24編碼器/解碼器的堆疊層數(shù)。層數(shù)增加能提升模型能力但也更難訓練。通常從6或12層開始。num_heads (頭數(shù))8, 12, 16多頭注意力的頭數(shù)。通常設(shè)為d_model能被整除的數(shù)。頭數(shù)多能捕捉更多樣關(guān)系但單頭維度會變小。d_ff (前饋網(wǎng)絡(luò)維度)2048, 3072, 4096前饋網(wǎng)絡(luò)中間層的維度。通常是d_model的4倍。是模型參數(shù)的主要組成部分影響較大。dropout0.1用于防止過擬合的丟棄率。一個可靠的起點是0.1。數(shù)據(jù)量小可適當增加模型很大或數(shù)據(jù)很多可適當減少。學習率1e-4優(yōu)化器的步長。必須配合熱身。Adam優(yōu)化器下1e-4是常見起點使用線性熱身到該值。標簽平滑0.1軟化目標分布正則化。0.1是一個廣泛使用的有效值能穩(wěn)定提升模型泛化性能。6.3 超越原版重要的Transformer變體與演進Transformer本身也在不斷進化。了解這些變體有助于你理解當前的研究和應(yīng)用前沿BERT (Encoder-only)僅使用Transformer編碼器通過“掩碼語言模型”和“下一句預(yù)測”任務(wù)進行預(yù)訓練。它生成的詞向量是上下文相關(guān)的極大地推動了NLP發(fā)展。GPT (Decoder-only)僅使用Transformer解碼器帶掩碼的自注意力通過“自回歸語言建模”任務(wù)預(yù)訓練。它擅長文本生成是當今大語言模型LLM的基石。T5 (Encoder-Decoder)將所有NLP任務(wù)都重構(gòu)為“文本到文本”的格式統(tǒng)一使用標準的編碼器-解碼器架構(gòu)處理體現(xiàn)了Transformer的通用性。Vision Transformer將圖像分割成固定大小的圖塊線性投影為序列然后輸入標準的Transformer編碼器。它證明了自注意力在純視覺任務(wù)上也能超越CNN。Efficient Transformers針對O(n^2)復(fù)雜度問題提出的改進如Linformer低秩近似、Reformer局部敏感哈希、Performer隨機特征映射等旨在處理更長序列。架構(gòu)改進如Pre-LN將層歸一化放在殘差塊之前訓練更穩(wěn)定、DeepNorm一種新的初始化與殘差連接方式用于訓練極深模型等。學習Transformer從理解原論文和經(jīng)典教程如李宏毅老師的講解開始然后動手實現(xiàn)一個迷你版最后在具體任務(wù)如機器翻譯、文本分類上調(diào)試應(yīng)用是條扎實的路徑。這個模型的設(shè)計之美在于其模塊化和簡潔性每個部分都有明確的功能。當你理解了這些基礎(chǔ)構(gòu)件再看各種眼花繚亂的變體時就能一眼看出它們是在哪個環(huán)節(jié)做了怎樣的修改是為了解決什么問題。這才是舉一反三的關(guān)鍵。