멀티모달 학습의 표현 정렬과 융합 모델 설계

CLIP, Cross-Modal Attention, Tensor Fusion을 중심으로 멀티모달 표현 학습의 구조, 서빙 경로, 운영 트레이드오프를 정리한다.

2026-08-14 · 최초 발행 2025-10-14

서로 다른 입력을 같은 의미 공간에 놓는 방법

멀티모달 학습은 텍스트, 이미지, 오디오, 비디오처럼 성격이 다른 입력에서 특징을 뽑아 공통 표현 또는 모달 간 조건부 표현을 학습하는 방법론이다. 표현 정렬(alignment), 상호보완 정보의 결합(fusion), 제로샷·소샷 추론이 주요 목표가 된다.

CLIP(Contrastive Language-Image Pretraining)은 대규모 텍스트-이미지 쌍으로 두 인코더를 함께 학습하고, 대조학습(contrastive loss)을 통해 공통 임베딩 공간을 만든다. 제로샷 분류와 검색에 강점이 있으며, 서빙에서는 임베딩 캐시를 바탕으로 확장하기 쉽다.

Cross-Modal Attention은 한 모달리티의 토큰이 다른 모달리티의 토큰을 Query, Key, Value로 참조하도록 구성한다. 주로 Transformer 구조에서 쓰이며, 모달 간 의존성과 위치 정보를 더 정교하게 다룰 수 있다.

Tensor Fusion은 모달별 특징의 텐서 외적(outer product)이나 저랭크 인자분해를 이용해 고차 상호작용을 명시적으로 모델링한다. 표현력은 풍부하지만 파라미터와 연산량이 늘어나므로 저랭크화나 압축 기법을 함께 고려해야 한다.

데이터 정렬에서 서빙 경로까지

입력 데이터는 샘플 수준에서 페어링하거나, 비디오 자막과 오디오 타임스탬프처럼 시계열 기준으로 동기화해야 한다. 모달리티가 빠진 입력은 masking·gating으로 다루고, 노이즈 라벨에는 RLA 정제 절차가 필요하다.

표현을 학습하는 방식은 크게 두 갈래다. CLIP 계열처럼 대조학습으로 모달 간 코사인 근접성을 높이는 정렬 중심 방식이 있고, Cross-Modal Attention이나 Tensor Fusion으로 상호작용 자체를 모델링하는 융합 중심 방식이 있다. 손실 함수는 InfoNCE, 매칭·순위 손실, 과업별 CE·Triplet, 멀티태스크 가중 합을 조합할 수 있다. 온도 파라미터, 라벨 스무딩, 하드 네거티브 샘플링은 학습 안정성에 사용된다.

서빙에서는 듀얼 인코더와 융합 인코더가 서로 다른 선택지를 만든다. 듀얼 인코더는 임베딩 캐시와 최근접 검색(ANN)을 통해 대규모 요청에 대응한다. 융합 인코더는 입력 쌍을 동시에 처리해 성능을 높일 수 있지만, 지연과 비용은 커진다.

YesNo입력: 이미지, 텍스트, 오디오이미지 인코더 (CNN/ViT)텍스트 인코더 (Transformer)오디오 인코더(CNN/Conformer)정규화/프로젝션정규화/프로젝션정규화/프로젝션공통 임베딩 공간대조학습(InfoNCE)Cross-Modal Attention 블록융합 표현저랭크 Tensor Fusion고차 상호작용 표현누락 모달?마스킹/게이팅, 대치 임베딩표준 경로제로샷 분류/검색VQA/멀티모달 추론추천/속성 추론

정렬 모델과 융합 모델이 만드는 선택지

방법 성능(정확도/표현력) 확장성(서빙/메모리) 일관성(다양 데이터) 안정성(학습/수렴) 운영 편의(배포/업데이트)
CLIP(대조학습 듀얼 인코더) 중~높음, 제로샷 강점 매우 높음, 임베딩 캐시/ANN 높음, 도메인 전이 강함 높음, 대규모 데이터 유리 매우 높음, 독립 인코더 교체 용이
Cross-Modal Attention(융합) 높음, 정교한 상호작용 중간, 온라인 융합 필요 중~높음, 정렬 품질 의존 중간, 하이퍼 민감 중간, 엔드투엔드 동시 업데이트
Tensor Fusion(고차 상호작용) 매우 높음(충분 데이터 시) 낮음, 파라미터 증가 중간, 과적합 위험 중~낮음, 정규화 필수 낮음, 최적화·압축 필요

