Interpretable method 중 널리 알려진 Grad-CAM을 중심으로, 관련 연구인 CAM과 Grad-CAM++까지 이번 기회에 정리를 해보고자 한다.
CAM(2016) -> Grad-CAM(2017) -> Grad-CAM++(2018)
동일한 연구 그룹에서 이루어진 것은 아니고, 모두 다 다른 그룹에서 나온 논문이다.
실험 부분은 생략하고, 주요 아이디어의 흐름만 정리를 해본다.
* CAM(Class Activation Mapping)
CNN과 Global Average Pooling(GAP)를 결합한 아이디어임. 논문에 나온 아래 그림을 보면 이해하는데 도움이 된다.
말로 정리를 해보면 다음과 같다.
마지막 Conv layer의 feature map에 GAP를 적용하여 feature vector 형태로 만든 후, fully-connected layer를 통해 최종 output layer를 계산한다. 즉, 예를 들어 마지막 conv layer의 feature map의 채널(논문에선 unit이라고 표현되어 있음)이 64이고 target class의 갯수가 10개인 경우 GAP를 통해 64-dim의 feature vector를 얻고 64x10만큼의 weight를 가진 fc layer를 이용하여 최종 class output을 계산한다.
fc layer를 학습한 뒤, fc layer의 weight를 이용하여 Class Activation Mapping(CAM)을 얻을 수 있다. Fig 1과 같이 특정 class의 output을 계산할 때 사용된 weight와 feature map을 weighted sum하여 하나의 2차원 tensor로 만든 뒤 이를 pixel space로 바꾸어서 시각화를 하면 activation이 상대적으로 활성화 된 영역의 정보를 눈으로 확인할 수 있다.
수식으로 정리를 해보면 아래와 같다.
Eq 1에서 f_k(x, y)를 conv layer의 feature map이며, k는 채널을 의미한다. w_k^c는 학습을 통해 얻어지는 weight값이다.
* Grad-CAM(Gradient-weighted Class Activation Mapping)
이전에 제안된 CAM의 아이디어를 더 일반화시킨 것이 주요 contribution 중 하나이다. CAM의 단점은 architecture가 자유롭지 못하다는 점이었다. class importance를 계산하기 위한 weight를 항상 학습을 통해 얻어야 하므로, 기존 network의 구조가 맞지 않으면 구조를 일부 바꾼 뒤 재학습을 해야된다는 단점이 있었다.
Grad-CAM에서는 Guided Backpropagation을 CAM에 접목을 시켰다. 아이디어는 매우 간단하다. CAM에서 학습을 통해 얻은 weight를 사용하지 않고, 대신 backpropagation을 통한 gradient를 weight로 사용하였다.
수식으로 살펴보면 아래와 같다.
Eq 4에서 A^k는 network에 존재하는 특정 conv layer에서 계산되 feature map이다. 즉, class c에 대한 feature map A의 gradient를 구하고 GAP를 적용시켜, scalar값으로 만든다.
Eq 4에서 구한 weight를 이용하여 CAM과 동일하게 weight sum을 통해 Grad-CAM을 계산한다.
논문에서는 Grad-CAM을 구할 때 ReLU를 적용했다. 왜냐하면 class c에 영향을 주는 pixel만 필요하기 때문이라고 한다.
이 부분은 쉽게 이해가 가질 않는다. feature map의 activation 값이 작다거나 음수라면 현재 class에 영향을 덜 끼치는 sample이라 볼 수 있겠지만, gradient의 경우 값이 음수라고 해서 현재 class에 영향을 덜 끼친다고 할 수 있는지 모르겠다. (나는 실제 구현 시 ReLU를 사용하지 않았다.)
매우 간단한 아이디어로 기존의 CAM을 일반화시켰다고 볼 수 있다. Grad-CAM에서는 network architecture의 제약이 없으며, 편미분이 가능하기만 하면된다. 또한, 꼭 마지막 conv layer만 시각화 할 수 있는 것이 아니라 network의 어느 conv layer도 시각화가 가능하다. 또한 Guided Backpropagation을 이용한 아이디어므로, Grad-CAM으로 구한 activation map과 guided bapropagation을 element-wise product하여 조금 더 fine하게 시각화를 할 수 있다.
* Grad-CAM++
Grad-CAM에서 크게 바뀐 것은 없으며, Grad-CAM의 주요 아이디어인 weight를 backpropagation을 이용하여 구하는 것을 그대로 가져간다.
다만, 이 때 weight값을 gradient 그대로 사용하지 말고 수식에 변화를 줘서 하는 것이 더 좋다는게 주요 내용이다.
위 그림을 보면 한눈에 CAM 계열에 대한 설명을 알 수 있다.
Grad-CAM의 경우 gradient를 weight로 그대로 사용하고 있으나, Grad-CAM++에서는 gradient에 relu를 적용하고 추가적인 term으로 값을 조절한다. relu는 postivie gradient만 취하겠다는 의미이고, 추가적인 term a^kc_ij에서 c는 class를 의미한다. a^kc_ij는 간단하게 설명하면 gradient의 weighted average이다. 즉, Grad-CAM에서 object가 겹치는 등의 문제 때문에 약해진 값을 보정해주기 위한 값으로 이해할 수 있다.
이렇게 하는 이유에 대해서는, 논문의 3.1을 보면 알 수 있는데 저자들이 주장하는 바는 object가 가려지거나 혹은 변형이 있을 경우 Grad-CAM에서는 이를 잘 반영하지 못한다는 것이다. 왜냐하면 그럴 경우 activation 값이 낮아지게 되고 이러면 gradient 값 또한 낮아지므로 나중에 visualization을 해보면 해당 영역이 잘 드러나지 않기 때문이다.
위의 그림을 보면 object가 하나일 경우에는 특별히 차이가 없으나, 겹쳐지거나 변형이 심한 경우 Grad-CAM은 heatmap이 정확하지 않는 것처럼 보이는걸 알 수 있다.
'Machine Learning' 카테고리의 다른 글
Horovod 사용기 (3) | 2019.09.26 |
---|---|
Encoder Based Lifelong Learning (0) | 2018.04.02 |
Gaussian Process (0) | 2018.04.02 |
[CNN] Deformable Convolutional Neural Networks (0) | 2018.04.02 |
[DomainAdaptation] VisDA ICCV 2017 workshop (0) | 2018.04.02 |