Convolutional Neural Networks
CNN
여태 많이 들어봤던 CNN. Convolution이란 합성곱 연산을 말한다.
뭐, 수학적으로 뭔가 어려운 연산인 것 같다. 포인트는 함수가 주어졌을 때, 목적에 따라 다른 함수를 통해 분해, 변환, 필터링을 한다는 것이다. ai에서는 주로 이미지를 변환하고 처리하는데 쓰이는 연산을 convolution이라 이름 짓고 쓴다.
I는 이미지, K는 우리가 쓰는 필터가 된다. 이렇게 보면 잘 이해가 되지 않지만..
이렇게 보면 이해가 쉬울 듯하다. 원래 7,7이던 이미지를 3,3필터로 도장 찍듯이 쾅쾅 찍어서 한번에 찍힌 값을 하나의 픽셀로 만든 꼴이다. 결과적으로 7,7 이미지에 3,3필터를 5,5(25)번을 찍어서 결과물을 낸 것이다.
이것은 어떤 의미인가? 우리가 적용하고자 하는 필터에 따라 우리는 말그대로 필터 효과를 낼 수 있다. 필터의 각 자리에 가중치를 다르게 두어서 사진을 흐리게 만들거나, 선명하게 하는 등의 효과를 줄 수 있다는 것.
흑백 이미지는 채널이 하나라고 친다. 그런데 색깔이 있는 이미지는 RGB로 색을 표현하기에 이를 채널이 3개가 있는 것이라고 볼 수 있다. 컬러 사진은 사실 R,G,B의 각각의 색깔로 그려진 그림 3장을 겹쳐서 표현한 것이라고 말할 수 있다는 것이다. 이때 우리가 convolution을 할 때, 필터는 해당 채널의 크기에 맞춰져 있다. 위의 예시의 이미지가 만약 컬러 사진이었다면, 당장 찍고 있는 3,3필터 역시 채널이 3인 상태라는 것이다. 그러니 7,7,3(이 3이 RGB라고 생각하라)이미지에 3,3,3필터를 찍어 결과적으로 5,5,1의 출력을 낸 것이라 보면 된다.
그렇다면 어떻게 출력의 채널을 늘릴까? 필터의 갯수를 늘리면 된다. 달리 말해 합성곱을 더 많이 하는 것. 필터를 두 개를 겹쳐서 쓴다면 결과는 5,5,2가 될 것이다.
이 연산을 위해 필요한 파라미터 숫자는 일단 3,3에 입력 채널에 깊이를 맞춰 3을 더 곱한 후에 그러한 필터가 2개이기 때문에 $3 \times 3 \times 3 \times 2 = 54$가 될 것이다.
CNN의 각 층은 대충 3가지의 층으로 분류된다. convolution연산을 하는 층과 이후에 pooling하는 층, 그리고 마지막에 출력을 할 때 사용하는 fully connected layer가 있다.
최근에는 파라미터의 숫자를 줄이기 위해 fc가 없어지는 추세이다. 왜냐하면 파라미터가 많을수록 연산의 속도도 느려지고 성능도 안 좋아지기 때문이다. 그래서 점차 깊이는 깊어지면서 파라미터 수를 줄이는 방향으로 CNN은 발전하고 있다.
개념
stride & padding
stride는 스텝 사이즈를 말한다. 도장을 찍을 때 한 칸씩 이동하면서 찍을 수도 있겠지만, 두 칸씩 이동하면서 찍는 것도 가능할 것이다.
padding은 가장자리에 위치한 값에도 도장의 중심을 찍기 위해 가장자리 옆에 종이를 덧대주는 행위이다. 일반적으로 0을 그 자리에 채워넣기 때문에 zeropadding이라고 부른다.
stride가 1이면 보폭이 말그대로 1이기 때문에 한 칸씩 이동하는 것. 패딩을 넣어서 도장의 중앙이 가장자리에도 위치하게 되는 것을 확인할 수 있다.
1, 1 convolution
출력을 위해 여태 연산한 값들을 쫙 펴주는 층을 dense layer라고 부르는데, 지금 보듯이 파라미터 량이 엄청 뛰게 된다. 이게 위에서 말한 fc에서 일어나는 일인데, 이래 점차 fc가 줄어드는 추세인 것이다.
그리고 이러한 것을 해결하기 위해 나오는 것이 바로 1,1 합성곱 필터이다. 이러한 필터를 넣으면 입력 차원의 깊이는 줄이면서 크기 자체는 동일한 값을 도출할 수 있다. dense 층의 깊이와 대조적으로 획기적으로 깊이를 줄일 수 있기 때문에 '전체 모델의 깊이'는 깊어지지만 결과적으로 파라미터의 수는 줄어드는 결과가 나온다.