作者:Ta-Ying Cheng,牛津大學博士研究生,Medium技術博主,多篇文章均被平臺官方刊物Towards Data Science收錄
圖源:Unsplash
目前卷積神經網路(CNN)已經成為了在計算機視覺和影像相關任務中深度網路的主要技術支柱。因其與傳統的多層感知器(MLP)相比,在二維鄰域感知和平移同變性方面具有顯著優勢。然而,最近在自然語言處理領域颳起了一陣新趨勢,越來越多的人開始用Transformer來取代迴圈神經網路(RNN),而這也讓CV從業者對Transformer的潛力感到非常好奇。
不久前的ICLR 2021*剛好就有一篇論文探討了Transformer在CV領域的應用前景,並率先提出了“視覺Transformer”的概念,與基於卷積的模型形成鮮明對比。
本文將帶大家深入探討Transformer的概念,特別是視覺Transformer及其與卷積的比較。我們還將簡單介紹如何在PyTorch上訓練Transformer。
*注:國際學習表徵會議(ICLR)是世界頂級的深度學習會議。
卷積網路有什麼優勢?
為什麼卷積網路在計算機視覺領域如此受歡迎?答案就在於卷積的固有性質。卷積核能夠將圖片內臨近畫素的特徵聚集在一起,使模型能夠在學習過程中將這些特徵統籌起來。此外,當我們在影像中移動卷積核時,核經過任何地方都能將矩陣內的特徵用於分類(稱為平移同變性,translation equivariance)。因此,卷積網路無需考慮特徵在影像中的位置就能提取特徵,在過去幾年中讓影像分類任務出現了重大進展。
但既然卷積網路已經如此強大,我們為什麼還需要Transformer呢?
自然語言處理中的Transformer
圖 1. Transformer中的尺度變換點乘注意力機制和多頭注意力機制. 源: https://arxiv.org/abs/1706.03762.
Transformer首先在自然語言處理領域提出,論文為“Attention Is All You Need”(《你只是需要有點注意力而已》)。傳統的NLP方法(如RNNs和LSTMs)在計算任何預測時都會考慮到短語內附近的詞。然而,由於每次出現新的輸入時演算法都需要考慮到之前已經出現的所有輸入,因此模型的預測速度並不算快。
Transformer則利用了“注意力”這一概念。“注意力”某種程度上其實就是向量詞之間的相關性,模型利用這種相關性來計算出最終的預測結果。由於一個詞與其他詞的相關性獨立於其他詞之間的相關性,模型得以對所有詞進行同時計算。由此,Transformer進一步最佳化了深度網路的計算邏輯。透過同時考慮所有的詞及其相關性,其實際效能明顯優於傳統的遞迴方法。
此外,Transformer還加入了“多頭注意力”(multi-headed attention)機制,可以多次並行執行注意力機制,並將分離的向量串聯成最終的輸出結果。
視覺領域的注意力轉向
圖 2. 視覺Transformer的Pipeline. 影像被切分為塊,並被壓平以模仿序列的結構. 源: https://arxiv.org/abs/2010.11929.
既然Transformer能讓自然語言處理更上一層樓,一個自然的想法即是把這種進步帶到像計算機視覺這樣的領域中去。我們找到了一篇關於視覺Transformer(ViT)的論文。ViT將影像劃分為一個個的塊(patch),並將這些塊轉換為向量(embedding),然後放到序列當中(模擬NLP中的向量)找到彼此之間的相關性。
上手試驗
在本節中,我們將親手試驗已經充分預訓練過的的視覺Transformer,並在各種資料集上測試其能力。值得注意的是,ViT的原始論文做過大量研究,發現ViT只有在預訓練的資料集達到非常大的規模時才會勝過卷積網路。因此,如果你手頭上的算力相當有限,效果可能並不會非常顯著。
資料集
為了能夠充分試驗ViT的能力和適用性,我們需要用多個不同的資料集進行測試。格物鈦開放資料集平臺免費提供了CV領域眾多著名資料集,不僅下載速度非常快,還能直接使用格物鈦提供的SDK整合到自己的程式碼中,加速資料獲取和模型迭代。
在PyTorch中使用ViT
前面已經提到過,ViT需要規模極大的資料集才能訓練出優秀的特徵提取效果來,因此訓練過程非常困難。不過,現在GitHub上已經有很多repo提供已經搭建和訓練好的ViT模型。為了能夠快速見識到ViT的力量,我們將使用lucidrains提供的模型。
首先我們需要在pip中安裝vit-pytorch:
pip install vit-pytorch
一定要確保Pytorch和Torchvision的版本已是最新。
""" Import the necessary libraries """ import torch from vit_pytorch import ViT
匯入了我們需要的庫之後,我們可以用如下程式碼建立一個ViT:
""" Create a visual transformer, declaring the number of classes, image size, etc. Make sure that image_size is divisible by patch_size. """ v = ViT( image_size = 256, patch_size = 32, num_classes = 1000, dim = 1024, depth = 6, heads = 16, mlp_dim = 2048, dropout = 0.1, emb_dropout = 0.1 )
如果僅僅需要用ViT來進行推理(inference),使用以下程式碼即可:
""" Feed in the image as a standard image model of size (batch, 3, image_size, image_size) The output will be in the dimension of (batch_size, num_classes) """ preds = v(img)
如果你真的很想嘗試自己去進一步訓練ViT,可以參考這篇文章中介紹的方法,透過“蒸餾”(distillation)來進行訓練,減少所需的資料量。前述的vit-pytorch倉庫裡即有提及相關程式碼。
結果
圖 2. ViT在多個大型資料集上的結果. 源: https://arxiv.org/abs/2010.11929.
ViT的原始論文已經可以讓我們看到,ViT的效能可以非常突出,但前提是一定要用非常大型的資料集進行預訓練,且預訓練所需要的算力之多也是極為驚人。
結語
近年來,計算機視覺領域一直在不斷改進Transformer,使其能夠更加適應影像處理乃至三維點雲任務的需要。最近的ICCV 2021亦出現瞭如雲Transformer和Swin Transformer(會議最佳論文獎得主)這樣的優秀文章,表明注意力機制已然成為影像處理的新趨勢。
更多資訊請訪問格物鈦官網