SYDLAB_hanyang/Paper Reviews

Paper Review - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (Vision Transformer)

빈그레 2024. 4. 28. 02:11

 

 

https://gaussian37.github.io/dl-concept-vit/

 

Vision Transformer (AN IMAGE IS WORTH 16X16 WORDS, TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE)

gaussian37's blog

gaussian37.github.io

 

 

[그냥 transformer 간단 정리! ]

[ input ]
input에서 열의 개수는 문장에서의 단어의 개수
세로로 단어 한개씩
그러면 행의 개수는 단어의 크기..?
차례대로 x

[ output ] 
target이 번역이었으므로 출력도 단어를 표시하는 matrix는 맞으나 입력과 사이즈가 다를 수 있음

( 엘 '벡터'의 크기 = 행의 개수 )

[ word embedding ]
원래 one-hot encoding 이라서 단어 하나는 한 차원에서만 1을 갖는걸로 표현되는데 
(즉 단어 수만큼 벡터가 존재해야함 )
이렇게하면 너무 벡터가 너무 많이 필요하니까 embedding을 통해서 한 축에 여러 단어가 표현될 수 있도록

Query vs key 비교 -> dot_product , scale

MatMul : dot product (inner product)
mask : illegal connection 의 attention 금지

self attention : 문장에서 각 단어 사이 연관성

