본문 바로가기
이것저것

파인튜닝 (Fine-tuning)

by 파이현 2025. 5. 2.
파인 튜닝 (Fine-tuning)
      - 이미 학습된 대규모 언어 모델(LLM)을 특정 작업이나 데이터셋에 맞춰 재학습시키는 과정
      - 모델이 특정 도메인 또는 작업에서 최적의 성능을 발휘하도록 조정하는 기술
      - 특정 데이터에서 더 높은 정확도와 일관성을 제공할 수 있지만 데이터 준비와 학습 비용이 많이 듦
      - 학습 과정: 파라미터를 업데이터하는 것

 

 

01. 파인 튜닝의 주요 기법

  • `PEFT (Parameter-Efficient Fine-Tuning)`
    • 대표적인 기법: LoRA (Low-Rank Adaptation)
    • 특징
      • 거대한 모델 전체를 학습하지 않고, 적은 파라미터만 조정
      • 모델 크기에 비해 연산 비용을 절감할 수 있음
  • `RLHF (Reinforcement Learning with Human Feedback)`
    • 주요 원리
      • 모델이 다양한 답변을 생성
      • 사람이 가장 적절한 답변을 선택
      • 보상 신호를 이용해 모델을 최적화
    • 활용 분야
      • 대화형 AI
      • 윤리적 AI 모델 개발
      • 사용자 맞춤형 추천 시스템

 

01 - 01. PEFT (Parameter Efficient Fine-Tuning)

  • 모델 전체를 재학습이 아닌 일부 파라미터만 조정해 학습 비용을 줄이는 방법
  • 메모리와 계산 비용이 감소해 효율성 증대에 활용
  • 일부 하위 집합만 업데이트

 

01 - 01 - 01. PEFT 주요 기법

  • LoRA (Low-Rank Adaption)
    • 모델의 큰 파라미터 매트릭스를 조정하지 않고, 저랭크 매트릭스를 추가해 학습
    • 즉, 사전 학습된 모델의 가중치는 변경하지 않고, 새로운 저랭크 매트릭스를 학습시킴
    • -> 전체 파라미터를 학습하지 않고, 기존 사전 학습된 파라미터는 그대로 유지한 채로 저랭크 행렬을 추가해서 기존 사전 학습된 파라미터와 저랭크 행렬을 더해 파라미터를 만듦
    • 작동 원리
      • X: d행 배열
      • r: 랭크의 차원 수
      • W + \Delta W = Pretrained Weight + A \cdot B (A: 저랭크 행렬, B: 저랭크 행렬)
      • 사전학습된 기존 가중치(Pretrained Wights)와 새롭게 학습시킨 저랭크 매트릭스 (Low-Rank 행렬) 결과를 더해서 추가 파라미터를 만들어줌

 

# LoRA

from peft import LoRAConfig, get_peft_model
from transformers import AutoModelForCausalLM

# 모델과 LoRA 구성
base_model = AutoModelForCausalLM.from_pretrained("gpt2")

lora_config = LoRAConfig(
    r=8, lora_alpha=32, 
    target_modules=["query", "value"], 
    lora_dropout=0.1
)
model = get_peft_model(base_model, lora_config)

# 모델 학습
model.train()

 

  • Q-LoRA (Quantized LoRA)
    • LoRA 기법을 양자화(큰 그릇에 있는 걸 작은 그릇으로 옮겨 담기)하여 GPU 메모리 사용량을 줄이고 학습 비용을 절감하는 방법
    • 부동소수점 숫자의 표현 방식을 단순화하는 기법 (정수형 변환 or 비트 수 줄이기)
    • 모델의 가중치와 파라미터를 효율적으로 저장하고 처리하는 것
    • 작동원리
      • 4-bit NormalFloat (NF4) 양자화를 적용하여 모델의 가중치를 압축
      • LoRA와 결합하여 저비용으로 고효율 파인튜닝
# Q-LoRA

from transformers import AutoModelForCausalLM
from peft import LoRAConfig, get_peft_model
import torch

# 양자화된 파라미터를 위한 설정
class QLoRAConfig(LoRAConfig):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.quantization_bits = 4  # 4-bit 양자화 설정
        self.quantization_dtype = torch.float16  # 양자화 데이터 타입

# 모델 
base_model = AutoModelForCausalLM.from_pretrained("gpt2")

# LoRA와 Q-LoRA 설정
q_lora_config = QLoRAConfig(
    r=8,                  # low-rank 차원
    lora_alpha=32,        # LoRA의 알파 값
    target_modules=["query", "value"],  # LoRA로 수정할 레이어
    lora_dropout=0.1,     # LoRA 드롭아웃
    quantization_bits=4,  # 4-bit 양자화
    quantization_dtype=torch.float16  # 양자화 데이터 타입 (float16)
)

# Q-LoRA 모델 생성
q_lora_model = get_peft_model(base_model, q_lora_config)

# 모델 학습
q_lora_model.train()

# 훈련할 때 기본적으로 메모리 절약과 효율적인 양자화가 적용

 

  • DoRA (Decomposed LoRA)
    • LoRA 기법을 확장해 더 정밀한 파인튜닝을 수행하는 방법으로, 기존  LoRA의 저랭크 행렬을 더 세분화해 학습이 가능하도록 설계
  • Soft Prompts
    • 입력 데이터에 명시적인 프롬프트 대신 학습 가능한 임베딩 벡터를 사용하는 것
    • 파인튜닝보다 가볍게 사용 가능
    • 적용 방식에 따라 파인튜닝보다 높은 성능을 내는 경우도 있음
    • 장점
      • 프롬프트 엔지니어링의 한계를 극복
      • 모델의 파라미터를 고정한 상태에서 작업 학습이 가능
        • 모델의 파라미터를 고정한 상태라는 것에서 peft 기법 중 하나임을 알 수 있음
    • 작동 원리
      • 모델이 사전학습해서 가지고 있는 파라미터는 frozen 해놓고
      • 추가적으로 넣어주는 입력 벡터로 학습을 진행

 

01 - 02. RLHF (Reinforcement Learning from Human Feedback)

  • 사람의 피드백을 활용해 모델의 성능을 개선하는 강화 학습 방법

 

01 - 02 - 01. PPO 방식

  • Poximal Policy Optimization
  • 사람 피드백으로 학습된 보상 모델(reward model)을 기반으로, PPO 알고리즘으로 정책을 미세조정
  • 과정
    • 1. Supervised fine-tuning (SFT): 사람이 만든 좋은 답변으로  LLM 학습
    • 2. Reward Model 학습: 사람 피드백을 학습해서 보상 모델을 만듦
    • 3. PPO로 정책 미세 조정: LLM을 rollout 시키고, reward model로 점수를 받은 뒤 PPO로 업데이트

 

01 - 02 - 02. DPO 방식

  • Direct Preference Optimization
  • 보상 모델 과정을 생략하고, 사용자의 선호도에 따라 미세조정
  • 핵심 아이디어
    • a가 b보다 더 낫다는 사람의 선호 쌍 정보를 기반으로 LLM을 직접 분류기처럼 학습시킴
  • 장점
    • 보상 모델 학습이 불필요해 PPO보다 훨씬 단순한 구현이 가능함