[250708화1408H] 자연어 처리 이론 (9) PEFT, Adapter PEFT

윤승호·2025년 7월 8일

논문 지옥에 빠졌다...

학습시간 09:00~01:00(당일16H/누적1408H)


◆ 학습내용

1. PEFT

Parameter-Efficient Fine-Tuning
보통 lora > qlora > soft prompt 순으로 자주 사용

(1) PEFT의 등장 배경

A. 기존 파인튜닝(Full Fine-Tuning)의 문제점

  • 트랜스포머 기반 사전 훈련 언어 모델(PLM)의 파라미터 수가 계속해서 증가함
  • 특히 수십억 개 파라미터를 가진 LLM(거대 언어 모델)의 등장은 엄청난 계산 비용과 자원을 요구함
  • 예시로 Falcon-180B 모델 전체를 파인튜닝하려면 최소 5120GB의 어마어마한 자원이 필요할 수 있음
  • 이렇게 막대한 비용 때문에 특정 작업(downstream tasks)에 모델을 적용하기가 매우 어려움
  • 또한, 파인튜닝할 데이터셋이 사전 훈련 데이터셋보다 훨씬 작을 경우, 모델의 모든 파라미터를 업데이트하면 과적합(overfitting)이 발생할 수 있음

B. PEFT의 필요성

  • 이런 한계를 극복하기 위해 PEFT(파라미터 효율적 파인튜닝)가 효과적인 해결책으로 등장함
  • PEFT는 파인튜닝해야 할 파라미터의 수를 크게 줄여 메모리 사용량을 낮추면서도, 전체 파인튜닝과 거의 비슷한 성능을 달성하는 것을 목표로 함
  • 소수의 추가 파라미터만 업데이트하거나 기존 파라미터의 일부만 업데이트하여, 모델이 사전 훈련 과정에서 학습한 지식을 보존하고 치명적 망각(catastrophic forgetting) 위험을 줄임
구분전체 파인튜닝 (Full Fine-Tuning)파라미터 효율적 파인튜닝 (PEFT)
훈련 대상모든 파라미터추가&선택된 파라미터
계산 비용매우 높음매우 낮음
메모리 사용량매우 높음낮음
과적합 위험데이터가 적을 경우 높음낮음
치명적 망각발생 가능성 있음발생 위험 적음

2. 주요 PEFT 기법

(1) Additive Fine-tuning

A. 개념

  • 기존의 사전 훈련된 모델 파라미터는 전부 고정(freeze)시킴
  • 그 대신, 새로운 학습 가능한 파라미터나 모듈을 추가하여 이 부분만 훈련시키는 방식

B. 대표 기법

어댑터(Adapter):

  • 트랜스포머의 각 레이어 내부에 '어댑터'라고 불리는 작은 신경망 모듈을 삽입하는 기법
  • 이 어댑터 모듈은 보통 다운-프로젝션(down-projection)과 업-프로젝션(up-projection)으로 구성된 저순위(low-rank) 구조를 가짐
  • 훈련 시에는 오직 이 어댑터의 파라미터만 업데이트함

소프트 프롬프트(Soft Prompt-based):

  • 사람이 직접 만드는 하드 프롬프트와 달리, 학습 가능한 연속적인 벡터(soft prompt)를 모델의 입력이나 히든 상태(hidden state)에 추가하는 방식
  • 프롬프트 튜닝(Prompt-tuning): 입력 임베딩(input embeddings)에 학습 가능한 프롬프트 토큰을 추가
  • 프리픽스 튜닝(Prefix-tuning): 모든 트랜스포머 레이어의 히든 상태에 학습 가능한 접두사(prefix)를 추가하여 좀 더 직접적으로 모델의 동작에 영향을 줌

(코드예시)

from transformers import AutoModelForSequenceClassification
from peft import get_peft_model, AdaptionPromptConfig, TaskType

# 어댑터 기반 PEFT 예시
model = AutoModelForSequenceClassification.from_pretrained("roberta-base")

# 어댑터 설정 (Adapter-based)
adapter_config = AdaptionPromptConfig(
    task_type=TaskType.SEQ_CLS,
    adapter_len=8, # 추가할 모듈의 길이
    adapter_layers=2 # 추가할 모듈의 레이어 수
)

