일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 브라이틱스 AI
- Activation Function
- Brightics AI
- Deep Learning for Computer Vision
- 브라이틱스 스태킹
- Brightics 서포터즈
- Python
- 딥러닝
- 파이썬 SQL 연동
- 비전공자를 위한 데이터 분석
- 데이터 분석
- 분석 툴
- Random Forest
- 머신러닝
- 검증 평가 지표
- 브라이틱스 프로젝트
- Brightics EDA
- 데이터 분석 플랫폼
- 범주형 변수 처리
- 파이썬 내장 그래프
- 브라이틱스 분석
- 삼성 SDS
- pymysql
- Brightics studio
- 서포터즈 촬영
- paper review
- 삼성 SDS 서포터즈
- 브라이틱스 서포터즈
- Brigthics Studio
- michigan university deep learning for computer vision
- Today
- Total
하마가 분석하마
11. Training Neural Network 2 본문
11. Training Neural Network 2
Rrohchan 2022. 2. 10. 15:04Michigan University의 'Deep Learning for Computer Vision' 강의를 듣고 정리한 내용입니다.
Training Neural Network 2
neural networks를 학습시키기 위해, 학습에 필요한 설정들, 그리고 트레이닝을 진행하는 동안 필요한 것들에 대해 알아봄
Learning Rate Schedules
Learning rate에 값을 넣어서, 트레이닝 진행하는 동안 epoch가 커지면서 learning rate가 어떻게 낮아지는지를 살펴보아야 한다. 즉, 사전에 지정해주어야하는 hyperparameter이다.
- 너무 높게잡으면, loss가 떨어지다가 오히려 커지는 방향으로 간다.
- 너무 낮게 작으면, 점점 내려가지만 속도가 너무 느려서 epoch를 많이 돌려야한다.
- 높게 작으면, 처음에는 loss가 빠르게 감소하다가, 더 낮아질 가능성이 있지만 낮아지지않는다.
- 최적의 Learning rate는 loss가 smooth한 곡선을 그리면서 떨어진다.
이처럼 어떤 learning rate가 좋은지 모르기에 처음에는 큰 learning rate로 시작해서 epoch가 지나면서 learning rate를 점점 낮춰야 한다.
Loss decay와 accuracy plot을 함께 보아야한다. Loss는 계속 낮아지겠지만, validation set의 accuracy가 감소하려고할때 (overfitting 전에) iteration을 멈추어야한다. 따라서, 매 iteration마다의 model의 snap shot을 저장한 후, val set에서 가장 잘 워크할 때의 iteration때의 weight를 불러온다.
Choosing Hyperparameters
1. Grid Search
Weight decay와 learning rate 두 가지의 하이퍼파라미터를 정하고자 한다. 각각 4개의 경우이므로, 총 16가지의 경우의 수를 비교해보는 것이 gride search이다.
2. Random Search
Grid Search VS Random Search
Grid seacrch는 전체 성능곡선에서 3가지 성능밖에 탐색하지못하지만, Random search는 여러 다양한 지점을 탐색할 수 있다. 따라서 좋은 성능을 주는 지점을 고를 수 있는 확률이 높아진다.
초록색을 중요한 파라미터에 대한 성능 곡선이라고 한다면 Grid Search는 정해진 point만 확인이 가능하다. 그러나 Random Search의 경우 여러 지점을 탐색할 수 있다.
Choosing Hyperparameters Steps
- Check initial loss
- Overfit a small sample
- Find LR that makes loss go down
- Coarse grid, train for ~1-5 epochs
- Refine grid, train longer
- Look at learning curves
1. Check initial loss (Sanity check)

Weight decay를 설정하지 않은 상태에서, 맨 처음에의 loss값을 확인한다. 예를 들어, softmax에서 맨 처음 loss값이 logC가 아니라면, 네트워크에 오류가 있을 것이다.
2. Overfit a small sample

