文章目錄
- 前言
- 1 vit 熱點統計
- 1.1 目標分類 / 基礎與改進
- 1.2 輕量化 ViT / 移動部署優化(移動端)
- 1.3 密集預測(語義分割 / 深度估計等)
- 1.4 目標/詞匯 檢測
- 1.5 掩碼改進
- 1.6 多模態/ 通用大模型
- 1.7 分布式訓練 / 效果提升
- 1.8 任務特化應用(圖表 / 語音 / 視頻等)
- 2 重點網絡分析
- 2.1 Transformers for Image Recognition at Scale
- 2.1.1 結構描述
- 2.1.2 embedding
- 2.2 Vision Transformers Need Registers
- 2.2.1 DINOv2
- 2.2.2 為什么DINO v2 有而v1沒有?
- 2.3 FastViT
- 2.3.1 RepMixer
- 2.3.2 結構重參數化(Structural Reparameterization)
- 2.3.3 大核(7x7)卷積
- 2.4 Vision Transformers for Dense Prediction
- 2.4.1 encoder
- 2.4.2 Convolutional decoder
- 2.4.3 fusion
- 2.5 Exploring Plain Vision Transformer Backbones for Object Detection
- 2.6 BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers
- 2.6.1 VQ-KD
- 2.6.2 patch aggregation strategy
- 2.6.2 code book collapse
- 2.7 VATT: Transformers for Multimodal Self-Supervised Learning from Raw Video, Audio and Text
- 2.7.1 Tokenization and Positional Encoding 和 DropToken:
- 2.7.2 Common Space Projection
- 2.7.3 Common Space Projection
- 2.7.4 only self attention
- 2.8 總結
- 2.8 Grounded SAM: Assembling Open-World Models for Diverse Visual Tasks
- 2.9 Qwen-VL
- 2.9.1 Naive Dynamic Resolution
- 2.9.2 Multimodal Rotary Position Embedding
- 2.9.3 Unified Image and Video Understanding
- 2.10 Colossal-AI
- 2.11 Neural Architecture Search using Property Guided Synthesis(NAS)
前言
transformer 是一條新的思路, 可以在 paper with code 上看到 vit 的火爆程度
其中 vit相關變體網絡, 在 paper with code 上累計大概2000篇論文,如果一次都看沒有意義,因此我這里統計了 前40 人氣論文進行初步探索以增加 在 ViT方面的廣度.
1 vit 熱點統計
我這里根據paper with code 上前40的 論文進行統計,基本涵蓋了 檢測/識別/分割/深度識別/工程落地等幾個方向.從
1.1 目標分類 / 基礎與改進
名稱 | 描述 | starts |
---|---|---|
Transformers for Image Recognition at Scale | 原始 ViT 提出,圖像 patch + Transformer | 11,261 |
DeiT III: Revenge of the ViT | 高效訓練技巧,無需大數據也能訓練 ViT | 4,177 |
Scaling Vision Transformers | 擴大 ViT 模型規模的訓練優化 | 2,822 |
Better plain ViT baselines for ImageNet-1k | ViT 標準 baseline 提升 | 2,822 |
Vision Transformers Need Registers | 引入寄存器 token 改善信息保留 | 10,300 |
AutoFormer | 自動結構搜索 ViT 架構 | 1,742 |
PVT v2 | 金字塔結構 Transformer,適合密集任務 | 1,797 |
1.2 輕量化 ViT / 移動部署優化(移動端)
名稱 | 描述 | starts |
---|---|---|
MobileViT | CNN + ViT 融合,面向移動端 | 1,856 |
FastViT | 重參數化結構,高速高效 | 33,886 |
Reversible Vision Transformers | 可逆結構,節省內存 | 6,901 |
DepGraph | 針對 ViT 的結構剪枝優化 | 2,980 |
1.3 密集預測(語義分割 / 深度估計等)
名稱 | 描述 | starts |
---|---|---|
Vision Transformers for Dense Prediction | Dense Prediction Transformer(DPT)提出 | 143,269 |
MiDaS v3.1 | 單目深度估計,ViT backbone | 4,834 |
Depth Pro | 高效深度估計 | 4,357 |
A Simple Single-Scale ViT | 結構簡單但效果強,分割與檢測 | 77,494 |
Efficient Track Anything | 任意目標跟蹤模塊 | 2,319 |
Multi-Granularity Prediction for Scene Text Recognition | 場景文字識別,使用多尺度 ViT | 1,688 |
1.4 目標/詞匯 檢測
名稱 | 描述 | starts |
---|---|---|
Simple Open-Vocabulary Object Detection with Vision Transformers | 支持開放類名目標檢測 | 3,512 |
Grounding DINO grounding + DINO | 組合用于大規模目標檢測 | 7,889 |
Exploring Plain Vision Transformer Backbones for Object Detection | 研究純 ViT backbone 在檢測中的性能 | 31,780 |
1.5 掩碼改進
名稱 | 描述 | starts |
---|---|---|
BEiT v2 | 自監督視覺 tokenizer + Masked Modeling | 21,094 |
Emerging Properties in Self-Supervised Vision Transformers | ViT 自監督下的泛化與行為分析 | 6,777 |
Improving Pixel-based MIM by Reducing Wasted Modeling Capability | 提升掩碼建模 token 利用率 | 3,635 |
VATT | 跨模態(視頻/音頻/文本)自監督預訓練 | 35,370 |
1.6 多模態/ 通用大模型
名稱 | 描述 | starts |
---|---|---|
Grounded SAM | ViT 結合 SAM,用于泛化視覺任務 | 16,148 |
Qwen-VL Technical Report | 多模態 GPT-VL,視覺編碼為 ViT | 9,904 |
Yi: Open Foundation Models by 01.AI | 通用多模態開源模型 | 7,831 |
InternLM-XComposer2-4KHD | 視覺輸入自適應支持 4K | 2,813 |
1.7 分布式訓練 / 效果提升
名稱 | 描述 | starts |
---|---|---|
Colossal-AI | 分布式訓練系統,支持大規模 ViT | 40,790 |
Neural Architecture Search using Property Guided Synthesis | 結構搜索提升 ViT 表現 | 35,372 |
Pyramid Adversarial Training Improves ViT Performance | 對抗訓練增強魯棒性 | 3,512 |
1.8 任務特化應用(圖表 / 語音 / 視頻等)
名稱 | 描述 | starts |
---|---|---|
TinyChart | 圖表結構理解與 token 合并 | 2,158 |
FastFlow | 基于 ViT 的無監督異常檢測 | 2,789 |
S4ND | 視頻狀態建模(state space + transformer) | 2,609 |
Pushing the Limits of Self-Supervised Speaker Verification using Regularized Distillation | ViT 用于語音驗證的蒸餾框架 | 1,932 |
2 重點網絡分析
2.1 Transformers for Image Recognition at Scale
2.1.1 結構描述
和 nanogpt 不同的是 ViT 只有encoder 結構, Nano GPT 是 decoder only.
[ViT / BERT] (Encoder-only): input → Attention(no mask) → FFN → Output
[NanoGPT / GPT] (Decoder-only): input → Attention(masked, 也就是 只能看到過去的token) → FFN → Output
這是 ViT 的 attention 過程,沒有 mask 所以 qkv 輸出可以直接懟到輸出上. 其中歐冠你 attend 是 softmax
看代碼也可以看到 nano gpt 僅僅是增加了一個mask 過程.其他和 vit 無差別.
2.1.2 embedding
作為圖像處理最主要的就是如何將圖像編碼,
可以看到ViT 就是將圖像 分成 3 * 16 * 16 的 小 patch, 每個patch 中的 一個 pixel 就是屬于 layerNorm中的一個維度, 比如這里 3 * 16 * 16 剛好是 768.
我個人在實踐的時候發現,如果用 hugging face 的 pretrained 模型,將其參數遷移ViT(當然 ViT進行了改動,但是分類結果和 hugging face的不一致…不過作為調研和學習足夠了,剩下的工程化過程再解)
2.2 Vision Transformers Need Registers
其實這個人氣并不是 這篇論文,而是 DINOv2 一個自監督學習ViT
2.2.1 DINOv2
其實原論文比較樸素, 就是在 ViT 訓練中,發現經常有artifacts 出現, 下圖就是 “高范數偽影的特征”, 這些token的范數約為其他token的10倍,占總token數量的約2%。這些token通常出現在圖像的背景區域,原本信息量較低, 但攜帶更多的全局信息。
這種情況出現在例如圖中的 DINO v2 非常多平坦區域的artifact, 而 DINO v1 幾乎沒有.
2.2.2 為什么DINO v2 有而v1沒有?
原因一:訓練目標不同(Contrastive vs. Distillation)
DINO v1 使用的是 對比學習(contrastive learning),目標是學習空間上連貫、語義一致的 embedding。它鼓勵所有 token 都有意義(避免冗余 token)。會對異常 token 產生懲罰。所以模型不會“偷偷”把背景 patch 用作臨時內存。
原因二:模型容量更大,ViT 有“懶惰策略”
訓練目標更復雜,主要關注 cls token 的表現。對 patch token 的約束變弱,模型更容易利用背景區域做“緩存”。
原因三:DINO v1 更強的 per-token 學習機制
DINO v1 每個 patch token 都被要求有一致性輸出(比如用不同視角增強后的結果一致)。而 DINO v2 由于有 teacher-student distillation 和更多 cls-guided 目標,patch token 不一定需要一致。
說實話我覺得 cls-guided 才是罪魁禍首.
ViT 分類策略中經常有:[CLS] + patch_1 + patch_2 + … + patch_n 這種方式 CLS token 就成了全局
因為論文作者這么說:The root cause of the artifact
is that ViTs are usually supervised via the [CLS] token only, allowing the model to utilize other tokens for internal memory without constraint.
所以作者引入了更多的全局 register 變為:[CLS] + Register1 ,…,Register R
, patch_1 + patch_2 + … + patch_n
說白了就是從 [CLS] + N 個 patch token 變為 [CLS] + R 個 Register token + N 個 patch token
2.3 FastViT
fastViT 來自于蘋果. 目標是做一個卷積和Attention 的低延時混合架構
,因為這種架構有效地結合了 CNN 和 Transformer(以前的構架是 cnn 后面懟個transformer, 這里是融合) 的優勢,在多個視覺任務上有競爭力。本文的目標是建立一個模型,實現 SOTA 的精度-延時 Trade-off.
核心點有三個:
(1)結構重參數化(Structural Reparameterization)
該模塊利用結構重參數化技術,在訓練階段采用具有跳躍連接的復雜結構以增強表示能力,而在推理階段將其簡化為更高效的結構,從而降低內存訪問成本并提高推理速度。
這里包括 repmixer 和
(3)大核(7x7)卷積的應用
FastViT 在保持低延遲的同時,利用大核卷積增強模型的感受野和特征提取能力,從而提升精度。
其整體結構如下(蘋果工程師寫的論文真的非常清晰, 看得巨爽):
圖中 DW 指depthwise, 最左側是整體數據流. 每個子圖中寫明了 training 的結構和inference結構. 按照描述 每個"Patch Emb. stride=2" 都是相同結構. stage1-3 也是相同結構(原文是這么描述的 Stages 1, 2, and 3 have the same architecture and uses RepMixer for token mixing)
2.3.1 RepMixer
這個結構可以有效減少 memory 訪問 開銷. 其實 repmixer 是 結構參數化的一部分,只是比較重要,我單獨拎出來說.
2.3.2 結構重參數化(Structural Reparameterization)
Output = Conv(x) + x # skip connection
和 2.3.1 一樣,只是2.3.1 單獨拎出來說.
2.3.3 大核(7x7)卷積
作者指出,如果用 self-attention 計算負擔較重,所以引入了大核卷積. 而且作者指出已有 卷及可以替代 attention
2.4 Vision Transformers for Dense Prediction
這是 vit 里的爆款. 應用于像素級的密集預測任務,如語義分割和單目深度估計. 對于很多分割任務, 傳統的卷積神經網絡(CNN)在處理密集預測任務時,通常采用編碼器-解碼器結構。編碼器逐步下采樣輸入圖像
,以提取多尺度特征;解碼器則將這些特征逐步上采樣
,恢復到原始分辨率。然而,這種下采樣-上采樣的過程可能導致細節信息的丟失,尤其是在深層次的特征中。典型例子就是 UNet.
2.4.1 encoder
Encoder部分就是VIT. ViT 輸出的 token 被重構為不同尺度的 feature maps,用于密集預測.
2.4.2 Convolutional decoder
我是這么理解的:
1 如果有, 那么要去掉 [CLS] token
2 因為ViT 的 token 是 3 * patch_height * patch_width 我們用 N = h * w
所以卷積就可以 將 數據從 (B, N, D) 卷積為 (B, D, h, w), 也就是 將N 展開 為 h, w.
2.4.3 fusion
看來這里也需要不同尺寸的數據, 進行 crouse to fine 的進行判斷. 這里 沒什么特別的地方和UNet 非常像.
2.5 Exploring Plain Vision Transformer Backbones for Object Detection
這個ViT 是 何凱明大神的工作–SFP 簡單特征金字塔
如截圖, 就是研究什么模塊發揮什么作用.
2.6 BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers
這里有個幾個詞匯:
(1) patch aggregation : patch 匯集
(2) code book collapse: 在 VQ(Vector Quantization)訓練中,一個常見問題是 codebook collapse,即只有少數幾個 code(離散碼)會被頻繁使用,大多數 code 永遠用不上
首先作者肯定了Masked image modeling (MIM) 在自監督學習上的效果, 同時也指出問題就是 大部分的已有工作都是在 low-level image pixels 上搞事情, 所以本文提出了一個 方法將 MIM 從 pixel-level 提高到 semantic-level.
作者提出了一個自監督的網絡,并且有如下貢獻:
1 使用 Vector-Quantized Knowledge Distillation (VQ-KD),也就是使用一個強大的視覺教師模型(比如 RegNet)生成 soft target,然后再離散化成視覺 token。
2 提出了一個 patch匯合策略(patch aggregation strategy), 這個策略會基于給定的離散語義token上增強全局結構.
2.6.1 VQ-KD
VQ-KD 的結構如下圖:
這里要說明的是,其實作者工作內容沒有那么牛逼:
1 構建了一個 codebook
2 將輸入圖片通過ViT 生成 token
3 和 code book 比較 二范式的距離, 進行翻譯后 得到一個 visual token
4 再將visual token 送給decoder 也是 ViT, 得到一個 semantic reconstruction, 這個reconstruction 可以 和 老師 模型的 reconstruction 進行比較
所以 VQ 就是常見做法, KD 就是 用一個 teacher 模型 比較下結果, 就這么簡單.
這里我說下 VQ, 先要定義一個離散隱變量空間KaTeX parse error: Undefined control sequence: \inR at position 2: e\?i?n?R?^{K*D}, 也成為embedding 空間. 其中 K 是空間大小, D 是 每個embedding向量 e i e_i ei?的維度.所以得到一個 encoder 的輸出token可以按照下述方法量化:
z q ( x ) = Q u a n t i z e ( z e ( x ) ) = e k 其中 , k = a r g m i n i ∣ ∣ z e ( x ) ? e i ∣ ∣ 2 z_q(x) = Quantize(z_e(x)) = e_k 其中 , k= arg min_i || z_e(x) - e_i||_2 zq?(x)=Quantize(ze?(x))=ek?其中,k=argmini?∣∣ze?(x)?ei?∣∣2? 也就是圖中說的找二范數距離.
該方法和之前的方法: VQ-VAE非常像,只不過紅框內換成了 ViT
VQ-VAE的講解可以看:https://zhuanlan.zhihu.com/p/463043201,
2.6.2 patch aggregation strategy
這個 aggregation 比較常見,這里做一個對比
傳統 CNN | ViT 的 Patch Aggregation |
---|---|
卷積 + 池化 | patch 合并 + 投影 |
多層感受野變大 | token 數量減少,語義增強 |
下圖 是作者列出的 patch aggregation strategy, 和 很多 ViT 一樣, 用[CLS] token 與所有 patch token 建立關聯,從而提升模型的全局理解能力, 后面基層的token 只用 cls 前面
代碼中也可以看到 ,前6層作為一個輸入,后6層的 cls 作為 一個 輸入, 送入兩層的ViT中,就是這么簡單
來自:https://blog.csdn.net/weixin_50862344/article/details/131262830
2.6.2 code book collapse
作者
2.7 VATT: Transformers for Multimodal Self-Supervised Learning from Raw Video, Audio and Text
框架的核心思想是使用純 Transformer 架構(無卷積)從原始的多模態數據(視頻、音頻和文本)中學習通用的表示。?VATT 通過對比學習的方式進行訓練,能夠在多個下游任務中實現優異的性能.
該論文中定義:
視覺模態(vision modality): rgb 的 video
聽覺模態(audio modality): 就是聲波
文本模態(text modality): 就是字符串
注意這里有個概念 voxel: 是 "volume" + "pixel" 的組合詞,表示三維空間中的一個小立方體單位,就像像素是二維圖像中的最小單位一樣。
該論文有益點有3:
(1) Tokenization and Positional Encoding 和 DropToken:
(2) Common Space Projection
(3) Multimodal Contrastive Learning
2.7.1 Tokenization and Positional Encoding 和 DropToken:
對于video 數據:
假設整個 video 數據尺寸是 THW , 一個 patch 大小 是 t * h * w, 那么就可以將 video轉為 ? T / t ? × ? H / h ? × ? W / w ? \lceil T/t \rceil \times \lceil H/h \rceil \times \lceil W/w \rceil ?T/t?×?H/h?×?W/w? 個 patch.
注意: 最小單元 是 t * h * w * 3 叫做 voxel
因此對于 video 形成的可用于訓練學習的 weight 為 W v p ∈ R t ? h ? w ? 3 × d W_{vp} \in R^{t*h*w*3 \times d} Wvp?∈Rt?h?w?3×d , d 是向量的維度. 也就是 d 個 voxel. vp 指 video position
對于 auido 數據:
假設整個audio 數據是1D 數據,長度 為T’, 那么就是 ? T ′ / t ′ ? \lceil T'/t' \rceil ?T′/t′?
因此對于 audio 形成的可用于訓練學習的 weight 為 W a p ∈ R t ′ × d W_{ap} \in R^{t' \times d} Wap?∈Rt′×d , d 是向量的維度. 也就是 d 個 voxel. ap 指 audio position
對于 text 數據:
和 nanogpt 基本一樣, 映射到 一個字典空間中, 該空間 是 v*d, v 指 vocabulary size.
那么有 W t p ∈ R v × d W_{tp} \in R^{v \times d} Wtp?∈Rv×d
得到最終 embedding
因此, 可以看到 只有 video 有 hoizon 和 vertical 分量, text 和 audio 都沒有.
模態 | 使用的位置信息 | 說明 |
---|---|---|
Text | Temporal(時間/順序) | 文本是一個自然的序列:第1個詞、第2個詞… |
Audio | Temporal(時間幀序列) | 通常使用音頻的時間維度進行幀級patch劃分(例如 spectrogram),也只用1D位置編碼 |
Video | Temporal Horizontal + Vertical | 視頻是三維結構(時間 × 高 × 寬),所以需要 3D 位置編碼 |
DropToken 和 dropout 類似,就是隨機丟掉token :
(1) 防止過擬合
(2) 防止 過分以來某個token
2.7.2 Common Space Projection
首先說明下兩個專有詞匯:三元組: video-audio-text triplet 以及 語義粒度: semantic granularity.
接著,作者定義了兩個 pair: video-audio pair 和 video-text pair 如圖:
我這里 有個疑問, 為什么沒有text-> audio 的空間? 我是這么理解的, 因為 video 維度最全,信息最多, 音頻 和 text 都是 粗粒度的,因次有 video->audio 和 video->text
2.7.3 Common Space Projection
這里 還有個細節:
而
這里有這樣的 理解: video 和 audio 可以時序對應起來 ,但是 text 不是.
所以 video 和 audio的 就是對應求NCE 也就是這個公式
因為 text 和 video 不是這樣映射, 因此有:
給定 video feature: z v , v t \mathbf{z}{v,vt} zv,vt 和一組與之對應的文本特征集合 z t , v t {\mathbf{z}{t,vt}} zt,vt (有多個! 所以需要 Σ \Sigma Σ)
其中: P P P 是這些文本的集合,都是正樣本; N \mathcal{N} N 是負樣本集合。
所以就有了下面論文中哦個你的公式
這個公式整體也是個 softmax
因為是 triplet 關系,所以最后最后來了個整體 loss:
2.7.4 only self attention
2.7.3 中的 NCE 就是在各自模態下算特征, 所以 VATT 沒有 cross attention
, 總結下 (和 后面 的 Qwen 大模型不一樣的思路):
Video Encoder: 純視頻特征 -> 自己的Transformer(Self-Attention)
Audio Encoder: 純音頻特征 -> 自己的Transformer(Self-Attention)
Text Encoder: 純文本特征 -> 自己的Transformer(Self-Attention)
Late Fusion: 三個特征合并
2.8 總結
step1: 每個模態(Video, Audio, Text)單獨走自己的 Transformer Encoder
(1)輸入是patch embedding(視頻幀patch、音頻幀patch、文本tokens)
(2)每個Transformer內部是純Self-Attention
(3)得到一個 [CLS] token 或者 global pooled特征
step2: 模態內自己加個小MLP頭(projection head)
(1)讓每個模態的 [CLS] 特征,變成一個統一長度(比如512維)的向量
(2)用來放到共享對比空間里
step3 :對比損失(NCE)
(1) Audio和Video特征計算 InNCE loss
(2)Video和Text特征計算 multi-NCE loss
(3) vt loss 和 va-loss 相加, 得到特征計算 InfoNCE loss
2.8 Grounded SAM: Assembling Open-World Models for Diverse Visual Tasks
論文里的這張圖清晰地說明了 Grounded DAM 是什么 以及 可以做什么
其他沒有啥了
2.9 Qwen-VL
論文地址 https://arxiv.org/pdf/2409.12191 Qwen-VL 沒有開源,只給了 modeling 和 fine tunning.
詞匯:scaling laws: 擴展規律
我們先了解下 Qwen-VL 結構
如果說的簡單一些, 千問模型就是 vit + llm.
但是千問團隊絕沒有這么簡單. 根據文章描述,
2.9.1 Naive Dynamic Resolution
很簡單
train 過程就是 加了2D-RoPE
infernece 過程用的還是將其形成1D token 并且將 2x2 的 位置關系的token 壓縮為一個token.
2.9.2 Multimodal Rotary Position Embedding
注意這里有個細節, 在 ViT 部分,作者用了RoPE
但是在 llm 部分,如果還用RoPE 那么就有問題, 因為用1D 位置編碼限制了模型對于空間(space)和時序(temporal)上的變化. 所以本文提出了 MRoPE
這里 附上蘇劍林大佬
的博文,寫的挺好的https://www.spaces.ac.cn/archives/10040
代碼實現見:
https://github.com/huggingface/transformers/blob/1759bb9126e59405f58693a17ef9f58040c2008b/src/transformers/models/qwen2_vl/modeling_qwen2_vl.py#L1357
不贅述
2.9.3 Unified Image and Video Understanding
(1) 采取一秒取兩幀
(2) 用了3D-conv 一次卷積兩個input(就是一秒的兩幀)
2.10 Colossal-AI
分布式ai 訓練庫, 重要的分布式訓練工程, 不贅述.
2.11 Neural Architecture Search using Property Guided Synthesis(NAS)
這個工程就是大名鼎鼎的 NAS, 就是大力出奇跡,就是用大量的計算資源來試網絡,幫你設計網絡, 這樣不用低效的人工探索.
這個工程地址:https://github.com/google-research/google-research
知乎的這篇講解非常好,不贅述: https://www.zhihu.com/question/359162202