adapter_model = get_peft_model(model, adapter_config)
adapter_model.print_trainable_parameters()
기법 종류장점단점
어댑터 계열파라미터 효율성이 높고, 사전 학습된 지식을 잘 보존함어댑터 모듈 추가로 인해 추론 시 약간의 지연 시간이 발생할 수 있음
소프트 프롬프트 계열추가되는 파라미터 수가 매우 적어 효율성이 극대화됨하드 프롬프트보다 유연하지만, 최적의 성능을 내기 위한 튜닝이 까다로울 수 있음

(2) Partial Fine-tuning

A. 개념

  • 새로운 파라미터를 추가하는 대신, 사전 훈련된 모델의 파라미터 중 일부만 선택해서 훈련시키는 방식
  • 어떤 파라미터를 훈련시킬지 결정하는 전략이 핵심

B. 대표 기법

BitFit (Bias-term Fine-tuning):

  • 가장 단순하면서도 효과적인 방법 중 하나로, 트랜스포머 모델의 모든 편향(bias) 항만 훈련시키는 기법

Weight Masking:

  • 특정 기준(예: Fisher 정보량)을 사용해 중요한 가중치를 식별하고, 이 가중치만 업데이트되도록 이진 마스크(binary mask)를 만들어 적용
  • Delta Weight Masking: 가중치 자체가 아닌, 가중치 업데이트 값(delta weight)에 마스크를 적용하는 방식도 있음

(코드예시)

from transformers import AutoModelForSequenceClassification
from peft import get_peft_model, PeftConfig, TaskType

# BitFit은 PEFT 라이브러리에서 직접 지원하기보다
# 트레이너 설정에서 특정 파라미터만 학습하도록 지정하는 방식으로 구현됨
# 아래는 BitFit의 개념을 보여주는 가상 코드

model = AutoModelForSequenceClassification.from_pretrained("roberta-base")

total_params = 0
trainable_params = 0

for name, param in model.named_parameters():
    total_params += param.numel()
    if "bias" in name: # 이름에 'bias'가 포함된 파라미터만 학습 대상으로 설정
        param.requires_grad = True
        trainable_params += param.numel()
    else:
        param.requires_grad = False

print(f"trainable params: {trainable_params}")
print(f"all params: {total_params}")
print(f"trainable%: {100 * trainable_params / total_params:.6f}")
기법 종류핵심 아이디어특징
Bias Update (BitFit)모델의 편향(bias) 파라미터와 분류 헤드만 훈련극도로 적은 파라미터(전체의 0.1% 미만)만으로 좋은 성능을 낼 수 있음
Weight Masking중요한 가중치를 선별하는 마스크를 생성하여 일부만 업데이트어떤 기준으로 마스크를 생성하는지에 따라 성능이 달라짐 (e.g., Threshold-Mask, FISH Mask)

(3) Reparameterized Fine-tuning

A. 개념

  • 가중치 업데이트 행렬을 직접 학습하는 대신, 이를 저순위(Low-Rank) 행렬로 분해하여 파라미터 수를 줄이는 방식
  • 훈련이 끝난 후에는 분해된 행렬을 다시 원래 가중치에 합칠 수 있어 추론 성능 저하가 없는 것이 큰 장점

B. 대표 기법: LoRA (Low-Rank Adaptation)

  • LoRA: 사전 훈련된 가중치 행렬 W는 고정시킨 채, 업데이트 양인 DeltaW를 두 개의 작은 저순위 행렬 WdownW_{down}WupW_{up}의 곱으로 표현 (DeltaW=WdownWupDelta W = W_{down}W_{up})
  • 훈련 중에는 이 두 개의 작은 행렬(W_down,W_up)만 학습함
  • 랭크(rank) r 값을 작게 설정(rlld)하여 학습 파라미터 수를 크게 줄임
  • 훈련 후에는 W=W+WdownWupW' = W + W_{down}W_{up}으로 두 행렬을 합쳐서, 추론 시에는 추가적인 계산 비용이 전혀 발생하지 않음
  • QLoRA: LoRA의 파생 기술로, 모델 가중치를 4비트로 양자화(quantization)하여 메모리 사용량을 극적으로 줄인 기법. 덕분에 제한된 자원에서도 LLM 파인튜닝이 가능해짐