작은 트레이닝셋(5~10의 미니배치)에서 100%의 accuracy가 나오는지 확인한다. 만약 loss가 잘 떨어지지않는다면, learning rate, weight initialization을 고려해보아야한다.
3. Find LR that makes loss go down
Step2에서의 아키텍쳐를 고정시키고, 모든 트레이닝 데이터를 활용하여 100 iteration동안 LR를 시도해본다. 가장 로스가 많이 떨어지는 LR를 찾는다
4. Coarse grid, train for ~1-5 epochs
Epoch를 1~5번 정도 돌려보면서, weight decay까지 조정한다.
5. Refine grid, train longer
Step4에서 고른 모델 혹은 모델들에 대해 epoch를 늘려서 트레이닝을 시킨다.
Looking at Learning Curves
1. Loss 값이 처음에 평평하다가 갑자기 감소하는 경우, Weight initialization이 좋지 않았음을 의심해 볼 수 있다.
2. Loss값이 감소하다가 더 떨어질 가능성이 있지만 떨어지지 않는 경우에는, Learning rate decay를 시도해보면 된다.
3. 이 경우는 너무 빨리 LR를 줄여버린 경우이다. Loss가 flat해지는 지점까지 기다렸다가 decay를 해보면 된다.
Iteratino에 따라서 Training / validation set의 accuracy를 찍어본 plot이다. Training set과 val set의 accuracy가 같이 증가하며, 적당한 차이를 유지한다. 이 경우는 train을 더 시키면 된다.
만약 Training set의 accuracy만 증가하고, val set의 accuracy는 어느 순간부터 낮아지기 시작하여, 두 선의 차이가 커진다면, 이는 곧 overfitting을 의미한다. 이를 해결하기 위해서는, regularization을 세게 주거나, 데이터를 더 모아보는 방법이 있다. 이때, regularization을 세게 주는 것은, L2 regularization에서 람다를 크게 지정하는 것이나, data augmentation과 같은 방법을 의미한다.
Training set과 val set의 accuracy가 같이 증가하지만, 두 선의 차이가 너무 없다면, underfitting을 의심해보아야 한다. 이를 위해서는, train을 더 많이 해보거나 더 큰 모델을 만들어볼 수 있다.
After Training Strategy
1. Model Ensembles
Model Ensemble이란 여러 개의 독립적인 모델들을 training 한 후, testing time에 결과들을 평균내는 것이다 보통 성능이 2% 정도 좋아진다.

딥러닝 분야에서 하나의 모델 훈련만으로도 앙상블의 효과를 낼 수 있는 방법이 있다. 그것은 바로 learning rate schedule을 활용한 방법이다. LR decay를 주고, 특정 시점마다 다시 LR을 높게 주면서, 구간 별 모델의 snapshot을 저장하여 모델이 낸 결과를 평균내어 앙상블을 구현한다.
2. Polyak averaging

트레이닝을 끝낸 후의 parameter가 아닌, 트레이닝 시 parameter의 moving average를 테스트에 활용하기도 한다. 이 방법은 Polyak averaging이라고 불리며, 앙상블 효과를 낼 수 있는 trick이다.
Transfer Learning
많은 데이터가 있어야만 좋은 성능의 classifier를 만들 수 있는 것은 아니다.
Alexnet CNN 아키텍쳐를 다운받았다고 생각해보자. Last layer인 FC 레이어들은 마지막에 Imagenet에서의 클래스 분류를 위한 것이므로 삭제를 한다. 직전 layer까지의 weight들은 모두 requires_grad = False로 설정하여 freeze하고, 업데이트에 사용하지 않는다. 피쳐 추출기로 사용하는 것이다. 피쳐추출기를 거쳐서 나온 데이터를 새로운 x로 지정하고, linear classification같이 간단한 모델을 적용한다. (feature를 추출하는 부분을 기존의 있던 model architecture와 weight들을 사용하면서 검증된 모델을 사용)
오른쪽 그래프에서 빨간색 선이 '커스텀하게 rule기반으로 피쳐 추출기를 만든 후, 그 위에 linear classification을 한 방법'이다. 초록색과 파란색 선이 위에서 설명한 'AlexNet에서 top layer제거하여 피쳐추출기로 활용한 후, 그 위에 linear classification을 한 방법'이다. 이 방법이 성능이 더 좋음을 알 수 있다.
Fine-Tuning
Fine-Tuning이란 다운받은 모델(ex. AlexNet)의 weight를 initial weight로 설정하고, 우리가 가진 데이터셋에 새로 훈련하는 것이다.
- Fine-tuning하기 전에, 피쳐추출기로 한 번 사용해보면, 이 것이 baseline 성능이 된다. 즉, Fine-tuning의 목적은 baseline보다 성능을 끌어올리는 것이다.
- 낮은 Learning rate를 사용한다.
- Image input 근처의 lower level layer들은 그대로 사용할 수 있다. 연산 비용을 절약하기 위해.
Object Detection에는 밑단에 피쳐추출기가 필요하다. 이때 피쳐추출기를 AlexNet, Vgg, ResNet, ResNeXt로 활용했을 때, 점점 성능이 높아짐을 알 수 있다.

