SENet
어떤 문제를 맞닥뜨렸을때, 그리고 그 문제를 머신러닝으로 해결하려고 하면 아직까지도 막연하게 '잘 되지 않을까?'라는 생각이 조금은 남아있는 것 같습니다. 하지만 실제 현업을 하다보면 널려지지 않은, 비슷해보이는 것도 찾기 힘든 문제를 해결해야합니다. 이 말은 즉, paper 검색해서 구현하기 쉬운 상위 몇개의 오픈소스를 갖다 쓸 수 없는 상황인거죠. 따라서 문제를 어떻게 접근해야하는지, 왜 그래야하는지 내가 근거를 만들어가야합니다. 제가 그래서 이런 아키텍쳐를 제안하는 논문들을 좋아하는 것 같습니다.
Squeeze-and-Excitation Networks
SENet paper를 보면 저자가 말하고자 하는바가 아주 명확합니다.
- 학습을 진행할 때 채널간 중요도를 고려할 필요가 있고, SENet은 그것을 증명한다. SENet은 채널의 중요도로 feature recalibration 하는 방법을 제안한다.
위 그림은 Squeeze-and-Excitation Block 구조입니다. \(H^{\prime}\times W^{\prime}\times C^{\prime} \)의 input \(X\)가 어떤 연산(Conv) \(F_{tr}\)을 거쳐 \(H \times W \times C \)의 feature map \(U\)가 결과로 나옵니다. 일반적인 네트워크의 Conv layer라고 생각하면 될 것 같습니다. 여기에 더해서 각 채널들이 얼마나 중요한지 Weight을 주고싶다는 것이 SE Block의 컨셉입니다.
Paper 의 수식으로 나타내면 다음과 같습니다.
$$ X\in R^{H^{\prime}\times W^{\prime}\times C^{\prime}}$$
$$ U\in R^{H\times W\times C}$$
$$ V = [v_{1},v_{2}, \dots, v_{C}]$$
$$ U = [u_{1},u_{2},\dots, u_{C}]$$
$$ u_{c} = v_{c} * X = \sum^{C^{\prime}}_{s=1}{v^{s}_{c}*x^{s}}$$
위 수식에서 \(V\)는 \(C\)개의 filter를 요소로 갖는 집합이고 각각의 filter \(v_{i}\)는 \(H^{\prime}\times W^{\prime}\times C^{\prime} \)의 사이즈입니다. 인풋 \(X\)와 \(v_{c}\)의 Convolution 연산을 통해 \(u_{c}\)가 계산됩니다. 그냥 convolution 했다고 쓰면 되는데 복잡하게도 써놨습니다.
Squeeze : Global Information Embedding
SE block 의 첫 step은 \(F_{sq}\) Squeeze 입니다. Spatial Information을 하나의 값으로 합축하기 위해 Global Average Pooling을 수행합니다. Global Average Pooling은 단순히 1차원 벡터로 변환하는 input size 크기의 pooling입니다.
$$ z_{c} = F_{sq}(u_{c}) = \cfrac{1}{H\times W}\sum^{H}_{i=1}\sum^{W}_{j=1} $$
역시 GAP를 복잡하게 써놨습니다.
Excitation : Adaptive Recalibration
Squeeze 연산 이후 channel-wise dependency 를 잡기위해 뒤의 연산은 두가지 조건을 맞춰야한다고 합니다.
- Flexibility : nonlinear interaction between channel
- Must learn a non-mutually-exclusive relationship
솔직하게 위에 두 조건이 뭘 의미하는지는 잘 모르겠습니다. SEnet에서는 이를 만족하기 위해 sigmoid activation 를 사용한다고 합니다.
$$ s = F_{ex}(z,W) = \sigma(g(z,W)) = \sigma(W_{2}\delta(W_{1}z)) $$
위 수식에서 \(W\)는 FC layer, \(\delta\)는 ReLU를 의미합니다. 식을 풀여쓰면 결국 Squeeze 뒤에 붙는 Excitation 연산은 결국 인풋으로는 Squeeze에서 계산한 \(z\)가 들어오고 FC, ReLU, FC, Sigmoid 를 취하는 연산입니다. 다만 \(W_{1} \in R^{\frac{C}{r}\times C}\),\(W_{2} \in R^{C \times \frac{C}{r}}\) 라고 합니다. 즉 첫번째 FC layer는 노드를 \(\frac{C}{r}\)개로 줄이고 두번째 FC layer는 다시 노드수를 복원하게 됩니다.
Excitation 연산을 도식화하면 위와 같겠죠. 이렇게 구한 \(s\)를 원래 Conv layer의 output \(U\)에 channel-wise 스칼라 곱을 해주면 최종적으로 channel weight이 고려된 \(\tilde{X}\)를 구할 수 있습니다.
Instantiation
위 그림은 Inception block, Residual block 연산에 SE를 적용한 모습입니다.
Result
기존 네트워크에 SENet을 적용해 성능을 이뤘다는것을 보여줍니다. GFLOPS를 보면 크게 늘어나지 않은것을 볼 수 있는데 그만큼 SE Block의 비용이 적다는 것을 알 수 있습니다.
'Vision' 카테고리의 다른 글
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation (2) | 2022.01.19 |
---|---|
1x1 Convolutions & Inception Module (0) | 2022.01.04 |
Pseudo-LiDAR from Visual Depth Estimation:Bridging the Gap in 3D Object Detection for Autonomous Driving (0) | 2021.11.21 |
Introduction - Attention (0) | 2021.10.31 |
Complex-YOLO: Real-time 3D Object Detection on Point Clouds (0) | 2021.09.12 |
댓글