본문 바로가기
코딩/데이터 분석 이론 & 응용

[7] Deep Learning - CNN

반응형

[7] Deep Learning - CNN

 

 

Neural Network

 

Neural Network는 지도 학습으로 괜찮았지만, 90년대 이후 한계에 도달했다. 실제로 복잡한 문제를 해결하고자 할 때, 잘 해결하지 못했기 때문이다. Neural Network의 universal approximation theorem은 뉴럴의 개수가 많고 layer의 개수가 많으면 어떠한 function이던 approximation이 가능하다는 이론이다. 이론에 따르면 아무리 시간이 오래 걸리더라도 문제를 풀 수는 있어야 한다. 그런데 그렇지 않았다. weight와 bias가 제대로 학습되지 않거나 발산했기 때문에 deep 한 layer와 많은 수의 뉴럴로도 풀지 못하는 문제가 존재했다. 

 

 

이러한 이유에 대해서 원인을 찾아보니 표본 데이터가 부족하다는 결론이 나왔다. 즉 90년대에 Neural Network를 사용할 때는 모델을 학습할 충분한 데이터의 수가 적었다는 것이다. 또한 Neural Network의 경우 계산을 상당히 많이 해야 하는데 이에 따라 Time 문제와 Cost 문제에 직면하게 되었다.

 

 

이러한 두가지 문제는 시간이 지나면서 자연스럽게 해결되었다. 더 좋은 성능의 GPU들이 등장하였고 , 표본 데이터들도 과거에 비해 훨씬 많아졌다. 이 두 가지 문제를 해결해도 아직 문제가 있었는데 바로 activation function에 대한 문제다. sigmoid activation function을 사용한 Neural Network에 Error backpropagation을 적용해보니 Input layer에 까지 도달하였을 때 경사가 남아있지 않다는 문제가 존재했다. 그래서 새로운 activation function인 ReLU가 등장하게 된다.

 

 

이외에도 과거에는 첫 weight와 bias들을 정하는 방법으로 random initialization을 사용했다. 하지만 첫 weight와 bias에 따라 학습이 될 수도 , 되지 않을 수도 있다는 사실이 밝혀지면서 initialization에 대한 다양한 방법들도 등장했다. 다양한 방법들 중 대표적으로 Xavier initialization method을 통해 이러한 문제를 해결했다. 위의 다양한 문제들을 해결하면서 Neural Network는 보다 안정적인 학습 상황을 만들 수 있었다.

 

 

 

ReLU (activation function)

 

 

 

 

ReLU는 새로운 activation function 이다. 이전에는 activation function으로 sigmoid activation function을 사용했다. sigmoid activation function은 0이나 1에 가까이 갈 뿐 , 그 값이 되지 않기 때문에 발산이 안된다는 장점이 있었고 , 이 때문에 사용하였다. 하지만 입력값이 커지거나 작아질 때 기울기가 0에 가까워진다는 문제가 존재했다. 이를 Vanishing Gradient , 기울기 소멸 문제라고 한다.

 

 

chain rule에 따라 이러한 기울기가 누적이 될텐데 이러한 문제가 있는 상태에서 Error backpropagation을 하니 영향이 다 사라진다는 것이다. 그래서 복잡한 문제를 위한 deep 한 layer에서는 sigmoid activation function이 아닌 다른 activation function을 사용해야 한다 .

 

 

 

 

 

 

ReLU는 위의 그림과 같은 형태를 띈다. 0보다 입력이 작으면 0이고 , 0보다 크면 0보다 큰 값이 나온다. sigmoid activation function 대신에 ReLU activation function을 사용한 결과 Cost function값에서도 변화가 있었다. 기존의 sigmoid activation function을 사용했을 때는 에러가 앞쪽까지 전파되지 않아 학습에 실패했다면 ReLU를 사용했을 때는 에러가 앞쪽까지 전파되었고, 이를 통해 올바르게 학습할 수 있었다. 새로운 ReLU activation function의 등장으로 Neural Network는 좀 더 복잡한 문제를 해결할 수 있게 되었다.

 

 

 

 

Xavier initialization method

 

