---
# System prepended metadata

title: '論文閱讀: attention輔助convolution'
tags: [模型論文]

---

# 論文閱讀: 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，每個像素單獨來看不包含太多資訊
   * 像素之間的空間關聯性很強，這意味著相鄰的像素通常有相似的顏色或亮度
   * 自注意力機制通常需要更高層次的抽象特徵來有效運作，而不是直接處理原始的、相關性很強的像素

