CNN(convolution neural network)
CNN(Convolutional Neural Network)
이제 마지막 인공지능 기초 단원인 CNN 즉 Convolutional Neural Network에 대해 알아 보도록 하겠습니다.
왜 이게 마지막이냐면;;
저는 자연어 처리도 공부하며 프로젝트도 해보고 컴퓨터 비전 분야도 공부하며 프로젝트를 해봤습니다.
그리고 결국 대학원을 어디 분야로 갈지 결정 해야 하는 상황에 놓였고 오랜 기간 신중하게 고민한 결과 컴퓨터 비전 분야로 대학원을 가기로 결정 했기 때문에 RNN은 다루지 않고 CNN 까지만 다루도록 하겠습니다. 그리고 CNN은 자연어 처리 분야에서도 사용을 하긴 하지만 컴퓨터 비전 분야에서 더 자세하고 많이 다루기 때문 입니다.
그럼 본격적으로 CNN에 대해 설명을 하겠습니다.
CNN이란 합성 곱 신경망이라고 부르며 합성곱 층(Convolution Layer)와 풀링 층(Pooling layer)로 구성된 신경망 입니다.
위의 그림과 같이 합성곱 층과 풀링 층으로 이루어져 있으며 그 사이 사이에 활성 함수로 ReLu함수를 넣어 만든 신경망 입니다.
해당 신경망의 작동원리는 간단 합니다.
합성곱 층에서 합성 곱 연산을 한 뒤 ReLU함수를 지난 뒤 풀링 연산을 지나고 다시 합성곱 층으로 가는 방식의 연산이 이루어지는 신경망 입니다.
그럼 왜 이 신경망이 컴퓨터 비전 분야에서 많이 사용하는 신경망이고 효과가 좋은지 알아보도록 합시다.
먼저 위의 그림을 봐보도록 합시다.
여러분들이 보기에는 그냥 필기체만 다른 y 혹은 대문자 Y와 소문자 y로만 보일 것 입니다.
왜 여러분들은 그 생각을 하게 되었고 이 글자가 y라는 알파벳 글자라고 생각을 하셨나요. 그것은 바로 알파벳 y만의 특징이 잘 드러나 있는 글자이기 때문 입니다.
하지만 컴퓨터는 어떻게 인식을 할까요?
전혀 다른 글자로 인식을 할 것 입니다.
왜냐하면 컴퓨터에 이미지를 넣어 비교하라고 하면 이미지의 픽셀에 있는 벡터 값을 비교를 할 것이고 해당 글자는 검정색으로 색칠이 되어 있는 픽셀 위치가 다르며 같은 위치에서의 벡터 값을 비교 하였을 때 전혀 다른 벡터 값이 비교되기 때문 입니다.
그럼 해당 2차원 행렬을 가진 그림을 1차원 벡터로 표현을 해보도록 하겠습니다.
위의 그림은 2차원 행렬에서 1차원 벡터로 y그림이 그려진 이미지를 변환한 것 입니다.
하지만 중요한 것은 이렇게 변환하게 된다면 이 그림을 보는 우리들도 해당 그림이 y자인 것을 모릅니다.
왜냐하면 2차원 행렬에서 1차원 벡터로 변환을 하면서 공간적인 구조 특징이 사라 졌기 때문 입니다.
여기서 공간적인 구조에 대해 좀 더 알아보도록 하겠습니다.
공간적인 구조란 각 픽셀 간에 거리에 따른 정보, 특정 위치의 픽셀들끼리의 벡터 값은 전혀 다르거나 굉장히 유사한 특징 등을 포함하고 있습니다.
이런 문제를 해결하기 위해서 우리는 기존의 DNN(심층 신경망)이 아니라 CNN 즉 합성곱 신경망이 필요하게 된 것 입니다.
채널(Channel)
컴퓨터는 글자나 이미지보다는 숫자 즉 Tensor를 훨씬 더 잘 처리 합니다.
그럼 우리가 인공지능 기초를 처음 다룰 때 배웠던 이미지를 통해 Tensor의 구조를 한번 더 살펴 보도록 합시다.
이미지는 높이, 넓이, 채널 이렇게 3차원의 형태를 가지고 있는 Tensor 입니다.
여기서 높이는 세로, 넓이는 가로 인 것을 여러분들은 아실 겁니다.
그럼 채널은 뭘까요?
채널은 색의 성분을 의미 합니다.
흑백은 채널수가 1 컬러는 RGB 색의 조화로 이루어지기 때문에 3입니다.
그럼 해당 이미지는 28 X 28 X 1의 3차원 텐서로 표현이 가능 합니다.
위의 그림과 같이 컬러 이미지는 Red, Green, Blue 이렇게 색의 3원색의 조화로 컬러가 만들어 집니다 그래서 흑백은 채널 값이 1 컬러는 채널 값이 3이 됩니다.
또한 Channel은 깊이(depth)라고도 불립니다.
합성곱 연산(Convolution operation)
이번에는 합성곱 연산에 대해 알아보도록 합시다.
합성곱 연산은 합성곱층(Convolution layer)에서 이루어지는 연산으로 이미지의 특징(feature)을 추출 하는 역할을 하게 됩니다.
우리는 Kernel 혹은 Filter라고 불리는 높이x넓이(height x width)로 이루어진 2차원 텐서를 통해 전체 이미지 픽셀 중에서 일부 픽셀을 추출을 할 수 있습니다.
그럼 아래의 이미지를 통해 더 쉽게 이해 해보도록 합시다.
해당 커널은 3x3 커널이며 커널의 시작 위치는 이미지의 첫 번째 픽셀에서 시작을 합니다.
그리고 해당 이미지 픽셀의 특성 추출을 하는 방법은 (원본 이미지의 픽셀 값) x (커널 이미지의 픽셀 값)들의 합을 통해 특성을 추출해서 저장해둡니다.
그리고 2번째는 1칸 이동해서 다른 칸으로 이동하여 1번째 스텝과 똑같이 계산을 하여 특성을 추출 합니다. 이렇게 총 9번을 이동을 하며 특성을 추출한 뒤 2차원 텐서에 특성 값들을 저장합니다.
그리고 특성 값들을 저장해 놓은 2차원 텐서를 특성 맵(Feature map)이라고 합니다.
합성곱 연산에서 벡터 값의 특성을 추출할 때 아래의 그림과 같이 1칸씩 이동하며 벡터 값들을 추출하는 모습을 볼 수 있습니다.
이렇게 한 칸씩 이동하는 것을 스트라이드(stride)라고 하며, 이 값은 사용자가 직접 조절 할 수 있는 하이퍼 파라미터 값으로 보통은 1칸씩 혹은 2칸씩 이동합니다.
위의 gif와 같이 옆으로 몇 칸씩 이동 할 것인지 사용자께서 정할 수 있습니다.
그리고 이렇게 kernel이 이동하는 것을 stride라고 합니다.
패딩(Padding)
이번에는 패딩에 대해 알아 보도록 하겠습니다.
우리는 5x5 이미지에서 3x3 필터를 이용해 stride를 1로 설정하여 1칸씩 이동하며 3x3 크기의 특성 맵(feature map)을 얻었습니다.
그런데 여기서 문제가 생깁니다.
분명히 우리가 넣은 데이터 이미지의 크기는 5x5 였는데 특성을 추출해서 특성 맵에 저장하고 보니.. 3x3크기로 작아져 버렸습니다.
그리고 합성 곱 층을 지나면 지날 수록 이미지 특성 맵은 더욱 더 작아질 것이고 1x1크기로 될 것 입니다.
이럴 때 우리가 추출한 특성 맵의 크기를 원래 기존의 이미지 원본의 크기와 동일하게 맞추기 위해 사용하는 것이 바로 패딩(Padding)입니다.
위는 zero padding의 예시인데요.
제로 패딩이란 특성 맵을 이미지 원본의 크기와 동일하게 크기를 맞추는 패딩 작업을 할 때 0으로 채워 넣어 이미지 원본의 크기와 동일하게 크기를 맞추는 것을 의미합니다.
그럼 위의 그림을 통해 알아보도록 합시다.
위의 특성 맵은 5x5크기이고 이미지 원본의 크기는 7x7입니다.
그리고 이미지 원본의 크기와 특성 맵의 크기를 동일하게 만들기 위해서 패딩을 하는데, 이때 특성 맵 주변에 0으로 채워 넣어 7x7 크기를 만든 것을 확인 할 수 있습니다.
이를 패딩이라고 하며 패딩은 제로 패딩(zero padding), 정수 패딩 이렇게 두 가지가 있습니다. 정수 패딩도 제로 패딩과 방식은 똑같지만 0 대신 정수로 채워 놓는 방식입니다.
하지만 정수 패딩을 하게 된다면 패딩을 하기 위해 사용 된 정수가 의미가 있는 줄 알고 기계는 착각해서 학습을 할 수 있기 때문에 특수한 경우를 제외하고는 거의 대부분 제로 패딩만 합니다.
CNN에서의 Weight와 bias
이번에는 CNN에서의 weight와 bias에 대해 알아보도록 하겠습니다.
왜냐하면 기존의 DNN의 weight와 bias가 CNN의 weight와 bias가 살짝 다르기 때문 입니다.
기존의 DNN연산 과정
만약 3 x 3이미지를 DNN에 넣어 연산을 한다 하면은 2차원 텐서를 1차원 텐서로 변형 시킨 뒤 위와 같이 연산이 이루어지며 총 weight는 9 x 4의 weight와 bias를 가지게 될 것 입니다.
하지만 CNN에서 합성 곱을 진행 할 때는 위의 그림처럼 2차원 텐서를 1차원 텐서로 바꾼 뒤 연산을 진행 하는 것이 아닌 2차원 텐서에서 filter를 통해 특성을 추출하여 연산을 진행 합니다.
그리고 CNN에서 연산을 할 때는 우리가 특성을 추출하는 filter가 바로 weight를 의미하며 filter의 크기가 바로 weight의 개수 입니다.
위의 그림에서는 2x2크기의 filter이기 때문에 총 4개의 weight를 가지고 특성을 추출 해 연산을 하는 셈 입니다.
그럼 bias는 어떨까요?
bias는 우리가 filter를 통해 추출한 특성맵에 1x1크기의 편향을 더 하면 최종적인 특성 맵이 완성이 됩니다. 연산은 위의 그림 처럼 아주 간단합니다. 모든 위치의 원소에 편향의 크기만큼만 더해주면 끝입니다.
2개 이상의 채널을 가진 경우의 합성곱 연산
우리는 흑백은 1채널, 컬러는 RGB이기 때문에 3채널 이렇게 채널이 구성이 된다고 알고 있습니다.
그럼 컬러 이미지를 기준으로 여러 개의 채널일 때 어떻게 연산이 되는지 알아보도록 합시다.
위의 사진은 컬러 이미지가 어떻게 합성곱 연산이 이루어지는지 나타내는 그림입니다.
각 채널에서 각각 다른 3개의 데이터, 3개의 filt filter를 통해 합성 곱을 한 뒤 각각의 특성 맵을 추출 한 뒤 각 특성 맵을 더해주면 최종적인 3채널의 특성 맵이 완성이 됩니다.
풀링(Pooling)
마지막은 풀링입니다.
우리가 CNN의 구조는 Convolution layer+pooling layer로 이루어져 있으며 Convolution layer는 합성 곱 연산을 pooling layer는 pooling 연산을 한다고 앞에서 다루었습니다.
그럼 Pooling layer에서 Pooling 연산이 어떻게 이루어지는지 한번 알아보도록 하겠습니다.
먼저 풀링의 종류는 총 2개가 있습니다. max pooling과 average pooling 입니다.
먼저 max pooling에 대해 알아보도록 하겠습니다.
위의 그림이 맥스 풀링 입니다.
그런데 많이 익숙하지 않으신가요? 바로 Convolution layer에서 이루어지는 합성 곱 연산과 굉장히 유사 하기 때문입니다.
pooling 연산에서도 똑같이 filter와 stride개념을 사용하기 때문 입니다.
맥스 풀링 연산에서는 합성 곱 연산을 통해 나온 특성 맵에 filter를 적용시켜 해당 filter내에서 가장 큰 원소를 추출하는 방식으로 연산이 됩니다.
그리고 평균 풀링 연산은 해당 필터 내에서 원소들의 평균 값을 추출 해 내는 연산이 이루어 집니다.
풀링 연산과 합성곱 연산은 매우 유사하지만 이 둘의 차이점은 연산의 방식이 다르고 weight와 bias가 관여 하지 않는 것 입니다.
합성곱 연산 같은 경우 filter가 weight역할을 하지만 풀링 연산은 weight가 없으며 특성 맵에서 풀링 연산을 해주기 위한 정말 거름망 역할만 할 뿐 입니다.
CNN의 개념은 이제 모두 끝 입니다. 다음은 CNN을 이용한 MNIST 데이터 셋 분류 및 cifar 10 데이터 셋 분류로 찾아 오도록 하겠습니다.
댓글남기기