📚 CNN 기본 개념
✅ 이미지 처리에 일반 신경망 적용 시 문제점
① 공간 정보의 손실
FNN(Feed Forward Neural Network)에서는 원래 input 데이터를 reshape 해서 일차원으로 변경한 후에 입력한다.
하지만, 원본 데이터를 row 단위로 자르고 변환하는 과정에서 이웃 픽셀의 정보(spatial information)를 제대로 사용하지 못하기 때문에 정보 손실이 발생한다.
② 파라미터의 수 증가
예를 들어, 1000 x 1000 크기의 컬러 이미지의 input 노드의 수는 1000 x 1000 x 3 = 3,000,000개이다.
첫 번째 은닉층에 은닉 노드가 100개라고 하면, 입력 층과 첫 번째 은닉층의 가중치 파라미터는 3백만x100=3억개가 된다.
3억 개의 파라미터를 모두 적절하게 튜닝할 수 있는 데이터를 확보하기가 어렵기에 과적합 가능성이 높아진다.
위의 예시에서 3x3 이미지를 처리할 때, 일반 신경망의 경우 9x4=36개의 가중치가 존재하지만, 합성곱 필터를 이용하면 가중치가 4개만 존재하기 때문에 연산이 훨씬 빠르다.
✅ CNN 이란?
CNN은 Filter(kernel)라는 개념을 사용해서 앞선 문제점들을 해결한다.
•FxFxD의 형태의 필터를 사용하는데, F는 가로 또는 세로의 길이를 의미하고 보통 3을 사용한다.
•Depth 값은 입력된 이미지의 depth와 동일한 값으로 자동으로 설정된다. 따라서 칼라 이미지는 D=3, 흑백 이미지는 D=1로 설정된다.
• 필터의 각 셀은 고유의 가중치를 가지고 있는데, 해당 가중치는 변하지 않는다. 따라서 FNN 보다 파라미터 수가 감소한다.
📌 CNN 작동 방식
위와 같이 좌측의 5x5 크기의 흑백 이미지에, 우측의 3x3 크기의 필터를 적용하는 경우를 예시로 들면
이미지의 각 부분에 대해서 필터가 돌아가면서 정보를 추출한다.
필터가 돌아가면서 정보를 추출할 때, 필터가 적용된 이미지 부분의 색상 정보와 필터의 가중치 간에 내적 연산을 실행해서 하나의 스칼라 값을 도출한다. 이 과정을 합성곱이라고 한다.
셀 간의 합성곱을 시행한 후에 편향을 더한다. CNN 에서는 편향이 각 필터마다 생성된다.
(cf.FNN에서는 각 레이어마다 편향 노드가 있음)
그리고 z11 값에 활성화 함수를 거쳐서 최종 값을 추출한다. 이미지 데이터의 경우 일반적으로 활성화함수로 relu를 사용한다.
CNN의 작동 방식을 정리하면 위와 같다. 내적 연산 후 편향을 더하고 활성화 함수를 거친 값을 모아둔 매트릭스를 Activation Map 또는 Feature Map, Response Map 이라고 부른다.
Activation Map의 크기는 필터의 크기와 동일하다.
이렇게 생성한 Activation map은 또 하나의 이미지 데이터로 볼 수 있는데, CNN 에서는 이렇게 필터를 여러개 거치는 과정을 반복해서 이미지 데이터의 특징을 추출한다.
이 과정을 통해서 정답을 맞추는 데에 유용한 정보들을 단계마다 추출한다.
1차적으로는 raw한 형태의 정보가 추출되고, 여기서 다시 정보를 추출하는 과정을 반복하면서 정답을 예측하는데에 중요한 특성들을 정확하게 추출할 수 있다.
📌 편향(bias) 추가
합성곱 신경망에서도 편향 노드를 추가할 수 있으며, 필터를 적용해서 합성곱을 실시한 이후에 편향이 더해진다.
✅ Stride 개념
filter가 이미지 데이터 위에서 한 번에 몇 픽셀을 움직이는지를 의미하는 파라미터이다.
stride = 1인 경우에는 activation map의 크기가 3x3이 된다. 반면 stride = 2인 경우에는 2x2로 생성된다. Stride 값을 키우면 결과로 나타나는 activation map 의 크기가 작아진다.
activation map 크기가 작아진다는 것은 컴퓨터가 연산해야 하는 데이터의 양이 줄어든다는 것을 의미하기 때문에, 데이터가 큰 경우에 사용된다. 하지만 stride가 커지면 추출되는 정보의 양이 감소하기 때문에 성능이 떨어지는 tradeoff가 발생한다.
✅ 3차원 이미지에서 적용
필터의 depth(=개수)는 이미지에 따라서 자동으로 정해진다. 32x32 픽셀 형태의 칼라 이미지가 있을 경우 필터의 depth=3으로 자동으로 설정된다.
여기에 5x5x3 필터를 적용하는 경우에 사용자는 F 값인 5만 설정한다. 총 75(=5*5*3)개의 셀이 필터에 존재하고 이는 해당 필터에 편향을 포함해서 가중치가 75+1개임을 의미한다.
컬러 이미지도 마찬가지로 depth=3인 필터가 stride에 따라서 옮겨가면서 내적 연산을 수행한다.
각 필터가 합성곱을 시행하면 원래 데이터와 필터의 depth와 관계없이 무조건 1로 축소된다. 내적 연산을 하면 차원과 관계없이 하나의 값만 리턴하기 때문이다.
32x32x3이미지에 5x5x3 필터를 적용하면 28x28x1의 activation map이 출력되는것을 확인할 수 있다.
+) 추가설명
3차원인 컬러 이미지에 대해서 depth=3인 필터를 이용해서 합성곱을 실시하는 과정은 위와 같다. 각 RGB채널 간의 필터 크기는 동일하다. 각 채널에서 합성곱 연산을 마치면, 그 결과를 모두 더해서 하나의 채널의 activation map 으로 만든다. 단, 위 그림에서는 3개의 커널이 적용된 것이 아니라, depth=3 인 커널이 1개 적용된 것으로 이해해야 한다.
✅ 여러 개의 필터를 사용하는 경우
하나의 이미지에 여러 개의 필터를 적용할 수 있다. 각 필터는 서로 다른 파라미터를 가지고 있다.
필터 1,2는 9개의 픽셀 가중치와 1개의 편향을 포함해서 총 10개의 파라미터를 가진다.
Activation Map의 depth는 모두 1이다.
전체 이미지에 K 개의 필터를 적용하면 K개의 activation map이 생성되고 각 맵의 depth는 모두 1로 동일하다.
이 맵들을 쌓으면 depth가 3개인 새로운 activation map을 생성할 수 있다.
이렇게 depth 방향으로 쌓기 위해서는 가로세로 크기가 모두 동일해야 하기 때문에 필터의 크기를 모두 동일하게 일치시켜줘야 한다.
32x32x3의 컬러 이미지에 5x5x3크기의 필터를 6개 적용하는 경우, 처음 출력된 activation map(파란색)의 depth는 6개가 된다.
가로세로 크기는 (N-F)/stride + 1를 이용해서 계산한다(32-5/1 + 1 = 28).
여기서 다시 5x5x6 크기의 필터를 10개 적용하면 두 번째 activation map(초록색)이 출력되고 F=24, D=10이 된다.
이 과정을 다른 그림으로 살펴보면 아래와 같다.
사용되는 필터의 수가 1개인 경우에는 위와 같이 특성맵이 1차원으로 출력된다.
사용되는 필터의 수가 C0 개인 경우에는 출력된 특성맵의 차원이 C0개가 된다.
여기서 커널의 차원 Ci는 입력 데이터와 동일하게 자동으로 설정되는 것이기 때문에 출력되는 특성맵의 차원에는 영향이 없다.
📌 activation map의 크기
Input, Filter, Stride 값을 알면 합성곱 연산을 통해서 계산되는 특성맵의 크기를 계산할 수 있다.
여기서 floor는 소수점을 버리는 역할이다. 만약 폭이 P인 패딩이 추가된다면 아래 식으로 수정한다.
✅ Padding
✔ 필터를 통한 이미지 추출 과정에서 정보 손실을 막기 위해서, 테두리에 임의로 셀을 추가해서 필터가 가장자리의 이미지의 특징도 잘 추출할 수 있도록 하는 것.
위와 같이 7x7 크기의 이미지에, 3x3 크기의 필터를 stride=1으로 설정하면 (7-3)/1+1 = 5 으로 5x5형태의 activation map이 출력된다.
만약 stride=2이라면 (7-3)/2 + 1 = 3 으로 3x3 형태의 activation map이 출력된다.
그런데 stride=3인 경우에 activation map의 크기가 (7-3)/3+1=2.3333 으로 계산되는데, 그림으로 그려보면 가장 우측의 필터가 이미지의 정보를 추출할 때 6개의 셀이 비어있기 때문에 남아있는 3개의 셀의 정보도 추출할 수 없게된다.
따라서 3개의 픽셀의 값에 대한 정보를 추출하기 위해서 임의의 값을 6개의 셀을 채워주는 것을 Padding 이라고 한다.
따라서 0으로(검정색)으로 채우는 zero padding 을 실시하면 위와 같이 이미지를 9x9형태로 변경할 수 있고 stirde=3인 3x3 필터를 적용해도 정보손실이 발생하지 않는다.
padding은 이미지의 가장자리에 중요한 정보가 있을 경우 유용하게 사용할 수 있다. 일반적으로 필터가 옮겨가면서 정보를 추출할 때 가장자리의 이미지는 적게 추출되기 때문에, 가장자리를 0으로 채우면 원래 이미지의 정보를 더 잘 반영할 수 있게된다.
✅ Pooling
일반적으로 합성곱 층(합성곱 연산+활성화 함수) 다음에는 풀링 층을 추가한다. 풀링은 activation map에 대해서 down sampling을 실시해서, 전체 정보 중에서 일부의 정보만 선택해서 다음 층으로 넘기는 것을 의미한다. 연산량을 줄이고 학습의 속도가 빨라지지만, 정보 손실이 발생하는 tradeoff가 있다.
① Max Pooling
: 필터가 적용된 영역에서 가장 큰 값만을 추출하는 방식
•빨간색 영역에서 가장 큰 값은 6이기 때문에 6 추출.
•pooling 에서는 별도의 필터를 사용하고, pooling에서 사용되는 필터의 stride 값은 필터의 가로세로 길이와 동일함.
이 그림에서는 2x2 필터를 사용하고 있기 때문에 stride=2 이다.
원래 4x4 크기의 이미지가 max pooling 을 실시 후에 2x2 형태로 감소한것을 확인할 수 있다.
② Average Pooling
: 필터가 적용된 영역에서 평균값을 추출하는 방식
✔ 이미지 예시
• 일반적으로 이미지에서 중요한 정보들은 밝은 영역에 많이 포함되어 있다. 따라서 max pooling을 이용하면 큰 숫자가 남게되고, 이는 더 밝은 색을 의미한다. 따라서 max pooling은 배경이 어둡고 관심 있는 대상이 밝은 경우에 더 유용하게 사용할 수 있다(MNIST). 대부분 max pooling이 많이 사용된다.
• Average pooling은 이미지를 부드럽게 하는 효과가 있다. 경우에 따라서 사용된다.
• Min pooling도 존재하는데, 필터가 적용하는 영역에서 가장 작은 값(어두운 색)을 추출하는 방식이다.
③ Global Pooling
• 각 채널의 activation map에서 하나의 값을 추출함
•이미지 크기와 동일한 크기의 필터를 적용해서 전체 activation map에서 한 개의 값만을 추출하는 방식
✅ Flatten (평탄화)
CNN의 전체 과정은 위와 같다.
일반 신경망과 동일하게 분류를 할 때 최종 출력층에서 각 클래스에 속할 확률이 추출된다. 이 값은 1차원 형태이다.
하지만 노란색 네모 부분에서 여러번 필터를 거친 activaiton map 의 형태는 3차원 형태이다.
따라서 3차원 형태의 데이터를 1차원 형태로 변경해야 은닉층의 입력 값으로 사용할 수 있다.
이 과정을 Flatten(평탄화) 라고 부른다.
📚 Reference
• 연세대학교 디지털사회과학센터(CDSS) 파이썬을 활용한 딥러닝 기초 워크숍, 이상엽 교수님
• http://cs231n.stanford.edu/slides/2016/winter1516_lecture7.pdf
'머신러닝, 딥러닝 > 딥러닝' 카테고리의 다른 글
CNN 사전학습 모델 - LeNet / AlexNet / VGGNet / InceptionNet / ResNet / DenseNet / MobileNet / EfficientNet (0) | 2022.01.17 |
---|---|
RNN(순환신경망) 기본 (0) | 2022.01.14 |
딥러닝 기본 개념 - 신경망 구조, 활성화 함수, Optimizer (0) | 2022.01.11 |
딥러닝 기본 개념 - 비용함수, 경사하강법, 규제 (1) | 2022.01.10 |
딥러닝 기본 용어 정리 (0) | 2021.10.25 |
댓글