Attention에 관심이 생겨 관련 논문을 찾아보던 중 CBAM이라는 논문을 읽게 되었는데, 개인적으로 여태까지 읽었던 논문들 중 가장 재미있었고 이해가 쏙쏙 되었던 논문이었던 것 같습니다. 그래서 오늘은 [1] introduction [2] Method [3] Experiments 순으로 한 번 논문 리뷰를 해보도록 하겠습니다.
[1] Introduction
▶ CNN 기반 모델들의 성능을 향상시키는 요소 3가지
CNN 기반 모델들은 다음과 같이 크게 3가지 요인으로 성능 향상을 할 수 있었다고 합니다.
(1) Depth: LeNet → VGGNet → ResNet 으로 발전하며, 모델이 깊어질수록 성능이 더 좋아짐.
(2) Width: GoogleNet,WideResNet 등의 모델을 통해 channel을 증가시키면 성능이 더 좋아진 것을 발견함.
(3) Cardinality: Xception.ResNeXt등의 모델에서, block 수 자체를 늘리면 성능이 더 좋아짐.
여기서 Depth와 Width는 꽤 익숙한 개념이지만 Cardinality는 약간 생소한 개념일 수 있는데,
Cardinality란? : 쉽게 설명해 feature map을 나누는 그룹의 수라고 할 수 있습니다. 이말은 즉슨 transformation을 수행하는 그룹의 수라고도 할 수 있는거죠. 예를 들어 아래 이미지를 보면 (a) Resnet Bottleneck 같은 경우, 일반적으로 우리가 아는 resnet block구조이죠? 하지만 (b) ResNext 같은 경우 가운데 이미지를 보면 group=32라고 되어 있는 부분을 볼 수 있습니다. 이 경우, 128개의 channel을 32개의 그룹으로 나누는 것이기 때문에 182/32=4가 되어 4개의 featuremap으로 묶어 총 32개의 그룹으로 만들겠다는 의미가 되는거죠.

더 구체적으로 (b), ResNext Bottleneck구조를 좀 더 세분화해서 그려보자면 아래와 같은 형태가 되는거죠. 위에서 총 32개의 그룹으로 feature map을 나누었기 때문에 128/32 = 4 즉 각각의 블록에 4개의 feature map씩만 들어가도록 나누어주게 되는 형태입니다.
그렇다면 이렇게 cardinality 즉 그룹의 수를 늘려주면 왜 성능이 좋아질까요?
바로 파라미터의 수를 크게 줄여줄 뿐만 아니라 Depth와 Width를 증가시키는 방법보다 representation learning을 더 잘할 수 있게 해준다고 합니다.

▶ Main Idea
“Attention not only tells where to focus, it also improves the representations of interests”
논문에서는 attention은 어디에 집중해야 하는지 뿐만 아니라 관심영역이 representation learning을 더 잘 할 수 있도록 도와준다라고 하였습니다. 이 논문에서는 cbam이라는 attention mechanism을 제시함으로써 중요한 feature에는 좀 더 집중하고, 아닌 feature은 억제할 수 있도록 하였습니다.
Convolution은 cross-channel 정보와 spatial 정보를 혼합해서 feature map을 추출한다는 특성이 존재하는데, cbam에서는 이러한 특성들을 이용해 channel 축과 spatial축에서 의미 있는 정보를 추출할 수 있는 방법을 고안하였습니다. 그래서 정리하자면
1) Channel: What? 2) Spatial: where?
→ 어떤 channel에 집중을 할지, 그리고 각각의 feature map에서는 어느 위치에 집중을 해야할지 둘 다 보겠다고 하는거죠.
[2] Method
CBAM의 전체적인 구조는 아래 이미지와 같습니다.
HxWxC 크기의 feature map이 입력으로 들어왔다고 했을 때, 이 feature map은 가장 먼저 1) Channel Attention Module 을 거친 후 2) Spatial Attention Module을 거쳐 최종적으로 정제된 새로운 feature map을 얻게 됩니다.

그렇다면 수식적으로도 한 번 살펴볼까요?
이 수식에서 Mc는 channel attention module을 의미하고, Ms는 spatial attention을 의미 하는데요. CBAM의 overview를 설명드릴 때에도 살펴봤듯이 입력으로 들어오는 feature map이 먼저 input feature map(F)과 channel attention을 거친 후의 값들( Mc( F ) ) 이 픽셀별 곱셈연산을 통해 곱해집니다. 이후 channel attention module을 거쳐 나온 F'와 spatial attention을 거쳐 나온 값들( Ms( F' ) )이 다시 한 번 픽셀별 곱셈연산이 진행되어 최종적으로 정제된 feature인 F''가 나오게 되는 흐름이 되는 것이죠. 뒷 부분에서는 각 모듈의 구조에 대해 좀 더 구체적으로 살펴볼 것이기 때문에, 각 모듈을 거쳐 나온 attention map과 곱해지는 부분은 추가적으로 설명하지 않을 예정이니 잘 기억해 주시길 바랍니다 :)

