LLaVA와 비주얼 인스트럭션 튜닝(Visual Instruction Tuning)

LLaVA(2023년 4월)는 지구상에서 가장 많이 복제된 멀티모달(multimodal) 아키텍처(architecture)입니다. LLaVA는 BLIP-2의 Q-Former를 2층 MLP(2-layer MLP)로 바꾸었고, Flamingo의 게이트드 크로스-어텐션(gated cross-attention)을 단순한 토큰 이어붙이기(token concatenation)로 바꾸었으며, 텍스트 전용(text-only) 캡션(caption)에서 GPT-4가 생성한 15만 8천 개 시각 인스트럭션(visual-instruction) 턴(turn)으로 학습했습니다. 2023년부터 2026년 사이에 시각 언어 모델(VLM)을 만든 실무자(practitioner)라면 대부분 LLaVA의 어떤 변형을 만들었다고 해도 과하지 않습니다. LLaVA-1.5는 AnyRes를 추가했습니다. LLaVA-NeXT는 해상도를 높였습니다. LLaVA-OneVision은 단일 이미지, 멀티 이미지, 비디오를 하나의 레시피(recipe)로 통합했습니다. 이 강의에서는 그 레시피를 읽고, 프로젝터(projector)를 구현하며, 왜 "더 단순한 방식이 이겼는지" 설명합니다.

유형: Build 언어: Python (표준 라이브러리, projector + instruction-template builder) 선수 지식: Phase 12 · 02 (CLIP), Phase 11 (LLM Engineering — instruction tuning) 예상 시간: 약 180분

학습 목표

  • ViT 패치 임베딩(patch embedding; dim 1024)을 LLM 임베딩 차원(embedding dimension; dim 4096)으로 사상(mapping)하는 2층 MLP 프로젝터(projector)를 만듭니다.
  • LLaVA의 2단계 레시피를 따라갑니다. 1단계는 55만 8천 개 캡션 쌍(caption pair)으로 프로젝터 정렬(projector alignment)을 수행하고, 2단계는 GPT-4가 생성한 15만 8천 개 턴(turn)으로 시각 인스트럭션 튜닝(visual instruction tuning)을 수행합니다.
  • 이미지 토큰 자리표시자(image token placeholder), 시스템 프롬프트(system prompt), 사용자/어시스턴트(user/assistant) 턴을 포함하는 LLaVA 형식 프롬프트(LLaVA-format prompt)를 구성합니다.
  • Q-Former가 토큰 예산(token budget)에서 이점이 있음에도 커뮤니티(community)가 왜 MLP로 이동했는지 설명합니다.

문제

BLIP-2의 Q-Former(Lesson 12.03)는 이미지를 32개 토큰으로 압축합니다. 깔끔하고 효율적이며 벤치마크(benchmark)에서도 좋은 결과를 냅니다. 하지만 두 가지 문제가 있습니다.

첫째, Q-Former는 학습 가능한 모듈(module)이지만 그 손실(loss)이 최종 과제(task)는 아닙니다. 1단계(Stage 1)에서는 ITC+ITM+ITG를 학습하고, 2단계(Stage 2)에서는 언어 모델링 손실(LM loss)을 학습합니다. 쿼리(query)는 어떤 중간 표현(intermediate representation)을 학습하고, LLM은 그 표현을 다시 디코딩(decode)해야 합니다. 병목(bottleneck) 안에서 정보가 손실됩니다.

둘째, Q-Former는 1억 8,800만 개 파라미터(parameter)를 사용합니다. LLaVA가 등장한 2023년 규모에서는 Q-Former를 목표 LLM(target LLM)과 함께 공동 설계(co-design)해야 했습니다. LLM을 바꾸면 Q-Former를 다시 학습해야 하고, 비전 인코더(vision encoder)를 바꿔도 다시 학습해야 합니다. 모든 조합이 별도의 R&D 프로젝트가 되는 셈입니다.

LLaVA의 답은 민망할 정도로 단순했습니다. ViT가 만든 576개 패치 토큰(patch token)을 가져와 각 토큰을 2층 MLP(1024 → 4096 → 4096)에 통과시키고, 그 576개 토큰을 모두 LLM 입력 시퀀스(input sequence)에 그대로 넣습니다. 병목이 없습니다. 이상한 목적함수(objective)로 1단계 사전학습(pretraining)을 하지도 않습니다. 그냥 직접적인 LM 손실(direct LM loss)로 MLP를 학습합니다.

그렇다면 데이터(data)는 어디서 올까요? LLaVA의 두 번째 통찰은 GPT-4(텍스트 전용)를 사용해 인스트럭션 데이터(instruction data)를 생성한다는 것이었습니다. GPT-4에 COCO 캡션과 바운딩 박스(bounding-box) 데이터를 제공하고, 이미지에 대한 대화, 설명, 복잡한 추론(reasoning) 질문을 만들게 합니다. 이렇게 해서 15만 8천 개 인스트럭션-응답(instruction-response) 턴을 거의 공짜로 얻었습니다. 사람의 어노테이션(human annotation)이 필요하지 않았습니다.

