LabHub

블로그

Vision LLM 학습법 — input과 output을 어떻게 가르치나

한국어English日本語

들어가며: 학습은 곧 입력과 출력을 정의하는 일

비전-언어 모델(VLM)을 학습한다는 것은, 결국 모델에게 어떤 입력을 주고 어떤 출력을 기대할지 정의하는 일입니다. 같은 아키텍처라도 무엇을 입력으로 보여주고 무엇을 정답으로 삼느냐에 따라 전혀 다른 능력이 길러집니다. 이미지 캡션만 학습하면 설명은 잘하지만 지시를 따르지 못하고, 좌표를 학습하면 객체를 짚어내며, 문서를 학습하면 표와 폼을 읽습니다.

이 글은 VLM이 어떻게 학습되는지를 입력과 출력의 관점에서 풀어냅니다. 단계적 학습 파이프라인, 비전 인코더 동결 전략, 데이터의 종류, 입력 포맷과 출력 형태, 손실 계산, 그리고 정렬 단계까지 다룹니다. 아키텍처 자체는 별도의 글에서 다뤘으니, 여기서는 그 구조를 어떻게 가르치는가에 집중합니다.

학습을 시작하기 전 가진 것

처음부터 모든 것을 무에서 학습하지는 않습니다. 보통 두 개의 잘 학습된 부품에서 출발합니다. 하나는 대규모 이미지로 사전학습된 비전 인코더이고, 다른 하나는 대규모 텍스트로 사전학습된 LLM입니다. 둘은 각자 자기 영역에서 강하지만, 서로 대화하는 법은 모릅니다.

출발점
  비전 인코더(사전학습)  이미지는 잘 보지만 언어와 정렬 안 됨
  LLM(사전학습)          언어는 잘 다루지만 이미지를 본 적 없음
  프로젝터(무작위 초기화)  아직 아무것도 모름

목표
  세 부품이 협력해 이미지를 보고 언어로 답하게 만들기

그래서 VLM 학습의 첫 과제는 두 강한 부품을 잇는 다리(프로젝터)를 놓고, 그 다리 위로 정보가 흐르도록 정렬하는 것입니다. 이 출발 조건을 기억하면, 왜 학습이 정렬 단계부터 시작하는지, 왜 프로젝터를 먼저 학습하는지가 자연스럽게 이해됩니다.

핵심 원리: 단계적 학습 파이프라인

대부분의 VLM은 한 번에 학습하지 않고, 단계를 나누어 점진적으로 능력을 쌓습니다. 전형적인 흐름은 세 단계입니다.

1단계: 비전-언어 정렬 사전학습
   목표: 비주얼 토큰을 LLM 언어 공간에 정렬
   데이터: 대규모 이미지-캡션 쌍
   학습 대상: 주로 프로젝터 (비전 인코더/LLM은 동결 경향)

2단계: 멀티태스크 사전학습
   목표: 다양한 시각 능력(캡션·VQA·OCR·grounding) 폭넓게 습득
   데이터: 혼합 멀티태스크 코퍼스
   학습 대상: 프로젝터 + LLM (+ 비전 인코더 일부 해제 가능)

3단계: 인스트럭션 파인튜닝
   목표: 지시 따르기, 대화, 형식 준수
   데이터: 고품질 인스트럭션-응답 (이미지 포함)
   학습 대상: 주로 LLM (+ 프로젝터)

1단계는 비전과 언어를 같은 의미 공간에 올리는 정렬 단계입니다. 여기서는 모델이 이미지를 보고 무엇인지 대략 말할 수 있게만 만들면 됩니다. 2단계에서 능력의 폭을 넓히고, 3단계에서 사람의 지시에 맞춰 행동하도록 다듬습니다. 단계가 뒤로 갈수록 데이터의 양은 줄고 품질은 올라가는 경향이 있습니다.

깊이 보기 1: 비전 인코더 동결과 해제

학습에서 가장 중요한 결정 중 하나는 어떤 구성 요소를 언제 학습시킬지입니다. 특히 비전 인코더를 동결할지 해제할지가 핵심입니다.

