北深袁粒老師的工作掖肋,仍然是ImageNet上設(shè)計(jì)的transformer型模型勿锅,主要貢獻(xiàn)在于提出一種稱為outlooker的注意力層早抠,這種結(jié)構(gòu)結(jié)合了卷積局部信息整合和注意力層的優(yōu)勢(shì)腌巾,在transformer backbone和patch embedding的幫助下實(shí)現(xiàn)了性能提升 ImageNet上不借助預(yù)訓(xùn)練首次突破87.1%的top1正確率杠袱。
核心attention層: outlooker
該attention主要操作基于以上偽代碼(pytorch類似)。其核心操作主要有unfold和fold以及中間被替換的score矩陣計(jì)算方式智绸,借助一次線性映射而不是兩次線性映射加一次矩陣乘法野揪,outlooker相對(duì)普通multi-head attention減少了MACs降低了復(fù)雜度访忿。
unfold
unfold操作實(shí)際上類似于conv層滑動(dòng)取窗口的機(jī)制,我們?cè)O(shè)定好kernel_size, stride, dilation等參數(shù)后斯稳,即可對(duì)B*C*H*W這樣的張量在H*W這樣的空間維上進(jìn)行滑動(dòng)取窗口海铆,最后得到的新矩陣為B*(C*k*k)*n。k為kernel_size, n為總共取到的窗口數(shù)挣惰。
fold
fold則是unfold的逆過(guò)程卧斟,給定kernel_size,stride, dilation和output_size等參數(shù)后憎茂,它可以將B*(C*k*k)*n這樣的矩陣還原回B*C*H*W珍语。這里稍微注意為什么要相對(duì)unfold多給定一個(gè)output_size呢?因?yàn)槠鋵?shí)我們發(fā)現(xiàn)不管輸入矩陣還是給定參數(shù)除了output_size我們并不知道H*W, 給定kernel_size后我們可以求得C, 但是n是由H和W兩個(gè)維度共同構(gòu)成的竖幔,所以如果不顯示指明H*W那么是可能包含多種滿足條件的H*W(例如H與W互換)板乙。
同時(shí)在pytorch中,fold實(shí)際上做的操作是把那些由unfold拓展出來(lái)的位置上的元素全部加和再放回原始矩陣拳氢,那么這個(gè)加和操作就會(huì)使得原位置元素值翻倍而非不變募逞,所以其實(shí)fold和unfold大部分時(shí)候并不是真正互逆的,要想實(shí)現(xiàn)互逆應(yīng)當(dāng)對(duì)元素取平均馋评。
outlooker
那么除去了類似conv這樣考慮滑動(dòng)窗口的unfold和fold過(guò)程放接,outlooker和普通scaled dot-product有什么區(qū)別呢??
由公式(4)可以看出其核心思路和attention層并無(wú)區(qū)別留特, 唯一就是score矩陣由原來(lái)的QK’, 變成了此處的A_{i,j}透乾,而這里的A實(shí)際上是直接由輸入X通過(guò)線性映射直接得到的一個(gè)矩陣,也就是說(shuō)相對(duì)于分別線性映射得到Q和K再做矩陣乘法得到score矩陣磕秤,這里直接采用了一個(gè)線性映射得到score矩陣,從而降低了計(jì)算復(fù)雜度捧韵。而之前的scaled乘以系數(shù)以及softmax歸一都在代碼中得到了保留市咆。
misc
VOLO模型是基于LV-ViT進(jìn)行改進(jìn)的,其中利用的patch embedding并沒(méi)有進(jìn)行額外說(shuō)明再来,但是對(duì)模型性能等有重要的影響蒙兰。同時(shí)將conv和transformer做結(jié)合似乎是一個(gè)現(xiàn)階段的一個(gè)趨勢(shì),其他工作(同一作者的T2T ViT)也保持了這樣的一些變化或比較趨勢(shì)芒篷。