[21.06] BEiT
離散編碼預訓練
BEiT: BERT Pre-Training of Image Transformers
這篇論文的主要比較對象是 ViT 和 DeiT。
主要想要解決的問題是如何提升 ViT 架構在 ImageNet 上的分類性能。
定義問題
我們都知道 BERT 在過去一段時間已經透過 MLM 的預訓練手法取得輝煌的戰果,可以說是自編碼模型最有用的一個預訓練方式。
但是在圖像領域,BERT 的概念卻不那麼好用。在 ViT 中,作者嘗試把模型進行遮罩後,預測每個遮罩的「RGB 平均值」,用這種方式來達成自監督學習,但最後的結果顯示效果不如預期。最後還是選用監督式學習的方式來進行預訓練。
前人留下來的懸念,後續當然是要解決的。
這篇論文的作者提出了一個新的預訓練方法:
- 或許我們不要直接預測圖像的像素值,而是預測圖像的「離散標籤」。使用這樣的方式,可以讓模型學習到更高層次的特徵,而不是只是學習到圖像的像素值。
解決問題
模型架構
在這裡同時存在兩個架構,我們依序來看。
第一個架構是類似 VAE 的結構,在上圖中最上面那一部分,這不是作者提出的架構,僅是使用前人的研究結果。實際上這個部分也不參與訓練,只用來負責把圖像拆成一個個小塊,並附上一個標籤。
這個部分的目的是要將圖像離散化,讓模型學習到圖像的高層次特徵而不僅是像素值。整體概念比較像是訓練一個「圖像字典」,分別對應了圖像不同的抽象概念,在這裡總共有 8192 個標籤。
這個部分訓練方式和詳細內容,請另外參考原論文:
-
[21.02] Zero-Shot Text-to-Image Generation
提示對,你沒看錯,就是大名鼎鼎的 DALL-E。
第二個架構就是上圖下半部,也就是真正參與梯度更新的模型。
這裡跟我們認識的 ViT 一模一樣。差別在於原本的 ViT 是使用圖像標籤進行監督,而這裡則是引入了 BERT 的 MLM 機制:
-
Patchify:將圖像拆成一個個小塊,這個跟 ViT 一樣。
-
Blockwise Masking:從這裡開始不一樣,這邊會隨機遮罩掉一些小塊,遮罩邏輯在論文中有提到:
可以看到,這個遮罩邏輯是「區塊式」的,而不是像 BERT 那樣是「Token 級」的遮罩。這邊每次迭代都會隨機產生一個長寬比,然後選定遮罩大小,最後把整個區塊蓋起來。
這個動作會不斷地重複,直到遮住 40% 的圖像區塊才停止。
-
Transformer Encoder:這個部分就是 ViT 的 Encoder,被遮罩的區塊會一起進入到模型中,然後進行預測。
-
Masked Patch Prediction:這個部分就是預測遮罩區塊的標籤,這個標籤是上面提到的 8192 個標籤之一。
訓練方式
BEiT 的網路架構遵循 ViT-Base 的設計,以確保公平比較。BEiT 使用了 12 層的 Transformer 結構,具有 768 的隱藏層大小和 12 個注意力頭,而 FFN 的中間大小為 3072。輸入 patch 的大小為 16 × 16,視覺標記的詞彙大小為 8192,這些標記由訓練好的圖像分詞器生成。
BEiT 在 ImageNet-1K 的訓練集上進行預訓練,該訓練集包含約 120 萬張圖像。預訓練過程中,圖像增強策略包括隨機調整大小裁剪、水平翻 轉和顏色抖動。需要注意的是,預訓練過程不使用標籤。
作者在實驗中使用 224 × 224 的解析度,將輸入圖像分割成 14 × 14 的 patch,隨機遮蔽最多 75 個 patch(約 40%)。
預訓練大約進行 500,000 步(即 800 個 epoch),批次大小為 2000。使用 Adam 優化器,,學習率設定為 ,前 10 個 epoch 為預熱階段,隨後進行餘弦學習率衰減。權重衰減為 0.05,並採用隨機深度技術,速率為 0.1。
訓練使用 16 張 Nvidia Tesla V100 32GB GPU 卡,大約需要五天時間。