Image processing/Deep-learning

Deep Learning model 학습 Tip 정리

유니디니 2020. 7. 2. 13:13
728x90
반응형

[참고 링크] 


1. http://karpathy.github.io/2019/04/25/recipe/

2. https://pcc.cs.byu.edu/2017/10/02/practical-advice-for-building-deep-neural-networks/


단순히 해석한 글이며, 학습방법에 대한 견해는 다를 수 있으니 참고만 해주세요~


Building Deep Learning Model


1. 데이터와 하나가 되기


첫번째 단계는 데이터의 분포를 이해하고 패턴을 확인하는 것입니다. 데이터의 불균형(imblance), 편향(bias), 이미지와 라벨(label)등을 확인하는 것은 적용시킬 Deep learning model을 찾는데 도움이 됩니다. 예를들어, 이미지에서 찾아야 하는 정보가 Local 혹은 Global 정보를 찾아야하는지? 얼마나 많은 이미지 변형이 필요한지? 공간적인 문제로 인해 average Pool 연산이 필요한지? Downsample은 얼마나 해야하는지? label은 어떠한 형태로 구성되어 있는지? 데이터 분포에서 outlier(이상치)는 어떤것인지? 등은 딥러닝 모델을 선택하고 전처리 과정을 어떻게 해야하는지 알려주기때문에 중요합니다.


2. 학습 과정에서의 Tip


첫 시작은 모델을 선택하고 평가 지표를 설정하여 실험을 통해 정확성을 확인하는 것입니다. 딥러닝 모델을 학습시키고 손실 혹은 다른 metric(ex. Accuracy)를 시각화하고, 가설을 사용하여 실험을 수행합니다.


Tip (Step by Step으로 접근하기)


Fix random seed : 코드를 재 실행할 때, 동일한 결과를 얻을 수 있도록 고정 임의 seed를 사용합니다. 이렇게함으로써 변형 요소(Variation Factor)를 제거하는데 도움이 됩니다.


Simplify : 불필요한 상상(Fanciness)은 하지 마세요. 예를들어, 이 단계에서 데이터 증강(Data augmentation)은 하지 않는게 좋습니다. 데이터 증강은 이후에 정규화 전략(regularization)으로 지금 단계에서는 버그가 생길 수 있습니다. 


add significant digits to your eval : 전체 테스트 세트에 대한 평가를 시각화 하세요. 테스트 데이터에서 배치단위 손실에 대해 좋은 결과를 확인하시면 안됩니다.


Verify loss : 손실이 올바른 손실 값에서 시작하는지 확인하세요. 예를 들어, 최종 레이어를 softmax로 초기화 하면 -log(1/n_classes)값으로 유사하게 시작해야 합니다. L2 Regression이나 Huber losses 등등


init well : 최종 레이어 가중치를 올바르게 초기화 하세요. 예를 들어, 데이터의 평균 값이 50인 일부 값을 회귀하는 경우 최종 편향 값을 50으로 초기화 합니다. 


1:10 비율의 양수: 음수의 불균형 데이터 집합인 경우, 네트워크가 확률을 예측하도록 Log에 편향을 설정하세요. 초기화시, 올바르게 설정하면 처음 몇번의 반복에서 기본적으로 수렵 속도를 높이고 "hockey sticks" 손실 곡선을 제거 할 수 있습니다.


Humal baseline : 사람이 확인할 수 있는 metric(손실 혹은 정확도)을 확인합니다. 


input-independent baseline : 입력 무관한 데이터를 입력시켜 봄으로써, 네트워크가 잘 작동하고 있는지 비교합니다.


overfit one batch : 몇가지 예만 있는 단일 배치를 과적합하세요. 이를 위해 모델의 크기(layer, filter 등등)를 늘리고 달성 가능한 최저 손실에 도달 할 수 있는지 확인합니다. 최저 손실에 도달하면 다음 단계로 넘어갑니다.


verify decreasing training loss : Toy model을 활용하기 때문에 under fitting 되며 데이터의 용량을 늘렸을 때 예상대로 손실이 줄어드는지 확인합니다.


visualize just before the net : 모델에 들어가기전 데이터를 시각화 할 수 있는 정확한 위치는 y_hat = model(x) 직전이며, 전처리가 잘 이루어 지는지 혹은 수많은 데이터 문제를 해결할 수 있는 지점입니다.


visualize prediction dynamics : 학습과정에서 고정 테스트 배치에서 모델 예측을 시각화 해보세요. 이러한 시각화는 학습 과정이 어떻게 이루어 지고 있는지 직관적으로 보여줍니다. jitter의 양을 통해 매우 높고 낮은 학습률(learning rate)을 알 수 있습니다.


use backprop to chart dependencies : 딥러닝 코드에서는 벡터부분에서 복잡한 과정이 포함됩니다.(ex view 대신 transpose/permute) 네트워크는 일반적으로 무시하며 학습을 수행하기 때문에, 이러한 버그를 찾을 수 있는 방법은 i번째에 대한 모든 출력을 더하고 역방향으로 실행하여 0이 아닌 것을 얻는 것입니다.(부분 역전파) 예를 들어, 시간 t에서 regression model이 1...t-1에만 의존하도록 하기 위해 동일한 전략을 사용할 수 있습니다.


