파이톨치

[CVPR 2022 VLP tutorial] Image-Text Pre-Training 본문

카테고리 없음

[CVPR 2022 VLP tutorial] Image-Text Pre-Training

파이톨치 2024. 3. 31. 17:58
728x90

# Modality

Modality는 무언가를 느끼는 방법이다. 멀티모달은 여러 방식으로 느끼는 것이다. 

쉽게, 멀티모달은 여러 감각을 사용하는 것을 말한다. 텍스트와 이미지를 사용하거나, 음성과 텍스트를 사용하는 것을 말한다. 

언어와 시각, 청각, 촉감 등을 사용한다. 

 

텍스트나 시각적인 이미지와 같이 센서에 가까운 모달리티를 Raw Modaliy라고 하며 감정과 같은 정제된 정보를 Abstract Modality라고 한다. 이런 모달리티를 여러개 쓰는 것을 멀티 모달이라 부른다. 

 

이에 국한되지 않고, Homogenous Modalities(with similar qualities)도 있는데, 2개의 카메라에서 입력받은 이미지를 사용하거나, 다른 2가지 언어를 사용한 text를 입력 받는다. 그렇다면 다국어 모델의 경우 Homogenous Modalities로 분류할 수 있을 것이다. 우리가 생각하는 멀티모달은 이미지와 텍스트를 사용하는 Heterogenous Modalities(with diverse elements)에 가깝다. 

 

응용으로는 Multi-modal retrival, image captioning, image question answering 이 있다.

 

# Network Architecture 

주요 문제는 이미지, 텍스트 와 그 관계를 이해하는 것이다. 

그러기 위해선 이미지와 텍스트를 서로가 이해할 수 있는 형태로 표현해야 한다. 

 

이미지와 텍스트를 입력으로 받는 경우, 우리는 이를 인코더에 입력한다. 텍스트 인코더의 경우, BERT기반의 트랜스포머들이 있을 것이다. 이미지 인코더는 모르겠다. 이 2가지 벡터를 Multi-modal fusion을 통해서 합쳐주게 된다. 

 

이미지 인코더의 경우 Sparse feature와 Dense feature가 있다. Object detector의 경우 Spare feature에 해당하는데 이유는 모르겠다. Dense feature가 우리가 흔히 아는 CNN, ViT(vison transformer)이다. 

 

Object Dector의 대표적인 논문으로, Faster R-CNN(2015)와 BUTD(2018)을 소개한다. 나는 Vison은 잘 몰라서 아래 블로그를 보았다. 

https://herbwood.tistory.com/10

 

Faster R-CNN 논문(Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks) 리뷰

이번 포스팅에서는 Faster R-CNN 논문(Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks)을 읽고 정리해봤습니다. 기존 Fast R-CNN 모델은 여전히 Selective search 알고리즘을 통해 region proposals

herbwood.tistory.com

더보기

Fast RNN이라는 이전 논문이 있었고, 이를 개선한 논문이다. 이전 버전에서 있던 문제는 Selective Search 알고리즘을 사용해서 Reion Proposal을 추출하기 때문에 Detection 속도를 향상시키는데 한계가 있었다고 한다.

 

Selective Search가 뭔데? 왜 느린데? 이는 segmentation을 하고 object detection을 하는 알고리즘인데, CPU 상에서 동작하여 병목현상이 생긴다. 때문에 이를 대신하기 위해서 Regison Proposal Network(RPN)을 도입한다. 이는 bounding box인 Anchor Box를 도입한다. (여기서 나온거였어?) 

 

즉, Fast CNN에서 후보 영역을 추출하는 작업을 하는 네트워크인 RPN이 들어간 것이다. 이 모든 과정이 GPU 상에서 동작하여 병목현상이 발생하지 않는다. 

 

전체적인 순서는 다음과 같다. 

1) 원본 이미지를 pre-trained된 CNN 모델(VGG)이 입력하여 feature map을 얻는다. 

