VLM
contents
LLM(ChatGPT 같은 모델)이 AI의 "두뇌"라면, VLM은 "눈"이 달린 두뇌라고 할 수 있습니다. 컴퓨터 비전(픽셀)과 자연어(텍스트) 사이의 간극을 메워주는 기술입니다.
1. 개요 (High-Level Overview)
VLM은 이미지(종종 비디오 포함)와 텍스트를 함께 받아들이고, 두 가지 모두를 이해해야 하는 작업을 수행할 수 있는 멀티모달 AI 시스템입니다.
- 기존 방식 (전통적 컴퓨터 비전): 모델이 이미지를 보고 엄격한 라벨을 출력합니다. 예:
["고양이", 98%]. 맥락을 이해하지 못합니다. - 새로운 방식 (VLM): 고양이가 꽃병을 넘어뜨리는 사진을 보여주며 "주인이 왜 화가 났을까?" 라고 물으면, VLM은 "고양이가 꽃병을 넘어뜨려 바닥을 엉망으로 만들었기 때문에 주인이 화가 났을 것입니다." 라고 대답합니다.
주요 예시:
- 상용 모델: GPT-4o (OpenAI), Gemini (Google), Claude 3.5 Sonnet (Anthropic).
- 오픈 소스: LLaVA (Large Language and Vision Assistant), Qwen-VL, PaliGemma.
2. 핵심 아키텍처: 어떻게 작동하는가?
최신 VLM은 처음부터 새로 만들어지는 경우가 드뭅니다. 보통 세 가지 다른 부분을 결합한 "프랑켄슈타인" 모델에 가깝습니다.
A. 비전 인코더 (Vision Encoder, "눈")
이미지(픽셀)를 수학적 표현(임베딩)으로 변환하는 구성 요소입니다.
- 표준 선택: ViT (Vision Transformer) 또는 CLIP 기반 인코더(SigLIP 등).
- 과정:
- 이미지를 패치(Patches) 라고 불리는 작은 정사각형(예: 14x14 픽셀)으로 자릅니다.
- 각 패치를 벡터로 평탄화(Flatten)합니다.
- 이 벡터들은 마치 문장 속의 단어들처럼 트랜스포머에 의해 처리됩니다.
- 출력: 이미지의 시각적 특징을 나타내는 벡터 시퀀스입니다.
B. 언어 모델 (Language Model, "두뇌")
일반적으로 사전에 학습된 표준 LLM(Llama 3, Vicuna, Mistral 등)을 사용합니다. 텍스트, 논리, 추론을 이해합니다.
C. 프로젝터 / 어댑터 (The Projector / Adapter, "다리")
가장 중요한 부분입니다. 비전 인코더의 "언어"(시각적 벡터)는 LLM의 "언어"(텍스트 벡터)와 다릅니다.
- 연결 장치: 경량 신경망(보통 단순한 선형 레이어 또는 MLP)이 번역가 역할을 합니다.
- 기능: 시각적 임베딩을 텍스트 토큰과 동일한 "임베딩 공간(Embedding Space)"으로 투영(Project)합니다.
- 결과: LLM 입장에서 이미지는 문장 맨 앞에 있는 일련의 낯선 "단어들"처럼 보이게 됩니다.
3. VLM 학습 방법
학습은 보통 두 가지 주요 단계로 진행됩니다.
1단계: 대조 학습 (Contrastive Learning - 정렬)
OpenAI의 CLIP에 의해 대중화된 방식입니다.
- 데이터: 인터넷에서 수집한 수십억 쌍의 (이미지, 텍스트) 데이터.
- 목표: 벡터 공간에서 '강아지 사진'의 벡터를 텍스트 "강아지"의 벡터와 가깝게 만들고, 텍스트 "바나나"와는 멀어지게 학습합니다.
- 결과: 모델은 사물의 생김새와 단어 간의 관계를 배우지만, 아직 "말(Speak)"을 할 수는 없습니다.
2단계: 시각적 지시 튜닝 (Visual Instruction Tuning - 채팅 능력)
이 단계가 모델을 챗봇(LLaVA 등)으로 만듭니다.
- 방법: 비전 인코더와 LLM은 고정(Freeze)합니다. 오직 프로젝터(어댑터) 만 학습시킵니다.
- 프롬프트:
<이미지_임베딩> <사용자: 이 이미지를 묘사해줘.> <AI: ...> - 목표: 모델은 이미지 임베딩을 문맥으로 삼아 다음 텍스트 토큰을 생성하는 법을 배웁니다.
4. 주요 기능
- VQA (Visual Question Answering): "이 사진에서 빨간 모자를 쓴 사람은 몇 명인가요?"
- OCR 없는 텍스트 이해: 단순히 글자를 읽는 OCR과 달리, 이미지 속 텍스트의 _의미_를 이해합니다 (예: 밈(Meme)을 설명하거나, 메뉴판을 읽고 채식 요리를 추천).
- 시각적 추론: 기하학 문제를 풀거나 차트/그래프를 분석합니다.
- 공간적 그라운딩 (Spatial Grounding): 일부 VLM은 객체의 위치를 경계 상자(좌표)로 출력할 수 있습니다. "강아지가 어디 있어?" ->
[0.2, 0.5, 0.4, 0.8].
5. 진화 과정: CLIP에서 LLaVA까지
전체적인 흐름을 이해하기 위해 타임라인을 알 필요가 있습니다.
| 시대 | 모델 | 설명 |
|---|---|---|
| 1세대: 정렬 | CLIP (2021) | 이미지와 텍스트를 매칭(제로샷 분류)할 수 있었지만, 텍스트를 생성할 수는 없었습니다. 대화 불가능. |
| 2세대: 인터리브 | Flamingo (2022) | 딥마인드의 혁신. 여러 장의 이미지와 텍스트가 섞인 입력을 처리할 수 있었으나 비공개(Closed Source)였습니다. |
| 3세대: 지시 튜닝 | LLaVA (2023) | 게임 체인저. Llama에 간단한 프로젝션 레이어로 비전 인코더를 붙이기만 해도 놀랍도록 잘 작동함을 증명했습니다. 오픈 소스 VLM 붐을 일으켰습니다. |
| 4세대: 네이티브 | GPT-4o / Gemini 1.5 | 이들은 나중에 붙인 것이 아니라, 처음부터 이미지/텍스트 혼합 데이터로 학습된 "네이티브 멀티모달" 모델일 가능성이 높습니다. |
6. 코드 예제 (Python & Transformers)
Hugging Face transformers 라이브러리를 사용하여 VLM(구체적으로 LLaVA)을 프로그래밍 방식으로 실행하는 코드는 다음과 같습니다.
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
import torch
from PIL import Image
import requests
# 1. 모델 및 프로세서 로드
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained(
"llava-hf/llava-v1.6-mistral-7b-hf",
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
model.to("cuda:0")
# 2. 이미지 및 텍스트 준비
url = "https://github.com/haotian-liu/LLaVA/blob/1a91fc274d7c35a9b50b3cb29c4247ae5837ce39/images/llava_logo.jpg?raw=true"
image = Image.open(requests.get(url, stream=True).raw)
prompt = "[INST] \nWhat is shown in this image? [/INST]"
# 3. 입력 전처리 (이미지를 픽셀로, 텍스트를 토큰으로 변환)
inputs = processor(prompt, image, return_tensors="pt").to("cuda:0")
# 4. 출력 생성 (Autoregressive generation)
output = model.generate(**inputs, max_new_tokens=100)
# 5. 디코딩 (토큰을 다시 텍스트로 변환)
print(processor.decode(output[0], skip_special_tokens=True))
7. 도전 과제 및 한계
많은 기대에도 불구하고 VLM은 명확한 약점을 가지고 있습니다.
- 환각 (Hallucination): 종종 없는 것을 봅니다. "빨간 차가 어디 있어?"라고 물으면, 빨간 차가 없어도 질문을 만족시키기 위해 지어낼 수 있습니다.
- 공간적 맹목 (Spatial Blindness): 이미지에 무엇 이 있는지는 잘 알지만, 정확히 어디 에 있는지(왼쪽 vs 오른쪽)나 물체의 개수를 정확히 세는 것(예: 사과 15개 세기)에 약한 경우가 많습니다.
- 해상도 (Resolution): 대부분의 표준 VLM은 이미지를 작은 정사각형(예: 336x336 픽셀)으로 크기를 조정합니다. 깨알 같은 글씨가 있는 4K 도표를 업로드하면 인코더가 이를 축소해 버려 글씨가 뭉개집니다. (LLaVA-Next나 Gemini 1.5 Pro 같은 최신 모델은 동적 해상도를 지원하여 이를 해결하고 있습니다).
references