Programming/python-deep learning

Pretrained model, checkpoints, Fine-Tuning, Transfer Learning 정리

방황하는 데이터불도저 2023. 7. 5. 22:13

* 공부용으로 자료 조사한 것들을 토대로 정리한 내용입니다. 틀린 내용이 있다면 댓글 부탁드립니다.

 

아래의 4가지 사이에는 밀접한 연관이 있다. 해당 개념들은 워낙 범용적으로 쓰이다보니 원래 알던 개념과 조금씩 다른 부분도 있고, 계속해서 헷갈리는 부분이 생기는 것 같아 여러 문서들을 참고하여 번역하고, 정리해보았다. pretrained model과 checkpoints의 개념, fine-tuning과 transfer learning간에 개념을 정확히 알기 위해 목적이나 방법에 대한 내용을 담았다.

Pretrained model : 사전 학습된 모델
checkpoints : 모델의 체크포인트
Fine-Tuning : 파인튜닝
Transfer Learning  : 전이학습

 

먼저 pretrained model과 checkpoints의 차이를 보자.

 

Training checkpoints | TensorFlow Core 공식 문서에 따르면, 모델을 저장한다는 것에는 두가지 의미가 있다.

  1. checkpoints를 저장하는 것
  2. SavedModel을 하는 것

Checkpoints를 저장한다는 의미는 모델의 모든 parameters의 값들을 뽑아온다는 의미이다.  

  (the exact value of all parameters used by a model = tf.Variable objects)

그 외의 모델의 structure와 같은 정보는 저장하지 않기때문에, checkpoints만 가지고 있는 경우는 무용지물이고, parameter를 저장했던 모델의 구조가 담겨있는 source code가 있어야지만 사용이 가능하다.

 

SavedModel을 하는 것이 바로 Pretrained Model을 생성하는 것이다.

checkpoints를 포함하여 모델에서 정의된 연산에 대해 직렬화한 내용을 포함하는데, 쉽게 이야기하면 parameters를 계산해주는 모델 아키텍처의 모든 정보를 컴퓨터에 저장한다는 의미다. 결국 모델의 구조, 구성(architecture)과 그 모델로 학습시킨 결과물(weights=parameters)을 모두 저장해두었다가, 나중에 다시 불러와서 마저 학습 시킬 수 있도록 하는 것이다.

 

Tensorflow, Pytorch, Hugging Face, etc,, 을 보면 이러한 pretrained model들을 오픈소스로 많이 풀어놓았는데, checkpoints가 있는 것이 있고, 없는 것도 있으니 확인해보고 잘 활용하면 된다.

 


이번엔 전이학습과 파인튜닝에 대해 알아보자.

A task를 위해 기존에 학습시킨 모델 A'이 있다. A'에 추가 학습을 시켜서 비슷한 B task에도 좋은 성능을 낼 수 있도록 하는 B' 모델을 생성하기 위해서 Transfer Learning(전이학습)을 할 수 있다. 예를 들어, 차를 인식하는 모델이 있었는데, 그 모델에 마지막 layer만 추가, 초기화하여 트럭 이미지를 새로 학습시키고, 어떤 이미지를 넣었을 때 트럭인지 아닌지를 맞추는 모델을 만드는 과정을 전이학습이라 할 수 있다. 일반화시켜보면 전이학습은 A에 대한 데이터들을 잔뜩 사전학습(pre-training)시켜둔 pretrained model을 가져와서 마지막 layer를 수정하여, 마지막 layer만 학습 또는 일부 추가 layer들의 weights값들을 새로운 데이터로 학습시키는 과정이다.

전이학습(Transfer Learning)의 목적
 : A task를 위한 모델을 B task를 위한 모델로 만들기 위함이다.

 

** 전이학습에서 주의할 점은 input의 종류가 같아야한다는 것이다. 이미지모델이라면 이미지 인풋, 음성모델이라면 음성 인풋을 넣어주어야하는 것이다. (output은 달라진다.) 하나의 예시로 이미지 모델에서 high-end DSLR의 사진과 mobile phone의 사진의 분포는 상당히 다르다. 이러한 경우는 인풋이 다르다고 봐야한다.

 

