호기심 많은 분석가
[BoostCamp] Week6_Day27. Image Classification 본문
(03강) Image Classification 2
1. Problems with deeper layers
- AlexNet에서 VGGNet으로 발전하면서 더 깊은 네트워크가 더 좋은 성능을 보여준다는 것을 확인했음
- 깊을수록 복잡한 데이터도 보다 더 잘 학습할 수 있다
- 더 큰 Receptive field를 가지기 때문에 더 많은 주변을 참조해서 신중히 결론
- 활성 함수도 더 많이 사용할 수 있다
- 하지만 더 깊기만 하면 언제나 좋을까? 그렇지 않다. 그렇다면 왜?
- Deeper networks are harder to optimize
- 더 깊게 쌓을수록 gradient가 accumulate 되면서 Gradient vanishing / exploding 문제가 발생
- 계산 복잡도가 올라가서 더 좋은 GPU와 메모리가 필요함
- Degradation problem
- Depth가 깊은 상태에서 학습을 이미 많이 진행한 경우 weight들의 분포가 균등하지 않고, 역전파시 기울기가 충분하지 않아 학습을 안정적으로 진행할 수 없는 상태
2. CNN architectures for image classification 2
- 네트워크를 깊게 쌓기 위한 노력들을 소개하겠음
2-1. GoogLeNet
- Inception module - 하나의 layer에서 다양한 크기의 filter를 적용해서 여러 측면에서 activation을 관찰하겠다! 수평적으로 넓게 쌓은 것
- 그러면 계산 복잡도가 높아지니까 1x1 convolutional filter를 미리 곱해줌으로써 해결하고자 함(filter의 개수로 채널 수만 조정) - "bottleneck"구조
- Overall architecture
- Stem(줄기) network : vanilla convolution networks
- Stacked inception modules
- Auxiliary classifier - 네트워크가 깊기 때문에 Gradient vanishing / exploding 문제가 생길 수 있어 중간중간 gradient를 꽂아줌 (중간에 Loss를 측정)
- Classifier output (a single FC layer)
- Auxiliary classifier에 대해 더 알아보자
- Gradient 문제가 발생하지 않게 중간중간 Loss를 measure해줌
- 학습 도중에만 사용, 테스트 때는 사용하지 않음
2-2. ResNet
- 100층 이상의 layer를 쌓으면서, 더 깊은 layer를 쌓아서 더 높은 성능을 보여준 첫 예시
- 인간 이상의 성능을 보임
- Degradation problem
- 더 깊은 모델이지만 오히려 학습이 더 잘 안 되는 문제
- Overfitting이 아님, 최적화의 문제!
- Hypothesis
- Plain layer : As the layers get deeper, it is hard to learn good H(x) directly
- x에서 곧바로 H(x)를 학습하려 하면 힘들다.
- 기존의 네트워크들이 H(x)를 얻기 위한 학습을 했다면, ResNet은 F(x)가 0이 되는 방향으로만 학습하면 됨
- 나머지(residual)를 학습한다고 볼 수 있고 그래서 ResNet이라 불림
- 아이덴티티에서 나머지 잔여 부분 F(x)=H(x)-x만 모델링해서 학습하면 학습의 부담을 경감할 수 있지 않을까
- Shortcut connection
- Backpropagation시 shortcut을 통해 흐를 수 있음, 원래의 gradient가 vanishing 되더라도 shortcut을 통해 유지 가능
- Plain layer : As the layers get deeper, it is hard to learn good H(x) directly
- 왜 잘 될까? gradient가 지나갈 수 있는 input, output path가 2^n만큼 생긴다고 함
- 다양한 path를 거침으로써 굉장히 복잡한 매핑을 학습해낼 수 있다
- Overall architecture
- ResNet에 적합한 He initialization으로 시작함
- Shortcut 과정에서 더해주는데, initialization을 해주지 않으면 너무 큰 값이 더해진다. → ResNet에 적합한 He initialization 도입
- ResNet에 적합한 He initialization으로 시작함
2-3. Beyond ResNets
- DenseNet
- ResNet은 identity map을 추가해줬지만 DenseNet은 concatenation을 해줌, 바로 직전뿐만 아니라 훨씬 이전의 출력들도 넣어줌 → 상위 레이어에서도 하위 레이어를 재참조
- SENet
- Depth를 높이거나 connection을 새로 하는 방법이 아니라 현재 주어진 activation 간의 관계가 명확해지도록 더욱 채널 간의 관계를 모델링하고 중요한 모델을 re-weighting해서 특징을 attention할 수 있게끔 해줌
- Sqeeze : Global averaging pooling을 해서 채널의 평균 정보들(분포) 확인
- Excitation : FC layer를 통해 채널간의 연관성 확인 (attention score 생성)
- EfficientNet
- wide : 구글 넷의 inception module과 비슷, 수평적으로 여러 개의 filter를 적용
- deep : ResNet의 layer를 깊게 쌓는 법
- high resolution : input 이미지를 큰 것을 넣어줌
- 위 3가지의 학습이 최적화되는 속도(training시)가 다름 → 이것을 맞춰주는 네트워크를 설계하면 결과가 좋아지지 않을까? (compound scaling)
- 적은 FLOPS에서도 높은 성능을 보였기에 EfficientNet이라 불림
- Deformable convolution
- 자동차 같은 정해져 있는 형태가 아닌 사람이나 동물 같이 변하는 형태를 맞추기 위한 convolution이 필요하다.
- 기존처럼 Fix 된 filter가 아닌 offset field에 따라 각각의 weight를 벌려줌
- 그에 따라 irregular 한 shape과 연산을 진행하는 것
- 아래 사진을 보면 standard에 반해 deformable convolution은 irregular한 shape을 띤다
3. Summary of image classification
- AlexNet : 이미지넷이 사용되는 가장 간단한 구조, 하지만 모델의 size가 작지는 않음
- VGGNet : 간단한 3x3 convolution을 사용 → 하지만 memory를 많이 사용함, 학습시간이 오래 걸림
- GoogLeNet : inception module and auxiliary classifier
- ResNet : 많은 layer임에도 VGG에 비하면 적절한 계산량
3-2. CNN backbones
- GoogLeNet은 이에 따라 AlexNet, VGG, ResNet에 비해 가장 효율적인 CNN Architecture이다. 하지만 구현이 어려움
- 그래서 일반적으로 VGGNet이나 ResNet 모델을 Backbone으로 많이 씀
🌟Tip
- 서버의 휴지통 비워주기
# 최상위 폴더로 진입
cd ~/
# share 파일 찾기
cd ./.local
ls # share
cd share
# 휴지통
cd ./Trash
# 각 폴더의 용량 확인
du -h --max-depth=1
# 폴더 삭제하기
rm -r ./files
# 서버 가용 용량 확인
df -h
- Python package 설치 파일 삭제
# 아나콘다 - 사용하지 않는 cache 파일 제거
conda clean --all
# pip3
pip3 cache purge
🌱피어세션
- 임문경 캠퍼님 발표 x2🙋♂️
- 다음날도 걸리면 2주 동안 계속 발표하신다고 함
Q1. Googlenet에서, 여러 auxiliary classifier 간의 차이로 인한 gradient gap을 어떻게 학습하는가?(멘토)
- 의견
- 전파되던 gradient가 0에 가깝게 줄어들면, 학습이 안되기 때문에 아예 학습이 불가능한 것보단 나을 거 같기 때문이라 추측
- 소실을 대비하지만, 소실이 되지 않아도 모두 학습할 것이다.
- 학습하는 중간에 backpropagation 하니까 앞서 소실된 gradient를 가져와서 마지막까지 앞쪽에 gradient를 가져간다는 의미로 이해했습니다.
- 단일 auxliary classifier까지가 하나의 모델이라고 생각하면 편할 것 같다.
- 추가 질문
- 이전의 grad가 소실되지 않았다면 원 grad에 더해주기 때문에 Backprop시 더 많이 학습하지 않을까?
- 상수를 곱해(0.3, scaling factor) ACL의 grad를 더 줄여준다.
- 이전의 grad가 소실되지 않았다면 원 grad에 더해주기 때문에 Backprop시 더 많이 학습하지 않을까?
Q2. 2. fx+x를 미분할 때 x로 미분하는가?( Residual이 skip을 이용해 어떤 식으로 학습하나?)
- 답변
- Hx가 미분층을 통과한 값, hx와 원 x와의 차이가 fx(잔차)인데 그 차이(fx)만 학습한다.
- 계산량 감소
- 그런데 베니싱 일어날 수 있으니까 부가적으로 x를 합한다고 이해
- Hx’ = fx’+x’이다(이전 층의 그래디언트 끌어다 쓴다)
- Hx가 미분층을 통과한 값, hx와 원 x와의 차이가 fx(잔차)인데 그 차이(fx)만 학습한다.
Q3. Plain은 깊어지면 배니싱 일어나는데, residual은 배니싱 일어날 수 없지 않나?
- 답변
- 층이 깊으면 일어날 수 있다(값이랑은 상관 x)
- Residual shortcut으로 그래디언트가 전달되니깐 층 줄이는 효과, 배니싱을 줄여준다(이전 층의 그래디언트를 가져오면서)
- 계속 층을 통과하면 0보다 항상 작은 값을 곱하는데, residual 하면 0으로 덜 수렴하게 된다(gradient)->로스를 줄이는 방향
- 그래디언트가 크면 minima에 수렴 힘든 게 있다(크기). 하이퍼 파라미터로 조절 가능. backprop에서는 소실되지 않게 하려 한다(계속 weight업데이트를 위해)
Q4. Hx는 반드시 x보다 큰가
- 답변
- 작을 수도 있다(weight가 음수도 나올 수 있어서)
Q5. 기울기 소실이 무슨 의미?
- 답변
- Grad 가 거의 0이라, 가중치를 업데이트하지 못하는 상황
- googlenet에선 Aux classifier의 grad 값을 더해, Vanishing을 완화
Q6. 그래디언트가 기울기 아닌가?
- 답변
- 맞다
Q7. Init로 그래디언트 제어? Forward 시 degradation 제어 아닌가?(멘토)
- 답변
- 초기화 잘못하면 output 값이 커져서 그래디언트가 불안정할 수 있다
- 잘하면 뒤에서도 그래디언트가 정상 값을 잡을 수 있다
- sig에서 값이 너무 크면 그래디언트 0, init 잘하면 아님
- 전달된 값이 커지려면 forward에서 init 잘못해야 한다.
Q8. He init를 한다는 건 relu를 사용한다는 의미, 강의에서는 skip이 되기 때문에 he를 사용한다고 설명. He가 relu 때문이 아니라 skip 때문에 사용되었다?(멘토)
- 추가 질문
- resnet에서 he를 쓰는 이유: Skip connection을 통해 add 되는 과정에서 분산을 잡기 위해??
- 그럼 왜 he가 skip connection에서 효과적인가?
Q9. Deformable conv에서 필터 어떻게 흩트려 놓나? Offset 어떻게 결정?
- 답변
- offset자체를 학습하는 것 같다
- Dai et al., Deformable Convolutional Networks. abstract 중
- Both are based on the idea of augmenting the spatial sampling locations in the modules with additional offsets and learning the offsets from the target tasks, without additional supervision
'Coding > BoostCamp' 카테고리의 다른 글
[BoostCamp] Week6_Day29. 새로운 멘토님 (0) | 2021.09.21 |
---|---|
[BoostCamp] Week6_Day28. 팀원 찾기 (0) | 2021.09.21 |
[BoostCamp] Week6_Day26. 양날의 검, Pseudo-labeling (2) | 2021.09.14 |
[BoostCamp] Week6_Day25. 새로운 U-Stage, 도메인 심화과정 (0) | 2021.09.07 |
[Boostcamp] Image Classification Competition (0) | 2021.09.05 |