그렇다면, CNN 아키텍쳐들을 Imagenet과 다른 데이터셋에 적용을 할 때, 경우에 따라 어떤 방법을 활용하면 좋을 지를 알아보겠다. 오른쪽의 표의 column에 대해 설명하자면, 우선 첫번째 열은 Imagenet과 비슷한 데이터셋에 대한 것이다. 즉, 데이터 distribution 이 가깝기 때문에, Imagenet으로 pretrained model instance들이 더 많은 도움을 줄 것이다. 두번째 열은 반대로 많이 다른 데이터셋이다. 데이터 distribution도 매우 다르기때문에, 다운받은 model instance들이 큰 도움을 주지 못할 것이다.
데이터 셋이 imagenet과 비슷할 때를 먼저 보자. 데이터가 적다면, 마지막 top layer만 날리고 피쳐 추출기로 활용하는 것이 좋다. 데이터셋이 크다면, 더 많은 레이어들을 fine tuning에 활용하면 더 좋은 성능을 기대해볼 수 있다.
데이터셋이 Imagenet과 많이 다르고, 데이터셋이 크다면 더 많은 레이어들을 fine tuning에 활용하면 해당 데이터셋에 맞게 활용할 수 있다.
데이터셋이 Imagenet과 많이 다를 때, 데이터가 적으면 linear classifier부터 시작해서 분류해보는 것을 추천한다.
Object detection, image caption에서도 이미지를 인식하는 feature extractor부분이 필요하다. 해당 부분에 Imagenet으로 pretrain된 CNN 아키텍쳐를 주로 활용한다. Image captioning의 language model파트에서는 NLP에서 주로 활용하는 word2vec의 pretrain된 모델을 사용한다.
그러나 transfer learning은 역시 practical한 이야기이므로, 잘 작동하지 않을 수 있다. 그래프에서 회색 선이 pretrain 된 모델, 보라색 선이 random initialization으로 한 모델에 대한 성능을 나타낸다. 그래프를 보면, 트레이닝을 3배 정도 더 하면, 랜덤 초기화방법도 pretrain된 모델과 비슷한 성능을 낼수 있다. 즉, ImagNet에 대해 pretraining한 것이 이론적으로 더 높은 성능을 낸다는 것은 아니다.
Transfer learning에 대한 저스틴 존슨의 시각
- Pretrain +finetuning은 첫번째로 시도해볼 만 하다. (빠르고, 괜찮은 성능을 내기 때문에)
- 데이터셋이 많다면, random initialization으로 직접 트레이닝을 해도 괜찮은 성능을 낼 수 있다.
- Transfer learning은 아직 이론적으로 많은 규명 작업이 필요하다.
Distributed Training
여기서는 Data Parallelism에 대해서만 말하겠다. 이는 같은 모델을 사용하지만, 서로 다른 데이터를 input하는 것이다.
Model Parallilism의 경우에는 모델 자체를 나누어서, 각각의 GPU들이 서로 다른 layer를 연산하도록 하는 것이다. 이러한 수직적인 model parallelism은 GPU 자원의 낭비를 초래한다. 하나의 GPU 연산이 끝나야 다음 GPU가 동작을 하기 때문이다.
모델을 수평적으로 나누었을 때에도 문제는 발생한다. 수평적으로 GPU가 연산을 하다가 윗단 layer에서 결국 합쳐져야 하는데 합쳐질 때의 layer들 간의 communicate 과정과 backprop 단계에서 시간이 많이 소요된다.
똑같은 weight에 대해 forward pass를 한다. 그리고 gradient를 계산한다. 이후, 다음 step으로 업데이트할 때, 서로의 그래디언트를 교환하고, 다른 GPU가 갖고있는 gradient값까지 활용하여 각자의 parameter를 update한다. GPU간 communicatioin은 iteration 한 번 마다만 필요하며, gradient만 교환하기때문에, 훨씬 더 효율적이다.
'Deep learning > Michigan university deep learning' 카테고리의 다른 글
13. Attention (0) | 2022.02.20 |
---|---|
12. Recurrent Neural Networks (0) | 2022.02.11 |
10. Training Neural Network (0) | 2022.02.07 |
8. CNN Architectures (0) | 2022.02.07 |
7. Convolutional Network (0) | 2022.02.03 |