LoRA의 'target_modules' 옵션이란?

Soogyung Gwon·2026년 5월 30일

구름을잡아라

목록 보기
72/76

LoRA의 'target_modules' 옵션이란?

target_modules는 LoRA를 모델의 어느 레이어에 적용할지 지정하는 옵션이다.

LoRA는 모델 전체에 적용되는 것이 아니라 특정 가중치 행렬(Linear Layer)에만 적용된다.

예를 들어 다음과 같이 설정할 수 있다.

from peft import LoraConfig

config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"]
)

위 설정에서는 LoRA가 다음 레이어에만 적용된다.

  • q_proj
  • v_proj

나머지 레이어는 기존 가중치를 그대로 사용한다.


왜 필요한가?

Transformer 모델에는 매우 많은 가중치 행렬이 존재한다.

Self-Attention 구조를 예로 들면 다음과 같다.

Input
 ↓
Q Projection (q_proj)
K Projection (k_proj)
V Projection (v_proj)
 ↓
Attention
 ↓
Output Projection (o_proj)

각 Projection은 대규모 행렬로 구성되어 있다.

만약 모든 가중치에 LoRA를 적용한다면:

  • 메모리 사용량 증가
  • 학습 시간 증가
  • 저장 공간 증가

와 같은 문제가 발생한다.

따라서 LoRA를 적용할 핵심 레이어만 선택하여 효율적으로 학습하는 것이 일반적이다.


가장 많이 사용하는 설정

Llama 계열 모델에서는 다음 설정이 가장 널리 사용된다.

target_modules=[
    "q_proj",
    "v_proj"
]

이는 Query와 Value Projection에만 LoRA를 적용하는 방식이다.

LoRA 원 논문에서도 Attention 관련 행렬만 수정해도 상당한 성능 향상을 얻을 수 있음을 보여주었다.


Attention 전체에 적용하기

Attention의 모든 Projection에 적용할 수도 있다.

target_modules=[
    "q_proj",
    "k_proj",
    "v_proj",
    "o_proj"
]

이 경우 Attention 모듈 전체를 튜닝하게 된다.


MLP 레이어까지 적용하기

최근에는 MLP 영역까지 포함하여 LoRA를 적용하는 경우도 많다.

target_modules=[
    "q_proj",
    "k_proj",
    "v_proj",
    "o_proj",
    "gate_proj",
    "up_proj",
    "down_proj"
]

이 설정은 Llama 계열 모델의 주요 Linear Layer 대부분을 학습 대상으로 포함한다.


Llama 모델의 주요 레이어 이름

Llama 모델에서는 일반적으로 다음과 같은 이름을 사용한다.

self_attn.q_proj
self_attn.k_proj
self_attn.v_proj
self_attn.o_proj

mlp.gate_proj
mlp.up_proj
mlp.down_proj

따라서:

target_modules=["q_proj", "v_proj"]

와 같이 지정하면 모델 내부의 모든 q_proj, v_proj 레이어에 LoRA가 자동 적용된다.


모델마다 이름이 다르다

target_modules는 모델 구조에 따라 달라진다.

Llama

q_proj
k_proj
v_proj
o_proj

GPT-2

c_attn
c_proj

BERT

query
key
value

따라서 사용 중인 모델의 레이어 이름을 먼저 확인해야 한다.


적용 가능한 레이어 확인 방법

다음 코드를 사용하면 모델 내부의 모듈 이름을 확인할 수 있다.

for name, module in model.named_modules():
    print(name)

예를 들어 다음과 같은 결과가 출력될 수 있다.

model.layers.0.self_attn.q_proj
model.layers.0.self_attn.k_proj
model.layers.0.self_attn.v_proj

이 경우 다음과 같이 설정할 수 있다.

target_modules=[
    "q_proj",
    "k_proj",
    "v_proj"
]

all-linear 옵션

최신 PEFT에서는 모든 Linear Layer를 자동으로 선택하는 옵션도 제공한다.

target_modules="all-linear"

예시:

config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules="all-linear"
)

이 설정을 사용하면 모델 내의 모든 Linear Layer에 LoRA가 적용된다.


실무에서 자주 사용하는 설정

가볍고 빠른 학습

target_modules=[
    "q_proj",
    "v_proj"
]

특징:

  • 적은 메모리 사용
  • 빠른 학습
  • 높은 효율

성능 중심 설정

target_modules=[
    "q_proj",
    "k_proj",
    "v_proj",
    "o_proj",
    "gate_proj",
    "up_proj",
    "down_proj"
]

특징:

  • 더 많은 파라미터 학습
  • 일반적으로 성능 향상 가능
  • 메모리 사용량 증가

정리

target_modules는 LoRA를 적용할 레이어를 지정하는 옵션이다.

LoRA는 모델 전체를 수정하지 않고 특정 가중치 행렬에만 저차원 어댑터를 추가하기 때문에 효율적인 학습이 가능하다.

Llama 계열에서는 일반적으로 다음 두 가지 방식이 많이 사용된다.

target_modules=["q_proj", "v_proj"]

또는

target_modules=[
    "q_proj",
    "k_proj",
    "v_proj",
    "o_proj",
    "gate_proj",
    "up_proj",
    "down_proj"
]

적용 대상 레이어가 많아질수록 성능 향상을 기대할 수 있지만, 그만큼 메모리 사용량과 학습 비용도 증가한다.

profile
오랜시간 망설였던 코딩을 다시 해보려고 노력하고 있는 사람

0개의 댓글