Self-Attention
- 2017년 Transformer 탄생
- Machine Translation의 속도를 높이기 위해 나왔다.
- 그동안의 RNN-based Encoder, Decoder는 for loop때문에 time complexity가 높았다.
- Self-Attention은 for loop를 돌릴 필요가 없고 parallelly process하기 때문에 속도를 높인다.
- Attention만 이용하여 sequence를 다룬다.
🔗 Self-Attention
![](https://velog.velcdn.com/images/chae0382/post/48234a94-6144-451c-bc6a-f89e0488d42e/image.png)
QKV operation 또는 scaled dot product라고 불린다.
- Attention matrix를 보면, 각 row의 합이 1이다. 각 row는 attention distribution이다.
- Softmax가 row-wise로 normalize하기 때문이다.
- Attention matrix의 첫 번째 0.5는 "I"가 자기 자신을 어떻게 생각하는 지에 대한 의미를 담고 있다.
- V의 각 row는 word-embedding이다.
- Attention(Q,K,V) matrix는 neigbor를 고려하여 mix된 contextualize/mixed-up representation이다.
🔗 QKV Operation
- "Thinking"이 main character이고 neighbor을 보는 상황이다.
- q1과 다른 ks가 서로 얼마나 compatible한지를 고려한다.
- Inner product score는 vector size가 커짐에 따라 arbitrary하게 커질 수 있기 때문에 normalize해준다.
- "Thinking"은 자기 자신과 88%의 compatibility를, "Machines"와 12%의 compatibility를 가진다.
- 0.88 * v1 + 0.12 * v2 = z1
✔️ Vecterize form을 이용하여 모든 words를 동시에 processing한다.
![](https://velog.velcdn.com/images/chae0382/post/5a51d0f8-101e-464d-8706-0ea49b20cda2/image.png)
![](https://velog.velcdn.com/images/chae0382/post/7546d87c-6d2c-43c3-b7bc-ef096c6618d0/image.png)
- For loop가 필요없고 parallel하게 동작하기 때문에 powerful한 GPU가 있으면 매우 매우 속도가 빠르다.
Multi-head Attention
💡 Motivation
Language를 이해하기 위해서는 1개 이상의 attention matrix/weighted sum이 필요하다.
![](https://velog.velcdn.com/images/chae0382/post/dfe5a64f-7c97-4a1a-8cca-633e75197b62/image.png)
- 현재는 fixed된 양의 parameter/resource를 여러 attention head에 분산시킨다.
- Original Transformer paper에서는 learnable parameter를 늘렸다.
![](https://velog.velcdn.com/images/chae0382/post/152c3d14-b018-4ef3-8daf-99d4b90fda5e/image.png)
🔗 Visualizing the Attention
![](https://velog.velcdn.com/images/chae0382/post/332f45ca-6ee1-4803-ad41-a8254b65e5bf/image.png)
- 총 6개의 layer가 있고 각 layer마다 8개의 attention head를 가지고 있다.
- 각 head가 서로 다른 역할/목적을 수행한다는 것을 볼 수 있다.
![](https://velog.velcdn.com/images/chae0382/post/15de0ec2-3a3a-4455-9ae2-7dfa55fcaa87/image.png)
- input token 개수 = output token 개수
- Layer에 대한 for loop는 있지만 sequence에 대한 for loop는 없다.
🔗 Encoder, Single Block
![](https://velog.velcdn.com/images/chae0382/post/5e4944f1-982f-4c72-b4aa-39a1012a848a/image.png)
- Input(words) -> Self-attention (QKV Op) -> MLP -> Output
- Feed-Forward Neural Network : non-linearity를 주기 위해서이다.
- Residual Connetion (from ResNet)
- Layer Normalization
Positional Encoding
🔗 Motivation
- Self-Attention = Set Encoding
- Self-Attention은 purely data driven방식이며, 이것이 transformer가 powerful한 model인 이유이자 매우 많은 양의 데이터가 필요한 이유이다.
- Model이 sequence를 다룬다는 것을 알게하고 싶어, position마다 content가 바뀌어야 한다.
- 그래서 model에 order information을 넣어주고자 positional encoding을 한다.
![](https://velog.velcdn.com/images/chae0382/post/230854b8-04ad-44c7-998a-5fad51d4a191/image.png)
🔗 Position Encoding Requirement
- 각 time step(position)마다 unique encoding을 output해야한다.
- 두 time step 사이의 거리는 길이가 다른 문장 전체에 걸쳐 일치해야 한다.
- Model은 긴 문장으로 잘 generalize되어야 한다. 값은 제한되어야 한다.
- Deterministic해야한다.
🔗 Naive Examples
![](https://velog.velcdn.com/images/chae0382/post/4d6b6f1d-8412-4f87-9f0d-691dca106832/image.png)
- Strategy1 문제 : 더 긴 문장을 만나면 못본 숫자가 나오게 된다.
- Strategy2 문제 : 더 긴 문장을 만나면 값이 살짝 바뀐다.
🔗 Discrete Example - Use binary values
![](https://velog.velcdn.com/images/chae0382/post/f85c8a32-5a85-4337-9232-abd1a23728db/image.png)
- Scaler value 말고 vectorize form을 사용
- Dimension마다 frequency가 다르다.
- 이 성질이 sin함수와 cos함수를 사용하여 continuous form으로 확장된다.
- 문제 : Binary values waste space.
🔗 Continuous Encoding - Use sinusoidal functions
![](https://velog.velcdn.com/images/chae0382/post/8c0c9455-5f45-450b-b32b-e648d78a6299/image.png)
- Continuous function을 사용하여 각 dimension마다 다른 frequency를 적용한다.
- 처음 dimension은 value가 자주 바뀌고, 뒤로 갈수록 덜 자주 바뀐다.
- 하나의 sin, cos쌍마다 같은 frequency를 적용한다.
Sequence-to-Sequence
![](https://velog.velcdn.com/images/chae0382/post/f1c0b4a7-2008-4d9c-a99b-703928117e32/image.png)
Decoding Process
![](https://velog.velcdn.com/images/chae0382/post/d3c0e201-9f13-497b-ae5f-6a2bcfe10410/image.png)
Prediction Layer
![](https://velog.velcdn.com/images/chae0382/post/d47de6c2-656e-4074-997d-70c284f83c43/image.png)
- 매 time step마다 어떤 word로 predict할지 결정한다.
Encoder-Decoder Attention
![](https://velog.velcdn.com/images/chae0382/post/d9bcd6e1-5ca8-413d-9273-a437c4e8a7e2/image.png)
- Decoder input으로 querys를 생성한다.
- Encoder의 모든 output으로 keys와 values를 생성한다.
- query와 key로 score를 구하고 softmax를 적용해서 나온 probability로 values를 sum한다.
- Attention matrix : (decoder에서 input token 개수) X (encoder에서 output 개수)
✔️ Decoding during Training & Testing
-
Training phase
- Ground truth word를 decoder의 input으로 집어넣기 때문에 모든 query들을 한번에 process할 수 있다.
- Encoder에서처럼 matrix operation을 한다.
- For loop이 없다.
-
Testing phase
- Ground truth를 모르기 때문에 한번에 한 token씩 generate한다.
- Autoregressive generation
- For loop이 필요하다.
- Future를 볼 수 없다.
➡️ 이러한 training phase와 testing phase의 차이 때문에 동일하게 맞춰주고자 training phase에서도 future를 볼 수 없게 한다. 이렇게 cheating을 방지하게 위해 decoder에서는 Masked Self-Attention을 사용한다.
Masked Self-Attention
![](https://velog.velcdn.com/images/chae0382/post/5069067f-1c1a-46e9-bf57-b716362bad82/image.png)
- 각 token은 자기 자신과 왼쪽(backwards)만 볼 수 있다.
🔗 Masked QKV Operation
![](https://velog.velcdn.com/images/chae0382/post/8de6f6e9-b3a6-4bff-922a-98a2e08fc917/image.png)
- Unnormalied attention에 softmax를 적용하기 전에 triangular matrix인 mask를 multiply한다.
- -∞가 softmax에 들어가면 zero score가 된다.
![](https://velog.velcdn.com/images/chae0382/post/480dc7b7-84f8-45aa-91c4-e9f4ace6cc06/image.png)
Reference
- AI504: Programming for AI Lecture at KAIST AI