論文筆記【2】-- Cait : Going deeper with Image Transformers
動機
去優化Deeper Transformer,即,讓deeper的 vision transformer 收斂更快,精度更高。
所提方法(改進模型結構)
方法1 : LayerScale

圖中 FFN 代表feed-forward networks; SA代表self- attention; η 代表Layer Normalization; α代表一個可學習的參數(比如,0, 0.5,1 );λ可是一個可學習的參數,它們構成了一個對角矩陣。
通過實驗得出:圖(a)(b)結構都不會使訓練收斂,将(a)(b)結合變成圖(c)中的結構,發現其在網絡較深時也能收斂。圖(d)是本文所用結構,即LayerScale。
LayerScale目的:給不同通道乘上一個λ,見公式好了解:
這麼做的原因 : 個人認為,(b)(c)中的 α 是一個實數,即,FFN或SA的輸出特征都統一乘以α;而圖(d)中,FFN或SA輸出特征的不同channel乘上不同的數值,會使得特征更細化,更精準。類似于CNN中channel注意力的感覺。
方法2 : class-attention layers
在原ViT中,在模型一開始輸入時候加入了一個叫做class token的東西,在ViT中這個class token要做兩件事:
- 引導attention過程,幫助得到attention map。
- 這些token還要輸入到classifier中,完成分類任務。
作者認為class token要同時做到這2件事其實有點沖突,參數會朝着沖突的方向優化。對于分類任務,class token的目的隻是為了獲得圖檔的所有資訊,用于最後的分類。
既然class token隻是為了獲得圖檔的全部資訊,那為什麼要在一開始就同patch一起送入網絡參與attention活動?大可不必吧。是以本文沒有按照原ViT的操作,而是将class token 放在模型的最後兩層處加入,如下圖(中)所示:
CA層公式表示:
問題1:為什麼class token 放到了網絡的後面也可以呢?我們知道圖檔的資訊都在patch embedding裡面,是以我們隻需要用class token來抽取patch embedding中的資訊就相當于class token擁有了圖檔的資訊。
問題2:為什麼class token 放到了網絡的後面效果更好呢?class token若是和patch embedding同時送入網絡,在計算attention時候,class token和patch embedding二者之間就會有資訊的互相傳遞,而然事實上,我們想要的是,用class token 抽取patch embedding中的資訊,而不需要将class token 中的資訊傳遞給patch embedding 。是以将class token 往後放,就使得class token專注于它的工作,即專注于抽取圖檔的資訊。
總結:
為了讓deeper transformer 更易訓練,提高精度。本文在原ViT網絡架構的基礎上做了兩處的改動:LayerScale 和 class-attention layers。