[MINT LAB] Vision Transformer
[Vision Transformer] An Image is Worth 16 x 16 Words : Transformer for Image Recognition at Scale
TRANSFORMER : Attention Is All You Need(2017)
자연어 처리
RNN
Many to Many
- 워드 임베딩: 단어를 벡터로 바꾸는 것
- 이어서 학습을 하게 되니 back propagation 과정에서 vanishing 문제가 발생함. 이 문제를 해결환 것이 LSTM
LSTM
- 단점: 벡터의 크기가 고정되어 있어야 함(Seq2Seq)
GRU
LSTM이 하나의 셀에 4개의 셀이 있어 컴퓨팅적으로 속도가 느린 단점이 있음 따라서 신경망이 3개인 GRU로 발전
TRANSFORMER : Attention Is All You Need(2017)
-
Attention: 입력 시퀀스 전체에서 정보를 추출
- Transformer: 독일어 인풋이 들어오면 아웃풋으로 영어를 번역해 주는 것이 transformer임. 내부 구조는 크게 인코더와 디코더로 나뉨
- 인코더 블록에는 self-attention과 뉴럴 네트워크로 구성이 되어 있음
- 디코더에서는 asked self-attention과 인코더 디코더 self attention, 뉴럴 네트워크로 구성이 되어있음
- 전체 백터의 차원은 512임. 인코더 블록-> 문장끝에 end 를 나타내는 토큰을 넣고 나머지 공간에는 padding을 넣음
단어 처리의 경우
- 단어들을 백터로 바꾸는 워드 임베딩 과정:
- 각각의 단어를 하나의 벡터로 바꾸고, 여기에 위치 정보까지 나타내는 벡터(positioning encoding vector)를 더하여 생성
- Self-Attention에 넣음
- 각각의 query weight, key weight, value weight 을 구함
- [query key를 내적해서 스코어를 구함] 특정 단어의 query vector을 가지고 나머지 단어의 모든 key와 연산을 해줌 -> 그러면 가장 query와 비슷한 벡터가 큰 값을 가지게 됨(벡터의 내적 사용)(가장 벡터가 비슷한 것은 값이 크게 나옴-> 가장 유사한 단어임을 알 수 있음)
- [구한것을 정규화(normalization)] 큰 벡터들을 줄이기 위함(래디언트 안정을 위해)
- [softmax 으로 확률로 변환]
- softmax 값과 value를 곱함
- 위의 값을 모두 sum 함. z 벡터가 나오게 됨
Attention
- 세개의 q k v 벡터로 나눠줌
- q, k의 내적후 차원에 루트를 씌운 값을 나눠줌으로써 정규화
- 2의 값에 softmax를 취함
- 3에 value를 곱함(애도 내적 matmul)
- 4의 값을 전부 더함 -> z 벡터가 나옴
위의 과정을 여러번 수행한 것이 multi-head attention
- 각각의 워드 임베딩마다 각각의 아웃풋이 나오게 됨(하나의 단어마다 하나의 z가 나오게 됨)
Multi-Head Attention Attention Head가 8개라고 가정
- 하나의 임베딩된 단어를 각각의 8개의 어텐션에 넣음(?)
- 각각의 Attention에서 나온 값을 concat 해줌
디코딩 학습데이터 뒤에 0 (-inf)을 넣어주는 이유로는 학습하는 과정에서 뒤를 보지 말라고 cheating을 방지하기 위함
- 인코더에서 디코더로 k, v를 넘겨줌
3 Attention
- Encoder Self-Attention: 각각의 어떤 연관성을 가지는지
- Masked Decoder Self-Attention: 뒤의 치팅 방지. 앞에거로만 함
- Encoder-Decoder Attention: 디코더의 쿼리가 인코더의 어떤 벡터에 더 많은 가중치를 두는지 계산하는 과정
[Vision Transformer] An Image is Worth 16 x 16 Words : Transformer for Image Recognition at Scale
Vision Transformer의 목적: 이미지 classification
- input에 새로운 이미지가 들어왔을 때 이 이미지가 어떤 이미지인지 구별해 내는 것
- 이미지(48/48)사이즈를 16/16으로 해서 총 9패치. 이 패치를 단어처럼 생각! 각각의 패치들을 트렌스포머 인코딩에 넣어줌. 근데 여기에서 사진도 순서가 중요하므로 순서정보까지 추가함. 가장 앞부분에 position embedding 까지 넣어줌
- 각각을 임베딩해 넣어주고 각각을 normalization 을 취해줌
- 이를 모두 합쳐줌
- Self-Attention 구조에 들어가기 위해 해당 벡터에 weight를 곱하여 q k v로 나누어줌
- 이를 Multi-Head Attention 구조로 반복해줌
- 통과한 아웃풋과 통과하지 않은 아웃풋을 더해서 기존 값을 보존해 줌
- 이를 normalization 해준 뒤 Multi Layer Perceptron (MLP) 를 통과. 통과한 값과 기존의 값을 더함으로써 최종 output 를 도출함
- Transformer Encoder 의 아웃풋은 MLP를 통하여 어떤 이미지인지 최종적으로 알 수 있음