동결 전략의 직관

       1단계        2단계         3단계
비전엔코더  동결    부분/전체 해제   동결 또는 낮은 lr
프로젝터    학습     학습           학습
LLM        동결     학습(낮은 lr)   학습

이 표는 절대 규칙이 아니라 흔한 패턴입니다. 모델과 데이터 규모에 따라 조합은 달라집니다. 핵심 직관은 잘 작동하는 부품은 함부로 흔들지 않고, 정렬이 필요한 부품(프로젝터)부터 학습한다는 것입니다.

학습률과 안정성

서로 다른 구성 요소는 서로 다른 학습률을 쓰는 경우가 많습니다. 잘 사전학습된 비전 인코더와 LLM에는 작은 학습률을, 처음부터 배우는 프로젝터에는 상대적으로 큰 학습률을 줍니다. 이렇게 하면 좋은 표현을 보존하면서 정렬만 빠르게 학습할 수 있습니다.

깊이 보기 2: 데이터 — 무엇을 보여주는가

VLM의 능력은 학습 데이터가 결정합니다. 주요 데이터 유형은 다음과 같습니다.

데이터의 비율과 품질이 결과를 좌우합니다. OCR 데이터를 늘리면 문서를 잘 읽지만, 너무 치우치면 일반 대화 능력이 떨어질 수 있습니다. 단계별로 데이터 혼합 비율을 조절하는 것이 실무의 핵심 기술입니다.

깊이 보기 3: 입력 포맷 — 어떻게 보여주는가

학습 입력은 이미지 토큰과 텍스트 토큰을 인터리빙한 시퀀스이며, 보통 채팅 템플릿으로 감쌉니다.

채팅 템플릿과 이미지 자리표시

입력은 시스템/유저/어시스턴트 역할로 구성되고, 이미지가 들어갈 자리에 자리표시 토큰을 둡니다. 전처리 단계에서 그 자리가 실제 비주얼 토큰으로 치환됩니다.

system: 너는 도움이 되는 비전 어시스턴트다.
user: [IMAGE] 이 영수증의 총액은 얼마인가?
assistant: 총액은 32,500원입니다.

여기서 IMAGE 자리는 학습 직전에 비주얼 토큰 블록으로 치환됩니다. 다중 이미지면 각 이미지 자리마다 해당 블록이 들어갑니다.

출력의 다양한 형태

VLM의 출력은 텍스트만이 아닙니다. 학습 데이터의 정답 형식이 곧 모델이 배우는 출력 형식이 됩니다.

출력을 구조화하려면 학습 데이터의 정답도 같은 구조여야 합니다. 모델은 정답 형식을 모방하므로, 일관된 포맷으로 데이터를 만드는 것이 중요합니다.

깊이 보기 4: 손실 — 무엇을 기준으로 배우나

VLM의 학습 목표는 LLM과 동일하게 다음 토큰 예측입니다. 즉 시퀀스의 각 위치에서 다음 토큰의 확률을 높이도록 학습합니다.

loss = - sum over target positions of log P(token_t | tokens_<t)

핵심은 어느 위치에서 손실을 계산하느냐입니다. 보통 이미지 토큰과 사용자 프롬프트 부분은 손실 계산에서 제외(마스킹)하고, 어시스턴트의 응답 토큰에서만 손실을 계산합니다.

[system] [user 텍스트] [IMAGE 토큰들] [assistant 응답]
   X          X            X(마스킹)        O(손실 계산)

이렇게 하는 이유는 명확합니다. 우리는 모델이 이미지를 생성하거나 사용자의 질문을 따라 외우길 원하는 게 아니라, 좋은 응답을 생성하길 원합니다. 따라서 정답인 어시스턴트 응답에서만 학습 신호를 줍니다. 이미지 토큰은 보통 생성 대상이 아니므로 손실에서 빠집니다.

의사코드로 보는 손실 마스킹

