Convolutional Neural Network-1 : 위치가 다른 강아지도 동일하게 인식하기

This entry is part 5 of 9 in the series 딥러닝 핵심 개념

1. 들어가며

Convolutional Neural Network(CNN)는 가장 유명한 딥러닝 네트워크 중 하나입니다. 이미지뿐만 아니라 시계열 데이터를 다루는 데에도 강력한 성능을 보이죠. 딥러닝의 부활은 2012년 발표된 AlexNet으로 시작되었습니다. 이 AlexNet의 성공은 CNN의 사용 덕분이라고 해도 과언이 아닙니다.

Convolutional Neural Network 는 기존 Fully Connected Network(FCN)과는 차별화되는 결정적인 장점이 있습니다. 바로 위치가 다른 물체도 동일한 물체로 인식할 수 있다는 점입니다. 그것도 훨씬 적은 연산량으로 말이죠. 이러한 장점으로 인해 Convolutional Neural Network 는 FCN을 대체하여 지금의 대세 네트워크로 자리 잡을 수 있었습니다. 이러한 Convolutional Neural Network의 특성을 Translation Invariance라고 합니다.

이번 글에서는 Convolutional Neural Network의 Translation Invariance 특성을 살펴봅니다. 먼저 FCN으로 강아지와 고양이 이미지를 구분하는 과정을 따라가 봅니다. 이 과정에서 FCN으로 구성한 이미지 분류 방식의 문제점을 살펴봅니다. 이후 위치가 다른 강아지도 동일하게 인식하기 하도록 FCN 구조를 개선해 봅니다. 이 과정에서 자연스럽게 CNN을 구성하는 Convolution, Pooling 등의 연산을 이해해 보겠습니다.

2. Fully Connected Network로 강아지와 고양이 구분하기

2-1. 네트워크 구성하기

먼저 강아지와 고양이 이미지를 구분하기 위한 Fully Connected Network(FCN)를 구성해 주겠습니다. 우선 입력 데이터는 아래와 같습니다.

1.이미지 픽셀값 1열로 줄 세우기
그림1. 이미지 픽셀값 1열로 줄 세우기

위 그림의 이미지는 총 32x32x3개의 픽셀로 구성되어 있습니다. FCN의 입력으로 넣어주기 위해 이미지를 왼쪽 위부터 오른쪽 아래까지 순서대로 1열로 쭉 줄을 세우겠습니다. 이때 RGB 각각에 대해 32×32개의 픽셀이 있으니, 색상별로 순서대로 쭉 줄을 세워줍니다. 그럼 총 32x32x3개의 픽셀 값이 1열로 줄을 서게 됩니다. 이제 각각의 픽셀 값을 입력값으로 하여 FCN에 넣어줍니다.

지금까지의 과정은 아래 그림과 같습니다.

2.입력 이미지 FCN 구성하기
그림2. 입력 이미지 FCN 구성하기

입력값에 대해 직선과 곡선 함수들을 쭉 이어줍니다. 위 그림에서 직선 함수는 선형 연결로, 곡선 함수들은 비선형 연결로 표현하였습니다. 비선형 연결은 비선형 활성 함수에 해당합니다. 이제 결괏값을 표현해 주겠습니다. 우리가 예측하고자 하는 결과는 강아지와 고양이 두 가지입니다. 따라서 결괏값도 2개로 나올 수 있도록 구성해 주겠습니다.

3.입력 이미지 FCN 구성하기
그림3. 입력 이미지 FCN 구성하기

결괏값이 2개로 나오면서 이 결괏값이 강아지를 의미하는지, 고양이를 의미하는지 판단해야겠죠? 그렇다면 각각의 결괏값이 강아지와 고양이에 대한 확률 값으로 표현되는 게 좋겠습니다. 따라서 Softmax 함수로 연결해 줍니다. 최종 네트워크 구성은 다음 그림과 같습니다.

4.입력 이미지 FCN 구성하기
그림4. 입력 이미지 FCN 구성하기

2-2. 문제점

이렇게 구성한 네트워크를 사용하여 강아지와 고양이 이미지를 구분하도록 학습한다고 가정해 보겠습니다. 학습을 진행하면서 학습용 데이터와 검증용 데이터의 Loss값을 측정해 보았습니다. 학습 데이터에 대한 오차는 기대한 대로 잘 줄어들면서 학습이 잘 진행되는 모습을 보입니다. 그런데 웬일인지 검증 데이터에 대한 오차를 같이 측정해 보니 처음부터 잘 줄어들지 않는 모습을 보입니다.

