728x90
반응형

누구나 한번쯤 봤을 법한 AI의 한계 이미지

Transfer Learning (전이 학습)

  앞서 다룬 내용과 달리, 대부분 CNN 네트워크를 처음부터 (랜덤 초기화로) 훈련하지 않는다. 왜냐하면 충분한 크기의 dataset을 가지고 있는 것은 비교적 드물기 때문이다.대신 매우 큰 dataset을 통해 미리 훈련한 다음, 이를 훈련된 값으로 초기화 하거나, feature extractor로 활용한다.

Feature extractor로서의 ConvNet

  pre-trained ConvNet을 가져와서 마지막 FC layer를 제거한다. AlexNet의 경우 class 1000개에 대한 마지막 FC layer가 사라지고 4096d의 벡터가 남는다. 여기까지 pre-trained 된 Conv를 사용하고 마지막만 자신의 dataset에 맞는 classifer를 추가 및 학습시켜 사용한다.

Fine-tuning

  ConvNet 위와 같이 classifer를 교체하고 재훈련하는 것뿐만 아니라, 미리 훈련된 네트워크의 가중치도 계속해서 역전파하여 튜닝하는 것이다.ConvNet의 모든 layer를 튜닝할 수 있으나, overfitting에 대한 우려로 초반의 layer는 고정하고 깊은 layer만 일부 튜닝하는 방법도 좋다. 이는 초반 layer가 이미지의 대략적인 특징 및 일반적인 특징을 관찰한다고 해석하고, 후반 layer가 세부적인 특징을 관찰한다고 해석했기 때문이다.예시로, ImageNet은 많은 개가 포함되어있기때문에 후반 layer는 주로 개를 구분하는데 학습되었다는 가정하자. 따라서 다른 사람이 미리 학습해놓은 Pretrained 모델을 사용하는 것이 일반적인 방법이다.

언제 그리고 어떻게 튜닝을 할까?

  새로운 dataset에 대해 수행해야 할 전이 학습의 유형을 결정하는 방법은 무엇일까?가장 중요한 것은 새 dataset의 크기와 원래 dataset과의 유사성이다.우선 ConvNet 특성이 초기 layer에서는 더 일반적이고 나중 layer에서는 원래 dataset에 특화된다는 것을 염두해두자.

  • 새로운 dataset이 작고 원래 dataset 과 유사하면, fine-tuning 하는 것은 과적합 우려 때문에 부적합하다.
  • 새로운 dataset 이 크고 원래 dataset 과 유사하면, 더 많은 데이터를 가지고 있기 때문에 fine-tunning해도 과적합하지 않을 것으로 예상된다.
  • 새로운 dataset 이 작고 원래 dataset과 다르면, classifier만 훈련하는 것이 좋을 수 있다. 다만 dataset이 작기 때문에 초기 layer부터 훈련하는건 권장하지 않으며, 다른 방법으론 초기 layer 중 일부 통과한 후 바로 classifier와 연결하여 훈련시키는게 좋을 수도 있다.
  • 새로운dataset이 크고 원래dataset과 다르면, 처음부터 ConvNet을 훈련할 수 있을 것으로 예상된다. 그러나 실제로는 pre-trained 모델의 가중치를 사용하는 것이 여전히 좋을 수 있다. 또한 전체 네트워크를 fine-tuning 해도 무방하다.

실용적인 조언

  Pre-trained 네트워크를 사용하려면 새 dataset에 사용할 수 있는 아키텍처에 대해 약간 제약이 있을 수 있다.예를 들어, 네트워크에서 Conv layer를 임의로 제거할 수 없다.다만 parameter sharing으로 크기를 일부 변경하는 것은 가능하다.Conv/Pool/FC 상관없이 동일하게 가능하다.추가로 learning rate에 대한 일반적인 고려사항 존재한다.ConvNet 가중치의 fine-tunning에는 처음부터 훈련하는 경우 보다 더 작은 learning rate을 사용해아 한다.그 이유는 pre-trained 네트워크의 가중치가 상대적으로 더 좋다고 가정하기 때문에, learning rate가 똑같거나 더 크면 너무 빨리 그리고 너무 많이 왜곡될 수 있다고 보기 때문이다.

반응형
728x90

Reference

CS231n 강의 노트 : https://cs231n.github.io/transfer-learning/

카테고리를 마무리 하며...

  "딥러닝의 기본" 이라는 주제로 공부했떤 CS231n의 포스팅이 완료되었다. 처음 시작했던 목표였던 기초정리에 관해서 기존에 알고있던 내용, 새로 알게된 내용이 깔끔하게 정리되었다. 개인적인 목표는 충분히 달성하였는데, 누구든 이 카테고리의 어떤 게시글을 읽더라도 나처럼 도움이 되었으면 좋겠다. CNN 포스팅 가장 하단에 코멘트 했듯이, 이제는 초기 모델인 LeNet부터 시작하여 사람들의 주목을 많이 받고 SOTA를 달성했던 여러 논문을 한개 한개 리뷰해볼 생각이다. 이 글을 작성하는 지금 이순간은 모든 구조가 Transformer라는 매우 막강한 모듈로 통합되고 있는듯한 분위기이지만 기초부터 탄탄해야하지 않겠는가...

728x90
반응형

+ Recent posts