일반적으로 아주 큰 규모의 DNN을 처음부터 새로 훈련하는 것은 좋은 생각이 아니다. 해결 하려는 것과 비슷한 유형의 문제를 처리한 신경망이 이미 있는지 찾아본 다음, 그 신경망의 하위층을 재사용하는 것이 좋다. 이를 전이 학습(transfer learning) 이라고 한다. 이 방법은 훈련 속도를 크게 높일 뿐만 아니라 필요한 데이터도 크게 줄여준다.
동물, 식물, 자동차, 생활용품을 포함해 카테고리 100개로 구분된 이미지를 분류하도록 훈련한 DNN을 가지고 있다고 가정하자. 그리고 이제 구체적인 자동차의 분류를 분류하는DNN을 훈련하려 한다. 이런 작업들은 비슷한 점이 많고 심지어 일부 겹치기도 하므로 첫 번째 신경망의 일부를 재사용해봐야 한다.
보통 원본 모델의 출력층을 바꿔야 한다. 이 층이 새로운 작업에 가장 유용하지 않는 층이고 새로운 작업에 필요한 출력 개수와 맞지 않을 수도 있다. 원본 모델의 상위 은닉층은 하위 은닉층보다 덜 유용하다. 새로운 작업에 유용한 고수준 특성은 원본 작업에서 유용했던 특성과는 상당히 다르기 때문이다. 재사용할 층 개수를 잘 선정하는 것이 필요하다.
1. 재사용하는 층을 모두 동결한다(즉, 경사 하강법으로 가중치가 바뀌지 않도록 훈련되지 않는 가중치로 만든다).
2. 모델을 훈련하고 성능을 평가한다.
3. 맨 위에 있는 한두개의 은닉층의 동결을 해제하고 역전파를 통해 가중치를 조정하여 성능이 향상되는지 확인한다.
4. 훈련 데이터가 많을수록 많은 층의 동결을 해제할 수 있다. 재사용 층의 동결을 해제 할 때는 학습률을 줄이는 것이 좋다.
< 케라스를 사용한 전이 학습>
먼저 모델 A를 로드하고 이 모델의 층을 기반으로 새로운 모델(model_B_on_A)를 만든다. 출력층만 제외하고 모든 층을 재사용한다.
model_A 와 model_B_on_A는 일부 층을 공유한다. model_B_on_A를 훈련할 때 model_A도 영향을 받는다. 이를 원치 않는다면 층을 재사용하기 전에 model_A를 클론해야 한다. clone_model() 메서드로 모델 A의 구조를 복제한 후 가중치를 복사한다(clone_model() 메서드는 가중치를 복제하지 않는다).
이제 작업 B를 위해 model_B_on_A를 훈련할 수 있다. 하지만 새로운 출력층이 랜덤하게 초기화되어 있으므로 큰 오차를 만들것이다(적어도 처음 몇 번의 에포크 동안). 따라서 큰 오차 그레이디언트가 재사용된 가중치를 망칠 수 있다. 이를 피하는 한 가지 방법은 처음 몇번의 에포크 동안 재사용된 층을 동결하고 새로운 층에게 적절한 가중치를 학습할 시간을 주는 것이다. 이를 위해 모든 층의 trainable 속성을 False로 지정하고 모델을 컴파일한다.
이제 몇 번의 에포크 동안 모델을 훈련할 수 있다. 그다음 재사용된 층의 동결을 해제하고(모델을 다시 컴파일 해야 한다) 작업 B에 맞게 재사용된 층을 세밀하게 튜닝하기 위해 훈련을 계속한다. 일반적으로 재사용된 층의 동결을 해제한 후에 학습률을 낮추는 것이 좋다. 이렇게 하면 재사용된 가중치가 망가지는 것을 막아준다.
최종 점수는 99.25%로 전이 학습이 오차율을 2.8%에서 약 0.7%까지 낮추었다.
그러나 이 수치를 믿어서는 안된다. 전이학습은 조금 더 일반적인 특성을(특히 아래쪽 층에서) 감지하는 경향이 있는 심층 합성곱 신경망에서 잘 동작한다.
'Deep learning > 이론(hands on machine learning)' 카테고리의 다른 글
15. 학습률 스케줄링 (0) | 2021.06.07 |
---|---|
14. 고속 옵티마이저 (0) | 2021.06.06 |
12. 배치 정규화 (0) | 2021.06.03 |
9. 학습률, 배치 크기 (0) | 2021.06.02 |
8. 신경망 하이퍼파라미터 튜닝 (0) | 2021.06.02 |