
Transformer 進入計算機視覺已經(jīng)不再是“要不要用”的問題而是“怎么理解、怎么選型、怎么落地”的問題。這次我們來看一套覆蓋全套知識點的內(nèi)容從注意力機制講起逐步推進到 ViT、Swin Transformer 兩篇核心論文的精讀。與很多只給概念截圖的教程不同這套內(nèi)容更偏向“能把論文讀透、能把代碼寫出來”的干貨路線適合準備面試、做課題、復現(xiàn)論文或者使用 Transformer 改進視覺任務(wù)的讀者。文章不繞彎子直接拆解三層內(nèi)容第一層是 QKV、自注意力、多頭注意力的數(shù)學原理與實現(xiàn)細節(jié)第二層是 ViT 的 Patch Embedding、位置編碼、Class Token 和整體訓練策略第三層是 Swin Transformer 的層次化設(shè)計、窗口注意力、移位窗口和相對位置偏置。最后會給出從論文到代碼的驗證路線以及學習中最容易踩的坑。如果你正在為“Transformer 計算機視覺”整理知識體系或者準備面試時被問到“ViT 和 Swin 到底差在哪”這篇可以直接收藏備用。1. 核心能力速覽先給這套內(nèi)容做一個整體畫像方便判斷是否適合自己。能力項說明內(nèi)容定位計算機視覺中的 Transformer 全套精講覆蓋注意力機制、ViT、Swin Transformer面向讀者準備面試的算法工程師、做視覺大作業(yè)/課題的學生、準備復現(xiàn)論文的研究者前置知識Python 基礎(chǔ)、PyTorch 基礎(chǔ)、CNN 基本概念卷積、池化、全連接核心模塊自注意力機制、多頭注意力、位置編碼、ViT 論文、Swin Transformer 論文代碼落地可對照 PyTorch 手寫注意力模塊、Patch Embedding、窗口注意力面試價值高頻考點全覆蓋QKV、softmax、復雜度、歸納偏置、層次化特征配套建議需要一面讀論文原文、一面跑代碼驗證不建議只看概念圖這套內(nèi)容最直接的收益是讀完以后你能回答清楚幾個關(guān)鍵問題——為什么 NLP 的 Transformer 能搬到圖像上ViT 為什么需要大數(shù)據(jù)集預訓練Swin 的窗口注意力到底省了多少計算量這也是面試和論文復現(xiàn)里最容易卡住的地方。2. 為什么計算機視覺需要 Transformer先回顧背景。CNN 統(tǒng)治視覺任務(wù)很多年靠的是局部感受野和權(quán)值共享卷積核一層層堆疊從邊緣、紋理逐步抽象到語義。這個設(shè)計很好但有兩個天然限制。第一個限制是感受野擴展得慢。高層特征雖然能覆蓋更大區(qū)域但依然依賴層層堆疊對于長距離依賴關(guān)系比如一張圖里“遠處的行人”和“近處的汽車”之間的語義關(guān)系CNN 需要很深的網(wǎng)絡(luò)才能建模。第二個限制是歸納偏置強。卷積假設(shè)了 locality局部性和 translation invariance平移不變性這在自然圖像里通常成立但遇到需要全局建模的任務(wù)時反而成了限制。Transformer 的思路完全不同。它不預設(shè)局部性而是通過自注意力機制讓序列中任意兩個位置直接交互。一張圖切成 patch 序列后每個 patch 都能和所有其他 patch 計算相關(guān)性。這種全局建模能力是 Transformer 進入視覺領(lǐng)域的根本動力。但要注意這種能力的代價是計算復雜度。標準自注意力是 O(n2) 的復雜度n 是序列長度。對 NLP 來說一個句子不過幾十到幾百個 token問題不大對圖像來說如果直接把每個像素當 token一張 224×224 的圖就有 5 萬個 token計算量直接爆炸。這也解釋了為什么 ViT 要把圖像切成 patch也解釋了為什么 Swin Transformer 要設(shè)計窗口注意力。理解這條主線后面讀論文就順了。3. 注意力機制核心Q、K、V 與自注意力注意力機制最早來自 NLP 的機器翻譯場景本質(zhì)是做“信息選擇”給定一個查詢Query在一組鍵Key上計算相關(guān)性再按相關(guān)性加權(quán)求和對應(yīng)的值Value。公式長這樣Attention(Q, K, V) softmax(QK^T / sqrt(d_k)) V其中Q 是查詢向量代表“我要找什么”。K 是鍵向量代表“我這里有什么”。V 是值向量代表“我實際提供的信息”。d_k 是鍵向量的維度除以 sqrt(d_k) 是為了防止點積過大導致 softmax 梯度消失。為什么除以 sqrt(d_k)因為 Q 和 K 的點積結(jié)果會隨維度增大而增大如果 d_k 很大點積進入 softmax 的飽和區(qū)梯度會非常小??s放一下讓點積分布保持在合適的區(qū)間訓練更穩(wěn)定。自注意力是注意力機制的一個特例Q、K、V 都來自同一個輸入序列。也就是說序列內(nèi)部自己做“注意力分配”每個 token 在計算輸出時都會參考序列里所有 token 的信息。用 PyTorch 實現(xiàn)一個基礎(chǔ)的自注意力模塊代碼很短import torch import torch.nn as nn import torch.nn.functional as F class SelfAttention(nn.Module): def __init__(self, embed_dim, dropout0.0): super().__init__() self.embed_dim embed_dim self.q_proj nn.Linear(embed_dim, embed_dim) self.k_proj nn.Linear(embed_dim, embed_dim) self.v_proj nn.Linear(embed_dim, embed_dim) self.dropout nn.Dropout(dropout) def forward(self, x): # x: [batch_size, seq_len, embed_dim] B, N, C x.shape q self.q_proj(x) # [B, N, C] k self.k_proj(x) # [B, N, C] v self.v_proj(x) # [B, N, C] attn torch.matmul(q, k.transpose(-2, -1)) / (C ** 0.5) attn F.softmax(attn, dim-1) attn self.dropout(attn) out torch.matmul(attn, v) # [B, N, C] return out這段代碼是理解 ViT 和 Swin 的基礎(chǔ)。ViT 里的 Encoder Block 就是在這個模塊外面加上 LayerNorm、MLP 和殘差連接Swin 里的窗口注意力則是在這個模塊基礎(chǔ)上加了 mask 和相對位置偏置。把這段代碼跑通再去看論文里的公式基本沒有理解障礙。4. 多頭注意力機制單個注意力頭只能學到一種“查詢-鍵”相關(guān)性表達能力有限。多頭注意力把 embedding 分成 h 個頭每個頭獨立計算注意力最后拼接在一起再做一次線性變換。這樣模型可以同時關(guān)注不同的關(guān)系某個頭關(guān)注局部紋理另一個頭關(guān)注全局輪廓各司其職。多頭注意力的公式MultiHead(Q, K, V) Concat(head_1, ..., head_h) W_O head_i Attention(QW_Q_i, KW_K_i, VW_V_i)在實現(xiàn)層面常見的做法不是真的建立多組獨立 Linear而是把 Q/K/V 的線性層輸出拆成 h 份。比如 embed_dim 是 768頭數(shù)是 12每個頭的維度就是 64。PyTorch 里手寫多頭注意力class MultiHeadAttention(nn.Module): def __init__(self, embed_dim, num_heads, dropout0.0): super().__init__() assert embed_dim % num_heads 0 self.embed_dim embed_dim self.num_heads num_heads self.head_dim embed_dim // num_heads self.q_proj nn.Linear(embed_dim, embed_dim) self.k_proj nn.Linear(embed_dim, embed_dim) self.v_proj nn.Linear(embed_dim, embed_dim) self.out_proj nn.Linear(embed_dim, embed_dim) self.dropout nn.Dropout(dropout) def forward(self, x): B, N, C x.shape q self.q_proj(x).view(B, N, self.num_heads, self.head_dim).transpose(1, 2) k self.k_proj(x).view(B, N, self.num_heads, self.head_dim).transpose(1, 2) v self.v_proj(x).view(B, N, self.num_heads, self.head_dim).transpose(1, 2) attn torch.matmul(q, k.transpose(-2, -1)) / (self.head_dim ** 0.5) attn F.softmax(attn, dim-1) attn self.dropout(attn) out torch.matmul(attn, v) # [B, num_heads, N, head_dim] out out.transpose(1, 2).contiguous().view(B, N, C) out self.out_proj(out) return out多頭注意力里的幾個細節(jié)值得單獨記住每個頭的維度是 embed_dim / num_heads不是 embed_dim??s放因子用的是 head_dim不是 embed_dim。拼接完要經(jīng)過 out_proj 做一次融合線性變換。頭數(shù)越多模型越能捕捉不同類型的依賴關(guān)系但計算量也線性增加。面試里常問“為什么 softmax 之前要縮放”答案就是上面說的梯度問題。另一個常問的是“多頭注意力的復雜度”答案和單頭一致因為頭的數(shù)量不改變序列長度的平方項。5. 位置編碼注意力機制本身沒有順序概念。對于一組 token無論它們怎么排列注意力計算的結(jié)果都一樣。NLP 里 token 是詞順序決定語義視覺里 patch 是圖像塊排列決定空間結(jié)構(gòu)。模型必須知道每個 patch 在原始圖像中的位置否則一張圖的所有 patch 順序打亂后模型會得到完全一樣的輸出。位置編碼就是解決這個問題的。ViT 使用可學習的位置編碼。它的做法是初始化一個形狀為 [1, num_patches 1, embed_dim] 的向量表作為可學習參數(shù)參與訓練。推理時直接和 patch embedding 相加。ViT 的 Patch Embedding 和位置編碼疊加邏輯import torch import torch.nn as nn class PatchEmbed(nn.Module): def __init__(self, img_size224, patch_size16, in_chans3, embed_dim768): super().__init__() self.num_patches (img_size // patch_size) ** 2 self.proj nn.Conv2d(in_chans, embed_dim, kernel_sizepatch_size, stridepatch_size) def forward(self, x): # x: [B, C, H, W] - [B, embed_dim, H/patch, W/patch] x self.proj(x) # flatten spatial dims - [B, num_patches, embed_dim] x x.flatten(2).transpose(1, 2) return x class ViTEmbedding(nn.Module): def __init__(self, img_size224, patch_size16, in_chans3, embed_dim768): super().__init__() self.patch_embed PatchEmbed(img_size, patch_size, in_chans, embed_dim) self.num_patches self.patch_embed.num_patches self.cls_token nn.Parameter(torch.zeros(1, 1, embed_dim)) self.pos_embed nn.Parameter(torch.zeros(1, self.num_patches 1, embed_dim)) def forward(self, x): x self.patch_embed(x) # [B, N, C] cls_token self.cls_token.expand(x.shape[0], -1, -1) x torch.cat([cls_token, x], dim1) # [B, N1, C] x x self.pos_embed return xSwin Transformer 則使用相對位置偏置relative position bias而不是絕對位置編碼。它的思路是不直接給每個 patch 一個絕對位置向量而是在計算注意力分數(shù)時根據(jù)兩個 patch 之間的相對坐標差加上一個可學習的偏置項。這樣做有兩個好處。第一相對位置信息更符合視覺任務(wù)的特點——某個結(jié)構(gòu)出現(xiàn)在圖像左上角還是右下角有時并不重要重要的是結(jié)構(gòu)內(nèi)部各部件之間的相對空間關(guān)系。第二Swin 的窗口注意力需要在不同窗口間共享參數(shù)相對位置偏置天然具備平移不變性更容易做到這一點。相對位置偏置的實現(xiàn)細節(jié)是對每個窗口內(nèi)的 patch先計算相對坐標偏移映射到一組可學習參數(shù)表中得到形狀為 [num_heads, window_size2, window_size2] 的偏置矩陣然后加到注意力分數(shù)上。這個過程比較繞讀論文時建議配合代碼一起看單獨看公式容易暈。6. ViT 論文精講ViT 全稱 Vision Transformer是 2020 年 Google 團隊發(fā)表在 ICLR 的工作。它的核心主張非常激進既然 Transformer 在 NLP 上已經(jīng)證明了強大的建模能力那么把圖像切成 patch 序列直接輸入標準 Transformer Encoder不依賴任何卷積結(jié)構(gòu)也可以取得很好的圖像分類效果。6.1 網(wǎng)絡(luò)結(jié)構(gòu)ViT 的結(jié)構(gòu)可以拆成四段第一段是 Patch Embedding。把圖像分成固定大小的 patch常用 16×16通過一個 stride 等于 patch_size 的卷積把每個 patch 映射為一個向量。一張 224×224 的圖切成 16×16 patch得到 14×14196 個 patch每個 patch 展平后經(jīng)過線性映射成 768 維向量。第二段是 Class Token 和位置編碼。ViT 參考 BERT 的做法在 patch 序列最前面拼接一個可學習的 class token。最終分類時只取這個 class token 對應(yīng)的輸出過 MLP Head。位置編碼使用可學習參數(shù)形狀是 [1, 197, 768]其中 197 是 196 個 patch 加上 1 個 class token。第三段是 Transformer Encoder。這是標準結(jié)構(gòu)LayerNorm - Multi-Head Attention - 殘差連接 - LayerNorm - MLP - 殘差連接。MLP 通常是兩層中間維度是 embed_dim 的 4 倍激活函數(shù)用 GELU。這個 block 會重復 L 次。第四段是分類頭。取最后一層 Encoder 輸出中的 class token 向量經(jīng)過 LayerNorm 后送入 MLP Head。預訓練時 MLP Head 是一個線性層微調(diào)時換成新的線性層即可。ViT 各階段的維度配置有一個通用命名規(guī)則理解它對讀論文很重要模型Patch 大小embed_dim層數(shù)頭數(shù)MLP 維度參數(shù)量ViT-Base16×167681212307286MViT-Large16×16102424164096307MViT-Huge14×14128032165120632M6.2 關(guān)鍵結(jié)論ViT 論文里最重要的實驗結(jié)論是在中等規(guī)模數(shù)據(jù)集比如 ImageNet-1k上直接訓練ViT 打不過同量級的 ResNet但在大規(guī)模數(shù)據(jù)集比如 JFT-300M約 3 億張圖上預訓練后再遷移到下游任務(wù)ViT 可以超過 ResNet 和其他 CNN 方法。這個結(jié)論引出了 ViT 最著名的特點缺少 CNN 的歸納偏置數(shù)據(jù)量不夠時學不好。CNN 天生帶 locality 和 translation invariance小數(shù)據(jù)也能學出不錯的結(jié)果ViT 把這些先驗去掉了換來更強的表達能力代價是大數(shù)據(jù)需求。后續(xù)研究中DeiT 通過知識蒸餾和更精細的訓練策略讓 ViT 在 ImageNet-1k 上也能直接訓練出不錯的效果說明數(shù)據(jù)不足的問題可以通過訓練策略緩解但這一點在 ViT 原始論文里確實存在。6.3 需要注意的細節(jié)位置編碼在 ResNet-50 特征圖上做的話需要調(diào)整編碼長度以匹配特征圖序列長度。微調(diào)時如果要提高輸入分辨率位置編碼需要用二維插值放大這是一個常見工程坑。Class Token 不是唯一選擇。后續(xù)工作證明直接對所有 patch 輸出做全局平均池化也可以效果差別不大。ViT 論文選擇 class token 是沿襲 BERT 的設(shè)計習慣。7. Swin Transformer 論文精講Swin Transformer 是 2021 年微軟研究院發(fā)表在 ICCV 的工作拿了 Best Paper。它的動機直接針對 ViT 的兩個痛點計算復雜度高和缺乏多尺度特征。7.1 兩個核心創(chuàng)新第一個創(chuàng)新是層次化架構(gòu)。Swin 不是把整張圖一次性切成固定數(shù)量的 patch而是像 CNN 一樣通過 Patch Merging 逐步下采樣。最開始每個 patch 是 4×4 像素經(jīng)過第一個 stage 后特征圖分辨率減半、維度翻倍總共 4 個 stage輸出的特征圖分別是原圖的 1/4、1/8、1/16、1/32。這種多尺度設(shè)計讓 Swin 可以直接用于檢測和分割等密集預測任務(wù)而不像 ViT 那樣需要在最后一層上做復雜的特征恢復。第二個創(chuàng)新是窗口注意力。標準自注意力要在所有 patch 之間兩兩計算復雜度是 O(n2)。Swin 把特征圖分成不重疊的窗口比如 7×7 個 patch 一個窗口注意力只在窗口內(nèi)部計算。這樣復雜度變成 O(n)從平方降為線性這是 Swin 能處理高分辨率圖像的關(guān)鍵。但窗口注意力有一個問題窗口之間沒有信息交互。如果一直用固定窗口每個窗口只能看到自己內(nèi)部的信息全局建模能力被鎖死了。Swin 的解法是移位窗口Shifted Window Attention在連續(xù)的兩層 Transformer Block 之間把窗口偏移一半窗口大小再重新劃分窗口。這樣上一層窗口邊界處的 patch 在下一層就會和相鄰窗口的 patch 處于同一個窗口內(nèi)實現(xiàn)了跨窗口信息流動。移位窗口在工程上有實現(xiàn)難點直接移動窗口會導致窗口數(shù)量變化并且部分窗口會超出特征圖邊界。Swin 引入了 cyclic shift循環(huán)移位把越界的窗口搬回另一側(cè)再通過 attention mask 屏蔽掉不該計算的位置。這一步是 Swin 代碼里最復雜的部分建議讀代碼時單獨花時間。7.2 網(wǎng)絡(luò)結(jié)構(gòu)配置Swin Transformer 有四個常用變體模型embed_dim層數(shù)窗口大小參數(shù)量Swin-T962,2,6,27×728MSwin-S962,2,18,27×750MSwin-B1282,2,18,27×788MSwin-L1922,2,18,27×7197M每個 stage 里是偶數(shù)個 Transformer Block因為需要“標準窗口注意力 移位窗口注意力”成對出現(xiàn)。7.3 相對位置偏置的作用Swin 在注意力分數(shù)上加了相對位置偏置這個偏置來自一個可學習的參數(shù)表表的索引是兩個 patch 的相對坐標偏移。論文里有專門的消融實驗去掉相對位置偏置Swin-T 在 ImageNet 上的 top-1 準確率明顯下降換成絕對位置編碼效果也不如相對位置偏置。這說明相對位置信息對窗口注意力非常重要。7.4 關(guān)鍵結(jié)果Swin 在 ImageNet-1k 上Swin-B 用 ImageNet-1k 預訓練可以達到 83.5% top-1 準確率用 ImageNet-22k 預訓練微調(diào)后可以達到 85.2%。在 COCO 檢測和 ADE20K 分割任務(wù)上Swin 超過了當時所有基于 CNN 和 ViT 的方法成為通用骨干網(wǎng)絡(luò)的新選擇。Swin 的意義不僅是分類精度更在于它證明了 Transformer 通過合理的計算約束和多尺度設(shè)計可以成為 CNN 的完整替代方案覆蓋分類、檢測、分割全場景。8. ViT 與 Swin Transformer 對比把兩篇論文放在一起對比能更清楚地看到設(shè)計取舍對比維度ViTSwin Transformer輸入處理16×16 patch 線性映射4×4 patch逐 stage 合并下采樣特征圖尺度單一尺度多尺度1/4、1/8、1/16、1/32注意力計算范圍全局自注意力窗口內(nèi)自注意力 移位窗口計算復雜度O(n2)O(n)窗口大小固定時位置編碼可學習絕對位置編碼相對位置偏置歸納偏置弱依賴大數(shù)據(jù)相對較強適合中小規(guī)模數(shù)據(jù)集適用任務(wù)圖像分類為主配合改動可用于分割檢測分類、檢測、分割通用典型參數(shù)量86MBase88MBase面試時如果被問“ViT 和 Swin 哪個更好”不能一句話回答。應(yīng)該說清楚ViT 結(jié)構(gòu)更簡潔全局建模能力強但計算復雜度高、需要大數(shù)據(jù)Swin 用窗口注意力換來了線性的計算復雜度并且天然支持多尺度特征更適合遷移到檢測分割等密集預測任務(wù)。選擇哪個取決于數(shù)據(jù)規(guī)模、任務(wù)類型和計算資源。9. 常見問題與易錯點對照實際學習和復現(xiàn)經(jīng)歷列出最常見的幾個問題問題現(xiàn)象可能原因排查方式解決方案自注意力實現(xiàn)后 loss 不下降縮放因子用錯或 mask 缺失檢查是否除以 sqrt(d_k)修正縮放確認 padding maskViT 位置編碼與輸入長度不匹配修改輸入分辨率后未插值位置編碼打印 pos_embed 形狀用雙線性插值放大 pos_embedSwin 窗口注意力結(jié)果異常移位窗口的 attention mask 寫錯單測一個 8×8 特征圖手算對比參考官方實現(xiàn)逐行對照 mask 邏輯顯存不足patch 數(shù)過多或 batch 過大降低 batch、減小輸入分辨率使用漸變學習率配合梯度累積小數(shù)據(jù)集上 ViT 效果差ViT 缺少 CNN 歸納偏置對比 ResNet 在同等數(shù)據(jù)下的表現(xiàn)換用 Swin/DeiT 或增加數(shù)據(jù)增強訓練速度慢全局注意力 O(n2) 開銷大觀察每個 step 的耗時切 patch 更大或換成窗口注意力分類結(jié)果波動大未設(shè)置合理的 warmup 和 weight decay檢查訓練配置ViT 訓練對優(yōu)化器參數(shù)敏感按論文默認配置設(shè)置這里面特別要提的是 ViT 的優(yōu)化敏感性。ViT 對學習率、weight decay、warmup epochs 非常敏感直接拿 ResNet 的訓練配置去訓 ViT往往效果很差。DATData efficient training相關(guān)工作中也專門研究過這個核心經(jīng)驗是使用 AdamW、較大的 weight decay、較長的 warmup、以及適當?shù)脑鰪姴呗浴?0. 學習路線與代碼實踐建議如果你打算把這套內(nèi)容完整學透建議按下面五步走。第一步先不看任何 Transformer 結(jié)構(gòu)用 PyTorch 把一個自注意力模塊從零寫出來跑通前向和反向。這個模塊是后面所有內(nèi)容的地基建議寫到能不看資料獨立寫出的程度。第二步手寫多頭注意力然后自己驗證一件事把輸入序列的順序打亂輸出是否變化。如果不變說明位置編碼確實必要這一步能幫你真正理解位置編碼的作用。第三步讀 ViT 原文同時保持原文和代碼對齊。重點看 Patch Embedding 的實現(xiàn)、Class Token 的拼接、Transformer Encoder 的 Block 結(jié)構(gòu)??梢耘芤粋€簡單的實驗在 CIFAR-10 上用 ViT-Tiny 配置從零訓練觀察收斂情況。第四步讀 Swin Transformer 原文重點放在窗口注意力和移位窗口的實現(xiàn)。建議做兩個驗證實驗第一個是固定窗口注意力下兩個不同窗口的 patch 之間注意力分數(shù)是否為零第二個是經(jīng)過一層移位窗口后跨窗口信息是否開始流動。第五步把兩篇論文做系統(tǒng)性對比整理出自己的筆記。建議按“結(jié)構(gòu)設(shè)計 - 計算復雜度 - 歸納偏置 - 實驗結(jié)論 - 適用場景”五個維度寫這份筆記可以直接當面試復習材料用。代碼實踐上有幾個值得長期保留的最小驗證腳本# 驗證自注意力輸出形狀 python -c import torch from model import SelfAttention x torch.randn(2, 197, 768) attn SelfAttention(embed_dim768) out attn(x) print(out.shape) # 期望輸出 torch.Size([2, 197, 768]) # 驗證 ViT Patch Embedding python -c import torch from model import PatchEmbed x torch.randn(2, 3, 224, 224) pe PatchEmbed(img_size224, patch_size16, embed_dim768) out pe(x) print(out.shape) # 期望輸出 torch.Size([2, 196, 768]) 如果你計劃把 Transformer 用在自己的視覺任務(wù)上比如改進 YOLO 檢測器、做高光譜圖像分類或者視頻理解建議從 Swin 的層次化結(jié)構(gòu)入手而不是直接堆 ViT。絕大多數(shù)實際視覺任務(wù)都需要多尺度特征Swin 的架構(gòu)和現(xiàn)有檢測分割框架的兼容性更好。當然如果資源充足且任務(wù)本身需要極強的全局建模能力ViT 仍然值得嘗試。關(guān)于顯存占用可按實際環(huán)境測試這里有一個通用觀察方式訓練時用nvidia-smi實時監(jiān)控顯存對比不同 patch size、不同分辨率、不同 batch size 下的占用差異。ViT 在 224×224 分辨率下 token 數(shù)只有 197顯存壓力不大一旦提升到 384×384 或 512×512全局注意力的內(nèi)存會快速上漲。Swin 因為窗口注意力是局部計算高分辨率下顯存增長會平緩很多這在工程選型里有實際意義。11. 總結(jié)與下一步Transformer 計算機視覺這條技術(shù)線從注意力機制到 ViT 再到 Swin Transformer是一條邏輯非常清晰的演進路線。抓住三條主線就能串聯(lián)全部內(nèi)容注意力機制解決“如何建模全局關(guān)系”ViT 回答“如何用純 Transformer 做視覺”Swin 解決“如何讓 Transformer 在視覺任務(wù)上更高效、更通用”。首次學習時建議優(yōu)先把自注意力和多頭注意力寫熟然后精讀 ViT 原文最后攻克 Swin 的移位窗口。最容易踩的坑是只看概念圖、不讀源碼、不做對比實驗。建議至少完整復現(xiàn)一個最小自注意力模塊并跑通 ViT 和 Swin 的官方預訓練模型推理。下一步可以根據(jù)自己的方向繼續(xù)擴展如果做圖像生成可以研究 ViT 和 Swin 之后的 Diffusion TransformerDiT如果做多模態(tài)可以看 CLIP 和 BLIP 如何借用視覺 Transformer如果做輕量化可以調(diào)研 MobileViT 和 EdgeViT 這類輕量級視覺 Transformer。基礎(chǔ)打牢之后后面的路會順很多。