ColPali 스타일 모델을 실험하는 동안, 우리 엔지니어 중 한 명이 최근 출시된 jina-clip-v2 모델을 사용하여 시각화를 만들었습니다. 그는 주어진 이미지-텍스트 쌍에 대해 토큰 임베딩과 패치 임베딩 간의 유사도를 매핑하여 흥미로운 시각적 통찰을 제공하는 히트맵 오버레이를 만들었습니다.


안타깝게도, 이것은 단순한 휴리스틱 시각화일 뿐입니다 - 명시적이거나 보장된 메커니즘이 아닙니다. CLIP과 같은 전역 대조 정렬이 패치와 토큰 사이에 대략적인 지역 정렬을 우연히 만들 수는 있지만, 이는 모델의 의도된 목표가 아닌 의도하지 않은 부작용입니다. 그 이유를 설명하겠습니다.
tag코드 이해하기

코드가 하는 일을 개략적으로 살펴보겠습니다. jina-clip-v2는 기본적으로 토큰 레벨이나 패치 레벨 임베딩에 접근하는 API를 제공하지 않는다는 점에 주의하세요 - 이 시각화는 사후 패치 작업이 필요했습니다.
단어 레벨 임베딩 계산
model.text_model.output_tokens = True를 설정하면, text_model(x=...,)[1]를 호출했을 때 토큰 임베딩에 대한 (batch_size, seq_len, embed_dim) 두 번째 요소를 반환합니다. 입력 문장을 받아 Jina CLIP 토크나이저로 토큰화한 다음, 해당하는 토큰 임베딩을 평균내어 서브워드 토큰을 다시 "단어"로 그룹화합니다. 토큰 문자열이 _ 문자로 시작하는지 확인하여(SentencePiece 기반 토크나이저의 전형적인 특징) 새로운 단어의 시작을 감지합니다. 단어 레벨 임베딩 리스트와 단어 리스트를 생성합니다("Dog"가 하나의 임베딩, "and"가 하나의 임베딩 등).
패치 레벨 임베딩 계산
이미지 타워의 경우, vision_model(..., return_all_features=True)는 (batch_size, n_patches+1, embed_dim)을 반환하며, 여기서 첫 번째 토큰은 [CLS] 토큰입니다. 여기서 코드는 각 패치에 대한 임베딩(즉, 비전 트랜스포머의 패치 토큰)을 추출합니다. 그런 다음 이러한 패치 임베딩을 2D 그리드인 patch_side × patch_side로 재구성하고, 이를 원본 이미지 해상도에 맞게 업샘플링합니다.
단어-패치 유사도 시각화
유사도 계산과 후속 히트맵 생성은 표준적인 "사후" 해석 기법입니다: 텍스트 임베딩을 선택하고, 모든 패치 임베딩과의 코사인 유사도를 계산한 다음, 특정 토큰 임베딩과 가장 유사도가 높은 패치를 보여주는 히트맵을 생성합니다. 마지막으로 문장의 각 토큰을 순환하면서 왼쪽에서 해당 토큰을 굵게 강조하고, 오른쪽의 원본 이미지 위에 유사도 기반 히트맵을 오버레이합니다. 모든 프레임이 애니메이션 GIF로 컴파일됩니다.
tag의미 있는 설명 가능성일까요?
순수한 코드 관점에서는, 네, 로직이 일관적이며 각 토큰에 대한 히트맵을 생성할 것입니다. 패치 유사도를 강조하는 일련의 프레임을 얻게 되므로, 스크립트는 "의도한 대로 작동"합니다.


