플로라도의 data workout
Trasnfer Learning vs Fine-tuning 그 차이가 뭔가요? 본문
딥러닝에서 대규모의 모델을 다룰수록 scratch부터 모델을 학습시키는 경우는 잘 없고,
기존의 대규모 데이터셋과 GPU Cluster로부터 사전에 학습된 pre-trained 모델을 활용하여 모델링을 하는 경우가 대부분이다.
그 활용 방법이 바로 Transfer Learning과 Fine-tuning이다.
Transfer Learning과 Fine tuning은 서로 연관되어 있지만 사용 방식과 사용 맥락에 약간의 차이가 있다.
Transfer Learning(전이학습)
전이학습(Transfer Learning)은 한 도메인 또는 다른 task에서 학습된 모델을 취하여 다른 도메인이나 task에 적용하는 방식이다.
예를 들어, 이미지넷으로 사전 훈련된 모델(ImageNet 21k분류를 위한 모델)을 새로운 우리의 개-고양이 이미지 분류 문제에 적용시키는 것이나,
object detection task에서 이미지의 특징 추출을 위해 사전 학습된 CNN모델(역시 ImageClassification을 위한 모델)을 도입하는 등의 경우 모두 Transfer Learinng에 해당한다.
이 때 전이학습의 핵심 아이디어는 기존의 지식(학습된 가중치와 특징)을 새로운 문제에 활용하여, 모델이 더 빠르고 효과적으로 학습하는 것을 돕는 것이다.
Fine-tuning (미세조정)
파인튜닝(fine-tuning)은 LLM의 등장 이후로 딥러닝 씬에서 가장 많이 등장하는 단어라고 해도 과언이 아닐 것이다.
아마도 LLM 파인튜닝의 열풍 이후부터, 사람들이 transfer learning과 fine-tuning을 큰 구분없이 사용하게 된 것 같다.
파인튜닝은 전이학습의 한 형태로, 사전에 훈련된 모델을 새로운 데이터셋으로 재학습하여
가중치를 새로운 데이터셋에맞게 추가적으로 조정하는 과정을 말한다.
이 때 적용할 사전 학습 모델(pretrained model)을 어느 부분을 재사용하고 어느 부분을 새로 학습시킬지 결정이 필요하다.
이 과정에서 모델의 구조는 대부분 유지되지만, 학습률(learning rate)를 일반적인 학습과정보다 1/10수준으로 낮추어 사용하여, 모델이 새로운 데이터셋에 적응하고, 가중치가 초기에 너무 급격하게 변하지 않도록 해야한다. 이는 초창기 step을 조심스럽게 가져가는 warm-up효과를 노리는 맥락과 동일하다.
파인 튜닝의 4가지 전략
Quadrant1
- new data : Large but different from pretrained dataset
새로 학습시킬 데이터의 양이 충분하고, 사전 학습된 데이터와 다른 분포의 데이터셋이라고 한다면, 전체 모델을 재학습 시키는 전략을 사용한다.
Quadrant2
- new data : Large and similar to the pretrained dataset
매우 좋은 Case에 해당하지만, 일반적으로 초기에 high information을 잡는 부분은 freeze하고 pretrained model의 뒷부분과 classifier만 새로 학습시키는 방법이 일반적이다.
Quadrant3
- new data : Small and different from pretrained dataset
가장 나쁜 case에 해당한다. 새로 학습시킬 데이터도 적은데, 그 마저도 원래 사저 학습한 데이터와 다른 분포를 띄는 경우이다. 적은 layer를 freeze하면 새로운 데이터에 학습이 잘 되지 않게 되고, 많은 layer를 파인튜닝하면 오버피팅이 발생할 위험이 있다.
Quadrant4
- new data : Small and similar to the pretrained data
모델의 입력단에 들어가는 분포가 비슷하고 풀고자하는 출력단만 다른 경우다. Classifier 부분만 재학습 시킨다.
레이어별 파인튜닝
사전 훈련된 모델의 각 층을 개별적으로 파인튜닝하는 방법도 있다.
예를 들어, high information을 담당하는 모델의 입력단의 은닉층은 낮은 학습률을 사용하여 가중치 조정을 최소화 하고,
classifier부분으로 갈수록 더 높은 학습률로 더 많은 변화를 허용하는 방식이다.
이 방식은 모델의 특정 부분이 새로운 데이터에 더 중요한 영향을 미칠 때 유효한 전략이다.
import torch
import torchvision.models as models
import torch.optim as optim
# 사전 훈련된 ResNet 모델을 불러옵니다.
model = models.resnet50(pretrained=True)
# 레이어별로 다른 학습률을 설정할 매개변수 그룹을 생성합니다.
param_groups = [
{'params': model.conv1.parameters(), 'lr': 1e-4}, # 초기 컨볼루션 층
{'params': model.layer1.parameters(), 'lr': 1e-4}, # 첫 번째 블록
{'params': model.layer2.parameters(), 'lr': 1e-3}, # 두 번째 블록
{'params': model.layer3.parameters(), 'lr': 1e-2}, # 세 번째 블록
{'params': model.layer4.parameters(), 'lr': 1e-2}, # 네 번째 블록
{'params': model.fc.parameters(), 'lr': 1e-1} # 완전 연결 층
]
# 옵티마이저 설정
optimizer = optim.SGD(param_groups, momentum=0.9, weight_decay=0.01)
# 학습 과정 (가정)
for images, labels in dataloader:
optimizer.zero_grad()
outputs = model(images)
loss = loss_function(outputs, labels)
loss.backward()
optimizer.step()
PyTorch weight freeze 예시
import torch
import torchvision.models as models
# 사전 훈련된 ResNet18 모델을 불러옵니다.
model = models.resnet18(pretrained=True)
# 모델의 모든 매개변수를 고정합니다.
for param in model.parameters():
param.requires_grad = False
# 마지막 fully connected 층을 새로운 작업에 맞게 교체합니다.
# 예를 들어, 새로운 분류 작업이 10개의 클래스를 가진다고 가정합니다.
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, 10)
# 이제, 모델의 마지막 층(fc)만이 학습됩니다.
성능 벤치마크 비교 (추가 예정)
어떤 레이어를 freeze해야 더 높은 성능을 달성할 수 있을지는 사전 학습된 데이터셋, 추가로 학습시키고자 하는 데이터셋, 그리고 모델 아키텍쳐와 learning rate등에 따라 천차 만별이며 일관된 방법은 없을 것이다.
그러나 몇가지 실험 후 기록을 남김으로써 이후 경험에 근거한 휴리스틱한 판단 준거로 삼을 수 있을 것이다.
feature extractor의 weight freeze를 한 후, classifier의 가중치만 조절
모든 가중치를 fine-tuning
Reference
https://www.mdpi.com/1424-8220/23/2/570
https://velog.io/@xuio/Transfer-Learning%EA%B3%BC-Fine-Tuning
'기초 노트 > VisionAI' 카테고리의 다른 글
앵커박스(Anchor-box)와 바운딩 박스(Bounding-box)의 차이 (0) | 2024.06.03 |
---|---|
딥러닝 FLOPs의 의미 (1) | 2024.05.02 |
translation-equivariance vs invariance 설명, "CNN은 translation invariant하다." (0) | 2024.03.06 |
Inductive bias가 뭔가요? (1) | 2024.02.16 |
뉴럴넷 컨볼루션 필터의 모양과 사이즈는 왜 정사각형일까? (1) | 2024.02.13 |