(코드예시)

import torch
from transformers import AutoModelForCausalLM
from peft import get_peft_model, LoraConfig, TaskType

# 사전 훈련된 기본 모델 로드
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")

# PEFT 기법 중 하나인 LoRA 설정
# 훈련 가능한 파라미터 수를 크게 줄여줌
lora_config = LoraConfig(
    r=8, # 랭크(r)는 핵심 하이퍼파라미터
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"], # 어텐션 레이어의 Q, V 행렬에 주로 적용
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM,
)

# 기본 모델에 PEFT 설정을 적용
peft_model = get_peft_model(base_model, lora_config)

# 훈련 가능한 파라미터 수 확인
peft_model.print_trainable_parameters()


# 결과: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06220536592225294
기법 종류장점단점
LoRA 계열훈련 후 병합하면 추론 지연 시간이 전혀 없음. 파생 연구(QLoRA, AdaLoRA 등)가 매우 활발함최적의 랭크(r) 값을 찾는 과정이 필요할 수 있음
QLoRA양자화를 통해 GPU 메모리 사용량을 획기적으로 줄여줌양자화로 인한 약간의 성능 저하가 발생할 수 있으나, 실험 결과는 매우 준수함

(4) Hybrid Fine-tuning

  • 어댑터, 프리픽스 튜닝, LoRA 등 다양한 PEFT 기법들을 수동 혹은 자동으로 조합하여 각 기법의 장점을 취하고 단점을 보완하려는 시도
  • 예: MAM Adapter는 병렬 어댑터와 프리픽스 튜닝을 결합함
  • 예: UniPELT는 어댑터, 프리픽스 튜닝, LoRA를 게이팅 메커니즘으로 묶어 동적으로 활성화함

(5) Unified Fine-tuning

  • 여러 PEFT 기법을 포괄할 수 있는 하나의 통합된 프레임워크를 제시하는 방식
  • 예: ProPETL은 어댑터나 LoRA 같은 프로토타입 네트워크를 하나만 두고, 레이어마다 다른 이진 마스크를 적용해 각기 다른 서브 네트워크를 구성하여 파라미터를 공유함

3. 문제

PEFT(Parameter-Efficient Fine-Tuning)의 주된 목적은 무엇인가요?

  • 대규모 사전 학습 모델(PLM)을 특정 작업에 맞게 조정할 때 발생하는 높은 계산 및 저장 비용을 최소화하는 것
  • 전체 모델의 모든 파라미터를 미세 조정하는 대신, 소수의 파라미터만 조정하여 훈련 효율성을 높이는 것
  • '파라미터의 저주' 문제를 완화하고, 특히 모델 크기가 수십억 개에 달하는 거대 언어 모델(LLM)의 미세 조정을 더 실용적으로 만드는 것

PEFT 방법을 분류한 주요 카테고리에 속하지 않는 것은 무엇인가요?

  • 어댑터 기반 튜닝(Adapter-based tuning)은 PEFT의 주요 카테고리 중 하나임
  • 프롬프트 기반 튜닝(Prompt-based tuning) 역시 PEFT의 주요 카테고리에 포함됨
  • 따라서, 이 범주에 속하지 않는 것은 특정 기법의 명칭이거나 완전히 다른 접근 방식을 의미함 (예: 전체 미세 조정)

어댑터 기반 미세 조정(Adapter-based Fine-tuning)’은 어떤 방식으로 작동하나요?

  • 사전 학습된 모델의 기존 가중치는 고정한 채로, 모델의 각 트랜스포머 블록 내에 작은 규모의 '어댑터' 모듈을 삽입함
  • 훈련 과정에서는 이 새로 삽입된 어댑터 모듈의 파라미터만 업데이트함
  • 추론 시에는 원본 모델과 훈련된 어댑터 가중치를 함께 사용하여 작업별 예측을 수행함

