Skip to content

필사 모드: Vision LLM 학습법 — input과 output을 어떻게 가르치나

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.
원문 렌더가 준비되기 전까지 텍스트 가이드로 표시합니다.

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

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

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

학습을 시작하기 전 가진 것

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

출발점

비전 인코더(사전학습) 이미지는 잘 보지만 언어와 정렬 안 됨

LLM(사전학습) 언어는 잘 다루지만 이미지를 본 적 없음

프로젝터(무작위 초기화) 아직 아무것도 모름

목표

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

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

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

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

1단계: 비전-언어 정렬 사전학습

목표: 비주얼 토큰을 LLM 언어 공간에 정렬

데이터: 대규모 이미지-캡션 쌍

학습 대상: 주로 프로젝터 (비전 인코더/LLM은 동결 경향)

2단계: 멀티태스크 사전학습

목표: 다양한 시각 능력(캡션·VQA·OCR·grounding) 폭넓게 습득

데이터: 혼합 멀티태스크 코퍼스

학습 대상: 프로젝터 + LLM (+ 비전 인코더 일부 해제 가능)

3단계: 인스트럭션 파인튜닝

목표: 지시 따르기, 대화, 형식 준수

데이터: 고품질 인스트럭션-응답 (이미지 포함)

학습 대상: 주로 LLM (+ 프로젝터)

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

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

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

동결 전략의 직관

- **초기에는 비전 인코더 동결**: 사전학습된 비전 인코더는 이미 좋은 시각 특징을 냅니다. 정렬 초기에 이를 함께 흔들면 망가지기 쉬우므로, 보통 프로젝터만 학습합니다.

- **중후반에 점진적 해제**: 능력을 끌어올리는 단계에서 비전 인코더를 일부 또는 전부 해제해 도메인(문서, 차트 등)에 맞게 미세 조정합니다. 다만 학습률을 낮게 잡아 기존 표현이 무너지지 않게 합니다.

- **LLM도 단계적으로**: LLM 백본 역시 정렬 초기에는 동결하거나 낮은 학습률로, 인스트럭션 단계에서 본격적으로 학습하는 식으로 다룹니다.

1단계 2단계 3단계

비전엔코더 동결 부분/전체 해제 동결 또는 낮은 lr

프로젝터 학습 학습 학습

LLM 동결 학습(낮은 lr) 학습

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

학습률과 안정성

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

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

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

- **이미지-캡션**: 이미지와 그 설명. 정렬 사전학습의 주력. 대규모 웹 수집 데이터가 흔합니다.

- **문서/OCR**: 텍스트가 담긴 이미지와 그 텍스트. 작은 글자, 표, 영수증, 폼을 읽는 능력을 기릅니다.

- **VQA(시각 질의응답)**: 이미지에 대한 질문과 답. 추론과 지시 따르기를 함께 학습합니다.

- **grounding/좌표**: 이미지 내 객체 위치(박스 좌표)와 그 이름. 객체를 짚고 가리키는 능력을 줍니다.

- **차트/표 이해**: 차트나 표 이미지와 그 구조화된 해석. 수치 추론을 기릅니다.

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

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

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

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

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

system: 너는 도움이 되는 비전 어시스턴트다.

user: [IMAGE] 이 영수증의 총액은 얼마인가?

assistant: 총액은 32,500원입니다.

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

출력의 다양한 형태

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

- **자연어 텍스트**: 캡션, 답변, 설명.

- **좌표**: grounding 작업에서 박스 좌표를 텍스트 토큰으로 표현(예: 정규화된 숫자 시퀀스). 모델이 좌표를 글자처럼 생성합니다.

- **구조화 출력**: JSON, 마크다운 표 등. 문서 파싱에서 키-값이나 표 구조를 그대로 생성하도록 가르칩니다.

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

깊이 보기 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류 저랭크 어댑터**: LLM이나 비전 인코더의 가중치를 직접 바꾸지 않고, 작은 저랭크 행렬만 추가 학습합니다. 메모리와 저장 비용이 크게 줄어 같은 베이스 모델에 여러 어댑터를 갈아 끼울 수 있습니다.

- **부분 동결**: 비전 인코더는 동결하고 LLM과 프로젝터만 학습하는 식으로, 안정성과 비용의 균형을 잡습니다.

파인튜닝 비용 비교(직관)

전체 학습 비쌈, 최대 유연성

부분 학습 중간, 균형

LoRA류 어댑터 저렴, 빠른 도메인 적응

프로젝터만 매우 저렴, 제한적 적응

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

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

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

일반적인 채팅 템플릿 구조

<역할:system> 시스템 지시 <역할끝>

<역할:user> [이미지 자리] 사용자 질문 <역할끝>

<역할:assistant> 모델 응답 <역할끝>

- **역할 경계 토큰**: 시스템·유저·어시스턴트를 구분하는 특수 토큰. 이 경계가 있어야 손실 마스크를 정확히 칠 수 있습니다.

- **이미지 자리표시**: 이미지가 들어갈 위치를 표시하는 토큰. 전처리에서 비주얼 토큰으로 치환됩니다.

- **응답 종료 토큰**: 모델이 언제 멈출지 배우게 하는 토큰. 이게 없으면 생성이 끝나지 않습니다.

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

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

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

- **손실 발산**: 비전 인코더를 너무 큰 학습률로 해제하면 손실이 튀어 오릅니다. 인코더는 낮은 학습률로 조심스럽게 다루세요.