줄어들지 않는 검증용 데이터 오차
그림5. 줄어들지 않는 검증용 데이터 오차

이게 무슨 상황일까요? 학습을 멈추고 상황을 파악해 보겠습니다. 네트워크에게 강아지랑 고양이를 입력으로 주고 어떻게 대답하는지 살펴봐야겠습니다. 학습용 강아지 사진을 주니 자신 있게 ‘강아지’라고 대답을 합니다. 지금까지 학습이 진행되면서 학습 데이터에 대한 오차는 잘 줄어들었으니 여기까지는 납득이 되는 상황입니다.
이번에는 검증 데이터 차례입니다. 학습 데이터의 강아지와 거의 동일한데, 강아지의 위치만 조금 달라진 사진을 입력으로 넣어봤습니다. 그랬더니 이번에는 자신 있게 ‘고양이’라고 대답을 합니다.

6.위치가 다른 강아지 인식하기
그림6. 위치가 다른 강아지 인식하기

이게 무슨 일일까요? FCN은 왜 위치가 다른 강아지 사진을 고양이라고 대답했을까요? 이유를 찾기 위해 데이터를 살펴봐야겠습니다. 학습용 데이터를 살펴보니 아래 그림과 같았습니다.

학습용 데이터에서의 강아지와 고양이
그림7. 학습용 데이터에서의 강아지와 고양이

강아지 사진은 왼쪽 상단, 오른쪽 상단, 왼쪽 하단에 있었네요. 고양이 사진은 오른쪽 하단에 있습니다. 이를 통해 FCN은 ‘내용’보다는 ‘위치’를 더 중요하게 판단 근거로 학습하고 있음을 유추할 수 있습니다. 왼쪽 상단, 오른쪽 상단, 왼쪽 하단에 위치하는 동물은 강아지로, 오른쪽 하단에 위치하는 동물은 고양이로 인식하고 있는 것이죠.

2-3. 원인

왜 이런 일이 발생한 걸까요? 원인 파악을 위해 이번에는 FCN의 연산 과정을 하나씩 뜯어봐야겠습니다. 입력값을 RGB 모든 색상을 고려하면 너무 복잡합니다. 흑백 이미지라고 가정하고 한 가지 색상값에 대해서만 생각해 보겠습니다. 학습용 강아지 데이터는 아래와 같이 가로 60픽셀, 세로 30픽셀의 흑백 사진이었다고 생각해 보겠습니다.

학습용 흑백 강아지 이미지
그림8. 학습용 흑백 강아지 이미지

그럼 사칙 연산 계산 상자로 들어갈 때는 아래와 같이 1열로 줄 세워져서 들어갔을 겁니다.

1열로 줄 세운 학습용 강아지
그림9. 1열로 줄 세운 학습용 강아지

이미지의 왼쪽 위부터 순서대로 1열로 줄을 세워 재정렬 해주는 거죠. 그럼 대부분의 강아지 정보는 1열로 줄 세워졌을 때 위쪽에 위치한 모습을 볼 수 있습니다. 이번에는 FCN이 고양이라고 판단했던 검증용 강아지 데이터를 살펴보겠습니다. 마찬가지로 가로 60픽셀, 세로 30픽셀의 흑백 사진이라고 생각해 보겠습니다.

검증용 흑백 강아지
그림10. 검증용 흑백 강아지

이 이미지를 동일한 방식으로 1열로 줄 세우면 다음과 같은 모습이 될 겁니다.

1열로 줄 세운 검증용 강아지
그림11. 1열로 줄 세운 검증용 강아지

학습용 데이터와는 달리 강아지 정보의 대부분이 아래쪽에 위치한 모습을 볼 수 있습니다. 이 두 데이터가 FCN의 연산을 거치는 과정을 생각해 보겠습니다. 먼저 왼쪽 상단에 위치한 강아지의 연산 과정은 다음과 같습니다.

12.왼쪽 상단 강아지 인식 연산하기
그림12. 왼쪽 상단 강아지 인식 연산하기

주로 FCN의 위쪽 노드로 입력값이 들어가고 연산되는 모습을 볼 수 있습니다. 반면 오른쪽 하단에 위치한 강아지의 연산 과정은 다음과 같습니다.