def compute_loss(logits, labels, loss_mask):
    # logits: B x T x V, labels: B x T, loss_mask: B x T (1=학습, 0=무시)
    shift_logits = logits[:, :-1, :]
    shift_labels = labels[:, 1:]
    shift_mask = loss_mask[:, 1:]

    token_loss = cross_entropy(
        shift_logits.reshape(-1, shift_logits.size(-1)),
        shift_labels.reshape(-1),
        reduction="none",
    )
    token_loss = token_loss.reshape(shift_labels.shape)

    # 마스킹: 이미지 토큰/유저 토큰 위치는 0, 어시스턴트 응답만 1
    masked = token_loss * shift_mask
    return masked.sum() / shift_mask.sum().clamp(min=1)

loss_mask를 어떻게 만드느냐가 학습 품질을 좌우합니다. 어시스턴트 응답만 1로 표시하고, 이미지 토큰과 프롬프트는 0으로 막는 것이 일반적인 출발점입니다.

전체 학습 스텝 의사코드

def training_step(batch, model):
    # batch: 이미지 텐서 + 토큰화된 인터리빙 시퀀스 + loss_mask
    visual_tokens = model.vision_encoder(batch["images"])      # B x N_v x D_vis
    visual_tokens = model.projector(visual_tokens)             # B x N_v x D_llm

    # 자리표시 위치에 비주얼 토큰 삽입
    inputs_embeds = model.embed_and_inject(
        batch["input_ids"], visual_tokens, batch["image_positions"]
    )

    logits = model.llm(inputs_embeds=inputs_embeds,
                       attention_mask=batch["attention_mask"])

    loss = compute_loss(logits, batch["labels"], batch["loss_mask"])
    return loss

깊이 보기 5: grounding과 좌표를 텍스트로 가르치기

VLM이 객체를 짚어내는 grounding 능력은 어떻게 학습될까요. 핵심은 좌표를 특별한 모듈 없이 텍스트 토큰으로 표현하는 것입니다. 박스 좌표를 0에서 999 같은 정수 범위로 정규화한 뒤, 그 숫자들을 문자열처럼 출력하도록 가르칩니다.

입력:  [IMAGE] 강아지를 박스로 표시해줘.
정답:  강아지의 위치는 (x1=120, y1=340, x2=410, y2=720) 입니다.

모델 입장에서 좌표는 그냥 또 다른 토큰 시퀀스입니다. 다음 토큰 예측으로 숫자를 생성하면, 그것이 곧 위치가 됩니다. 이렇게 하면 별도의 검출 헤드 없이 같은 언어 모델링 손실로 grounding을 학습할 수 있습니다.

깊이 보기 6: 데이터 혼합과 커리큘럼

단계별로 어떤 데이터를 얼마나 섞느냐가 최종 능력을 좌우합니다. 이를 데이터 믹스 혹은 커리큘럼이라 부릅니다.

정렬 단계 믹스(예)
  이미지-캡션      대부분
  간단한 VQA       소량

멀티태스크 단계 믹스(예)
  이미지-캡션      일부
  VQA              상당량
  OCR/문서         상당량
  grounding        일부
  차트/표          일부

인스트럭션 단계 믹스(예)
  대화형 인스트럭션  대부분
  형식 준수 예시     일부
  거절/안전 예시     소량

핵심 직관은 단계가 진행될수록 데이터의 다양성과 품질을 끌어올리는 것입니다. 초기에는 양으로 정렬을 잡고, 후기에는 질로 행동을 다듬습니다. 특정 능력이 약하면 그 데이터 비중을 늘리되, 한 쪽을 과하게 늘리면 다른 능력이 퇴화하는 균형 문제를 늘 염두에 둬야 합니다.

능력 간 간섭

OCR 데이터를 크게 늘리면 문서는 잘 읽지만 자유로운 대화가 딱딱해질 수 있습니다. 반대로 대화 데이터만 많으면 정밀한 좌표나 표 추출이 약해집니다. 이런 능력 간 간섭은 VLM 학습에서 흔한 현상이며, 평가 세트를 능력별로 나눠 추적하면서 믹스를 조정하는 것이 실무의 핵심입니다.

깊이 보기 7: 효율적 파인튜닝과 파라미터 전략

