개요

26~28편은 어떤 모델이 있는지의 이야기였다. 마지막 차시는 방향이 바뀐다.

좋은 모델을 골랐다. 그런데 내 문제에는 여전히 잘 안 맞는다. 어떻게 내 것으로 만들까?

강의가 든 예가 현실적이었다. 의료 영상은 개인정보 문제로 구하기 어렵고, 3D 데이터는 고가의 특수 장비가 없으면 취득 자체가 안 된다. 제조 현장의 불량 데이터는 애초에 몇 장 없다. 부족한 현실 데이터를 극복할 방법이 이번 편의 주제다.

두 갈래로 나뉜다. 하나는 적응 학습 — 모델을 조금만 손봐서 내 도메인에 맞추는 것. 다른 하나는 합성 데이터 — 없는 데이터를 만들어서 쓰는 것. 마지막에 배포까지 붙인다.

두 갈래 다 텍스트 시리즈에서 한 번씩 지나간 이야기라, 이번 편은 이미지 쪽에서 달라지는 부분에 무게를 둔다.

이미 다룬 글 그 글에서 이번 편에서
18편 프롬프트 엔지니어링 — 사람이 문장을 잘 쓰는 법 그 문장을 모델이 스스로 학습하게 만드는 법(프롬프트 튜닝)
20편 합성 데이터로 학습 데이터를 만든다, 환각이라는 한계 이미지 편집 데이터를 실제로 쌓아 올린 절차와 그때 생기는 사고

교육 자료는 대외비라 슬라이드 이미지나 예제 데이터는 싣지 않는다.


1. 왜 파인튜닝이 필요한가

파인튜닝은 이미 학습된 모델을 추가 학습으로 조금만 튜닝하는 것이다. 프롬프트로 시키는 것과 뭐가 다른가.

프롬프트로 시키기 파인튜닝
프롬프트에 넣을 수 있는 예제 수가 제한된다 훨씬 많은 예제로 학습할 수 있다
매번 긴 프롬프트를 같이 보낸다 프롬프트가 짧아져 토큰이 절약된다
응답 시간에 프롬프트 처리 시간이 포함된다 응답 지연(latency)이 줄어든다
결과 품질에 한계가 있다 같은 작업에서 더 좋은 품질이 나온다

한 줄로 정리하면, 프롬프트에 매번 설명하던 것을 모델 안에 넣어두는 일이다.

여기서 25편에서 했던 이야기가 그대로 다시 나온다. 학습률을 너무 낮게 잡으면 지역 최솟값(local minimum)에 갇혀 전역 최솟값(global minimum)까지 못 간다. 파인튜닝도 결국 학습이라 하이퍼파라미터 감각이 필요하다.

그런데 문제가 있다. 모델이 너무 커졌다.

  • AlexNet(2012) 6,000만 개
  • VGG-19(2014) 1억 4,400만 개
  • ViT-G/14(2021) 18억 개
  • ViT-MoE-15E(2021) 147억 개

23편에서 본 그 곡선의 연장선이다. 이 정도 크기를 통째로 파인튜닝하려면 개인은커녕 웬만한 회사도 감당이 안 된다. 그래서 일부만 학습하는 방법들이 나왔다.


2. PEFT — 전부 말고 일부만 학습한다

PEFT(Parameter-Efficient Fine-Tuning)는 파라미터 효율적 미세조정이다. 이름 그대로 적은 파라미터만 건드려서 적응시킨다.

적응 방법의 사다리

2-1. 프롬프트 디자인 — 학습 없이

모델이 원하는 수준의 결과를 내도록 입력 텍스트를 손보는 방법이다.

  • 장점 — 추가 학습 없이 사전학습된 모델의 성능을 끌어올릴 수 있다
  • 단점 — 사람이 직접 설계해야 하고, 향상 폭이 제한적이다

강의 예시가 딱 와닿았다. 강아지 사진을 생성해줘캐논 EOS1D로 찍은 듯한 강아지 사진을 생성해줘의 결과가 다르다. 모델은 그대로인데 문장 하나 바꿔서 결과가 달라진다.

18편에서 시스템 프롬프트, Chain-of-Thought, 예시 고르기까지 이 방법을 텍스트 기준으로 한참 팠었다. 이미지 생성에서도 똑같이 통하고, 한계도 똑같다. 사람이 계속 문장을 다듬어야 하고, 어느 선을 넘으면 더 안 좋아진다.

2-2. 프롬프트 튜닝 — 프롬프트를 학습시킨다

2021년에 나온 방법이다. 발상이 재밌다.

  1. 입력 앞에 가상 토큰(virtual token)을 몇 개 붙인다
  2. 역전파로 그 가상 토큰의 임베딩만 학습한다
  3. 나머지 모델은 전부 고정

