CNN은 이미지 인식과 음성 인식 등 다양한 곳에서 사용 되는데,
특히 이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 CNN을 기초로 할 정도로 중요한 신경망 중 하나 입니다.
CNN의 등장
; 완전연결 계층(Fully Connected Layer)의 문제점
완전연결 신경망에서는 완전연결 계층(Affine 계층)을 사용했습니다. 완저연결계층에서는 인접하는 계층의 뉴런이 모두 연결되고 출력의 수는 임의로 정할 수 있습니다.
완전연결 계층의 문제점은 바로 데이터의 형상이 무시된다는 사실 입니다.
예를들어,
(세로 * 가로 * 색상) 정보가 들어있는 3차원 이미지를 입력할 때 완전연결 계층은 1차원 데이터로 평탄화를 해줘야 합니다.
즉 3차원 속에서 의미를 갖는 본질적인 패턴의 형상을 무시하고 모든 입력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정보를 살릴 수 없습니다.
하지만 CNN은 형상을 유지합니다. 이미지도 3차원 데이터로 입력받으며 마찬가지로 다음 계층에도 3차원 데이터로 전달합니다.
그래서 CNN에서는 이미지처럼 형상을 가진 데이터를 제대로 이해할 가능성이 있다는 것 입니다.
CNN에서는 합성곱 계층의 입출력 데이터를 특징 맵(feature map)이라고도 합니다.
합성곱 계층의 입력 데이터를 입력 특징 맵(input feature map), 출력 데이터를 출력 특징 맵(output feature map)입니다.
다음은 FC계층으로 이루어진 네트워크와 CNN으로 이루어진 네트워크의 예 입니다.
CNN의 구조
위 사진처럼 CNN에서는 새로운 합성곱 계층과 풀링 계층이 추가됩니다.
CNN의 계층은 Conv - ReLU - (Pooling) 흐름으로 연결됩니다. (pooling계층은 생략하기도 합니다.)
지금까지의 < Affine - ReLU > 연결이 < Conv - ReLU - Pooling >으로 바뀌었다고 볼 수 있습니다.
CNN에서 주목할 또 다른 점은 출력에 가까운 층에서는 지금까지의 Affine - ReLU 구성을 사용할 수 있다는 것 입니다.
또, 마지막 출력 계층에서는 < Affine - Softmax >조합을 그대로 사용합니다.
CNN에서는 Padding, Stride 등 CNN 고유의 용어가 등장합니다.
합성곱 연산
합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당합니다.
그림과 같이 합성곱 연산은 입력 데이터에 필터(커널)를 적용합니다.
필터의 윈도우를 일정 간격으로 이동해가며 입력 데이터에 적용합니다. 입력과 필터에서 대응하는 원소끼리 곱한 후 그 총합을 구하는 계산(단일 곱셈-누산)을 진행합니다.
완전연결 신경망에는 가중치 매개변수와 편향이 존재하는데 CNN에서는 필터의 매개변수가 그동안의 가중치에 해당합니다. 또한 CNN에서도 편향이 존재합니다.
편향 단계까지 포함한 네트워크는 다음과 같습니다.
편향은 필터를 적용한 후, 데이터에 더해집니다. 편향은 항상 (1 * 1)크기로 존재 합니다.
패딩
패딩(Padding)은 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0)으로 채우는 기법입니다.
처음 크기가 (4, 4)인 입력 데이터에 패딩이 적용되어 (6, 6)크기가 됩니다.
이 입력에 (3, 3)크기의 필터를 걸면 (4, 4) 크기의 출력 데이터가 생성됩니다. 패딩을 2나 3 등 원하는 정수로 설정할 수 있습니다.
패딩은 주로 출력 크기를 조정할 목적으로 사용됩니다. 예를 들어 (4, 4) 입력 데이터에 (3, 3) 필터를 적용하면 출력은 (2, 2)가 되어 입력보다 2만큼 줄어듭니다. 이는 합성곱 연산을 몇 번이나 되풀이하는 심층 신경망에서는 문제가 될 수 있습니다.
합성곱 연산을 거칠 때마다 크기가 작아지면 어느 시점에서는 출력 크기가 1이 되어버립니다. 더 이상은 합성곱 연산을 적용할 수 없다는 뜻이니 이러한 사태를 막기 위해 패딩을 사용합니다. 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수도 있습니다.
스트라이드
스트라이드(stride)는 필터를 적용하는 위치의 간격을 말합니다. 즉 보폭을 뜻합니다.
스트라이드를 키우면 출력 크기는 작아집니다. 한편, 패딩을 크게 하면 출력 크기가 커지구요.
이러한 관계를 수식으로도 표현할 수 있습니다.
입력 크기: (H, W)
필터 크기: (FH, FW)
출력 크기: (OH, OW)
패딩 : P
스트라이드 : S
$ OH = \frac{H + 2P - FH}{S} +1 $
$ OW = \frac{W + 2P - FW}{S} +1 $
주의할 점은 정수로 나눠떨어지는 값이어야 한다는 것 입니다.
지금까지는 2차원 형상을 다루는 합성곱 연산을 보았는데요.
이제는 3차원 데이터를 다루는 합성곱 연산을 살펴보겠습니다.
계산순서
동작 예시
3차원의 합성곱 연산에서 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수가 같아야 한다는 것 입니다.
한편, 필터 자체의 크기는 원하는 값으로 설정할 수 있습니다.(단, 모든 채널의 필터가 같은 크기여야 합니다.)
이 3차원 합성곱 연산을 직육면체 블록이라고도 생각할 수 있습니다.
이 예에서 출력 데이터는 한 장의 특징 맵입니다. 한 장의 특징 맵을 다른 말로 하면 채널이 1개인 특징 맵입니다.
여러 채널을 내보내려면 다수의 필터(가중치)를 사용하면 됩니다.
합성곱 연산에서는 이상에서 보듯 필터의 수도 고려해야 합니다. 그런 이유로 필터의 가중치 데이터는 4차원 데이터이며(출력 채널 수, 입력 채널 수, 높이, 너비) 순으로 씁니다. 예를 들어 채널 수 3, 크기 5 * 5인 필터가 20개 있다면 (20, 3, 5, 5)로 씁니다.
3차원 데이터 합성곱 연산에도 편향이 존재합니다.
편향은 (FN, 1, 1) 형상을 띄며 출력 데이터는 (FN, OH, OW) 형상을 보입니다.
두 형상은 크기가 다르기 때문에 numpy 기능 중 하나인 브로드캐스트 기능을 사용한다면 형상이 다른 블록의 덧셈을 쉽게 구현할 수 있습니다.
예)
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
>>> A * B
array([[ 10, 40],
[ 30, 80])
배치 처리
신경망 처리에서는 입력 데이터를 한 덩어리로 묶어 배치로 처리했습니다.
완전연결 신경망은 이 방식을 지원하여 처리 효율을 높이고, 미니배치 방식의 학습도 지원하도록 했습니다.
합성곱 연산도 마찬가지로 배치 처리를 지원합니다. 각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장합니다. 구체적으로는 데이터를 (데이터 수, 채널 수, 높이, 너비) 순으로 저장합니다.
데이터가 N개일 때 위 사진을 배치 처리한다면 아래와 같은 그림처럼 되는 것 입니다.
배치 처리 시의 데이터 흐름을 나타낸 위 사진을 보면 각 데이터의 선두에 배치용 차원을 추가했습니다.
이처럼 데이터는 4차원 형상을 가진 채 각 계층을 타고 흐릅니다. 여기에서 주의할 점으로는 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄진다는 것 입니다. 즉, N회 분의 처리를 한 번에 수행하는 것이죠.
풀링
풀링은 세로*가로 방향의 공간을 줄이는 연산입니다.
위 그림은 맥스 풀링을 스트라이드 2로 처리하는 순서입니다.
맥스 풀링은 최댓값을 구하는 연산으로, 2*2는 대상 영역의 크기를 뜻합니다.
즉, 2*2 최대 풀링은 그림과 같이 2*2 크기의 영역에서 가장 큰 원소 하나를 꺼냅니다. 스트라이드는 이 예에서 2로 설정했으므로 2*2 윈도우가 2칸 간격으로 이동합니다.
참고로, 풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 일반적입니다.
풀링계층의 특징
- 학습해야 할 매개변수가 없다
- 채널 수가 변하지 않는다
- 입력의 변화에 영향을 적게 받는다(강건하다)
다음 글은 파이썬으로 구현해보는 시간을 갖도록 하겠습니다.
'AI > Deep Learning' 카테고리의 다른 글
신경망 학습 방법 (1) | 2022.09.21 |
---|---|
신경망, 인간의 두뇌 (0) | 2022.09.02 |
퍼셉트론(Perceptron) : 딥러닝의 기원 (0) | 2022.08.31 |