전체 모델을 매번 학습하는 것은 비쌉니다. 그래서 일부만 학습하는 효율적 파인튜닝 전략이 널리 쓰입니다.

파인튜닝 비용 비교(직관)
  전체 학습       비쌈,   최대 유연성
  부분 학습       중간,   균형
  LoRA류 어댑터    저렴,   빠른 도메인 적응
  프로젝터만      매우 저렴, 제한적 적응

도메인 특화 문서 추출처럼 좁은 작업에는 LoRA류로 충분한 경우가 많고, 모델의 근본 능력을 바꿔야 한다면 더 많은 파라미터를 풀어야 합니다. 작업의 성격과 예산에 맞춰 전략을 고르는 것이 중요합니다.

깊이 보기 7.5: 채팅 템플릿과 특수 토큰

입력을 구성할 때 채팅 템플릿은 단순한 형식이 아니라 학습 신호의 일부입니다. 모델은 템플릿의 특수 토큰을 경계로 역할을 구분합니다.

일반적인 채팅 템플릿 구조
  <역할:system> 시스템 지시 <역할끝>
  <역할:user> [이미지 자리] 사용자 질문 <역할끝>
  <역할:assistant> 모델 응답 <역할끝>

여기서 흔한 실수는 학습과 추론에서 채팅 템플릿이 미묘하게 달라지는 것입니다. 공백 하나, 토큰 하나가 어긋나도 모델은 학습 때와 다른 입력으로 인식해 성능이 떨어집니다. 학습과 추론은 반드시 같은 템플릿 함수를 공유해야 합니다.

깊이 보기 7.6: 학습 안정성과 흔한 실패

VLM 학습은 텍스트 학습보다 불안정해지기 쉽습니다. 두 종류의 데이터와 세 종류의 부품이 얽히기 때문입니다. 자주 보는 실패 양상을 정리합니다.

실패 -> 점검 항목
  손실 발산      학습률, 특히 비전 인코더 lr
  모달리티 붕괴   이미지 필수 데이터 비중
  반복 생성      종료 토큰, 데이터 품질
  형식 무시      형식 예시 수, 스키마 일관성

이런 실패는 대부분 데이터 믹스나 학습률, 혹은 마스크 설정에서 비롯됩니다. 모델 구조를 바꾸기 전에 이 세 가지를 먼저 점검하는 것이 효율적입니다.

정렬 단계: RLHF와 DPO 간단히

인스트럭션 파인튜닝까지 마치면 모델은 지시를 따릅니다. 여기에 사람 선호를 반영하는 정렬 단계를 더하면 응답의 유용성과 안전성이 올라갑니다.

VLM에서도 같은 원리가 적용됩니다. 다만 선호 데이터에 이미지가 포함되며, 환각(이미지에 없는 것을 말하는 현상)을 줄이는 방향으로 선호를 모으는 경우가 많습니다.

비교 테이블: 학습 단계 한눈에

단계주 목표데이터주 학습 대상데이터 양/품질
정렬 사전학습비전-언어 정렬이미지-캡션프로젝터양 많음, 품질 보통
멀티태스크능력 폭 확대혼합 멀티태스크프로젝터+LLM중간
인스트럭션 튜닝지시 따르기인스트럭션-응답LLM양 적음, 품질 높음
정렬(RLHF/DPO)선호 반영선호 쌍LLM적음, 매우 높음
손실 위치마스킹 여부이유
이미지 토큰마스킹(제외)생성 대상 아님
시스템/유저 텍스트마스킹(제외)질문을 외우게 하지 않음
어시스턴트 응답학습(포함)좋은 응답 생성이 목표

깊이 보기 8: 평가와 학습 모니터링

학습이 잘 되고 있는지는 손실 곡선만 봐서는 알 수 없습니다. VLM은 능력이 여러 갈래이므로, 능력별 평가 세트로 다각도로 추적해야 합니다.

모니터링 대시보드(예)
  캡션 품질        검증 세트 점수 추이
  VQA 정확도       질의응답 정답률
  OCR/문서 정확도   필드 추출 정확도
  grounding 정확도  좌표 정합도
  대화 품질        인스트럭션 준수 평가
  환각 비율        근거 없는 응답 빈도

