[대략적인 CNN 흐름도]
입력층: 데이터를 받아들이는 단계. 주로 이미지 같은 데이터가 들어옴.
합성곱층(Convolutional Layer): 필터를 통해 이미지를 분석하고, feature map(Activation Map)을 생성하는 단계.
활성화 함수(ReLU): 합성곱 연산 결과에 비선형성을 추가해 복잡한 패턴을 학습할 수 있게 하는 단계.
풀링층(Pooling Layer): feature map(Activation Map)의 크기를 줄여 데이터의 양을 줄이고, 중요한 정보만 남기는 단계.
완전 연결층(Fully Connected Layer): 지금까지 얻은 정보를 바탕으로 최종적으로 분류나 예측을 수행하는 단계.
출력층: CNN이 최종적으로 내리는 예측 결과가 나오는 단계.
CNN의 원리
Convolution Layer
필터를 통해 이미지를 분석하고, feature map(Activation Map)을 생성하는 단계
예를 들어 32x32x3 사진이 입력으로 들어왔다고 치면 Input Layer를 지나 Convolution Layer에 오게 된다.
Convolution Layer에는 5x5x3 Filter가 있다.
5x5x3 Filter가 입력 받은 32x32x3 사진을 순차적으로 훓으면서 필터가 해당 되는 이미지의 부분과 필터를 dot product 연산을 적용해서 하나의 수를 도출한다.
이런 식으로 모든 이미지를 훓는다면 28x28x1 형태의 feature mpa(activation map)이 나오게 된다.
보통 Convolution Layer는 filter를 여러개 사용한다. 그래야 각 필터에 맞는 특징을 추출해 여러 특징을 가져올 수 있기 때문이다.
filter가 6개 있다고 쳤을 때, 위 사진과 같이 28x28x6 형태의 activation map들이 나오게 된다.
각각의 필터는 해당 사진에서 특정한 부분들 (모양, 경계, 밝기 등)을 추출하고 이 필터가 만들어낸 Activation map들이 모인다면 그 데이터는 원본 이미지의 다양한 특징을 추출하고 강조한 새로운 데이터 즉, 새로운 이미지라고 할 수 있다.
이러한 방법이 1개의 Convolution Layer가 해내는 연산 과정이다. 하지만 일반적인 CNN은 Convolution Layer를 1개만 사용하지 않는다. 아래와 같이 여러 개의 Convolution Layer을 사용하는 경우가 있다.
위의 상황을 설명보자면
1. Convolution Layer(1)에서 필터를 사용해서 32x32x3 크기의 입력 이미지를 처리하면, 결과로 28x28x6 크기의 activation map이 나오게된다.
2. Convolution Layer(2)에서 필터를 사용해서 28x28x6 크기의 activation map을 입력 데이터로 받아 6개의 activation map을 분석하고, 각각에 대해 새로운 특징을 추출한다. 그 결과로 24x24x10 크기의 activation map이 나오게 된다.
3. 이런식으로 점점 추출된 map의 특징을, 또 거기서 추출된 map 특징을 찾는 식으로 점진적으로 정보를 추출한다.
CNN은 단일 층에서 복잡한 이미지를 한번에 이해할 수 없기 때문에 여러층에 거쳐가면서 정보를 추출한다.
위의 과정들을 실제 이미지에 적용되는 것을 살펴보면 아래와 같다.
filter demension
필터가 이미지를 훓는 과정을 한번 제대로 살펴보자.
이런식으로 옆으로 슬라이딩하면서 dot product를 진행해준다.
꼭 한칸씩만 움직여야할까? 아니다!
stride라는 개념이 있는데, stride라는 것은 필터가 이미지 위에 얼마나 많이 이동하는지를 정하는 값이다. 위의 이미지는 stride를 1로 설정한 것
이 stride를 2로 설정하면 아래와 같다.
무작정 stride를 높이면 좋은 것은 아니다. 아무 생각 없이 높인다면 필터가 지나가지 못하는 부분이 생긴다. 따라서 이러한 문제를 해결하기 위한 일반화된 공식이 있다.
N: 이미지의 크기
F: 필터의 크기
해당 값이 정수로 떨어지지 않는다면 사용하지 않는다.
예를 들어 이미지 크기가 7x7이고, 필터의 크기가 3x3인 경우를 보자.
- stride가 1인 경우 ➡️ ((7 - 3) / 1) + 1 = 5
- stride가 2인 경우 ➡️ ((7 - 3) / 2) + 1 = 3
- stride가 3인 경우 ➡️ ((7 - 3) / 3) + 1 =🚨 2.33🚨
Zero Padding
: Zero Padding은 레이어들을 거치면서 입력의 사이즈가 줄어드는 것을 막아준다.
❓ 줄어드면 안돼? 왜 줄어드면 안돼? ❓
얕은 네트워크라면 괜찮지만, 깊은 네트워크의 경우 점점 줄어들면서 결국 소멸하게된다. 이는 정보를 잃는 것이다.
예를 들어 7x7 이미지에 회색처럼 padding을 만들어주고 값을 모두 0으로 만들어준다. 그리고 해당 이미지와 아래의 연산을 해본다면?
((9 - 3) + 1) = 7즉, 결과 같은 7x7의 데이터가 나오게된다. 입력 이미지도 7x7이었는데 출력 데이터도 7x7이 된다.
하지만 위 방법은 3x3 필터에 stride가 1인 경우에만 해당된다. 따라서 다른 필터 크기를 사용하고 싶다면 아래와 같이 사용하면 된다.
- 3x3 필터 stride = 1
- 5x5 필터 stride = 2
- 7x7 필터 stride = 3
32x32x3 이미지를 5개의 필터를 통해서 28x28x5 크기의 activation map을 만들었다고 생각했을 때 같은 위치 예를 들면 (14, 12)에 있는 각 데이터는 32x32x3 이미지에서 같은 데이터를 토대로 도출된 데이터들이지만, 각각의 activation map의 (14, 12)끼리는 서로 다른 값을 가진다.
Pooling Layer
: activation map의 크기를 줄이면서, 중요한 정보는 유지하고 불필요한 정보는 제거하는 Layer이다.
❓Convolution Layer에서는 데이터의 크기를 줄이는게 좋지 않다고하면서, 왜 Pooling Layer에서는 데이터 크기를 줄일까?
Convolution Layer에서 데이터 크기가 줄면 안된다는건 소멸을 걱정한거고 pooling은 데이터의 연산 효율을 걱정한 것이다.
데이터를 계속 유지하면 연산 비용이 커지고, 불필요한 데이터까지 학습하는 경우가 생긴다. 따라서 중요하지 않은 데이터는 생략하는게 중요하다.
이런식으로 224x224크기의 64개의 activation map을 절반으로 112x112크기의 64개의 activation map로 다운 샘플링 하게 된다.
여기서 depth는 왜 줄지 않았냐? 라고 생각한다면 depth는 특징을 추출하는 필터의 개수이다. 하지만 그 depth를 줄인다면 기껏 추출한 필터를 없애는 것과 같은 연산이다. 따라서 depth는 유지한다.
Max Pooling
: 각 영역에서 가장 큰 값만 추출하는 방법
왜 출력 값이 2x2로 나왔는지 생각해보면 아래의 공식을 살펴보면 된다.
N은 4, F는 2, Stride는 2이기 때문에 ((4 - 2) / 2) + 1은 2이다. 따라서 2x2가 나온다.
Full Connected Layer
: 마지막 단계에서 추출된 특징들을 결합하고 최종적으로 분류하는 단계
https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html
CNN의 발전
30:35
LeNet-5(1998) - 최초의 CNN, 손글씨 인식
- Yann LeCun이 개발한 초기 CNN 모델
- 손글씨 숫자(MNIST) 인식에 사용됐고, 7개의 층으로 이루어져 있음
- Conv Layer과 Pooling Layer을 번갈아 사용했으며, Fully Connected Layer로 분류를 진행
- 이미지 인식에서 CNN의 효율성을 처음으로 입증한 모델
AlxNet(2012) - 딥러닝 대중화
- ImageNet 대회에서 압도적인 성과를 낸 모델로, 딥러닝이 크게 주목받는 계기
- ReLU 활성화 함수를 처음으로 사용해 학습 속도를 크게 향상시켰고, 드롭아웃 기법으로 과적합을 방지
- 8개의 층으로 구성됐으며, GPU를 사용한 학습이 큰 혁신
output의 사이즈는 뭔가?
227x227x3 크기의 input이 들어가고 filter는 11x11 크기가 96개 (stride는 4) 있다. ((227 - 11) / 4) + 1 = 55이다.
따라서 다음 output은 55x55x96 크기의 데이터를 가진다.
이 Layer에 있는 전체 Parameter의 수는 얼마일까?
Parameter는 가중치를 의미한다. filter는 가중치의 집합이라고 볼 수 있다.
따라서, 입력 이미치의 채널 수는 3개, 각 필터의 크기는 11x11이고 개수는 총 96개이므로 3x11x11x96 = 34,848이다.
Pooling에서 3x3 filter(stride=2)인경우 output과 Parameters의 개수는?
(55 - 3) / 2) + 1 = 27이므로 27x27x96 크기의 데이터를 가진다.
Parameters의 개수는? 0이다. 왜냐하면 Pooling Layer는 단순히 입력 데이터를 요약하는 역할을 하기 때문에 가중치와 같은 학습 대상이 없다!
이제 직접 계산해보자.
위의 사항에서 알 수 있는 것들
1. 현재는 Normalization Layer를 사용하지 않는다. ➡️ 큰 효용성을 못 느껴서
2. 층을 지날 수록 데이터 크기는 줄어들지만, depth는 늘어난다.
ZFNet(2013) - AlexNet 개선, 시각화 기법 도입
- Zeiler와 Fergus가 만든 모델로, AlexNet을 개선한 구조
- 필터 크기와 stride를 최적화하여 더 나은 성능을 달성
- 시각화 기법을 도입해 CNN이 이미지에서 어떤 부분을 집중적으로 학습하는지 이해할 수 있게 했음
- Conv1에서는 필터의 크기를 11x11에서 7x7로 낮춰주었다.
- Conv3, 4, 5에서는 depth(필터의 수) 384, 384, 256을 512, 1024, 512로 높였다.
VGGNet(2014) - 깊고 단순한 네트워크 구조
- 16~19개의 깊은 층으로 구성된 모델로, 필터 크기를 3x3으로 고정하여 더 깊고 단순한 구조를 가짐
- 네트워크 깊이를 늘리면서도, 작은 필터를 사용해 성능을 크게 향상
- 계산 비용이 높지만, 구조가 단순해서 이후 많은 모델들이 VGGNet 구조를 참고
- 이미지의 크기는 점점 줄어 들지만, 필터의 개수(depth)는 점점 늘어난다.
GoogLeNet(2014) - Inception 모듈로 호율적인 구조
- Inception 모듈을 도입한 모델로, 다양한 크기의 필터를 한 번에 적용해 더 많은 특징을 동시에 추출
- Inception 모듈이란?
- what: 여러 크기의 필터를 한꺼번에 사용하여 다양한 정보를 뽑아내는 작은 네트워크이다. 즉, 1x1 필터, 3x3 필터, 5x5 필터등 여러 크기의 필터를 한번에 사용하여 이미지를 다각도로 분석하고 그결과를 합친다.
- why: 다양한 크기의 정보를 동시에 얻을 수 있음, 효율성이 높음, 다양한 특징을 종합적으로 추출하여 더 좋은 성능을 냄.
- 22개의 층으로 구성되어 있고, 모델 복잡성은 유지하면서 연산량을 줄이는 데 중점
- 깊이와 효율성을 동시에 고려한 모델로, ImageNet 대회에서 우승
- AlexNet에 비해 12배의 적은 Parameter를 사용했지만, 2배 이상의 효율을 냈다.
ResNet(2015) - 기울기 소실 문제 해결
- Residual Learning을 도입한 모델로, 더 깊은 네트워크를 학습할 수 있게 함
- Residual Learning이란?
- 네트워크가 학습해야할 것을 Residual이라고 정의한다. Residual란 간단히 말해 기존 정보와의 차이를 말한다. 네트워크가 학습할 때, 이미 알고 있는 정보는 그대로 두고, 모자란 부분(Residual)만 학습하는 것
- Residual Learning을 사용할 때 Residual Block을 사용한다.
- Residual Block이란?
- 딥러닝 모델에서 정보를 더 효율적으로 학습하기 위해 사용하는 작은 모듈이다. 이 블록은 입력 값에 Residual이라는 보충할 부분만 추가하는 방식으로 동작한다.
- 동작 방식
- 입력 x가 들어온다.
- 몇 개의 레이어가 입력 값을 변환해서 새로운 정보 F(x)를 만든다.
- 이 새로운 정로 F(x)에 입력 값 x를 더한다.
- 그 결과를 다음 레이어로 전달한다.
- 의문점 - 입력 값을 그대로 넘겨주면 그 입력 값을 다시 학습하는 거아닌가?
- 아니다. 넘어온 원본 입력은 학습을 통해 만들어낸 새로운 정보가 원본 입력 값에 더해질 때 그 정보가 충분한지 아니면 부족한지 보완하기 위한 용도이다.
- 깊은 신경망에서 발생하는 기울기 소실 문제를 해결하기 위해, **잔차 연결(skip connections)**을 추가
- 152개의 층을 가진 모델이지만, 학습이 잘 되어 성능이 매우 우수했다. ImageNet 대회에서 우승하며 CNN의 새 패러다임을 제시
'CVLab > cs231n (2016)' 카테고리의 다른 글
2024.10.04 Q&A (0) | 2024.10.04 |
---|---|
cs231n - lecture08(Localization and Detection) (1) | 2024.10.03 |
cs231n - lecture06(Trainit NN Part 2) (0) | 2024.09.28 |
cs231n - lecture05(Trainit NN Part 1) (7) | 2024.09.28 |
2024.09.27 Q&A (1) | 2024.09.27 |