장점이 셋이다.

  • 사람이 프롬프트를 설계할 필요가 없다 — 모델이 스스로 찾는다
  • 사전학습 모델을 고정할 수 있다 — 일반 파인튜닝에서 생기는 지식 손실이 없다
  • 적은 비용으로 새 데이터셋에 적응시킬 수 있다

단점 아닌 특징도 하나 있다. 학습된 프롬프트는 사람이 읽을 수 없다. 그냥 숫자 열이다. 무슨 말을 걸고 있는지 우리는 모른다.

2-3. 어댑터 — 층 사이에 작은 모듈을 끼운다

레이어마다 학습 가능한 작은 모듈(Adapter)을 삽입하고, 그 모듈만 학습하는 방법이다. 원래 모델 블록은 그대로 두고 옆에 작은 회로를 하나씩 붙이는 셈이다.

요즘 흔히 쓰는 LoRA도 이 계열이다. 원본 가중치는 건드리지 않고, 옆에 붙인 작은 행렬만 학습한다. 학습 결과물이 작아서 어댑터 파일만 갈아끼우면 다른 용도의 모델이 된다.

더 쉬운 비유로

프롬프트 디자인 — 주문할 때 말을 더 정확하게 한다. 프롬프트 튜닝 — 그 주문 문장을 가게가 알아서 최적화해 저장해둔다. 어댑터 — 주방은 그대로 두고 소스 하나를 추가로 만든다. 전체 파인튜닝 — 주방을 뜯어고친다.

25편의 LP(Linear Probing)와 FT(Fine-Tuning) 이야기가 여기서 훨씬 촘촘하게 나뉜 것이다. 그 사이에 선택지가 여러 개 생겼다.

얼마나 바꿀 것인가는 데이터 양과 GPU 예산으로 정해진다. 강할수록 좋은 게 아니다.


3. 개인화 — 모델에게 새 단어를 가르친다

적응 학습의 재밌는 응용이 개인화다. DreamBooth(2023)가 대표적이다.

내 강아지 사진을 생성하고 싶다고 해보자. 문제는 생성 모델이 “강아지”는 알아도 “내 강아지”는 모른다는 것이다.

DreamBooth 개인화 흐름

방법은 이렇다.

  1. 내 강아지 사진 3~5장과 일반 명칭(dog)을 준비한다
  2. 고유 식별자 토큰 [V]와 생성 모델을 함께 파인튜닝한다
  3. 이제 [V]는 내 강아지를 가리키는 새 단어가 된다

쓸 때는 문장에 그냥 섞으면 된다. [V] 강아지가 해변에 있는 사진, [V] 강아지가 알록달록한 카펫 위를 걷는 사진. 배경과 자세는 새로 만들어지는데 강아지의 생김새는 유지된다.

사진 서너 장으로 모델에 없던 대상을 심는다는 게 개인적으로 이번 강의에서 제일 신기했다. 데이터가 부족한 상황을 정면으로 뚫는 방법이기도 하다.


4. 합성 데이터 — 없으면 만들어 쓴다

두 번째 갈래다. 데이터 자체를 만들어내는 쪽.

20편에서 이걸 “거대 언어 모델의 응용”으로 한 번 정리했다. 결론은 모델이 만든 데이터로 다른 모델을 학습시킨다는 것이었고, 이번 편은 그 문장을 이미지 쪽에서 절차와 숫자로 확인하는 자리다.

4-1. 지식 증류 — 큰 모델이 선생님이 된다

Knowledge Distillation은 높은 성능의 무거운 모델(선생님)을 모방하도록 가벼운 모델(학생)을 학습시키는 방법이다.

  • 작은 모델만으로는 배우기 어려운 데이터 특징을, 크고 성능 좋은 모델의 도움을 받아 배운다
  • 선생님 모델이 예측한 soft-label(0~1 사이의 예측값)을 가짜 정답으로 쓴다
  • 학생 모델의 예측이 그 값에 가까워지도록 유도한다

여기서 soft-label이 핵심이다. 정답이 “개”라는 것만 알려주는 것보다, “개 0.7, 늑대 0.2, 고양이 0.05” 라고 알려주면 학생이 배울 게 더 많다. 어느 쪽으로 헷갈릴 만한지까지 배운다.

28편에서 본 sVLM들이 작으면서도 쓸 만한 이유 중 하나가 이것이다.

4-2. InstructPix2Pix — 데이터를 사다리처럼 쌓는다

이미지 편집 모델을 만들고 싶다고 하자. 필요한 학습 데이터는 [편집 지시, 편집 전 이미지, 편집 후 이미지] 쌍이다. 그런 데이터셋이 세상에 없다. 사람이 45만 건을 만들 수도 없다.

