LLaVA OneVision을 fine-tune 해보고 있는데, LVLM의 mm_vision_tower (vision encoder)로 siglip을 사용중이어서 이참에 정리 겸 공부해볼까 싶어 남긴다
이미지에서 시각 정보를 vision feature vector로 추출하고 그것을 text input과 동일한 embedding 공간에 투영하는 과정을 거쳐 text decoder (여기선 LLM이겠죠)의 인풋으로 들어간다..
encoder 모델
CLIP (Contrastive Language-Image Pre-training)
* CLIP은 이미지와 텍스트를 같이 학습하여 두 가지의 상호 연관성을 강화하는 contrastive learning 기법을 사용
* 이미지 인코더(ViT)와 텍스트 인코더(BERT)를 사용하여 각각의 입력 데이터를 벡터로 변환
* 서로 다른 이미지-텍스트 쌍을 구분하는 contrastive 학습을 통해, 같은 의미를 가진 이미지와 텍스트는 벡터 공간에서 가까워지고 다른 의미는 멀어지게 학습
* zero-shot 예측이 용이해짐 (텍스트 설명을 통해 이미지 분류, 검색 수행 가능)
BLIP (Bootstrapping Language-Image Pre-training)
* BLIP은 이미지와 텍스트 모두에서 강력한 성능을 발휘하기 위해 설계된 모델로, image-text retrieval과 text generation 등 다양한 작업을 지원
* 여러 데이터 소스와 모델 모듈을 활용해 이미지와 텍스트 간의 복잡한 관계를 학습
* 웹 이미지, 사람 주석 텍스트, 웹 텍스트, 기계 생성 텍스트 등 다양한 학습 데이터를 사용
* 다양한 유형의 데이터를 통해 학습함으로써 이미지-텍스트 쌍의 의미를 더 잘 이해 => 이미지 분류, 이미지 기반 텍스트 생성 등 다양한 작업에 효과
* 아직 이미지와 텍스트 간 modality gap 을 완전히 해결하지는 못함
BLIP-2 (Bootstrapping Language-Image Pre-training)
* BLIP-2는 이미지 인코더와 대규모 언어 모델(LLM) 사이의 격차를 메우기 위해 Q-Former라는 새로운 구성 요소를 추가
* Q-Former: 이미지 인코더에서 생성된 특징을 LLM이 이해할 수 있는 형태로 변환하여 이미지와 언어 간의 상호작용을 강화, "querying" 기능 수행 = 주요 정보를 LLM에 전달
* 다양한 이미지-언어 작업을 수행할 수 있으며, 특히 이미지 설명을 생성하거나 이미지를 기반으로 한 텍스트 생성 작업에 강력
* frozen image encoder & llm = 학습 비용을 줄이면서 높은 성능을 유지하고자 함
CLIP의 주요 특징과 한계
1. Contrastive learning 방식
- 이 방식은 positive pair(의미적으로 연결된 이미지와 텍스트 쌍)를 최대한 가깝게, 그리고 negative pair(의미적으로 연결되지 않은 쌍)를 최대한 멀리 두는 식으로 학습
- Loss function은 모든 positive pair에 대해 모든 negative pair와 비교해 normalized 값을 산출하는데, 이를 위해 softmax를 사용
=> 대규모의 배치 크기와 많은 연산 필요
2. 대규모의 배치 크기
- CLIP에서 contrastive learning을 하려면 한 번에 많은 이미지-텍스트 쌍을 비교해야 의미 있는 학습이 이루어짐
- 그만큼 GPU 메모리와 연산량이 급격히 증가
- GPU 간 많은 통신이 필요하므로 bottleneck 발생
3. N^2의 시간복잡도
- CLIP의 contrastive learning 과정에서는 N개의 이미지-텍스트 쌍이 있을 때, 각 쌍이 다른 N-1개의 쌍과 비교
- 배치가 커질수록 더욱 큰 부담이 되며, 효율적인 연산을 위한 최적화 필요
배치 크기 요구사항을 줄이고 GPU 자원을 보다 효율적으로 사용하자 => SigLIP
SiGLIP (SiGmoid loss for Language Image Pre-training)
1. softmax가 아닌 sigmoid 함수 사용
- softmax 함수는 각 쌍이 다른 모든 쌍과 비교되어 유사도를 확률로 변환했다 (모든 이미지-텍스트 쌍 관계를 N by N 행렬로 유지해야 했음)
- sigmoid 함수는 각 이미지-텍스트 쌍을 독립적으로 평가함. 각 쌍에 대한 평가가 개별적으로 이루어짐 (다른 쌍 필요 x)
2. sigmoid loss implementation 방식
- 각 logits은 이미지 embedding 값과 텍스트 embedding 값의 내적을 통해 구함 (유사도 점수)
- positive pair에는 label 1을, negative pair에는 label -1을 할당함 (labels matrix는 대각선이 1, 그 외 -1 = penalty)
- labels * logits 하면 양성 쌍은 동일 값으로 유지되고 음성 쌍은 부호가 반대가 됨 => 양성 쌍은 높은 확률로 예측하고 음성 쌍은 낮은 확률로 예측하도록 학습하게 됨
* 양성 쌍의 경우 logits가 클수록 log_sigmoid가 작아짐
* 음성 쌍의 경우 logits가 클수록 log_sigmoid가 커짐
- 학습은 loss를 줄이는 방향으로 => 음성쌍의 유사도는 낮추고, 양성 쌍의 유사도는 높이는 방향으로 이루어짐
contrastive learning 효과
- 각 쌍의 유사도를 개별적으로 학습하면서 양성 쌍의 유사도는 높이고 음성 쌍의 유사도는 낮추는 방식으로 작동함
- CLIP의 contrastive learning과 비슷, but 독립적으로 학습되므로 연산 효율 훨씬 높겠지
3. GPU 연산 최적화 => chunked implementation 방식
- Chunked Implementation을 통해 GPU 간 통신 비용을 줄임
- 모든 GPU가 N개의 이미지-텍스트 쌍에 대한 전체 유사도 행렬을 공유할 필요 없이, 각 GPU가 일부 쌍의 손실을 계산한 후 필요한 정보만 교환
Expriments
* SigLIP은 작은 배치 크기(예: 4~8k)에서 CLIP보다 우수한 성능을 달성
* SigLIP과 CLIP 모두 32k 배치 크기에서 포화 상태에 도달하는것을 확인
추가로 읽어볼거:
'AI > vision' 카테고리의 다른 글
[논문 리뷰] Reducing Hallucinations in Vision-Language Models via Latent Space Steering (0) | 2024.10.31 |
---|---|
camera calibration using OpenCV (0) | 2024.08.29 |
OpenCV 이모저모 (0) | 2024.08.29 |
영상 처리를 위한 OpenCV 라이브러리 (0) | 2024.08.29 |