2) feature map은 RPN에 전달되어 적절한 후보 영역을 산출한다. 

3) 후보 영역과 1)에서 얻은 feature map을 통해 Roi Pooling(고정된 크기의 벡터를 FNN에 넣어 주기 위해 사용하는 것?)수행하여 고정된 크기의 feature map을 얻는다. 

4) Fast R-CNN모델에 고정된 크기의 feature map을 입력하여 Classification과 Bounding Box Regression(이해 안되어서 아래 사진 첨부)을 수행한다. 

 

https://www.youtube.com/watch?v=LZRfHkTNQqo

 

이 때, 핵심 아이디어는 Anchor Box와 RPN이다. 

기존의 selective search를 통해 후보 영역을 추출하는 경우 segmantation이 진행된 후에 박스가 생긴다. 

하지만, anchor box 방식을 사용하는 경우에, 이미지를 격자 형태로 쪼갠다. 이 때 자른 이미지를 각각 grid cell이라고 부르며, bounding box로 간주한다. 이걸로 슉슉슉 학습한다고 하는데 생략하겠다. 

 

아래는 특정한 비율과 크기로 앵커박스를 생성하는 코드이다. 앵커 박스가 이미지 밖에 생길 수도 있으니 이도 방지해준다. 

feature_size = 800 // 16
ctr_x = np.arange(16, (feature_size+1) * 16, 16)
ctr_y = np.arange(16, (feature_size+1) * 16, 16) 

ratios = [0.5, 1, 2] 
scales = [8, 16, 32] 
sub_sample = 16 

anchor_boxes = np.zeros(((feature_size * feature_size * 9), 4)) 
index = 0 

for c in ctr: 
	ctr_y, ctr_x = c 
    for i in range(len(ratios)):
    	for j in range(len(ratios)):
        	# anchor box height, width 
            h = sub_sample * scales[j] * np.sqrt(ratios[i])
            w = sub_sample * scales[j] * np.sqrt(1./ratios[i])
            
            # anchor box [x1, y1, x2, y2] 
            anchor_boxes[index, 0] = ctr_x - w / 2.
            anchor_boxes[index, 1] = ctr_y - h / 2. 
            anchor_boxes[index, 2] = ctr_x + w / 2.
            anchor_boxes[index, 3] = ctr_y + h / 2. 
            index += 1
            
 index_inside = np.where(
 		(anchor_boxes[:, 0] >= 0) &
        (anchor_boxes[:, 1] >= 0) &
        (anchor_boxes[:, 2] <= 800) &
        (anchor_boxes[:, 3] <= 800))[0]
        
 valid_anchor_boxes = anchor_boxes[index_inside]

 

이게 왜 Sparse feature냐고 생각할 수 있다. 튜토리얼에서는 Box Label이 있어야 해서라고 말한다. Dense feature는 박스 라벨이 필요없다. 

 

이미지 전체에 대한 표현이 아니고, 특정 부분에 대한 표현이며 벡터 공간에 표현되지 않기에 Sparse 하다고 분류하는 것 같다. 

 

Dense feature는 CNN 과 ViT 기반이 있는 것 같다.

CNN 기반의 모델은 kernel을 적용하고, 이 커널이 이미지에 대한 특징을 뽑게 된다. 이를 통해 최종적으로 이미지의 크고 작은 특징을 함축하는 벡터를 얻게 된다. 

ViT 기반의 모델은 text 분야에서 많이 쓰던 Transformer 구조를 기용한 것이다. CNN의 경우 이미지를 자르거나 하진 않았지만, ViT는 patch라는 과정을 거친다. 이는 이미지를 작은 조각으로 쪼개어 입력으로 넣어주는 구조이다. 이미지를 잘게 쪼개고 펼치는 과정을 통해 이미지를 transformer 구조에 넣을 수 있는 형태로 바꾸어준다. 

 

# Text encoder

현재 텍스트 분야에서 압도적인 지지율을 보여주는 트랜스포머 구조를 이용한다. 

