이 논문은 SOLO 논문을 읽다가 알게 되었는데 깊이 생각해 보지 않은 문제에 대해 이슈 제기를 하고 해결법을 

제안해 정리 해 보고자 한다.  

본인이 생각하는 흐름의 자연스러움 때문에 논문의 흐름과는 다른 흐름으로 정리했다. 

 

paper: 

An intriguing failing of convolution neural networks and the CoordConv solution

 

An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution

Few ideas have enjoyed as large an impact on deep learning as convolution. For any problem involving pixels or spatial representations, common intuition holds that convolutional neural networks may be appropriate. In this paper we show a striking counterex

arxiv.org

 

문제 제기:

이 논문에서는 coordinate transform 라는 문제를 제기 하고 우리에게 친숙한 convolution이 태생적인 문제(= translation invariant)로

인해 coordinate transform문제에 굉장히 취약 하다는 것을 보였고 CoordConv라는 간단한 개념을 도임해 이를 해결할 수 있다고 주장한다. 

 

그럼 coordinate transform 이 뭘까 ?

이 논문은 우리가 암묵적으로 convolution을 이용해 굉장히 많이 풀고 있는 문제의 가장 기초적인 두 가지 문제를 convolution이 놀랍도록 못 푼다는 발견에서 시작 한다. 

 

위에서 말한 두 가지 문제는 coordinate classification, coodinate regressiong 이다. 말이 어려워 보일 수 있는데 위 그림 Figrue 1의 가장 위쪽 그림을 보면 이해가 정말 쉽다. 

 

coordinate classification 문제는 네트워크의 입력으로 (x,y) 좌표(cartesian coordinate)을 넣고 출력으로 해당 (x,y)좌표에 해당하는 pixel만 1의 값을 갖는( 예를 들어 1이라고 했는데 사실 이 숫자는 background와 구분되기만 하면 된다. class 라고 보면 된다.) 이미지를 출력하는 문제이다. 

좌표가 주어졌을때 해당 좌표에 흰색 점을 하나 찍은 이미지를 그려주는 문제가 coordinate classification이다. 

 

다음으로 coordinate regression 문제는 coordinate classification 문제와 입력과 출력이 바뀐 문제이다. 

입력으로 특정한 한 픽셀만 1의 값을 갖는 이미지를 입력으로 넣었을 때 해당 픽셀의 (x,y)좌표(cartesian coordiante)를 출력으로 내놓는 문제이다. (object detection 이 익순한 분들은 이 문제가 object detection의 bbox regreesion 문제나 key point estimation 문제와 같다는 걸 바로 알수 있을 거다.)

 

이 두 문제의 정의를 이해 했으면 아래 내용은 정말 간단히 쉽게 이해 할 수 있다.

(참고로 본래 논문에서는 GAN 의 mode collapse 문제도 다루고 figure 1의 가장 아래 그림도 이에 대한 내용인데 이 문제에 대한 설명은 이 포스팅에서는 최소화 하겠다.)

 

Convolution은 뭘 못하는가?

Figure 2. Data set 정의

Convolution이 뭘 못하는지 보기 전에 convolution의 무능을 입증하기 위해 어떤 데이터 셋을 사용 했는지 보자.

Figure 2의 (a)에는 총 9 개의 샘플 이미지가 있다. 각 이미지는  64 x 64 크기이고 단 1 픽셀을 제외한 모든 픽셀의 값이 0이다. 즉 64 x 64 사이즈의 이미지에서 오직 1픽셀만 target인 one-hot encoding 된 이미지라고 볼 수 있다. 

(구태여 부연 설명을 하자면 왜 one-hot encoding이냐면 64x64 = 4096으로 vector로 표시 할수 있다. 

4096 length의 vector에서 오직 한 element만 값이 1 이라고 생각해 보면 이게 one-hot encoding 이라는 걸 알수 있다. )

 

(a)를 이해 했으면 (b)를 보자.  Figure 2. (b)의 윗줄에 있는 두 그림은 (a)처럼 one-hot encoding된 이미지를 train set, test set으로 나누고 각 데이터 셋에 해당하는 이미지를 모두 합해 하나의 이미지에 나타낸 것이다. 말이 이해가 잘 안될 수 있으니 아래 그림 Figure 3을 보자.

 

