합성곱
합성곱(convolution)은 마치 입력 데이터에 마법의 도장을 찍어서 유용한 특성만 드러나게 하는 것으로 비유할 수 있다.
인공 신경망은 처음에 가중치 w1~w10과 절편 b를 랜덤하게 초기화한 다음 에포크를 반복하면서 경사 하강법 알고리즘을 사용하여 손실이 낮아지도록 최적의 가중치와 절편을 찾아간다. 이것이 바로 모델 훈련이다.
합성곱의 밀집층의 계산은 입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다. 다음 그림과 위의 그림을 비교해 보자. 여기에서는 이 뉴런이 3개의 가중치를 가진다고 가정했다.
가중치 w1~w3이 입력의 처음 3개 특성과 곱해져 1개의 출력을 만든다. 이 뉴런이 한 칸 아래로 이동해 두 번째부터 네 번째 특성과 곱해져 새로운 출력을 만든다.
여기서 중요한것은 첫 번째 합성곱에 사용된 가중치 w1~w3과 절편 b가 두 번째 합성곱에도 동일하게 사용된다. 이렇게 한 칸씩 아래로 이동하면서 출력을 만드는 것이 합성곱이다. 여기에서는 이 뉴런의 가중치가 3개이기 때문에 모두 8개의 출력이 만들어진다.
쉽게 구분할 수 있도록 8번의 계산을 다른 색으로 나타냈지만 모두 같은 뉴런이다. 즉 모두 같은 가중치 w1~w3과 절편 b를 사용한다.
밀집층의 뉴런은 입력 개수만큼 10개의 가중치를 가지고 1개의 출력을 만든다. 합성곱 층의 뉴런은 3개의 가중치를 가지고 8개의 출력을 만든다. 합성곱 층의 뉴런에 있는 가중치 개수는 정하기 나름이다. 즉 또 다른 하이퍼파라미터 이다.
이전에 그렸던 신경망 층의 그림은 뉴런이 길게 늘어저 있고 서로 조밀하게 연결되어 있다. 그런데 합성곱에서는 뉴런이 입력 위를 이동하면서 출력을 만들기 때문에 이런 식으로 표현하기가 어렵다. 합성곱 신경망(convolutional neural network. CNN)에서는 완전 연결 신경망과 달리 뉴런을 필터(filter)라고 부른다. 혹은 커널(kernel)이라고도 부른다.
여기서는 뉴런 개수를 이야기할 때는 필터라 부르고, 입력에 곱해지는 가중치를 의미할 때는 커널이라고 부른다.
합성곱의 장점은 1차원이 아니라 2차원 입력에도 적용할 수 있다.
입력이 2차원 배열이면 필터(도장)도 2차원 이어야 한다. 그림에서 필터는 모두 4번 이동할 수 있기 때문에 4개의 출력을 만든다.
합성곱 계산을 통해 얻은 출력을 특별히 특성 맵(feature map)이라고 부른다.
밀집층에서 여러 개의 뉴런을 사용하듯이 합성곱 층에서도 여러 개의 필터를 사용한다.
밀집층에 있는 뉴런의 가중치가 모두 다르듯이 합성곱 층에 있는 필터의 가중치(커널)도 모두 다르다.
케라스 합성곱 층
케라스의 층은 모두 keras.layers 패키지 아래 클래스로 구현되어 있다. 합성곱 층도 마찬가지이다. 특별히 입력 위를 이동하는 합성곱은 Conv2D 클래스로 제공한다.
from tensorflow import keras keras.layers.Conv2D(10,kernel_size=(3,3),activation='relu')
Conv2D 클래스의 첫 번째 매개변수는 필터(즉 도장) 의 개수이다. kernel_size 매개변수는 필터에 사용할 커널의 크기를 지정한다. 필터의 개수와 커널의 크기는 반드시 지정해야 하는 매개변수이다. 마지막으로 밀집층에서 활성화 함수를 지정하는데 여기서는 렐루 함수를 선택했다.
일반적으로 1개 이상의 합성곱 층을 쓴 인공 신경망을 합성곱 신경망이라고 부른다.
앞에서 예로 들었던 합성곱 계산은 (4,4) 크기의 입력에 (3,3) 크기의 커널을 적용하여 (2,2) 크기의 특성 맵을 만들었다. 그런데 만약 커널의 크기는 (3,3)으로 그대로 두고 출력의 크기를 입력과 동일하게 (4,4)로 만들려면 어떻게 해야할까?
이렇게 입력 배열의 주위를 가상의 원소로 채우는 것을 패딩(padding)이라고 한다. 실제 입력값이 아니기 때문에 패딩은 0으로 채운다. 즉 (4,4) 크기의 입력에 0을 1개 패딩하면 위와 같은 (6,6) 크기의 입력이 된다.
이렇게 입력과 특성 맵의 크기를 동일하게 만들어 주기 위해 입력 주위에 0으로 패딩하는 것을 세임 패딩(same padding) 이라고 부른다. 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우를 밸리드패딩(valid padding)이라고 한다. 밸리드 패딩은 특성 맵의 크기가 줄어들 수밖에 없다.
합성곱에서 패딩을 즐겨사용하는 이유는 패딩을 사용하지 않다면 가장자리 정보가 가운데 정보보다 연산에 덜 참여해서 모서리에 있는 중요한 정보가 특성 맵으로 잘 전달되지 않을 가능성이 높아지기 때문이다.
keras.layers.Conv2D(10,kernel_size=(3,3),activation='relu',padding='same',strides=1)
padding의 기본값은 valid이다. strides 는 몇칸 이동하는지 이다. 기본값은 1이다.
세임 패딩의 경우 입력과 만들어진 특성 맵의 가로세로 크기가 같다는 점은 꼭 기억해야 한다.
풀링(pooling)은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할을 수행한다. 하지만 특성 맵의 개수는 줄이지 않는다.
풀링에는 가중치가 없다. 도장을 찍는 영역에서 가장 큰 값을 고르거나 평균값을 계산한다. 이를 각각 최대 풀링(max pooling) 평균 풀링(average pooling)이라고 부른다. 풀링은 합성곱 층과 뚜렷이 구분되기 때문에 풀링 층이라고 부르겠다.
눈여겨볼 점은 풀링 영역이 두 칸씩 이동했다는 점이다. 합성곱에서는 커널이 한 칸씩 이동했기 때문에 겹치는 부분이 있었지만 풀링에서는 겹치지 않고 이동한다. 즉 스트라이드가 2이다. (3,3) 풀링이면 가로세로 세 칸씩 이동한다.
keras.layers.MaxPooling2D(2)
MaxPooling2D의 첫 번째 매개변수로 풀링의 크기를 지정한다. 대부분 풀링의 크기는 2이다. strides의 기본값은 자동으로 풀링의 크기이므로 따로 지정할 필요가 없다. padding의 기본값은 valid로 패딩을 하지 않는다.
평균 풀링을 제공하는 클래스는 AveragePooling2D이다. 제공하는 매개변수는 같다. 많은 경우 평균 풀링보다 최대 풀링을 많이 사용한다. 평균 풀링은 특성 맵에 있는 중요한 정보를 (평균하여) 희석시킬 수 있기 때문이다.
합성곱 신경망의 전체 구조
지금까지 우리는 입력을 2차원 배열이라고 가정했다. 하지만 컬러 이미지라면 어떨까? 컬러 이미지는 RGB(빨강, 초록, 파랑) 채널로 구성되어 있기 때문에 컴퓨터는 이를 3차원 배열로 표시한다.
하나의 컬러 이미지는 너비와 높이 차원 외에 깊이 차원(또는 채널 차원)이 있다. 이런 경우에는 필터의 커널 크기가 (3,3) 이 아니라 (3,3,3) 이 된다.
이 합성곱의 계산은 (3,3,3) 영역에 해당하는 27개의 원소에 27개의 가중치를 곱하고 절편을 더하는 식이 된다. 기본적으로 2차원 합성곱과 같지만 도장이 입력의 깊이만큼 쑥 들어간다고 생각하면 된다.
여기서 중요한 것은 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이라는 점이다.
사실 케라스의 합성곱층은 항상 이렇게 3차원 입력을 기대한다. 만약 MNIST 데이터처럼 흑백 이미지일 경우에는 깊이 차원이 1인 3차원 배열로 변환하여 전달한다.
이와 비슷한 경우가 또 있다. 합성곱 층- 풀링 층 다음에 다시 합성곱 층이 올 때이다. 예를 들어 첫 번째 합성곱 층의 필터 개수가 5개라고 가정하여 첫 번째 풀링 층을 통과한 특성 맵의 크기가 (4,4,5)라고 해보자.
이렇게 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어지는 것이 특징이다. 그리고 마지막에 출력층 전에 특성 맵을 모두 펼쳐서 밀집층의 입력으로 사용한다.
합성곱 신경망에서 필터는 이미지에 있는 어떤 특징을 찾는다고 생각할 수 있다. 처음에는 간단한 기본적인 특징(직선, 곡선 등)을 찾고 깊어질수록 다양하고 구체적인 특징을 감지할 수 있도록 필터의 개수를 늘린다. 또 어떤 특징이 이미지의 어느 위치에 놓이더라고 쉽게 감지할 수 있도록 너비와 높이 차원을 점점 줄여간다.
결론
이번 시간에는 합성곱 신경망을 구성하는 핵심 개념을 살펴보았다. 여기에는 합성곱, 필터, 패딩, 스트라이드, 풀링 등이 포함된다. 합성곱 신경망은 직관적으로 이해하기 쉽지 않지만 이미지 처리에서 뛰어난 성능을 발휘할 수 있도록 발전된 결과물 이다.
'Machine Learning > Basic' 카테고리의 다른 글
[8-3] 합성곱 신경망의 시각화(1) (0) | 2021.04.15 |
---|---|
[8-2] 합성곱 신경망을 사용한 이미지 분류 (0) | 2021.04.14 |
[7-3] 신경망 모델 훈련 (0) | 2021.04.13 |
[7-2] 심층 신경망 (0) | 2021.04.13 |
[7-1] 인공 신경망 (0) | 2021.04.13 |