트랜스포머의 인코더 부분만 사용한 BERT 기반의 모델이나 seq2seq 구조를 가진 T5가 대표적인 모델이다. 

 

# Multi modal fusion

## Transformer encoder 

이제 각각의 이미지와 텍스트에 대한 각각의 표현을 이해했다. 이것을 잘 융합해주는 과정이 필요하다. 

크게 2가지 방법이 있다. self-attention만 하는 방식이 있고, cross-attention을 하는 방식이 있다.

 

self-attenttion만 하는 경우에는 이미지와 텍스트를 동시에 입력으로 주어진다. 이를 input concatenation이라고 한다. 

이를 트랜스포머 구조에 넣어 self-attention을 수행한다. 모델 입장에서는 어떤 modality에서 왔는지 모른다. 

 

cross-attention을 하는 경우도, self-attention을 하지만 이는 각 모달리티 내부의 표현력을 강화하는 역할을 수행한다. 

self-attention을 한 벡터를 cross-attention을 수행하는데, 이를 통해 이미지와 텍스트 간의 align 정보를 학습한다. 

## Transformer decoder

self-attention 하는 경우에는 위와 다른 점이 예측할 때 decoder와 같은 형태로 예측한다는 점이다. masked 토큰이 아니라, seq를 예측하거나 하는 형식이다. 

 

cross attention을 하는 경우에 주의 깊게 봐야한다. 왜냐하면 최근 언어모델의 decoder가 굉장히 성능이 좋기 때문이다. 이미지가 이를 따라가지 못하고 위의 방식대로 하면 새로운 모델을 학습해야하기 때문에 비용이 많이 드는 일이다.  Flamingo 에서는 perceiver resampler라는 방식을 사용해서 이를 해결했다. Flamingo 논문에서는 vision encoder, LM block은 학습하지 않는다. 기존의 것을 그대로 이용하겠다는 것이다. 대신 LM block 사이에 Gated-cross attention 층을 넣어주는데 이를 통해서 텍스트와 이미지 사이의 정보를 알게된다. 

 

Gated-cross attention을 좀 더 살펴보면, ... , 이거 너무 내용이 깊다.... 

# Pre-Training Task

Image-Text Contrastive(ITC) Loss는 CLIP의 Loss로 생각하면 된다. 이미지와 텍스트를 같이 넣어주고, 배치 내의 다른 입력을 negative 샘플로 이용하는 것이다. 

Image-Text Matching (ITM) Loss는 yes/no로 대답하는 질문이나, retrival task에서 사용하게 만드는 손실함수이다. 이미지와 맞는 텍스트와 데이터가 들어갔을 경우에 yes를 출력해야 하고, 맞지 않는 데이터가 들어 갔을 때는 no를 출력하게 해야한다. 

 

Masked Language Modeling (MLM) Loss는 Captioning, VQA에서 사용되는 손실함수이다. 이미지와 텍스트가 들어갔을 때, Masked된 이미지와 텍스트를 예측하게 만든다. 

 

Language Modeling (LM)은 seq2seq 구조를 띈다. 이게 효율은 좋음. 

 

# Adaption to downstream tasks

multi-modal retrival의 경우 ITC Loss와 ITM Loss로 학습된 모델을 사용할 수 있다. ITC Loss는 두 임베딩 벡터간 내적을 하고 ITM Loss는 층 하나를 지나 맞는지 아닌지 확인하면 되고, 추가적인 학습 필요 없다. 

 

Image-captioning은 이미지를 자연어로 설명하는 것이다. decoder 구조로된 모델을 사용한다. MLM의 형태는 추가로 구조를 바꿔서 학습을 해야한다. 

 

VQA는 Classification으로 접근하면 미리 정의된 후보군에서 하나 고르는 task가 되며, fine-tuning 시에 랜덤 초기화된 층 하나를 추가해야한다. 생성으로 가면 pretraining과 동일한 형태로 fine-tuning 하면 된다. 정해지지 않은 답변 생성이 가능하다.

728x90