Figure 3. one-hot encoding 이미지의 합

 Figure 3에서 화살표 왼쪽에 있는 그림을 3x3사이즈의 one-hot encoding 이미지라 하자.

이 이미지들을 다 더하고 나면 화살표 오른쪽의 결합 이미지가 된다. 

Figure 3의 화살표 왼쪽에 있는 이미지가 Figure 2의 (a)에 표시된 sample이미지에 대응 되고 화살표 오른 쪽에 있는 이미지가 Figure 2 (b)에 있는 합 이미지 이다. 

 

다시 Figure 2의 데이터 셋을 설명하면 논문의 저자는 train-test data set 을 두 가지 기준으로 분리했다. 

train-test data set pair 1, train-test data set pair 2를 만들고 각각의 train set을 이용해 학습 하고 test set으로 테스트 했을 때 어떤 결과가 나오는지 보였다. 

 

1. train-test data set pair 1: 1값을 가지는 pixel이 이미지의 아무 곳에나 위치 할 수 있게 하고 train과 test 셋을 uniform distribution 을 이용해 구분했다. Figure 2 (b)의 윗쪽 두 이미지가 각각  train, test data set을 하나의 이미지로 합친 그림이다. 

 

2. train-test data set pair 2:  image를 4개의 사분면으로 나누고 1,2,3 사분면에 값이 1인 pixel이 위치한 one-hot encoding 이미지는 train set으로 사용 하고 4 사분면에 pixel 값이 1인 point가 위치한 경우는 test 셋으로 사용 하는 경우이다. (이 경우 네트워크는 학습시 4사 분면에 위치한 sample을 본적이 없기 떄문에 4분면에 위치한 point에 대해 coordinate classification문제를 풀수 있을까?)

 

데이터 셋 설명이 장황해 졌는데 위 두 데이터 셋으로 coordinate classification 네트워크(일반 convolution 사용)를 학습해 보면 아래 Figure 4와 같은 결과가 나온다. 

 

Figure 4. (a) Train-test Accuracy graph (b) train-time accuracy graph

Figure 4의 (a) 그래프는 train-test accuracy 의 경향을 보여준다. 그래프의 좌상단을 보면 uniform ○, quadrant 이라는 걸 보수 있는데 

 

uniform 은 위에 설명한 train-test data set pair 1로 학습-테스트를 진행한 결과 이고

quadrant train-test data set pair 2로 학습-테스트를 진행한 결과 이다. 

(헷갈리면 반드시 위에 가서 train-test data set pair에 대한 설명을 다시 확인하고 올것.)

 

uniform 한 데이터 셋을 사용한 경우 학습과 테스트시 그나마 어느정도는 비슷한 accuracy 경향성을 보이지만 (사실 경향성이라고 말하기 힘들다) quadrant 한 데이터 셋을 사용 한 경우 train에 오버 피팅되는 것을 볼수 있다. 즉 quadrant 데이터 셋의 경우 학습 시 네트워크는 1,2,3 사 분면에 target이 위치한 경우만 볼수 있고 테스트시에 처음 4사분면에 잇는 target을 보면 정신을 못 차린다는 것이다. 

 

다음으로 Figure 4 (b)는 uniform 하게 train-test data set을 나누고 학습 했을때 학습시간에 따라 test accuracy를 도식화 한 그래프 인데 그 값이 86%를 넘어가지 않는다.

 

즉 여기서 우리가 알 수 있는건 (저자가 말하고자하는 바는) 기존의 convolution은 이 단순한 문제(coordinate classification, coordinate regression)를 정말 심각할 정도로 못푼다는 것이다. 

 

CoordConv:

바로 위에서 convolution이 뭘 못하는 지를 봤다. 이번엔 그 문제를 저자가 어떤 아이디어로 해결하는지를 보자. 정말 단순하고 간단하다. 

 

Figure 5. (좌) 일반 convolution, (우) CoordConv: 제안하는 방식

Figure 5의 왼쪽엔 기존의 convolution이 나와있다. 그리고 오른쪽엔 논문에서 제안하는 CoordConv이다. 

CoordConv의 아이디어는 Convolution이 translation invariant한 특성이 있으니 위치에 대한 정보를 알려줘서 신경 쓰게 하는 것이다. (solo 논문에서는 이걸 "coordinate aware" 라고 표현했다.)

 