자 이제 channel 그리고 spatial attention module 부분에 대해 좀 더 구체적으로 들어가 보겠습니다.
▶ Channel Attention Module
channel attention module에서는 feature map의 채널간 관계를 이용해 channel attention을 생성 함으로써 "어떤 feature map"에 집중을 해야 하는지를 찾는 부분인데요. 예를 들어, 우리가 고양이를 찾는 테스크를 하고 있다라고 했을 때, C개의 feature map 중 고양이의 특징을 더 많이 담고 있는 feature map들이 존재 할 것이고, 우리는 이 부분에 초점을 맞출 필요가 있습니다. 그래야지 우리의 테스크를 더 만족스럽게 해낼 것이기 때문입니다. 이와 같이 이 channel attention은 어느 feature map에 더 초점을 맞추어야 하는지 총 C개의 feature map에 대해 점수를 준다라고 생각하시면 편합니다. 가장 중요한 feature map에는 가중치를 5로 주고, 덜 중요한 부분은 1로 주는 것과 같이요!
Channel Attention의 구조는 다음 이미지와 같습니다.

먼저 입력 feature map이 channel attention module 안에 들어오게 되면 가장먼저, Max pooling과 Avg Pooling을 독립적으로 사용해 두개(max,avg 각각)의 1X1XC 개의 feature map을 추출합니다. 그렇다면 왜 max pooling과 average pooling을 사용할까요? 두 pooling 기법이 서로 다른 역할을 하기 때문입니다.
(1) maxpooling: distinctive feature(분별력있는 feature)
(2) average pooling: spatial feature(공간적인 feature)
아무래도 max pooling같은 경우 수용영역 내에서 가장 활성화 값이 큰 대표 값을 선택을 하는 것이기 때문에 더 우리가 필요로 하는 값을 내포하고 있을 것이고, average pooling 같은 경우에는 수용 영역 안에 있는 값들을 평균하여 대푯값을 구하는 것이기 때문에 좀 더 전체적인 부분들 즉 공간적인 것들을 잘 볼 수 있겠죠?
다시 설명을 이어나가자면, 이 입력 feature map(HxWxC)인 F가 pooling을 거치면 아래 이미지와 같은 총 두개의 1x1xC feature map이 나오게 될 것입니다. 좀 더 구체적으로 예시를 들면 입력 feature map인 F에 대해아래 맨 왼쪽의 input feature에 표시되어 있는 초록색 박스 크기(HXWX1)의 필터를 사용하여 오른쪽에 작은 초록색 박스와 같이 1x1x1로 만드는 것이죠. 이런식으로 모든 feature map에 대해 적용해 최종적으로 "두개의 1x1xC 크기의 feature map"을 추출하는 것 입니다.

이후 각각의 1x1xC feature map(파란색, 주황색)은 하나의 히든 레이어를 가지고 있는 MLP로 독립적으로 들어가며 summation(덧셈)과 sigmoid함수를 거쳐 최종적인 Mc 즉 channel attention을 추출해 내게 되는거죠.
▶ Spatial Attention Module
spatial attention module은 이미지의 "어디"에 집중을 해야 할 것인지에 대한 힌트를 제공합니다. spatial atteniton module의 전체적인 overview는 다음과 같습니다.

여기에서도 마찬가지로 동일하게 maxpooling과 average pooling이 사용 되었는데요. pooling과정에서 첫 번째 channel attention과 다른점은 1x1xc 크기의 필터를 사용해 두 개의 HxWx1 크기의 feature을 만든다는 것입니다. 아래 사진을 보시면

이런식으로 맨 왼쪽의 초록색 상자처럼 1x1xC 크기의 filter을 이용해 파란색과 주황색 feature map 위의 1x1x1크기의 작은 초록색 직육면체 박스 하나를 생성해 내는 것 입니다. 저 가운데 초록색 직육면체가 두개인 이유는 maxpooling과 average pooling을 각각 독립적으로 시행을 하였기 때문이구요.
이후 convolution layer과 sigmoid 함수를 거쳐 Ms 즉 spatial attention을 얻게 됩니다. 보통 다른 논문들을 보면 convolution을 할 때 3x3을 많이 쓰는데 이 CBAM에서는 7x7 filter을 사용하였다고 합니다. 왜 그랬을까요? 바로 "공간"을 더 넓게 보기 위함인데요. 이 spatial attention의 역할은 아무래도 각 feature map에서 어느 부분에 더 집중을 해야하는지 알려주는 것이기 때문에 좀 더 수용영역을 크게 사용하였다고 생각하시면 될 것 같습니다. 실제 이 논문의 실험 결과에서도 3x3을 쓰는 것보다 7x7이 더 효과가 좋았다라고 하네요.
[3] Experiments
자 이제 CBAM의 메소드 부분을 살펴 보았으니 어떤 실험을 했는지도 한 번 보도록 하겠습니다.

먼저 Max pooling과 Average pooling 각각을 사용 했을 때, 둘 다 사용했을 때 어느 것이 더 성능이 높게 나왔는지에 대해 실험을 진행하였는데요. 표에 보이다시피 두 pooling기법을 모두 사용 했을 때 가장 높은 성능을 보였다고 합니다.

또한 convolution을 통해 파라미터들을 학습시키는 방식보다, avg&max pooling기법 + 7x7 conv( convolution layer에서의 ) 조합을 사용하는 것이 가장 효과적이였다고 하네요.

마지막으로 어떻게 이 channel과 spatial을 조합해야 가장 성능이 효과적인지에 대한 실험도 진해하였는데, 결과적으로 논문에서 최종적으로 채택된 channel+spatial 순서의 조합이 가장 놓은 성능을 보였다고 합니다.