13.오른쪽 하단 강아지 인식 연산하기
그림13. 오른쪽 하단 강아지 인식 연산하기

주로 FCN의 아래쪽 노드로 입력값이 들어가고 연산되는 모습을 볼 수 있습니다. 이 두 정보는 같은 모양이지만, 다른 위치에서 입력됨으로써 전혀 다른 연산 결과를 내게 됩니다. 이제 왜 FCN이 검증용 데이터의 강아지에게 고양이라고 대답했는지 감이 오시나요? 1열로 펼쳐놓은 픽셀 값들을 놓고 보면 두 강아지 데이터는 전혀 다른 순서로 배치되어 있습니다. FCN 입장에서는 배치 순서가 달라졌으니 전혀 다른 정보가 되어버린 것입니다.

보통 이러한 문제를 개선하기 위해 data augmentation을 사용합니다. Data augmentation은 학습 데이터를 뻥튀기해서 학습해 주는 기법입니다.

data augmentation 예시
그림14. data augmentation 예시

하지만 FCN을 사용한다면 이런 방법도 한계가 있습니다. Data Augmentation을 무한정해 줄 수는 없는데, FCN은 강아지의 위치가 조금만 달라져도 고양이라고 판단할 테니까요.

data augmentation의 한계
그림15. data augmentation의 한계

3. 위치가 달라져도 동일하게 인식하기

3-1. 큰 그림

3-1-1. FCN 연산 방법의 문제점

앞서 살펴보았듯 FCN이 강아지와 고양이를 구분하는 가장 중요한 근거는 정보의 위치입니다.

16.정보 위치에 따라 달라지는 연산
그림16. 정보 위치에 따라 달라지는 연산

아래 그림처럼 이미지 상에서 강아지의 위치가 달라지면 1열로 줄 세웠을 때의 강아지 정보 위치도 달라지게 되죠. 그럼 이후 사칙 연산으로 이루어진 계산에서는 위치가 다른 강아지에 대해서는 전혀 다른 계산 결과가 나오게 됩니다.

입력 정보 위치에 따라 달라지는 연산 결과
그림17. 입력 정보 위치에 따라 달라지는 연산 결과

3-1-2. FCN 개선하기

그럼 FCN 방식은 그대로 유지하면서 그 사이의 이미지 연산 과정에 무언가 개선 포인트가 필요하겠습니다. 새로운 연산을 사용하여 이미지를 처리해 주고, 이렇게 나온 연산 결과에 FCN을 연결해 주는 겁니다. 새로운 연산은 강아지 정보는 위쪽으로, 고양이 정보는 아래쪽으로 보내는 역할을 수행해 주면 되겠네요. 그럼 아래 그림과 같은 큰 그림이 그려집니다.

새로운 연산 방법의 도입
그림18. 새로운 연산 방법의 도입

‘연산 후 이미지’에는 1열로 펼쳤을 때 특정 위치에는 강아지 정보가, 또 다른 특정 위치에는 고양이 정보가 위치한 모습입니다. 어떻게 하면 이게 가능할까요? 1열로 펼치는 과정을 자세히 들여다보겠습니다.

1열로 펼치기 과정
그림19. 1열로 펼치기 과정

RGB 이미지는 위 그림과 같은 과정을 통해 1열로 펼쳐집니다. 즉 1열로 펼치는 과정은 각 채널 순서대로 왼쪽 위부터 오른쪽 아래의 값을 순서대로 1열로 정렬하는 과정입니다. 위의 그림을 살펴보면, R채널에 존재하는 이미지 값을 왼쪽 위부터 오른쪽 아래까지 먼저 1열로 펼쳐주었습니다. 그 아래에 바로 이어서 이번에는 G 채널을 동일하게 펼쳐주고, 이어서 B채널을 동일하게 펼쳐서 1열로 정렬해 주었습니다. 우리가 원하는 건 ‘1열로 펼친 상태에서 특정 객체의 정보가 특정 위치에 있는 것’입니다. 그런데 위의 RGB 이미지를 1열로 펼치는 과정을 다시 볼게요. 1열로 펼친 뒤의 위치는 ‘어느 채널에 있던 정보인지’가 결정한다는 것을 알 수 있습니다.

그렇다면 아래 그림과 같이 특정 채널 값에는 특정 정보만 들어가도록 구성해 주면 어떨까요?

