구조만 간단하게 보고 pytorch로 구현 해보기.
본 논문의 ResNet에서 attention이 추가되었다고 생각해도 되는데 핵심은 Residual-Attention
이다.
즉 attention에 residual mechanism이 들어가 있다.
논문에 대한 해설이 많지 않다.
Residual Unit
많이 쓰는 구조로 잔차학습이라고 불린다.
자세한 내용은
https://velog.io/@jj770206/Deep-Residual-Learning-for-Image-Recognition
https://velog.io/@jj770206/Identity-Mappings-in-Deep-Residual-Networks-ResNet2
에 있다. 본 논문의 Residual unit은 ResNet의 두번째 논문의 unit으로 pre-activation architecture를 사용한 unit이다.
핵심은 학습을 할 때 convolution layer를 사이에 두고 identical skip connection을 연결하여 convolution의 output에 input을 다시 더하여 그대로 가지고 오면서 convolution은 이전 layer에서 학습 되지 않은 부분만(Redidual) 학습 하게 하여 성능이 좋아지게 하는 module이다.
오른쪽이 두번째 논문인 pre-activation architecture이다.
relu를 identity mapping에서 residual로 옮겨서 더 pure한 mapping이 되게 한다.
ResNeXt
https://arxiv.org/pdf/1611.05431.pdf
왼쪽이 bottle neck 구조의 Residual unit이고 오른쪽이 ResNeXt의 구조이다.
이는 GoogLeNet의 Xception과 유사하지만 다르다.
먼저 Inception구조는 convolution의 filter size를 다르게 하여 feature map을 다양한 크기로 보게 하는데 이는 같은 구조를 여러개로 늘린것이다.
그럼 왜 이렇게 했을까를 생각해보자.
Convolution에서 parameter는 실제 학습 되는 부분이며 이는 filter size로 하나의 plane의 넓이가 결정되고, channel로 plane의 두께가 결정된다고 볼 수 있다.
여기서 plane은 feature map에서 spatial한 특징을 잡아내고 plane의 역할은 그 깊이마다 다르다.
예를들어 3×3 filter의 64 channel의 low-level convolution이라면 64개의 filter는 서로다른 spatial feature를 추출하는 고유의 역할이 있다.
이때 filter의 channel을 늘리는 것으로 많은 spatial feature을 추출 할 수 있는데, AlexNet에서 메로리 때문이지만 GPU 2개를 사용 했을때 각 GPU에있는 conv filter가 서로 다른 spatial feature를 추출 하였다.
https://velog.io/@jj770206/ImageNet-Classification-with-Deep-ConvolutionalNeural-Networks-Alex-Net
이러한 개념을 생각 한다면 이렇게 여러개의 path를 거치개 함으로써 더 다양한 filter를 학습 시킬 수 있다.
정리해보자면 parameter가 너무 많으면 overfitting, time cost등의 문제가 있지만 무조건 작다고 좋은 것 또한 아니다.
이때 parameter를 늘리는 방법으로 가장 기본적인 방법이 layer staking 즉, model의 depth를 늘리는 방법이 있고, channel을 늘려 model의 width를 늘리는 방법, 여러개의 path를 거치도록 하는 cardinality를 늘리는 방법으로 정리해 볼 수 있다.
위 그림이 model architecture이다.
보면 각각의 convolution layer는 모두 residual unit으로 이루어져 있다.
여기서 헷갈릴 수 있는데 Residual Attention
이라는 단어의 선택은 model안에 residual unit때문이 아니다. 정확히 말하면 Attention에 skip-connection이 들어가 있어서 이다.
architecture를 보면 Attention Module을 제외하면 다른 conv model과 다른점은 없다.
본 논문의 핵심 architecture이다.
다시 Attention을 복습 해보자.
이는 transformer의 attention으로 attention을 설명하기 가장 좋은 그림이다.
Query와 Key가 weight를 계산하고 이를 Value에 적용하여 정제된 Value가 output으로 계산된다.
즉, 바로 V가 output이 되는 것이 아니라 어디에 얼마나 집중할지에 대한 정보를 추가한다고 보면 된다.
이는 본 논문에서의 Attention Module이다.
Image가 들어오게 되면 같은 image를 두 방향으로 보낸다.
위의 방향을 Trunk branch
, 아래 방향을 Soft Mask Branch
라고 한다.
Trunk branch
이를 Value라고 보면 된다.
실제 연산은 image가 들어오면 residual unit을 두번 거치게 된다.
Soft Mask Branch
이부분이 weight이다.
다만 Q, K로 인하여 weight가 계산 되었던 transformer와는 다르게 하나의 image가 어떠한 연산을 거치면서 weight가 된다. 본 논문에서는 mask라는 표현을 사용하였는데 이는 Trunk branch의 iamge에 mask를 씌운다는 의미로 생각하면 편하다.
Mask가 되는 연산을 살펴보자.
위 그림이 mask를 만드는 과정이다.
먼저 max pooling을 통하여 size를 반으로 하고 이후 residual unit을 거치면서 학습이 된다. 몇번 거친 후 이번에는 bilinear interpolation을 이용하여 size를 다시 크게 한다.
논문에서는 을 사용했으며 따라서 down sampling 역할을 하는 max pooling두번과 up sampling 역할을 하는 bilinear interpolation을 두번씩 거치며 중간에 pooling이 한번더 들어가 size가 반감하는거 같은데 표를 보면 아니다??? 뭐지 이거?
이후에는 두 branch를 거친 image가 서로 곱해지며(hadamard) 집중할 곳에 정보가 더 많은 정제된 image가 나온다.
여기까지 하여 식으로 표현하면 다음과 같다.
여기서 이다.
이렇게 하면 약간의 문제가 생긴다.
는 0과 1 사이의 값이므로 Attention Module이 staking 되면 될수록 값이 계속 작아진다. 따라서 여기서 본 논문의 핵심 아이디어인 Residual Attention
이 나온다.
위식을 아래와 같이 변경한다.
이렇게 보면 단순히 Soft Mask Branch에 +1 한것에 불과한것 처럼 보인다.
하지만 이 식을 풀어보자.
이는 원래 식에 를 한번 더 더한것이다.
이것이 Resiual의 핵심이다. 물론 identity는 아니지만 skip connection으로 attention을 사이에 두고 연결 해줌으로 작아지는 부분을 막아 줄 수 있으며 또한 attention이 이전 layer들에서 학습이 안된 부분들만을 집중적으로 학습 할 수 있게 한다.
쓰다보니 안 사실인데 이거 transformer에서 사용한 residual랑 같은 개념이다.
transformer 에서 보면 sub-layer를 사이에 두고 skip -connection이 들어간다고 썼던거 같은데 아마 그중 하나가 attention이고 나머지 하나다 FFN이었던거 같다.
지금 생각해보니 완전 같네.
이는 정확한 model의 구조이다.
이대로 구현 하려 했는데 위에서도 말했지만 attention module에서 반으로 줄어 드는거 같은데 위 표에서는 아니라고 표현되어 있어 이건 쫌더 찾아보거나 비슷하게 구현해 보려고 한다.
참고로 이 논문 정보가 거의 없는듯 하다.