합성곱 신경망 Convolutional Neural Network, CNN은 이미지 인식과 음성 인식 등 다양한 곳에서 사용됩니다.
이제부터 CNN에 대해서 낱낱이 살펴보도록 합시다.
# CNN 전체 구조
지금까지 공부했던 신경망과 CNN이 특별히 다른 점은
CNN에는 합성곱 계층 Convolutional layer 과 풀링 계층 Pooling layer 이 새롭게 등장한다는 점입니다.
지금까지 본 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있었습니다.
이를 완전연결 fully-connected라고 하고, 완전히 연결된 계층을 Affine 계층이라고 합니다.
완전연결 신경망은 Affine 계층 뒤에 활성화 함수를 갖는 ReLU/Sigmoid 계층이 이어져 있습니다. 위 그림에서는 'Affine-ReLU' 계층 조합이 4개 연달아 있고, 마지막 5번째 층은 'Affine-Softmax' 계층 조합으로 최종 결과인 확률을 출력합니다.
CNN에서는 앞서 말했던 새로운 층인 '합성곱 계층 Conv'과 '풀링 계층 Pooling'이 추가됩니다. 위 그림에서 볼 수 있듯이 CNN의 계층은 'Conv-ReLU-(Pooling)'조합으로 연결됩니다.
그리고 출력에 가까운 층에서는 이전 신경망과 같이 'Affine-Softmax' 조합을 그대로 사용합니다.
0. 완전연결 계층의 문제점
완전연결 계층을 사용하면 데이터의 형상이 무시됩니다.
입력 데이터가 이미지인 경우를 예로 들어봅시다.
이미지는 3차원 형상으로 통상 세로,가로,채널(색상)로 공간적 정보를 담고 있습니다. 완전연결 계층에 입력할 때 3차원 데이터를 평평한 1치원 데이터로 평탄화해주고 각 계층을 지나게 합니다. 3차원 속에서 의미를 갖는 본질적인 패턴이 숨어있을 건데, 완전연결 계층을 사용하면 형상을 무시하고 모든 입력 데이터를 같은 차원의 뉴런으로 취급하여 형상에 담긴 정보를 살릴 수 없게 합니다.
(예를 들면, 공간적으로 가까운 픽셀의 값이 비슷하거나..)
이런 문제 때문에 입력 데이터의 형상 유지를 위해 합성곱 계층을 사용합니다.
합성곱 계층에서는 입력데이터로 받은 3차원 데이터를 다음 계층에서도 3차원 데이터로 전달합니다.
이로써 CNN에서는 이미지와 같이 형상을 가진 데이터를 제대로 이해할 가능성이 높게 되겠죠.
1. 합성곱 계층
CNN에서는 합성곱 계층의 입출력 데이터를 특징 맵 feature map이라고 합니다. 합성곱 계층의 입력 데이터를 입력 특징 맵 input feature map, 출력 데이터를 출력 특징 맵 output feature map이라고 합니다. 우린 '입출력 데이터'와 '특징 맵'을 같은 의미로 사용하겠습니다.
1.1 합성곱 연산
합성곱 계층에서는 합성곱 연산을 처리합니다. 합성곱 연산은 이미지 처리에서 말하는 필터 연산을 가리킵니다.
여기서 알아야 하는 주요 단어는 필터(커널), 윈도우(Window), 단일 곱셈-누산 (fused multiply-add, FMA) 정도 입니다.
단어 설명을 위해 먼저 합성곱 연산의 예를 들어 설명해보겠습니다.
합성곱 연산에서는 입력 데이터에 필터를 적용합니다.
위 그림의 경우 데이터와 필터의 형상을 (높이Height, 너비Width)로 표현할 때, 입력은 (4, 4), 필터는 (3, 3), 출력은 (2, 2)로 표기할 수 있습니다.
합성곱 연산은 위 그림처럼 필터의 윈도우를 일정 간격으로 이동해가며 입력 데이터에 적용합니다. 입력과 필터에서 대응하는 원소끼리 곱하고 그 총합을 구하고 이 계산을 단일 곱셈-누산이라 합니다.
맨 위의 합성곱 연산의 경우는 (1*2+2*0+3*1+0*0+1*1+2*2+3*1+0*0+1*2=15)로 단일 곱셈-누산 연산할 수 있습니다.
완전연결 신경망에서 가중치 매개변수와 편향이
CNN에서는 필터의 매개변수가 그 가중치에 해당합니다.
합성곱 연산의 가중치에 편향까지 고려하면 아래와 같이 계산할 수 있습니다.
편향은 항상 (1 X 1)로만 존재하며 그 값을 모든 원소에 적용한다는 점을 잊지마세요.
1.2 패딩 Padding
합성곱 연산 수행 전 입력 데이터 주변을 특정 값 (예를 들어 0)으로 채우는 것을 패딩이라 합니다.
패딩은 주로 출력 크기를 조정할 목적으로 사용합니다. 합성곱 연산을 거칠 때마다 출력 크기가 줄어들어서 어느 순간 1이 될 수 있게 되면 더 이상 합성곱 연산을 적용할 수 없기 때문에, 이런 상황을 방지하기 위해 패딩을 사용합니다.
1.3 스트라이드 Stride
필터를 적용하는 위치의 간격을 스트라이드라고 합니다. 위에서 살펴본 모든 예에선 스트라이드가 1이였습니다. 스트라이드가 2인 합성곱 연산의 예로 다음의 그림을 들 수 있습니다.
스트라이드를 2로 두면 필터를 적용하는 윈도우가 두 칸씩 이동합니다. 보시다시피 스트라이드를 키우면 출력의 크기가 작아집니다.
출력의 크기를 조정하는 패딩, 스트라이드 사이의 관계식을 정의할 수 있습니다.
출력크기 (OH, OW)는 아래 식과 같습니다. OH와 OW는 항상 정수로 나눠떨어지도록 변수를 조정해야 합니다.
딥러닝 프레임워크 중에는 정수가 안될 경우 반올림을 하거나 에러를 내지 않고 진행하도록 구현하기도 합니다.
입력 크기 | 필터 크기 | 패딩 | 스트라이드 | 출력크기(OH) | 출력크기(OW) |
(H,W) | (FH, FW) | P | S | OH=(H+2P-FH)/S+1 | OW=(W+2P-FW)/S+1 |
1.4 3차원 데이터의 합성곱 연산
이미지와 같은 입력 데이터의 경우는 세로, 가로에 채널까지 고려한 3차원 데이터를 가집니다. 이제부터는 3차원 데이터의 합성곱 연산을 알아보겠습니다.
채널 방향으로 특징 맵이 여러 개 존재하는 경우에는 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻으면 됩니다. 아래의 예를 통해 직관적으로 이해할 수 있습니다.
3차원 합성곱 연산에서는 입력 데이터의 채널 수와 필터의 채널 수가 반드시 같아야 합니다. 그리고 필터의 모든 채널 크기가 같아야 합니다. 필터 크기는 임의로 설정 가능합니다.
1.5 블록으로 생각하기
3차원 합성곱 연산은 데이터와 필터를 직육면체 블록이라 생각하면 계산하기 더 쉽습니다. 3차원 데이터를 다차원 배열로 나타낼 때는 (채널, 높이, 너비) 순서로 쓰겠습니다. 데이터의 형상은 (채널 수 C, 높이 H, 너비 W)로 쓰고, 필터의 형상은 (C, FH, FW)로 씁니다.
그림으로 나타내보면 다음과 같습니다.
위의 예에서는 출력 데이터가 한 장의 특징 맵으로 채널이 1개입니다. 출력 채널을 여러 개로 늘리고 싶다면?
합성곱 연산의 출력으로 다수의 채널을 내보내려면 필터(가중치)를 다수 사용하면 됩니다.
필터를 FN개 적용하면 출력 맵도 FN개 생성됩니다. 이렇게 출력 데이터를 (FN, OH, OW)의 3차원 형태로 만들면 다음 계층에서도 3차원 합성곱을 수행할 수 있습니다.
필터의 가중치 데이터는 4차원 데이터로 (출력 채널의 수, 입력 채널의 수, 높이, 너비) 순으로 씁니다.
이 경우에 편향을 더하려면 (FN, 1, 1)의 편향 데이터를 더해주면 됩니다. 채널 하나 당 편향 값 하나씩 구성합니다.
1.6 배치 처리
완전연결 신경망에서 입력 데이터를 한 덩어리로 묶어 배치로 처리하여 처리 효율을 높이고, 미니배치 방시긔 학습도 지원했듯, 합성곱 연산에서도 배치 처리를 지원합니다.
각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장합니다.
(데이터 수, 채널 수, 높이, 너비)
데이터가 N개일 때 배치 처리를 할 경우 처리 흐름은 다음과 같이 도식화할 수 있습니다.
각 데이터의 맨 앞에 배치용 차원을 추가하면 4차원 형상을 가진 채 각 계층을 타고 흐릅니다. 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 일어나니, N회 분의 처리를 한 번에 수행하는 거라고 볼 수 있습니다.
합성곱 계층에 대해 충분히 알아봤으니, 이번엔 CNN의 풀링 계층에 대해서 알아보도록 하겠습니다.
2. 풀링 계층
풀링은 세로, 가로 방향의 공간을 줄이는 연산입니다.
아래의 예는 2 x 2 최대 풀링을 스트라이드 2로 처리하는 순서를 도식화한 것입니다.
풀링에는 크게 2가지 연산 방법이 있습니다.
최대 풀링 Max pooling |
평균 풀링 Average pooling |
풀링 영역내의 최댓값을 구하는 연산 |
풀링 영역의 평균을 계산하는 연산 |
풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 보통입니다.
예를 들어서 윈도우가 3 x 3이면 스트라이드는 3으로 설정합니다.
2.1 풀링 계층의 특징
-
학습해야 할 매개변수가 없다
-
채널 수가 변하지 않는다
-
입력의 변화에 영향을 적게 받는다 (강건)
지금까지 CNN의 특징인 합성곱 계층과 풀링 계층에 대해 알아봤습니다.
다음 포스트에서는 두 계층을 직접 코드로 구현해보도록 하겠습니다!
2020/07/28 - [Computer Science/Deep Learning] - [비전공자용] [Python] CNN(합성곱 신경망) - 합성곱 계층 구현
2020/07/28 - [Computer Science/Deep Learning] - [비전공자용] [Python] CNN(합성곱 신경망) - 풀링 계층 구현
[출처] Deep Learning from Scratch, ゼロ から作る
'Computer Science > Deep Learning' 카테고리의 다른 글
[비전공자용] [Python] CNN(합성곱 신경망) - 풀링 계층 구현 (0) | 2020.07.28 |
---|---|
[비전공자용] [Python] CNN(합성곱 신경망) - 합성곱 계층 구현 (2) | 2020.07.28 |
[비전공자용] [Python] 하이퍼파라미터 최적화 Hyperparameter Optimization (0) | 2020.07.10 |
[비전공자용] 오버피팅 Overfitting 억제법 - 1.가중치 감소 2.드롭아웃 Dropout (0) | 2020.07.10 |
[비전공자용] [Python] 배치 정규화 Batch Normalization (2) | 2020.07.10 |