pretrained model & transfer learning에 대해 제대로 이해하기

0. computer vision은 왜 발전했을까

 

YOLO는 실시간으로 object detection을 가능하게 만들었다

 

길, 사람, 자동차 등을 segmentation하여 더욱 수준 높은 self driving을 구현하려고 노력하고 있다

 

 

 

이것은 어떻게 가능했을까? ImageNet이라는 대형 dataset이 등장한 것이 엄청난 영향력을 행사했다고 말할 수 있다

 

고도화된 알고리즘이나 모델이 아닌 약 1400만개의 image와 20000개의 category를 보유한 단순한 대용량의 대형 dataset

 

실생활에서 발견할 수 있는 다양한 variance들을 다 충족할 수 있는 엄청 큰 대형 dataset

 

그래서 획기적인 알고리즘 개발이 물론 중요하지만 ImageNet에 검증을 못하면 그런 알고리즘도 실생활에 쓸 수 있을지 의문

 

ImageNet이후 데이터 구축도 정말 중요한 요소로 자리잡고 있고 등장하는 모델들의 성능은 끝을 모르고 점점 높아짐

 

왜냐하면 대형 dataset이 존재하니 이들로 자유롭게 학습할 수 있고 여러 실험을 하여 검증이 계속 가능해서 그렇다

 

 

1. pretrained model은 왜 중요할까

 

1-1) introduction

 

매번 좋은 모델을 직접 설계하는 것은 쉽지가 않다

 

시간이 무한하면 여러가지 시도를 해보겠지만 기존 논문에서 나온 여러 좋은 모델들이 많고

 

거기서 학습된 weight를 잘 활용한다면 시간을 많이 절약할 수 있을 것

 

ImageNet에서 대용량으로 학습을 잘 한 모델들은 목적 task에 최적화된 parameter를 가지고 있다

 

그런 모델들은 연구를 많이하여 잘 설계되었다

 

데이터에 높은 성능이 이미 검증된 모델들이다.

 

 

1-2) background

 

augmentation으로 모델의 일반화능력을 올리려고 시도했지만 사실 데이터의 단순한 변형일 뿐이다.

 

진정으로 중요한것은 데이터의 다양성

 

그런데 매번 많은 이미지를 학습할 수 있으면 좋겠지만 항상 그런 자원이 있는 것은 아니다

 

좋은 품질의 대용량 데이터로 미리 학습한 모델이 있어서 활용할 수 있다면?

 

내가 설계하고 있는 기존 모델과의 관련성을 생각하여 나의 문제 해결 목적에 다듬어 활용한다면 성능 향상에 큰 도움이 될 것이다

 

 

1-3) ImageNet의 pretrained model을 사용하는 방법

 

torchvision.models를 이용하면 한줄만으로 pretrained model을 아주 쉽게 사용할 수 있다

 

timm이라는 library도 유명한가봄

 

torchvision.models보다 더 변칙적으로 다양한 실험을 해서 모았다는데

 

이것들만 사용해도 보통 성능 향상이 엄청날 것이라고함

 

2. pretrained model을 그냥 써도 될까?

 

pretrained model이 좋은 것은 알겠는데 ImageNet으로 학습한 것이 아닌가?

 

ImageNet task는 보통 분류 class가 1000개여서 마지막 단 layer의 분류 feature 수가 1000개임

 

pretrained model code로 확인한 모델 구조

 

하지만 보통 사람들이 직면한 문제는 이렇게 많은 분류를 하지는 않는다… 당장 대회만해도 18개

 

그렇다고해서 안쓸수는 없는데 어떻게 하면 pretrained model을 활용할 수 있을까?

 

 

2-1) ImageNet pretrained model

 

실생활에 존재할법한 다양한 variance를 표현한 ImageNet의 대용량 데이터를 CNN backbone 구조가 받아 feature를 추출하고

 

추출한 feature를 바탕으로 classifier에서 1000개의 서로 다른 class로 구분함

 

그런데 pretrained model을 쓰려고하는 내가 직면한 문제가 “실생활에 존재할법한”에 부합한지?

 

pretrained model을 쓰기 전에는 그 model이 어떤 문제를 풀기 위해 쓴 것인지 반드시 살펴보고 나서 사용하는 것이 좋다

 

ImageNet의 pretraining 과정

 

backbone에서는 feature를 추출하고 classifier에서는 feature를 class로 구분해준다

 

 

2-2) 예시로 이해하는 pretrained model

 

구름 위성 사진을 보고 구름 종류를 분류하려는 문제를 풀고자 한다

 

