# 論文閱讀: attention輔助convolution ## A. Squeeze-and-excitation(SE) networks(2019) [(reference)](https://arxiv.org/abs/1709.01507) ### 核心思想: - 在特徵通道間加入attention機制以找到通道間的依賴關係 - 使得有效的feature map權重大、無效或效果小的feature map權重小 - 這個block可以鑲嵌到各種網路 ### 步驟: ![1](https://hackmd.io/_uploads/S1EXY-XsR.png) - 1. **Squeeze**: 是將全局空間信息壓縮成通道級別的描述,*這樣就可以得到C個通道的數值分布情形* - 能夠對每個通道的重要性進行再加權,讓模型能夠自適應地強調哪些通道在當前輸入中特別重要,從而提升模型的表現。 - 將特徵圖透過Global Average Pooling進行壓縮 - GAP: 將每個通道上的所有空間位置的值進行平均 ![2](https://hackmd.io/_uploads/SkAfjZXo0.png =75%x) - 維度變化: $C\times H\times W \rightarrow C\times 1\times 1$ - 2. **Excitation**: 目的是對每個通道的特徵進行自適應的加權。 - 直接看公式: $=sigmoid(W_2*\delta(W_1z))$ - $z$: squeeze後的特徵$(C\times 1\times 1)$ - 為減少運算,經過一個全連接層$W_1$ - 加入非線性元素,經過一個activation function(ReLU或Sigmoid) - 重新加權,經過一個全連接層$W_2$ - 最後再經過activation function - $Sigmoid$ ### 應用在網路中及code: (即插即用) ![3](https://hackmd.io/_uploads/S1ch0-Qo0.png) SEBlock可以加入到任何網路的後面,如Inception、Residual block - ```python class SEBlock(nn.Module): def __init__(self, channel, reduction=16, use_prelu=True): super(SEBlock, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.avg_pool_1 = nn.AdaptiveAvgPool2d(8) if use_prelu: self.relu = nn.PReLU() else: self.relu = nn.ReLU() self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), self.relu, nn.Linear(channel // reduction, channel), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y ## B. BAM: Bottleneck Attention Module(2018) [(reference)](https://arxiv.org/abs/1807.06514) ### 核心思想: - 旨在透過兩個分支流程,生成3D注意力圖 - 在特徵通道間加入attention機制以找到通道間的依賴關係 - 透過dilation conv擴大卷積核的感受野,能更好地捕捉長距離依賴信息 - 模型有以上兩個分支路徑,一個路徑attention在通道間、一個路徑attention在上下文間 #### - dilation conv(膨脹卷積) ![5](https://hackmd.io/_uploads/rJ4gXQ4jR.png =75%x) 左圖: 正常的conv.3x3 中圖: 膨脹係數d=2,代表kernel間會差一格,擴大receptive field 中圖: 膨脹係數d=3,代表kernel間會差兩格,更擴大receptive field ### BAM模塊: (即插即用) ![4](https://hackmd.io/_uploads/r1MBlmEj0.png) - **分支一:** $M_c(F):$ Channel attention: 類似SE模塊 - $GAP\rightarrow$神經元1 {$W_0()+b_0$}$\rightarrow$神經元2 {$W_1()+b_1$}$\rightarrow$$BN$ - $M_c(F) = BN(W_1(W_0(AvgPool(F))+b0)+b1)$ - **分支二:** $M_s(F):$ Spatial attention: 一連串的conv.,就是bottleneck的結構微調 - conv.1x1 降維 - 兩層 dilation conv.3x3 捕捉特徵 - conv.1x1 升維 - **特徵融合:** $M(F):$ 將3D空間訊息融合 - $M(F)=activation(M_s(F)+M_c(F))$ - **Residual part**: $F'$: 就是resnet的經典架構微調,透過逐元素相乘融合特徵 - $F' = F+F\bigotimes M(F)$ - $\bigotimes:$ 逐元素相乘 ## C. CBAM - Convolutional Block Attention Module(2018) [reference](https://arxiv.org/abs/1807.06521) ## D. AA - ResNet : Attention Augmented Convolutional Networks(2020) [reference](https://arxiv.org/abs/1904.09925) ### 核心思想: - A. 旨在透過self-attention能與強調局部性的CNN進行拼接 - B. 並且獨立的添加相對寬度、及相對高度信息在attention機制 ![6](https://hackmd.io/_uploads/BymaaXEiC.png) ### A. 拼接 - $AACONV(X) = concat(Conv(X), MHA(X))$ ### B. 相對寬度、相對高度 - #### 一般的self-attention - single head attention: $Output=O_h=Softmax(\frac{Q^T*K}{\sqrt{d_k}})*V$ - multi head attention: $N$個頭 $MHA(x)=Concat(O_1,O_2,...,O_{Nh})*W^O$ 其中,$W^O$是可學習的linear transformation - #### 加入相對寬度、相對高度的位置編碼 - single head attention: $Output=O_h=Softmax(\frac{Q^T*K+S_H+S_W}{\sqrt{d_k}})*V$ ### 應用在resnet ![3](https://hackmd.io/_uploads/HJ7u23BoC.png =75%x) ![2](https://hackmd.io/_uploads/rk6_nhSjC.png =75%x) ## E. Stand-Alone Self-Attention in Vision Models [reference](https://arxiv.org/abs/1906.05909) ### 核心思想: - 用self-attention 完全取代resnet中的convolution,而不是作為convolution的增強 - 透過self-attention和position encode(位置編碼),使得模型可以考慮: - query和key的相似性 - 以及sequence間的相對位置 - 特別去提到更換stem block中的conv對模型的影養 ### 前情提要: #### 1. conv如何提取特徵 ![4](https://hackmd.io/_uploads/r1ppQaHoR.png) 透過可學習的weights,使得kernel可以在他的receptive field輸出一個特徵 詳細算法: $output = kernel$ 內積 $window$ #### 2. self-attention如何提取特徵 ![7](https://hackmd.io/_uploads/ryZPopriC.jpg =60%x) **公式:** ![6](https://hackmd.io/_uploads/SylsHaHjC.png =50%x) **參數說明:** - 給定某個pixel(i,j) 輸入$x_{ij}$,這個pixel向外延伸共$k$個pixel(寬度=k的意思) - 向外延伸的區域中的所有pixel以$(a,b)$表示 #### 3. 加上相對位置在self-attention **公式:** ![17](https://hackmd.io/_uploads/ry4AIjaoC.png =60%x) * 加上注意力機制在相對位置: $q^T_{ij}*r_{a-i,b-i}$ 其中: $r_{a-i,b-i}$ 是行偏移 $a−i$ 和列偏移 $b−j$ concat在一起 * 假設self-attention的kernel=3,位置編碼則有 ${(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)}$ ### 結果呈現: ![8](https://hackmd.io/_uploads/HyJYEwFj0.png =75%x) * 可以看到表現好的仍然是,stem block使用conv而在後續層中使用self-attention * 實驗結果:在初始層使用自注意力機制(即方程式3中描述的形式)的表現不如使用ResNet的卷積初始層。 * 論文給出的說法是 : * 因為他們使用的是RGB COCO dataset,每個像素單獨來看不包含太多資訊 * 像素之間的空間關聯性很強,這意味著相鄰的像素通常有相似的顏色或亮度 * 自注意力機制通常需要更高層次的抽象特徵來有效運作,而不是直接處理原始的、相關性很強的像素