결과적으로 LLaVA는 A100 8장에서 하루 동안 학습할 수 있었고, MMMU에서 Flamingo를 이겼으며, 커뮤니티가 확장할 수 있는 공개 체크포인트(open checkpoint)를 배포했습니다. 2023년 말에는 이미 50개가 넘는 포크(fork)가 생겼습니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.LLaVA가 Q-Former를 2층 MLP로 대체한 이유는?

2.LLaVA는 158K 인스트럭션 데이터를 어떻게 생성했나요?

0/2 답변 완료

개념

아키텍처

LLaVA-1.5 13B의 구성은 다음과 같습니다.

  • 비전 인코더(Vision encoder): CLIP ViT-L/14 @ 336입니다. 1단계에서는 동결(frozen)되어 있고, 2단계에서는 선택적으로 동결을 해제(unfreeze)할 수 있습니다.
  • 프로젝터(Projector): GELU 활성화 함수를 사용하는 2층 MLP이며, 모양(shape)은 1024 → 4096 → 4096입니다.
  • LLM: Vicuna-13B입니다. 이후 레시피에서는 Llama-3.1-8B 같은 모델도 사용됩니다.

이미지와 텍스트 프롬프트가 들어왔을 때 순전파(forward pass)는 다음처럼 진행됩니다.

img -> ViT -> dim 1024인 576개 patch
patches -> MLP -> dim 4096인 576개 token
prompt: system + "<image>" placeholder + user question
<image> token을 576개 projected token으로 교체
전체 sequence를 LLM에 입력
response decode

이미지는 LLM 컨텍스트(context)에서 576개 토큰을 차지합니다. 컨텍스트가 2048이면 텍스트에 1472개 토큰이 남습니다. 컨텍스트가 32k라면 이미지 576개 토큰은 사실상 작은 비용입니다.

1단계: 프로젝터 정렬(Projector alignment)

ViT를 동결합니다. LLM도 동결합니다. 오직 2층 MLP만 학습합니다. 데이터셋(dataset)은 55만 8천 개 이미지-캡션 쌍(LAION-CC-SBU)입니다. 손실은 사영된(projected) 이미지 토큰을 조건으로 캡션을 생성하는 언어 모델링(language modeling) 손실입니다.

배치 크기(batch size) 128에서 1 에폭(epoch)이면 몇 시간 안에 끝납니다. 프로젝터는 ViT 공간(ViT-space)을 LLM 공간(LLM-space)으로 사상하는 법을 배웁니다. 과제 특화 지도학습(task-specific supervision)은 없습니다.

2단계: 시각 인스트럭션 튜닝(Visual instruction tuning)

프로젝터는 계속 학습 가능한(trainable) 상태로 둡니다. LLM도 동결을 해제합니다. 보통 전체 미세조정(full fine-tuning)을 하며, 때로는 LoRA를 사용합니다. 이 단계에서는 15만 8천 개 시각 인스트럭션 턴으로 학습합니다.

비결은 인스트럭션 데이터입니다. Liu 등은 다음 방식으로 데이터를 만들었습니다.

  1. COCO 이미지를 가져옵니다.
  2. 텍스트 설명을 추출합니다. 여기에는 사람이 만든 캡션 5개와 바운딩 박스 목록이 포함됩니다.
  3. 세 가지 프롬프트 템플릿(prompt template)으로 GPT-4에 보냅니다.
    • 대화(Conversation): "이 이미지에 대해 사용자와 어시스턴트가 주고받는 대화를 생성하라."
    • 자세한 설명(Detailed description): "이미지를 풍부하고 자세하게 설명하라."
    • 복잡한 추론(Complex reasoning): "이미지에 대해 추론이 필요한 질문을 묻고 답하라."
  4. GPT-4의 출력(output)을 (instruction, response) 쌍으로 파싱(parse)합니다.

이 과정에서 GPT-4는 이미지를 직접 보지 않습니다. 텍스트 설명만 봅니다. 따라서 GPT-4는 그럴듯한 이미지 내용을 환각(hallucinate)할 수 있습니다. 약간의 잡음(noise)이 있었지만, 실제로는 잘 동작했습니다. 15만 8천 개 턴만으로 대화(dialogue) 능력을 열기에 충분했습니다.