특정 채널에 특정 정보 위치시키기
그림20. 특정 채널에 특정 정보 위치시키기

예를 들어 첫 번째 채널에는 강아지 정보만 들어가는 겁니다. 마지막 채널에는 고양이 정보만 들어가 있고요. 1열로 펼치기 직전에 위 그림처럼만 만들어주면 되지 않겠어요? 그럼 1열로 펼친 뒤 강아지 정보는 항상 위쪽에, 고양이 정보는 항상 아래쪽에 위치하게 될 겁니다. 이후에는 FCN으로 연산하는 거죠. FCN은 위치를 가장 중요한 근거로 판단한다고 했으니 이번에는 제대로 판단할 수 있을 겁니다.

3-1-3. 채널별로 연산하기

즉 우리가 원하는 새로운 연산 방법의 가장 중요한 조건은 이겁니다. 바로 채널별로 연산하는 것이죠. 각각의 채널은 특정 객체에 대한 정보만을 연산하는 겁니다. 위 그림에서처럼 첫 번째 채널은 강아지에 대한 정보만, 마지막 채널은 고양이에 대한 정보만 연산하는 것처럼요. 그렇다면 전체 큰 그림은 다음과 같습니다.

큰 그림
그림21. 큰 그림

원래는 RGB 3개의 채널밖에 없던 이미지에 ‘새로운 연산 방법’을 수행했더니 채널의 개수가 k개로 늘어난 것을 볼 수 있습니다. 초록색 채널에서는 강아지 정보만, 주황색 채널에서는 고양이 정보만 담는다고 가정했습니다. 이렇게 나온 채널별 정보에는 FCN을 붙여 강아지와 고양이를 구분하겠습니다.

3-2. 필터를 사용해서 특정 채널에는 특정 이미지의 유사도 정보만 넣기

그렇다면 어떻게 하면 특정 채널에는 특정 객체와 관련된 정보만 넣어줄 수 있을까요?

이렇게 한번 생각해 보죠. 강아지와 고양이에 대한 엄청 다양한 필터를 만들어주는 겁니다. 예를 들어 강아지 1번 필터는 강아지 얼굴 모양을 하고 있는 거예요. 이 필터를 거쳐 나간 이미지에서는 필터랑 동일한 부분만 남도록 만들어주는 겁니다.
마치 편광 필터처럼 말이죠.

필터 사용하기
그림22. 필터 사용하기

이렇게 다양한 강아지와 고양이의 필터를 만들어준 뒤 이미지를 통과시키는 겁니다. 그럼 필터랑 비슷하게 생긴 이미지일수록 남아있는 값이 크겠죠?

우리가 원하는 큰 그림은 이렇습니다.

필터를 사용한 새로운 연산
그림23. 필터를 사용한 새로운 연산

이미지에 필터를 통과시키는 과정을 위 그림에서는 ‘이미지와 필터의 유사도 측정’이라고 표현했습니다. 위 그림을 보면 이미지의 강아지와 동일하게 생긴 1번 필터에 대해서는 유사도가 1로 가장 크게 나온 모습을 볼 수 있습니다. 반면 고양이 필터에 대해서는 유사도가 0~0.1 정도로 매우 낮게 나왔습니다. 다른 강아지 필터에 대해서는 0.7~0.9 정도로 비교적 높게 나온 모습을 볼 수 있습니다. 이렇게 구성해 줄 수만 있으면 이후 FCN으로 연결되는 최종 강아지와 고양이 예측 값은 다음과 같이 구성될 겁니다.

강아지와 고양이 최종 예측값
그림24. 강아지와 고양이 최종 예측값

여기서 각각의 연결 가중치는 w로 표현했습니다. 이 가중치들은 Gradient Descent 방식을 통해 학습할 겁니다. 즉 강아지 최종 값으로 연결되는 초록색 선들은 큰 가중치를 갖도록 (그림에서 두꺼운 선), 주황색 선들은 작은 가중치를 갖도록 (그림에서 얇은 선) 학습될 것입니다. 반면 고양이 최종 값으로 연결되는 주황색 선들은 큰 가중치를 갖도록 (그림에서 두꺼운 선), 초록색 선들은 작은 가중치를 갖도록 (그림에서 얇은 선) 학습될 것입니다.

3-3. 필터를 사용해서 이미지와 비슷한 정도 측정하기

그럼 어떻게 이미지와 필터의 비슷한 정도를 측정할 수 있을까요?

