Vision Transformer (ViT):將Transformer帶入計算機視覺的革命性嘗試
作為一名深度學習研究者,如果你對自然語言處理(NLP)領域的Transformer架構了如指掌,那么你一定不會對它在序列建模中的強大能力感到陌生。然而,2021年由Google Research團隊在ICLR上發表的論文《AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》卻將這一熟悉的架構帶入了一個全新的領域——計算機視覺,提出了Vision Transformer(ViT)。這篇博客將為你詳細解析ViT的原理,結合你對Transformer的深厚理解,帶你走進這一開創性的模型。
背景:從NLP到視覺的跨界思考
在NLP領域,Transformer(Vaswani et al., 2017)憑借其自注意力機制(Self-Attention)徹底改變了序列建模的范式。通過預訓練大規模語言模型(如BERT、GPT),Transformer展現了驚艷的泛化能力和計算效率。然而,在計算機視覺領域,卷積神經網絡(CNN)一直是無可爭議的主宰,憑借其局部性、平移不變性等歸納偏置(Inductive Bias),在圖像分類、目標檢測等任務中占據主導地位。
ViT的核心思想大膽而簡單:如果Transformer在NLP中能處理單詞序列(Token Sequence),為什么不能將圖像也看作一種序列呢?作者提出,通過將圖像分割成固定大小的Patch,并將這些Patch作為輸入序列直接交給標準Transformer處理,可以完全拋棄CNN的架構。這一嘗試不僅挑戰了CNN的統治地位,還揭示了大規模數據預訓練對模型性能的深遠影響。
ViT的架構:從圖像到序列的轉變
來源:https://arxiv.org/pdf/2010.11929
ViT的架構設計幾乎是對NLP Transformer的“照搬”,但在輸入處理上做了一些關鍵調整。以下是ViT的核心步驟,相信你會發現它與NLP中的處理流程有驚人的相似之處:
1. 圖像分塊與嵌入(Patch Embedding)
在NLP中,輸入是一個單詞序列,每個單詞通過詞嵌入(Word Embedding)映射為固定維度的向量。ViT將這一思想移植到圖像上:
- 圖像分割:給定一張輸入圖像 ( x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} x∈RH×W×C )(H、W為高寬,C為通道數,通常是RGB的3),ViT將其分割為固定大小的Patch,例如 ( P × P P \times P P×P )(論文中常用 ( 16 × 16 16 \times 16 16×16 ))。這會生成 ( N = H W / P 2 N = HW / P^2 N=HW/P2 ) 個Patch,每個Patch是一個 ( P 2 ? C P^2 \cdot C P2?C ) 維的向量。
- 線性投影:這些Patch被展平后,通過一個可訓練的線性層映射到一個固定維度 ( D D D ) 的嵌入空間,形成Patch Embedding。這與NLP中的詞嵌入過程幾乎一模一樣,只是這里的“詞”是圖像Patch。
- 位置編碼(Position Embedding):與NLP類似,ViT為每個Patch添加位置編碼,以保留空間信息。默認使用一維可學習位置編碼(1D Positional Embedding),盡管論文也嘗試了二維編碼,但效果差別不大。
最終,輸入序列為:
z 0 = [ x class ; x p 1 E ; x p 2 E ; ? ; x p N E ] + E pos \mathbf{z}_0 = [\mathbf{x}_{\text{class}}; \mathbf{x}_p^1 \mathbf{E}; \mathbf{x}_p^2 \mathbf{E}; \cdots; \mathbf{x}_p^N \mathbf{E}] + \mathbf{E}_{\text{pos}} z0?=[xclass?;xp1?E;xp2?E;?;xpN?E]+Epos?
其中,( E ∈ R ( P 2 ? C ) × D \mathbf{E} \in \mathbb{R}^{(P^2 \cdot C) \times D} E∈R(P2?C)×D ) 是投影矩陣,( E pos ∈ R ( N + 1 ) × D \mathbf{E}_{\text{pos}} \in \mathbb{R}^{(N+1) \times D} Epos?∈R(N+1)×D ) 是位置編碼。
2. 分類標記(Class Token)
如果你熟悉BERT(可以參考筆者的另一篇博客:BERT模型詳解:雙向Transformer的語言理解革命(預訓練和微調代碼實現)),你一定知道它的 [CLS] Token。ViT也借鑒了這一設計,在Patch序列前添加一個可學習的分類標記(Class Token),記為 ( x class \mathbf{x}_{\text{class}} xclass? )。這個Token的作用是在Transformer編碼后,作為整個圖像的表示,用于后續分類任務。
3. Transformer編碼器
接下來,ViT將序列 ( z 0 \mathbf{z}_0 z0? ) 輸入標準Transformer編碼器,與NLP中的架構完全一致:
- 多頭自注意力(Multi-Head Self-Attention, MSA):通過自注意力機制,ViT在全局范圍內整合Patch之間的信息,而不像CNN那樣局限于局部感受野。
- MLP塊:每個Transformer層包含一個前饋網絡(MLP),帶有GELU激活函數。
- 層歸一化與殘差連接:LayerNorm(LN)和殘差連接確保了訓練的穩定性。
經過 ( L L L ) 層Transformer編碼后,輸出序列為 ( z L \mathbf{z}_L zL? )。其中,( z L 0 \mathbf{z}_L^0 zL0? )(即Class Token的輸出)被用作圖像表示:
y = LN ? ( z L 0 ) \mathbf{y} = \operatorname{LN}(\mathbf{z}_L^0) y=LN(zL0?)
4. 分類頭
在預訓練階段,( y \mathbf{y} y ) 被送入一個帶有單隱藏層的MLP進行分類;在微調階段,則簡化為一個線性層,輸出類別數 ( K K K ) 的預測。
關鍵特性:極簡與歸納偏置的取舍
ViT的設計極簡,幾乎沒有引入圖像特有的歸納偏置:
- 與CNN的對比:CNN通過卷積操作天然具有局部性、平移不變性等特性,而ViT僅在Patch分割和微調時的分辨率調整中引入了少量二維結構信息。其余部分完全依賴自注意力從數據中學習空間關系。
- 全局性:自注意力使ViT從第一層起就能關注整個圖像,而CNN的感受野需要通過深層堆疊逐步擴大。
這種“無偏置”設計帶來了一個重要問題:ViT是否能在數據量不足時泛化良好?答案是否定的。論文指出,當在中小規模數據集(如ImageNet,1.3M圖像)上從頭訓練時,ViT的表現不如同等規模的ResNet。然而,當預訓練數據規模擴大到14M(ImageNet-21k)或300M(JFT-300M)時,ViT開始展現出超越CNN的潛力。這表明,大規模數據可以彌補歸納偏置的缺失。
性能表現:數據驅動的勝利
ViT在多個基準測試中取得了令人矚目的成績:
- ImageNet:ViT-H/14(Huge模型,14×14 Patch)達到88.55% Top-1精度,接近Noisy Student(EfficientNet-L2)的88.5%。
- CIFAR-100:94.55%,超越BiT-L的93.51%。
- VTAB(19任務):77.63%,顯著優于BiT-L的76.29%。
更重要的是,ViT的預訓練計算成本遠低于CNN。例如,ViT-H/14在JFT-300M上預訓練耗時2500 TPUv3-core-days,而BiT-L需要9900,Noisy Student更是高達12300。這種效率得益于Transformer的并行性和可擴展性。
深入分析:ViT如何“看”圖像?
為了理解ViT的內部機制,論文提供了一些可視化分析:
- 注意力距離:在較低層,部分注意力頭關注局部區域,類似CNN的早期卷積層;隨著層數增加,注意力范圍擴展至全局。
- 位置編碼:ViT學習到的位置編碼反映了圖像的二維拓撲結構,鄰近Patch的編碼更相似。
- 注意力圖:通過Attention Rollout方法,ViT能聚焦于與分類任務語義相關的區域,展現出強大的解釋性。
自監督預訓練的初步探索
如果你對BERT的掩碼語言建模(Masked Language Modeling)情有獨鐘,那么ViT的初步自監督實驗可能會讓你興奮。作者嘗試了掩碼Patch預測(Masked Patch Prediction),類似BERT的策略,將50%的Patch替換為掩碼,并預測其均值顏色。在JFT-300M上預訓練后,ViT-B/16的ImageNet精度從頭訓練的77.9%提升至79.9%,盡管仍落后于監督預訓練的83.97%。這表明自監督ViT有潛力,但仍需進一步優化。
對研究者的啟示
對于熟悉NLP的你,ViT不僅是一個視覺模型,更是一個跨領域思想的橋梁:
- 架構復用:ViT證明了Transformer的通用性,提示我們可以在更多模態上嘗試類似的序列化建模。
- 數據依賴性:大規模預訓練對ViT至關重要,這與NLP中的經驗一致。你可以思考如何設計更高效的自監督任務來減少數據需求。
- 擴展方向:論文提出將ViT應用于檢測、分割等任務(后續研究如DETR已驗證其可行性),這可能是你未來研究的一個切入點。
結語
Vision Transformer以其簡潔而大膽的設計,打破了CNN在計算機視覺中的壟斷地位。它告訴我們,當數據和算力足夠時,模型可以從頭學習復雜的空間關系,而無需依賴傳統歸納偏置。作為一名NLP領域的深度學習研究者,你是否也從中看到了Transformer無限可能的未來?歡迎留言分享你的看法!
參考文獻
Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021.
ViT代碼實現
以下是一個基于 PyTorch 的 Vision Transformer (ViT) 的完整、可運行的代碼實現。這個實現參考了原始論文《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》的核心思想,包含了 Patch Embedding、Multi-Head Self-Attention 和 Transformer Encoder 的主要組件,并以 MNIST 數據集為例進行訓練和測試。為了確保代碼可運行,盡量保持簡潔并提供注釋。
環境要求
- Python 3.8+
- PyTorch 2.0+
- Torchvision
完整代碼
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader
import torchvision
import torchvision.transforms as transforms# 超參數設置
image_size = 28 # MNIST 圖像大小為 28x28
patch_size = 7 # Patch 大小為 7x7
num_patches = (image_size // patch_size) ** 2 # 16 個 Patch
patch_dim = patch_size * patch_size * 1 # 輸入通道為 1 (灰度圖)
dim = 64 # 嵌入維度
depth = 6 # Transformer 層數
heads = 8 # 注意力頭數
mlp_dim = 128 # MLP 隱藏層維度
num_classes = 10 # MNIST 類別數
dropout = 0.1 # Dropout 率# 設備設置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# Patch Embedding 模塊
class PatchEmbedding(nn.Module):def __init__(self, image_size, patch_size, patch_dim, dim, dropout):super().__init__()self.num_patches = (image_size // patch_size) ** 2# 線性投影:將 Patch 展平并映射到 dim 維度self.proj = nn.Linear(patch_dim, dim)# 位置編碼self.pos_embedding = nn.Parameter(torch.randn(1, self.num_patches + 1, dim))# CLS Tokenself.cls_token = nn.Parameter(torch.randn(1, 1, dim))self.dropout = nn.Dropout(dropout)def forward(self, x):B = x.shape[0] # Batch Size# 將圖像分割為 Patch 并展平x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size) # (B, C, H/p, W/p, p, p)x = x.permute(0, 2, 3, 1, 4, 5).contiguous() # (B, H/p, W/p, C, p, p)x = x.view(B, self.num_patches, -1) # (B, num_patches, patch_dim)# 線性投影x = self.proj(x) # (B, num_patches, dim)# 添加 CLS Tokencls_tokens = self.cls_token.expand(B, -1, -1) # (B, 1, dim)x = torch.cat((cls_tokens, x), dim=1) # (B, num_patches + 1, dim)# 添加位置編碼x = x + self.pos_embeddingx = self.dropout(x)return x# 多頭自注意力模塊
class MultiHeadAttention(nn.Module):def __init__(self, dim, heads, dropout):super().__init__()self.heads = headsself.scale = (dim // heads) ** -0.5self.qkv = nn.Linear(dim, dim * 3, bias=False) # 查詢、鍵、值投影self.dropout = nn.Dropout(dropout)self.proj = nn.Linear(dim, dim) # 輸出投影def forward(self, x):B, N, C = x.shape # (Batch, num_patches + 1, dim)# 生成 Q, K, Vqkv = self.qkv(x).reshape(B, N, 3, self.heads, C // self.heads).permute(2, 0, 3, 1, 4)q, k, v = qkv[0], qkv[1], qkv[2] # (B, heads, N, dim/heads)# 注意力計算attn = (q @ k.transpose(-2, -1)) * self.scale # (B, heads, N, N)attn = F.softmax(attn, dim=-1)attn = self.dropout(attn)# 加權求和x = (attn @ v).transpose(1, 2).reshape(B, N, C) # (B, N, dim)x = self.proj(x)x = self.dropout(x)return x# Transformer Encoder 層
class TransformerEncoderLayer(nn.Module):def __init__(self, dim, heads, mlp_dim, dropout):super().__init__()self.norm1 = nn.LayerNorm(dim)self.attn = MultiHeadAttention(dim, heads, dropout)self.norm2 = nn.LayerNorm(dim)self.mlp = nn.Sequential(nn.Linear(dim, mlp_dim),nn.GELU(),nn.Dropout(dropout),nn.Linear(mlp_dim, dim),nn.Dropout(dropout))def forward(self, x):x = x + self.attn(self.norm1(x)) # 殘差連接x = x + self.mlp(self.norm2(x)) # 殘差連接return x# Vision Transformer 模型
class ViT(nn.Module):def __init__(self, image_size, patch_size, patch_dim, dim, depth, heads, mlp_dim, num_classes, dropout):super().__init__()self.patch_embed = PatchEmbedding(image_size, patch_size, patch_dim, dim, dropout)self.layers = nn.ModuleList([TransformerEncoderLayer(dim, heads, mlp_dim, dropout) for _ in range(depth)])self.norm = nn.LayerNorm(dim)self.head = nn.Linear(dim, num_classes)def forward(self, x):x = self.patch_embed(x)for layer in self.layers:x = layer(x)x = self.norm(x)cls_token = x[:, 0] # 提取 CLS Tokenx = self.head(cls_token)return x# 數據加載
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,)) # MNIST 均值和標準差
])train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# 初始化模型、損失函數和優化器
model = ViT(image_size=image_size,patch_size=patch_size,patch_dim=patch_dim,dim=dim,depth=depth,heads=heads,mlp_dim=mlp_dim,num_classes=num_classes,dropout=dropout
).to(device)criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 訓練函數
def train(model, train_loader, criterion, optimizer, epoch):model.train()running_loss = 0.0for i, (images, labels) in enumerate(train_loader):images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:print(f'[Epoch {epoch+1}, Batch {i+1}] Loss: {running_loss / 100:.3f}')running_loss = 0.0# 測試函數
def test(model, test_loader):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / totalprint(f'Test Accuracy: {accuracy:.2f}%')return accuracy# 主訓練循環
num_epochs = 10
for epoch in range(num_epochs):train(model, train_loader, criterion, optimizer, epoch)test(model, test_loader)
代碼說明
-
Patch Embedding:
- 將 28x28 的 MNIST 圖像分割為 7x7 的 Patch(共 16 個 Patch),具體如何切割請參考筆者的另一篇博客:PyTorch 的 unfold 函數:深入解析與在 Vision Transformer (ViT) 中的應用。
- 使用
unfold
操作分割圖像,然后通過線性層投影到指定維度(dim=64
)。 - 添加 CLS Token 和位置編碼。
-
Multi-Head Self-Attention:
- 實現多頭自注意力機制,Q、K、V 通過一個線性層生成。
- 使用縮放點積注意力(Scaled Dot-Product Attention),并添加 Dropout。
-
Transformer Encoder:
- 包含 6 層 Transformer,每層有 MSA 和 MLP 塊,帶有殘差連接和 LayerNorm。
- MLP 使用 GELU 激活函數。
-
分類頭:
- 從最后一層提取 CLS Token,經過 LayerNorm 和線性層輸出 10 個類別。
-
訓練與測試:
- 在 MNIST 數據集上訓練 10 個 epoch,使用 Adam 優化器。
- 每 100 個批次打印損失,并在每個 epoch 后測試準確率。
運行結果
在 CPU 或 GPU 上運行此代碼,將下載 MNIST 數據集并開始訓練。預期結果:
- 訓練損失逐漸下降。
- 測試準確率在 10 個 epoch 后可能達到 95% 以上(具體取決于隨機性和硬件)。
注意事項
- 計算資源:如果在 CPU 上運行,可能較慢;建議使用 GPU 加速。
- 超參數調整:當前設置適合 MNIST,處理更高分辨率圖像(如 ImageNet)可能需要調整
patch_size
、dim
和depth
。 - 擴展性:此代碼是基礎實現,未包含高級優化(如混合精度訓練或預訓練權重)。
參考
- 原始論文:An Image is Worth 16x16 Words
- PyTorch 官方文檔:torch.nn
希望這個實現對你理解 ViT 的工作原理有所幫助!如果需要更復雜的版本(例如支持 ImageNet 數據集或預訓練),可以進一步擴展。歡迎反饋或提問!
ViT 層的行為分析
引言
作為深度學習研究者,你對 Transformer 在 NLP 中的層級行為可能已非常熟悉:早期層關注語法和局部依賴,深層捕捉語義和長距離關系。那么,在計算機視覺的 Vision Transformer(ViT)中,層的行為是否類似?本文將深入探討 ViT 的層級特征提取,特別關注其與 CNN 的對比,并分析第 31、32 層等深層的特性,結合現有研究提供全面見解。
CNN 的層級特征提取:從低級到高級
CNN (具體可以參考筆者的另一篇博客:卷積神經網絡(CNN):深度解析其原理與特性)的強大之處在于其深層結構:
- 淺層(如第 1、2 層):通過小卷積核提取低級特征,如邊緣、紋理,感受野小,專注于局部信息。
- 深層(如第 10 層或更深):通過堆疊卷積和池化層,感受野擴展,逐步學習高級語義特征,如對象部件(例如貓的耳朵)或整體形狀(例如整只貓)。數學上,感受野擴展遵循公式:
R F l = R F l ? 1 + ( k ? 1 ) ? ∏ i = 1 l ? 1 s i RF_l = RF_{l-1} + (k-1) \cdot \prod_{i=1}^{l-1} s_i RFl?=RFl?1?+(k?1)?i=1∏l?1?si?
其中 ( R F l RF_l RFl? ) 是第 ( l l l ) 層的感受野大小,( k k k ) 是卷積核大小,( s i s_i si? ) 是之前各層的步幅。這使得深層 CNN 能捕捉全局上下文。
這種層次結構是 CNN 的歸納偏置(inductive bias),使其在數據量有限時表現良好。
ViT 的層級行為:從 Patch 到語義
ViT 的輸入是將圖像分割為固定大小的 Patch(如 16x16),每個 Patch 線性嵌入后添加位置編碼,輸入 Transformer 編碼器。編碼器由多頭自注意力(MSA)和多層感知機(MLP)塊交替組成。以下是層的行為分析:
早期層(如第 1、2 層)
- 自注意力(MSA):從第一層起,MSA 允許每個 Patch 嵌入關注整個序列(所有 Patch),這與 CNN 的局部卷積不同。研究表明 [1],早期層的某些注意力頭表現出全局行為,關注整個圖像,而其他頭則聚焦于局部區域,類似于 CNN 的早期卷積層。
- MLP 塊:MLP 是局部的,平移等變的,類似于卷積層,但作用于 Patch 嵌入。它通過 GELU 非線性添加非線性變換,初步精煉特征。
- 位置編碼:位置嵌入從一開始就編碼 2D 空間結構,研究顯示 [1],鄰近 Patch 的位置編碼更相似,反映行-列結構。
中間層(如第 15、16 層)
- 注意力距離:研究 [2] 使用平均注意力距離分析,顯示隨著層數的增加,注意力范圍擴大。中間層開始更多地整合跨 Patch 的信息,形成更復雜的空間關系。
- 特征整合:MSA 層繼續全局整合信息,MLP 層進一步非線性變換,逐步從 Patch 級別的原始信息向更高層次的表示過渡。
深層(如第 31、32 層)
- 深層行為:對于深層(如第 31、32 層),需要注意 ViT 的層數通常較少(如 ViT-B/16 有 12 層),因此第 31、32 層可能超出了標準模型的深度。但假設模型有 32 層,研究 [3] 表明:
- 深層注意力頭幾乎全部關注全局,平均注意力距離最大,專注于與任務相關的語義區域(如對象的關鍵部分)。
- CLS Token(分類標記)的輸出在深層更能代表整個圖像的語義信息,適合分類任務。
- 任務依賴:深層的具體特性高度依賴訓練數據和任務。例如,在廣義零樣本學習(GZSL)中,研究 [4] 發現第 11 層(12 層模型)CLS 特征表現最佳,表明深層更適合提取屬性相關信息。
與 CNN 的對比:層次結構的差異
- CNN 的層次結構:CNN 從邊緣到紋理,再到對象部件和整體,層次明確,歸納偏置強(如局部性、平移不變性)。深層逐步擴展感受野,構建明確的高級特征。
- ViT 的靈活性:ViT 缺乏這種固有層次結構,早期層已能全局整合信息,深層更多是精煉注意力,聚焦語義相關區域。這種數據驅動的特性使其在大數據集上表現優異,但小數據集時可能不如 CNN。
研究論文與結論
以下是關鍵研究:
- [1] Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021. 分析了注意力距離,顯示深層更全局,附錄 D.7 提供詳細可視化。
- [2] Investigating Vision Transformer representations,通過注意力距離和熱圖分析,確認深層更關注語義信息,提供可復制筆記本。
- [3] Visualizing Attention in Vision Transformers,可視化注意力圖,顯示深層聚焦任務相關區域。
- [4] Vision Transformer-based Feature Extraction for Generalized Zero-Shot Learning,發現深層(如第 11 層)CLS 特征更適合 GZSL,圖 6 展示層級性能。
結論:
- ViT 的層從淺到深確實有從局部到全局的轉變,但不像 CNN 那樣有嚴格的低級到高級特征層次。
- 早期層(如第 1、2 層)關注局部和全局信息,深層(如第 31、32 層,假設模型足夠深)更聚焦語義,具體特性依賴訓練和任務。
- 這種靈活性使 ViT 在大數據集上表現優異,彌補了缺乏 CNN 歸納偏置的不足。
表 1:ViT 與 CNN 層級行為的對比
特性 | CNN | ViT |
---|---|---|
早期層關注 | 低級特征(如邊緣、紋理) | 局部和全局信息,部分頭全局關注 |
深層關注 | 高級語義(如對象部件、整體) | 更全局,聚焦任務相關語義區域 |
層次結構 | 明確,低級到高級逐步構建 | 數據驅動,無嚴格層次,靈活性高 |
歸納偏置 | 強(如局部性、平移不變性) | 弱,依賴大數據訓練 |
深層(如第 31、32 層)特性 | 捕捉全局對象,明確語義 | 假設深,聚焦語義,任務依賴 |
討論與未來方向
對于第 31、32 層,當前研究多集中于 12-24 層的標準 ViT 模型,深層(如 32 層)行為需更多實驗驗證。未來可探索自監督預訓練(如掩碼 Patch 預測)如何影響深層特征,及如何設計更高效的層級結構,結合 CNN 和 ViT 的優勢。
后記
2025年3月12日19點34分于上海,在Grok 3大模型輔助下完成。