[멀티모달 시리즈] LLaVA - LLaVA는 어떻게 동작하는가? — 아키텍처·전처리·학습 과정 쉽게 이해하기

JOINSPIRED·2025년 8월 28일
post-thumbnail

LLaVA 아키텍처와 동작 원리

들어가며

Previous: LLaVA: 멀티모달 AI의 대중화를 위한 실용적 접근에서 LLaVA의 등장 배경과 의의를 살펴보았습니다. 이번에는 LLaVA가 실제로 어떻게 작동하는지 구체적으로 살펴보겠습니다.

LLaVA의 동작 과정은 다음과 같이 요약할 수 있습니다: 이미지를 입력받아 시각 정보를 추출하고, 이를 언어 모델이 처리할 수 있는 형태로 변환한 후, 텍스트 응답을 생성합니다.

사용자 입력: "이 사진에서 몇 명이 서 있나요?" + 📷

📷
↓
[CLIP 비전 인코더] → 시각 특징 추출
↓
[선형 프로젝션 레이어] → 언어 모델 임베딩 공간으로 변환  
↓
변환된 시각 정보 + 텍스트 질문 → [Vicuna 언어 모델] → "3명이 서 있습니다"

생소할 수 있는 용어들은 이해를 돕기위해 모아두었습니다. 가장 하단의 용어카드를 참고해주세요.


LLaVA 아키텍처의 구성 요소

LLaVA는 기존의 검증된 모델들을 조합하는 방식을 택했습니다. 복잡한 새로운 아키텍처를 개발하는 대신, 각 분야에서 성능이 입증된 모델들을 연결하는 구조를 설계했습니다.

구성요소별 역할 분석

CLIP 비전 인코더: 시각 정보 처리

  • 4억 개의 이미지-텍스트 쌍으로 사전 학습된 시각 인코더
  • 일반적인 시각 개념부터 복잡한 장면까지 처리 가능
  • LLaVA에서는 가중치를 고정한 채로 사용
  • 훈련 시 고정(frozen): Stage 1, 2 모두 CLIP은 업데이트하지 않음

선형 프로젝션 레이어: 모달리티 간 변환

  • 시각 특징을 언어 모델 임베딩 차원으로 변환
  • 단순한 선형 변환 방식 채택
  • 단순 구조라 안정적이고 데이터 실험 반복에 유리
  • Stage 1에서 유일하게 학습되는 파트

Vicuna 언어 모델: 텍스트 생성

  • LLaMA 기반으로 instruction tuning된 대화형 언어 모델
  • 자연스러운 대화 형태의 응답 생성
  • 시각 정보와 텍스트를 결합한 응답 생성
  • Stage 2에서 W와 함께 업데이트(SFT)되어 시각+텍스트 결합 추론을 학습

2단계 학습 과정

LLaVA는 정렬 → 지시튜닝의 2-Stage 단계적 학습 전략을 사용합니다. 복잡한 능력을 한 번에 학습시키는 대신, Stage 1의 ‘정렬(Alignment)’로 토대를 세우고, Stage 2에서 대화 능력을 개발하는 방식입니다.

Phase 1: Feature Alignment — 시각을 “언어 토큰”으로 바꾸는 준비운동

멀티모달 대화로 가기 전에, 먼저 이미지에서 뽑은 특징을 LLM이 읽을 수 있는 언어 임베딩으로 정확히 맞추는 단계입니다. 요지는 간단합니다: CLIP이 본 것을, Vicuna가 ‘단어처럼’ 읽게 만든다.

무엇을 배우나?

  • 목표: CLIP 시각 특징 → 언어 임베딩 공간으로 정확히 투사(기본 대응 관계 학습)
  • 효과: 이후 Stage 2에서 Vicuna가 시각 토큰을 자연스러운 컨텍스트로 사용하게 됨

어떤 파라미터를 학습하나?

  • 가중치 전략:
    • CLIP: 고정(freeze)
    • Vicuna: 고정(freeze)
    • 프로젝터 W: 학습 대상(only train)

어떤 데이터를 쓰나?

  • CC-595K: CC3M에서 명사구 빈도 기반 균형 필터링으로 고른 약 595K (이미지, 캡션) 쌍

  • 포맷: (이미지, 캡션)을 간단 지시-응답으로 재구성
    예) [USER] 이 이미지를 한 줄로 설명해줘. + <image> → [ASSISTANT] <캡션>

  • 왜 595K인가?

    • CC3M 캡션의 개념 분포를 균형화하기 위해
    • 너무 희귀/편향된 조합은 제외
    • 고빈도 항목엔 상한을 두어 다양한 개념 커버리지를 확보
      - 이렇게 해야 W가 특정 주제에만 과적합되지 않고 폭넓은 장면에 일반화 가능

