일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 데이터모델링
- 코딩테스트
- 케라스
- Python
- CNN
- mnist
- machinelearning
- 머신러닝
- Deeplearning
- 빅데이터분석기사
- AI
- 파이썬
- ComputerVision
- TensorFlow
- 통계
- 데이터사이언스
- 데이터분석가
- 텐서플로우
- 컴퓨터비전
- 빅분기
- 의학통계
- 딥러닝
- 데이터EDA
- resnet
- 인공지능
- 빅분기실기
- 의학논문
- Keras
- 데이터분석
- 데이터전처리
- Today
- Total
Be Brave, Be Humble
딥러닝 리뷰 1: ImageNet (2012 AlexNet ~ 2016 ResNet) 본문
딥러닝의 역사에 ImageNet 대회 이야기가 빠질 수 없음. 따라서 ImageNet 관련 논문 중심으로 리뷰해보고자 함.
2012년 Convolution Network의 시초라 할 수 있는 AlexNet부터 최근 SOTA까지 포스팅할 예정이며, 이번 포스팅에서는 2016 ResNet까지 다룸. 모든 개념을 상세히 설명하지는 않으며, 각 논문에서 사용된 테크닉과 문제점에 기반하여 발전 흐름을 수식없이 정리한 포스팅임. (러닝 테크닉이나 추가 논문 리뷰은 꾸준히 따로 포스팅 할 예정이고 오늘은 큰 개요만 정리함.) 발전 개요를 한국사처럼 시간 순으로 정리할 것임. 왜냐하면 이전 논문에 기반하여 다음 논문의 테크닉이 발전하고 있기 때문!
+ 워드패드로 작성한 것을 복붙하는데.. 도대체 왜 문장별로 글씨 사이즈가 조절이 안 되는 걸까? 가독성 제로네 정말..
[ 2012년 AlexNet ] ImageNet Classification with Deep Convolutional Neural Networks
ReLU, Drop-out, GPU 등 사용하여 압도적인 1위를 거머쥐며 현대 컨볼루션 뉴럴 네트워크의 시초가 됨.
1) ReLU
* non-saturated => Gradient Vanishing 문제를 '어느 정도' 소실 시킴 + 학습속도가 빠름
saturated(포화): 더이상 커지지 않기 때문에 그래디언트가 0이 되는 문제를 동반함. (=Gradient Vanishing)
* ReLU는 음수는 0을 양수는 그대로 출력하는 성질을 가지며, sigmoid에 비해서 그래디언트가 아주 간단함. 따라서 학습 속도가 빠름.
* Dead neuron(= dying ReLU): ForwardPropagation 과정에서 어떤 뉴런에 input으로 음수가 들어오면 BackPropagation에서 weight에 무조건 0을 곱하게 되므로 뉴런이 완전 죽어버림.반면 sigmoid는 0에 가까운 수이지 0은 아니기 때문에 다시 살릴 수 있음). 그래디언트가 0이 되는 문제 때문에 이것 때문에 최근 GAN 등 에서는 Leaky ReLU를 쓰는 것임. 기본 모델에서는 아직 계속 쓰이지만 이전만큼 쓰이진 않음.
++ BackPropagation은 체인룰에 의해 기울기를 역으로 계산하면서 오차에 대한 가중치 값의 영향력에 비례하여 가중치를 수정하는 방식임. 이 때 사용되는 함수가 sigmoid나 ReLU. 신경망이 딥해질수록 BackPropagation에 의해 출력값이 누적으로 곱해지는데 0~1사이 값을 출력값으로 가지는 sigmoid 성질 때문에 0으로 수렴하게 되니 가중치의 영향력을 비교하기가 힘들어짐. 이를 기울기 소실 현상이라고 함.
* Numerical stability: 결과를 보장해야하는데 ReLU는 Gradient Exploding현상 때문에 normalization을 함께 사용하지 않으면 크게 성능 향상을 못 함 -> 따라서 당시에는 가장 인기있던 Local Response Normalization(LRN)을 사용함.
하지만, AlexNet을 기반으로 2013년 ZFNET팀에서 이미지 비쥬얼라이징 통해서 하이퍼 파라미터을 튜닝해보니 LRN이 별 효과가 없었음. 이 때부터 LRN의 효과 의심 받음. 이후 2014년 VGG팀에서 실험을 함. LRN을 쓴 모델과 쓰지 않은 모델을 비교했더니 성능 차이가 없었음. LRN이 효과가 없음을 증명함. 따라서 이후에 LRN 기법은 쓰지 않게 됨.
현재는 이 Gradient Vanishing를 다루기 위해 'ReLU + Batch normalization'을 함께 사용함!
vision transfomer 때문에 layer normalization도 있었지만 이런 러닝 테크닉은 이후 포스팅에 따로 다루겠음.
++ Gradient Exploding: 기울기가 점차 커지더니 가중치들이 비정상적으로 큰 값이 되면서 발산
2) Overlapping Pooling
* 추후 소개할 InceptionV2 논문에서 representational bottleneck (표현력 감소)라는 말이 나옴. 경사도 기반 학습 알고리즘을 CNN에 적용하여 딥러닝의 붐을 가져온 Y. LeCun은 max pooling을 사용하면 invariance를 보존한다는 장점을 가진다고 주장. Hinton(AlexNet 저자)는 max pooling은 잘못된 방법이며 invariance가 아닌 equivariance를 다뤄야하니 overlapping pooling이 적절하다고 주장. 왜냐하면 convolution 연산은 이미지에서 특징의 위치를 반영하니까. Filter size 2x2에 stride 2로하면 반으로 크기가 줄어드는데, 3x3 filter에 stride 1로 해도 반으로 줄어드는 것처럼 이렇게 겹치게 풀링하면 overfit이 약간 덜 생기며 위의 문제를 상쇄시킬 수 있다고 주장.
* 하지만 두 학자의 싸움이 무색하게도 현재는 아예 pooling없이 stride 트릭을 쓰는 게 트렌드! 이것도 추후 트릭 포스팅에 다루겠음.
++ invariance: 통계 배웠으면 알텐데, 불변성으로 함수의 입력이 바뀌어도 출력이 바뀌지 않는 걸 뜻함. CNN에서는 입력이 입력의 위치가 되는 것임. 즉, 고양이가 이미지의 오른쪽에 있건 왼쪽에 있건 고양이를 출력함. Max pooling은 small translation invariance 함수임. 픽셀 값 중 가장 큰 값을 뽑아내기 때문에 [1,0,0]이나 [0,1,0]이나 같은 출력값을 가짐. 따라서 고양이가 약간 다른 위치에 있어도 고양이를 출력함.
++ equivariance: invariance와 반대 개념임. 입력의 위치가 바뀌면 출력도 변함. vision 고급 포스팅에서 다룬 적 있는데, conv 연산은 이미지에서 특징의 위치가 중요하기 때문에 이 equivariance 특징을 가지고 있음. 캡슐 네트워크 논문에서 잘 다루고 있는데, 얼굴을 상상해보자. 눈이 아래에 있고 코가 위에있고 입이 가운데에 달리면 이건 사람의 얼굴이 아님에도 invariance는 이걸 얼굴이라고 판단하게 되는 것임.
3) Group Convolution
* 당시엔 GPU 성능이 적어서 multiple GPU를 사용하기 위해 'group convolution'을 사용하여 입력의 채널을 여러 개의 그룹으로 나누어 병렬처리함. 하이퍼 파라미터를 줄인다는 장점이 있었음.
* 현재는 여기서 힌트를 얻어 경량화 모델에 이 기법을 가져다 씀.
4) Fully Connected
* 해당 논문에서는 5개의 conv층과 3개의 FC가 사용됨. 당시엔 FC가 predict 에 영향을 준다고 생각해서 FC를 최소한 3개로 했는데, 이후 소개할 2013년 논문에 파라미터만 증가시키고 좋지 않은 기법이라고 밝혀짐.
5) Over Fitting에 관한 내용들 (Drop-out, Augmentation)
* 오버피팅에는 aleatory overfitting과 epistemic overfitting 두 종류가 있음. 각 종류에 따라 테크닉이 달라짐. (추후 포스팅..ㅎ) 아무튼 두 경우 모두 데이터가 많으면 overfitting 현상을 줄일 수 있음. 따라서 data augmentation을 빡세게 함. RGB PCA (zero centered) 써서 데이터를 뻥튀기 함.
현재는 2^11만큼 augmentation 하는게 일반적인 테크닉임. (좌우반전 2배x상하반전2배.... 등 2^11)
* Drop-out 사용함. 하지만 현재는 Drop-out이 레이어가 깊을 때 BN과 함께 쓰면 효과가 없다는 것이 ResNet 논문에서 밝혀짐. 따라서 최근 vision 분야에서는 Drop-out을 일부만 (딥하지 않은 경우만) 씀. Drop-out 막 가져다 쓰면 오히려 under fitting 현상이 생김.
하지만 Drop-out은 앙상블로써 성능효과와, catastrophic forgetting 막는 효과가 있음. (어제 배운 거 오늘 다 까먹는 뉴럴 네트워크에서 생기는 대재앙.. 마치 나처럼..ㅎ) => 2012년의 Drop-out과 현재 2022년의 Drop-out은 관점이 다르다는 게 정말 재밌는 것 같음. 그렇지 않나요?ㅎㅎ
6) Optimizer
* 최근 우리는 Adam으로 fit하는데, 이 2012년 논문은 Stochastic Gradient Momentum 씀. 러닝 테크닉임.
* 당시 Batch size가 아주 중요했음. 왜냐? 배치 사이즈가 작으면 업데이트를 많이 해야하기 때문에 데이터가 클 때 학습에 시간이 오래 걸림. 근데 배치 사이즈가 크면 학습은 빠른데 정교하지 못했음. 현재 SOTA는 배치 사이즈가 256 이상이지만, 이렇게 큰 배치 사이즈를 정교하게 학습할 수 있는 테크닉이 2017년부터 나옴.
아무튼 AlexNet에선 batch size 128, momentum 0.9, weight decay 0.0005 사용함. 이 기법이 2015년도까지 감. Adam과는 비교도 안 되게 최적화를 잘 시킴. 그런데 weight decay가 regularizer가 아니라 training error를 줄임. initialize 씀. 휴리스틱하게 상황을 보고 밸리데이션 에러가 줄어들지 않으면 러닝레이트를 1/10씩 수동으로 줄였음.
++ weight decay는 weight이 증가하는 것을 제한하여 모델의 복잡도를 감소 시킴. 즉 weight가 커질경우에 대한 패널티 항목을 줘서 overfitting을 막음. 패널티로는 이전에 딥러닝 Intermediate에 포스팅한 L1-regularization, L2-regularization.
* 5CNNs 이런 모델에서 의미하는 s는 앙상블을 의미함. SOTA 모델에선 앙상블 안 쓰는 경우는 없음. 이 논문에선 model averaging기법을 사용하여 성능을 올림. 이 기법은 후에 Y. LeCun이 오마주하는데, image classification에서 한 이미지에 달마시안과 체리가 있으면 체리인지 달마시안인지를 맞추는 데에 큰 기여를 함. 즉 이 논문이 좋은 논문이라는 정당성이 인증됨.
[ 2013년 ZFNet ] visualizing and understanding convolutional networks
* 컨볼루션 뉴럴 네트워크를 비주얼라이징 해서 비밀을 밝혀냄.
* 2012년 AlexNet 논문에는 모든 방법론에 '왜' 그런지 설명이 없음. 오로지 실험을 통해 결과만 전달함. '블랙박스 모델이니까 당연한 거 아냐?'라고 할 수 있지만 ZFNet 팀이 '왜'를 밝혀냄.
* 앱스트랙: AlexNet은 라지 컨볼루션 모델(그 때 기준ㅋㅋ)이 왜 좋은지 설명이 없다. 블랙박스인 줄은 알지만 그래도 비주얼라이제이션을 통해 이해하면 조금 더 성능을 올릴 수 있을 것이다. 따라서 Deconvnet이라는 테크닉을 통해 컨볼루션 레이어 작동에 대한 인사이트를 얻어 성능을 높였다. 따라서 이걸 진단이라고 한다. 또한 ablation study를 했다.(여러 실험 반복했단 뜻인듯) 하이퍼 파라미터만 몇 개 수정했더니 훨씬 더 성능이 좋았다.
* Deconvnet => 디컨볼루션. transpose convolution을 써서 실제 컨볼루션의 반대되는 연산을 수행함. 컨볼루션을 할 때 max pooling을 하는데 그냥 max pooling이 아니라 어떤 위치에서 max pooling 했는지 위치값을 같이 저장함. 따라서 conv하고 pooling 했던 과정을 트랜스포즈 컨볼루션 통해서 실제 값으로 복원함. 복원할 때 위치값이 있으니 그 자리에 복원하고 나머지는 복원을 안 함. => 즉, 가장 뚜렷한 특징이 무엇인지 (별 거 아닌 애들은 복원 안 하니까)를 밝혀내어 컨볼루션의 활성화를 알아냄. layer가 Hierarchical하게 초반엔 점, 선, 면같은 간단한 특징을 파악하고 후반에 복잡한 특징을 잡아냄.
즉, 비주얼라이제이션을 통해 컨볼루션을 조금 더 이해하기 시작함.
* AlexNet에서는 11x11 filter에 stride 4를 사용해서 듬성듬성 특징을 잡아냈기 때문에 첫 번째 레이어가 잘 학습 안 된거다. 그래서 7x7과 stride 2로 해봤더니 데드되는 뉴런이 훨씬 더 줄더라. 하는 것을 밝혀냄.
이런 식으로 비주얼라이제이션을 통해서 필터와 스트라이드 사이즈만 조금 고침. AlexNet 그대로 가져와서 하이퍼파라미터 튜닝 몇 가지만 했더니 성능이 약 5.6%나 좋아졌다.
그런데 위 논문과 동시에 현대 딥러닝 모델의 뼈대가 되는 모델 등장함.
[ 2013년 Network In Network ]
* 성능 좋은 모델은 아니었지만, 2014년 GoogLeNet(InceptionV1)에 엄청 큰 영향을 미친 논문.
1) MLpconv
* (a)는 전통적인 conv 모델로 비선형 활성화 함수가 함께 사용되는 선형필터를 사용함. 반면 (b) Network In Network는 네트워크를 겹친 멀티 레이어 퍼셉트론처럼 보이지만 1x1 컨볼루션을 겹친 것임. (즉, 여러 개의 Fully Connected처럼 보이지만 여러 개의 1x1 컨볼루션을 넣은 것임)
이 부분을 FC 겹친 거라고 설명한 글들이 많은듯. 물론 1x1 컨볼루션은 이론적으론 Fully Connected와 똑같아지지만, 차원 축소에 쓰며 non-linearity 반영에 씀. 즉, 비선형을 반영할 수 있는 1x1의 작은 레이어(micro layer)를 계속 겹쳐서(MLP) 다음 구조로 넘김 => stacking (=같은 구조를 겹침)
2) Global average pooling
* classification을 위해 global average pooling 사용하여 Fully Connected 때문에 생기는 over fitting을 제거함. AlexNet, ZFNet은 뒤에 세개 이상의 FC를 붙였는데 global average pooling을 사용하여 FC 층을 제거함.
Fully Connected는 너무나 많은 파라미터를 늘려서 오버피팅 문제를 발생시키며, global average pooling은 구조적으로 regularizer의 역할을 하므로 전반적으로 overfitting을 방지함.
[ 2014년 GoogLeNet ] Going deeper with convolutions; codename Inception
* GoogLeNet: 최초의 컨볼루션 네트워크를 만든 Y. LeCun을 오마주한 팀명.(이런 리스펙 마인드 넘 멋있지 않나요ㅎㅎ) 코드네임은 Inception임! 현재 V4까지 나옴.
* 논문에서 노골적으로 Lin et al(Network In Network)를 기반으로 만들었다고 언급함.
* stem - stacking - AVGPooling 구조.
Inception모델의 도입부인 stem은 conv연산을 하며 일반적 CNN과 같은 구조를 지님
1) 1x1 convolution Network In Network
NIN에서 가져온 아이디어. 차원을 결정하기 위해서 썼던 기법. 즉, 차원축소. 큰 네트워크 안에 MLP 구조를 갖는 형태를 띄며, 이 구조를 반복되게 쌓아 올림. (마지막 부분인 AVGPooling 역시 NIN에서 가져옴)
2) LocalRespNorm
* stem이라고 부르는 input쪽 잘 보면 아까 이제는 안 쓴다고 언급한 LocalRespNorm을 갖다붙임. 왜 갖다 썼냐? -> 몰라서ㅋㅋ. LRN이 이전까지는 성능 좋다고 여겨짐. 하지만 재밌게도 GoogLeNet이 2014년도 1등 논문인데 2등 논문인 VGG팀이 LRN가 쓸모없다고 밝혀냄ㅋㅋㅋ. 따라서 이 모델을 개선하려면 LRN부터 없애야 했음 => 그래서 이 저자가 후에 만든 게 BatchNormalization!!
3) Auxiliary classifier
* stacking을 했는데 중간에 보면 softmax로 빠지는 이상한 구조가 있음. 이게 뭐냐면, ReLU가 기울기 소실을 해결한다고 생각했는데 실제론 해결이 안 됨! AlexNet 같은 8개 짜리 얕은 모델 정도에서는 해결되지만 딥해지면 해결이 안 됨. 레이어를 20개쯤 쌓아서 실험해보니, 구조가 복잡해지니 역전파가 안 되고 기울기소실과 비슷한 현상이 나타나면서 학습이 안 되더라. 그래서 어떤짓을 했냐? Auxiliary classifier라고 하는 보조 classifier하나 더 만들어서 여기부터 역전파 하여 뒤로 넘김... (1차 옥슬레이어까지는 10개까지 밖에 안 되니까)
즉, 기울기 소실로 학습이 안 되는 문제를 해결하기 위해 Auxiliary classifier라고 하는 layer를 하나 더 붙임. 이 Auxiliary classifier는 두 가지 시사점(?)을 지님
* 1. Auxiliary classifier 구조는 drop-out과 비슷함. Drop-out은 학습 & 예측할 때 둘 다 쓴다? NO!! 학습 때만 사용함. Auxiliary도 학습할 때만 이 구조를 쓰고 예측할 땐 쓰지 않음. 이제 이런 '학습 전용 구조'가 유행하기 시작함. 왜냐? Gradient Vanishing 때문에.
* 2. Batch Normalization
이 논문에서 LocalRespNorm와 Auxiliary classifier가 필요없다는 걸 알게 됨. 후속논문인 Rethinking 논문을 냄. Auxiliary classifier가 실제 해보니까 있으나 없으나 성능을 실제로 개선시키진 않더라. 최종적으로 두 번째 classifier는 효과가 있었지만 첫 번째는 없다는 게 추후에 밝혀졌음.
====== 지금까지 정리 ======
* 2012년 Hinton이 ReLU, Drop-out, Overlapping 등 들고와서 vision의 역사를 바꿈. 그런데 수십년 연구하던 팀이 아니다보니 깊이있는 내용을 모름. GoogLeNet이 2014년도에 1등했다는 건 2013년도부터 준비를 했단 말임. 그럼 2013년도 일등은? ZFNet. 비주얼라이제이션 테크닉을 통해 블랙박스라 알려진 convolution의 작동 비밀을 조금 헤쳤는데, 아직도 궁금점이 해결되지 않았음. ZFNet에서 AlexNet이 쓴 11x11 filter에 stride=4를 7x7 filter와 stride=2로 튜닝 했더니 성능이 좋아짐.
그렇다면 과연 어떤 nxn conv가 최적의 모델인가?!
[ 2014년 VGG ] VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
* 16-19 레이어인데 very라는 말을 붙임. 지금은 1000개는 껌인데 말이죠ㅎㅎ
====== 2014년도의 두 가지 문제점 ======
1) nxn conv 어떤 게 성능이 좋은가?
2) layer가 깊어질수록 성능이 좋은가?
=> 이 두 문제에 대해 GoogLeNet팀과 VGG팀이 다르게 접근함.
1) 어떤 nxn conv가 성능이 좋은가?
# VGG
다른 거 고려하지 않고 3x3으로 쓰면 이론적으로 다른 어떤 conv를 쓰든 똑같다!
* 3x3 conv가 하나의 receptive field로 감. 이런 3x3을 두 번 겹치면 5x5랑 같고 세번 겹치면 7x7과 같음. 그렇다는 것은 3x3만 써도 충분하다. 7x7 쓰고싶어? 그럼 3x3 세번 쓰는 게 더 좋아~ 왜냐면 3x3 세 번 쓰면 파라미터 27개. 7x7한번 쓰면 파라미터 49개임. 파라미터가 줄어들면서도 non-linearity가 충분하기 때문에 3x3만 쓰는 게 낫다는 걸 밝혀냄.
# GoogLeNet
1x1 conv - 3x3 conv - 5x5 conv - 3x3 max pooling 병렬 구조임. (위 그림 참고)
* 1949년 Hebb's rule(Hebbian rule)에서 아이디어를 차용하자. 넷 중 어떤 nxn이 중요한지 모르니까 일단 다 써! 어차피 중요한 conv의 가중치가 더 클 거야. 1x1이 중요하면 이 conv의 weight이 클 거고, 3x3이 중요하면 얘가 weight가 클거야
=> 즉, 어차피 중요한 conv의 가중치가 더 클 것이라고 접근. 또한, 20개의 레이어를 학습시키기 위해 Auxiliary classifier 두개 붙였는데, 최종적으로 두 번째 classifier만 효과가 있다는 게 추후에 밝혀졌음.
2) layer가 깊어질수록 성능이 좋은가?
# VGG
레이어가 많으면 많을수록 성능 좋다는 걸 실험함. 1998년에 universal approximation theorem에서 layer가 많을수록 연속함수에 근사적으로 피팅되니 레이어가 많은 모델은 어떠한 함수도 만들 수 있다는 이론을 활용함. 실제적으론 기울기 소실이 있었지만, 수학적으론 레이어가 많으면 non-linearity를 많이 반영하여 성능이 좋아진다는 이론.
위 VGG논문 보면 여러가지 상황에서 테스트 해봄
* A vs A-LRN : LRN을 쓰면 성능이 떨어짐. GoogLeNet은 뭣도 모르고 썼는데.
VGG: 너희가 돈이 많아서 구조적으로 복잡하게 만들어서 성능 좋았던 거지 허점이 많았네~
구글: 하.. ㅡㅡ;
* B vs C : 1x1 conv 즉, non-linearity만 추가했는데 C가 더 성능이 좋음.
* C(VGG16) vs D(VGG19): 3x3 즉, non-linearity보다 conv 추가가 성능이 더 좋음.
* 근데 이런 VGG도 또 허점 있었음. FC 세개 씀ㅋㅋ 파라미터 수 폭발적 증가!!! 근데 GoogLeNet은 우아하게 글로벌 에버리지 풀링 씀.
결국 1, 2등이 서로 불완전한 상태임.
====== 정리 ======
신경망이 Deep 할수록 성능이 좋았으며, nxn을 쓰는 문제에서는 두 팀이 갈라짐
Inception 라인: Heb's rule에 의해서 데이터(=모델)에 따라 잘 되는 애가 각각 있을거다. 양갈래 길 쓰자.
VGG 라인: 다 필요없어 3x3.
그렇다면 과연 얼마만큼의 Layer를 쌓는 것이 효과적인가?
[ 2015년 ResNet ] Deep Residual Learning for Image Recognition
* 그래프 보면 training error가 layer 20개일 때보다 56개일 때 성능이 현저히 떨어짐. Over fitting으로 판단하기엔 test error 에서도 같은 양상을 보임 => 오버피팅이 아니라 layer가 많으면 학습이 안 된다!
사실 2014년 Inception이나 VGG 팀이 20개 전후로 레이어 쌓은 거 보면 간접적으로 20개 이상은 학습이 잘 안 됐다는 것을 암시 하는듯. ((내피셜.. 근데 20개 이상 layer를 테스트 안 해봤을 리가 없다고 생각함))
=> 결론: ReLU도 Gradient Vanishing 비슷한 문제가 생겼으며, Layer를 무작정 많이 쌓을 수 없음. 즉, ReLU, Drop-out도 효과가 없다는 것을 시사함.
1) VGG+GoogLeNet
논문 보면 34개 layer를 stacking하면서 VGG와 GoogLeNet의 기술을 적절하게 활용함. VGG에서 3x3 conv 가져오고, GoogLeNet에서 에버리지 풀링 가져옴.
2) Residual Network (Shortcut connection)
* Shortcut. 급행열차. conv를 거치지 않고 값을 넘겨주면 정보 전달이 조금 더 잘 되지 않을까?하는 아이디어.
* Residual Learning => {잔차 = 예측값 - 실제값}의 개념을 활용함.
Let F(x): 예측값, H(x): 실제값, x: 잔차.
이 때, F(x)는 conv 층을 거친 잔차. x는 Shortcut => H(x) = F(x) + x 이렇게 넘기자는 개념!
LSTM에서 셀 스테이트를 계속 넘기는 것과 같음 .
3) BottleNeck (1x1 convolution)
* input (B, 256, w, h). 이 256을 64로 줄였다가 다시 늘리는 것임. w,h는 변화X.
1x1 conv : Input Channel 256 -> Output Channel 64. (=차원축소)
3x3 conv : 3 x 3 x Input Channel x Output Channel ( 3 x 3 x 64 x 64 ) (=특징 추출)
1x1 conv : Input Channel 64 -> Output Channel 256 (=채널 증가). CNN은 feature map이 많아야 특성 추출이 잘 되니까 다시 증가시키는 것임.
* 1x1 conv는 필터의 개수가 몇 개 인지에 따라 output의 dimension은 달라지지만, 원래 w,h는 변화X.
1x1 conv 연산 할 때 필요한 필터는 (1 x 1 x channel x filter).
여기서 # of channel은 인풋의 channel 수와 동일해야 하고 # of filter는 원하는 출력의 channel 수로 지정.
* convolution 연산은 채널의 특징과 공간 정보를 함께 추출해내는 연산이라고 했음. filter 사이즈가 3x3이면 3x3 픽셀 공간에 맞추어 input의 특징을 "하나의 값"으로 추출하는 것임.
하지만 1x1 conv을 쓰면 하나의 픽셀만 고려하므로 input 채널 수와 출력 채널의 수가 똑같음. 그럼 왜 쓰느냐? => 차원축소! channel 방향으로만 계산해서 1개의 숫자를 출력하여 차원을 축소함.
즉, 인풋 차원에 비해 적은 차원 filter의 수를 세팅한다면 차원이 축소된 정보로 연산량을 크게 줄일 수 있음!
* 그래서 이걸 어떻게 활용했는데?
1x1 conv로 차원 축소
-> 원래 하려고 했던 연산 3x3 convolution 으로 공간 특성 추출
-> 다시 1x1 conv 연산으로 차원을 깊게 만들어 input과 차원을 맞춤.
* 이걸 통해 150개 레이어를 넘어서 진짜 DEEP 해짐!
-> 드디어 BatchNormalization 이용한 앙상블 가능
-> 2015년 드디어 인간을 뛰어넘음. 인간의 error는 5.1%인데 이걸 뛰어넘음
++ [ 2015 Batch Normalization ] Accelerating Deep Network Training b y Reducing Internal Covariate Shift
Batch Normalization : 입력 데이터를 정규화하는 것처럼 은닉층의 입력도 정규화 하면 안정적으로 학습 가능하여 속도도 빨라지고 local optimum에 빠지는 것을 방지함. 각 배치별로 평균과 분산을 이용해 정규화함.
Batch size만큼 normalization을 시킴. => 장점: 배치 크기를 크게 할 수 있어 학습이 빨리 됨.
++ Internal Covariate Shift : Hidden layer가 깊어질수록 weight의 미세한 변화들이 가중되어 변화가 누적됨. 각 layer의 Input feature가 조금씩 변하면서 변동량이 누적되면 각 layer에서는 입력값이 전혀 다른 데이터라고 받아들이게 됨. (training의 분포가 test data의 분포와 학습이 잘 안 되는 것처럼 각 층의 입력값이 다르면 학습이 어려움).
=> 이 문제를 다루기 위해 weight 초기값을 잘 설정하거나 learning rate를 매우 작게 해야했는데, weight 초기값을 잘 설정하는 것은 어렵고 learning rate를 작게 하면 속도가 느려져서 local optimum을 초래함.
=> 따라서 hidden layer에 batch의 변화량을 정규화시켜 학습도 안정화 시키자는 컨셉임.
=> 이렇게 하면 learning rate를 크게 할 수 있어 학습이 빨라지고 초기값 설정에 자유로워짐.
=> 부대효과로는 Regularization도 있음. BN마다 분포가 지속적으로 변하고 가중치 업데이트에도 지속적으로 영향을 줌. 따라서 한 weight에 가중치가 큰 방향으로만 학습되지 않기 때문에 Regularization 효과를 얻을 수 있음. -> 따라서 Drop-out을 따로 쓰지 않아도 됨 (어차피 Drop-out은 신경망이 deep해지면 102개 레이어에서 한두개 랜덤으로 떨궈도 별 소용없어져서 필요없긴 함..)
[ 2016 ResNet ] Identity Mappings in Deep Residual Networks
* 아직 의문이 남음. 바로 그래디언트
* 2015 BN논문에서는 노골적으로 conv-BN-activation으로 하는게 성능 제일 좋다고 함.
ResNet: 잉..? conv들어가기 전에 노말라이제이션 해서 들어가면 더 좋지 않을까? 변화폭이 더 작잖아~ => 성능 더 좋네! 숏컷 커넥션은 이제 BN-ReLU-conv-BN-ReLU-conv 이 형태가 제일 좋음~ 땅땅.
* ResNet팀은 숏컷 커넥션에 별 실험을 다 해봄. conv - ReLU -conv, LSTM의 gating, dropout 다 해봄..
=> 숏컷 커넥션은 원래대로 쓰는 게 더 좋고, 다만 Residual learning 이전에 BN 쓰는 게 더 좋네!!
* BN을 Residual block으로 사용할 때: pre-activation이라고 해서 실제 conv앞에서 BN을 쓰는 BN-ReLU-conv-BN-ReLU-conv쓰는 게 성능이 좋더라.
결론은.. ResNet 구조에서는 BN-ReLU-conv-BN-ReLU-conv 가 좋지만, 어떤 구조에서는 원래의 conv-BN-ReLU-conv-BN이 좋기도 하더라~ 알아서 쓰렴~
============= 이제는!!!!!!!!! =============
Representational learning => 어떻게 숨어있는 구조를 표현할까? 잘 표현하자!! representation을 확보하자.
여기서 디자인 철학이 나옴. representational bottlenecks을 피해라. 즉, representation을 줄이는 것을 피해라.
이건 이제.. 다음 포스팅에서 다루겠음.. 너무 길다..
'AI > Computer Vision Advanced' 카테고리의 다른 글
딥러닝 리뷰 2: ImageNet (2015 최초 인간을 뛰어넘은 모델 ~ 2016 InceptionV4) (2) | 2023.01.13 |
---|---|
다룰 내용 (0) | 2022.09.27 |