- **모달리티 붕괴**: 모델이 이미지를 무시하고 텍스트만 보고 답하는 현상. 이미지가 답에 꼭 필요한 데이터를 충분히 섞어야 합니다.

- **반복 생성**: 응답이 같은 구절을 무한 반복. 데이터 품질과 종료 토큰 학습을 점검하세요.

- **형식 무시**: 구조화 출력을 요구해도 자유 텍스트를 냄. 형식 준수 예시를 늘리고 일관성을 확보하세요.

실패 -> 점검 항목

손실 발산 학습률, 특히 비전 인코더 lr

모달리티 붕괴 이미지 필수 데이터 비중

반복 생성 종료 토큰, 데이터 품질

형식 무시 형식 예시 수, 스키마 일관성

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

정렬 단계: RLHF와 DPO 간단히

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

- **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에 올라가지 않습니다. 그래서 분산 학습 전략이 필요합니다.

- **데이터 병렬**: 같은 모델 복제본을 여러 GPU에 두고 서로 다른 데이터를 학습한 뒤 그래디언트를 합칩니다. 가장 단순합니다.

- **샤딩(파라미터 분할)**: 모델 파라미터·옵티마이저 상태·그래디언트를 GPU들에 쪼개어 메모리 부담을 분산합니다. 큰 모델 학습의 표준입니다.

- **활성값 체크포인팅**: 순전파 중간 활성값을 저장하지 않고 역전파 때 다시 계산해 메모리를 아낍니다. 연산을 더 쓰는 대신 메모리를 절약하는 절충입니다.

메모리를 차지하는 주요 요소

모델 파라미터 고정

옵티마이저 상태 파라미터의 수 배(옵티마이저에 따라)

그래디언트 파라미터와 같은 크기

활성값 배치/시퀀스 길이에 비례 (비주얼 토큰 포함)

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

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

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

- **템플릿 기반 생성**: 표나 폼을 프로그램으로 생성하고 정답을 함께 만듭니다. 구조가 명확한 작업에 효과적입니다.

- **기존 모델로 재캡셔닝**: 강한 모델로 이미지에 더 정확한 캡션을 다시 달아 노이즈를 줄입니다.

- **렌더링 합성**: 다양한 글꼴·배경·해상도로 텍스트를 렌더링해 OCR 데이터를 무한히 만들 수 있습니다. 도메인 갭에 주의해야 합니다.

합성 데이터 활용 흐름

실제 데이터(소량, 고품질) + 합성 데이터(대량, 통제 가능)

|

v

혼합 학습 -> 실제 분포로 검증 -> 도메인 갭 점검

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

데이터 큐레이션과 함정

- **노이즈 캡션**: 웹 수집 이미지-캡션은 부정확하거나 무관한 경우가 많습니다. 필터링과 재캡셔닝으로 품질을 올리면 효과가 큽니다.

- **데이터 불균형**: 특정 작업(예: OCR)에 과하게 치우치면 다른 능력이 퇴화합니다. 단계별 혼합 비율을 모니터링하세요.

- **환각 유발 데이터**: 이미지에 없는 내용을 단정하는 캡션을 많이 학습하면 모델이 환각을 일으킵니다. 근거 있는 응답 위주로 큐레이션하는 것이 중요합니다.

- **포맷 불일치**: 학습 정답의 출력 형식이 들쭉날쭉하면 모델이 일관된 구조를 못 냅니다. JSON/표 출력은 스키마를 고정하세요.

- **전처리 불일치**: 학습과 추론의 이미지 전처리(패치 크기, 정규화)가 다르면 성능이 떨어집니다. 같은 파이프라인을 양쪽에서 공유하세요.

- **손실 마스크 버그**: loss_mask가 잘못되어 프롬프트나 이미지 토큰에서 손실이 새면 학습이 엉뚱한 방향으로 갑니다. 마스크를 반드시 검증하세요.

마치며

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

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

참고 자료

- Qwen2-VL: Enhancing Vision-Language Model's Perception (arXiv: 2409.12191) — [arxiv.org/abs/2409.12191](https://arxiv.org/abs/2409.12191)

- Attention Is All You Need (arXiv: 1706.03762) — [arxiv.org/abs/1706.03762](https://arxiv.org/abs/1706.03762)

- FlashAttention: Fast and Memory-Efficient Exact Attention (arXiv: 2205.14135) — [arxiv.org/abs/2205.14135](https://arxiv.org/abs/2205.14135)

- Qwen 공식 저장소 — [github.com/QwenLM](https://github.com/QwenLM)

- Hugging Face Transformers 문서 — [huggingface.co/docs](https://huggingface.co/docs)

- PyTorch 공식 문서 — [pytorch.org](https://pytorch.org)

- vLLM 문서 — [docs.vllm.ai](https://docs.vllm.ai)

- vLLM 저장소 — [github.com/vllm-project/vllm](https://github.com/vllm-project/vllm)

현재 단락 (1/208)

비전-언어 모델(VLM)을 학습한다는 것은, 결국 모델에게 어떤 입력을 주고 어떤 출력을 기대할지 정의하는 일입니다. 같은 아키텍처라도 무엇을 입력으로 보여주고 무엇을 정답으로 삼...

작성 글자: 0원문 글자: 9,783작성 단락: 0/208