인공지능 개발자 수다(유튜브 바로가기) 자세히보기

자연어처리/LLM을 위한 코딩

[LLM] 파인튜닝(fine-tunning) (9)

Suda_777 2025. 2. 28. 04:42

목차

    반응형

     

    1. 파인튜닝(fine-tunning)이란

    Pre-tained Model (기본 언어 능력을 학습한 모델)을 기초로 하여

    특정 상황에 맞는 사용을 위해 추가로 학습하는 것을 파인튜닝(fine-tunning) 이라고 한다.

     

    pre-train과 비교

    • pre-train
      • 일반 말뭉치를 사용해 학습
      • 다음 단어를 예측하는 형식으로 학습, 즉 다음단어가 target이 되는 형식임
      • 방대한 데이터로 학습하여 모델의 기본 지능을 만드는 과정
    • fine-tunning
      • 상황에 맞는 input과 output을 학습함. 즉, supervised learning
      • pre-trained 모델을 가져와 특정 태스크에 맞는 소규모 데이터셋으로 추가 훈련

    2. 데이터셋 준비

    2.1. 데이터 설명

    어떤 도메인의 모델을 학습할지 먼저 정해야 한다.

    다음으로 특정 도메인에 대한 데이터를 준비한다.

    그리고 토크나이저를 이용해 input, target 형식으로 전처리를 해줄 것이다.

     

    도메인 별로 어떤 데이터들이 있는지

    예시를 통해 확인해 보자.

     

    텍스트 분류 (예: 감정 분석)

    [
      {"text": "이 영화 정말 감동적이었어!", "label": "긍정"},
      {"text": "완전 지루하고 시간 낭비야.", "label": "부정"},
      {"text": "그냥 평범한 영화였어.", "label": "중립"}
    ]

     

    질의응답 (QA 모델)

    [
      {
        "context": "서울은 대한민국의 수도이다.",
        "question": "대한민국의 수도는 어디인가?",
        "answer": "서울"
      },
      {
        "context": "아이폰은 애플에서 제조한 스마트폰이다.",
        "question": "아이폰을 만든 회사는?",
        "answer": "애플"
      }
    ]

     

    텍스트 요약

    [
      {
        "text": "대한민국은 동아시아에 위치한 국가로 수도는 서울이며, 한반도의 남쪽에 있다.",
        "summary": "대한민국은 동아시아에 위치한 국가이며 수도는 서울이다."
      },
      {
        "text": "AI 기술은 점점 발전하고 있으며, 자연어 처리 분야에서도 큰 성과를 보이고 있다.",
        "summary": "AI 기술은 자연어 처리 분야에서 발전하고 있다."
      }
    ]

     


    2.2. 데이터 불러오기

    2.2.1. 데이터셋 설명

    이번 예시는 QnA 데이터 셋이다.

    불러올 데이터 형식은 다음과 같다.

    DatasetDict({
        train: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx'],
            num_rows: 3668
        })
        validation: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx'],
            num_rows: 408
        })
        test: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx'],
            num_rows: 1725
        })
    })

     

     

    데이터 불러오기

    from datasets import load_dataset
    
    raw_datasets = load_dataset("glue", "mrpc")
    print(raw_datasets)

     

     

     

    2.2.2. 데이터 전처리

    학습에 필요한 데이터는 input 데이터, target 데이터가 있다.

    우리가 작업할 예시 데이터는 input에는 sentence1, sentence2 가 있고

    target인 label은 숫자 형태이기 때문에 그냥 사용하겠다.

     

    이때, 문자열 형식의 데이터인 sentence1, sentence2는 토크나이저(tokenizer)로 숫자 형태로 변형해 준다.

    from transformers import AutoTokenizer
    
    model_name = "bert-base-uncased"
    tokenizer = AutoTokenizer.from_pretrained(checkpoint)
    
    def tokenize_function(example):
        return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
    
    tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
    print(tokenized_datasets)

     

    tokenizer 실행 결과로 데이터셋에 새로운 피처가 생긴다.

    새로 생긴 피처 : input_ids, token_type_ids, attention_mask

    토크나이저의 결과로 생긴 데이터는

    모델의 input으로 들어가는 데이터 이다. (토크나이저와 모델의 이름이 같으니까, 알아서 호환됨!!)

    DatasetDict({
        train: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx', 'input_ids', 'token_type_ids', 'attention_mask'],
            num_rows: 3668
        })
        validation: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx', 'input_ids', 'token_type_ids', 'attention_mask'],
            num_rows: 408
        })
        test: Dataset({
            features: ['sentence1', 'sentence2', 'label', 'idx', 'input_ids', 'token_type_ids', 'attention_mask'],
            num_rows: 1725
        })
    })

     


    3. 모델 불러오기

    모델을 불러와 보자.

    원하는 모델을 huggingface에서 불러오면 되겠다.

    from transformers import AutoModelForSequenceClassification
    
    model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

     


    4. 학습

    각자의 컴퓨터 환경에 맞게 설정해 준다.

    그리고 학습해 주자.

    from transformers import Trainer
    
    trainer = Trainer(
        model,
        training_args,
        train_dataset=tokenized_datasets["train"],
        eval_dataset=tokenized_datasets["validation"],
        data_collator=data_collator,
        tokenizer=tokenizer,
    )
    
    trainer.train()

     


    5. 결론

    transformers.Trainer를 이용하면

    다양한 옵션을 사용할 수 있기 때문에

    적은 양의 코딩으로

    학습을 진행할 수 있다.

     

    물론 pytorch를 이용해서 똑같은

    작업을 할 수는 있지만

    여러 기능을 제공해주는 편리한 도구 정도로 생각하면 되겠다.

     

    추가적으로,

    학습을 돌리는 코드가 간단하다 보니,

    코딩에 걸리는 시간이 줄어들어서 좋긴하다.

    그치만 코드를 이해하고 나면,

    아래 세가지가 가장 중요한 것을 알 수 있다.

    • 확보된 데이터와 전처리
    • 보유하고 있는 GPU 성능
    • GPU를 최적화 하는 세팅

     

    물론, 연구적인 측면에서는

    연구 경험도 중요하지만 (어떤 기법을 이용해 학습할지)

    위 세가지가 없으면 연구를 시작조차 할 수 없기 때문이다.

     

     

     

    반응형