특정 벤치마크, 모델 규모, 데이터 품질에 따라 결과는 달라진다. 최신 지표는 최신 정보 확인이 필요하다.

검색·모더레이션·분석 과업에서의 적용

전자상거래 검색과 추천에서는 이미지로 텍스트 상품을 찾거나 텍스트와 이미지를 함께 포함한 질의를 처리할 수 있다. 카탈로그 이미지와 텍스트 임베딩을 미리 생성하고 ANN 인덱스를 구축한 뒤, 질의 임베딩으로 Top-K 후보를 찾고 Cross-Modal 재랭킹을 적용하는 흐름이다.

콘텐츠 모더레이션과 브랜드 세이프티에서는 이미지와 오버레이 텍스트를 함께 분석해 규정 위반을 탐지한다. CLIP 제로샷의 민첩성과 규정 고도화 시 융합 모델이 제공하는 정밀도 사이의 선택이 생긴다.

의료 영상과 리포트 텍스트를 연결하면 영상 특징과 보고서의 정렬을 통해 보조 진단 및 리포트 생성 품질을 높일 수 있다. 이 경우 비식별화, 온프렘 추론, 감사 로그가 필수다.

콜센터 QA와 품질 분석은 음성(ASR), 텍스트, 스크린샷을 결합하는 사례다. Cross-Modal Attention은 문맥과 화면 요소의 결속을 강화하며, 음성이 누락된 경우에는 텍스트를 우선하고 가중 게이팅을 적용할 수 있다.

기대할 수 있는 변화와 전제

이미지-텍스트 검색의 mAP/Recall@K는 유니모달 대비 +1025%p 개선이 일반 보고된다. 이는 벤치마크 기준이며 과제와 데이터에 따라 달라지고, 최신 정보 확인이 필요하다. 제로샷 분류는 신제품이나 롱테일 카테고리 도입에서 라벨링 코스트를 3060% 절감할 수 있다.

듀얼 인코더에 캐시와 ANN을 적용하면 p95 지연을 줄이고 스루풋을 3~10배 높인 사례가 다수 있다. 사용자 의도 이해와 설명 가능성, 크로스 채널 일관성도 함께 개선될 수 있으며, 도메인 전이와 신규 카테고리·언어 확장에도 유연성을 제공한다.

학습 품질과 운영 비용을 함께 다루기

학습 데이터에서는 동일 카테고리나 시각적으로 가까운 대상을 하드 네거티브로 수집하고, 캡션을 정제한다. 약라벨이나 웹스케일 데이터를 쓸 때는 노이즈 로버스트 손실과 샘플 가중치를 적용한다.

CLIP에서는 온도 파라미터 학습, 대규모 분산 배치를 통한 네거티브 풀 확장, fp16+Grad Checkpoint 기반 메모리 절감을 적용할 수 있다. Cross-Modal Attention은 프롬프트와 토큰 정렬, 레이어별 게이팅, 초기 듀얼 인코더 가중치 기반 워밍업이 대상이다. Tensor Fusion은 MLB/MFB/Mutan 저랭크 분해와 드롭아웃, Weight Decay 정규화를 함께 사용한다.

듀얼 인코더 경로는 오프라인 임베딩 파이프라인과 HNSW/ScaNN/FAISS 인덱스 샤딩, 캐시 일관성 정책이 필요하다. 융합 인코더는 배치 추론, 모달 누락 마스킹, 동적 라우팅을 고려한다. 간단한 질의에는 CLIP을, 복잡한 질의에는 융합 모델을 배치하는 방식이다. 피처 드리프트 탐지, ANN 재인덱싱 스케줄링, 슬로우쿼리와 미스랭크 샘플 수집도 관측성 체계에 포함된다.

이미지와 음성의 PII는 마스킹하고, 벡터 스토어는 암호화하며, 접근 통제와 감사를 적용한다. 데이터 라이선스와 사용 제한을 준수하고 민감 도메인에는 온프렘 배치를 권장한다.

CLIP 파인튜닝과 융합 블록 예시

전제조건: Python 3.10+, PyTorch 2.3+, CUDA 가능, open_clip_torch 설치

# pip install open_clip_torch torch torchvision
import torch, open_clip
from torch.utils.data import DataLoader

