Search
Duplicate

시각적 이해를 위한 머신러닝/ Transformers II

Transformer review
Transformer를 Vision에 적용한 모델이 ViT
이미지를 16x16 patch로 분할한 후 Transformer를 적용함.
ViT는 이미지를 patch로 쪼갠 후에 그것을 linear로 변환 시킨 후에 positional encoding 더하고, 그렇게 만들어진 것을 transformer의 encoder에 input으로 넣는다.
Resnet 보다 성능이 좋았다고 함.
하지만 모델 훈련하는데, 큰 비용이 듬.
ViT는 아주 큰 데이터셋에서만 기존 모델들 보다 잘 동작 했음.
ViT는 spatial locality를 활용하지 않음. spatial locality를 모델이 스스로 깨우쳤다고 하는데, 그게 가능하려면 아주 큰 데이터셋이 필요함.
ViT의 position embedding 결과
2D 구조를 주지 않아도 스스로 배우더라
DeiT는 데이터 효율적인 ViT 모델.
CNN 모델을 teacher로 쓰고, vit를 student로 만들어서 학습시킴
teacher가 만든 분포를 vit가 모사하도록 함. 이게 distillation
ViT가 이미지 앞에 class token을 추가한 것처럼, 마지막에 distillation token을 주고, transformer를 돌린 후에, distillation token의 결과를 teacher가 만든 분포와 비교해서 loss를 줌.
loss에는 class token이 만든 cross entropy loss와 teacher와의 KL 다이버전스 loss를 더해서 구함.
다른 방법으로는 분포가 아니라 student와 teacher의 정답을 비교한 hard distillation을 시도해 봄.
흥미롭게도 soft distillation보다 hard distillation의 결과가 더 좋았음.
또한 distillation embedding 결과가 class embedding 결과보다 중요했음.
결과적으로 CNN이 ViT 보다 못했지만, ViT가 CNN을 넘어서더라. 안 하는 것보다 더 빨리 배우더라. 청출어람.
ViT의 이슈
계산 비용이 큼
고정된 크기로 patch를 만드는게 자연스럽지 않음.
Swin Transformer는 ViT를 다음과 같이 개선 함
원래 ViT에는 inductive bias가 없었는데, 가까운 것만 보도록 추가해서 계산량을 줄임.
fixed size patch가 애매하므로, fixed size를 hierarchy로 만들어서 합쳐지도록 함.
patch를 shifted 시키면서 partitioning 함.
Relative position bias를 추가 함
pixel를 4x4로 더 작게 쪼개고, 대신 MxM patch로 window를 만들고 같은 window 내의 것들 하고만 attention 하도록 함
Hierarchical로 Patch merging을 함.
patch를 merging 하면서 점점 크기를 키우면서 커진 것에 대해 다시 attention 수행
window를 patch 절반씩 움직이면서 attention 함.
Swin Trasnformer 아키텍쳐
patch를 merging 하면서 tansformer를 돌림.
Swin Transformer Block은 Shifted Window Partitioning을 하기 때문에 짝수번 반복한다.
window를 잘라서 attention 하다보니 절대적인 position encoding을 하기 애매해서 상대적인 position을 추가 함.
Swin Transformer가 기존 ViT에 비해 계산량이 많이 적다.
CvT는 Swin Transformer와 비슷한 철학으로 만들어짐.
이미지 전체를 보지 말고 주위 것만 보자.
window를 나누지 않고, 그냥 conv 연산을 함.
fully-connected는 convolution의 special case이다. (물론 그 반대도 성립)
Q, K, V Attention 연산도 fully-connected가 아니라 그냥 conv 연산을 함. stride도 사용.
(이게 stable diffusion에도 나옴)
CvT의 아키텍쳐
Transformer인데 연산을 그냥 convolution을 하는게 핵심
ViViT는 비디오용 ViT. 4개 모델을 만듦.
첫 번째 모델은 ViT를 video 분류 문제에 그대로 사용 함.
계산량이 너무 많아서 그걸 줄이기 위해 frame을 줄여서 쓰는 방법을 시도해 봄.
인접한 frame끼리 합쳐서 처리해 봄
두 번째 모델이 Factorized 모델
Spatial과 Temporal을 2단계로 나눠서 처리 함.
Spatial은 ViT를 그대로 씀. 그 결과를 모아서 Temporal로 Transformer를 돌림.
최초 모델보다 연산 시간을 줄임
세 번째 모델은 Factorized Self-Attention 모델
transformer block 안에서 spatial attention과 temporal attention을 나눠서 함.
네 번째 모델은 Dot-Product Attention 모델
Multi-Head를 Spatial과 Temporal로 나눠서 처리
4가지 모델을 돌린 결과
성능은 첫 번째 것이 좋았지만, 계산 효율성은 2번째 모델이 좋음
ViViT랑 비슷한 시기에 나온게 TimeSFormer
5개 모델을 제시했는데, 가장 앞의 것은 ViT고, 그 뒤의 2개는 ViViT의 1, 3번째 모델과 비슷 함.
다른 부분도 있는데, 성능은 별로 다르지 않음.
MViT는 CvT와 비슷한데, conv를 안 하고 계산량을 줄이기 위해 Multi-Head Pooling Attention을 함.
CvT와 비슷한데, 시간 축이 추가 됨.
기존 모델들보다 성능이 더 뛰어남.
가벼운 모델들보다는 성능이 뛰어나고, 무거운 모델들에 비해서는 성능은 비슷한데 더 가볍다.
논문들 참고