만족해야 하는 조건은 다음과 같습니다.

  1. 이미지와 필터는 오직 사친연산만 사용하여 연산해야 됨
  2. 결괏값은 이미지와 필터가 얼마나 비슷한지를 표현해야 됨

예를 들면, 다음과 같이 계산되어야 합니다.

25.필터로 유사도 측정하기
그림25. 필터로 유사도 측정하기

이 그림을 사칙 연산을 하기 위해 픽셀 값으로 바꿔서 생각해 보면 다음과 같습니다.

26.필터로 유사도 측정하기
그림26. 필터로 유사도 측정하기

이렇게 픽셀 값으로 바꿔놓고 보니 이런 생각이 듭니다. 이미지와 필터의 픽셀 값을 각각 동일한 위치에 있는 값들끼리 곱해주면 어떨까요? 그럼 서로 값이 큰 부분은 큰 값이 나올 거고, 하나라도 작으면 작은 값이 되겠죠. 최종적으로는 이미지와 필터에서 둘 다 큰 값이 있는 부분만 살아남을 겁니다. 그렇게 나온 값들을 모두 더해주면 살아남은 값들이 많을수록 최종적으로 큰 값이 나올 테죠. 결과적으로는 이미지와 필터가 비슷할수록 큰 값이 나오게 될 겁니다. 그림으로 보면 아래와 같습니다.

필터로 유사도 측정하기
그림27. 필터로 유사도 측정하기

첫 번째 그림을 보면 이미지와 필터는 동일한 모습을 하고 있습니다. 이 둘에 대해 같은 위치의 픽셀 값끼리 곱한 결과는 오른쪽의 파란색 그림입니다. 이미지와 동일한 값을 갖고 있는 모습을 볼 수 있습니다. 이렇게 살아남은 9개의 1을 모두 더해 최종적으로 9라는 값을 얻었습니다.

반면 두 번째 그림을 보면 이미지와 필터는 전혀 다른 모습을 하고 있습니다. 이 둘에 대해 같은 위치의 픽셀 값끼리 곱해보니 대부분은 0과 1이 곱해지며 0이 되어버립니다. 이렇게 나온 결괏값을 모두 더해주니 1이 나오게 되었습니다. 우리가 의도한 대로 이미지와 필터가 유사할수록 큰 값이 나오고, 다를수록 작은 값이 나오는 모습을 확인했습니다.

이렇게 필터를 사용하여 이미지와 같은 위치의 픽셀끼리 곱하고 더하는 연산 방법을 합성곱 (Convolution)이라고 합니다. 큰 흐름에 집중하기 위해 Convolution 연산에 대한 자세한 내용은 다음 글에서 살펴보겠습니다.

3-3. 필터를 이미지에 슬라이딩시키기

이제 위에서 계획한 대로 이미지에 필터를 사용하여 이미지와 유사도를 측정해 보겠습니다. 그런데, 한 가지 더 고민해봐야 할 부분이 남았습니다. 이미지와 필터의 사이즈가 다르면 어떻게 해야 할까요?

이미지와 다른 필터의 사이즈
그림28. 이미지와 다른 필터의 사이즈

생각해 보면, 대부분의 상황에서는 이미지와 필터의 사이즈가 다를 겁니다. 이미지와 필터의 사이즈가 같다는 건, 강아지를 인식하기 위해서 이미지와 동일한 사이즈의 다양한 강아지 필터를 만들어야 한다는 것이죠. 이렇게 되면 이건 데이터를 사용해 학습하는 게 아니죠. 그냥 존재할 수 있는 모든 강아지의 모습을 외워버리겠다는 것과 마찬가지가 되어버립니다. 따라서 이미지보다는 작은 사이즈의 필터를 여러 번 사용하여 유사도 측정 연산을 수행해야 할 겁니다.

그렇다면 큰 이미지에 대해 작은 필터를 사용하여 위와 같은 연산을 수행하려면 어떤 좋은 아이디어가 있을까요? 이번에는 필터를 슬라이딩하는 방법을 사용해 보죠. 필터를 이미지에 대해 좌우상하로 슬라이딩시키는 겁니다. 아래 그림과 같이 하나의 필터를 이미지에 슬라이딩해 가며 여러 번 유사도를 측정하는 거죠.

슬라이딩 필터 만들기
그림29. 슬라이딩 필터 만들기

