视觉注意力机制(上)
簡介
注意力機制(Attention Mechanism)是機器學(xué)習(xí)中的一種數(shù)據(jù)處理方法,起源于自然語言處理(NLP)領(lǐng)域,后來在計算機視覺中廣泛應(yīng)用。注意力機制本質(zhì)上與人類對事物的觀察機制相似:一般而言,我們在觀察事物的時候,首先會傾向于觀察事物一些重要的局部信息(如下圖所示,我們會首先將注意力集中在目標(biāo)而不是背景的身上),然后再去關(guān)心一些其他部分的信息,最后組合起來形成整體印象。
注意力機制能夠使得深度學(xué)習(xí)在提取目標(biāo)的特征時更加具有針對性,使得相關(guān)任務(wù)的精度有所提升。注意力機制應(yīng)用于深度學(xué)習(xí)通常是對輸入每個部分賦予不同的權(quán)重,抽取出更加關(guān)鍵及重要的信息使模型做出更加準(zhǔn)確的判斷,同時不會對模型的計算和存儲帶來更大的開銷,這也是注意力機制廣泛使用的原因。
在計算機視覺中,注意力機制主要和卷積神經(jīng)網(wǎng)絡(luò)進行結(jié)合,按照傳統(tǒng)注意力的劃分,大部分屬于軟注意力,實現(xiàn)手段常常是通過掩碼(mask)來生成注意力結(jié)果。掩碼的原理在于通過另一層新的權(quán)重,將輸入特征圖中關(guān)鍵的特征標(biāo)識出來,通過學(xué)習(xí)訓(xùn)練,讓深度神經(jīng)網(wǎng)絡(luò)學(xué)到每一張新圖片中需要關(guān)注的區(qū)域,也就形成了注意力。說的更簡單一些,網(wǎng)絡(luò)除了原本的特征圖學(xué)習(xí)之外,還要學(xué)會通過特征圖提取權(quán)重分布,對原本的特征圖不同通道或者空間位置加權(quán)。因此,按照加權(quán)的位置或者維度不同,將注意力分為空間域、通道域和混合域。
典型方法
卷積神經(jīng)網(wǎng)絡(luò)中常用的注意力有兩種,即空間注意力和通道注意力,當(dāng)然也有融合兩者的混合注意力,畫了個示意圖如下。
首先,我們知道,卷積神經(jīng)網(wǎng)絡(luò)輸出的是維度為C×H×WC\times H \times WC×H×W的特征圖,其中CCC指的是通道數(shù),它等于作用與輸入的卷積核數(shù)目,每個卷積核代表提取一種特征,所以每個通道代表一種特征構(gòu)成的矩陣。H×WH \times WH×W這兩個維度很好理解,這是一個平面,里面的每個值代表一個位置的信息,盡管經(jīng)過下采樣這個位置已經(jīng)不是原始輸入圖像的像素位置了,但是依然是一種位置信息。如果,對每個通道的所有位置的值都乘上一個權(quán)重值,那么總共需要CCC個值,構(gòu)成的就是一個CCC維向量,將這個CCC維向量作用于特征圖的通道維度,這就叫通道注意力。同樣的,如果我學(xué)習(xí)一個H×WH\times WH×W的權(quán)重矩陣,這個矩陣每一個元素作用于特征圖上所有通道的對應(yīng)位置元素進行乘法,不就相當(dāng)于對空間位置加權(quán)了嗎,這就叫做空間注意力。
下面我列舉一些常見的使用了注意力機制的卷積神經(jīng)網(wǎng)絡(luò),我在下面一節(jié)會詳細(xì)介紹它們。
網(wǎng)絡(luò)詳解
NL
Non-local Neural Networks 應(yīng)該算是引入自注意力機制比較早期的工作,后來的語義分割里各種自注意力機制都可以認(rèn)為是 Non-local 的特例,這篇文章作者中同樣有熟悉的何愷明大神 😂。
首先聊聊 Non-local 的動機,我們知道,CV 和 NLP 任務(wù)都需要捕獲長程依賴(遠距離信息交互),卷積本身是一種局部算子,CNN 中一般通過堆疊多層卷積層獲得更大感受野來捕獲這種長程依賴的,這存在一些嚴(yán)重的問題:效率低;深層網(wǎng)絡(luò)的設(shè)計比較困難;較遠位置的消息傳遞,局部操作是很困難的。所以,收到非局部均值濾波的啟發(fā),作者設(shè)計了一個泛化、簡單、可直接嵌入主流網(wǎng)絡(luò)的 non-local 算子,它可以捕獲時間(一維時序數(shù)據(jù))、空間(圖像)和時空(視頻)的長程依賴。
首先,Non-local 操作早在圖像處理中已經(jīng)存在,典型代表就是非局部均值濾波,到了深度學(xué)習(xí)時代,在計算機視覺中,這種通過關(guān)注特征圖中所有位置并在嵌入空間中取其加權(quán)平均值來計算某位置處的響應(yīng)的方法,就叫做自注意力。
然后來看看深度神經(jīng)網(wǎng)絡(luò)中的 non-local 操作如何定義,也就是下面這個式子,這是一個通式,其中xxx是輸入,yyy是輸出,iii和jjj代表輸入的某個位置,可以是序列、圖像或者視頻上的位置,不過因為我比較熟悉圖像,所以后文的敘述都以圖像為例。因此xix_ixi?是一個向量,維數(shù)和通道一樣;fff是一個計算任意兩點的相似性函數(shù),ggg是一個一元函數(shù),用于信息變換;C\mathcal{C}C是歸一化函數(shù),保證變換前后整體信息不變。所以,下面的式子,其實就是為了計算某個位置的值,需要考慮當(dāng)前這個位置的值和所有位置的值的關(guān)系,然后利用這種獲得的類似 attention 的關(guān)系對所有位置加權(quán)求和得到當(dāng)前位置的值。
yi=1C(x)∑?jf(xi,xj)g(xj)\mathbf{y}_{i}=\frac{1}{\mathcal{C}(\mathbf{x})} \sum_{\forall j} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right) g\left(\mathbf{x}_{j}\right) yi?=C(x)1??j∑?f(xi?,xj?)g(xj?)
那么,確定了這個通式,在圖像上應(yīng)用,只需要確定fff、ggg和C\mathcal{C}C即可,首先,由于ggg的輸入是一元的,可以簡單將ggg設(shè)置為 1x1 卷積,代表線性嵌入,算式為g(xj)=Wgxjg\left(\mathbf{x}_{j}\right)=W_{g} \mathbf{x}_{j}g(xj?)=Wg?xj?。關(guān)于fff和C\mathcal{C}C需要配對使用,作用其實就是計算兩個位置的相關(guān)性,可選的函數(shù)有很多,具體如下。
- Gaussian
高斯函數(shù),兩個位置矩陣乘法然后指數(shù)映射,放大差異。
f(xi,xj)=exiTxjf\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=e^{\mathbf{x}_{i}^{T} \mathbf{x}_{j}} f(xi?,xj?)=exiT?xj?
C(x)=∑?jf(xi,xj)\mathcal{C}(x)=\sum_{\forall j} f\left(\mathrm{x}_{i}, \mathrm{x}_{j}\right) C(x)=?j∑?f(xi?,xj?) - Embedded Gaussian
嵌入空間的高斯高斯形式,C(x)\mathcal{C}(x)C(x)同上。
θ(xi)=Wθxiand??(xj)=W?xj\theta\left(\mathbf{x}_{i}\right)=W_{\theta} \mathbf{x}_{i} \text { and } \phi\left(\mathbf{x}_{j}\right)=W_{\phi} \mathbf{x}_{j} θ(xi?)=Wθ?xi??and??(xj?)=W??xj?
f(xi,xj)=eθ(xi)T?(xj)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=e^{\theta\left(\mathbf{x}_{i}\right)^{T} \phi\left(\mathbf{x}_{j}\right)} f(xi?,xj?)=eθ(xi?)T?(xj?)
論文中這里還特別提了一下,如果將C(x)\mathcal{C}(x)C(x)考慮進去,對1C(x)f(xi,xj)\frac{1}{\mathcal{C}(\mathbf{x})} f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)C(x)1?f(xi?,xj?)而言,這其實是一個 softmax 計算,因此有y=softmax?(xTWθTW?x)g(x)\mathbf{y}=\operatorname{softmax}\left(\mathbf{x}^{T} W_{\theta}^{T} W_{\phi} \mathbf{x}\right) g(\mathbf{x})y=softmax(xTWθT?W??x)g(x),這個其實就是 NLP 中常用的自注意力,因此這里說,自注意力是 Non-local 的特殊形式,Non-local 將自注意力拓展到了圖像和視頻等高維數(shù)據(jù)上。但是,softmax 這種注意力形式不是必要的,因此作者設(shè)計了下面的兩個 non-local 操作。 - Dot product
這里去掉了指數(shù)函數(shù)形式,C(x)\mathcal{C}(x)C(x)的形式也相應(yīng)改變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">xxx上的像素數(shù)目。
f(xi,xj)=θ(xi)T?(xj)f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\theta\left(\mathbf{x}_{i}\right)^{T} \phi\left(\mathbf{x}_{j}\right) f(xi?,xj?)=θ(xi?)T?(xj?)
C(x)=N\mathcal{C}(\mathbf{x})=N C(x)=N - Concatenation
最后,是一種 concat 的形式,[?,?][\cdot, \cdot][?,?]表示 concat 操作,C(x)\mathcal{C}(x)C(x)同上。
f(xi,xj)=ReLU?(wfT[θ(xi),?(xj)])f\left(\mathbf{x}_{i}, \mathbf{x}_{j}\right)=\operatorname{ReLU}\left(\mathbf{w}_{f}^{T}\left[\theta\left(\mathbf{x}_{i}\right), \phi\left(\mathbf{x}_{j}\right)\right]\right) f(xi?,xj?)=ReLU(wfT?[θ(xi?),?(xj?)])
有了上面定義的 non-local 算子,就可以定義non-local 模塊了,其定義如下,其中的+xi+\mathbf{x}_{i}+xi?表示殘差連接,這種殘差形式可以保證該模塊可以嵌入預(yù)訓(xùn)練模型中,只要將WzW_zWz?初始化為 0 即可。其實這中間的實現(xiàn)都是通過 1x1 卷積完成的,因此輸出和輸入可以控制為同等通道數(shù)。
zi=Wzyi+xi\mathbf{z}_{i}=W_{z} \mathbf{y}_{i}+\mathbf{x}_{i} zi?=Wz?yi?+xi?
上面是數(shù)學(xué)上的定義,具體來看,一個時空格式的 non-local 模塊如下圖,我們從二維圖像的角度來看,可以忽略那個TTT,直接將其置為 1 即可。所以,輸入是(h,w,1024)(h,w,1024)(h,w,1024),經(jīng)過兩個權(quán)重變換WθW_\thetaWθ?和W?W_\phiW??得到降維后的兩個特征圖,都為(h,w,512)(h, w, 512)(h,w,512),它們兩者 reshape 后變?yōu)?span id="ozvdkddzhkzd" class="katex--inline">(h×w,512)(h\times w, 512)(h×w,512),之后再其中一個轉(zhuǎn)置后矩陣乘法另一個,得到相似性矩陣(h×w,h×w)(h\times w, h \times w)(h×w,h×w),然后再最后一個維度上進行 softmax 操作。上述這個操作得到一種自注意力圖,表示每個像素與其他位置像素的關(guān)系。然后將原始輸入通過變換ggg得到一個(h×w,512)(h\times w, 512)(h×w,512)的輸入矩陣,它和剛剛的注意力圖矩陣乘法,輸出為(h×w,512)(h\times w, 512)(h×w,512),這時,每個位置的輸出值其實就是其他位置的加權(quán)求和的結(jié)果。最后,通過 1x1 卷積來升維恢復(fù)通道,保證輸入輸出同維。
這篇文章有很不錯的第三方 Pytorch 實現(xiàn),想了解更多細(xì)節(jié)的可以去看看源碼和論文,其實實現(xiàn)是很簡單的。
最后,簡單總結(jié)一下這篇文章。提出了 non-local 模塊,這是一種自注意力的泛化表達形式,Transformer 的成功已經(jīng)證明自注意力的長程交互信息捕獲能力很強,對網(wǎng)絡(luò)尤其是處理視頻的網(wǎng)絡(luò)如 I3D 是有參考意義的。當(dāng)然,其本質(zhì)還是空間層面的注意力,如果考慮通道注意力或許會獲得更好的效果,而且 non-local 模塊的矩陣計算開銷其實不低,這也制約了 non-local 的廣泛應(yīng)用,略微有點遺憾。
SENet
SENet 應(yīng)該算是 Non-local 的同期成果,我在之前的文章中專門解讀過,這里就大概的說一下。
卷積操作是卷積神經(jīng)網(wǎng)絡(luò)的核心,卷積可以理解為在一個局部感受野范圍內(nèi)將空間維度信息和特征維度信息進行聚合,聚合的方式是加和操作。然而想要提高卷積神經(jīng)網(wǎng)絡(luò)的性能其實是很難的,需要克服很多的難點。為了獲得更加豐富的空間信息,很多工作被提出,如下圖使用多尺度信息聚合的Inception。
那么,自然會想到,能否在通道維度上進行特征融合呢?其實卷積操作默認(rèn)是有隱式的通道信息融合的,它對所有通道的特征圖進行融合得到輸出特征圖(這就默認(rèn)每個通道的特征是同權(quán)的),這就是為什么一個32通道的輸入特征圖,要求輸出64通道特征圖,需要32×6432\times6432×64個卷積核(這個32也可以理解為卷積核的深度)。通道方面的注意力也不是沒人進行嘗試,一些輕量級網(wǎng)絡(luò)使用分組卷積和深度可分離卷積對通道進行分組操作,但這本質(zhì)上只是為了減少參數(shù),并沒有什么特征融合上的貢獻。
所以,SENet出現(xiàn)了,它從從每個通道的特征圖應(yīng)該不同權(quán)的角度出發(fā),更加關(guān)注通道之間的關(guān)系,讓模型學(xué)習(xí)到不同通道的重要程度從而對其加權(quán),即顯式建模不同通道之間的關(guān)系。為此,設(shè)計了SE(Squeeze-and-Excitation)模塊,如下圖所示。SE模塊的思路很簡單,先通過全局平均池化獲得每個通道的全局空間表示,再利用這個表示學(xué)習(xí)到每個通道的重要性權(quán)重,這些權(quán)重作用與原始特征圖的各個通道,得到通道注意力后的特征圖。由于輕量簡潔,SE模塊可以嵌入任何主流的卷積神經(jīng)網(wǎng)絡(luò)模型中,因為其可以保證輸入輸出同維。
BAM
這篇文章和下面的CBAM是同一個團隊的成果,非常類似,CBAM收錄于ECCV2018,BAM收錄于BMVC2018,兩篇文章掛到Arxiv上的時間也就差了幾分鐘而已,這里先簡單地說一下區(qū)別,BAM其實是通道注意力和空間注意力的并聯(lián),CBAM是兩者的串聯(lián)。
BAM,全名Bottleneck Attention Module,是注意力機制在卷積神經(jīng)網(wǎng)絡(luò)中的一次偉大嘗試,它提出的BAM模塊可以集成到任意的卷積神經(jīng)網(wǎng)絡(luò)中,通過channel和spatial兩個分支得到注意力圖,通道注意力關(guān)注語義信息回答what問題,空間注意力關(guān)注位置信息,回答where問題,因此結(jié)合起來是最好的選擇。下圖是BAM集成到一個卷積神經(jīng)網(wǎng)絡(luò)的示意圖,顯然,BAM存在于池化層之前,這也是bottleneck的由來,作者說這樣的多個BAM模塊構(gòu)建的注意力圖層類似人類的感知過程。
上圖就是核心的BAM模塊結(jié)構(gòu)圖,我們來一步步看它是如何實現(xiàn)通道空間混合注意力的。整體來看,對于輸入特征圖F∈RC×H×W\mathbf{F} \in \mathbb{R}^{C \times H \times W}F∈RC×H×W,BAM模塊最終會得到一個注意力圖M(F)∈RC×H×W\mathbf{M}(\mathbf{F}) \in \mathbb{R}^{C \times H \times W}M(F)∈RC×H×W,這里注意到,這是一個和輸入同維的張量,此前,通道注意力學(xué)習(xí)到的是個CCC維向量,空間注意力學(xué)到的是個H×WH\times WH×W維的矩陣,BAM這種格式表明其混合了通道和空間的注意力信息。 調(diào)整后輸出的特征圖F′=F+F?M(F)\mathbf{F}^{\prime}=\mathbf{F}+\mathbf{F} \otimes \mathbf{M}(\mathbf{F})F′=F+F?M(F),顯然,這是一個張量點乘后進行加法的運算,加法是明顯的殘差結(jié)構(gòu),點乘發(fā)生在學(xué)到的注意力圖和輸入特征圖之間,因此輸出和輸入同樣shape。為了計算上高效,通道和空間注意力采用并行的分支結(jié)構(gòu)獲得。因此,整體計算上要先獲得通道注意力圖Mc(F)∈RC\mathbf{M}_{\mathbf{c}}(\mathbf{F}) \in \mathbb{R}^{C}Mc?(F)∈RC和空間注意力圖Ms(F)∈RH×W\mathbf{M}_{\mathbf{s}}(\mathbf{F}) \in \mathbb{R}^{H \times W}Ms?(F)∈RH×W,上面的最終注意力圖通過下式計算得到,其中σ\sigmaσ表示Sigmoid激活函數(shù),兩個注意力圖的加法需要broadcast,得到的就是C×H×WC\times H \times WC×H×W維度了。
M(F)=σ(Mc(F)+Ms(F))\mathbf{M}(\mathbf{F})=\sigma\left(\mathbf{M}_{\mathbf{c}}(\mathbf{F})+\mathbf{M}_{\mathbf{s}}(\mathbf{F})\right) M(F)=σ(Mc?(F)+Ms?(F))
然后,我們再來看看具體的兩個分支內(nèi)發(fā)生了什么。首先,看通道注意力分支,首先,對輸入特征圖F\mathbf{F}F進行全集平均池化得到Fc∈RC×1×1\mathbf{F}_{\mathbf{c}} \in \mathbb{R}^{C \times 1 \times 1}Fc?∈RC×1×1,這相當(dāng)于在每個通道的空間上獲得了全局信息。然后,這個向量送入全連接層進行學(xué)習(xí),這里進行了一個先降維再升維的操作,所以學(xué)到的向量Mc(F)\mathbf{M}_{\mathbf{c}}(\mathbf{F})Mc?(F)依然是C×1×1C \times 1 \times 1C×1×1維度的,這個就是通道注意力圖。
接著,我們看看空間注意力分支。作者這里先用1x1卷積對輸入特征圖降維,然后使用兩層膨脹卷積以更大的感受野獲得更豐富的信息Ftemp∈RC/r×H×W\mathbf{F_{temp}} \in \mathbb{R}^{C / r \times H \times W}Ftemp?∈RC/r×H×W,最后再用1x1卷積將特征圖降維到通道數(shù)為1,得到空間注意力圖Ms(F)∈RH×W\mathbf{M}_{\mathbf{s}}(\mathbf{F}) \in \mathbb{R}^{H\times W}Ms?(F)∈RH×W。
至此,我們理解了BAM模塊的結(jié)構(gòu),它可以嵌入到主流網(wǎng)絡(luò)中獲得一些性能提升,不過后來并沒有在各種任務(wù)中獲得較好的表現(xiàn),因此不是很廣泛,但它的混合注意力思路是值得借鑒的。
CBAM
CBAM,全名Convolutional Block Attention Module,相對于BAM,在CV中受到了更多的關(guān)注,下圖就是CBAM的整體結(jié)構(gòu)圖,不難發(fā)現(xiàn),它和BAM區(qū)別就是通道注意力和空間注意力是串聯(lián)進行的,實踐證明,這樣的效果更好一些。
我們先從上圖整體上看看CBAM怎么進行注意力的,首先,輸入特征圖F∈RC×H×W\mathbf{F} \in \mathbb{R}^{C \times H \times W}F∈RC×H×W和通道注意力圖Mc∈RC×1×1\mathbf{M}_{\mathbf{c}} \in \mathbb{R}^{C \times 1 \times 1}Mc?∈RC×1×1逐通道相乘得到F′\mathbf{F'}F′,接著,F′\mathbf{F'}F′會和空間注意力圖Ms∈R1×H×W\mathbf{M}_{\mathbf{s}} \in \mathbb{R}^{1 \times H \times W}Ms?∈R1×H×W逐位置相乘得到F′′\mathbf{F''}F′′,這就是CBAM的輸出,它依然是C×H×WC \times H \times WC×H×W維度的。
上圖就是兩個注意力模塊的具體實現(xiàn),我們先看通道注意力,它很類似于SENet,先是利用全局池化獲得每個通道的位置全局信息,不過這里采用全局平均池化和全局最大池化分別得到Favgc\mathbf{F}_{\mathrm{avg}}^{\mathrm{c}}Favgc?和Fmaxc\mathbf{F}_{\mathrm{max}}^{\mathrm{c}}Fmaxc?,均得到一個C×1×1C\times 1\times 1C×1×1維的向量,經(jīng)過共同的全連接層的降維再升維學(xué)習(xí)兩個通道注意力(降維的維度用一個縮放比例控制),加到一起,獲得的注意力圖仍然是Mc(F)∈RC×1×1\mathbf{M}_{\mathbf{c}}(\mathbf{F}) \in \mathbb{R}^{C\times 1 \times 1}Mc?(F)∈RC×1×1。
再來看空間注意力,也是采用全局平均池化和全局最大池化,不過是沿著通道進行的,所以得到兩個特征圖Favg?s∈R1×H×W\mathbf{F}_{\text {avg }}^{\mathbf{s}} \in \mathbb{R}^{1 \times H \times W}Favg?s?∈R1×H×W 和 Fmax?s∈R1×H×W\mathbf{F}_{\max }^{\mathbf{s}} \in \mathbb{R}^{1 \times H \times W}Fmaxs?∈R1×H×W,然后將它們concat一起后使用一個7x7的卷積進行處理,得到Ms(F)∈1C×H×W\mathbf{M}_{\mathbf{s}}(\mathbf{F}) \in \mathbb{1}^{C\times H \times W}Ms?(F)∈1C×H×W。
將上述通道注意力圖和空間注意力圖按照下面的公式先后作用于輸入特征圖,就得到混合注意力的結(jié)果。至此,我們理解了CBAM模塊的運行過程,其中的激活函數(shù)和BN等細(xì)節(jié)我沒有提到,可以查看原論文,這里相比于BAM都采用了兩個全局池化混合的方式,這在今天的網(wǎng)絡(luò)中已經(jīng)很常見了,屬于捕獲更加豐富信息的手段。
F′=Mc(F)?FF′′=Ms(F′)?F′\begin{aligned} \mathbf{F}^{\prime} &=\mathbf{M}_{\mathbf{c}}(\mathbf{F}) \otimes \mathbf{F} \\ \mathbf{F}^{\prime \prime} &=\mathbf{M}_{\mathbf{s}}\left(\mathbf{F}^{\prime}\right) \otimes \mathbf{F}^{\prime} \end{aligned} F′F′′?=Mc?(F)?F=Ms?(F′)?F′?
總結(jié)
本文簡單介紹了計算機視覺中幾種比較早期的采用注意力機制的卷積神經(jīng)網(wǎng)絡(luò),它們的一些設(shè)計理念今天還被活躍用于各類任務(wù)中,是很值得了解的。后面的文章會介紹一些相對比較新的成果,歡迎關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的视觉注意力机制(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SENetSKNet 解读
- 下一篇: 视觉注意力机制(中)