여기서 흔한 함정은 한 지표만 보고 학습을 끌고 가는 것입니다. OCR 정확도만 올리다 보면 어느 순간 대화 품질이 무너져 있을 수 있습니다. 여러 지표를 함께 보며, 한쪽이 좋아질 때 다른 쪽이 나빠지지 않는지 감시하는 것이 중요합니다.

깊이 보기 9: 멀티모달 배치와 학습 효율

VLM 학습은 텍스트 전용 학습보다 배치 구성이 까다롭습니다. 이미지마다 비주얼 토큰 수가 다르고(임의 해상도), 텍스트 길이도 제각각이라 시퀀스 길이가 들쭉날쭉합니다.

배치 구성의 어려움
  샘플1: 짧은 텍스트 + 작은 이미지(256 토큰)   -> 총 300 토큰
  샘플2: 긴 텍스트 + 큰 이미지(6000 토큰)      -> 총 6500 토큰
  샘플3: 텍스트만                            -> 총 200 토큰
  
  단순 패딩 시: 가장 긴 샘플에 맞춰 패딩 -> 낭비 큼

이 비효율을 줄이는 기법들이 있습니다.

학습 효율은 곧 비용입니다. 같은 GPU 시간에 더 많은 유효 토큰을 학습할수록 비용 대비 성능이 좋아지므로, 배치 구성은 단순한 엔지니어링 디테일이 아니라 학습 경제성의 핵심입니다.

깊이 보기 10: 분산 학습과 메모리

큰 VLM은 단일 GPU에 올라가지 않습니다. 그래서 분산 학습 전략이 필요합니다.

메모리를 차지하는 주요 요소
  모델 파라미터      고정
  옵티마이저 상태    파라미터의 수 배(옵티마이저에 따라)
  그래디언트         파라미터와 같은 크기
  활성값            배치/시퀀스 길이에 비례 (비주얼 토큰 포함)

VLM에서 특히 주의할 점은 활성값입니다. 비주얼 토큰이 시퀀스를 길게 만들면 활성값 메모리가 급증합니다. 그래서 이미지 토큰 상한과 활성값 체크포인팅이 큰 이미지 학습에서 중요해집니다.

깊이 보기 11: 합성 데이터와 데이터 증강

고품질 라벨 데이터는 비쌉니다. 그래서 합성 데이터로 학습 데이터를 보강하는 기법이 널리 쓰입니다.

합성 데이터 활용 흐름
  실제 데이터(소량, 고품질)  +  합성 데이터(대량, 통제 가능)
   |
   v
  혼합 학습  ->  실제 분포로 검증  ->  도메인 갭 점검

합성 데이터의 함정은 도메인 갭입니다. 너무 깨끗한 합성 이미지만 학습하면 실제 노이즈 있는 문서에서 무너집니다. 합성과 실제를 적절히 섞고, 평가는 반드시 실제 데이터로 하는 것이 안전합니다.

데이터 큐레이션과 함정

마치며

VLM 학습의 본질은 단계적으로 입력과 출력을 정의하는 일입니다. 정렬 사전학습으로 비전과 언어를 같은 공간에 올리고, 멀티태스크로 능력의 폭을 넓히며, 인스트럭션 튜닝으로 지시를 따르게 하고, 정렬로 사람 선호를 반영합니다. 그 사이사이 비전 인코더의 동결과 해제, 데이터 혼합 비율, 손실 마스킹이라는 손잡이를 돌려 원하는 능력을 키웁니다.

기억할 핵심은 하나입니다. 모델은 보여준 입력과 정답으로 삼은 출력을 모방합니다. 좌표를 가르치면 좌표를, 표를 가르치면 표를 냅니다. 그러니 어떤 능력을 원하는지부터 정하고, 그 능력을 정확히 반영하는 입력 포맷과 출력 형식으로 데이터를 설계하는 것이 학습의 출발점입니다.

참고 자료

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다