# 論文閱讀: attention輔助convolution
## A. Squeeze-and-excitation(SE) networks(2019) [(reference)](https://arxiv.org/abs/1709.01507)
### 核心思想:
- 在特徵通道間加入attention機制以找到通道間的依賴關係
- 使得有效的feature map權重大、無效或效果小的feature map權重小
- 這個block可以鑲嵌到各種網路
### 步驟:

- 1. **Squeeze**: 是將全局空間信息壓縮成通道級別的描述,*這樣就可以得到C個通道的數值分布情形*
- 能夠對每個通道的重要性進行再加權,讓模型能夠自適應地強調哪些通道在當前輸入中特別重要,從而提升模型的表現。
- 將特徵圖透過Global Average Pooling進行壓縮
- GAP: 將每個通道上的所有空間位置的值進行平均

- 維度變化: $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: (即插即用)

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(膨脹卷積)

左圖: 正常的conv.3x3
中圖: 膨脹係數d=2,代表kernel間會差一格,擴大receptive field
中圖: 膨脹係數d=3,代表kernel間會差兩格,更擴大receptive field
### BAM模塊: (即插即用)

- **分支一:** $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機制

### 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


## 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如何提取特徵

透過可學習的weights,使得kernel可以在他的receptive field輸出一個特徵
詳細算法: $output = kernel$ 內積 $window$
#### 2. self-attention如何提取特徵

**公式:** 
**參數說明:**
- 給定某個pixel(i,j) 輸入$x_{ij}$,這個pixel向外延伸共$k$個pixel(寬度=k的意思)
- 向外延伸的區域中的所有pixel以$(a,b)$表示
#### 3. 加上相對位置在self-attention
**公式:** 
* 加上注意力機制在相對位置: $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)}$
### 結果呈現:

* 可以看到表現好的仍然是,stem block使用conv而在後續層中使用self-attention
* 實驗結果:在初始層使用自注意力機制(即方程式3中描述的形式)的表現不如使用ResNet的卷積初始層。
* 論文給出的說法是 :
* 因為他們使用的是RGB COCO dataset,每個像素單獨來看不包含太多資訊
* 像素之間的空間關聯性很強,這意味著相鄰的像素通常有相似的顏色或亮度
* 自注意力機制通常需要更高層次的抽象特徵來有效運作,而不是直接處理原始的、相關性很強的像素