InstructPix2Pix(2023)가 이 문제를 푼 방식이 인상적이다.

합성 데이터를 만드는 순서와 위험

  1. 사람이 편집 지시를 약 700건만 직접 쓴다
  2. 그 700건으로 언어모델을 파인튜닝한다
  3. 파인튜닝된 모델로 지시문을 45만 건 이상 자동 생성한다
  4. 생성된 텍스트 쌍을 기반으로 편집 전후 이미지 쌍을 생성 모델로 만든다
  5. 이 합성 데이터셋으로 최종 이미지 편집 모델을 학습한다

사람 손이 700건에서 멈춘다. 나머지는 모델이 모델을 위해 만든다. 결과물은 해바라기를 장미로 바꿔줘, 하늘에 불꽃놀이를 추가해줘 같은 명령만으로 이미지를 고치는 모델이다. 입력·출력 이미지에 대한 상세 설명 없이 명령만으로 편집이 된다.

27편에서 본 LLaVA의 학습 데이터도 같은 계열이다. COCO의 캡션과 좌표를 ChatGPT에 넣어 대화·상세 설명·복잡한 추론 세 종류의 질의응답을 자동으로 뽑았다.

4-3. 합성 데이터의 다른 쓰임

  • 희귀 상황 데이터 — 사고 장면처럼 실제로 모으기 어렵거나 위험한 경우
  • 저작권·개인정보 회피 — 실제 인물이 없는 학습용 이미지
  • 데이터 부족 보완 — 소수 클래스만 골라 늘려서 편향을 줄인다

4-4. 그래서 공짜는 아니다

강의가 유의사항을 따로 한 장 잡아 짚었다. 이 부분이 실무에서 중요할 것 같아 그대로 옮겨둔다.

문제 무슨 일이 생기나 대응
라벨 품질 불일치 같은 물체인데 라벨 표현이 매번 달라진다. 기타 하나가 electric guitar, guitar player, acoustic instrument로 제각각 라벨 정규화, 클래스 사전 정의, 교차 모델 검증, 사람 검수
할루시네이션 실제로 없는 물체·특징·관계를 만들어낸다. 손가락 6개, 물리적으로 불가능한 그림자 정교한 프롬프트, 후처리 보정, 사실성 검증 모델, 실제 데이터 혼합

두 번째가 특히 무섭다. 잘못된 패턴이 섞인 합성 데이터로 학습하면 모델이 그 오류를 학습해서 강화한다. 그래서 실제 데이터를 섞어 쓰라는 처방이 붙는다.

20편에서 환각을 모델이 사용자에게 거짓말하는 문제로 다뤘다. 여기서는 같은 현상이 한 단계 앞으로 옮겨온다. 거짓말이 답변이 아니라 학습 데이터에 섞여 들어간다. 손가락 6개짜리 사진이 데이터셋에 남으면, 그걸로 학습한 다음 모델은 손가락 6개를 정상이라고 배운다. 답변의 환각은 그 자리에서 걸러낼 수 있지만, 데이터의 환각은 다음 모델까지 따라간다.

합성 데이터는 데이터 부족을 푸는 도구지, 데이터를 대체하는 물건이 아니다.


5. 도구를 쥐여주기 — 그리고 배포

강의 마지막은 응용과 실습이다.

툴 증강 언어모델

26편에서 “사고 능력과 언어 능력만으로는 현실을 이해하기에 부족하다”고 했었다. 여기에 한 가지가 더 붙는다. 상상(imagination), 그리고 도구다.

  • RAG (검색증강생성) — 언어모델에 검색을 붙인다. 추가 학습 없이 최신 정보를 반영하고, 출처를 통해 환각을 줄인다 (20편에서 환각 대응책으로 본 그것)
  • Visual Programming (2023) — 언어모델이 직접 답하는 대신 파이썬 프로그램을 생성하고, 그 프로그램이 시각 모듈들을 호출해 답을 만든다
  • Computer use / MCP — 텍스트를 넣으면 컴퓨터를 사람처럼 조작해 영업을 수행한다
  • Multi-Agent — 에이전트 여러 개를 묶어 연구·개발 과정을 자동화한다

Visual Programming이 흥미로운 게, 답을 모델이 직접 내지 않는다. “넥타이와 안경을 둘 다 쓴 사람이 있냐” 같은 질문을 받으면 물체 탐지 호출 → 개수 세기 → 논리 판정 순서의 프로그램을 짜서 실행한다. 답과 함께 어떻게 그 답이 나왔는지 코드가 남는다.

허깅페이스로 서빙하기

