일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 글또
- 기술면접
- 파이썬 3
- ODQA
- 프로그래머스
- 최단경로
- 구현
- 알고리즘스터디
- 백트랙킹
- 단계별문제풀이
- Level2_PStage
- 그래프이론
- dfs
- 정렬
- 이코테
- U_stage
- 다시보기
- 알고리즘_스터디
- 부스트캠프_AITech_3기
- mrc
- 주간회고
- 그리디
- Level2
- Level1
- python3
- dp
- 백준
- 개인회고
- 부스트캠프_AITech3기
- 이진탐색
- Today
- Total
국문과 유목민
[일일리포트] Day 24 (DL기초_Model) 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
Model
모델이란 시스템의 모형을 정보로서 표현할 수 있게 만드는 것이라고 정의할 수 있다. 우리는 딥러닝 모델을 생성함에 있어서 Pytorch라는 프레임워크를 활용하게 되는데, Pytorch는 다음과 같은 장점이 있다.
- Low-Level로 자유롭고, Pythonic하고, 연구를 함에 있어 수월하게 사용 가능
Pytorch
pytorch 모델의 모든 레이어는 nn.Module 클래스를 따른다.
- modules: init에서 정의한 또 다른 nn.module을 의미하며, 모델 안의 모듈을 출력한다.
- forward: 모델이 호출되었을 때 실행되는 함수이다. 순전파를 진행하게 된다.
- nn.Modulr Family: nn.Module을 상속받은 모든 클래스의 공통된 특징. 모든 nn.Module은 child modules를 가질 수 있다. 내 모델을 정의하는 순간, 그 모델에 연결된 모든 module을 확인할 수 있게 된다. 또한, 모든 nn.Module은 forward()함수를 가지기 때문에, 내가 정의한 모델의 forward()를 한번만 실행함으로 그 모델의 forward()에 정의된 모든 모듈 각각의 forward()를 실행할 수 있다.
모델에 정의되어 있는 modules가 가지고 있는 계산에 쓰이는 변수들을 Parameter라고 한다. 모델.state_dict()를 통해서 Parameter를 확인할 수 있다. 각 모델 파라미터들은 data, grad, reauires_grad 변수 등을 가지고 있다. 그리고 우리는 이것을 통해 학습을 진행할 수 있다.
Pretrained Model
모델 일반화를 위해 매번 수많은 이미지를 학습시키는 것은 까다롭고 비효율적이다. 따라서 좋은 품질의 대용량 데이터로 미리 학습한 모델을 활용해 내 목적에 맞게 다듬어서 사용하고자 할 때 사용하는 모델이 Pretrained Model이다. 미리 학습된 좋은 성능이 검증되어 있는 모델을 사용하면 시간적으로 매우 효율적이며, 괜찮은 성능을 기대할 수 있다.
- torchvision.models torchvision.models.모델명(pretrained=True)
- TIMM
Transfer Learning
Pretrained Model을 가져와서 해결하고자 하는 데이터를 통해 학습을 하는 것을 말한다. Pretrained Model을 가져와서 내 문제에 대입해 문제를 해결하기 위해서는 몇 가지 고려해야 할 사항이 있다.
- CNN base 모델 구조: Input + CNN Backbone + Classifier => Output
- fc layer == fully connected layer == classifier
- out_features를 내 문제 맞게 수정
예를 들어, Pretrained Model의 fc layer에서 output이 1000개라면, 이는 실생활에 존재하는 이미지를 1000개의 다른 Class로 구분하자는 의미이다. 하지만 우리의 문제에서는 Classifier의 종류가 2개나 10개(혹은 그 이상)로 달라질 수 있다. 따라서 Pretrainig할 때 설정했던 문제와 현재 문제와의 유사성을 고려해야 하며, Out_feature를 변경해줘야 한다.
Case by Case
Case1. 문제를 해결하기 위한 학습 데이터가 충분할 경우 Classifier만 바꿔주면 된다.
- High Similarity: Input -> CNN Backbone -> Classifier -> Output # feature extraction
- Low Similarity: Input -> CNN Backbone -> Classifier -> Output # fine tuning
Similarity가 다르더라도 주어진 모델 위에서 CNN Backbone을 Train을 돌리면 no base보다는 성능이 올라간다.
Case2. 학습 데이터가 충분하지 않은 경우
- High Similarity: Input -> CNN Backbone -> Classifier -> Output
- Low Similarity: Input ->
CNN Backbone -> Classifier -> Output(유사도도 적고, 데이터도 적으면 하지 않는게 낫다.)
멘토링
이번 멘토링 시간에는 Comeptition에 들어가기 앞서서 딥러닝 학습을 함에 있어서 도움이 될만한 논문에 대해서 다루었다. Bag of Tricks for Image Classification with Convolution Neural Networks 논문은 새로운 모델 등을 제시하는 게 아니라, 모델을 학습함에 있어서 구조를 일부 바꾸거나 loss function, Optimization 등을 설정하는데 사용할 수 있는 trick들에 대해 다루고 있다.
- Large-batch-training: Batchsize를 Learning rate와 같이 huristic하게 늘려주면서 조절을 하면 성능이 올라갈 수 있다.
- Learning rate warmup: Learning rate를 줄였다가 늘렸다가 하면서 loss를 update한다.
- zero gamma: gamma를 0으로 만들어줌으로써 initial stages에서의 학습이 더 잘되게 할 수 있다.
- no bias decay: layer별로 lr을 다르게 스케줄링하는 방법으로 batch가 클 때 도움이 된다.
- Low Precision Training: float를 16bit로 만들어서 32bit와 섞어서 training하게 되면 모델을 더 빠르게 traning시킬 수 있다.
- 16bit만으로 training을 하지 않는 이유는 이유는 gradient 계산처럼 정확한 계산이 필요할 때는 32bit로 게산할 필요가 있다. 이론적으로 16bit만 사용하면 점수가 별로 좋지 않다.
- ResNet Model Tweaks: Resdiual Block을 일부 수정한다.
- Cosine learning rate: learning rate를 코사인을 활용해서 감소 시킨다. 이렇게 하면 local minima를 빠르게 벗어날 수 있다고 한다.
- Label Smoothing: labe을 0이나 1이 아니고, 값을 조금 높이거나 낮춰서 확실하게 label을 가질 수 있게 하는 방법
- Mixup Training: 이미지 2개가 있으면 이미지를 합치고 레이블도 합치는 기법이다. 이렇게 하면 일반화된 성능이 더 좋아진다고 한다.
- Transfer Learning: (위의 설명)
▶ Review (생각)
오늘 들은 강의는 model에 대한 강의였다. model에 대한 강의는 이전 주 수업에서 파이토치 전체 프로세스에 대해 배울 때 들었던 내용과 유사했었다. 강의를 들으면서 Pretrained된 모델을 어떤 것을 사용하고, 어떻게 사용하느냐가 중요하다는 생각이 들었다. 내가 해결하고자 하는 문제와 유사한 데이터로 학습된 모델인지를 생각하고 적용해야 내 문제를 잘 해결할 수 있을 것이기 때문이다.
오늘은 멘토링도 있었고 또 Special Mission을 보기도 햇고, 자소서 특강도 듣다보니 강의를 듣는 절대적인 시간은 부족했던 것 같다. 하지만 멘토링을 통해서 여러가지 생각해볼 수 있는 것도 배웠고, Special Mission을 살펴보면서 부족한 것을 깨달을 수 있었다. 또한 자소서 특강을 통해서 내가 자소서를 쓰면서 부족했던 부분들을 깨닫게 되었고 방법을 찾은 것 같다는 생각을 할 수 있었다. 이렇게 정리를 하면서 당장 오늘 한 게 없다고 느껴졌지만 꽤나 많은 것들을 했음을 깨닫게 되는 것 같다. 부족한 부분이 있기는 하지만 너무 조바심갖지 말고 하다보면 좋은 결과가 있을 것이다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일 리포트] Day 26 (0) | 2022.02.24 |
---|---|
[일일리포트] Day 25 (DL기초_Training&Inference) (0) | 2022.02.24 |
[일일리포트] Day 23 (DL 기초_문제정의) (0) | 2022.02.22 |
[5주차] 개인 회고 (0) | 2022.02.18 |
[일일리포트] Day 22 (0) | 2022.02.18 |