이렇게 동일한 필터를 사용하는 방식을 Weight Sharing이라고 합니다. 그럼 하나의 이미지에 대해 필터로 유사도를 측정한 결과가 어떻게 표현될까요? 이 결과는 하나의 값으로 나오는 게 아닌, 이미지의 위치별 유사도 값으로 (map처럼) 표현될 겁니다.

슬라이딩 필터를 사용한 유사도 측정
그림30. 슬라이딩 필터를 사용한 유사도 측정

이렇게 Weight Sharing 필터를 사용하여 Convolution 연산을 수행하는 층을 Convolution Layer라고 부릅니다.

3-4. 필터로 측정한 유사도 맵에서 대푯값 뽑기

이제 convolution filter를 슬라이딩하며 이미지와 유사도를 측정하고 나면 아래 그림과 같이 ‘유사도 맵’이 나오게 될 겁니다.

유사도 맵 구하기
그림31. 유사도 맵 구하기

위의 그림에서는 각 필터 별로 이미지를 옆으로 세 번, 위아래로 두 번씩 슬라이딩했다고 가정했습니다. 따라서 ‘유사도 맵’은 2×3 형태의 값을 갖습니다. 그런데 이렇게 ‘맵’ 형태의 값이 나오게 되면 이미지와 값의 개수만 달려졌을 뿐입니다. 이를 다시 1열로 줄 세워야 한다는 점에서는 이미지와 달라진 게 없죠. 우리가 지금 무엇을 하고 있는지 다시 생각해 볼게요. 애초에 위치가 다른 강아지를 동일한 강아지로 인식하지 못하는 문제의 원인이 뭐였죠? 1열로 줄 세우는 과정에서 위치 의존성을 갖게 된다는 것이었습니다. 따라서 이렇게 되면 필터를 사용해서 이미지와 필터의 유사도를 측정한 게 의미가 없게 됩니다.

3-4-1. 유사도 측정을 위한 다양한 방법

그럼 이제 ‘유사도 맵’으로부터 이 맵을 대표하는 ‘유사도 값’을 갖게 하는 어떤 새로운 연산 방법을 고민해야겠습니다.

유사도 맵으로 부터 대표 유사도 값 구하기
그림32. 유사도 맵으로 부터 대표 유사도 값 구하기

위의 그림을 볼게요. 먼저 강아지 이미지에 대해 ‘유사도 맵’을 뽑았습니다. 이제 우리에게는 이 ‘유사도 맵’에 적용할 새로운 연산이 필요합니다. 이 새로운 연산은 강아지 필터로부터 나온 ‘유사도 값’은 크게 나오게 해야 합니다. 반대로 고양이 필터로부터 나온 ‘유사도 값’은 작게 나오게 해야 하죠. 무슨 연산을 사용하면 될까요?

다양한 방법이 있을 겁니다. 이 중 ‘유사도 맵’으로부터 가장 큰 값을 대푯값으로 한 개만 뽑는 방법을 생각해 보겠습니다. ‘유사도 맵’에서 가장 큰 값이란 이미지와 해당 필터와의 유사도가 가장 큰 부분을 의미할 겁니다. 우리한테 필요한 건 그게 ‘어느 부분이냐’가 아닙니다. 이 필터와 이미지를 슬라이딩하면서 봤을 때 가장 유사한 부분은 ‘얼마나 유사했는지’이죠. 따라서 ‘유사도 맵’으로부터 가장 큰 값 하나만 사용한다는 논리가 일리가 있습니다.

그럼 위의 그림은 아래와 같이 계산되게 됩니다.

가장 큰 값으로 대표값 구하기
그림33. 가장 큰 값으로 대표값 구하기

각각의 ‘유사도 맵’에서 가장 큰 값에 파란색 동그라미가 쳐진 모습을 볼 수 있습니다. 이렇게 Convolution 연산 결과로 나온 ‘유사도 맵’을 대표하는 하나의 값을 추출하기 위한 연산을 Pooling이라고 합니다. Convolution 연산과 마찬가지로 Pooling 또한 다음 글에서 자세히 살펴보겠습니다.

이제 이렇게 나온 대표 ‘유사도 값’으로 최종적으로 강아지와 고양이의 예측값을 계산해 보면 다음과 같습니다.

유사도 값으로 부터 최종 예측값 구하기
그림34. 유사도 값으로 부터 최종 예측값 구하기