학습 설정(레시피)

  • 학습 목표: 캡션 생성(Teacher Forcing) → Cross-Entropy로 W만 업데이트
  • 하이퍼파라미터(예시): lr=2e-3, batch=128, epoch=1
  • 연산 흐름:
    1) 이미지 → CLIP → 시각 특징 Z_v (고정)
    2) Z_v → 선형 프로젝터 W → 시각 토큰 H_v
    3) [USER](q*) + H_v를 컨텍스트로 두고 정답 캡션 토큰을 순차 예측
    4) 정답 캡션(+EOS)에만 손실을 걸어 W를 업데이트

즉, 복잡한 대화보다는 먼저 "이미지에서 무엇을 보았는지"를 정확히 표현하는 능력부터 학습합니다.

Phase 2: Instruction Tuning — “보는 법” 위에 “말하는 습관”을 얹기

Phase 1에서 시각→언어 정렬이 끝났다면, 이제는 실제 대화 상황에서 지시를 따르고 추론하는 습관을 몸에 익힙니다. 목표는 이미지를 근거로, 지시에 맞는 답을 안정적으로 생성하도록 만드는 것입니다.

무엇을 배우나?

  • 목표: 다양한 멀티모달 질문에 정확·일관하게 응답(지시 따름 + 대화형 추론)
  • 효과: 모델이 챗봇 문법(턴 구조·종료 규칙)을 지키며, 이미지 의존 과제에 강해집니다.

어떤 파라미터를 학습하나?

  • 가중치 전략
    • CLIP: 고정(freeze)
    • 프로젝터 W: 학습 (계속 미세 보정)
    • Vicuna(ϕ): 학습 (권장: LoRA/QLoRA로 비용 절감)
      • 논문 원본에서는 8대의 A100 GPU를 활용해 LLM을 풀 파인튜닝(Full Fine-tuning)하였고 CLIP은 완전히 고정(Freeze)했지만, 실제 우리가 구현할 때는 자원 절약을 위해 LoRA를 적용하거나 성능 향상을 위해 부분 언프리즈를 시도하는 것이 일반적입니다.

어떤 데이터를 쓰나?

  • LLaVA-Instruct-158K (세 유형 혼합)

    • Conversation 58K: 정답이 명확한 Q/A
    • Detailed 23K: 풍부한 장면 설명
    • Complex 77K: 비교·카운팅·상식 결합 등 복합 추론
  • 어떻게 만들었나?

    • GPT-4/ChatGPT가 이미지를 직접 보지 않아도 되도록, 이미지를 캡션 모음 + 바운딩박스(객체/좌표)로 텍스트화(상징화) 하여 질문·정답을 생성.
    • 소수의 수작업 ICL 예시로 일관성을 잡고, 정답이 확실한 질문만 채택해 노이즈를 억제

학습 설정(레시피)

  • 하이퍼파라미터(예시): lr=2e-5, batch=32, epochs=3
  • 학습 흐름
    1) 이미지 → CLIP(고정) → Z_v
    2) Z_vWH_v
    3) [SYSTEM/USER(지시 + H_v)]를 컨텍스트로 두고
    [ASSISTANT] 정답 토큰을 오토리그레시브(다음 토큰 예측) 로 생성하도록 Cross-Entropy로 학습
    4) 손실은 [ASSISTANT] 구간(+<STOP>/EOS)만 집계해 대화 포맷·종료 규칙을 안정화

대화 포맷(권장 템플릿)

[SYSTEM] 너는 유용하고 안전한 멀티모달 도우미야.
[USER]   <image_tokens> + 지시/질문
[ASSISTANT] 정답 ... <STOP>
  • <STOP>/EOS까지 실제로 예측하게 학습해야 중단이 자연스러움.

비용 최적화 팁

  • Vicuna: LoRA(VRAM 여유) 또는 QLoRA(VRAM 제한) 추천
    • 시작은 Attention Q/V에 LoRA부터, 필요 시 K/O·MLP로 확장
  • 프로젝터 W: 계속 학습(정렬 미세 보정)
  • CLIP: 끝까지 고정(안정성·비용 측면에서 유리)

전환 리마인더 (Phase 1 → Phase 2)

  • 언제? Phase 1의 Val 손실이 plateau이고, 짧은 캡션 지시에서 출력이 그럴듯하면 GO.
  • 어떻게? Stage 1의 W_best 저장 → 새 run(epoch 0)으로 시작(옵티마/스케줄러 리셋).