Q와 K의 차원은 동일해야함 -> matrix multi[lication으로 차원 통일



dmodel 차원으로 통일
V,K,Q 모두 차원 통일
병렬적 연산 후 concat하기 전에 차원 또 줄이려고 linear 연산함

self attention은 그냥 단어벡터에 가중치 행렬 곱해서 key,query,value로 사용해서 multi head attention
따라서 self attention은 key,query,value가 모두 같다~! 그냥 문장의 단어별 연관도 얻어내는 정도
-> attention이 강조되어있는 feature를 추출

[ 초기 연산 처리 ]
디코더가 처리를 시작할 때에는 아직 'shifted output'이 없다. Transformer 모델에서의 디코딩 과정은 다음과 같이 진행된다. 

초기 입력
: 디코딩은 특별한 시작 심볼, 종종 "<start>" 토큰이라 불리는 것으로 시작된다. 이 토큰은 디코더에게 문장 생성을 시작하라는 신호를 준다.

Shifted Output의 생성
: 디코더에 들어가는 'shifted output'은 사실 입력 시퀀스의 각 단어 다음에 오는 단어를 예측하도록 학습된 모델의 출력입니다. 학습 과정에서는 실제 시퀀스를 알고 있으므로, "<start>" 토큰 다음에 올바른 시퀀스를 디코더에 입력으로 줄 수 있다.이는 'teacher forcing'이라는 기법에 해당한다.

 

 


 

 

Vision Transformer

 

 

 

 

 

CNN

 

inductive bias가 부족해서 cnn보다 데이터가 많이 요구된다.
*** inductive bias : 모델이 처음보는 입력에 대한 출력을 예측하기 위해 사용하는 것

cnn의 inductive bias

( bias 1)translation equivariance
// 입력의 위치가 변하면 출력의 위치도 변화함으로써 추출되는 feature는 동일하게 유지
MLp에서는 위치가 달라지면 값도 달라져버린다
요러케 위치 달라도 값 똑같

( bias 2 )locality
특정 영역만 보고 convolution filter가 feature를 추출할 수 있다고 가정

위 두가지 가정 (bias)를 통해 CNN이 단순 MLP보다 더 좋은 성능을 낼 수 있다고 해석할 수 있다. 

*** MLP : Multi Layer Perceptron의 약자로 기본적인 형태의 인공 신경망이다 
     input layer, hidden layer, output layer로 구성되어 있다. 


flatten
: 이미지는 보통 w,h,channle 로 3차원으로 이루어져 있는데 fully conneted layer 쓰려면 1차원으로 만들어야해서 이미지를 벡터로 변환해야한다.

 

 

 

Transformer ( Large scale data )

 

위 CNN은 local receptive field를 보는 것이나, transformer는 데이터 전체를 보고 attention할 위치를 정하는 메커니즘이기 때문에 , 이러한 패턴을 익히기 위해 CNN보다 더 많은 데이터를 필요로 한다. 

 

따라서 데이터 양이 충분하지 않으면 성능이 떨어지게 된다.

 

본 논문에서는 large scale 데이터셋인 imagenet 21k 등으로 사전 학습을 하고, CIFAR-10으로 Tranfer learning을 하였을 때 높은 정확도를 가짐을 보여줬다. 

 

 *** Transfer learning ( 전이 학습 ) 아래 게시글 참고

https://kycu-sb.tistory.com/254

 

AI - Transfer Learning

Transfer Learning      Transfer Learning ( 전이 학습 )  전이 학습(Transfer Learning)은 머신러닝에서 특정 문제에 대해 학습한 모델을 다른 관련 문제에 적용하는 기법이다. 이 접근 방식의 핵심은 한

kycu-sb.tistory.com

 

 

Vision Transformer Architecture

 

 

 

- input 만들기

 

Vision Transformer는 기본 Transformer의 encoder 구조를 그대로 사용하기 때문에, Tranformer에 맞는 입력값으로 변경해주어야 한다. 우측 그림에서 Embedded patches module에 대한 설명한 아래와 같다.

 

[ Embedded Patches / Encoder 입력 만드는 과정 ]

1. patch로 쪼개기
: Transformer와 동일한 구조의 입력 데이터를 만들기 위하여 이미지를 patch 단위로 쪼개고 각 패치를 왼쪽 상단에서 오른쪽 하단 순서로 나열하여 sequence data처럼 만든다. ( 즉 patch가 하나의 단어처럼 동작하는 것 )

P는 patch의 크기를 의미한다. patch에서 PxP차원을 가지고 그만큼을 color에 대한 C채널수만큼을 가진 것의 N개의 patch로서 존재하므로 위와 같이 전체 이미지에 대한 벡터가 존재한다.

patch의 개수는 본래 높이와 너비인 H와 W의 곱을 patch size인 P제곱으로 나누면 전체 이미지가 patch size에 따라 몇개의 patch로 나누어질지 알 수 있다.

2.Flatten
: 3D데이터인 각 patch를 flatten하여 벡터로 변환해준다.

각 patch를 flatten하여 벡터로 만들면 벡터의 크기는 P^2C가 되고, 이러한 벡터가 N개 생긴다.
flatten한 벡터를 모두 합친 것 Xp이다.

3. Embedding
: 위에서 만들어진 각 patch에 해당하는 각 vector에 linear 연산을 거쳐 embedding 작업을 한다.
E라는 embedding 행렬과 곱하여 target dimension인 D로 모든 벡터의 차원을 조정한다.



4. 클래스 토큰 추가
: embedding 결과에, 클래스를 예측하는 토큰을 추가한다. 클래스 토큰을 추가하는 이유는 전체 이미지를 대표하는 정보를 모델이 학습할 수 있게 하기 위함이다. 클래스 토큰은 Vision Transformer에서 이미지 전체를 대표하는 데 필요한 정보를 학습하고, 최종적으로 이미지 분류를 위한 결정적인 정보를 제공하기 위해 사용된다.

토큰을 추가하면 본래 (N,D)행렬이었던 것이 (N+1,D) 의 크기가 된다. 
(클래스 토큰은 학습 가능한 파라미터를 입력해주어야 한다. )


5. Positional Embedding
:  마지막으로 z0의 크기와 동일한 (N+1,D) 크기의 위치 행렬을 더해주면  vision trnasformer의 입력이 완성된다.
( 분홍 : patch / 보라 : position )


(입력 처리 예시)

 

 

- Encoder 

[ Output ; Class 토큰 ]
: 위에서 만든 input값에 대해 Trnasformer encoder를 L번 반복하면 입력값과 동일한 크기의 출력값을 마지막에 얻을 수 있다. 그렇게 얻은 출력 역시 input과 동일하게 클래스 토큰과 벡터로 이루어져 있다. 


출력에 있는 클래스 토큰으로  MLP Head를 구성하고, 이를 이용하여 MLP를 하면 최종적으로 class를 분류할 수 있다.


[ 입출력 크기 유지 ]
Transformer의 encoder를 L번 반복하기 위해서는 입력과 출력의 크기가 같도록 유지해야한다.


위에서 만든 z0이 input으로 들어가면 Zl이 output으로 나와 encoder의 출력이 된다. 

[Architecuture]

위 구조에서 Multi Head attention은 현재 input을 바탕으로 Q,V,K를 동일하게 넣고 있으므로, self attention이다.
encoder에서의 연산 순서를 식으로 표현해본 것이다. MSA는 multi head attention이고, LN는 Layer Normalization이다. 

1. Norm ( Layer Nomalization )
: 입력값에 대한 embedding을 통해 D차원으로 모두 맞춰준 입력 벡터들에 대해 정규화를 진행한다.
위와 같이 D차원을 가진 입력 벡터들이 N+1개 존재한다.


각 입력벡터들에 대하여 위와 같은 식으로 정규화를 진행한다. 람다와 베타는 학습 가능한 파라미터이며, 아래쪽에 나타난 식은 분산이 0에 가까워졌을 때, 분모가 0이 되는 것을 방지하기 위해 넣은 것이다.

2. Mutli Head Attention

3. MLP
마지막으로 MLP과정을 거치고 이때, GeLU activation을 사용한다.

L번 반복한 Transformer Encoder의 마지막 출력에서 클래스 토큰 부분만 분류 문제에 사용하여,
마지막으로 MLP를 이용하여 클래스를 분류한다.
( 위에 클래스 토큰은 학습 가능한 파라미터로 설정 )

 

 

학습

 

 

 

 


여기서부터는 그냥 참고...!!!!!!!!!!!!!

 

 

 

 

 

introduction

 

- inductive bias
모델이 학습할 수 있는 공간을 제한함으로써 학습 과정을 가이드한다. 


Fully connected는 inductive bias가 존재하지 않지만, convolutional과 recurrent 모델에서는 inductive bias가 존재한다.

Transformer는 self-attention을 하기 때문에, CNN과 RNN보다는 상대적으로 inductive bias가 낮다.


- Vision Transformer (ViT) 개요






 

 

 

 

step1

분할해서 patch sequence 구축

 

step2

patch들을 trainable linear projection을 적용해서

각각의 patch(flattend vector)를 뒷차원으로 변환

9개의 patch를 쭉 펴서 뒷차원..?으로 변환..?

step2를 거치면 각각의 patch가 저 분홍색 벡터로 나온다

 

 

step3

앞쪽 별표 : learnable class embedding

나머지 핑크 : patche embedding

보라색 : positional embedding

 

 

step4

: 마지막 레이어세ㅓ class embedding에 대한 output인 image representation을 도출

class token을 넣고, class token의 위치에 해당하는 representation을  사용하게 되는 것

 

 

 

 

 

Positional Embedding

 

 

 

No

그냥 patch embedding만을 transformer encoder의 input으로 사용

 

1 (가장 good)

patch를 raster order로 2차원의 3차원의 이미지가 존재할 때 가로,세로를 기준으로 왼쪽 위부터 오른쪽 오래까지 봄

 

2

3차원의 이미지에 대해서 가로,세로 2D grid를 만들어서 x,y축 좌표가 있는 positionla embedding

 

relative

patch들 사이의 positional embedding

 

최종적으로 learninable positional embeddign에 1D를 positional embeddign을 넣

 

 

 

 

 

standard에서는 MLP뒷단에 normalization과 residual있었는데

앞쪽에 layer normalization을 적용한 부분이  standrard와 좀 다르다  

+: residual conenction

 

multi head attention 과 MLP로 크게 구성이 되어있고, 

 

이러한 구조가 step4 구조이다.

 

patch 구조 때문에

 




 

 

 

 

MSA: multi head self attention
ㅇ여러개의 patch로 분할해서 순서가 있는 이미지로 넣는 것이 bias를 넣는 방법이었음

Resolution adjustment   ( Fine tunning)

: patch는 동일하지만 이미지에 따라 patch의 개수는 달라지게 됨 이미지 크기가 다르니까

이 때, position embeddign을 조정하는 부분이 있는데 이 부분이 bias가 됨