-
[CS231n] 9강 CNN ArchitecturesStudy/CS231n 2020. 12. 5. 15:37
CNN 모델들을 소개한다.
2017년 강의지만 기본적이면서 개념을 알기 좋다고 생각한다.
AlexNet, VGG, GoogLeNet, ResNet 을 소개하는 9강이다.
이 모델들은 imagenet에서 뛰어난 성적을 거둔 모델들이다.
CNN의 초창기 모델인 LeNet이다.
2012년 AlexNet이 나오면서 오차가 엄청 줄었다고 한다.
그 이후 영상 관련 CNN이 발전하게 되었다.
AlexNet
AlexNet은 최초의 Large scale CNN이다.
AlexNet의 아키텍처는 Conv layer -> max pooling -> normalization으로 구성되어 있다.
output 차원은 55차원이다.
AlexNet은 구조를 알면 좋다고 생각하서 자세히 설명하겠다.
순서대로 output size를 생각해보겠다.
처음에 input이 227*227*3이다.
96개의 11*11 filter가 conv1 이다.
stride가 4니까 이것을 계산하면
(227-11)/4 + 1 = 55
96개가 있으니까 55*55*96개다.
총 파라미터 개수는 3차원이므로 11*11*96*3이다. 계산하면 약 35K이다.
Second layer는 어떻게 될까??
2번째 layer는 pooling layer이다. 앞에서 output은 55*55*96 이었다.
55가 input으로 들어왔고 filter가 3이고 stride 가 2이므로 (55-3)/2 + 1 = 27이된다.
27*27*96이다. 앞에서 96개의 필터를 가지고 있었으니까.
여기서 파라미터의 개수는??!
0이다!! polling layer는 단순히 그 해당영역에서 큰 픽셀을 뽑아내서 이미지 전체의 size를 줄여줄 뿐이지 뭔가 계산을 하거나 하는게 아니다. 이와 관련된 설명은 앞에 CNN에서 했다.
그러므로 파라미터의 개수는 0이다.
이런식으로 계산하면 위와 같다. 자세하게 해본 것은 앞에 CNN을 복습하면서 large scale 인 CNN의 아키텍처를 배운 개념으로 공부하면서 이해하기 위함이었다. 그리고 실제로 수업에서도 하나하나 계산하면서 진행했다.
Normalization layer는 요즘 잘 쓰지 않는다. 이유는 더 좋은게 많으니까.
마지막에 Fully Connected layer 가있다.
AlexNet에 detail한 설명이다. 하나하나 보자
ReLU를 처음 사용했다.
data augmentation 또한 사용했다.
dropout은 0.5를 주었고 batch size 는 128이다.
learing rate 는 초기 1e-2 이고 val accuracy가 올라가지 않는 지점에서는 학습이 종료되지 않았으면 그 시점가지 learning rate를 1e-10으로 점점 줄여나간다.
weight decay도 사용했다. regularization 방법이다. weight가 증가하는 것을 제한하는 것이다. 그럼 모델의 복잡도가 감소한다.
마지막으로 앙상블 기법 또한 사용했다.
우리가 배운것들을 다 사용했다. 기본 개념을 충실히 알고 있자!
AlexNet에 특징 중 하나다. 모델이 2개로 나뉘어져서 서로 교차한다. 사실 96개의 파라미터가 아니고 이걸 나눠서 48개로 생각하면 된다. 이유는 메모리 용량 때문에 2개로 분산해서 넣었다고 한다.
학습을 90 epochs르 수행했고 그 당시 컴퓨터 사양으로 5~6일이 소요되었다고 한다.
위 그림은 강의에서는 설명하지 않았고 내가 가지고 있는 자료중 하나이다. groups에 따라 결과가 다름을 보여준다.
2012년 Imagenet에서 Alexnet은 우승을 했고 최초의 CNN 기반 우승 모델이다.
Alexnet이 CNN의 발전의 시작이다.
다음년도에 imageNet우승을 ZFNet이 했는데 AlexNet에 파라미터 값만 바꿔서 사용했다고 한다. 얼마나 좋은 모델이었을까..
ZFNet까지 간단히 설명하면 AlexNet과 거의 유사하다. CONV1의 크기와 stride가 바뀐 걸 확인 할 수 있고
CONV3,4,5도 바뀌었다. 2014년 이후 네트워크가 점점 deep 해지면서 VGG,GoogleNet,ResNet이 나온다.
VGGNet
Layer가 늘고 filter는 작아졋다.
VGGNet은 더 깊어지고 파라미터의 수가 적으며 큰 필터에 비해 layer를 조금 더 많이 쌓을 수 있다. depth 해진다.
3개의 3*3 conv(stride 1)을 사용하면 7*7 conv layer의 효과를 준다고 한다.
전체 layer의 파라미터를 계산한 그림이다. 메모리는 CONV3 에서 가장 많이 사용하고 첫번째 FC layer에서 파라미터를 가장 많이 사용한다.
마지막에 있는 FC7 layer는 generalize가 다른 task에 비해 잘 되어있다고 한다. 좋은 feature representation을 가지고 잇다.
GoogLeNet
2914년 classification challenge에서 우승한 모델이다. 22layer 구성된 깊은 네트워크이다.
특징은 큰 계산량을 효율적으로 처리했다는 것이다. 파라미터 개수가 Only 5M이다.
파라미터가 줄은 이유는 FC layer가 없기 때문이다.
inception module은 무엇일까??
GoogLeNet은 네트워크와 사이에 있는 또 다른 네트워크라는 개념으로 local topology를 구현했다.
local network를 inception module라고 부른다.
inception module 내부에는 다양한 필터들이 병렬로 존재한다. conv연산을 나중에 depth 방향으로 concatenate하는것이다.
합쳐지는 것이다. 그러면 계산량이 많아지지 않겠나?? 이 문제를 어떻게 잡을까??
처음에 1*1 conv를 하면 28*28*128이 된다. 1*1 conv layer의 장점이 나온다.
1*1 layer는 크기가 1이다. 하나하나 보기 때문에 가중치와 h는 변하지 않는다 . 하지만 depth는 줄여든다.
3*3 conv를 사용하면 어떻게 될까?? 여기서 zero 패딩이기 대문에 shape는 변하지 않는다. 대신 depth는 변한다.
5*5 conv도 마찬가지이다.
맨 오른쪽 3*3 pooling은 stride는 1이라서 크기는 줄어들지 않는다.
이러한 과정이 blur 효과가 있다고 한다.
좋은 feature를 뽑는다고 생각하면 된다.
마지막에 concatenate한다. 합치는거다.
outputsize는 28*28이 똑같으니까 128 + 192 + 96 + 256 하면 672가 나오는데
output의 크기가 엄청 커진다. input은 256이었으니까
이 값이 다음 layer에 들어가면 점점 더 커진다.
conv의 개수는 854M이다. 이렇게 어마어마한 양이 나오면서 계산하는게 힘들다.
depth가 점점 깊어지기 때문이다.
이 문제를 해결하기 위해 bottlenect layer를 이용한다. 입력을 낮은 차원으로 만드는 것이다.
위에서 말한 1*1 conv를 사용하는 것이다.
depath를 더 낮은 차원으로 project한다. 이를 input feature map들 간의 선형 결합이라고 한다.
inception module에서 1*1 conv를 추가한다.
이후 연산량을 보면
Total이 356M 이 나왔다. 1*1 conv를 활용해서 줄인다.
여기서 질문인데 1*1 conv 하면 image의 정보 손실은 어떻게 될까??
발생하긴 하지만 아까 말한 중복이 있는 input feature를 선형 결합을 하고 non-linear를 추가하면 네트워크가 더 깊어져서 여러모로 도움이 된다고 한다. ( 계산 복잡도 조절이 기본 이유 )
계산량이 많은 Fc layer를 없애고 파라미터가 줄어도 모델이 잘 작동한다.
FC대신에 global average pooling을 사용한다. 파란색 부분전까지 입력이 뭐가 오든 global하게 pooling을 하고
바로 classification이 가능하다고 한다.
효과적으로 feature-vector를 추출해서 이 vector들에 대한 pooling만으로 충분하다고 한다.
파라미터수가 줄어들었고 overfitting 또한 방지가 된다.
추가적인 파란박스는 보조분류기(Auxiliary classifier)라고 한다. 일종의 mini 네트워크이다. Average pooling, FC가 있다. 그리고 softmax로 classification한다. loss도 구한다고 한다.
네트워크가 깊어서 gradient를 잃어버릴까봐 보조분류기를 단다고 한다.
22 layer가 가중치를 가지고 잇다. inception module를 사용하고 FC layer는 없다.
모든 레이어는 가중치를 공유하지는 않는다.
ResNet
ResNet은 엄청나게 깊은 네트워크(152 layer)이다. residual connection을 이용한다.
모델을 깊게 쌓으면 성능이 좋아질까??
여태까지 봤을때 아니다.
그래프를 보자 56-layer 가 20-layer 보다 성능이 좋지 않다.
ResNet을 만든 사람들은 Training error가 작지도 않아서 오버피팅이 아닌 optimization에 문제가 생긴다고 한다.
모델이 깊어질수록 최적화가 어렵다.
identity mapping을 하는거다. input을 ouput으로 그대로 내보내는 방법이다.
오른쪽 입력처럼 ideintity mapping으로 그대로 출력단으로 보내고 실제 레이어는 변화량(delta)만 학습한다.
입력 x에대한 residual이다.
최종출력값 h(x) = f(x) + x(residual)
H(x)를 학습하기보다 h(x)-x 를 학습시키도록 만들어 준다. layer가 full mapping 학습보다는
x에 얼마의 값을 더하고 뺄까?? 이 값이 residual 이다. h(x) = f(x) + x 니까 f(x)즉 residual를 학습시킨다.
전체 아키텍처이다. Residual block은 3*3 conv layer로 되어있다. 이 residual block을 깊게 쌓는거다.
그주기적으로 필터를 2배로 늘리고 stride를 2로두면서 downsampling한다.
이 모델도 끝에 fully connected layer가 없고 global average pooling layer를 사용한다.
그리고 1000개의 이미지 분류를 위한 FC layer가 있다.
모델의 depath가 50이상일때, bottleneck을 도입한다.
그렇지 않으면 사용하지 앟고 3*3 layer를 반복한다.
50,101,152 layer는 파라미터가 급격하게 증가하기 때문이다.
Resnet으로 training 하는 것이다.
모든 Conv layer 다음 BN을 사용한다. 초기화는 Xavier를 사용하는데 2로 나눈 것을 쓴다.
이건 아마 ReLU 때문일 것이다.
learning rate 는 0.1로 하고 loss가 줄어들지 않으면 줄여주는 방식이다.
dropout은 사용하지 않는다. weight decay는 1e-5 이다.
SGD + Momentum으로 +로 인해 back propagation에도 좋은 영향을 미친다. 기울기 손실이 잘 안된다고 한다.
모델의 복잡성 비교이다. Inception-v4가 제일 좋은데 이는 inception module + ResNet
제일 무난한 inception 모델들이 ResNet 모델이다.
2016년에 나온 ResNet 모델은 Direct path를 늘려서 성능을 향상 시킨다. BN,ReLU를 사이에 대입한다.
정보들이 앞으로 더 전달 잘 되고 BackProb도 잘된다고 한다.
이렇게 F,K를 넣어서 wide residual network도 있다. residual block을 wide하게 만든다. F개의 filter를 F *K개의 피렅로 구성한다.
50layer만 있어도 outperform이 좋게 나온다. residual block을 깊게 했으니까
또 depth 대신에 filter의 width를 늘리면 병렬 처리가 가능해서 계산 효율이 좋아진다고 한다.
filter를 늘린다. 병렬로 block을 여러개 묶는다. layer를 병렬로 묶는 것이 inception module과도 연관이 있다.
Stochastic depth가 있는데 마치 dropout을 연상시키는 아이디어다.
동기부여는 네트워크가 깊어지면 Vanishing gradient 문제가 발생하는 부분이다. train time에 layer를 일부 제거하는것, test time에서는 모두 사용한다.
마지막 Summary다.
이상으로 9강을 마치겠다. 2017년 강의이다. 그 이후 또 많은 CNN모델들이 나왔다. 더 찾아보고 공부해야겠다.
'Study > CS231n' 카테고리의 다른 글
[CS231n] 11강 Detection and Segmentation (0) 2020.12.19 [CS231n] 10강 Recurrent Neural Networks (0) 2020.12.12 [CS231n] 8강 Deep Learning Software (0) 2020.11.27 [CS231n] 7강 Training Neural Networks II (0) 2020.11.21 [CS231n] 6강 Training Neural Networks I (0) 2020.11.14