AI

전이 학습 (Transfer Learning)

klee9 2024. 8. 26. 11:24

프로젝트를 진행하면서 UTKFace와 같이 중간 사이즈의 데이터셋(약 25,000장의 이미지 데이터)을 사용할 때는 데이터 증강(Data Augmentation)과 pre-trained 모델을 fine-tuning 및 전이 학습하는 방법이 효과적이라는 사실을 알게 되었다. 데이터 증강은 직관적으로 이해할 수 있었고 구현에 있어서 어려움이 없었지만, fine-tuning과 전이 학습에 대해선 더 알아봐야 할 필요성을 느꼈다. 

 

우선 fine-tuning은 기계 학습, 특히 딥러닝 모델을 새로운 작업에 맞게 조정하는 기술이다. 기존에 학습된 모델을 바탕으로 새로운 데이터나 작업에 맞춰 모델의 성능을 개선하는 과정을 포함하며, 일반적으로 전이 학습(Transfer Learning)의 일환으로 사용된다. 

 

그렇다면 전이 학습이란 뭘까? 전이 학습이란 기계 학습, 특히 딥러닝에서 기존에 학습된 모델(pre-trained model)의 지식을 새로운 작업에 적용하는 기술이다. 이는 모델이 이미 학습한 지식을 활용하여 새로운 문제를 해결할 수 있도록 돕는 방법으로, 주로 데이터가 부족하거나 새로운 작업에 대해 모델을 처음부터 학습시키기 어려울 때 유용하게 사용된다. 

 

전이 학습에 사용되는 몇몇 모델, 특히 이번 프로젝트에서 사용하고 있는 ResNet 모델은 합성곱 신경망(Convolutional Neural Networks, CNN) 구조를 가지고 있다. 일반적으로 CNN의 구조는 두 부분으로 구분할 수 있다. 

 

  • Convolutional base
    이미지에서 특징을 추출하는 컨볼루션 층(convolutional layers)과 데이터의 차원을 줄이고, 중요한 특징을 유지하는 풀링 층(pooling layers)으로 구성되어 있다. convolutional base의 목표는 이미지로부터 특징을 효과적으로 추출하는 것(feature extraction)이다. 

  • Classifier
    주로 완전 연결 계층(fully connected layer)로 이루어져 있다. 완전 연결 계층이란 모든 계층의 뉴런이 이전 층의 출력 노드와 하나도 빠짐없이 모두 연결되어 있는 층을 말한다. Classifier의 최종 목표는 이미지를 알맞은 카테고리로 분류하는 것이다.

 

다음은 CNN을 기반으로 하는 모델의 단순화된 구조를 나타낸 것이다. 

 

 

여기서 한 가지 주목해야 할 점은 딥러닝 모델이 계층적인 특징을 스스로 학습한다는 점이다. 즉, 위 그림에서 convolutional base의 낮은 레벨의 계층은 일반적인 특징을 추출하도록 학습이 이루어지고, 높은 레벨의 계층과 classifier 부분은 특정 데이터셋에서 나타날 수 있는 구체적인 특징을 추출해내도록 하는 학습이 이루어진다. 

 

전이 학습에서는 이 특징을 사용하는데, pre-trained 모델에 있던 classifier를 없애는 것으로 시작한다. classifier를 삭제하고, 목적에 맞는 새로운 classifer를 추가한다. 그 후 마지막으로는 새롭게 만들어진 모델을 다음 세 가지 전략 중 하나로 fine-tuning 한다.

 

  1. 전체 모델을 새로 학습시키기
    이 방법은 모든 레이어를 unfreeze 하여 사전학습 모델의 구조만 사용하면서 내 데이터셋에 맞게 전부 새로 학습시키는 방법이다. 더 정확히는 모든 레이어의 가중치를 업데이트하면서 학습을 진행하는 것이며, 모델을 처음부터 학습시키기 때문에 큰 데이터셋을 필요로한다. 

  2. 일부 레이어만 새로 학습시키기
    마지막 몇 개의 레이어를 unfreeze 하여 해당 레이어만 가중치 업데이트가 되도록 하는 방법이다. 만약 사용할 데이터셋이 작고 모델의 파라미터가 많다면 과적합의 위험성이 있기 때문에 적은 계층만 학습시키고, 데이터셋이 크고 모델의 파라미터가 적다면 더 많은 계층을 학습시켜도 된다. 

  3. classifier(fully connected layer)만 새로 학습시키기
    convolutional base는 freeze하고, classifier만 unfreeze하는 방법이다. 이 방법은 컴퓨팅 연산 능력이 부족하거나 데이터셋이 너무 작을때, 혹은 내가 풀고자 하는 문제가 pre-trained 모델이 이미 학습한 데이터셋과 매우 비슷할 때 고려해볼 수 있다.

 

 

 

