[TensorFlow] Lab-07-3-1 application and tips 모두의 딥러닝 시즌 2 정리...
시즌2 강의가 부실하다고 판단되어 시즌 1 lec 07-2: Training/Testing 데이타 셋 강의 내용 추가 정리
목차
- Data sets
- Evaluation using training set?
- Training and Test sets
- Trainig / Validation / Testing
- Learning
- Online Learning vs Batch Learning
- Fine tuning
- Efficient Models
- Sample Data
- Fashion MNIST / IMDB / CIFAR-100
Transfer Learning / Fine Tuning / Feature Extraction
Transfer Learning
미리 학습된 모델을 갖다 쓰는 것
CNN이나 Computer Vision 분야에서 Transfer Learning(전이 학습)은 주로 Pre-trained model(사전 학습된 모델)을 갖다가 사용하는 것을 말한다.
즉, 이미 다른 데이터셋으로 잘 학습되어 있는 모델을 사용해 학습을 빠르게 진행하겠다는 것이다.
Transfer Learning을 사용하는 가장 큰 이유는, 큰 데이터셋을 처음부터 학습시키는 것은 낭비이기 때문이다. 많은 시간과 많은 비용이 소모되고 (복잡한 모델일수록 더더욱), 하이퍼파라미터도 생각해야 한다. 처음부터 학습시키는 것은 생각보다 골치아픈 일이다.
이러한 이유로, 내가 학습시키려는 데이터셋과 비슷한 데이터셋으로 미리 잘 학습된 모델이 있을 경우, 이를 가져다가 필요에 맞게 조금만 수정해서 잘 써 먹으면 그만이다.
어디까지 가져다 쓸 것인가
말 그대로, 어느 부분까지 그대로 쓰고, 어느 부분부터 커스텀할 것인지에 따라 Transfer Learning 전략을 나눠볼 수 있다.
CNN의 구조는 알다시피 두 부분으로 나누어볼 수 있다:
- Convolution base: Conv. Layer와 Pooling Layer의 반복으로 이루어진 앞부분. Feature Extraction을 담당한다.
- Classifier: FC Layer로 이루어진 뒷부분. 앞부분에서 추출한 Feature map을 flatten해서, FC층을 거쳐 최종 classification 결과가 나온다.
우선, Transfer Learning으로 Pre-trained model을 사용할 때는 기존의 Classifier 부분을 우선 제거한다. Classifier는 목적에 따라 바뀌어야 하기 때문이다. 가령 동물 이미지 데이터셋으로 학습된 모델을 사용하더라도 개인지 아닌지 판별해야 하는 task가 될 수도, 각 동물 레이블에 대해 확률을 출력해야 하는 task가 될 수도 있다.
그래서 Classifier는 목적에 맞춰 새로 작성하고, task의 성격에 따라 적절히 Fine tuning을 진행한다.
Fine tuning
Fine tuning이란, 위에서 설명한 것이 거의 정의에 가깝다. 기존의 모델 구조와 미리 학습된(Pre-trained) 가중치를 기반으로, 우리의 목적에 맞게 가중치를 업데이트하는 것이다.
Pre-trained model을 우리의 목적에 맞게 재학습시키거나, 학습된 가중치의 일부를 재학습시키는 것이라고 생각하면 되겠다.
Task의 성격에 따른 Fine tuning 전략
우리가 가지고 있는 (우리가 학습시킬) 데이터셋의 크기와, 이 데이터셋이 Pre-trained model이 기존에 학습한 데이터셋과 얼마나 유사한지에 따라 전략이 달라진다.
- 우리 데이터셋이 크고, 유사성이 작다.
- 모델 전체를 학습시키는 것이 낫다. 데이터셋의 크기가 크기 때문에 충분히 학습이 가능하다. 데이터셋끼리의 유사성이 작다고 해도 모델의 구조와 파라미터들은 여전히 재사용 가능하므로, 재학습을 시켜주는 편이 낫다.
- 우리 데이터셋이 크고, 유사성이 크다.
- Convolution base의 뒷부분과 Classifier를 학습시킨다. 사실 최적의 경우이기 때문에 모든 옵션을 선택할 수 있지만, 데이터셋이 유사하기 때문에 전체를 학습시키기보다는 강한 feature가 나타나는 Convolution base의 뒷부분과 Classifier만 새로 학습시키는 것이 최적이다.
- 우리 데이터셋이 작고, 유사성이 작다.
- Convolution base의 일부분과 Classifier를 학습시킨다. 가장 나쁜 상황으로, 제일 어렵다. 데이터가 적기 때문에, 적은 레이어를 Fine tuning하면 별 효과가 없고, 많은 레이어를 Fine tuning했다가는 오버피팅이 발생할 것이다. 따라서 Convolution base의 어느 정도를 새로 학습시켜야 할지를 적당히 잡아주어야 한다.
- 우리 데이터셋이 작고, 유사성이 크다.
- Classifier만 학습시킨다. 데이터가 적기 때문에 많은 레이어를 Fine tuning할 경우 오버피팅이 발생한다. 따라서 앞부분의 Feature Extraction은 그대로 쓰고, 최종 Classifier의 FC Layer들에 대해서만 Fine tuning을 진행한다.
💡 그리고 앞부분의 Convolution base를 재학습시키는 경우에는 미리 학습된 가중치를 잊지 않으면서도 추가로 학습을 해 나갈 수 있도록 learning rate(lr)을 작게 잡아주는 것이 바람직하다.
Feature Extraction
- 기존 가중치는 그대로 놔둔뒤, 새로운 레이어를 추가해서 이를 학습하고 최종 결과를 내게끔 학습
Joint Training
- 새로운 데이터를 추가하여 처음부터 다시 시작
Learning without Forgetting
- 새로운 데이터로 가중치를 세밀하게 조정하되, 기존 데이터 분류 결과 또한 개선 가능(하다고 주장)
참고