합성곱 신경망 (CNN, Convolutional Neural Network)
지금까지 본 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있었습니다.
이를 완전 연결(Fully-connected, 전결합)이라고 하며, 완전히 연결된 계층을 Affine 계층이라는 이름으로 표현했습니다.
CNN에서는 새로운 ‘합성곱 계층(Conv)과 풀링 계층(Pooling)이 추가됩니다.
CNN의 계층은 ‘Conv-ReLU-(Pooling)’흐름으로 연결되고 풀링 계층은 생략하기도 합니다.
출력에 가까운 층에서는 ‘Affine-ReLU’ 구성을 사용할 수 있고, 마지막 출력 계층에서는 ‘Affine-Softmax’ 조합을 그대로 사용하기도 합니다.
합성곱 계층
완전 연결 계층(Affine 계층)의 문제점과 CNN
완전 연결 계층에서는 인접하는 계층의 뉴런이 모두 연결되고 출력의 수는 임의로 정할 수 있었습니다.
완전 연결 계층의 문제점 :
- 데이터의 형상이 무시됨
- 입력 데이터가 3차원이어도 평평한 1차원 데이터로 평탄화해줘야 함
- 완전 연결 계층은 형상을 무시하고 모든 입력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정보를 살릴 수 없음
반면에, 합성곱 계층은 형상을 유지합니다.
이미지도 3차원 데이터로 입력받으며, 마찬가지로 다음 계층에도 3차원 데이터로 전달합니다.
각 계층 사이에는 3차원 데이터같이 입체적인 데이터가 흐른다는 점이 완전 연결 신경망과 가장 큰 차이점입니다.
그래서 CNN에서는 이미지처럼 형상을 가진 데이터를 제대로 이해할 가능성이 있습니다.
CNN에서는 합성곱 계층의 입출력 데이터를 특징 맵(feature map)이라고도 합니다.
- 입력 특징 맵(input feature map) : 합성곱 계층의 입력 데이터
- 출력 특징 맵(output feature map) : 합성곱 계층의 출력 데이터
합성곱 연산 (Convolution)
합성곱 계층에서는 합성곱 연산을 처리합니다.
합성곱 연산은 이미지 처리에서 말하는 필터 연산에 해당합니다. (문헌에 따라 필터를 커널이라 칭하기도 합니다.)
합성곱 연산은 필터의 윈도우(window)를 일정 간격으로 이동해가며 입력 데이터에 적용합니다.
입력과 필터에서 대응하는 원소끼리(같은 위치의 원소끼리) 곱한 후 그 총합을 구합니다.
이 계산을 단일 곱셈-누산(Fused multiply-add, FMA)이라 합니다.
(2행, 2열) : 1*2 + 2*0 + 3*1 + 0*0 + 1*1 + 2*2 + 3*1 + 0*0 + 1*2 = 15
그 결과에 편향을 더해 출력의 해당 장소에 저장합니다.
참고로 편향은 하나(1x1)만 존재하고, 그 하나의 값을 필터를 적용한 모든 원소에 더합니다.
완전 연결 신경망과 비교를 해보자면, 완전 연결 신경망에는 가중치 매개변수와 편향이 존재했는데
CNN에서는 필터의 매개변수가 ‘가중치’에 해당하고,
필터를 적용한 후의 데이터에 더해지는 값을 '편향'에 해당한다고 생각하시면 됩니다.
패딩
패딩이란 합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(예컨대 0)으로 채운 것을 의미합니다.
합성곱 연산을 거칠 때마다 크기가 작아지면 어느 시점에서는 출력 크기가 1이 되어버리고 이는 더 이상은 합성곱 연산을 적용할 수 없다는 뜻입니다.
패딩은 이러한 사태를 막기 위해 사용하고, 입력 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수 있습니다.
(4,4) → (6,6) 패딩을 1로 설정
- 패딩 폭을 1로 설정하니 (4,4) 입력에 대한 출력이 같은 크기인 (4,4)로 유지
만약 패딩을 2로 설명하면 (4,4) → (8,8)이 되고, 패딩을 3으로 설정하면 (10,10)이 됨
- 주로 출력 크기를 조정할 목적으로 사용
- 합성곱 연산을 몇 번이나 되풀이하는 심층 신경망에서는 입력보다 출력이 줄어드는 게 문제가 될 수 있음
스트라이드
스트라이드(stride)란 필터를 적용하는 위치의 간격을 의미합니다.
- 지금까지 본 예는 스트라이드가 1로 윈도우가 한 칸씩 이동
- 스트라이드를 2로 하면 필터를 적용하는 윈도우가 두 칸씩 이동
스트라이드를 키우면 출력 크기는 작아짐
반면, 패딩을 크게 하면 출력 크기가 커짐
출력 크기 계산
\(OH = \frac{H + 2P -FH}{S} + 1\)
\(OW = \frac{W + 2P - FW}{S} + 1\)
- 입력 크기 : (H, W)
- 필터 크기 : (FH, FW)
- 출력 크기 : (OH, OW)
- 패딩 : P
- 스트라이드 : S
단순히 값을 대입하기만 하면 출력 크기를 구할 수 있습니다.
출력 크기가 정수로 나누어 떨어지는 값이어야 하며 출력 크기가 정수가 아니면 오류를 내는 등의 대응을 해줘야 합니다.
딥러닝 프레임워크 중에는 값이 딱 나눠 떨어지지 않을 때는 가장 가까운 정수로 반올림하는 등, 특별히 에러를 내지 않고 진행하도록 구현하는 경우도 존재합니다.
3차원 데이터의 합성곱 연산
지금까지 2차원 형상을 다루는 합성곱 연산을 살펴보았습니다.
보통 이미지는 세로, 가로에 더해서 채널까지 고려한 3차원 데이터이기 때문에
여기서는 3차원 형상을 다루는 합성곱 연산에 대해 살펴보겠습니다.
채널 쪽으로 특징 맵이 여러 개 있다면 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻습니다.
하나의 출력으로 나온다는 점을 주의해야 합니다!
입력 데이터의 채널 수와 필터의 채널 수가 같아야 합니다.
3차원의 합성곱 연산은 데이터와 필터를 직육면체 블록이라고 생각하면 쉽습니다.
채널, 높이 너비 순서
- 입력 데이터 : (C, H, W)
- 필터 : (C, FH, FW)
- 출력 데이터 : (1, OH, OW)
합성곱 연산의 출력으로 다수의 채널을 내보내려면 필터(가중치)를 다수 사용하면 됩니다.
그리고 필터를 FN개 적용하면 출력 맵도 FN개 생성됩니다.
합성곱 연산에서는 필터의 수도 고려해야 하므로 필터의 가중치 데이터는 4차원 데이터이며 (출력 채널 수, 입력 채널 수, 높이, 너비) 순으로 씁니다.
- 예를 들어 채널 수 3, 크기 5x5인 필터가 20개 있다면 (20, 3, 5, 5)로 씀
편향은 출력 채널 하나에 값 하나씩 구성됩니다.
배치 처리
신경망 처리에서는 입력 데이터를 한 덩어리로 묶어 배치로 처리합니다.
완전 연결 신경망을 구현하면서는 이 방식을 지원하여 처리 효율을 높이고, 미니 배치 방식의 학습도 지원하도록 했습니다.
합성곱 연산도 마찬가지로 배치 처리를 지원하고자 하므로 각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장합니다.
구체적으로는 데이터를 (데이터 수, 채널 수, 높이, 너비) 순으로 저장합니다.
각 데이터의 선두에 배치용 차원을 추가하면, 이처럼 데이터는 4차원 형상을 가진 채 각 계층을 타고 흐릅니다.
신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄집니다.
즉, N회 분의 처리를 한 번에 수행됩니다.
풀링 계층
풀링이란 세로, 가로 방향의 공간을 줄이는 연산입니다.
위 그림은 2x2 최대 풀링(max pooling, 맥스 풀링)을 스트라이드 2로 처리했습니다.
- 2x2 영역을 원소 하나로 집약하여 공간 크기 줄임
- 최대 풀링은 최댓값을 구하는 연산
- 즉, 2x2 크기 영역에서 가장 큰 원소를 하나 꺼냄
- 스트라이드는 2이므로 2x2 윈도우가 원소 2칸 간격으로 이동
참고로, 풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 보통의 경우라 합니다.
풀링은 최대 풀링 외에도 대상 영역의 평균을 계산하는 평균 풀링 등이 있습니다.
이미지 인식 분야에서는 주로 최대 풀링을 사용한다고 합니다.
풀링 계층의 특징
- 학습해야 할 매개변수가 없음
- 최댓값이나 평균을 취하는 명확한 처리이므로 특별히 학습할 것이 없음
- 채널 수가 변하지 않음
- 채널마다 독립적으로 계산
- 입력의 변화에 영향을 적게 받는다
- 입력 데이터가 조금 변해도 풀링의 결과는 잘 변하지 않는다
- 데이터 따라서는 다를 수 있지만 데이터가 조금 이동되거나 어긋나도 출력은 같을 수 있음
대표적인 CNN
LeNet
손글씨 숫자를 인식하는 네트워크로, 1998년에 제안되었습니다.
합성곱 계층과 풀링 계층(정확히는 단순히 ‘원소를 줄이기’만 하는 서브 샘플링 계층)을 반복하고, 마지막으로 완전 연결 계층을 거치면서 결과를 출력하는 구조입니다.
LeNet과 현재의 CNN을 비교하면 몇 가지 면에서 차이가 있습니다. (큰 차이는 아님)
- 활성화 함수
- LeNet은 시그모이드 함수를 사용하는 데 반해, 현재는 주로 ReLU를 사용
- LeNet은 서브 샘플링을 하여 중간 데이터의 크기를 줄이지만 현재는 최대 풀링이 주류
AlexNet
2012년에 발표된 AlexNet은 딥러닝 열풍을 일으키는 데 큰 역할을 했습니다.
합성곱 계층과 풀링 계층을 거듭하며 마지막으로 완전 연결 계층을 거쳐 결과를 출력하는 구조입니다.
- 8층의 CNN
- 블록으로 나타낸 것은 중간 데이터이며, 그 중간 데이터에 합성곱 연산을 연속해서 적용
LeNet에서 큰 구조는 바뀌지 않았지만 다음과 같은 변화를 줬습니다.
- 활성화 함수로 ReLU를 이용
- LRN(Local Response Normalization)이라는 국소적 정규화를 실시하는 계층을 이용
- 드롭아웃을 사용
딥러닝의 흥미로운 점은 합성곱 계층을 여러 겹 쌓으면, 층이 깊어지면서 더 복잡하고 추상화된 정보가 추출된다는 것입니다.
- 처음 층은 단순한 에지에 반응하고 이어서, 텍스쳐에 반응하고, 더 복잡한 사물의 일부에 반응하도록 변화
- 즉, 층이 깊어지면서 뉴런이 반응하는 대상이 단순한 모양에서 고급 정보로 변화
- 다시 말하면 사물의 의미를 이해하도록 변화
Reference
본 글은 '밑바닥부터 시작하는 딥러닝'을 바탕으로 작성되었습니다.
'Data Science > Deep Learning' 카테고리의 다른 글
[DL] 배치 정규화(Batch Normalization), 가중치 감소(weight decay), 드롭아웃(Dropout) (0) | 2022.03.17 |
---|---|
[DL] 신경망 학습 - 매개변수 갱신, 가중치의 초기값 (0) | 2022.03.17 |
[DL] 오차역전파법(Backpropagation) (2) | 2022.03.08 |
[DL] 신경망 학습 (0) | 2022.03.04 |
[DL] 손실함수 (Loss Function) : 오차제곱합(SSE), 교차 엔트로피 오차(Cross-Entropy) (0) | 2022.03.04 |
댓글