Lec 10-1: CNN - Convolution 연산
딥러닝 공부 17일차
합성곱 신경망(CNN, Convolution Neural Network)는 이미지 처리에 탁월한 성능을 보입니다.
합성곱 신경망은 크게 Convolution Layer(합성곱층) 과 Pooling Layer(풀링층)으로 구성되어있습니다.
합성곱연산이 필요한 이유
앞서 우리가 예제 코드로 해보았던 MNIST 처럼 글자를 분류하고 싶다고 가정해보겠습니다.
아래의 그림은 알파벳 Y를 정자로 쓴 글씨와 휘갈겨 쓴 글씨 두개를 2차원 행렬로 표현한 것입니다.
사람이 보기에는 둘다 y로 보이지만 기계의 입장에서는 각 픽셀마다 가진 값이 거의 상이하므로 완전히 다른값을 가진 입력으로 인식합니다.
이를 다층 퍼셉트론으로 분류한다면 이미지를 1차원 백터로 변환하고 입력층으로 사용해야합니다.
이미지를 1차원 벡터로 변환하면 아래와 같습니다.
1차원으로 변환된 모습은 사람이 보기에도 도대체 이게 무엇인가… 싶습니다 이는 기계한테도 마찬가지입니다.
이러한 이미지 처리에서는 공간적인 구조정보가 중요한 이유입니다.
그래서 이미지의 공간적인 구조 정보를 보존하면서 학습할 수 있는 방법이 필요해졌고, 이를 사용한것이 CNN 이 되는 것입니다.
Channel(채널)
이미지 처리의 기본적인 용어인 채널에 대해서 간단히 정리하면
기계는 글자나, 이미지보다 텐서를 더 잘 처리할 수 있습니다. 이미지는 (높이, 너비, 채널) 이라는 3차원 텐서입니다.
여기서 높이는 이미지의 세로방향 픽셀수, 너비는 이미지의 가로방향 픽셀수 그리고 채널은 이미지의 색깔 성분을 의미합니다.
흑백이미지는 채널 수가 1이고, 각 픽셀은 0부터 255 사이의 값을 가집니다.
위 손글씨 데이터는 (28, 28, 1)의 크기를 가지는 3차원 텐서입니다. 그렇다면 흑백이 아니라 컬러 이미지는 어떨까요?
우리가 흔히 들어본 RGB로 색을 분류할 수 있기 때문에 채널 수가 3개가 됩니다.
하나의 픽셀은 3원색의 조합으로 이루어집니다. 만약 높이가 28, 너비가 28인 컬러 이미지였다면 위 사진은 (28, 28, 3)인 3차원 텐서로 표현된다고 할 수 있습니다.
Convolution operation(합성곱 연산)
Convolution이란 이미지 위에서 stride 값 만큼 filter(kernel)을 이동시키면서 겹쳐지는 부분의 각 원소의 값을 곱해서 모두 더한 값을 출력으로 하는 연산을 말합니다.
stride는 커널이 이동하는 스텝의 크기라고 생각하면 되겠습니다. 커널은 보통 3 x 3 또는 5 x 5를 사용합니다.
연산과정을 조금 더 자세히 살펴보겠습니다.
이렇게 전체 사진을 한바퀴 돌고난 결과는 아래와 같습니다.
위와 같이 입력으로부터 커널을 사용하여 합성곱 연상르 통해 나온 결과를 특성 뱁(feature map) 이라고 합니다.
Padding(패딩)
앞의 예제에서 5x5 입력 이미지에서 3x3 커널로 연산을 마치고 나온 결과가 3x3 특성 맵을 얻었습니다. 이와같이 합성곱연산을 통해 나온결과는 입력값의 크기보다 작아진다는 특징이 있습니다.
이럴 때, 합성곱 연산 이후에도 특성 맵의 크기가 입력의 크기와 동일하게 유지되도록 하고 싶다면 패딩을 사용하면 됩니다.
패딩은 합성곱연산을 하기 전에 입력의 가장자리에 지전된 개수의 폭만큼 행과 열을 추가해주는 것을 말합니다.
주로 제로 패딩(zero padding)을 사용합니다. 즉 위 그림처럼 테두리에 0으로 이루어진 액자가 생긴다고 생각하시면 되겠습니다.
가중치와 편향
Weight(가중치)
다층 퍼셉트론으로 3x3 이미지를 처리한다고 가정해보겠습니다. 우선 이미지를 1차원인 텐서로 만들면, 3x3=9 가 되므로 입력층은 9개의 뉴런을 가집니다. 그리고 예시로 4개의 은닉층을 추가한다고 해보겠습니다.
위에서 각 연결선은 가중치를 의미한다고 이전에 배워서 알고있습니다. 그러므로 위에서 가중치는 9x4=36 개의 가중치를 가집니다.
더 쉬운 예제로 3x3 이미지를 2x2 커널(필터)를 사용하여, 1 스트라이드로 연산을 해보겠습니다.
사실 합성곱 연산에서 가중치는 커널(필터) 행렬의 원소들입니다. 이를 인공 신경망의 형태로 표현한다면 다음과 같습니다.
특성 맵을 얻기 위해서는 동일한 커널로 이미지 전체를 훓으며 합성곱 연산을 진행합니다. 결국 이미지 전체를 훓으면서 사용되는 가중치는 $w_{0},w_{1},w_{2},w_{3}$ 4개 뿐입니다.
그러므로 합성곱 신경망은 다층 퍼셉트론을 사용할 때보다 훨씬 적은 수의 가중치를 사용하며 공간적 구조 정보를 보존한다는 특징이 있습니다.
아래 그림은 위 예제를 모두 연결시켜본 그림입니다. Fully Connected Layer와 비교하면 확실히 적은 것을 보실 수 있습니다.
다층 퍼셉트론의 은닉층에서는 가중치 연산 후에 비선형성을 추가하기 위헤서 활성화 함수를 통과시켰습니다.
합성곱 신경망의 은닉층에서도 마찬가지입니다. 합성곱 연산을 통해 얻은 특성 맵은 다층 퍼셉트론때와 마찬가지로 비선형성 추가를 위해서 활성화 함수를 지나게 됩니다.
이 때, 렐루함수나 렐루함수 변형함수들이 주로 사용됩니다.
이와 같이 합성곱 연산을 통해서 특성 맵을 얻고, 활성화 함수를 지나는 연산을 하는 합성곱 신경망의 은닉층을 합성곱 층(Convolution layer) 이라고 합니다.
Bias(편향)
합성곱 신경망에서도 편향을 사용할 수 있습니다. 편향은 커널을 적용한 뒤에 더해집니다. 편향은 하나의 값만 존재하고, 커널이 적용된 결과의 모든 원소에 더해집니다.
특성 맵의 크기 계산 방법
입력의 크기와 커널의 크기, 그리고 스트라이드 값만 알면 특성 맵의 크기를 계산할 수 있습니다.
- $I_{h}$ : 입력의 높이
- $I_{w}$ : 입력의 너비
- $K_{h}$ : 커널의 높이
- $K_{w}$ : 커널의 너비
- $S$ : 스트라이드
- $O_{h}$ : 특성 맵의 높이
- $O_{w}$ : 특성 맵의 너비
이에 따라 특성 맵의 높이와 너비는 다음과 같습니다.
\[O_{h} = floor(\frac{I_{h} - K_{h}}{S}+1)\] \[O_{w} = floor(\frac{I_{w} - K_{w}}{S}+1)\]여기서 $floor$ 함수는 소수점 발생 시 소수점 이하를 버리는 역할을 합니다. $O_{h} \times O_{w}$ 를 하면 총 몇번의 스텝이 필요한지가 나오게 되겠지요.
여기서 패딩까지 고려하면, (패딩의 폭 : $P$)
\[O_{h} = floor(\frac{I_{h} - K_{h} + 2P}{S}+1)\] \[O_{w} = floor(\frac{I_{w} - K_{w} + 2P}{S}+1)\]다수의 채널을 가질 경우의 합성곱 연산(3차원 텐서의 합성곱 연산)
앞의 예제 까지는 흑백 사진이라서 채널 수가 1이였습니다. RGB값을 모두 포함하는 컬러사진은 어떻게 합성곱 연산을 할 수 있을까요?
만약, 다수릐 채널을 가진 입력 데이터를 가지고 합성곱 연산을 한다고 한다면 커널의 채널 수도 입력의 채널 수만큼 존재해야 합니다.
다시 말해 입력 데이터의 채널 수와 커널의 채널 수는 같아야 합니다. 채널 수가 같으므로 합성곱 연산을 채널마다 수행합니다. 그리고 그 결과치들을 모두 더하여 최종 특성 맵을 얻습니다.
주의해야할 개념은 연산에 사용되는 커널은 3개의 각각의 커널이 아니라 3개의 채널을 가진 1개의 커널이라는 점 입니다.
- $I_{h}$ : 입력의 높이
- $I_{w}$ : 입력의 너비
- $K_{h}$ : 커널의 높이
- $K_{w}$ : 커널의 너비
- $O_{h}$ : 특성 맵의 높이
- $O_{w}$ : 특성 맵의 너비
- $C_{i}$ : 입력 데이터의 채널
다음은 3차원 텐서의 합성곱 연산을 보여줍니다.
높이 $I_{h}$, 너비 $I_{w}$, 채널 $C_{i}$의 입력 데이터는 동일한 채널 수 $C_{i}$를 가지는 높이 $K_{h}$, 너비 $K_{w}$의 커널과 합성곱 연산을 하여 높이 $O_{h}$, 너비 $O_{w}$, 채널 1의 특성 맵을 얻습니다.
그러나 하나의 입력에 여러개의 커널을 사용하는 합성곱연산도 할 수 있습니다.
합성곱 연산에서 다수의 커널을 사용할 경우, 특성 맵의 크기가 어떻게 바뀌는지 살펴봅시다. 다음은 $C_{o}$를 합성곱 연산에 사용하는 커널의 수라고 하였을 때 합성곱 연산 과정입니다.
합성곱 연산에서 다수의 커널을 사용하게되면, 연산의 결과로 나오는 특성맵이 여러개의 채널 수를 가지게 됩니다.
이를 이해했다면 커널의 크기와 입력 데이터의 채널수 $C_{i}$ 와 특성 맵(출력 데이터)의 채널수 $C_{o}$가 주어졌을 때, 가중치 매개변수의 총 개수를 구할 수 있습니다.
가중치는 커널의 원소들이므로 하나의 커널의 하나의 채널은 $K_{h} \times K_{w}$개의 매개변수를 가지고 있습니다.
여기서 합성곱연산이 이루어지기 위한 조건으로 입력 데이터의 채널 수와 동일한 채널 수를 가져야하므로 하나의 커널이 가지는 매개변수의 수는 $K_{h} \times K_{w} \times C_{i}$ 입니다. 그런데 이러한 커널이 또 총 $C_{o}$ 개가 있어야 하므로 가중치 매개변수의 총 수는 다음과 같습니다.
가중치 매개변수의 총 수 : $K_{h} \times K_{w} \times C_{i} \times C_{o}$
Pooling(풀링)
일반적으로 합성곱 연산 + 활성화 함수 단계를 거치고 풀링 단계를 거치는 것이 일반적입니다.
풀링 층에서는 특성맵을 다운샘플링하여 특성 맵의 크기를 줄이는 연산이 이루어집니다. 풀링 연산에는 크게 두가지로 나뉩니다. 1. 최대 풀링(max pooling) 2. 평균 풀링(average pooling)이 사용됩니다.
우선 max pooling 을 예시로 들어보겠습니다.
풀링 연산에서도 합성곱 연산과 마찬가지로 커널과 스트라이드 개념을 가집니다. 위의 예제는 stride가 2이고, 2x2 크기의 kernel로 max pooling 연산을 했을 때, 특성맵이 절반의 크기로 다운샘플링 되는 것을 보여줍니다.
평균 풀링은 말 그대로 평균값을 추출하는 연산이 됩니다. 풀링 연산은 합성곱 연산과의 차이점은 학습해야할 가중치가 없으며 연산 후에 채널 수가 변하지 않는다는 점입니다.
Leave a comment