LoRA(Low-Rank Adaptation)는 어떤 원리를 이용하여 파라미터 효율성을 달성하나요?

  • 대규모 언어 모델의 가중치 행렬(Weight Matrix) 변화량이 실제로는 낮은 내재적 차원(low intrinsic rank)을 가진다는 가설을 기반으로 함
  • 기존 가중치 행렬의 변화량을 두 개의 더 작은 저차원 행렬(low-rank matrices)의 곱으로 분해(decomposition)하여 근사함
  • 결과적으로 전체 가중치 행렬 대신 이 두 개의 작은 행렬의 파라미터만 학습하여 훈련 가능한 파라미터 수를 크게 줄임

‘프롬프트 튜닝(Prompt-tuning)’과 ‘프리픽스 튜닝(Prefix-tuning)’의 주요 차이점은 무엇인가요?

  • 프롬프트 튜닝은 모델의 입력 임베딩(input embedding)에만 학습 가능한 '소프트 프롬프트' 텐서를 추가함
  • 프리픽스 튜닝은 모델의 모든 트랜스포머 레이어의 키(Key)와 값(Value)에 학습 가능한 '프리픽스' 벡터를 추가하여 더 많은 파라미터를 조정함
  • 즉, 파라미터를 추가하는 위치가 프롬프트 튜닝은 입력단에 한정되는 반면, 프리픽스 튜닝은 모델의 모든 레이어에 걸쳐 영향을 줌

BitFit 기법은 모델의 어떤 부분만을 미세 조정하여 파라미터 효율성을 높이나요?

  • 모델의 편향(bias) 파라미터만을 미세 조정하는 매우 단순한 접근 방식을 사용함
  • 가중치(weight) 행렬을 포함한 모델의 다른 모든 파라미터는 훈련 중에 고정시킴
  • 전체 파라미터의 약 0.1%에 불과한 편향만 업데이트하여 효율성을 달성함

Full fine-tuning이 PEFT에 비해 가질 수 있는 단점으로 논문에서 언급된 것이 아닌 것은 무엇인가요?

  • 배포 단점: 작업마다 모델 전체 복사본을 저장해야 하므로 저장 공간 비효율성이 큼
  • 훈련 비용: 모든 파라미터를 업데이트해야 하므로 계산 비용과 시간이 많이 소요됨
  • 치명적 망각(Catastrophic Forgetting): 새로운 작업에 미세 조정하면서 이전에 학습된 지식을 잃어버릴 위험이 있음

QLoRA가 LoRA에 비해 가지는 가장 큰 개선점은 무엇인가요?

  • 4비트 정규화 부동소수점(4-bit NormalFloat)이라는 새로운 데이터 타입을 도입하여 메모리 사용량을 크게 줄임
  • 양자화된 기본 모델의 가중치를 LoRA 어댑터로 미세 조정하는 동안 메모리 효율성을 극대화함
  • 페이지드 옵티마이저(Paged Optimizers)와 이중 양자화(Double Quantization)를 사용하여 메모리 급증을 방지하고 추가적인 메모리 절약을 달성함

여러 PEFT 기법을 수동으로 조합한 하이브리드(Hybrid) 방법에 속하는 것은 무엇인가요?

  • 어댑터와 다른 PEFT 기법을 결합하는 방식 (예: AdapterFusion, AdapterDrop)
  • LoRA와 프롬프트 튜닝 계열을 결합하여 각 방법의 장점을 취하려는 시도
  • 대표적인 예로, MAM Adapter는 프리픽스 튜닝과 어댑터를 결합하여 성능 향상을 목표로 함

‘Child-Tuning’은 어떤 가설에서 영감을 받아 개발된 PEFT 방법인가요?

  • 'Child Network Hypothesis'라는 가설에 기반하며, 이는 대규모 신경망의 일부인 'Child Network'가 훈련 중에 주된 학습을 담당한다는 내용임
  • 전체 파라미터를 업데이트하는 대신, 이 핵심적인 Child Network에 해당하는 파라미터만 식별하여 훈련시킴
  • 피셔 정보 행렬(Fisher Information Matrix) 등을 사용하여 중요한 파라미터를 찾아내고 해당 부분만 업데이트함

