이 강의의 목표는 이미지와 텍스트를 같은 공간에 놓고 맞는 쌍을 가깝게 하는 법을 아주 기초부터 이해하는 것입니다.
먼저 오늘의 핵심 식을 봅니다.
sij=τuiTvj
이 식을 외우기 전에, 식 안의 말과 기호를 먼저 하나씩 풀어야 합니다.
| 말 |
뜻 |
| ui |
i번째 이미지의 임베딩 벡터(길이 1로 정규화) |
| vj |
j번째 텍스트의 임베딩 벡터(길이 1로 정규화) |
| uiTvj |
두 벡터의 내적, 곧 코사인 유사도 |
| τ |
temperature, 점수의 날카로움을 조절하는 값 |
| positive pair |
서로 맞는 이미지와 텍스트 쌍(i=j) |
| negative pair |
서로 맞지 않는 쌍(i=j) |
수학에서 어려운 부분은 계산보다 읽기입니다. 뜻을 모르고 계산하면 공식이 암호처럼 보입니다.
고양이 사진은 고양이라는 문장과 가까워야 하고 자동차라는 문장과는 멀어야 합니다. CLIP은 이런 맞는 쌍과 틀린 쌍을 비교해 학습합니다.
먼저 각 벡터를 자기 길이로 나눠 길이 1로 만듭니다.
ui←∥ui∥ui,vj←∥vj∥vj
이렇게 하면 내적 uiTvj가 곧 두 벡터 사이 각도의 코사인이 되어, 항상 −1과 1 사이입니다. 벡터의 크기가 아니라 방향(의미)만 비교하게 되는 것입니다.
이미지 임베딩 u1=[0.6, 0.8], 텍스트 임베딩 v1=[1, 0]이라고 합시다(둘 다 길이 1). 내적은
u1Tv1=0.6⋅1+0.8⋅0=0.6
입니다. 여기에 τ=0.5로 나누면 점수는
s11=0.50.6=1.2
입니다. τ가 작을수록 점수가 크게 벌어져 softmax가 날카로워지고(맞는 쌍에 확률이 몰림), τ가 크면 점수 차이가 뭉개져 완만해집니다. 즉 τ는 "얼마나 엄격하게 구분할지"를 정하는 손잡이입니다.
한 배치에 N개의 (이미지, 텍스트) 쌍이 있으면, 모든 조합의 점수 sij로 N×N 표가 만들어집니다. 대각선(i=j)이 positive, 나머지가 negative입니다. 이미지 i를 기준으로, 맞는 텍스트를 negative들 사이에서 골라내도록 softmax를 씌운 것이 InfoNCE 손실입니다.
ℓiimg→txt=−log∑j=1Nexp(sij)exp(sii)
CLIP은 이미지에서 텍스트를 찾는 방향과 텍스트에서 이미지를 찾는 방향을 모두 씁니다.
ℓjtxt→img=−log∑i=1Nexp(sij)exp(sjj)
전체 손실은 두 방향을 배치에 대해 평균한 것입니다.
L=2N1i=1∑N(ℓiimg→txt+ℓitxt→img)
분자는 맞는 쌍의 점수, 분모는 그 행(또는 열) 전체의 합입니다. 그래서 이 손실을 줄이면 맞는 쌍의 점수가 다른 모든 후보보다 커지도록 학습됩니다.
이미지와 텍스트는 생김새가 전혀 다른 데이터입니다. 이 둘을 이어 주려면 "이 사진이 정확히 이 문장이다"라고 사람이 하나하나 라벨을 다는 대신, 인터넷에 널린 (사진, 설명) 쌍을 그대로 쓰고 싶습니다.
대조 학습은 절대적인 정답을 요구하지 않습니다. 대신 "이 배치 안에서 맞는 쌍이 틀린 쌍들보다 더 가깝기만 하면 된다"는 상대적인 조건만 겁니다. negative가 많을수록 문제가 어려워지고, 그만큼 임베딩이 촘촘하게 정렬됩니다. 이렇게 만든 공유 공간 덕분에, 학습 때 본 적 없는 분류 라벨도 문장으로 적어 이미지와 유사도를 재면 바로 분류할 수 있습니다(zero-shot). 이 강의에서는 CLIP을 "라벨 없이, 맞는 쌍을 틀린 쌍보다 가깝게 만드는 방법"으로 이해합니다.
- 이미지를 벡터로 바꾸고 길이 1로 정규화한다.
- 텍스트를 벡터로 바꾸고 길이 1로 정규화한다.
- 모든 이미지-텍스트 조합의 유사도 sij를 계산한다.
- 각 행과 각 열에 softmax를 씌워 맞는 쌍(대각선) 확률을 높인다.
- 두 방향 손실을 평균해 줄인다.
이 순서를 말로 설명할 수 있으면, 공식을 완전히 외우지 않아도 다시 만들어 낼 수 있습니다.
문제: 정규화된 임베딩으로 계산한 코사인 유사도가 다음과 같고 τ=0.5이다. 이미지→텍스트 손실을 구하라.
u1Tv1=0.9,u1Tv2=0.2,u2Tv1=0.1,u2Tv2=0.8
풀이:
먼저 점수 sij=uiTvj/τ를 만듭니다(τ=0.5이므로 2를 곱함).
s11=1.8,s12=0.4,s21=0.2,s22=1.6
이미지 1의 손실을 구합니다. 분모는 1행의 합입니다.
e1.8≈6.05,e0.4≈1.49,합=7.54
7.54e1.8≈0.802,ℓ1img→txt=−log(0.802)≈0.221
이미지 2의 손실을 구합니다. 분모는 2행의 합입니다.
e0.2≈1.22,e1.6≈4.95,합=6.17
6.17e1.6≈0.802,ℓ2img→txt=−log(0.802)≈0.221
이미지→텍스트 방향의 평균 손실은 $ (0.221+0.221)/2\approx 0.221$입니다. 맞는 쌍의 유사도(0.9, 0.8)가 틀린 쌍(0.2, 0.1)보다 컸기 때문에 손실이 작게 나왔습니다. 만약 맞는 쌍과 틀린 쌍의 유사도가 비슷했다면 확률이 0.5 근처로 떨어져 손실이 커집니다.
- 오늘 배운 핵심은 이미지와 텍스트를 같은 공간에 놓고 맞는 쌍을 가깝게 하는 법입니다.
- 임베딩을 길이 1로 정규화하면 내적이 코사인 유사도가 됩니다.
- sij=uiTvj/τ이고, τ는 점수의 날카로움을 조절합니다.
- InfoNCE 손실은 맞는 쌍(대각선)을 배치 안 다른 후보보다 크게 만들며, 이미지↔텍스트 양방향으로 씁니다.
- 이 방법으로 라벨 없이 학습하고 zero-shot 분류까지 가능합니다.
- 핵심 식은 다음과 같습니다.
sij=τuiTvj
- 임베딩을 길이 1로 정규화하는 이유는 무엇인가?
- τ를 작게 하면 softmax는 어떻게 변하는가?
- InfoNCE 손실에서 분자와 분모는 각각 무엇인가?
- 양방향(이미지→텍스트, 텍스트→이미지)을 모두 쓰는 이유는 무엇인가?