7. CNN(Convolutional Neural Network)
*본 게시물은 22-1학기 연세대학교 일반대학원 딥러닝을이용한비정형데이터분석(이상엽 교수님) 수업 내용을 정리한 것입니다.
드디어 CNN입니다.
(개인적으로는 딥러닝을 CNN을 통해 입문했기에 옛 생각이(?) 많이 나는 알고리즘이기도 합니다 ㅎ_ㅎ...)
1. 이미지 처리에서의 FFNN 한계와 CNN
앞 FFNN에서 확인했듯이 사실 이미지를 단순 FNN으로 처리하기는 매우 힘듭니다. 가래떡 뽑듯이 하나로 뽑는 과정에서부터 공간 정보 손실과 과도한 파라미터 수의 증가가 일어나기 때문입니다.
가래떡이라고 했지만 실은^^;; 그림처럼 이미지를 여러 줄로 자른 후 1차원 배열로 나타내는 것을 뜻합니다. 딱 봐도 알 수 있듯이 이미지가 무엇을 나타내는 지에 대한 정보, 즉 이웃 픽셀들과의 공간 정보(spatial information)가 상실됩니다.
또한 요즘 이미지들은 화소 수가 너무 좋습니다. 당장 4000*6000*3의 화소 수라고 하면 7천 2백만개의 feature를 FFNN이 입력으로 받아야하는데... 이렇게 된다면 파라미터가 지나치게 많습니다ㅠㅠ. 파라미터가 많아지면 다음과 같은 문제가 생긴다고 배웠었습니다.
1. 모형이 복잡해지기 때문에 과적합 발생 2. 연산 시간이 오래걸림 3. 학습이 잘 되지 않아 모형의 성능이 저하됨 |
이에 따라 이미지 분류에는 CNN이 많이 쓰입니다. 일단 1. 데이터가 가진 공간 정보(spatial information) 추출에 유리하고, 2. 파라미터 수가 줄어들기 때문입니다. 이외에 오디오 처리에도 CNN이 많이 쓰이는데, 이는 웨이브 형태의 오디오를 푸리에 변환을 거쳐 이미지와 비슷한 형태로 생성하기 때문이라고 합니다.
2. 이미지 특징과 CNN 기초개념
1) 이미지 특징
앞서 이미지는 m*n 픽셀과 채널을 가진다고 배웠었습니다. 컬러의 경우 채널(depth)은 3, 흑백은 1입니다.
이에따라 보통 컬러 이미지는 3차원 array로 저장되고, 흑백 이미지는 2차원 array로 저장이 됩니다(m*n이니께요)
2) 필터(filter)
이미지로부터 정보를 추출하려면 필터 filter가 필요합니다. 필터는 정사각형이며, 적용하려는 이미지의 depth 수를 따라갑니다.
따라서 F*F 크기의 필터가 있을 때, 흑백 이미지에 적용되면 F*F*1, 컬러 이미지에 적용되면 F*F*3 크기가 됩니다.
필터는 또 각 셀마다 고유한 가중치(파라미터)를 가지는데, 가중치 수는 필터 크기와 마찬가지로 F*F*1, F*F*3가 됩니다.
3) 필터의 작동 원리
(1) 흑백 이미지의 필터 적용
필터를 흑백 이미지에 적용해보겠습니다. 흑백 이미지는 5*5이고, 필터 크기는 3*3이며 depth는 각각 1입니다. 이 때 필터는 한 칸 씩 움직이는 것으로 가정합니다.
필터가 이미지를 모두 훑기까지는 총 9번이 필요합니다. 필터가 이미지를 훑을 때, 필터의 가중치와 이미지 색상 정보의 내적 연산이 일어나는데, 이 내적 연산이 바로 합성곱(convolution)입니다. 필터가 이미지에 한번 적용되어 합성곱 연산을 마치면 단 하나의 스칼라값(숫자)이 나옵니다. 이 스칼라 값에 필터 한개 당 존재하는 1개의 편향 값을 더하고, 활성화 함수(보통 ReLU를 씁니다)를 거치면 정보 추출이 완료됩니다.
필터가 이미지를 9번 훑었으므로 새로 얻게된 결과(합성곱+편향->활성화함수)는 9개인데, 이 새로 얻은 결과를 activation map이라 부릅니다. activation map은 새로운 이미지로 간주되어 또다르 필터 적용과 합성곱이 가능하며, 정사각형만 존재하는 CNN 특성에 따라 activation map은 3*3임을 유추할 수 있습니다. 참, activation map의 depth는 적용된 필터의 개수로 정해집니다. 이 예시 같은 경우는 필터가 1개만 적용되었기에 depth는 1입니다.
이처럼 필터를 사용해서 합성곱을 하면 파라미터 수가 작아집니다. 지금만 하더라도 매 합성곱을 수행해도 9개의 파라미터밖에 나오지 않습니다. FFNN일 경우 기본 25개를 입력 노드에 전제해야하는 것에 비하면 매우 적은 숫자입니다.
(2) 컬러 이미지에 필터 적용
32*32의 컬러이미지를 가정합니다. 컬러기 때문에 이미지의 depth는 3이 되어 결론적으로는 32*32*3의 이미지를 다루게 됩니다.
필터 역시 이미지와 depth가 동일해야 하기 때문에 F*F*3이 되는데, 여기서는 F를 5라 가정합니다. 이에 따라 필터는 5*5*3이 되고, 필터가 이미지에 한번 적용될 때 75번(5*5*3)의 합성곱이 일어나게 됩니다. 위와 동일하게 내적된 값은 스칼라(그림의 보라색 원)로 도출이 되며, 여기에 편향을 더한 후 활성화 함수에 넣어 activation map을 얻을 수 있습니다.
activation map 크기를 미리 살펴보면(밑에 나옵니다) ((32 - 5)/1) + 1 이므로 28*28*1(필터 갯수는 1)의 activation map이 도출됩니다.
(3) 복수개의 필터 적용
위 예시들은 모두 필터를 1개 적용했을 때의 이야기입니다. 그리고 당연히 2개 이상의 필터 역시 적용 가능합니다. 단, 복수개 필터는 가로, 세로가 같되 가중치는 서로 달라야 합니다. 즉 사이즈는 같지만 서로 파라미터를 공유하지 않는 필터들이어야 합니다.
가령 흑백이미지에 3*3 크기의 필터 A, B, C를 적용할 경우 한 필터당 파라미터 개수는 (3*3)+1(편향)=10 이되어 총 30개의 파라미터가 존재합니다.( 만일 컬러 이미지에 5*5*3 크기 필터를 2개 사용할 경우? 파라미터 값은 (5*5*3*2)+2 이므로 152개가 됩니당.)
이 때 activation map은 합쳐서 depth를 하나로 만들지 않고^^; 여러겹으로 겹쳐서 A를 적용한 activation map, B를 적용한 activation map...이 따로 나와 총 depth는 3이 됩니다. 즉 이미지에 적용한 필터 개수가 k라면, activation map의 depth도 k가 나옵니다.
이처럼 필터와 이미지의 depth는 상호작용을 합니다. 1. 필터를 적용할 때에는 적용하고자 하는 이미지의 depth에 맞춰야 하고,
2. activation map의 depth 사용한 필터 개수에 따라 맞추어집니다.
위 그림과 같이 32*32*3 이미지에 적용할 필터의 depth는 이미지랑 동등한 3입니다.
여기에 5*5*3인 필터 6개를 적용하면, 다음 activation map은 depth가 6인 28*28*6이 나옵니다.
(4) 필터 적용의 효과???
필터를 여러번 적용하는 이유는 이미지의 색상 정보 중 정답(종속변수)을 맞추는데 필요한 정보를 더 잘 추출하기 위해서입니다. 아래 그림과 같이 필터를 적용하면 할수록 정답을 맞추는데 필요한 정보들이 드러나게 됩니다.
4) CNN 용어
(1) 스트라이드 Stride
스트라이드는 필터를 한번에 몇 칸 움직일지를 설정하는 하이퍼파라미터입니다. 예전에는 다양한 스트라이드가 쓰였으나, 요즘에는 1이 기본이라고 합니다. 스트라이드가 커질수록 추출하는 정보가 적어 학습하는 속도는 빨라지는 대신 액티베이션 맵은 작아집니다. 핉터가 몇 번 안움직이니 당연하겠죠.
(2) activation map 계산 공식
CNN에 입력되는 이미지는 정사각형을 전제로 합니다. 직사각형 이미지가 있다면 정사각형으로 만들어주어야 합니다^^;
이렇게 입력된 이미지를 N*N 크기라 가정합니다(계산 시 채널은 고려하지 않습니다) 여기에 F*F크기의 필터를 적용하면 나올 activation map의 크기는 다음 공식을 따릅니다.
((N - F) / Stride +1 |
즉 아까 5*5 이미지에 3*3 필터를 스트라이드 1을 적용하였을 때 나오는 activation map은 ((5 - 3) / 1) + 1 이므로 3*3이 됐었습니다.
(3) 패딩 Padding
하지만 때때로 (2)가 딱 떨어지지 않는 경우가 존재합니다.
만일 7*7 이미지에 3*3 필터를 스트라이드 3으로 적용하게 될 경우 ((7 - 3)/3) +1 = 2.3333이 됩니다. 이럴 경우 필터가 제대로 적용되지 않는 부분이 발생하게 되어 정보 손실이 발생하게 됩니다. 이를 방지하고자 패딩Padding을 적용합니다. 보통 패딩은 zero padding이라 하여 모서리를 0으로 감싸게 됩니다. 이렇게 패딩을 적용하여 7*7 이미지를 9*9로 만들게 될 경우, (9 - 3)/3 +1이 되어 3*3의 activation map을 얻을 수 있습니다. 또한 기존에 한번밖에 볼 수 없었던 테두리 부분 정보를 패딩을 사용하면 여러번 볼 수 있다는 점에서도 장점이 있습니다.
Keras에서는 padding을 valid, same 파라미터를 통해 조절할 수 있습니다. valid는 패딩을 적용하지 않고 그대로 하는 것, same은 패딩 후 나오는 결과물을 입력 이미지/activation map과 동일하게 하는 파라미터입니다.
(4) 풀링 Pooling
풀링Pooling은 보통 이미지에 필터를 적용하여 합성곱을 한 후 적용하는 방법입니다. 풀링을 적용하게 될 경우 activation map에 존재하는 정보 중, 이미지를 가장 잘 나타내는 일부 정보만을 추출해서, 중요 정보를 보존한 채 데이터 수를 줄이는 downsampling 효과를 얻을 수 있습니다.
풀링 종류에는 필터가 적용되는 값 중 가장 큰 값을 추출하는 Max pooling, 평균값을 추출하는 average pooling이 있는데, 이 두 방법은 데이터셋의 특성에 따라 취사선택을 할 수 있습니다. 풀링을 할 때에는 별도의 필터를 또 사용하나, 이 필터에는 가중치가 없습니다.
i) Max Pooling
activation map에 풀링 필터를 적용했을 때, 가장 큰 값만을 뽑는 풀링 방법입니다. '큰 값'이라는 것은 이미지를 잘 나타내는 특성이라는 아이디어를 바탕으로 합니다. 흑백 이미지에서 숫자가 크면(255에 가까우면) 흰색, 컬러 이미지에서는 밝은색을 의미합니다. 즉, 숫자가 클수록 이미지의 주요 특성이라고 할 수 있습니다. MNIST같이 배경은 어둡고, 관심 대상만 밝은 데이터셋에 유용합니다.
4*4 activation map에 2*2 풀링필터를 적용한 것입니다. 이때 스트라이드는 풀링 필터와 똑같이 2로 잡습니다. 풀링 필터 적용 후에는 activation map이 2*2로 사이즈가 줄어든 것을 확인할 수 있습니다.
ii) average pooling
activation map에 풀링 필터를 적용했을 때, 나오는 값들을 평균하는 풀링 방법입니다. 평균을 내게 될 경우 이미지를 부드럽게 만드는 smoothing 효과를 낼 수 있습니다. 이에 따라 sharp feature는 잘 드러나지 않게 됩니다.
마찬가지로 4*4 activation map에 2*2 풀링필터, 스트라이드 2를 적용하여 평균을 낸 것입니다.
iii) min pooling: max pooling과 반대입니다. 작은 값을 추출하여 이미지를 어둡게 만듭니다.
iv) global pooling
activation map의 각 채널별로 값을 하나 추출하는 풀링 방법입니다. 채널별로 값을 뽑기 때문에 depth가 유지되는 것이 특징입니다. 위의 방법과 혼합하여 사용할 수 있습니다. Global max pooling은 채널별로 가장 큰 값, global average pooling은 채널의 평균값을 사용합니다.
3. CNN의 작동 원리
CNN은 보편적으로 다음 그림과 같은 절차를 거칩니다.
먼저 INPUT 이미지가 들어옵니다.
이미지가 들어오면 필터를 적용해 CONVOLUTION+RELU를 거쳐 activation map을 만들고
여기에 POOLING을 적용합니다.
이후 또다시 CONVOLUTION+RELU를 거쳐 activation map을 생성하고
여기에 POOLING을 적용해서..... feature learning을 진행하다가 classification 단계로 이동합니다.
이때 최종 3차원의 activation map을 가래떡 뽑듯이 1차원으로 바꾸는 FLATTEN과정이 필요합니다. 이는 FULLY CONNECTED 층이 1차원이기 때문입니다.
분류 문제이므로 출력 노드의 수는 종속변수(라벨) 개수와 일치합니다. 또한 출력노드에서는 종속 변수의 확률, 즉 특정 라벨일 확률을 리턴해야하므로 softmax를 활성화함수로 취합니다. softmax로 계산되기 전의 가중치 상태는 분류의 비용함수인 Cross Entropy를 최소화하는 최적 가중치들입니다.