Additive Fine-tuning’ 방식의 공통적인 특징은 무엇인가요?

  • 기존의 사전 학습된 모델 가중치를 변경하지 않고 그대로 동결(freeze)시킴
  • 새로운 학습 가능한 파라미터나 모듈을 모델 구조에 '추가'하는 방식으로 작동함
  • 대표적인 예로 어댑터 튜닝(Adapter-tuning)과 LoRA가 있으며, 이들은 각각 어댑터 모듈과 저차원 행렬을 추가함

RoBERTa 모델을 GLUE 벤치마크에서 미세 조정했을 때, 가장 적은 수의 훈련 가능 파라미터를 사용했지만 최악의 성능을 보인 PEFT 방법은 무엇인가요?

  • BitFit은 편향 파라미터만 업데이트하므로 훈련 가능한 파라미터 수가 극히 적음
  • 여러 연구에서 BitFit은 다른 PEFT 방법에 비해 파라미터 효율성은 높지만, 특정 벤치마크에서 성능이 가장 낮게 나타나는 경향을 보임
  • 즉, 극단적인 파라미터 효율성과 성능 간의 트레이드오프(trade-off)를 보여주는 대표적인 사례임

DyLoRA가 기존 LoRA에 비해 개선하고자 한 주요 한계점은 무엇인가요?

  • 기존 LoRA는 훈련 전에 미리 고정된 단일 랭크(rank) 값을 사용해야 한다는 점
  • DyLoRA는 훈련 중에 동적으로 랭크를 조절하여 각 작업에 맞는 최적의 파라미터 수를 찾도록 설계됨
  • 이를 통해 불필요한 파라미터 낭비를 줄이고, 랭크를 수동으로 탐색하는 과정을 자동화하여 효율성을 높임

4. Adapter PEFT

특징

  • 기존 사전 학습 언어 모델은 Freeze 후 학습시키지 않음
  • 모델의 레이어 사이사이에 '어댑터'라는 작고 새로운 신경망 모듈을 끼워 넣음
  • 이 어댑터 모듈만 새로운 태스크에 맞게 학습시키는 방식

아키텍처

다운-프로젝션(Down-projection): 입력 차원을 작은 차원으로 확 줄임
비선형 활성화 함수(Non-linearity): 중간에 표현력을 더해줌 (e.g., GeLU)
업-프로젝션(Up-projection): 다시 원래 차원으로 복원
잔차 연결(Skip Connection): 어댑터 모듈의 입력이 출력에 바로 더해지는 구조, 기존 정보 손실을 막고 학습을 안정화시킴

(코드예시)

class Adapter(nn.Module):
    def __init__(self, input_size, bottleneck_size):
        super().__init__()
        self.down_project = nn.Linear(input_size, bottleneck_size)
        self.non_linear = nn.GELU()
        self.up_project = nn.Linear(bottleneck_size, input_size)

    def forward(self, x):
        down_projected = self.down_project(x)
        activated = self.non_linear(down_projected)
        up_projected = self.up_project(activated)
        return x + up_projected

어댑터 위치

  • 트랜스포머의 각 레이어(Block) 안에 두 개씩 삽입됨
  • 멀티 헤드 어텐션(Multi-Head Attention) 블록 바로 다음에 하나
  • 피드포워드 네트워크(Feed-Forward Network) 바로 다음에 또 하나

기존 파인튜닝과 차이점

  • 수십 GB짜리 모델 전체를 저장할 필요 없이, 수십 MB짜리 어댑터만 있으면 됨
  • BERT-Large 기준, 전체 파라미터의 3.6%만으로 거의 동일한 성능을 냄
  • 기존 모델의 파라미터는 얼려두기 때문에, 사전 학습으로 기존 가중치가 손상되지 않음
  • 학습된 여러 어댑터를 필요에 따라 조합하거나 순차적으로 적용하는 등 유연한 활용이 가능함

단점 및 한계

  • 기존 모델에 새로운 레이어를 '추가'하는 방식임
  • 전체 계산량이 늘어나므로 추론(Inference) 속도가 미세하게 느려질 수 있음
  • 속도가 매우 중요한 서비스에서는 단점이 될 수 있음
  • 어댑터의 최적 하이퍼파라미터(병목 크기, 학습률 등)를 찾는 과정이 번거로울 수 있음
  • 태스크의 종류에 따라 최적의 구조나 설정값이 달라짐