weight와 bias를 initialization 하는 것 역시 중요하다. Xavier initialization method는 앞쪽의 layer와 뒤쪽의 layer 사이의 비율로 weight를 initialization 한다. Tensorflow나 PyTorch 같은 경우 이러한 initialization method를 기본적으로 제공한다.

 

 

 

 

Convolutional Neural Network (CNN)

 

DNN은 Deep Neural Network 이고 , CNN은 Convolutional Neural Network이다. 즉 Convolution을 사용한 Neural Network다. CNN은 이미지 분류에 자주 사용되는데 , 이미지라는 데이터가 가진 특성이 Convolution과 비슷하기 때문이다. CNN의 구조는 다음과 같다.

 

 

 

 

 

크게 Convolution (CONV) , ReLU , POOL 부분으로 나뉜다. ReLU의 경우 어느 Neural Network던 사용하기 때문에 CNN만의 특징은 아니다. CNN에서 살펴볼 layer는 CONV와 POOL 부분이다.

 

 

 

 

 

 

실제로 CNN의 이미지 처리 방식과 함께 각 layer가 어떠한 역할을 하는지 살펴보자. 이미지의 Input 차원의 경우 w * h * d일 것이다. w와 h의 경우 이미지의 가로 , 세로 길이가 될 것이고 d의 경우 depth다. 예를 들어 RGB의 조합으로 이미지를 표현했다면 d는 3이 될 것이다. 

 

 

 

 

 

Convolution layer의 경우 필터 라고 생각할 수 있다. 위의 예시의 경우 5*5*3 필터를 통해 weight를 정한다. 만약 위의 예시대로 weight를 정한다면 총 75개의 weight가 정해질 것이다. 그래서 이러한 weight를 학습하는 것이다. CNN이 DNN과 다른 점은 한 layer에서 학습할 weight의 수가 필터의 개수로 정해진다는 점이다. Convolution이라는 개념을 통해서 NN을 살펴보니 weight의 개수가 이미지 사이즈에 의존하는 것이 아닌 필터의 개수에 의존한다는 것을 확인할 수 있다. 이처럼 이미지 사이즈에 weight 개수가 의존하지 않는다는 점은 계산에 있어 큰 이점으로 작용한다. 

 

 

그렇다면 필터의 크기는 어떻게 정해야 할까. 필터의 크기는 Hyper parameter로 사용자가 원하는 값으로 정하면 된다. 보통 3*3 정도의 크기를 사용하며 , 작은 필터를 여려겹 쌓는 것이 효과가 좋다고 알려져 있다.

 

 

 

 

 

 

위의 식에서 W는 필터 weight , b는 bias , x는 픽셀 값이다. 위의 값을 계산한 결과를 ReLU에 넣고 그 결과는 하나의 숫자로 나오게 된다. 즉 필터를 거치면 하나의 스칼라 값만 등장하는 것이다. 이러한 과정을 전체 이미지를 커버할 때까지 반복하고 이 과정이 Convolution layer에서 일어난다.

 

 

 

 

 

 

이미지의 각기 다른 부분에 적용될 때마다 새롭게 weight를 학습하는 것이 아니라 같은 필터를 계속해서 적용하기 때문에 이미 정해진 필터 weight 개수 만큼만 weight를 학습하면 된다. 위에서 5*5*3 필터의 경우 75개의 weight가 존재한다는 의미가 바로 이러한 의미이다. 필터가 적용되고 weight를 학습하는 과정을 좀 더 살펴보기 위해 depth가 1인 경우를 살펴보자.

 

 

 

 

 

 

7*7*1 이미지에 3*3*1 필터를 적용하는 예시이다. 필터를 위쪽 처럼 적용하고 나면 아래 그림처럼 다음 단계로 넘어갈 것이다.

 

 

 

 

 

위의 과정을 쭉 거쳐 한줄의 끝까지 닿았다고 생각해보자. 이 경우 stride 즉 보폭이 1 인 경우다. 한 번에 한 칸씩 이동했으므로 한 줄의 끝까지 닿을 때까지 5번의 필터를 적용했을 것이다. 7*7 이미지에 대해 3*3 필터를 적용한 경우 가로 5번 , 세로 5번 이므로 5*5의 output이 나오게 된다.

 

 

