ViT를 알아보기 전에 Transformer에 대해서 먼저 이해가 필요하다.
1. Transformer
- RNN과 CNN을 쓰지 않고 Attention과 Fully Connected Layer와 같은 기본 연산만을 이용하여 SOTA 성능을 이끌어낸 연구로 Encoder - Decoder 형식을 사용합니다.
- Transformer 구조는 Scaled Dot-Product Attention과 이를 병렬로 나열한 Multi-Head Attention 블록이 알고리즘의 핵심이며, normalization, residual connection등이 활용된다.
- Transformer는 RNN과 같이 시간적 연속성에 구애받지 않고, 병렬 계산이 가능하기 때문에 RNN 구조에 비하여 굉장히 효율적으로 연산할 수 있습니다.
※ Transformer는 CNN에 고유한 inductive biases이 부족하므로 충분하지 못한 양의 데이터으로 학습할 때 일반화가 잘 되지 않는다.
참고
https://gaussian37.github.io/dl-concept-transformer/
1.1 Positional Encoding
aka. positional embedding
Transoformer는 CNN, RNN을 사용하지 않고 인풋을 병렬적으로 처리하기 때문에 순서에 대한 정보를 주기가 어렵다.
따라서 인풋에 위치정보를 주는 positional encoding이 필요하다.
이때 이 값은 스칼라가 아니라 벡터값으로 입력 벡터와 같은 차원을 가진다.
위치정보를 주는 방법은 여러가지가 있고, sin cos을 이용한 방법이 많이 사용되는 것 같다.
위치 벡터는 위치 정보의 벡터값이 너무 크지 않아야 하고, 같은 위치의 토큰은 같은 위치 벡터값을 가져야 한다. 위치 정보 벡터값이 커지면 입력 데이터보다 위치 정보의 값이 점점 커져 입력 데이터보다 위치 정보의 값이 지배적으로 되며, 같은 위치의 토큰이 다른 벡터값을 가진다면 그 위치 벡터는 위치 정보를 잘 나타내지 못한다고 할 수 있다.
sin, cos은 -1, 1사이이고 주기를 가진다. 주기를 가지는 것은 주기마다 같은 값을 가질 수 있음을 의미하므로 위치 벡터값이 같아지는 문제점이 생길 수 있다. 이를 방지하기 위해 서로 다른 주기를 가지는 복수의 삼각함수를 각 차원의 위치 벡터 값으로 주게 된다면 그 문제를 해결할 수 있다.
이 부분에 대해서는 아래 블로그에서 자세히 설명되어있다.
트랜스포머 transformer positional encoding
트랜스포머 Transformer Attention is All You Need Postional Encoding
www.blossominkyung.com
1.2 Self-Attention
attention은 query, key, value 3개 요소의 문맥적 관계성을 추출하는 과정이다.
인코더 블록을 통해 얻은 출력을 X라 하면 X는 NxD차원의 matrix(N : 단어의 수, D : 입력 임베딩 차원) 이다.
Q : query, K : key, V : value
W_Q, W_K, W_V 는 학습시 업데이트 가능한 벡터이다. (w : weight)
X와 각 W을 matrix multiplication을 통해서 쿼리, 키, 벨류를 계산한다.
![]() python numpy로 연산 |
![]() |
행렬곱 연산을 각각 numpy와 R로 연산 해보았다.
이렇게 얻은 각 Q,K,Y를 계산한다.
Q와 K_T를 합성곱 연산을하고 차원수의 제곱근으로 나누어 스케일링후 행단위로 softmax를 취한다.
- d_k : key 차원수
- softmax : 입력벡터의 모든 요소의 합이 1이 되게끔 확률로 나눠주는 함수
그 결과를 V와 다시 곱연산을 해주어 결과를 얻는다.
이 과정이 Self-Attention 과정이다.
1.3 Multihead-attention
multi head attention은 위의 self-attention을 여러 번 수행한 결과를 말한다.
예를 들어 self-attention 출력 matrix 가 2x3이고
attention head가 8개이면, 각 head에서 나온 출력결과를 concat하여
2 x (3 * 8) 사이즈의 matrix Z 와 W_o를 합성곱하여 최종 결과를 출력한다.
참고
-> 수식에 대한 설명이 자세히 나와있다.
여기까지가 Transformer 인코더에 대한 내용이다.
ViT를 이해하기 위해서는 인코더를 이해하는 것으로 충분하다.
2. ViT :
AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
ViT는 이미지를 16x16 사이즈의 패치로 나누고 positional embeding하여
encoder에 넣고 그 출력을 MPL ( Multi Perceptron Layer)를 통해 classification 하는 Task
Vision Transformer (ViT): Tutorial + Baseline
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
www.kaggle.com
캐글 노트북으로 ViT에 대한 설명과 실습 코드가 나와있다.
위의 예제에서 모델을 직접 구현하지는 않고 이미 오픈소스로 구현되어있는 모델을 가져오는데
아래의 레포지토리이다.
GitHub - rwightman/pytorch-image-models: PyTorch image models, scripts, pretrained weights -- ResNet, ResNeXT, EfficientNet, Eff
PyTorch image models, scripts, pretrained weights -- ResNet, ResNeXT, EfficientNet, EfficientNetV2, NFNet, Vision Transformer, MixNet, MobileNet-V3/V2, RegNet, DPN, CSPNet, and more - GitHub - rwig...
github.com
여기에는 pytorch로 vision 모델들이 다양하게 구현되어있어 가져와 쓰기 좋다.
[직접 구현해보기]
Implementing VisualTtransformer in PyTorch
Hi guys, happy new year! Today we are going to implement the famous Vi(sual) T(transformer) proposed in AN IMAGE IS WORTH 16X16 WORDS…
towardsdatascience.com
'AI' 카테고리의 다른 글
einops 이미지 패치 자르기 (0) | 2023.02.20 |
---|---|
벡터 & 실좌표공간 (0) | 2023.02.20 |
KITTI Dataformat (0) | 2023.02.13 |
Image Augmentation: ImageDataGenerator & Albumentation (0) | 2022.05.31 |
Image segmentation: U-Net (0) | 2022.05.31 |