ImageNet은 실생활에 존재할 법한 강아지, 고양이, 사과, 의자 등에 관한 class 분류 데이터

 

ImageNet에 이런 구름 위성 사진이 존재할까?

 

심지어 ImageNet은 1000개의 class를 분류하는 데이터로 구름 종류가 1000개나 될까?

 

pretrained model이 우리 문제와 어느 정도 연관성이 있는지 유사성을 잘 파악하고 있어야 pretrained model을 활용하면서 여러 응용이 가능하다

 

그럴려면? 나의 문제를 명확히 파악하고 있어야함

 

 

 

3. transfer learning을 제대로 하는 방법 - 학습 데이터가 충분한 case

 

3-1) feature extraction

 

나의 문제를 해결하기 위한 데이터가 충분하다면? 사실 데이터가 충분하면 뭐든 할 수 있음

 

사용하고자 하는 pretrained model의 목적 task와 나의 task가 매우 유사하다면?

 

실생활에서 주로 볼법한 의자 10개의 class를 구분하고자함

 

이런 경우는 pretrained backbone network에 대한 training은 필요가 없음.. 그래서 시간은 매우 절약할 수 있음

 

왜냐하면 ImageNet의 image로부터 backbone network에서 추출한 feature의 특성과

 

내가 직면한 문제 task의 데이터로부터 추출할 수 있는 feature의 특성은 분명 비슷할 것

 

pretrained backbone의 마지막 classifier만 내가 직면한 문제 task의 class로 수정하여 학습시키면 충분하다

 

backbone을 어떻게 freeze 시킬 수 있냐고??? 직접 찾아보라는데??

 

(당시에는 몰랐지만 이제는 몇번 해보긴 했지..)

 

이러한 과정을 “feature extraction” 이라고 부른다

 

 

3-2) fine-tuning

 

반면 나의 문제와 주제가 다르다면?

 

비슷해보이는 차종의 brand를 분류하고자 한다

 

ImageNet이 완전히 다른 의자와 자동차를 보고 자동차라고 말해줄 수 있겠지만 현대차랑 기아차를 구분할 feature를 추출할줄은 모를것

 

그러나 나의 문제를 해결할 학습데이터가 충분하다면 backbone network도 충분히 학습시킬 수 있어

 

그래서 이 경우는 backbone network와 classifier를 모두 학습시켜야한다.

 

 

그러나 pretrained backbone network의 pretrained parameter를 버리고 randomization을 하고 나서 나의 데이터로 학습을 하는 것이 아니라

 

pretrained parameter를 첫 parameter로 사용하여 학습을 한다면 수렴속도나 결과가 좋다는 것이 여러 경험에 의해 알려져있다.

 

 

이미 pretrained parameter에서 나의 데이터로 학습을 하여 미세하게 parameter를 조정한다고 하여 fine tuning 과정이라고 부른다

 

feature extraction 과정과 fine tuning 과정

 

4. 학습 데이터가 충분하지 않은 case

 

나의 문제를 해결할 학습 데이터가 충분하지 않다면 최적으로 trainable하게 만들어도 데이터를 전부 반영하기 어렵다

 

그러나 pretrained model의 목적 task와 내 문제의 task가 유사성이 높다면

 

가지고 있는 데이터로 pretrained backbone의 parameter를 업데이트하기는 애매하니

 

대량으로 학습한 backbone는 그대로 사용하여 feature를 추출하고

 

이 feature가 내 문제의 task의 특징을 잘 반영한다고 충분히 생각할 수 있고 classifier만 수정하여 feature를 분류하는 학습을 진행하면 충분하다…

 

그러나 pretrained model의 목적 task와 나의 task가 유사하지 않다면 차라리 사용하지 않는 것이 낫다

 

오히려 overfitting과 underfitting할 가능성이 높고 그냥 아무것도 안될 가능성도 높다

 

pretrained model이 아무리 좋다고 소문이 나도 그만큼 납득할만한 기본적인 조건이 있어야 성능 보장이 된다

 

pretrained model의 task와 유사성이 적다면 차라리 쓰지 않은 것이 나을 수 있다

 

 

pretrained model도 성능이 좋았다고 함부로 사용하는 것이 아니라

 

내가 마주친 문제와 pretrained model의 목적 task가 얼마나 유사한지 잘 파악하는 것이 중요하고

 

내가 데이터를 얼마나 가지고 있는지 파악하여 그에 맞는 transfer learning 전략을 적절히 세우는 것이 중요하다

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

TAGS.

Comments