전이학습을 사용하는 것이 언제나 효과적이진 않다. 사용하기에 적합한 상황이 있다.

 

1. 기존 사전학습시킨 모델의 인풋과 새로운 task의 모델의 인풋이 같은 타입인 경우.

2. 보편적으로 새로운 데이터가 모델 전체를 학습시키기에 충분하지 않을 때 전이학습이 효과적일 수 있다. A task의 데이터는 방대하고, 내가 원하는 B task의 데이터는 매우 희박한 경우에 전이학습으로 효과를 볼 수 있다는 말이다.

3. 만약 B task에 대한 학습데이터가 충분하다면 전체 모델을 재학습시켜주는 방식으로 전이학습을 시킬 수 있다. 이 때는 A task에 대한 데이터를 학습시키는 것은 별다른 효과를 주지 못한다. 보편적으로 데이터 양이 충분해서 새로 학습시켜주는 layer가 많아질수록 정확도는 올라가지만 많은 계산량이 소비된다는 단점이 있다.

 

위의 이야기를 다시 말해보면, 데이터가 많을 수록 모델의 학습시킬 unfreeze layer들의 비율이 커지고, 데이터가 적을 수록 freeze layer(pre-trained layer)의 비율이 커진다. 최소한의 전이학습은 B task에 대한 output을 얻기 위해 마지막 output layer만 수정(unfreeze)하여 업데이트해주는 것이다. 

 

이에 따라 내가 가진 데이터 양에 따라서 Transfer Learning 전략을 아래의 그림처럼 세울 수 있다.

(freeze = weights값 고정 = backpropagation step에서 update하지 않는다. ↔ unfreeze = freeze의 반대)

 

파인튜닝(Fine Tuning)이라는 것은 위에서 설명한 전이학습으로의 접근(전이학습을 수행하기 위해 하는 방법 중 하나)이다. 이 부분이 매우 헷갈리는 지점인데, 우선 파인 튜닝한다는 것은 "전이학습을 위해 모델의 layer들을 파인튜닝한다."라고 표현할 수 있다. (위에서 언급한 것처럼 전이학습을 위해서 전체 neural network에 대해 파인튜닝할 수도 있고, 부분 layers 에 대해서 frozen시켜 일부 layers만 파인튜닝할 수도 있다.)

 

** 사실 해당 단어의 의미로는 미세 조정, 세부 조정의 뜻을 담고있어서 크게보자면 사전학습에서 뿐만 아니라 모든 상황에서 어떤 모델의 성능을 높혀주기 위해서 모델의 아주 미세한 조정을 해주는 과정을 통틀어 이야기할 수 있다. 하지만 해당 글에서는 전이학습에서의 파인튜닝에 대해서만 언급하도록 하겠다.

 

예시를 들어 설명해보면, 

  1. 이미지 인식 모델 A를 위한 100만장의 이미지를 사전학습(pre-training)시키는 것을 먼저 수행한다. 이미지 처리에서는 공통적으로 lower-level features(점, 선, 엣지 등의 이미지의 특징) 추출 과정을 수행하기 때문에 input layer와 가까운 초반 레이어들(=earlier layers)을 사전 학습시켜주는 것이다. 따라서, 사전학습시킨 부분은 frozen 시키고, output layer와 가까운 후반 레이어들(=later layers)에서는 layer를 수정하거나 unfreeze시켜서 high-level features(모델B가 원하는 결과 ex. 방사의학과 x-ray사진)를 추출하기 위해 학습시켜주는 경우가 있다. 이 뒷 부분의 과정이 바로 Fine-Tuning이다.
  2. 대용량의 언어데이터(코퍼스)를 학습시킨 pretrained model의 사전 학습된 weights를 starting points로 재사용하고, 아키텍처의 뒷부분에 B task에 맞는 새로운 layer를 하나 더 추가하여 학습(fine-tuning)시킬 수 있다. 

기본적으로 이러한 파인튜닝은 supervised learning (지도학습)에서 하는 것이며, 최근에는 weak supervision, reinforcement learning에서도 결합하여 사용하기도 한다.  

 

 

REFERENCES

위키백과 - 파인 튜닝(Fine Tuning)

위키백과- 전이 학습(Transfer Learning)

앤드류 응 교수님의 강의 - Transfer Learning