• [딥러닝] 합성곱 신경망(Convolutional Neural Network, CNN)

    2020. 11. 27.

    by. seo.0

     

    핸즈온 머신러닝(2판)

    이 책은 지능형 시스템을 구축하려면 반드시 알아야 할 머신러닝, 딥러닝 분야 핵심 개념과 이론을 이해하기 쉽게 설명한다. 사이킷런, 케라스, 텐서플로를 이용해 실전에서 바로 활용 가능한

    m.hanbit.co.kr

    해당 글은 핸즈온 머신러닝 2판의 내용을 참고하여 작성하였다.

     

    1. 합성곱 신경망 소개

    데이비드 허블과 토르스텐 비셀은 1958년, 1959년에 시각 피질의 구조에 대한 결정적인 통찰을 제공한 고양이 실험을 수행하였다. 그리고 몇 년 뒤에 원숭이를 대상으로 실험하였는데 이들은 시각 피질 안의 많은 뉴런이 작은 국부 수용장을 가진다는 것을 보였다. 즉, 뉴런들이 시야의 일부 범위 안에 있는 시각 자극에만 반응한다는 뜻이다. 뉴런의 수용장은 서로 겹칠 수 있어서, 합치면 전체 시야를 감싸게 된다. 어떤 뉴런은 수평선의 이미지에만 반응하고 다른 뉴런은 다른 각도의 선분에 반응하였으며, 어떤 뉴런은 큰 수용장을 가져서 저수준 패턴이 조합된 더 복잡한 패턴에 반응한다는 것을 발견하였다. 이러한 관찰을 통해서 고수준 뉴런이 이웃한 저수준 뉴런의 출력에 기반한다는 아이디어를 이끌어냈고, 이 시각 피질에 대한 연구에서 온 아이디어로부터 현재 합성곱 신경망의 모습으로까지 점진적으로 진화하였다.

    CNN은 완전 연결층뿐만 아니라 합성곱 층(convolution layer)과 폴링 층(pooling layer)으로 구성되어 있는데 합성곱 층부터 알아보자.

     

    2. 합성곱 층(Convolutional Layer)

    CNN의 가장 중요한 구성 요소라고 할 수 있다. 첫 번째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결된다. 두 번째 합성곱 층에 있는 각 뉴런은 첫 번째 층의 작은 사각 영역의 뉴런에 연결된다. 이러한 구조는 네트워크가 첫 번째 은닉층에서는 작은 저수준 특성에 집중하고, 그다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 한다.

    아래의 그림처럼 이러한 계층적인 구조로 인해 CNN이 이미지 인식에서 높은 성능을 보이게 된다.

    출처:https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1

     

    패딩(Padding)

    패딩은 연산을 하기 전, 입력 데이터 주변을 특정값으로 채워서 늘리는 작업이다. 주로 출력 데이터의 공간적 크기를 조절하기 위해서 사용된다. 패딩을 사용하지 않으면, 데이터의 크기는 합성곱 층을 통과할 때마다 작아져 가장자리의 정보들이 사라지는 문제가 발생한다. 따라서 패딩을 사용하여 데이터의 손실을 막으며, 주로 주위에 0을 추가하는 제로 패딩(zero padding)을 많이 사용한다.

    출처:https://excelsior-cjh.tistory.com/180

     

    스트라이드(Stride)

    한 수용장과 다음 수용장 사이의 간격을 스트라이드라고 하는데 스트라이드를 이용해서 큰 입력층을 훨씬 작은 층에 연결하는 것도 가능하다. 그러면 모델의 계산 복잡도가 많이 낮아진다.

    아래 그림은 스트라이드 2를 사용하여 7*7 입력층을 3*3 수용장과 스트라이드 2를 사용해서 3*3층에 연결한 것이다.

     

    출처:https://tensorflow.blog/a-guide-to-convolution-arithmetic-for-deep-learning/

     

    필터(Filter)

    위의 설명에서 합성곱 층의 수용장을 필터(또는 합성곱 커널)라고 한다. 그림의 커널이 합성곱층에서의 가중치 세트이다. 층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵(feature map)을 만든다. 이 맵은 필터를 가장 크게 활성화시키는 이미지의 영역을 강조한다.  수동으로 필터를 정의할 필요 없이 훈련하는 동안 합성곱 층이 자동으로 해당 이미지에 가장 유용한 필터를 찾고 상위층은 이들을 연결해서 더 복잡한 패턴을 학습한다.

     

    출처:https://wikidocs.net/64066

     

    실제 합성곱 층은 여러 가지 필터로 필터마다 하나의 특성 맵을 출력하기 때문에 3D로 표현하는 것이 더 적절하다. 하나의 합성곱 층이 입력에 여러 개의 필터를 동시에 적용하므로 입력에 있는 여러 특성을 감지할 수 있다.

     

    3. 폴링 층(Pooling Layer)

    폴링층의 목적은 계산량과 메모리 사용량, 파라미터 수를 줄이기 위해 입력 이미지의 축소본을 만드는 것이다. 폴링층 또한 합성곱 층과 같이 각 뉴런은 이전 층의 작은 수용장 안에 있는 뉴런의 출력과 연결되어 있다. 또한 풀링도 커널과 스트라이드의 개념을 가진다. 다른 점은 가중치가 없다는 것이다.

    아래 그림은 스트라이드가 2일 때, 2*2 크기의 커널로 풀링 연산을 했을 때의 예시이다. 풀링 연산은 일반적으로 최대 풀링(Max Pooling)과 평균 풀링(Average Pooling)이 사용된다.

     

    출처:https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

     

    최대 풀링은 커널과 겹치는 영역에서 최댓값을 추출하는 연산이며, 평균 풀링은 해당 영역에서 평균값을 추출하는 연산이다. 이와 같은 방식으로 풀링을 통해 입력 이미지를 축소해준다.

     

    최대 풀링은 작은 변화에도 일정 수준의 불변성을 만들어주는 특징이 있다.  아래의 그림이 그 예시이다.

    출처:https://jihoonjung.tistory.com/49

    검은색 흰색보다 높은 값이라고 하고, A, B, C 이미지(이미지는 동일하지만 모두 한 픽셀씩 이동한 것이다)가 2*2 크기의 커널, 스트라이드가 2인 최대 풀링층을 통과한다고 하자. A, B의 출력은 동일한데 이것이 이동 불변성이다. 그러나 C의 출력은 다르다. 오른쪽으로 한 픽셀 이동하였다. CNN에서 몇 개 층마다 최대 풀링 층을 추가하면 전체적으로 일정 수준의 이동 불변성을 얻을 수 있다. 그러나 최대 풀링층도 단점이 있다. 여기서 출력은 양방향으로 절반이 줄어들어 입력값의 총 75%를 잃게 된다. 불변성이 필요하지 않은 애플리케이션의 경우 이러한 부분을 고려해야 한다.

     

    평균 풀링은 일반적으로 최대 풀링보다 정보 손실이 적다. 반면 최대 풀링은 의미 없는 것은 모두 제거하고 가장 큰 특징만 유지한다. 따라서 다음 층이 조금 더 명확하게 작업할 수 있다.

     

    4. CNN 구조

    위에서 합성곱 신경망을 만들기 위한 구성요소를 알아보았다. 이제 이 요소들을 어떻게 조합하는지 알아보자.

     

    전형적인 CNN의 구조는 그림과 같다.

    출처:http://ki-it.com/_common/do.php?a=full&b=22&bidx=1100&aidx=14369

    합성곱 층을 몇 개 쌓고, 그다음에 풀링층을 쌓고, 그다음에 또 합성곱 층을 몇 개 더 쌓고, 그다음에 다시 풀링층을 쌓는 방식이다. 네트워크를 통과할수록 이미지는 점점 작아지는데, 합성곱 층 때문에 일반적으로 더 깊어진다. 즉, 더 많은 특성 맵을 가지게 되는 것이다. 가장 위층에는 몇 개의 완전 연결층으로 구성된 일반적인 피드 포워드 신경망이 추가되고 마지막 층(소프트맥스 층)에서 예측이 나온다.

     

    지금까지 전체적인 CNN의 기본 설명이었다. 다음 포스팅에서는 이번 내용을 토대로 kearas를 사용해 CNN 모델을 구현해보고 이전에 전처리한 데이터 이미지들을 학습시켜보겠다.

    댓글