5. 문제

이 논문이 제안하는 ‘어댑터(Adapter)’ 방식의 주된 목적은 무엇인가요?

  • 대규모 사전 학습 모델의 파라미터 미세 조정 없이 새로운 태스크에 효율적으로 적응시킴
  • 태스크별 모델 전체 복사 없이 소규모 어댑터 모듈만 추가하여 파라미터 효율성 극대화
  • 단일 공유 모델과 작은 어댑터만 관리하여 저장 공간 및 관리 부담을 줄여 확장성 증대

어댑터 기반 튜닝은 기존의 ‘미세 조정(Fine-tuning)’과 비교했을 때 가장 큰 차이점은 무엇인가요?

  • 파라미터 업데이트 범위에서 큰 차이, 미세 조정은 모든 파라미터를 업데이트하나 어댑터는 추가된 모듈만 업데이트함
  • 미세 조정은 태스크마다 모델 전체 사본이 필요하나 어댑터는 극소량의 파라미터만 추가하여 효율적임
  • 미세 조정은 태스크별 독립 모델 생성, 어댑터는 단일 공유 모델에 탈부착하는 방식으로 공유 용이

논문에서 얘기하는 어댑터 모듈이 성공적으로 작동하기 위해 필요한 두 가지 주요 특징은 무엇인가요?

  • 학습 초기에 거의 항등 함수처럼 동작하도록 하는 효과적인 초기화
  • 파라미터 효율성을 위한 적은 수의 파라미터와 병목 구조
  • 학습 안정화를 위한 잔차 연결 구조

논문에서 제안한 어댑터의 아키텍처는 어떤 구조를 가지고 있나요?

  • 차원 축소 후 복원하는 순차적인 병목 구조
  • 두 프로젝션 신경망 사이에 비선형 활성화 함수 삽입
  • 어댑터 모듈 전체를 감싸는 잔차 연결로 학습 안정성 확보

트랜스포머(Transformer) 레이어의 어느 위치에 어댑터 모듈을 삽입했나요?

  • 각 트랜스포머 레이어 내부에 두 개의 어댑터 모듈 삽입
  • 멀티 헤드 어텐션 블록 바로 뒤에 하나 위치
  • 피드포워드 신경망 블록 바로 뒤에 다른 하나 위치

GLUE 벤치마크 실험에서, 어댑터 튜닝은 전체 미세 조정(full fine-tuning)과 비교했을 때 어느 정도의 성능을 보였나요?

  • 전체 미세 조정 방식과 매우 근접한 성능 달성
  • 전체 미세 조정 결과와 평균 0.4% 이내의 성능 차이 보임
  • 극히 일부 파라미터 튜닝만으로 거의 모든 성능 유지 가능함을 증명

glue 가 뭔가요?

  • 언어 모델의 전반적인 자연어 이해 능력을 평가하기 위한 벤치마크
  • 문장 감성 분석, 관계 추론 등 9가지 다양한 태스크로 구성됨
  • 모델의 단일 태스크 특화가 아닌 일반화 성능 측정을 목표로 함

GLUE 벤치마크 실험에서 어댑터 튜닝은 전체 미세 조정에 비해 얼마나 적은 파라미터를 사용했나요?

  • 전체 미세 조정 방식이 모델의 모든 파라미터를 사용하는 것과 대조
  • 태스크당 원본 모델 파라미터의 약 3.6%만 추가로 사용
  • 모델 전체를 복제하는 미세 조정 대비 파라미터 사용량을 획기적으로 절감

어댑터 튜닝이 다중 작업 학습(Multi-task Learning)과 다른 점은 무엇인가요?

  • 다중 작업 학습은 여러 태스크를 동시에 학습, 어댑터 튜닝은 개별적으로 학습
  • 공유되는 사전 학습 모델과 태스크별 어댑터가 명확하게 분리됨
  • 새로운 태스크 추가 시 재학습 없이 어댑터만 추가하면 되어 확장성이 뛰어남
profile
나는 AI 엔지니어가 된다.

0개의 댓글