视觉注意力机制(中)
簡介
在上篇文章中,我介紹了視覺注意力機制比較早期的作品,包括Non-local、SENet、BAM和CBAM,本篇文章主要介紹一些后來的成果,包括A2A^2A2-Nets、GSoP-Net、GCNet和ECA-Net,它們都是對之前的注意力模型進行了一些改進,獲得了更好的效果。
本系列包括的所有文章如下,分為上中下三篇,本文是中篇。
回顧
我們首先還是來回顧一下卷積神經網絡中常用的注意力,主要有兩種,即空間注意力和通道注意力,當然也有融合兩者的混合注意力,畫了個示意圖如下。
我們知道,卷積神經網絡輸出的是維度為C×H×WC\times H \times WC×H×W的特征圖,其中CCC指的是通道數,它等于作用與輸入的卷積核數目,每個卷積核代表提取一種特征,所以每個通道代表一種特征構成的矩陣。H×WH \times WH×W這兩個維度很好理解,這是一個平面,里面的每個值代表一個位置的信息,盡管經過下采樣這個位置已經不是原始輸入圖像的像素位置了,但是依然是一種位置信息。如果,對每個通道的所有位置的值都乘上一個權重值,那么總共需要CCC個值,構成的就是一個CCC維向量,將這個CCC維向量作用于特征圖的通道維度,這就叫通道注意力。同樣的,如果我學習一個H×WH\times WH×W的權重矩陣,這個矩陣每一個元素作用于特征圖上所有通道的對應位置元素進行乘法,不就相當于對空間位置加權了嗎,這就叫做空間注意力。
上篇文章介紹的Non-local是一種空間注意力機制,而SENet是典型的通道注意力,BAM和CBAM則是混合注意力的代表。
網絡詳解
A2A^2A2-Nets
A2A^2A2-Nets,也叫AA-Nets,指的就是Double Attention Networks,可以認為是Non-local的拓展工作,作為長程交互的信息交互捕獲方法而言,相比于Non-local,論文中的方法精度更高、參數量更少。作者文中也直言,這篇文章基于了很多注意力的共工作,包括SENet、Non-local、Transformer。
論文的核心思想是首先將整個空間的關鍵特征收集到一個緊湊的集合中,然后自適應地將其分布到每個位置,這樣后續的卷積層即使沒有很大的接收域也可以感知整個空間的特征。第一次的注意力操作有選擇地從整個空間中收集關鍵特征,而第二次的注意力操作采用另一種注意力機制,自適應地分配關鍵特征,這些特征有助于補充高級任務的每個時空位置。因為這兩次注意力的存在,因此稱為Double Attention Networks。
下面就來看看這篇文章的方法論,不過,在此提醒,這篇文章的數學要求很高,對注意力的建模也很抽象,需要多看幾次論文才能理解,不過,結構上而言,這些花里胡哨的公式都是靠1x1卷積實現的。下圖就是總體的pipeline設計,這張圖分為左圖、右上圖和右下圖來看。先看左圖,這就是Double Attention的整體思路,一個輸入圖像(或者特征圖)進來,先計算一堆Global Descriptors,然后每個位置會根據自己的特征計算對每個Global Descriptor的權重(稱為Attention Vectors),從而是對自己特征的補充,如圖中的紅框中的球,所以它對球棒等周圍物體的依賴很高,對球本身的依賴就很小。Global descriptors和Attention Vectors相乘就恢復輸入的維度從而得到注意力結果。Global Descriptors和輸出的計算細節就是右邊兩圖,我們下面會具體數學分析。
上面的整個過程,數學表達如下式,顯然,這是個兩步計算,其計算流圖如下圖。
zi=Fdistr?(Ggather?(X),vi)\mathbf{z}_{i}=\mathbf{F}_{\text {distr }}\left(\mathbf{G}_{\text {gather }}(X), \mathbf{v}_{i}\right) zi?=Fdistr??(Ggather??(X),vi?)
上圖有先后兩個步驟,分別是Feature Gathering和Feature Distribution。先來看Feature Gathering,這里面用了一個雙線性池化,這是個啥呢,如下圖所示,由雙線性CNN這篇文章提出來的,A2?NetsA^2-NetsA2?Nets只用到了最核心的雙線性池化的思路,不同于平均池化和最大池化值計算一階統計信息,雙線性池化可以捕獲更復雜的二階統計特征,而方式就是對兩個特征圖A=[a1,?,ahw]∈Rm×hwA=\left[\mathbf{a}_{1}, \cdots, \mathbf{a}_{ h w}\right] \in \mathbb{R}^{m \times h w}A=[a1?,?,ahw?]∈Rm×hw和B=[b1,?,bhw]∈Rn×hwB=\left[\mathbf_{1}, \cdots, \mathbf_{ h w}\right] \in \mathbb{R}^{n \times h w}B=[b1?,?,bhw?]∈Rn×hw計算外積,每個特征圖有h×wh \times wh×w個位置的特征,每個特征是通道數mmm和nnn維度。下面這個公式其實就是對兩個特征圖的同樣位置的兩個向量進行矩乘然后求和,這里當然得到的是一個m×nm \times nm×n維的矩陣,將其記為G=[g1,?,gn]∈Rm×nG=\left[\mathbf{g}_{1}, \cdots, \mathbf{g}_{n}\right] \in \mathbb{R}^{m \times n}G=[g1?,?,gn?]∈Rm×n。 有人問,這個AAA和BBB是怎么來的,是通過1x1卷積對XXX變換得到的,其中AAA發生了降維,而BBB沒有。
Gbilinear?(A,B)=AB?=∑?iaibi?\mathbf{G}_{\text {bilinear }}(A, B)=A B^{\top}=\sum_{\forall i} \mathbf{a}_{i} \mathbf_{i}^{\top} Gbilinear??(A,B)=AB?=?i∑?ai?bi??
作者這里給了一個解釋,如果將特征圖BBB改寫為B=[b ̄1;?;b ̄n]B=\left[\overline{\mathbf}_{1} ; \cdots ; \overline{\mathbf}_{n}\right]B=[b1?;?;bn?],那么G\mathbf{G}G的計算式可以寫成下面的形式,此時每個bib_ibi?都是一個h×wh \times wh×w的行向量,AAA又是m×hwm\times hwm×hw的,所以gig_igi?等同于AAA乘上一個注意力向量bib_ibi?得到mmm維的向量。從這個角度來看,GGG實際上是一個圖片上視覺基元的集合,每個基元gig_igi?都通過b ̄i?\overline{\mathbf}_{i}^{\top}bi??加權的局部特征聚合得到。
gi=Ab ̄i?=∑?jb ̄ijaj\mathbf{g}_{i}=A \overline{\mathbf}_{i}^{\top}=\sum_{\forall j} \overline{\mathbf}_{i j} \mathbf{a}_{j} gi?=Abi??=?j∑?bij?aj?
因此,自然誕生了一個新的注意力設計想法用來聚合信息,對b ̄i?\overline{\mathbf}_{i}^{\top}bi??應用softmax保證所有元素和為1(這就是上面提到的Attention Vectors),從而G∈Rm×nG\in \mathbb{R}^{m \times n}G∈Rm×n的計算如下式,nnn個ggg組成的就叫做Global Descriptors。
gi=Asoftmax?(b ̄i)?\mathbf{g}_{i}=A \operatorname{softmax}\left(\overline{\mathbf}_{i}\right)^{\top} gi?=Asoftmax(bi?)?
這第一步Feature Gathering我就解釋到這里,具體哪里代表哪一個張量我在之前的圖上進行了標注。 下面,來看Feature Distribution這一步,將從整幅圖得到的緊湊的Global Descriptors分發給各個位置,因此,后續處理使用小卷積核也能獲得全局信息。受到SENet的啟發,不過它是對每個位置分發同一個通道注意力值的,作者認為應該根據該位置的值的需求去有選擇地分發視覺基元,因此對一個通道上地所有空間的hwhwhw個元素進行softmax然后和GGG相乘,就得到那個位置的注意力結果,顯然GGG是m×nm\times nm×n的,而vvv是n×hwn \times hwn×hw維向量,他倆按照下式的計算結果為一個m×hwm \times hwm×hw維度的結果,再經過1x1卷積升維和原始的XXX相加都得到注意力后的結果。
zi=∑?jvijgj=Ggather?(X)vi,where?∑?jvij=1\mathbf{z}_{i}=\sum_{\forall j} \mathbf{v}_{i j} \mathbf{g}_{j}=\mathbf{G}_{\text {gather }}(X) \mathbf{v}_{i}, \text { where } \sum_{\forall j} \mathbf{v}_{i j}=1 zi?=?j∑?vij?gj?=Ggather??(X)vi?,?where??j∑?vij?=1
至此,完成了Double Attention Block的構建,它分兩步進行,總的計算式如下(AAA、BBB和VVV都是1x1卷積實現的),它也可以改寫為下面第二個式子,這兩個式子數學上等價,但是復雜度不同,而且后面的計算方法空間消耗很高,一個32幀28x28的視頻,第二個式子需要超過2GB的內存,而第一個式子只需要約1MB,所以在一般的(dhw)2>nm(dhw)^2 > nm(dhw)2>nm的情況下,建議采用式1。
Z=Fdistr?(Ggather?(X),V)=Ggather?(X)softmax?(ρ(X;Wρ))=[?(X;W?)softmax?(θ(X;Wθ))?]softmax?(ρ(X;Wρ))\begin{aligned} Z &=\mathbf{F}_{\text {distr }}\left(\mathbf{G}_{\text {gather }}(X), V\right) \\ &=\mathbf{G}_{\text {gather }}(X) \operatorname{softmax}\left(\rho\left(X ; W_{\rho}\right)\right) \\ &=\left[\phi\left(X ; W_{\phi}\right) \operatorname{softmax}\left(\theta\left(X ; W_{\theta}\right)\right)^{\top}\right] \operatorname{softmax}\left(\rho\left(X ; W_{\rho}\right)\right) \end{aligned} Z?=Fdistr??(Ggather??(X),V)=Ggather??(X)softmax(ρ(X;Wρ?))=[?(X;W??)softmax(θ(X;Wθ?))?]softmax(ρ(X;Wρ?))?
Z=?(X;W?)[softmax?(θ(X;Wθ))?softmax?(ρ(X;Wρ))]Z=\phi\left(X ; W_{\phi}\right)\left[\operatorname{softmax}\left(\theta\left(X ; W_{\theta}\right)\right)^{\top} \operatorname{softmax}\left(\rho\left(X ; W_{\rho}\right)\right)\right] Z=?(X;W??)[softmax(θ(X;Wθ?))?softmax(ρ(X;Wρ?))]
這篇文章算的上很會講故事了,把注意力解釋的非常抽象、層次很高,最后竟然全靠1x1卷積實現,這就是大繁至簡嗎(手動狗頭)?Double Attention Block的優勢應該是能用更少的層數達到與更多的層數帶來的接近的大感受野的效果,這適用于輕量級網絡。
GSoP-Net
GSoP指的是Global Second-order Pooling,它是相對于GAP這種常用在網絡末端的全局一階池化的下采樣方式,不過之前的GSoP都是放在網絡末端,這篇論文將其放到了網絡中間層用于注意力的學習,這也在網絡的早期階段就可以獲得整體圖像的二階統計信息。按照這個思路設計的GSoP模塊可以以微量的參數嵌入到現有網絡中,構建的GSoP-Net如下圖。它緊跟在GAP后面生成緊湊的全局表示時,稱為GSoP-Net1(下圖右側),或者在網絡中間層通過協方差矩陣表示依賴關系然后實現通道注意力或者空間注意力,這稱為GSoP-Net2(下圖左側),本文介紹主要關注GSoP-Net2。
GSoP這種池化策略,它已經被證明在在網絡末端使用會帶來較好的性能提升,因為二階統計信息相比一階線性卷積核獲取到的信息更加豐富。由此,作者從SENet開始思考改進,SENet中采用GAP來獲取全局位置表示,然后通過全連接或者非線性卷積層來捕獲逐通道依賴。CBAM則不僅僅沿著channel維度進行GAP,它也在空間上進行注意力實現了一種類似自注意力的機制。不過,SENet和CBAM都采用一階池化,GSoP想到將二階池化用過來,這就誕生了這篇文章。
上圖就是GSoP模塊的結構,它類似于SE模塊,采用了壓縮激勵兩個步驟。壓縮操作是為了沿著輸入張量的通道維度建模二階統計信息。首先,輸入的h′×w′×c′h'\times w' \times c'h′×w′×c′的張量(其實就是特征圖)首先通過1x1卷積降維到h′×w′×ch'\times w' \times ch′×w′×c,然后通道之間兩兩之間計算相關性,得到c×cc \times cc×c的協方差矩陣,這個協方差矩陣意義鮮明,第iii行元素表明第iii個通道和其他通道的統計層面的依賴。由于二次運算涉及到改變數據的順序,因此對協方差矩陣執行逐行歸一化,保留固有的結構信息。SENet使用GAP只獲得了每個通道的均值,限制了統計建模能力。
然后,激勵模塊,對上面的協方差特征圖進行非線性逐行卷積得到4c4c4c的結構信息,再用卷積調整到輸入的通道數c′c'c′維度,和輸入進行逐通道相乘,完成通道注意力。
如果,只是對SENet進行了這樣的改進,其實創新度不高,因此作者進一步進行空間注意力的推廣,用來捕獲逐位置的依賴。
空間GSoP模塊和上面的通道GSoP思路類似,首先特征圖降維到h′×w′×ch' \times w' \times ch′×w′×c,然后下采樣到h×w×ch \times w \times ch×w×c,然后計算逐位置協方差矩陣,得到hw×hwhw \times hwhw×hw,它的含義和之前通道上類似。然后同樣是兩個非線性卷積,獲得一個h×wh \times wh×w的注意力圖,再被上采樣到h′×w′×c′h' \times w' \times c'h′×w′×c′,再在空間位置上進行注意力乘法即可實現空間注意力。
具體如何將GSoP模塊嵌入到網絡中其實很簡單,就不多贅述了。GSoP實現了一種二階統計信息層面的通道和空間注意力,但其本質上其實和之前的一些自注意力結構類似,捕獲了一種全位置的長程交互。
GCNet
GCNet全名Non-local Networks Meet Squeeze-Excitation Networks and Beyond,聽名字也看得出來,是Non-loca和SENet的結合成果,它深入分析了Non-local和SENet的優缺點,結合其優勢提出了GCNet。
為了捕獲長程依賴,主要產生兩類方法:一種是采用自注意力策略進行逐對建模;另一種是不依賴query的全局上下文建模。Non-local就是采用的自注意力策略來建模像素對之間的關系,它對每個位置學習不受位置依賴的注意力圖,存在大量的資源浪費;SENet則采用全局上下文對不同通道加權來調整通道依賴,但是這種利用加權進行的特征融合無法充分利用全局上下文。
作者通過大量實驗分析發現Non-local的全局上下文在不同位置幾乎是相同的,這表明學習到了無位置依賴的全局上下文,其實這算是自注意力的通病了。下圖是可視化不同位置的注意力圖,幾乎是相同的。
既然如此,作者就想干脆全局共享一個注意力圖,因此Non-local修改為如下結構。
zi=xi+Wv∑j=1Npexp?(Wkxj)∑m=1Npexp?(Wkxm)xj\mathbf{z}_{i}=\mathbf{x}_{i}+W_{v} \sum_{j=1}^{N_{p}} \frac{\exp \left(W_{k} \mathbf{x}_{j}\right)}{\sum_{m=1}^{N_{p}} \exp \left(W_{k} \mathbf{x}_{m}\right)} \mathbf{x}_{j} zi?=xi?+Wv?j=1∑Np??∑m=1Np??exp(Wk?xm?)exp(Wk?xj?)?xj?
簡化版Non-local的第二項是不受位置依賴的,所有位置共享這一項。因此,作者直接將全局上下文建模為所有位置特征的加權平均值,然后聚集全局上下文特征到每個位置的特征上。它抽象為下面三個階段:
上述步驟可以抽象為下式所述的全局上下文建??蚣?#xff0c;里外三層計算對應上面三個步驟,SENet也有類似的三個步驟:壓縮、激勵和聚合,SE模塊的優勢就是計算量很少,非常輕量。
zi=F(xi,δ(∑j=1Npαjxj))\mathbf{z}_{i}=F\left(\mathbf{x}_{i}, \delta\left(\sum_{j=1}^{N_{p}} \alpha_{j} \mathbf{x}_{j}\right)\right) zi?=F???xi?,δ???j=1∑Np??αj?xj???????
為了對非常消耗算力的簡化版Non-local進一步優化,對第二步的1x1卷積替換為SENet中先降維再升維的bottleneck transform模塊,從而形成了下圖的GC模塊。
最后,做個簡單總結,Non-local和SENet本質上還是實現了一種全局上下文建模,這對于感受野局限的卷積神經網絡是有效的信息補充,GCNet實現了Non-local的全局上下文建模能力和SENet的輕量,獲得了相當不錯的效果。
ECA-Net
上面說了這么多種注意力方法,他們的出發點雖然不盡相同,但結果都是設計了更加復雜的注意力模塊以獲得更好的性能,但是即使精心設計,還是不可避免帶來了不少的計算量,ECA-Net則為了克服性能和復雜度互相制約不得不做出權衡的悖論,提出了一種超輕量的注意力模塊(Efficient Channel Attention,ECA),最終被收錄于CVPR2020。下圖是其和之前比較著名的注意力模塊對比的結果圖,其在精度和參數量上都實現了新的突破,同等層數,ECA-Net精度超越了之前的所有注意力模型且參數量最少。
這篇文章如果直接看最后設計出來的ECA模塊,可能不會感覺多么驚艷,但是其對之前很多注意力方法做的理論分析是非常具有開創性的,這也是我本人非常喜歡這篇論文的原因。
首先,回顧一下SENet,可以參考我之前的文章,在SE模塊中,GAP之后的特征經過降維后進行學習,這個操作其實破壞了通道之間的信息直接交互,因為經過投影降維,信息已經變化了。為了驗證這個想法,作者設計了三個SE模塊的變種并進行了實驗對比,結果如下表,其中SE-Var1是不經過學習直接用GAP結果加權,SE-Var2是每個通道單獨學習一個權重,這就已經超越了SE模塊,SE-Var3是使用一層全連接層進行學習,相當于所有通道之間進行交互,也超過了之前的思路,計算式也相應改變。
那么,第一個思路來了,不需要對原始的GAP后的通道特征進行降維,那么使用單層全連接層學習是否有必要呢?我們知道,全連接其實是捕獲的每個通道特征之間的全局交互,也就是每個通道特征都和其他通道的存在一個權重,這個跨通道交互前人已經證明是必要的,但是這種全局交互并沒有必要,局部范圍的通道交互實際上效果更好。如下圖所示,每個通道直接捕獲自己鄰域內通道的交互信息即可,這個操作采用一維卷積就能實現,卷積核采用通道數自適應獲取。
下圖就是ECA模塊的PyTorch實現,是非常簡單高效的。
總的來說,這篇文章的工作還是和充分的,研究了SENet以及后面的通道注意力的問題,提出了降維有害理論并設計了局部通道交互的ECA模塊,實驗證明,ECA-Net是切實有效的。
總結
本文簡單介紹了計算機視覺中幾種比較新的采用注意力機制的卷積神經網絡,它們都是基于前人的成果進行優化,獲得了相當亮眼的表現,尤其是ECA-Net,后面我會介紹視覺注意力中最新的幾個成果。
總結
以上是生活随笔為你收集整理的视觉注意力机制(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视觉注意力机制(上)
- 下一篇: 2020已去,2021未来