ViT
Transformer block과 MSA(Multihead Self-Attention)의 수식을 과 의미를 살펴보자
- LN : Layer Norm
- MLP : Multi Layer Perceptron
- MSA : Multihead Self Attention
(1) [Patch Embbedings]
z0=[xclass;xp1E;xp2;⋅⋅⋅;xpNE]+Epos, E∈R(p2⋅C)×D, Epos∈RN=1)×D
(2) [MLP Block]
zl′=MSA(LN(zl−1))+zl−1, l=1⋅⋅⋅L
(3) [MLP Block]
zl=MLP(LN(zl′))+zl′ , l=1⋅⋅⋅L
(4) [Position Embeddings]
y=LN(zL0)
(5) [q,k,v]=zUzkv,Uqkv∈RD×3Dh
(6) A=softmax(qk⊺Dh),A∈RN×M
(7) SA(z)=Av
(8) MSA(z)=[SA1(z);SA2(z);⋯;SAk(z)]Umsa,Umsa∈Rk⋅Dh×D
위의 수식들은 MSA으로 입력 시퀀스를 변환하여 입력벡터 z로 qkv를 생성하고 각 Head에서 self-attention을 적용한 후, 그 결과를 연결하고 다시 변환하여 최종 출력을 생성하는 과정이다.
Explain
(5)입력 벡터 z로부터 쿼리(queries), 키(keys), 값(values) 벡터를 생성하는 과정
- z : 입력 시퀀스의 표현으로, 길이N의 시퀀스에서 각 위치에서의 벡터zi의 차원은D
- Uqkv : z를 쿼리q, 키k, 값v로 변환하기 위한 가중치 행렬로 크기는D×3Dh이며, Dh는 각 헤드(head)에서의 차원임
- q,k,v는 모두RN×Dh의 차원을 가짐
(6) 어텐션 가중치A를 계산하는 과정
- qk⊺ : 쿼리와 키의 내적으로,q와k의 내적을 계산하면 RN×M 크기의 행렬이 되고, N과M은 입력 시퀀스의 길이를 나타냄
(7) 단일 어텐션 헤드에서의 셀프 어텐션(SA)을 계산하는 방법을 설명합니다.
- A : 앞에서 계산된 어텐션 가중치 행렬
- v : 값 벡터
- Av : 어텐션 가중치A를 값v에 적용하여 셀프 어텐션 출력을 계산하고, 출력은 RN×Dh의 차원
(8) Multihead Self Attention(MSA)
- SAi(z) : 각 어텐션 헤드i의 셀프 어텐션 출력이고, k개의 헤드를 가지므로k개의SAi(z)가 있음
- [SA1(z);SA2(z);⋯;SAk(z)] : k개의 어텐션 헤드 출력을 하나로 연결(concatenate)한 것으로, 결과물은 RN×k⋅Dh 차원임
- Umsa : 연결된 출력을 최종 출력 MSA(z)로 변환하기 위한 가중치 행렬이고, 크기는 k⋅Dh×D입니다.
- MSA(z)는 RN×D의 차원을 가지는 출력 벡터
Reference
[1] https://github.com/lucidrains/vit-pytorch
[2] https://github.com/huggingface/pytorch-image-models
[3] https://github.com/jankrepl/mildlyoverfitted/tree/master/github_adventures/vision_transformer