欲速不達

일을 급히 하고자 서두르면 도리어 이루지 못한다.

Fantastic AI, Fantastic World

DS | Data Science/ML | Machine Learning

[ML] Transfer Learning and Hyper Parameter Tuning

_껀이_ 2022. 9. 29. 15:10
728x90
반응형

머신러닝 이론을 공부하고 실제 문제를 머신러닝으로 해결하려고 할때, 직면하는 문제 중 하나가 '미리 학습된 모델들이 많은데, 그 모델을 활용할 수 없을까'이다. 만약 다른 사람들이 학습시켜놓은 머신러닝 모델들을 활용할 수 없고 backbone 모델 정도만 불러와서 매번 새로 학습하거나 한다면 AI 분야가 이렇게까지 발전할 수 없을 것이다.

 

Transfer Learning은 이러한 문제를 해결하기 위해 미리 학습된 모델(Source Model)을 내가 풀려는 문제의 데이터로 학습한다는 뜻이다. 간단하게 남이 만든 모델에 내가 가진 데이터를 학습시킨다는 말인데, 쫌 더 자세히 알아보자.

 

1. Transfer Learning : 전이학습

source, https://www.topbots.com/transfer-learning-in-nlp/

Transfer learning은 우선 Source Task를 지정해야 한다. Source Task는 '내가 풀려는 문제와 유사한 성격 혹은 데이터를 다루는 모델을 불러오는 것'으로 시작된다. 

  • 단, Source Task와 Target Task는 유사한 성격이나 속성을 지닌 Task이어야 한다.
  • 예를 들어, NLP 문제를 풀려고 하는데 갑자기 이미지를 학습시킨 CNN을 불러와서 학습하면 굉장히 이상한 값이 나올 것이다. 가위와 칼은 '자른다'라는 같은 목적을 띈 대체재이지만, 가위와 망치는 '도구' 혹은 '속성 : 스테인리스강' 같이 목적에서 공통점을 가지지 못하는 것처럼 말이다.

 

Source Task를 지정하고 해당되는 모델을 불러왔다면, 두 번째는 Target Task를 지정해야한다. Target Task는 '내가 머신러닝으로 풀어내고자 하는 문제 혹은 데이터'라고 할 수 있겠다.

 

Task가 지정이 됐다면, Target Task의 데이터를 Target Model에 넣어 학습을 진행한다. Target Model은 불러온 pretrained model이 될 것이며, 이때 Source Task에서 Target Task로의 Knowledge Tranfer가 일어난다고 볼 수 있다.

 

위의 이미지에서는 Task 1이 Source Task, Task 2가 Target Task이다.

도식화된 과정을 간단하게 말하면, Task 1을 먼저 학습을 하고 그 모델을 가져와서 Task 2를 학습하는게 된다. 이때, 위에 있는 Task 1을 Upstream, 아래의 Task 2를 Downstream이라고 하고 각각의 학습과정을 Pretrain, Fine-Tuning이라고 한다. 

 

+ 추가) 

Fine-Tuning시에 주의할 점은 Task 1에서 사용된 모델을 Task 2에서도 사용하는 것이기 때문에 입출력 값의 크기를 맞춰주어야 한다는 것이다. 이때, 입력측이 되는 con1와 출력층이 되는 fc의 가중치값을 Xvier Uniform으로 초기화해준다.

  • Xvier Uniform : 이전 노드와 다음 노드의 개수에 의존하여 가중치를 초기화하기 위한 값

       : Xavier Uniform은 비선형함수(ex. sigmoid, tanh 등)에서 효과적인 결과를 보여준다. ReLU 함수에 적용시에는 출력            값이 0에 수렴하므로 다른 초기화 방법을 사용해야 한다.

 

예시 코드)

target_model.conv1 = torch.nn.Conv2d(FASHION_INPUT_NUM, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
target_model.fc = torch.nn.Linear(in_features=512, out_features=FASHION_CLASS_NUM, bias=True)

torch.nn.init.xavier_uniform_(target_model.fc.weight)
stdv = 1. / math.sqrt(target_model.fc.weight.size(1))
target_model.fc.bias.data.uniform_(-stdv, stdv)

 

 

2. Hyper Parameter Tuning : 하이퍼파라미터 튜닝

Hyper Parameter Tuning은 두 가지 프로세스로 나뉜다.

    1) Tuning의 목적 정하기 : 종속변인(Objective)

        : Hyper Parameter Tuning 할때는 사용자가 지정한 종속변인(Objective)가 존재해야 해당되는 특정 값을 최대화 혹은          최소화할 수 있다. 

        ex) 데이터셋의 Accuracy를 최대화하겠다. (이때 Accuracy가 종속변인이 됨)

    2) Tuning할 Hyper Parameter 정하기 : 조작변인, 통제변인

        : 조작변인은 Tuning을 하면서 값을 변화시킬 것, 통제변인은 고정시킬 것이다.

        ex) 조작변인 : epoch, batchsize, learning rate 등 / 통제변인 : 모델 구조 등

 

Hyper Parameter Tuning을 하는 방법에는 여러 방법과 라이브러리가 있으나 위의 두 가지 규칙에 따라 실행한다.

 

+ 추가)

Hyper Parameter Tuning 라이브러리 : Ray - Tune

print("Install ray")
!pip uninstall -y -q pyarrow
!pip install -q -U ray[tune]
!pip install -q ray[debug]

Ray 프레임워크는 Colab 환경에는 설치되어있지 않아서 설치하는 방법을 메모한다.

Ray는 Distributed application을 만들기 위한 프레임워크로, 분산컴퓨팅 환경에서 많이 사용된다. Ray 프레임워크 안에 Tune 라이브러리를 사용하면 파라미터 튜닝이 비교적 수월해질수 있을 것이다.

 

Ref - https://docs.ray.io/en/master/tune/index.html

 

Tune: Scalable Hyperparameter Tuning — Ray 3.0.0.dev0

To run this example, install the following: pip install "ray[tune]". In this quick-start example you minimize a simple function of the form f(x) = a**2 + b, our objective function. The closer a is to zero and the smaller b is, the smaller the total value o

docs.ray.io

 

728x90
반응형