실습은 배포였다. 정리하면 이렇다.

방법 내용
Inference API (serverless) 모델 페이지에서 바로 API 호출. 프로토타이핑용. 모든 모델이 배포를 지원하지는 않는다
Inference Endpoints 프로덕션용 전용 엔드포인트
Gradio 몇 줄로 웹 인터페이스를 만들고 Spaces에 올려 데모 페이지를 배포
import gradio as gr

def caption(image, prompt):
    return model.generate(image, prompt)

gr.Interface(fn=caption,
             inputs=["image", "text"],
             outputs="text").launch()

이 코드가 그대로 웹 데모가 된다. 모바일 쪽은 MediaPipe나 MLC LLM으로 안드로이드 기기에서 직접 실행하는 방법도 소개됐다.

스위프 때 SpringBoot로 API 하나 띄우려고 설정 파일과 씨름했던 걸 생각하면, 이쪽은 모델을 붙이는 과정 자체가 이미 도구로 다 포장되어 있다. 남은 일은 무엇을 붙일지 고르는 것뿐이다.


두 시리즈를 이어붙이면

15~21편(텍스트)과 22~29편(이미지)을 나란히 놓으면, 같은 이야기가 두 번 반복된 것에 가깝다.

질문 텍스트 쪽 답 (15~21편) 이미지 쪽 답 (22~29편)
무엇으로 사전학습하나 웹 텍스트의 다음 토큰 예측 웹의 이미지-설명 쌍 대조 학습 (CLIP)
지시를 따르게 만들려면 지시 학습 + 선호 학습 (16편) 이미지·지시·답변 3종 세트로 지시 학습 (27편)
출력을 어떻게 조절하나 디코딩 온도·Top-K·Top-P (17편) 후보 문장 설계, 온도는 학습 대상 (26편)
내 문제에 맞추려면 프롬프트 엔지니어링 (18편) 프롬프트 튜닝·어댑터·개인화 (29편)
데이터가 없으면 합성 데이터로 생성 (20편) 합성 데이터 + 지식 증류 (29편)
무엇이 발목을 잡나 환각, 탈옥 (20편) 라벨 불일치, 데이터에 섞인 환각 (29편)

순서만 다를 뿐 부딪히는 벽이 똑같다. 데이터가 모자라고, 모델이 무겁고, 시키는 대로 안 한다. 두 시리즈가 각각 내놓은 해법도 결국 같은 자리를 가리킨다.


정리

  • 파인튜닝의 이득 — 예제를 더 많이 넣을 수 있고, 프롬프트가 짧아져 토큰과 지연 시간이 준다
  • 모델이 커지면서(147억 파라미터급) 전체 파인튜닝이 불가능해졌다 → PEFT
    • 프롬프트 디자인 : 학습 0회, 입력 문장만 손봄
    • 프롬프트 튜닝 : 가상 토큰의 임베딩만 학습, 모델은 동결 → 지식 손실 없음. 학습된 프롬프트는 사람이 못 읽는다
    • 어댑터 : 레이어마다 작은 모듈을 끼워 그것만 학습. LoRA가 이 계열
  • 개인화(DreamBooth) — 사진 3~5장 + 고유 식별자 [V]를 함께 파인튜닝. 문장에 [V]를 섞으면 내 대상이 등장한다
  • 지식 증류 — 큰 선생님 모델의 soft-label을 정답 삼아 작은 학생 모델을 학습. sVLM이 쓸 만한 이유 중 하나
  • InstructPix2Pix — 사람이 쓴 700건으로 언어모델을 파인튜닝하고, 거기서 45만 건을 자동 생성해 편집 모델을 학습. 사람 손은 초반에만 들어간다
  • 합성 데이터의 대가라벨 불일치(같은 물체, 다른 이름)와 할루시네이션(없는 물체·불가능한 구조). 실데이터를 섞는 게 기본 처방
  • 툴 증강 — RAG, Visual Programming(코드를 생성해 시각 모듈 호출), Computer use, Multi-Agent
  • 배포 — 허깅페이스 Inference API/Endpoints, Gradio로 데모 페이지. 모바일은 MediaPipe·MLC LLM
  • 겹치는 글 — 프롬프트 설계는 18편, 합성 데이터와 환각은 20편. 이 글은 그 둘을 이미지 데이터 제작으로 옮겨온 것

참고 자료

한줄 평

  • 네 편에 걸친 강의의 결론이 결국 “남이 만든 걸 얼마나 영리하게 빌려 쓰느냐” 였다는 게 재밌었다. 데이터가 없으면 만들어 쓰고, 그 만든 데이터의 위험까지 같이 알려준 게 이번 편에서 제일 실무적인 부분이었다!