한 문장 요약

CLIP은 고정, W+Vicuna를 지시-응답 데이터로 SFT하여, 챗봇 문법과 이미지-의존 추론 습관을 장착한다.


데이터 생성 방법

LLaVA의 주요 특징 중 하나는 GPT-4를 Teacher 로써 활용한 자동화된 데이터 생성 시스템입니다.

기존 데이터의 한계

기존의 이미지-텍스트 데이터셋들은 주로 다음과 같은 형태였습니다:

[고양이 사진] → "A cat sitting on a wooden chair"

하지만 대화형 AI를 위해서는 다음과 같은 구조화된 상호작용 데이터가 필요했습니다:

이미지: [고양이 사진]
Human: "이 동물의 행동을 설명해주세요"
Assistant: "이 사진에는 고양이가 나무 의자에 편안하게 앉아 있습니다. 
고양이의 자세는 매우 안정적이고 편안해 보입니다..."

GPT-4 기반 데이터 생성

3가지 유형의 데이터 생성:

1. Conversation 데이터 (58K)

  • 간단하고 직접적인 질문-답변 쌍
  • "What is in the image?" → "A person riding a bicycle"
  • 기본적인 이미지 이해 능력 평가용

2. Detailed Description 데이터 (23K)

  • 이미지에 대한 포괄적이고 상세한 설명
  • 객체, 장면, 관계, 맥락 등을 종합적으로 기술
  • 시각 이해 능력 향상을 위한 데이터

3. Complex Reasoning 데이터 (77K)

  • 비교, 계산, 추론이 필요한 고차원 질문
  • "Why might this person be wearing a helmet?"
  • 논리적 사고와 상식 추론 능력을 위한 데이터

데이터 생성 프로세스

입력: 
- 이미지 캡션: "A living room with a sofa and coffee table"
- 바운딩 박스: "sofa: [0.1, 0.2, 0.8, 0.6]"

GPT-4 프롬프트:
"위 정보를 바탕으로 다양한 유형의 질문과 답변을 생성해주세요.
단, 이미지에서 확인할 수 없는 정보는 추측하지 마세요."

출력:
Q: "거실에 몇 개의 가구가 있나요?"
A: "소파와 커피 테이블, 총 2개의 가구가 있습니다."

Q: "이 공간의 분위기는 어떤가요?"
A: "편안하고 아늑한 거실 분위기입니다."

실제 추론 과정

사용자가 "이 음식의 칼로리는 얼마나 될까요?"라고 피자 사진과 함께 질문했을 때의 처리 과정을 살펴보겠습니다.

Step 1: 시각 특징 추출

입력 이미지 (224×224×3) 
    ↓
CLIP Vision Encoder
    ↓
시각 특징 벡터 (256×1024)

CLIP은 피자의 형태, 토핑, 크기, 두께 등의 시각적 정보를 고차원 특징 벡터로 압축합니다.

※ 해상도/아키텍처에 따라 토큰 수는 달라질 수 있으나, ViT-L/14 @224 기준 ≈256 patch + CLS 구조가 일반적.

Step 2: 모달리티 변환

시각 특징 벡터 (256×1024)
    ↓
선형 프로젝션 레이어 (W: 1024×4096) # W ∈ ℝ(1024×d_model)
    ↓
언어 임베딩 (256×4096) (L×d_model)  # Vicuna의 d_model로 정렬

이 단계에서 시각 정보가 언어 모델이 처리할 수 있는 토큰 형태로 변환됩니다.

Step 3: 멀티모달 컨텍스트 구성

최종 입력 시퀀스:
[시각 토큰들] + [BOS] + "Human: 이 음식의 칼로리는 얼마나 될까요?" + [EOS] + "Assistant:"

Step 4: 자연어 생성

Vicuna가 시각 단서(토핑·크기·도우 등)와 텍스트 질문을 결합해 합리적 범위의 칼로리를 제시하고, 불확실성·가정 조건을 자연어로 보완합니다.

"이 피자는 페퍼로니 피자로 보입니다. 일반적으로 중간 크기 피자 한 조각(1/8)은 
약 250-300칼로리 정도입니다. 치즈와 페퍼로니의 양, 도우의 두께에 따라 
차이가 있을 수 있습니다."

기술적 선택들