이 내용을 토대로 프로젝트에서 사용하고 있는 ResNet101 모델에 전이 학습을 적용해 보았다. 

 

우선 프로젝트에서 사용하고 있는 pre-trained ResNet101 모델은 다음과 같은 구조를 갖고 있다.

 

ResNet(
  (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
  (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (relu): ReLU(inplace=True)
  (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
  (layer1): Sequential(
    (0): Bottleneck(...)
    )
    (1): Bottleneck(...)
    (2): Bottleneck(...)
  )
  (layer2): Sequential(
    (0): Bottleneck(...)
    )
    (1): Bottleneck(...)
    (2): Bottleneck(...)
    (3): Bottleneck(...)
  )
  (layer3): Sequential(
    (0): Bottleneck(...)
    )
    (1): Bottleneck(...)
    (2): Bottleneck(...)
    (3): Bottleneck(...)
             ...
    (21): Bottleneck(...)
    (22): Bottleneck(...)
  )
  (layer4): Sequential(
    (0): Bottleneck(...)
    )
    (1): Bottleneck(...)
    (2): Bottleneck(...)
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (fc): Linear(in_features=2048, out_features=5, bias=True)
)

 

크게 layer1, layer2, layer3, layer4, 그리고 마지막 fully connected layer로 나뉘는 것을 확인할 수 있다. 위에서 언급했던 세 가지 전략 중 어떤 방법이 가장 효과적인지 찾기 위해 모든 방법을 시도해 보았고, 각 경우의 수에 대해 에포크를 10번 실행해 본 결과, layer2, layer3, layer4를 unfreeze 했을 때 가장 좋은 결과가 도출되었다. 

 

 

왜 이런 결과가 나왔는지 궁금해져서 해석을 해보았다. 주목할 만한 부분은 ImageNet의 데이터가 UTKFace 데이터셋보다 훨씬 많다는 것과 두 데이터셋의 유사도가 낮다는 점이다. 

 

  1. unfrozen = layer4
    UTKFace 데이터셋과 ImageNet의 유사도가 낮기 때문에 마지막 레이어만 새로 학습시키면 구체적인 특징을 추출하지 못 할 가능성이 높으며, ImageNet에서 학습하면서 얻은 가중치를 새로운 학습에 유의미하게 사용하지 못 해 정확도가 낮게 나온 것으로 판단된다.

  2. unfrozen = layer3, layer4
    layer3, layer4에서 ImageNet 데이터의 구체적인 학습이 이루어지는 것 같다. 이 부분을 unfreeze 함으로써 UTKFace 데이터셋에 맞게 학습이 되어 비교적 높은 정확도가 나온 것이라고 생각한다.

  3. unfrozen = layer2 ~ layer4
    layer3, layer4만 unfreeze 하는 것과 차이가 나는 이유가 명확하게 보이진 않았지만, 아마도 layer1에서 사물에 대한 일반적인 특징을 추출하고 layer2에서부터 ImageNet 데이터의 구체적인 학습이 이루어지는 것 같았다. layer2 ~ layer4를 unfreeze함으로써 UTKFace에 적합한 가중치 업데이트가 이루어져 가장 높은 정확도를 보이는 것 같다.  

  4. unfrozen = layer1 ~ layer4
    모든 레이어를 unfreeze해 모든 가중치에 대한 업데이트가 이루어진다. 모델의 구조만 사용하는 방법으로, ImageNet에서 얻은 일반적인 특징에 대한 정보를 제대로 사용하지 못 하고 훈련 데이터셋에 과적합되어 정확도가 비교적 낮게 나오는 것으로 생각한다.

 

결과적으로 기존 데이터셋에 대한 구체적인 특징을 추출하는 레이어를 unfreeze 하는 것이 가장 효과적이었다. 이렇게 일부 레이어만 새로 학습 시키는 방법 외에도 데이터 증강과 같이 정확도를 높일 수 있는 방법이 있기 때문에 더 실험해 볼 필요성이 있다. 

'AI' 카테고리의 다른 글

[AI] MediaPipe Hands: 손바닥 탐지 모델 분석  (0) 2024.12.25
3D Pose Estimation  (0) 2024.11.21
합성곱 신경망 (Convolutional Neural Network, CNN)  (0) 2024.09.01
Cross Entropy Loss  (0) 2024.08.20
선형 회귀 (Linear Regression)  (0) 2024.08.12