device = "cuda" if torch.cuda.is_available() else "cpu"
model, _, preprocess = open_clip.create_model_and_transforms("ViT-B-32", pretrained="laion2b_s34b_b79k")
tokenizer = open_clip.get_tokenizer("ViT-B-32")
model = model.to(device)
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5, weight_decay=0.01)

class PairDataset(torch.utils.data.Dataset):
    def __init__(self, pairs):  # pairs: list of (PIL.Image, str)
        self.pairs = pairs
    def __len__(self): return len(self.pairs)
    def __getitem__(self, i):
        img, txt = self.pairs[i]
        return preprocess(img), tokenizer([txt])[0]

# dummy
dataset = PairDataset([])
loader = DataLoader(dataset, batch_size=128, shuffle=True, num_workers=4)

model.train()
for images, text_tokens in loader:
    images = images.to(device)
    text_tokens = text_tokens.to(device)
    optimizer.zero_grad()
    image_features = model.encode_image(images)
    text_features = model.encode_text(text_tokens)
    image_features = image_features / image_features.norm(dim=-1, keepdim=True)
    text_features  = text_features  / text_features.norm(dim=-1, keepdim=True)
    logit_scale = model.logit_scale.exp()
    logits_per_image = logit_scale * image_features @ text_features.t()
    logits_per_text  = logits_per_image.t()
    labels = torch.arange(len(images), device=device)
    loss = (torch.nn.functional.cross_entropy(logits_per_image, labels)
           +torch.nn.functional.cross_entropy(logits_per_text, labels)) / 2
    loss.backward()
    optimizer.step()

텍스트를 Query로, 이미지 특징을 Key와 Value로 쓰는 Cross-Modal Attention 블록은 다음과 같다.

import torch, torch.nn as nn

class CrossModalAttention(nn.Module):
    def __init__(self, d_model=512, nhead=8):
        super().__init__()
        self.attn = nn.MultiheadAttention(d_model, nhead, batch_first=True)
        self.ln = nn.LayerNorm(d_model)
        self.ffn = nn.Sequential(nn.Linear(d_model, 4*d_model), nn.GELU(), nn.Linear(4*d_model, d_model))

    def forward(self, txt, img, img_mask=None):
        # txt: (B, Lt, D), img: (B, Li, D)
        x, _ = self.attn(query=txt, key=img, value=img, key_padding_mask=img_mask)
        x = self.ln(x + txt)
        x = self.ln(self.ffn(x) + x)
        return x  # 융합된 텍스트 표현

고차 상호작용을 저랭크로 근사하는 MLB 유사 Tensor Fusion 예시다.

class LowRankTensorFusion(nn.Module):
    def __init__(self, d_img=768, d_txt=512, d_out=1024, rank=1600):
        super().__init__()
        self.proj_img = nn.Linear(d_img, rank)
        self.proj_txt = nn.Linear(d_txt, rank)
        self.fc = nn.Linear(rank, d_out)

    def forward(self, img_feat, txt_feat):
        # (B, Di), (B, Dt)
        v = torch.tanh(self.proj_img(img_feat))
        q = torch.tanh(self.proj_txt(txt_feat))
        fused = v * q  # Hadamard (저랭크 근사)
        return self.fc(fused)

듀얼 인코더에서 재랭킹으로 확장하기

초기에는 유니모달 모델과 CLIP 제로샷·파인튜닝을 비교하고 mAP, Recall@K, p95 지연을 핵심 KPI로 잡는다. 이후 배치 임베딩 생성, FAISS/HNSW 인덱스, A/B 테스트를 갖춘 듀얼 인코더 서빙을 구성하고 하드 네거티브 마이닝 루프를 운영한다.

다음 단계에서는 Top-K 후보에 Cross-Modal Attention 재랭킹을 적용하고, 복잡 질의 트래픽에만 이 경로를 사용한다. 도메인 특화가 더 필요할 때 Tensor Fusion이나 저랭크 모듈을 더하고, distillation으로 경량 서빙 모델을 양산한다.

대규모 확장성과 제로샷 성능은 CLIP 기반 정렬에서 확보하고, 복잡한 과업의 상호작용 정밀도는 Cross-Modal Attention과 Tensor Fusion으로 보완한다. 대부분의 요청은 듀얼 인코더로 처리하고 일부에 융합 재랭킹을 적용하는 하이브리드 구성은 데이터 품질, 하드 네거티브, 관측성 체계와 함께 운영할 수 있다.

멀티모달 학습CLIPCross-Modal AttentionTensor Fusion대조학습