강아지와 관련된 ‘유사도 값’은 크게 나왔고 고양이 관련된 ‘유사도 값’은 낮게 나왔죠. 이제 강아지 예측값으로 연결되는 FCN의 가중치만 크면 최종적으로 강아지 예측값이 크게 나오게 될 겁니다. 지금까지의 아이디어 전개 과정을 한 장의 그림으로 표현하면 다음과 같습니다.

convolution과 pooling 결합하기
그림35. convolution과 pooling 결합하기

먼저 입력 이미지에 대해 Convolution 필터를 사용하여 Convolution 연산을 통해 ‘유사도 맵’을 뽑습니다. 그리고 이렇게 나온 각각의 ‘유사도 맵’에 대해서는 Pooling 연산을 통해 대푯값을 하나만 뽑습니다. 위의 그림에서는 최댓값으로 대푯값을 뽑았습니다. 이제 정말로 다른 위치에 있는 같은 강아지가 입력 이미지로 들어오면 어떻게 연산이 되는지 살펴보겠습니다.

3-4-2. Pooling 연산 적용하기

36.Convolution과 Pooling으로 다른 위치 강아지 인식하기
그림36. Convolution과 Pooling으로 다른 위치 강아지 인식하기

위 그림은 우리가 그동안 살펴본 왼쪽 상단에 있는 강아지 이미지의 연산 과정입니다. 아래 그림은 동일한 강아지가 오른쪽 하단에 위치해 있는 이미지의 연산 과정입니다.
어디가 달라졌는지 보이시나요? 유일하게 다른 부분은 ‘유사도 맵’에서의 대푯값이 있는 위치입니다. 강아지의 위치가 달라짐으로 인해서 ‘유사도 맵’에서의 값의 위치가 달라진 겁니다. 하지만 pooling 연산을 거치면서 결국 대표로 뽑힌 ‘유사도 값’은 모두 동일한 모습을 볼 수 있습니다.
결국 이후 강아지의 위치가 바뀐 건 이후 연산에는 영향을 주지 못합니다. 최종적으로는 위 그림과 아래 그림은 정확히 동일한 최종 예측값이 나오게 됩니다. 이렇게 강아지의 위치에 상관없이 동일한 값으로 예측하는 특성을 Translation Invariance라고 합니다.

지금까지 살펴본 Convolution, Pooling 연산을 사용하는 인공신경망을 CNN (Convolutional Neural Network)이라고 합니다. 한글로는 합성곱 신경망이라고 표현합니다.

3-5. CNN 학습하기

지금까지 Convolutional Neural Network의 구성을 살펴봤습니다.

Convolutional Neural Network의 핵심은 필터라고 할 수 있습니다. 각각의 필터로부터 나온 결과맵은 하나의 채널을 의미했죠. 이렇게 각각의 채널은 특정 객체에 대한 정보만을 담고 있었습니다. 덕분에 FCN과 연결하여도 Translation Invariant 특성을 유지할 수 있었습니다.

3-5-1. Convolution 필터 학습 과정

그렇다면 Convolutional Neural Network의 핵심인 필터는 어떻게 만들어질까요? 강아지와 고양이 필터를 하나씩 만들어줘야 할까요?
Convolutional Neural Network의 필터는 FCN에서의 weight와 마찬가지로 Gradient Descent 방법으로 학습됩니다. 아무 의미 없는 모양의 필터에서 시작해 Loss를 줄이는 방향으로 필터의 가중치값이 변해가는 것이죠. 이 과정에서 자동으로 강아지와 고양이를 구분할 수 있는 모양의 필터가 만들어집니다.

convolution filter의 학습 과정
그림37. convolution filter의 학습 과정

위 그림은 Convolution 필터가 학습되는 과정을 표현 그림입니다. Convolution의 필터는 FCN의 가중치와 마찬가지로 학습 가능한 가중치들로 구성됩니다. 이러한 필터 가중치들을 위 그림에서는 0으로 초기화해 준 모습입니다. 이후 Loss를 줄이는 방향으로 학습되어 위 그림에서는 0 모양의 필터가 완성된 모습을 볼 수 있습니다.

3-5-2. Convolution 필터 학습하기

이렇게 강아지와 고양이를 구분하는 Convolution 필터가 학습되는 과정을 자세히 살펴보겠습니다. 먼저 Convolution 필터를 학습 가능한 가중치로 채워주겠습니다.

