HermesFlow: 멀티모달 모델의 이해와 생성 성능 차이를 줄이는 방법
이 글에서는 HermesFlow라는 새로운 프레임워크를 통해, 멀티모달 모델(MLLM)에서 자주 발생하는 “이해 능력과 생성 능력 간의 격차” 문제를 어떻게 해결할 수 있는지 자세히 살펴보겠습니다. 최근의 인공지능은 텍스트, 이미지, 영상 등 다양한 형태의 데이터를 동시에 처리할 수 있는 멀티모달 기술로 발전하고 있지만, 여전히 이해와 생성 사이에 미묘한 차이가 존재합니다. 특히 이미지 설명(캡셔닝)에는 뛰어난 모델이, 실제 이미지를 생성하는 작업에만 들어가면 기대보다 낮은 성능을 보이기도 하죠. 💡
본 포스팅에서는 HermesFlow라는 기법이 어떻게 이 격차를 줄이고, 이해와 생성 능력을 동시에 끌어올리는지 구체적인 방법과 예시를 함께 공유해 드리겠습니다. 🚀
1. 멀티모달 이해와 생성의 불균형
멀티모달 대형 언어 모델(MLLM)은 크게 이미지 이해(ex: 이미지를 보고 그 내용을 설명하거나 질문에 답하기)와 이미지 생성(ex: 텍스트 프롬프트로부터 이미지를 직접 만들어내기)라는 두 가지 중요한 영역을 다룹니다. 그러나 실제로 많은 연구에서 “이미지를 이해하는 능력”은 이미 상용 단계에 가깝게 발전한 반면, “이미지를 생성하는 능력”은 여전히 상당히 제한적인 경우가 많습니다. 예를 들어, 어떤 모델이 ‘파란 가방을 맨 노란 고양이’를 이해해 설명할 수 있지만, 막상 같은 장면을 생성하는 데는 어려움을 겪는 식이죠.
이는 여러 이유가 있습니다. 하나는 이미지 생성에 필요한 데이터셋과 모델 구조가 더 복잡하다는 점입니다. 또 다른 이유로는, 이해는 정답이 어느 정도 ‘수렴’되는 반면, 생성은 ‘무궁무진한 경우의 수’가 존재하기에 모델이 어디에 초점을 맞춰야 할지 더욱 까다롭습니다. 이 차이를 줄이기 위해서는 이해와 생성 두 가지를 동시에 강화해 주는 방법이 필요합니다. 그리고 바로 그 문제를 해결하기 위해 개발된 것이 HermesFlow입니다.
2. HermesFlow란 무엇인가?
HermesFlow는 멀티모달 모델에서 발생하는 이해 능력과 생성 능력의 간극을 효율적으로 줄이기 위해 고안된, 매우 직관적이면서도 강력한 프레임워크입니다. 간단히 말해, 이미지와 텍스트가 동시에 주어졌을 때 모델이 이를 해석(이해)만 잘하는 것이 아니라, 직접 이미지를 생성하는(생성) 과제에도 탁월한 성능을 보이도록 양쪽 모두를 개선하는 방식을 채택합니다.
이 과정에서 중요한 것은 Pair-DPO(Direct Preference Optimization)라는 기법입니다. Pair-DPO는 “한 쌍의 데이터를 통해 선호도가 높은 출력을 직접 최적화한다”는 아이디어인데, 단순히 한 영역(이해 또는 생성)에만 집중하는 것이 아니라, 동일한 데이터에 대한 이해 태스크와 생성 태스크를 모두 평가해 최적화한다는 점이 핵심입니다.
🤔 왜 Pair-DPO인가?
일반적인 DPO는 특정 태스크(예: 이미지 설명)에 대해 선호되는 출력(Win)과 선호되지 않는 출력(Lose)을 구분하여 모델을 학습시키는 과정입니다. 하지만 HermesFlow의 Pair-DPO는 하나의 이미지-텍스트 쌍에서 이해(캡션 생성)와 생성(이미지 직접 만들기) 두 가지 영역에서 선호되는 결과를 동시에 수집하고, 이를 모두 학습에 반영합니다. 그 결과, 모델이 학습하면서 자연스럽게 이해와 생성 모두에서 더 나은 결과를 만들어낼 수 있습니다.
3. 작동 방식: 이해 데이터와 생성 데이터의 동시 학습
그렇다면 어떻게 이해와 생성 데이터를 동시에 수집하고 학습할 수 있을까요? 크게 세 단계로 나누어 보면 다음과 같습니다:
- 이해 데이터 수집: 이미지를 보고 모델이 캡션을 여러 개 생성하고, 그중 가장 ‘원본 캡션’과 유사도가 높은(혹은 사람이 판단해 더 자연스럽고 정확한) 것을 Win, 가장 떨어지는 것을 Lose로 선택
- 생성 데이터 수집: 텍스트 프롬프트(예: “오렌지색 고양이”)를 모델에 주어 이미지를 여러 장 생성하고, 각 이미지가 질문에 얼마나 잘 답할 수 있는지(자체 평가 또는 외부 평가로) 점수를 매겨 Win과 Lose를 선택
- Pair-DPO 학습: 이렇게 구해진 Win-Lose 쌍 데이터를 바탕으로, 모델이 Win 쪽 확률을 높이고 Lose 쪽 확률은 낮추도록(직접 선호 최적화) 학습을 진행
이 과정을 여러 번 반복(Self-Play Iterative Optimization)해 나가면서, 모델은 단계적으로 이해와 생성 능력을 동시에 끌어올립니다. 한 번 학습이 끝났다고 해서 끝나는 것이 아니라, 새롭게 업데이트된 모델이 또 다른 우수한 Win 출력을 찾아내도록 반복하며 점차 성능 향상이 이루어집니다.
🦊 예시: “장미를 든 갈색 여우”
하나의 이미지에 대해 모델이 여러 캡션을 생성했다고 가정해봅시다. 아래는 매우 간단한 예시입니다:
# 이해 데이터 수집 예시 (캡션)
# 이미지: 갈색 털의 여우가 장미를 물고 있는 사진
# 모델이 생성한 캡션 후보 예시
candidate_captions = [
"갈색 여우가 작은 빨간 장미를 물고 있다.",
"장미를 든 노란 강아지가 웃고 있다.",
"여우가 초록 풀밭에서 무언가를 물고 있는 모습."
]
# 가장 원본 이미지에 근접하거나 사람이 선호하는 캡션을 Win으로 선택
# 나머지 비슷하거나 덜 정확한 것을 Lose로 분류
# 이해 쪽 Win-Lose 쌍을 데이터로 확보
# 동일 이미지에 대해 텍스트 프롬프트: "갈색 여우가 장미를 든 장면" => 모델이 이미지를 생성
# 그 생성된 이미지를 다시 질문-응답 방식으로 평가해 Win-Lose 선정
# ... 그리고 이 Win-Lose 데이터를 Pair-DPO로 학습
이처럼 하나의 이미지가 동시에 ‘이해 학습’과 ‘생성 학습’에 활용되는 것이 HermesFlow가 가진 가장 큰 특징 중 하나입니다.
4. 실제 적용 시 이점과 성능
HermesFlow를 적용했을 때 기대할 수 있는 장점들은 다음과 같습니다:
- 이해와 생성 능력의 동반 향상: 기존에는 이해 태스크에 맞춘 데이터 혹은 생성 태스크에 맞춘 데이터만 학습시키면 양쪽 중 한쪽만 크게 개선되는 경향이 있었지만, HermesFlow는 서로 보완 효과를 일으켜 동반 상승을 노립니다.
- 데이터 확장성: 같은 이미지와 텍스트 한 쌍에서 이해와 생성에 대한 데이터를 모두 추출하므로, 추가 데이터가 필요 없는 효율적인 수집 과정이 가능합니다.
- 반복 학습을 통한 지속적 개선: Self-play 방식을 통해, 모델이 스스로 더 나은 Win 출력을 탐색하게 되면서 점점 더 높은 수준의 모델이 됩니다.
- 응용 범위 확대: 이해와 생성 두 분야 모두에 능통한 모델은 챗봇, 게임, 예술 분야 등 다양한 응용 시나리오에서 더 높은 활용 가치를 지닙니다.
실제로 여러 벤치마크(예: VQAv2, Flickr30k 등)에서 HermesFlow를 통해 학습된 모델은 더 정확한 이미지 이해 점수를 기록했으며, 이미지 생성 품질 평가 지표(FID, CLIP-Score 등)에서도 유의미하게 향상된 모습을 보였습니다.
5. Python 예시 코드
실제로 HermesFlow 방식을 이용해 모델을 업데이트하고 싶은 분들을 위해 간단한 파이썬 예시 코드를 준비했습니다. 물론 실제 구현은 더 복잡하지만, 개념적 접근을 이해하는 데 도움이 될 것입니다.
import random
# Pseudocode 형식
# 이미지-텍스트 쌍 데이터 (x, y)를 가정
# x: 이미지, y: 해당 이미지 설명 또는 프롬프트
class HermesFlowModel:
def __init__(self, base_model):
self.model = base_model # 기존 멀티모달 모델
def generate_caption(self, image):
# 이미지 캡셔닝 함수 (이해 태스크)
# 여기서는 가짜로 몇 개의 후보를 생성한다고 가정
captions = [
"캡션 A", "캡션 B", "캡션 C"
]
return captions
def generate_image(self, prompt):
# 텍스트에서 이미지를 생성하는 함수
# 여기서는 가짜로 "이미지" 객체 리스트를 생성한다고 가정
images = [f"생성이미지_{i}" for i in range(3)]
return images
def score_understanding(self, caption, reference):
# 실제로는 BERT similarity 등 사용
# 단순히 랜덤 스코어 가정
return random.random()
def score_generation(self, image, questions):
# 이미지에 대해 질문을 던지고 답변의 정확도를 측정
# 여기서는 랜덤 스코어 사용
return random.random()
def pair_dpo_update(self, win_sample, lose_sample):
# DPO 업데이트 로직
# win 쪽 확률을 높이고 lose 쪽 확률은 낮추도록 모델 파라미터 업데이트
pass
def train_hermesflow(self, dataset, iterations=2):
for i in range(iterations):
print(f"Iteration {i+1}...")
for (image, reference_prompt) in dataset:
# 이해 데이터 수집
candidate_captions = self.generate_caption(image)
# 가장 점수가 높은 캡션을 win, 낮은 것을 lose
scored_captions = [(c, self.score_understanding(c, reference_prompt)) for c in candidate_captions]
win_caption = max(scored_captions, key=lambda x: x[1])[0]
lose_caption = min(scored_captions, key=lambda x: x[1])[0]
# 생성 데이터 수집
candidate_images = self.generate_image(reference_prompt)
# 간단히 질문이 있다고 가정
questions = ["이 이미지는 고양이가 있나요?", "장미는 어디에 있나요?"]
scored_images = [(img, self.score_generation(img, questions)) for img in candidate_images]
win_image = max(scored_images, key=lambda x: x[1])[0]
lose_image = min(scored_images, key=lambda x: x[1])[0]
# Pair-DPO 업데이트
self.pair_dpo_update(win_caption, lose_caption)
self.pair_dpo_update(win_image, lose_image)
print("Training Complete!")
# 사용 예시
model = HermesFlowModel(base_model="MyMultimodalBase")
dummy_dataset = [
("이미지1", "갈색 여우가 장미를 든 장면"),
("이미지2", "파란 가방을 맨 고양이")
]
model.train_hermesflow(dummy_dataset, iterations=3)
위 예시는 매우 단순화된 버전입니다. 실제로는 BERT 기반 유사도 평가나 VQA(Visual Question Answering) 스코어링, 그리고 멀티모달 Transformer 구조 등이 적용될 수 있습니다. 그러나 큰 흐름은 위와 같습니다.
6. 마무리 및 앞으로의 전망
지금까지 HermesFlow가 멀티모달 모델에서 이해와 생성 능력 사이의 격차를 어떻게 줄이는지, 그리고 Pair-DPO라는 개념을 어떻게 활용하는지 살펴봤습니다. 이 방법은 서로 다른 두 태스크를 같은 데이터 소스에서 동시 학습함으로써, 서로가 서로를 보완하며 성장할 수 있는 가능성을 보여주고 있습니다. 🤝
특히 실제 연구 결과에 따르면 HermesFlow는 여러 벤치마크에서 의미 있는 성능 향상을 이끌어냈고, 앞으로도 더 많은 분야(예: 영상 생성, 3D 모델링 등)로 확장될 수 있을 전망입니다. 만약 여러분이 이미지를 보고 이해하는 모델은 이미 충분히 잘 되는데, 직접 이미지를 생성하는 모델은 아직 부족하다고 느끼신다면, 이번 기회에 HermesFlow와 같은 통합 접근법을 고려해 보시는 것도 좋을 것 같습니다.