커뮤니티가 이 방식을 복제한 이유

  • 1단계 전용 손실을 조정할 필요가 없습니다. 처음부터 끝까지 LM 손실을 사용합니다.
  • 프로젝터는 며칠이 아니라 몇 시간 안에 학습됩니다.
  • LLM을 바꿀 수 있습니다. LLaVA-Llama2, LLaVA-Mistral, LLaVA-Llama3처럼 프로젝터만 최소한으로 재학습하면 됩니다.
  • 시각 인스트럭션 데이터 파이프라인(pipeline)은 GPT-4를 사용하므로 새로운 도메인(domain)에 맞춰 저렴하게 다시 생성할 수 있습니다.

LLaVA-1.5와 LLaVA-NeXT

LLaVA-1.5(2023년 10월)는 다음을 추가했습니다.

  • VQA, OKVQA, RefCOCO 같은 학술 과제 데이터(academic-task data)를 인스트럭션 튜닝에 섞었습니다.
  • 더 나은 시스템 프롬프트를 사용했습니다.
  • 컨텍스트를 2048에서 32k로 확장했습니다.

LLaVA-NeXT(2024년 1월)는 다음을 추가했습니다.

  • AnyRes: 고해상도 이미지를 336x336 크롭(crop)으로 이루어진 2x2 또는 1x3 격자(grid)로 나누고, 전체 이미지를 보는 저해상도 썸네일(thumbnail) 하나를 추가합니다. 각 크롭은 576개 토큰이 되므로, 이미지 하나당 대략 2880개 시각 토큰(visual token)이 됩니다. OCR과 차트(chart) 과제 성능이 크게 올랐습니다.
  • ShareGPT4V의 고품질 GPT-4V 캡션을 포함한 더 나은 인스트럭션 데이터 혼합(mixture)을 사용했습니다.
  • Mistral-7B, Yi-34B 같은 더 강한 베이스 LLM(base LLM)을 사용했습니다.

LLaVA-OneVision

Lesson 12.08에서 OneVision을 자세히 다룹니다. 짧게 말하면, 같은 프로젝터를 사용하되 단일 이미지, 멀티 이미지, 비디오를 하나의 모델에서 다루도록 커리큘럼(curriculum)을 설계하고, 공유 시각 토큰 예산(shared visual-token budget) 안에서 학습한 레시피입니다.

Q-Former와 비교

항목Q-Former (BLIP-2)MLP (LLaVA)
이미지당 시각 토큰32576(base) 또는 2880(AnyRes)
학습 가능한 파라미터188M + LM40M + LM
1단계 손실ITC+ITM+ITGLM 단독
LLM 교체재학습 필요최소 재학습으로 교체
멀티 이미지어색함자연스러움(이어붙이기)
비디오어색함자연스러움(프레임별 이어붙이기)
토큰 예산작음

MLP는 단순성과 토큰 유연성(token flexibility)에서 이깁니다. Q-Former는 토큰 예산에서 이깁니다. 하지만 2023년 말에는 토큰 예산이 더 이상 가장 큰 제약이 아니었습니다. LLM 컨텍스트가 32k-128k+로 커졌고, 단순성이 우세해졌습니다.

프롬프트 형식(Prompt format)

A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. USER: <image> Describe this image in detail. ASSISTANT: The image shows ...

<image>는 자리표시자(placeholder) 토큰입니다. 토크나이징(tokenization) 전에 576개 시각 토큰으로 교체됩니다. AnyRes를 사용하면 2880개 토큰으로 교체됩니다. 토크나이저(tokenizer)는 자신이 학습했을 때보다 조금 더 긴 시퀀스를 보게 되지만, 1단계가 LLM에게 이 새로운 입력을 다루는 법을 가르쳤기 때문에 LLM은 처리할 수 있습니다.

파라미터 경제(Parameter economy)

LLaVA-1.5-7B의 파라미터 구성은 다음과 같습니다.

  • CLIP ViT-L/14 @ 336: 303M입니다. 1단계에서는 동결되어 있고, 2단계에서는 종종 동결을 해제합니다.
  • 프로젝터(2x linear): 약 22M의 학습 가능한 파라미터입니다.
  • Llama-7B: 7B입니다.
  • 전체: 7.3B 파라미터입니다. 2단계에서 학습되는 것은 전체 7B와 22M 프로젝터입니다.

2단계 학습 비용은 A100 8장에서 약 20시간입니다. 이것이 핵심 숫자입니다. 하루, 한 노드(node), 재현 가능. 그래서 LLaVA가 널리 퍼졌습니다.

사용해보기

code/main.py는 다음을 구현합니다.

  1. 순수 Python으로 작성한 2층 MLP 프로젝터입니다. 토이(toy) 규모에서는 dim 16 → 32 → 32를 사용합니다.
  2. 프롬프트 빌딩 파이프라인입니다. 시스템 프롬프트와 <image>를 N개의 사영된 토큰으로 교체한 값, 사용자 턴, 어시스턴트 생성 자리표시자를 만듭니다.
  3. LLM 컨텍스트 안에서 576개 토큰 시각 블록(visual block)이 어떻게 보이는지 시각화합니다. 2k / 32k / 128k 컨텍스트에서 차지하는 비율을 비교합니다.

