본문 바로가기
⛓️ ML ・ DL

[CNN] MLP와 Convolutional Neural Network(컨볼루션 신경망)

by 유스 :) 2023. 7. 13.
반응형

💡 Index

     

     

    1. CNN의 등장

    MLP(Multi-Layer Perceptron)는 다층 퍼셉트론으로 여러 개의 퍼셉트론을 결합한 다층 구조를 이용하여 선형분리가 불가능한 상황을 해결한다. 초반에는 단지 MLP에 은닉층을 여러개 추가하는 방식으로 깊은 신경망에 대한 아이디어를 내곤 했지만, 이렇게 은닉층을 추가하여 MLP를 깊게 만들면 제대로 학습되지 않는 문제가 있었다. Backpropagation(역전파) 알고리즘이 가중치를 갱신하는 과정으로 여러 층을 거치면서 gradient 값이 작아져 입력층에 가까워지면, 변화가 거의 없는 Gradient Vanishing 문제가 있었다. 또한 추정해야할 매개변수는 크게 늘었지만, training set의 크기는 작은 상태로 머물러 있어 과잉적합(overfitting)에 빠질 위험이 더욱 커진다. 뿐만 아니라 학습에 상당히 오랜 계산 시간이 걸린다는 문제도 있었다.

     

    이러한 과거를 지나. 딥러닝의 가능성을 연 것이 바로 CNN(컨볼루션 신경망)이다. CNN은 작은 크기의 convolution mask를 사용하기 때문에 fully connected 구조인 MLP보다 매개변수(parameter)가 훨씬 적다. 또한 모든 노드가 같은 mask를 공유하는 가중치 공유(weight sharing) 기법을 사용한다.

     

    현대 Machine Learning의 주류인 깊은 신경망에서는 특징 추출(feature extraction)이라는 작업 자체도 기계학습으로 설계한다. 은닉층 1 ~2개만 가진 얕은 신경망에서 사람이 직접 고안한 특징 추출 알고리즘으로 특징 벡터를 추출하는 신경망의 과거에 비하면 엄청난 발전이다. 이로써 여러 단계의 은닉층 은 자동으로 계층적인 특징을 추출한다. 앞 단계의 은닉층은 주로 edge나 corner와 같은 저급 특징 (low-level feature)을 추출하고, 뒤로 갈수록 더 추상적인 형태의 고급 특징(high-level feature)을 추출한다. 

     

    1) DMLP (Deep MLP ) ; 깊은 다층 퍼셉트론

    DMLP는 단순히 한두개의 은닉층만 가진 MLP에 여러개의 은닉층을 추가한 구조이다. 입력층에는 $x= (1,x_1, x_2, ..., x_d)^T$가 입력되고, 출력층은 $o=(o_1,o_2,..,o_c)^T$를 출력한다. 따라서 Input layer에는 bias node를 제외하고 d개의 노드가 있으며 output layer에는 c개의 노드가 있다.  은닉층에 해당하는 $l = 1,2,...,L-1$번째 층의 activation funtion(활성함수)로는 주로 ReLU 함수를 사용하며 마지막 층인 출력층의 활성함수는 로지스틱 시그모이드, tanh, 또는 softmax를 사용한다. 

     

    2. CNN ; 컨볼루션 신경망

    위에서 본 DMLP는 Fully-connected 구조이며 weight이 너무 많기 때문에 복잡도가 높다. 따라서 학습이 매우 느리고 over fitting될 가능성도 크다. 이번에 살펴볼 CNN은 paritally-connected(부분연결) 구조이기에 모델의 복잡도를 획기적으로 낮춘다. 그러나 여기서 중요한 것은 낮은 복잡도에서도 모든 층은 좋은 특징을 추출해야한다는 본연의 임무에 충실해야한다.

    DMLP와 CNN을 비교하자면, DMLP에 입력되는 데이터는 일렬로 늘어선 벡터 구조에 불과한데 CNN은 영상과 같은 행렬 구조 또는 3차원 이상의 텐서 구조까지 처리할 수 있다. 또한 DMLP는 입력 샘플이 항상 같은 크기를 가져야 한다. 즉, 입력으로 들어오는 특징 벡터의 차원이 항상 같아야한다. 반면 CNN은 가변 크기의 입력까지 처리할 수 있다. 예를 들어 크기가 다른 영상이 입력되더라도 처리할 수 있다는 것이다. 

     

    1) Convolution Layer

    Source

     

    왼쪽 그림에서 볼 수 있는 3 * 3 크기의 마스크를 kernel(커널)이라고 하며 필터(filter) 또는 윈도(window)라고도 한다. Convolution은 해당하는 요소끼리 곱하고 결과룰 모두 더하는 단순 선형 연산이다. output에 해당하는 출력을 특징 맵(feature map)이라고 한다.

     

    우측과 같이 7 * 7 이미지와 3 * 3 필터가 있다고 하자. 이때 이 필터(kernel)를 우측으로 한칸씩 이동하면(stride = 1) 5 * 5 크기의 특징 맵을 출력하게 된다. 이를 일반화하면, n * n 이미지에 대해 f * f 필터를 통과시키면, $(n - f) / Stride + 1$ 형태의 feture map을 출력하게 되는 것이다. 

     

     

    위 사진에서 나타낸 계산처럼, kernel의 depth와 input의 depth는 같아야한다. 인풋의 모든 layer에 대해 kernel을 적용해 특징을 추출해야 올바르게 특징을 가져올 수 있기 때문이다. 따라서 위 예시를 보면 28 * 28 * 1 크기의 input 데이터에 대해 3 * 3 * 1 크기의 필터를 적용하였음을 알 수 있다. 이러한 크기의 필터를 6장 적용하였으므로 아웃풋은 6 depth가 된다. 이후 또 다른 5 * 5 * 6 크기의 필터를 적용한 결과는 22 * 22 * 10 크기의 feature map이 되는데, 이러한 크기의 변화는 위에서 언급한 (n-f)/stride +1 공식을 따른다. 

     

    추가적으로 두번째 conv 계산을 보면, depth가 6이였던 input이 depth가 10인 output으로 바뀌었다. 이는 5 * 5 크기의 kernel이 똑같은 위치에서 6장(layer)에 모두 적용되어 합쳐지기 때문에, 하나의 필터에 대해 하나의 feature map이 완성되는 것이기 때문이다. 따라서 output의 depth는 input의 depth를 그대로 받는 것이 아니라 filter의 depth에 대한 각각의 feature map임을 유의해야한다.  (그렇기때문에 filter의 depth와 input의 depth가 같아야 하는 것!)

     

     

    이렇게 kernel을 통해 feature map을 출력하는 과정을 여러 번 하게되면, 점점 input의 크기는 작아지게 된다. 일반적으로 양쪽 가장자리에서 총 h - 1개(h = 커널의 크기)의 노드가 줄어드는데, 깊은 신경망에서는 컨볼루션 층이 여러번 반복되므로 줄어드는 양이 많아져 문젯거리가 된다. 특징 추출에 있어 값이 input의 크기가 너무 작아지면 우리가 원하는 특징을 제대로 추출하는 것이 어려울 수 있기 때문이다. 따라서 이런 경우를 방지하기 위해 padding을 적용한다. 

     

     

    오른쪽 사진은 zero padding을 적용한 경우이며, 말 그대로 0을 가장자리에 필요한 개수만큼 덧댄 것이다. 이렇게 padding을 적용한 경우, 이미지가 크게 줄어드는 문제를 보완할 수 있다. 

     

     

     

     

    Kernel이 어떤 값을 가지느냐에 따라 추출하는 특징이 달라진다. 예를 들어 (0,2, 0.4, 0.2)인 커널은 0.2, 0.4, 0.2를 가중치로 사용하여 노드 3개의 값을 평균하는 셈이므로 단순히 스무딩(smoothing)하는 효과를 준다. 즉, 잡음이 줄어든 특징을 추출하는 것이라 할 수 있다. 그에 반해 커널이 (-0.5,0, 0.5)가 되면 변화가 발생하는 지점에서는 큰 반응이 있고, 변화가 없는 곳에서는 반응이 0이다. 따라서 edge 특징을 추출하는 효과가 있다. 

    이처럼 서로 다른 커널은 다른 형태의 특징을 추출한다. CNN이 하나의 커널만 사용하여 하나의 feature map만 생성한다면 특징이 너무 빈약하여 좋은 특징을 추출해야한다는 본래 취지에 어긋난다. 따라서 실제로는 수십 ~ 수백개의 커널을 사용하여 다양한 특징 맵을 추출한다. 

     

    2) Pooling Layer

    cnn의 구조를 살펴보면 아래와 같다. 따라서 이번에는 convolution의 다음 과정인 pooling에 대해 알아보자. (실제로는 컨볼루션 연산 결과에 ReLu와 같은 활성함수를 적용한 다음 그 결과에 풀링 연산을 적용한다.)

     

    Max pooling(최대 풀링)은 커널에 속한 노드 중 최댓값을 구하는 연산이다. 이때 stride(보폭)을 2 이상으로 하면 특징 맵의 크기를 줄이는 효과가 있다. 풀링에는 최대 풀링 이외에도 평균 폴링, 가중치 평균 폴링, L2 Norm 풀링 등이 있다.

     

     

     

    이러한 풀링 연산은 잡음(noise)뿐 아니라 지나치게 상세한 정보를 포함한 특징 맵에서 요약 통계를 추출함으로써 성능향상에 기여할 수 있다.  풀링층의 특성은 학습할 매개변수가 없다는 점과 특징 맵의 수가 그대로 유지된다는 점이다. 

     

    3) ReLU와 Softmax 함수

     

    보통 분류문제의 은닉층의 활성화함수 에는 ReLU를 사용하고 출력 전 마지막에는 softmax를 사용한다.

     

     

    ReLU는 Sigmoid의 Gradient Vanishing 문제를 보완할 수 있는 함수로 은닉층에 자주 쓰인다. 0 이상의 값에 대해서는 그대로, 0 미만의 값은 모두 0으로 반환하는 함수인데 그러다 보니 특정 양수 값에 수렴하지 않는다. (Sigmoid와 달리) 따라서 출력값의 범위가 넓고 양수의 경우 자기 자신의 값을 그대로 반환하기 때문에 딥러닝의 시그모이드에서 발생한 기울기 소실 문제를 방지할 수 있던 것이다. 

     

    또한 다른 활성화 함수에 비해 계산 속도가 매우 빠르다는 장점도 가지고 있다. 

     

     

    그러나 ReLU는 Vanishing Gradient 문제를 해결하기 위해 사용하는 것이므로 은닉층에만 쓰인다. 그렇기에 분류 문제에서는 보통 마지막 활성화함수로 Softmax를 사용하여 진행한다.

     

     

    SoftMax는 3개 이상의 다중 분류 문제에서 사용된다. 소프트맥스는 분류될 클래스가 n개라고 할 때 n차원의 벡터를 입력받아 각 클래스에 속할 확률을 추정한다. 

    반응형