티스토리 뷰

 

더보기

 

DeepConv-DTI 논문을 읽고 있는데 global max pooling이라는 용어가 등장한다. 처음엔 대강 무슨 뜻이겠거니 하고 넘어간 뒤 논문을 읽어내려가다 보니 이해가 안돼 Global pooling에 대한 용어를 확실히 공부해야 할 필요성을 느꼈다.

 

1. Pooling 개념의 등장 배경

CNN에는 conv를 통해 계산되어 만들어지는 feature map들이 있다.

https://vitalflux.com/different-types-of-cnn-architectures-explained-examples/

 

원본 한장의 이미지로부터 Convolution 연산을 통해 수많은 feature map들이 만들어진다. 

만들어지는 feature map의 shape는 Conv연산의 stride, padding 등 다양한 hyperparameter들에 의해 변하게 된다.

보통은 input되는 이미지를 흑백의 MNIST 데이터라고 하면 (28 * 28 * 1) 이미지가 1개의 채널을 가지는 (3 * 3 * 1) kernel 1개를 통과하면서 (26 * 26 * N) 형태가 되는 방식이 가장 기초적인 형태의 conv 연산이다.

아주 단순한 형태의 일반적인 CNN 연산 결과로 나오는 feature map

 

이렇게 간단한 형태의 연산이라면 그냥 conv 연산의 결과로 나온 feature map을 flatten하여 Fully Connected Layer를 통과 시킨 뒤 softmax함수를 적용해 classification task를 진행하면 된다.

그러나 CNN 연산의 층이 깊어지면 input된 데이터의 feature를 뽑아내기 위해 필요한 모델의 크기가 과도하게 증가하고, 이는 컴퓨터 연산량의 증가로 이어져 학습의 속도 저하와 동시에 over fitting의 문제도 발생한다는 것이다.

일반적인 형태의 CNN -> FC Layer -> softmax -> Classification Flow

 

처음에는 이런 과도한 연산량 증가를 방지하고 over fitting 현상을 줄이기 위해서 pooling에 대한 개념이 등장한다.

 

CNN에서 Pooling은 CNN연산의 결과로 만들어지는 feature map의 size를 줄이자는 것이다.

feature map은 이미 input 이미지의 특징정보를 포함한 map이라고 생각하기 때문에 이것에서도 특히 특징적인 값을 취하여 feature map의 사이즈를 좀 줄여보자는 개념이었다.

AVG pooling

다만 여기까지의 pooling은 Global pooling이 아니라는 점에 유의하자 feature map의 국소 부위에 대하여 pooling을 진행하는 것이다. 

헷갈리겠지만 Global Pooling은 반드시 Global이라는 단어를 앞에 붙여 설명하니, 그냥 pooling은 이런 국소 부위에 대한 pooling으로 생각해주길 바란다.

 

2. 그럼 Global Pooling은 무엇인가?

Conv 연산을 할 때 input에 대해서 kernel을 이용해 conv연산을 하듯 pooling역시 n*n size의 kernel을 이용해 해당 size의 max 또는 average value를 취하여 1개의 scalar 값으로 반환하는 연산을 진행한다. 그림에서 pooling의 결과가 5, 5 matrix로 표현된 것은 임의로 설정한 것이며 상황에 따라서는 pooling 이후 나올 수 없는 사이즈도 존재하니 양해바란다.

일반적인 pooling의 결과로 눈여겨 볼 것은 pooling 과정을 거치지 않았을 때 classification을 위해 flatten된 벡터의 사이즈가 26 * 26였던 반면 5 * 5 사이즈로 상당히 크게 줄어들었다는 것이다. 이렇게 pooling을 거치면 feature map의 정보 손실을 최소화하면서 이후에 연산될 feature map의 사이즈를 크게 줄여 연산 속도를 상당히 가속시키며 추가로 globalization 효과도 얻을 수 있어서 over fitting에 대한 방지도 가능하다.

그러나 공학자들은 생각하기를, 그럼에도 불구하고 현재는 간단한 28*28 이미지를 예시로 들어 간단한 pooling만을 이용해서도 충분히 간단한 형태의 output layer를 만들 수 있던 반면, input되는 이미지가 커질수록, 이미지 합성곱 연산층이 깊어지면 깊어질 수록 pooling만으로는 충분한 효과를 얻지 못한다고 생각했다.

왜냐면, 맨 마지막 합성곱 결과로 나온 feature map을 FC layer로 전달하기 위해서는 어쩔 수 없이 flatten과정을 거쳐야 하는데 이것때문에 feature map이 가지고 있던 위치 정보를 모두 잃어버리기 때문이다.

맨 마지막 feature map을 flatten 하는 과정에서 location 정보를 잃는다.

이들은 CNN의 맨 마지막 Layer를 flatten 하는 과정에서 잃게되는 위치정보를 보존한 채 classification하는 방식을 구현하고 싶었다. 그 결과 만들어진 방식이 바로 Global MAX/AVG pooling이다. 어떤 개념인지 아주 명확하게 잘 설명한 figure가 있다.

왼쪽 기존의 CNN 방식을 통해 classifier로 전달하는 방식, 오른쪽 Globa Average Pooling을 통해 FC layer 전달 없이 바로 classification하는 방식

 

본 주인장의 미적감각의 한계로, 해당 영상에서 하고싶은 이야기를 명확하게 전달할 그림을 도저히 그릴 수가 없더라. 해당 피규어에 대한 3분가량의 짧은 설명이 있는데 영어 자막이 되어있으니 참고하여 보면 CNN에서의 Global pooling에 대한 이해에 상당히 도움이 될 것이다.

https://www.youtube.com/watch?v=FUv5NHL9s_U 

 

 

짧게만 이야기하자면 기존 방식대로 flatten하여 FC layer로 전달하는 classifier 방식을 사용하기보다, Feature map의 channel수를 내가 조절하여 마지막 classication 할 class 수로 맞춰주면 feature map의 사이즈에 관계 없이 channel에 대한 Global한 average value나 max value를 하나의 scalar값으로 반환하고, channel수에 맞춰 이것을 하나의 vector로 만들어 준뒤, 이 벡터를 이용해 softmax함수등을 거쳐 바로 classification에 사용하자는 것이다.

해당 방법은 FC layer에 필요한 연산과정을 상당부분 추가적으로 줄일 수 있고 flatten할 때 잃어버리던 location 정보를 잃지 않은 채 classification 할 수 있다는 장점이 있다고 한다.

댓글