[CV 논문 리뷰 스터디 / 5주차 / 최경석 ] Attention is All You Need, Transformer (NIPS 2017)
많은 딥러닝 모델, 특히 자연어 처리 분야의 모델들은 Transformer의 아키텍쳐를 기반으로 한다
GPT : Transformer의 Decoder 활용
BERT : Transformer의 Encoder 활용
Transformer는 Attention만을 사용해서 encoder과 decoder을 구성한 모델
1) Input Embedding & Positional Encoding
2) Encoder block
3) Decoder
Self Attention Layer의 역할?? : Token의 정보처리를 할 때, 함께 주어진 Input의 다른 token을 얼마나 중요하게 고려할 것인가
제일 처음 Encoder의 입력에 단어를 Embedding하여 사용
이후의 Encoder block에는 이전 Encoder의 output을 input으로 받음 (512차원)
Input이 한번에 들어오기 때문에 어떤 단어가 어디에 위치해있는지에 대한 정보를 손실
이러한 위치정보를 최대한 보존하기 위해 Positional Encoding vector 사용(512차원)
Input Embedding + Positional Encoding = Input(512차원)
모든 Embedding된 Vector들이 같은 방향, 같은 크기로 변화해야함
멀리 있는 단어들은 positional encoding 사이의 거리도 멀어야함
Input으로 사용된 단어들(Embedding & Positional Encoding)의 vector들이 Self Attention Layer을 거침
Multi-Head Attention Layer에서는 각 vector들 사이에 연관성(dependencies) 존재 (Feed Forward에는 X)
Self Attention의 역할은??
문장 속의 한 단어와 연관이 있는 단어가 무엇인지 알기 위해서 사용
Self Attention을 위해 각 input vector에 대해 3종류의 vector 생성
Step1. Input Embedding에 따라서 Query, Key, Value vector 산출
WQ, WK, WV와 Input Embedding Vector를 연산하여 Query, Key, Value 계산 (1X4)*(4X3) = (1X3)
512차원의 vector에 대해서 Q,K,V vector는 64차원 -> 64 * 8 = 512 (Multi Head Attention)
WQ, WK, WV는 모델 학습을 통해 생성
Step2. Score 계산 (특정 벡터에 대해 다른 부분들에 얼마나 집중해야 하는가)
현재 참조하고 있는 <it>이라는 Query(3차원)과 가장 관련성이 높은 것은?? = 30%, 50%, 0.1%,,, 계산하기
Score : 현재 보고 있는 Input의 Query(q1)와 나머지 단어들에 대한 값인 Key(k) 곱 연산
score1_1 = q1*k1 = 112
score1_2 = q1*k2 = 96
,,,
Step3. Divide by 8
계산한 Score를 차원에 대한 root 값 (논문에서는 64차원이므로 8)로 나눔 -> Gradient 안정화 효과
차원(dk)가 커지면 Q*K 값이 너무 커질 수도 있기 때문에 이를 방지하고자 나눠줌
score1_1/8 = 14
score1_2/8 = 12
,,,
Step4. Softmax
0~1 사이의 확률값으로 변환 = 얼마나 중요한 역할을 하는가
softmax1_1 = 0.88
softmax1_2 = 0.12
,,,
Step5. Softmax score X Value vector
각 value vector과 Step4에서 구한 Softmax 값 곱연산
weighted_v1 = v1 * softmax1_1
weighted_v2= v2 * softmax1_2
Step6. Sum the weighted Value vector
z1 = weighted_v1 + weighted_v2 + ,,,,
<Matrix 연산 요약>
지금까지는 Single Attention에 대한 연산
Transformer의 Multi-Head Attention은 다른 방식으로 여러번 반복
산출된 Attention의 값들을 Concat (Z0 ~ Z7) -> Z_concat
Z_concat의 column 개수와 동일한 row 개수를 가지며 기존의 input embedding과 같은 차원을 가지는 matrix W0
matrix W0를 통해서 vector size 조절
W0은 모델 학습을 통해 생성
Z_concat X W0 = Z (input embedding의 dimension과 동일한 크기)
Multi Head Attention의 전체 과정
X는 최초 input, 제일 처음 Encoder에서 사용
R은 이전 Encoder의 Ouput
X와 R은 같은 크기
8개의 head를 사용한 Multi-Head Attention 결과, 각 head 마다 다른 방식으로 Attention을 주고 있음
함수의 output + Input Vector(Positional Encoding 거친 후)
gradient를 구했을 때 너무 작아지지 않도록 유지 가능
Residual Block & Norm은 Encoder, Decoder의 모든 sublayer에서 사용
Feed Forward Network는 Fully Connected Network이고, 각 Z에 대해서 독립적으로 적용됨
같은 Encoder Block 내에 있는 Feed Forwad Network는 같은 parameter를 공유(같은 구조)
-> 위의 그림에서 W1, b1, W2, b2는 동일한 값
max(0,xW1+b1) : kernel size=1, channel=2048인 convolution layer를 통과시키는 과정과 동일
hW2 + b2 : kernel size=1, channel=512인 convolution layer를 통과시키는 과정과 동일
즉, 과정은 독립적이지만 convolution 연산을 통해 빠르게 연산할 수 있음
Decoder의 Attention은 Masked
즉, 참조하는 단어의 앞에서 이미 존재하는 단어들에 대해서만 Attention Score 확인 가능(Sequential)
왼쪽 이미지는 Encoder에서의 Attention 과정
-> Thinking이라는 단어에 대해서 Score를 구할때, 뒤에 있는 Machines라는 단어를 참조 가능
우측 이미지는 Decoder에서의 Attention 과정
-> Thinking이라는 단어에 대해서 Score를 구할때, 뒤에 있는 Machines라는 단어를 참조 불가능
-> 뒤에 나오는 단어들에 대해서 Score를 "-inf"로 설정 (Masking)
X2에 대해서 뒤에 나오는 X3, X4의 Score는 계산 X
일단 Score를 모두 계산한 이후에, Masking 진행 (-inf) -> Softmax를 거치면 0이 됨
Encoder의 결과와 Decoder의 Multi-Head Attention 결과에 대해 Attention 진행
Decoder에서 나온 Query(참조하는 단어)에 대해서 Encoder에 있는 Key와 Value를 사용
Decoder의 출력 단어들이 Encoder의 입력 단어들 중에서 어떤 단어에 많은 가중치를 두는지 계산
<Residual & Norm, Feed Forward는 Encoder과 동일하므로 생략>
Linear Layer(Fully Connected) + Softmax Layer를 거치면서 probability 계산 => 어떤 단어가 나와야하는지 예측
Reference
https://www.youtube.com/watch?v=AA621UofTUA&t=348s
https://www.youtube.com/watch?v=Yk1tV_cXMMU
댓글 영역