왜 선형 프로젝션 W인가?

  • 계산 효율: O(d₁×d₂)로 가볍고 빠름

  • 학습 안정성: 비선형 깊은 결합부 대비 수렴 안정

  • 해석 가능성: 투사 행렬로 모달 정렬을 직관적으로 파악

  • 일반화: 과파라미터 복잡 결합부 대비 오버피팅 위험↓

실무 팁: Stage 2에서 Vicuna는 (Q)LoRA, 프로젝션 W는 직접 학습, CLIP은 고정이 보편적 시작점. 성능 한계가 보이면 부분 언프리즈(상위 몇 층)를 제한적으로 시도한다고 합니다.


마무리

LLaVA는 **“새로운 초복잡 구조” 대신, 정렬(Alignment)과 포맷(Template)이라는 핵심 토대를 정교하게 다듬어 단순함으로 성능을 끌어올린 연구 사례입니다.

새로운 아키텍처를 처음부터 개발하는 대신, 기존의 검증된 구성요소들을 조합했습니다. GPT-4를 활용한 데이터 생성으로 인간의 수작업을 줄였고, 2단계 학습을 통해 복잡한 능력을 체계적으로 습득하도록 했습니다.

주요 특징:
1. 모듈화 설계: CLIP(표현)–W(정렬)–LLM(생성)의 역할 분리
2. 단계적 학습: Stage 1 정렬 → Stage 2 지시튜닝
3. 데이터 생성 자동화: GPT-4를 텍스트 교사로 활용해 158K 멀티모달 SFT 세트 구축
4. 챗 템플릿 정규화: SYSTEM/USER/ASSISTANT + STOP으로 출력 안정화
5. 오픈소스 공개: 연구 재현성과 확장성 확보

LLaVA의 접근법은 현재 사용되는 멀티모달 AI 서비스들의 설계 패턴에 큰 영향을 미쳤고, 다수의 오픈소스, 상용 모델에서 중요한 참조점 역할을 하고 있습니다.


용어 카드

ITC(Image-Text Contrastive) vs ITM(Image-Text Matching)
  • ITC(대조학습): 올바른 (이미지, 텍스트) 쌍은 가깝게, 틀린 쌍은 멀게 임베딩을 조정. → CLIP 사전학습의 핵심.
  • ITM(매칭 분류): 주어진 (이미지, 텍스트) 쌍이 매칭되는지 분류. → BLIP류에서 사용.

LLaVA의 Stage 1은 CLIP이 이미 학습해둔 표현 위에, 선형 W 투사시각→언어 임베딩 정렬을 수행하는 단계입니다(ITC/ITM을 새로 학습하지는 않지만, 배경으로 알아두면 이해가 쉬움).

Interleaved 데이터(이미지·텍스트 교차 시퀀스)
  • 정의: 이미지 토큰과 텍스트 토큰이 한 시퀀스 안에서 교차하며 섞여 있는 형식.
    예) [IMG1] 토끼가 있고, [IMG2] 옆에는 당근이 있어.
  • 맥락: Flamingo 계열은 이런 교차 맥락을 잘 이용해 제로샷/ICL 성능이 강함.
  • LLaVA와 차이: LLaVA는 선형 프로젝터 W로 만든 시각 토큰 Hv텍스트 컨텍스트에 접합해, 대화형 SFT로 지시 따름을 직접 가르침.
LoRA vs QLoRA (비용 절감 미세조정)
  • LoRA: 본체 가중치는 그대로(FP16/BF16), 저차원 어댑터(랭크 r 작은 A,B)만 학습 → VRAM/시간 절약.
  • QLoRA: 본체를 4-bit 양자화해 메모리 더 절약 + 어댑터만 학습동일 GPU로 더 큰 모델 시도 가능.
  • 권장: LLaVA Stage 2에서 Vicuna는 (Q)LoRA, 프로젝터 W직접 학습, CLIP은 고정.
부분 언프리즈(Partial Unfreeze) (언제, 어디를?)
  • 의도: 본체(예: Vicuna/CLIP)의 일부 층만 학습해 성능을 더 끌어올림.
  • 언제: 도메인이 많이 다르거나, 세밀 객체/OCR/그래픽스 등에서 한계가 보일 때.
  • 주의: 비용·불안정성 증가. 보통은 Stage 2 후반상위 몇 층만 제한적으로 풀어 실험.

Next: 다음 글에서는 LLaVA 의 학습 원리에 대해서 더 깊게 파고들어 보겠습니다. 궁금한 점이나 다루어보길 원하는 주제가 있다면 댓글로 말씀해주세요!


참고자료

profile
기술과 산업에 대해 궁금한 것들을 함께 이야기 해보고 싶습니다.

0개의 댓글