산출물 만들기

이 강의는 outputs/skill-llava-vibes-eval.md를 만듭니다. LLaVA 계열 체크포인트가 주어지면 10개 프롬프트로 이루어진 바이브 평가(vibes-eval) 묶음을 실행합니다. 구성은 캡셔닝(captioning) 3개, VQA 3개, 추론 2개, 거절(refusal) 2개이며, 사람이 읽기 좋은 점수표(scorecard)를 보고합니다. 벤치마크가 아니라 스모크 테스트(smoke test)입니다. 프로젝터와 LLM이 잘 연결되어 있는지 확인하기 위한 용도입니다.

연습문제

  1. 쉬움: 1024 → 4096 → 4096 구조의 2층 MLP 프로젝터에 대해 학습 가능한 파라미터 수를 계산합니다. GELU와 편향(bias)을 포함할 때 LLaVA-13B 전체의 몇 퍼센트입니까?

  2. 중간: "거절(refusal)" 사례를 위한 LLaVA 프롬프트를 구성합니다. 이미지는 사적인 개인(private individual)을 포함합니다. 기대되는 어시스턴트 응답을 작성합니다. LLaVA가 제로샷(zero-shot)에서 왜 이 요청을 거절해야 하며, 거절 동작을 강화하려면 어떤 학습 데이터가 필요합니까?

  3. 중간: LLaVA-NeXT 블로그의 AnyRes 절을 읽습니다. 1344x672 이미지를 AnyRes로 처리할 때 시각 토큰 수를 계산합니다. 336x336 베이스의 576 토큰과 비교합니다.

  4. 어려움: LLaVA의 1단계 프로젝터는 캡션에 대한 LM 손실로 학습됩니다. 1단계를 건너뛰고 바로 2단계(시각 인스트럭션 튜닝)로 가면 어떤 일이 생깁니까? Prismatic VLMs 절제 실험(ablation; arXiv:2402.07865)을 근거로 답합니다.

  5. 어려움: LLaVA-Instruct-150k는 COCO 캡션과 GPT-4를 사용해 인스트럭션을 생성합니다. 새로운 도메인, 예를 들어 의료 X-ray나 위성 영상(satellite imagery)을 대상으로 도메인 인스트럭션을 만들려면 네 단계 데이터 파이프라인을 어떻게 구성하겠습니까? 각 단계에서 무엇이 잘못될 수 있습니까?

핵심 용어

용어흔한 설명실제 의미
프로젝터(Projector)"MLP 다리"GELU를 사용하는 2층 MLP로, ViT 차원을 LLM 차원으로 사상한다.
이미지 토큰(Image token)"<image> 자리표시자"추론(inference) 전에 N개의 사영된 시각 토큰으로 교체되는 프롬프트 마커이다.
시각 인스트럭션 튜닝(Visual instruction tuning)"LLaVA 2단계"GPT-4가 생성한 (이미지, 인스트럭션, 응답) 삼중쌍(triplet)으로 학습하는 단계이다.
1단계 정렬(Stage 1 alignment)"프로젝터 사전학습"ViT와 LLM을 동결하고 캡션에 대한 LM 손실로 프로젝터를 학습하는 단계이다.
AnyRes"다중 크롭 타일링(Multi-crop tiling)"고해상도 이미지를 타일 격자로 나누고 각 타일의 시각 토큰을 이어붙이는 방식이다.
LLaVA-Instruct"GPT-4가 생성"COCO 캡션과 GPT-4로 합성한 15만 8천 개 인스트럭션-응답 쌍이다.
비전 인코더 동결(Vision encoder freeze)"백본 잠금(Backbone locked)"1단계에서 CLIP 가중치(weight)를 갱신하지 않는다는 뜻이다. 2단계에서도 동결할 때가 있다.
ShareGPT4V"더 좋은 캡션"GPT-4V가 생성한 100만 개 조밀 캡션(dense caption) 데이터셋이며, 더 높은 품질의 정렬에 사용된다.
VQA"시각 질의응답(Visual question answering)"이미지에 대한 자유 형식 질문에 답하는 과제이다.
Prismatic VLMs"설계 공간 논문(Design-space paper)"Karamcheti 2024 절제 실험으로, 프로젝터와 데이터 선택지를 체계적으로 실험한 논문이다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

llava-vibes-eval

Run a 10-prompt vibes-eval on a LLaVA-family VLM and produce a human-readable scorecard.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.LLaVA 2단계 학습의 각 단계 역할은?

2.Q-Former가 토큰 효율이 더 좋은데 커뮤니티가 MLP를 선호한 이유는?

3.LLaVA 순전파에서 이미지는 어떻게 처리되나요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다