위의 예시를 보면, moon과 branches와 같은 단어들이 원본 이미지에서 해당하는 시각적 패치와 잘 정렬되는 것처럼 보입니다. 하지만 핵심 질문은 이것입니다: 이것이 의미 있는 정렬일까요, 아니면 우연한 일치일까요?
이는 더 깊은 질문입니다. 주의사항을 이해하기 위해 CLIP이 어떻게 훈련되는지 상기해보겠습니다:
- CLIP은 전체 이미지와 전체 텍스트 사이에 전역 대조 정렬을 사용합니다. 훈련 중에 이미지 인코더는 단일 벡터(풀링된 표현)를 생성하고, 텍스트 인코더는 또 다른 단일 벡터를 생성합니다. CLIP은 매칭되는 텍스트-이미지 쌍에 대해서는 이들이 일치하고, 그렇지 않은 경우에는 불일치하도록 훈련됩니다.
- '패치 X가 토큰 Y에 해당한다'는 수준의 명시적인 지도가 없습니다. 모델은 "이미지의 이 영역이 개이고, 저 영역이 고양이다" 등을 직접 강조하도록 훈련되지 않습니다. 대신, 전체 이미지 표현이 전체 텍스트 표현과 일치하도록 훈련됩니다.
- CLIP의 아키텍처는 이미지 측에서는 Vision Transformer를, 텍스트 측에서는 텍스트 트랜스포머를 사용하여 별도의 인코더를 형성하기 때문에, 패치를 토큰에 자연스럽게 정렬하는 교차 어텐션 모듈이 없습니다. 대신, 각 타워에서 순수하게 셀프 어텐션만 있고, 전역 이미지나 텍스트 임베딩을 위한 최종 프로젝션이 있을 뿐입니다.
요약하면, 이는 휴리스틱 시각화입니다. 특정 패치 임베딩이 특정 토큰 임베딩과 가깝거나 멀다는 것은 어느 정도 자연스럽게 나타나는 현상입니다. 이는 모델의 강력하거나 공식적인 "어텐션"이라기보다는 사후 해석 트릭에 가깝습니다.
tag왜 지역 정렬이 나타날까요?
그렇다면 왜 때때로 단어-패치 레벨의 지역 정렬이 관찰될까요? 여기에 핵심이 있습니다: CLIP이 전역 이미지-텍스트 대조 목표로 훈련되더라도, 여전히 셀프 어텐션(ViT 기반 이미지 인코더에서)과 트랜스포머 층(텍스트용)을 사용합니다. 이러한 셀프 어텐션 층 내에서, 이미지 표현의 다른 부분들이 서로 상호작용할 수 있으며, 이는 텍스트 표현에서도 단어들이 그러한 것과 같습니다. 대규모 이미지-텍스트 데이터셋으로 훈련하면서, 모델은 자연스럽게 전체 이미지를 해당하는 텍스트 설명과 매칭하는 데 도움이 되는 내부 잠재 구조를 발달시킵니다.



이러한 잠재 표현에서 지역 정렬이 나타날 수 있는 이유는 최소한 두 가지입니다:
- 공동 발생 패턴: 모델이 "개" 옆에 있는 많은 "고양이" 이미지를 보고 (흔히 이러한 단어로 레이블이나 설명이 붙은), 이러한 개념에 대략적으로 해당하는 잠재 특징을 학습할 수 있습니다. 따라서 "개"에 대한 임베딩이 개와 비슷한 형태나 텍스처를 묘사하는 지역 패치와 가까워질 수 있습니다. 이는 패치 레벨에서 명시적으로 지도되지 않았지만, 개 이미지/텍스트 쌍 사이의 반복된 연관성에서 나타납니다.
- Self-attention: Vision Transformers에서 패치들은 서로 상호 작용합니다. 모델이 전체 장면의 정확한 단일 표현을 생성하려고 하기 때문에, 특징적인 패치들(개의 얼굴과 같은)은 일관된 잠재 "서명"을 갖게 될 수 있습니다. 이것이 전체 대비 손실을 최소화하는 데 도움이 된다면 강화될 것입니다.
tag이론적 분석
CLIP의 대조 학습 목표는 일치하는 이미지-텍스트 쌍 간의 코사인 유사도를 최대화하고 일치하지 않는 쌍에 대해서는 최소화하는 것입니다. 텍스트와 이미지 인코더가 각각 토큰과 패치 임베딩을 생성한다고 가정합니다:
전역 유사도는 지역 유사도들의 집계로 표현될 수 있습니다:
특정 토큰-패치 쌍이 훈련 데이터에서 자주 동시 발생할 때, 모델은 누적 그래디언트 업데이트를 통해 이들의 유사성을 강화합니다:
, 여기서 는 동시 발생 횟수입니다. 이는 가 크게 증가하게 되어 이러한 쌍들의 더 강한 지역적 정렬을 촉진합니다. 하지만, 대조 손실은 모든 토큰-패치 쌍에 걸쳐 그래디언트 업데이트를 분산시켜, 특정 쌍에 대한 업데이트의 강도를 제한합니다:
이는 개별 토큰-패치 유사도의 상당한 강화를 방지합니다.
tag결론
CLIP의 토큰-패치 시각화는 텍스트와 이미지 표현 사이의 우연한, 창발적 정렬을 활용합니다. 이 정렬은 흥미롭지만 CLIP의 전역 대조 학습에서 비롯되며 정확하고 신뢰할 수 있는 설명 가능성에 필요한 구조적 견고성이 부족합니다. 결과적으로 시각화는 종종 노이즈와 비일관성을 보이며, 이는 심층적인 해석 응용에 대한 유용성을 제한합니다.

ColBERT와 ColPali와 같은 후기 상호작용 모델들은 텍스트 토큰과 이미지 패치 사이의 명시적이고 세밀한 정렬을 구조적으로 임베딩함으로써 이러한 한계를 해결합니다. 모달리티를 독립적으로 처리하고 후반부에 목표된 유사도 계산을 수행함으로써, 이러한 모델들은 각 텍스트 토큰이 관련된 이미지 영역과 의미 있게 연관되도록 보장합니다.