3. 과적합(Overfit)


좋은 모델을 찾는 접근 방식에는 두 단계가 있습니다. 먼저 과적합 할수 있을 정도로 충분히 큰 모델을 얻은 다음, 적절하게 정규화를 수행합니다.


Tip


Adam is safe : 기준선을 설정하는 초기 단계에서 학습률이 3e-4인 adam을 사용하는 것이 좋습니다. 경험상 adam은 나쁜 학습 속도를 포함한 하이퍼 파라미터를 훨씬 더 포용합니다. Convnet의 경우 잘 조정된 SGD는 거의 항상 Adam보다 약간 우월하지만 최적의 학습속도 영역은 훨씬 더 좁고 문제에 따라 다릅니다.


Complexify only one at a time : 분류기에 연결할 signal이 여러 개인 경우, 하나식 연결하고 성능을 향상시킬 것을 권장합니다.


do not trust learning rate decay defaults :  다른 도메인에서 코드를 재활용하려는 경우 learning rate decay에 주의하십시오. 다른 문제에 대해 서로 다른 decay 스케쥴을 사용할 뿐아니라 에포크 수를 기반으로 하는데, 데이터 세트 크기에 따라 달라질 수 있습니다.


4. 정규화(Regularize)

최소한 훈련 세트에 맞는 큰 모델이 있습니다. 이제 훈련 정확도를 포기하여 정규화하고, 유효성을 검증할 때입니다.

Tip 
    • get more data : 실제 훈련 데이터를 추가하세요. 작은 데이터 세트에서 엔지니어링 방법을 사용하는 것 보다, 더 많은 데이터를 수집하면 거의 무한정으로 향상시킬 수 있는 유일한 방법입니다. 다른 하나는 앙상블 방법입니다.. 
    • data augment : 실제 데이터에 대한 다음으로 가장 좋은 것은 가짜 데이터입니다.
    • creative augmentation : 도메인 랜덤화, 시뮬레이션, GAN 등을 이용하여 데이터 세트를 확장하는 창의적인 방법을 활용하세요 
    • pretrain : 데이터가 충분하더라도 사전 훈련된 네트워크를 사용하는 것이 유리합니다.
    • stick with supervised learning : 비 감독 학습에 흥분하지 마십시오. 아직까진 감독학습을 뛰어넘는 방법은 없습니다.
    • smaller model size : 대부분의 경우 네트워크에서 도메인 지식 제한을 사용하여 크기를 줄일 수 있습니다. 예를 들어, ImageNet의 백본 상단에 완전 연결 레이어를 사용하는 것은 유행이지만, 그 이후에는 단순한 평균 풀링으로 대체되어 프로세스에서 많은 매개 변수가 제거 되었습니다.
    • decrease the batch size : 배치 크기가 작을 수록 정규화가 강화됩니다. 이는 경험적으로 배치가 커질수록 mean/std 값이 대략적인 버전이기 때문입니다.
    • drop : dropout을 추가하세요.
    • weight decay : weight decay 패널티를 증가시키세요.
    • early stopping : 검증 손실을 바탕으로 early stopping하여 과적합되는 것을 방지하세요. early stopping된 모델이 더 좋은 성능을 보이는 경우도 있습니다.
5. Tune

유효성 검사 손실이 낮은 아키텍쳐를 위한 광범위한 모델 공간을 탐색하면서 "loop"상태로 유지해야 합니다.

Tip

picking the model : 좋은 학습 손실에 도달하기 위해선, 데이터에 적합한 모델을 선택해야합니다. 먼저, 관련성이 높은 논문을 찾아서 좋은 성능을 달성한모델을 테스트 합니다. 예를들어, 이미지 분류를 하는 경우 Resnet-50을 복사하여 활용하세요. 나중에 더 많은 것을 할수 있고 이것을 이길 수 있습니다

random over grid search : 여러 파라미터를 동시에 튜닝하는 경우 모든 설정을 적용하기 위해 그리드 탐색을 수행하지만, 임의 검색을 사용하는 것이 좋습 니다. 직관적으로 다른 매개 변수보다 일부 매개 변수에 훨신 더 민감하기 때문입니다. 한계에서 매개변수 a를 b로 변환했을 때, 효과가 없으면 몇가지 고정점 보다 여러 번 더 샘플 하는 것이 좋습니다.

hyper-parameter optimization : 수 많은 베이지안 하이퍼 파라미터 최적화 도구 상자가 있으며, 일부는 성공했지만 성공을 보장 할 수 없습니다.


6. Squeeze out the juice

Tip
  • ensembles : 앙상블 모델은 거의 모든 것에 대해 2%의 정확도를 얻을 수 있는 확실한 방법입니다. 테스트 Time의 제한이 있다면, Self-distilling 방법을 활용해 보세요.
  • leave it training : early stopping도 고려해야 하지만, 오랫동안 훈련을 유지했을 때 좋은 결과를 보이기도 합니다.


반응형