만약 보폭이 2라면 어떻게 나올까. 7*7 이미지에 대해 3*3 필터로 보폭을 2씩 두어 확인하면 결과는 3*3 output이 나오게 된다. 이처럼 보폭을 늘릴수록 같은 크기의 필터라 하더라도 결과가 달라지는 것을 확인할 수 있다.

 

 

 

 

 

 

 

stride와 output의 결과를 식으로 표현하면 위와 같다. 3의 경우 나누어 떨어지지 않고 이러한 경우는 나오면 안된다. 따라서 stride를 정할 때 이러한 부분을 확인하고 정해야 한다. 대부분 stride를 1로 두고 사용하기 때문에 이 경우엔 큰 문제는 없다. stride를 1로 둔 경우 7*7 이미지가 5*5로 아웃풋의 크기가 줄었다. 그렇다면 Convolution layer의 목적은 이미지의 크기를 줄이는 것이냐 하면 아니라는 것이다. Convolution layer의 목표는 이미지의 크기를 줄이는 것이 아닌 이미지의 특징을 뽑아내고자 하는 것이 목표다.

 

 

하지만 필터를 계속 적용하면 어쩔 수 없이 output의 크기는 줄어든다. 따라서 이미지의 크기를 줄이지 않고 특징을 뽑아내기 위해 사용하는 방식이 바로 zero padding이다.

 

 

 

 

 

 

 

이미지의 테두리에 padding을 해 output이 줄지 않도록 만드는 방법이다. 만약 7*7 이미지에 테두리에 0을 넣어 9*9 이미지로 만든 후 3*3 필터로 Convolution 하면 결과는 7*7이 나오게 된다. 이러면 Convolution을 진행해도 output의 크기는 변하지 않게 된다. 이처럼 이미지의 원 사이즈를 유지하기 위해서 사용하는 방식이 zero padding이다.

 

 

 

 

 

 

 

zero padding은 다음과 같은 방식으로 할 수 있다. 필터의 크기가 F*F 일 때 , (F-1)/2로 생각하면 된다.

 

 

 

 

 

zero padding을 하지 않았다고 가정해보자. 32*32는 28*28로 output이 나올 것이다. 그런데 이 과정에서 필터를 하나만 사용하지 않는다. 필터를 6개 사용했다고 가정하면 28*28*6 만큼 나오게 될 것이다. 하나의 필터에서는 하나의 숫자만 등장하므로 28*28*6으로 output이 나오게 된다. 필터의 개수가 6개 라면 총 weight의 수는 75 * 6 만큼 존재할 것이다.

 

 

 

 

 

 

 

 

 

계속해서 CONV와 ReLU를 거치면서 output은 다음과 같이 변화할 것이다. 

 

 

 

 

 

 

Pooling layer는 차원을 줄이기 위해서 사용한다. depth 방향이 아닌 width와 height에 대해 적용한다. 

 

 

 

 

 

 

위의 예시는 2*2 필터로 stride를 2만큼 적용한 pooling이다. 위의 경우는 Max pooling으로 해당 필터에서 가장 높은 값을 output으로 낸다. 평균을 적용한 Averager pooling 등 다양한 pooling 방식이 존재 한다. 

 

 

위에서 소개한 CONV , ReLU , POOL layer를 모두 거치면 CNN의 결과가 나오게 된다. 마지막에는 Fully connected로 두어 클래스의 개수만큼 뉴럴을 둔다. 이후 각 클래스에 속하는 점수를 확인하고 가장 높은 점수를 가지는 것으로 이미지를 분류한다.

 

 

 

 

 

 

 

 

 

 

 

 

CNN에는 다양한 예시가 존재한다. LeNET-5 , AlexNet , GoogLeNet , ResNet 등 다양한 예시가 존재하고 , 각 예시 모두 다양한 특징들이 존재한다. 이외에도 이미 이미지 분류에 대해서는 CNN이 사람 수준에 도달했다고 보고 있다. CNN이 맞추지 못한 문제를 보면 사람도 못 맞출 것 같은데 하는 생각이 든다는 것이다. 따라서 단일 레이블에 대한 이미지 분류는 CNN이 사람만큼 푼다고 봐도 무방할 것이다.

반응형