강의 자료
오늘 배울 내용은 바로 CNN Architectures 에 대해 배워보자.
Also
우리는 이전에 LeNet-5 에 대해서 배워보았다.
이 네트워크는 손으로 쓴 숫자 인식에 사용되었고 큰 성공을 거두었다.
이제 더 많은 CNN 아키텍쳐 구조에 대해서 알아보자.
맨 처음 CNN 아키텍쳐는 바로 AlexNet이다.
아키텍쳐 구조는 위 그림과 같다.
input size : 227 x 227 x 3
Question.
first layer : 96 11x11 filters applied at stride 4
what is the output volume size?
A. (227 - 11)/4 + 1 = 55
so, 55 x 55 x 96
first 레이어에 있는 매개변수의 총 개수는 ?
11 x 11 x 3 x 96 = 35,000
이미지의 depth가 3이기 때문에 3을 곱해주어야 한다.
Second layer를 보자.
일단 첫번째 conv1 를 통한 사이즈는 55 x 55 x 96 이다.
이 레이어는 풀링 레이어이다.
(POOL1): 3x3 filters applied at stride 2
Output Volume Size가 뭘까?
(55 - 3)/2 + 1 = 27
so, 27 x 27 x 96
What is the number of parameters in this layer?
pooling layer에는 매개변수가 없다.
매개변수란, 우리가 학습하려는 가중치를 의미한다. 하지만 풀링 레이어에서는 그저 이미지를 축소하기 위함이기 때문에 모든 작업에 규칙이 있고, 학습을 필요로 하지 않는다. 따라서 풀링 레이어에는 매개변수가 없다!
모든 층에 대해서 위 작업을 수행하면 volume size를 구할 수 있다.
AlexNet은 2개의 NVIDIA GTX 580 GPU를 사용해서 학습시간을 단축시켰다.
당시에는 매우 혁신적인 방법이라 한다. GPU는 병렬 처리 능력이 뛰어나서 대량의 데이터를 빠르게 처리한다.
CONV1, CONV2, CONV4, CONV5 연결은 같은 GPU에서 실행했다.
AlexNet은 2012년 ILSVRC에서 우승해서 주목을 받았다. 기존 모델들에 비해서 훨씬 낮은 오류율을 기록했다.
14년도를 보면 이전 레이어와 다르게 훨씬 더 깊은 networks를 구성한 것을 알 수 있다.
VGGNet은 2014년 옥스퍼드 대학에서 개발된 CNN이다.
기존 AlexNet은 8개의 layer로 구성되어 있는 반면, VGG16Net의 경우에는 16개의 Layer로 구성되어있다.
VGG19Net의 경우에는 19개의 Layer로 구성되어 있다.
그리고 합성곱 층에서 오직 3x3 크기의 작은 필터를 사용한다.
최대 풀링은 2x2 크기이며 stride는 2이다.
그럼 왜 작은 필터들을 사용했을까? (합성곱층에서)
A. 모델의 학습 효율성 대문이다. 파라미터 수를 최소화할 수 있다. 만약 5x5 크기의 필터를 사용한다면 25개의 파라미터의 숫자가 필요하지만 3x3 크기의 필터 2개를 사용해도 파라미터의 숫자는 18개이기 때문이다.
Stack of three 3x3 conv (stride 1) layers
has same effective receptive field as
one 7x7 conv layer
-> 이말인 즉슨 3개의 3x3 컨볼루션 레이어는 하나의 7x7 컨볼루션 레이어를 가지는 것과 같은 유효 수용 필드를 갖는 것이다.
What is the effective receptive field of
three 3x3 conv (stride 1) layers?
7 x 7 이다.
이해하기 쉽게 그림을 그려보았다. 나같은 사람은 직접 해봐야 직성이 풀리는 사람이라 직접그려보니 이해가 되었다.
그럼에도 effective receptive field는 동일하지만 파라미터의 수를 비교하면
3 x vs
C는 레이어당 채널 수.
훨씬 3x3 크기 3개가 더 적게 파라미터가 필요한 것을 알 수 있다.
모든 층에서 메모리랑 파라미터의 숫자를 보면 위와 같다.
총 메모리는 24M 8 4byptes ~= 96MB / image 이고
총 파라미터 수는 138M 이다.
대부분의 메모리는 초기 컨볼루셔널 층에서 사용되었고 대부분의 파라미터들은 마지막 FC 층에서 사용된다.
Details:
GoogLeNet은 2014년 구글 연구팀에 개발된 CNN 아키텍쳐이다.
이 모델에서 특이한 점인 '인셉션 모듈'이라는 독특한 구조를 가지고 있다는 점이다.
GoogLeNet에서 중요한 Inception Module이 대체 무엇인가?
이 모듈은 다양한 크기의 컨볼루션 연산과 풀링 연산을 병렬적으로 수행하고 그 결과를 합치는 구조이다.
Q: What is the problem with this?
[Hint: Computational complexity]
그럼 인셉션 모듈은 단점이 없는가? 아니다.
input module은 28 x 28 x 256 이라 하자.
일단 처음 1x1 conv 레이어에 대해서 결과 size는
28 x 28 x 128 이 된다.
두번째 conv layer를 보면 3x3 크기가 192개이다. output size는 28 x 28 x 192이다.
여기서 zero padding 을 더해서 크기가 줄어들지 않았다고 한다.
그래서 총 output filters를 다 더해서 보면
최종 size는
28 x 28 x (128 + 192 + 96 + 256) = 28 x 28 x 672 이다.
그럼 계산량은 얼마나 될까?
계산해보면 총 854M ops를 계산한다. (8억5천4백)
매우 expensive 계산이다.
그리고 문제는 점점 더 많은 depth가 생겨난다는 것이다.
그래서 구글이 제시한 해결 방법은 바로 bottleneck이다.
bottleneck은 병목현상인데, 우리는 1x1 conv layer를 사용해서 feature map의 depth를 줄이는 것이다.
이전에 5강에서 cnn에 대해 자세히 배웠는데, 이때 사용한 ppt를 보자.
input 은 56x56x64 이고 32개의 1x1 conv layer가 있다고 하자.
하나의 필터는 1x1x64 인 것이다. 64개의 가중치가 있는 것이다. 그래서 1:1 대응 하고 64개를 곱하고 더한다음 하나의 픽셀이 되는 것이다.
그림으로 이해해보자.
1x1 합성곱은 그래서 depth를 줄이기위해 사용된다.
총 output은 56x56x32가 된다.
그래서 1x1 conv layer를 추가한다.
이를 bottleneck layers라고도 한다.
그럼 얼마나 계산량이 줄었을까?
3억 5천 8백만개의 계산이다.
이전 854M 번의 계산과 비교하면 확실히 줄었다는 것을 알 수 있다.
구조를 살펴보자.
일단 GoogLeNet의 초기 부분을 보면 여러개의 networks가 있다.
이를 Stem Network이라 한다.
다음과 같은 구조를 가지고 있다.
1. 합성곱
2. 최대 풀링
3. 2개의 합성곱
4. 최대 풀링
이러한 구조는 이미지에서 초기 고차원 특징들을 추출하고 네트워크 뒤부분에 있는 inception module이 더 복잡하고 정교한 특징을 추출할 수 있도록 기반을 만든다.
초기 단계에서 이미지의 크기를 줄여서 전체 계산량을 효율적으로 만든다는 것도 있다.
그리고 마지막 부분에서는 비싼 FC 레이어를 제거하고 대신에 분류기를 사용한 것을 알 수 있다.
그림은 화질이 안좋아서 뭐라 적혀있는지 안보인다. 다시 적자면,
그리고 보조 분류기를 사용했다. 이들은 네트워크의 그래디언트 소실 문제를 완화한다. 하지만 최종 예측에서는 보조 분류기들의 출력이 사용되지 않는다고 한다.
그러니까 우리가 역전파를 실행할 때, 너무 깊은 층의 네트워크에 대해서는 당연히 역전파 기울기를 구하기 어렵다.
그래서 중간 중간 보조 분류기를 넣어서 기울기를 저장하는 개념으로 나는 생각했다.
하지만 GoogleNet Inception-v4에서는 보조 분류기를 사용하지 않았다.
그 이유는
등등의 이유로 보조 분류기는 사용되지 않는다고 한다.
그리고 2015년에 Microsoft Research 에서 개발된 CNN인 ResNet에 대해 알아보자. 이 신경망 아키텍쳐는 15년 ILSVRC 우승자이다.
이 residual connections을 사용해서 신경망이 더 깊어질수록 학습이 어려워지는 문제, 손실되는 기울기 문제를 해결했다.
(이전 224n의 transformer 구조에서 살짝 다루었다.)
손실되는 기울기 문제가 왜 일어나는지는 다음 블로그를 참고하자.
[DL] Exploding & Vanishing Gradient 문제와 Residual Connection
연구자들은 깊은 네트워크에서의 Training error 와 Test error를 비교했다. 오히려 깊은 네트워크의 오류율이 낮은 네트워크보다 더 높았다. 하지만 Train과 Test의 차이가 그렇게 크지 않은 것을 보아서 Overfitting 문제는 아니라고 생각했다.
그래서 가설을 세웠다.
문제는 최적화 때문이다. deeper 모델일 수록, 더 최적화 하기 힘들다.
더 깊은 모델은 얕은 모델만큼의 성능을 가져야만 한다. 그래서 방법이 바로 identity mapping을 해서 추가 레이어를 더하는 것이다.
그래서 여기 H(x) = F(x) + x
로 둘 수 있다.
왼쪽 그래프를 풀어 오른쪽 그래프로도 나타낼 수 있다.
(그림 출처: https://towardsdatascience.com/what-is-residual-connection-efb07cab0d55)
50개 이상의 층을 가진 네트워크에는 bottleneck을 사용해서 효율성을 증가시켰다.
1x1 conv layer를 추가했다.
ResNet은 사람보다 더 좋은 성능을 보였다고 한다.
사람의 이미지넷 분류 오류율이 5%라면 ResNet은 3.6%라고 한다.
아키텍쳐들을 종합해서 비교해보자.
지금까지 4개의 아키텍쳐만 보았다면 이제는 다른 것들도 간단하게 살펴보자. 여기서는 집중적으로 어떤 아키텍쳐인지 보는 것은 아니고, 그저 이런것이 있다~ 이정도만 보고 지나갈 것이다. 더 궁금한 점이 있다면 알아서 논문을 참고하자.
Network in Network이다.
여기서 중요한 점은
기존 ResNet의 residual block의 conv layer의 크기를 늘렸다. 그래서 계산 효율성을 늘렸다.
이것 또한 ResNet을 활용한 것이다.
더 많은 Residual block을 추가했다. 어떻게 보면 Inception moudle 처럼 보이기도 한다.
소멸되는 기울기를 줄이고, 훈련 시간을 단축시키기 위해 랜덤하게 몇몇의 layer의 subset들을 drop 한다.
그래서 identity function으로 bypass 하는 것이다.
output에 대해서 얕은 네트워크와 깊은 네트워크 모두 있는 구조이다.
여기서는 residual connections가 필요하지 않다고 주장한다.
훈련할 때는 몇개의 sub path들을 drop out 하고 전체 네트워크를 한 테스트 시간에 실행한다.
Squeeze 부분과 expand 부분으로 구성되어 있다.
Squeeze 부분은 1x1 conv layer로 구성되어 있고 expand 부분은 1x1과 3x3 conv layers 로 구성되어 있다.
AlexNet과 비교해서 50배 적은 파라미터를 사용하지만 성능은 비슷하고 또한 510배 크기를 줄였다고 한다. (0.5Mb)
Dense Block을 만든다.
Dense Block을 각각의 층에 연결한다. 그래서 소실되는 기울기를 완화시키고 feature prpagation, feature reuse를 강화시킨다.