convolution 사칙 연산 계산 상자 구성
그림38. convolution 사칙 연산 계산 상자 구성

그리고 Convolution 필터의 모든 학습 가능한 가중치를 0으로 초기화하겠습니다.

convolution 가중치 초기화
그림39. convolution 가중치 초기화

이 상태로 연산하면 입력 이미지와 상관없이 강아지와 고양이의 최종 예측값이 0으로 나올 겁니다. 모든 가중치가 0이니까요. 그 결과 Softmax 출력값은 각각 1/2로 동일하게 나올 것입니다.

convolution 가중치 초기화된 계산 결과
그림40. convolution 가중치 초기화된 계산 결과

이 말은 아직은 강아지와 고양이를 구분할 수 없는 상태임을 의미합니다. 이제 오차를 줄이는 방향으로 학습 가능한 가중치들을 변경해 보겠습니다. 강아지 이미지 입력에 대해 어떤 필터는 강아지 모습과 관련 있는 모양의 필터 모습으로 점점 변할 겁니다. 또한 동시에 이 필터와 연결된 강아지 예측값으로 연결되는 FCN 가중치들도 같이 커지는 방향으로 업데이트될 것입니다.

convolution 강아지 입력에 대한 가중치 업데이트
그림41. convolution 강아지 입력에 대한 가중치 업데이트

반대로 고양이 이미지 입력에 대해 어떤 필터는 고양이 모습과 관련 있는 모양의 필터 모습으로 점점 변해갈 겁니다. 또한 동시에 이 필터와 연결된 고양이 예측값으로 연결되는 FCN 가중치들도 같이 커지는 방향으로 업데이트되겠죠.

convolution 고양이 입력에 대한 가중치 업데이트
그림42. convolution 고양이 입력에 대한 가중치 업데이트

최종적으로 어떤 필터는 강아지 관련된 모양의 필터로, 어떤 필터는 고양이 관련된 모양의 필터로 변하여 학습이 완료될 것입니다.

convolution 최종 가중치 업데이트
그림42. convolution 최종 가중치 업데이트

5. 마무리

지금까지 Convolutional Neural Network의 Translation Invariance 성질에 대해 살펴봤습니다.

Convolutional Neural Network이 왜 Translation Invariant 한지 이해하기 위해 FCN으로 이미지 분류를 시도해 봤습니다. 이 과정에서 FCN은 정보를 1열로 펼치는 과정에서 필연적으로 위치에 따라 정보를 판단할 수밖에 없음을 확인했습니다. 이를 해결하기 위해 두 가지 핵심 연산을 도입했습니다.

첫 번째는 필터를 사용한 유사도 측정 연산입니다. 이를 통해 채널별로 특정 필터와 관련된 정보를 구성할 수 있었죠. 이러한 연산 방법을 Convolution이라고 했습니다.

두 번째는 대푯값을 추출하는 연산입니다. Convolution 연산 결과는 ‘맵(map)’ 형태로 나오게 됩니다. 이는 큰 틀에서 보면 이미지와 동일한 형태이죠. 따라서 최종적으로 1열로 펼쳐지는 과정에서 동일하게 위치 의존성을 보존하게 됩니다. 이러한 문제를 해결하기 위해 ‘맵’ 형태를 ‘값’ 형태로 바꾸기 위해 도입한 방법이 대푯값 추출이었습니다. 이러한 연산 방법을 Pooling이라고 했습니다.

이 두 연산은 Convolutional Neural Network을 구성하는 대표적인 연산입니다. 이번 글에서는 FCN을 사용한 이미지 분류 방식의 문제점을 통한 Convolutional Neural Network의 이해에 초점을 맞췄습니다. 큰 흐름을 이해하기 위해 주요 연산 방법에 대해 깊이 들어가지는 않았습니다.

다음 글에서는 Convolution과 Pooling 연산을 조금 더 자세히 살펴보겠습니다.

Series Navigation<< Chain RuleConvolutional Neural Network : 연산 방법 >>
0 0 votes
Article Rating
Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
newbie
newbie
6 months ago

fcn으로 이미지를 구분하는 것의 한계점과, 이를 보완하기 위해 convolution과 pooling 레이어를 도입하는 과정을 이해하기 쉽게 설명해주셨습니다! 도움 많이 되었습니다 감사합니다.

2
0
Would love your thoughts, please comment.x
()
x
Scroll to Top