이를 위해서 coordconv의 입력 tensor 크기에 대응 하는 좌표를 (-1,1)로 normalize해서 concat 하는 것이다. 이것도 말로 하면 어려운데 코드를 보면 직관적이다. 

x_range = torch.linspace(-1,1, inputTensor[1].shape[-1]) # inputTensor의 0번재 dimension은 batch
y_range = torch.linspace(-1,1, inputTensor[1].shape[-2]) # inputTensor의 0번재 dimension은 batch
y,x = torch.meshgrid(y_range, x_range)
y = y.expand([batchSize, 1,-1,-1]) # j coordinate in Figure 5
x = x.expand([batchSize, 1,-1,-1]) # i coordinate in Figure 5
normalized_coord = torch.cat([x,y],1)
new_feature = torch.cat([features_normalized_coord],1)

위 코드에서  y,x는 각각 Figure 5 오른 쪽의  i cooridnate, j coordinate에 대응 하는 것이고

new_feature는 Figure 5 의 CoordConv에서 concatenate Channels 바로 다음의 $ h \times w \times c+2 $ shape을 가지는 tensor에 해당한다. 

 

결과:

Figure 6. CoordConv 학습 결과

Figure 6는 Figure 4와 같은 이미지이다. 위의 "Convolution은 뭘 못하는가?"란에서 설명한 두 데이터 셋 

uniform(train-test data set pair 1), quadrant(train-test data set pair 2) 에 대해 CoordConv가 어떤 성능을 보이는 지 보자.

 

Figure 6의 왼쪽 아래 그림에서 보면 train accuracy와 test accuracy가 일치 하는것을 볼 수 있고 오른쪽 그래프를 보면 학습 시간이 25초만 되도 convolution과 달리 accuracy가 1까지 올라간다.

 

Figure 번호가 햇갈릴수 있음에도 불구하고 위 figure 7 은 원 논문의 caption을 같이 올렸다. (설명이 햇갈리시면 영문을 읽는게 더 쉬울수 있으므로..)

 

Figure 7의 왼쪽은 coordinate classification의 학습데이터(가장 왼쪽 줄)와 테스트 inference결과(붉은 색 박스 안쪽)를 보여준다. coordinate classification는 앞에서 설명 한것 처럼 (x,y)를 입력 했을때 이미지에 해당하는 pixel에 색을 칠하는 문제이다. 붉은 박스의 가운데 그림이 convolution으로 inference한 결과를 시각화 한건데 제일 윗줄에 있는 GT 이미지에 4사분면이 가득 차 있는 것과 달리 4사분면이 거의 비어있는 것을 볼 수 있다. 

반면 CoordConv는 4사분면에 있는 점들을 잘 그리고 있다

 

Figure 7의 오른쪽은 coordinate regression을 학습한 결과를 시각화 한것이다. (coordinate regression은 one-hot image를 입력으로 넣고 target pixel의 (x,y)를 출력하는 문제이다. 시각화 한건 출력인 (x,y)를 다시 이미지에 표시한 것이다.)

파란색 박스 안쪽을 보면 convolution은 train데이터에 대해서도 test데이터에 대해서도 추정한 결과가 울퉁불퉁 한 반면, CoordConv는 결과가 GT와 거의 일치 한다. 

 

정리:

Convolution이 어떤 취약점을 가지고 있는지 비교적 간단한 실험을 통해 알아 보고 이 문제를 해결하기 위한 방법 정리해봤다. 

 

내 입장에서 CoordConv가 효과를 발휘 할 수 있는 문제는 어떤 식으로든 image로 부터 좌표를 추측하는 문제 즉 object detection일거 같다. 논문의 결과에도 object detection에서 (mnist data셋 기준) 상당한 성능 향상을 보았다고 리포팅했다. 

 

CoordConv를 사용해도 효과가 없는 문제는 object의 위치와 관련 없는 문제 즉 classification문제 이다. 

 

위에서 언급은 안했지만 논문을 보면 저자는 mode collapse에 대한 이야기도 하지만 이 포스트에는 정리하지 않았다. 당장의 내 관심사와는 좀 거리가 있고 내 이해가 부족하기도 해서이다. 

 

+ Recent posts