https://fastcampus.co.kr/data_online_aideep
1. Transformer
Seq2Seq with Attention
- Encoder, Decoder, Attention Module로 구성
- Decoder의 각 Time step에서부터 Encoder의 원하는 Hidden State Vector들 중 원하는 정보를 그때그때 가져가는 Attention Module이 추가됨
- Encoder와 Decoder는 기존의 RNN Model 기반의 구조
Seq2Seq Model with attention의 개선판, 최근까지 많이 사용되는 architecture
기존 Model에서는 Sequence를 Encoding, Decoding할 때 RNN 기반의 Module을 사용
- Encoder & Decoder가 RNN 기반의 Module로 구성됨
- Encoder
- Decoder
- Attention Module: Decoder의 각 time step에서 Encoder의 hidden state vector중 원하는 정보를 그때그때 가져갈 수 있도록 하는 추가적인 Module
Attention is all you need: Transformer는 RNN 없이
Attention Module만으로도 Encoder - Decoder Model 구현이 가능하다
- Encoder
- Self- Attention
- Decoder
- Masked Self - Attention
- Encoder-Decoder Attention
2. Transformer mdoel에서 sequence를 encoding하는 self-attention Module
Transformer Model에서는 attention 기반의 self-attention module이 encoder, decoder에 사용되는 sequence 자체를 잘 encoding 및 decoding 하는 역할을 수행할 수 있음
- RNN, CNN Model없이 오직 Attention Module만으로 전체 Sequence를 입력 및 출력으로 처리할 수 있는 형태로 model이 동작하게 됨
- 결과적으로 이렇게 Model을 구성했을 때 다양한 task에서 좋은 성능을 내게 되는 결과
- Layer normalization, position encoding, masked self-attention (decoder에 사용)
- NLP, CV, Time Series Prediction, Recommendation System 등 전 분야의 AI Task에 사용되고 있음
RNN을 사용하여 Sequence Data를 처리할 때 문제점: Long-term Dependency Issue (time step간의 차이가 멀 때)
Bottleneck Problem - Forward Propagation: '갈수록 흐려진다'
- 이전 time step들을 정보를 잘 담기 위해서는 이전의 RNN에 걸쳐서 정보가 변질되거나 손실되지 않고 축적되야함
Gradient Vanishing(Exploding) - Backpropagation: '멀수록 잊혀진다'
- Model을 학습하는 과정에서 가장 마지막 time step에서 계산된 hidden state vector가 예측 task에서 필요로 했던 정보가 굉장히 멀리 혹은 이전에 있었던 정보를 소실함으로써 문제점이 나타났다면 학습과정에서 gradient signal을 멀리 있는 time step까지 전달해줘야 함
- 여러 time step에 걸쳐서 gradient 정보가 전달되면서 정보가 변질된다
Seq2Se2 Model with Attention
- 1) Decoder의 각 time step의 hidden state vector를 기준으로
- 2) Encoder의 모든 hidden state vector와 내적하여 유사도를 구하고 거기에 softmax를 취하여 나온 상대적인 합이 1인 형태인 가중치 vector를 구하고
- 3) 각 가중치를 각각의 encoder의 hidden state vector에 반영하여 encoder hidden state vector의 가중합을 attention model의 결과값으로 주어 추가적인 입력으로 설정
- Hidden State Vector & Attention Output을 conatenate한 Vector가 (총 8개의 dimension으로 이루어진 입력 vector) 가 output layer에 input으로 주어짐
Transformer
- 정보를 찾고자 하는 주체와 정보를 꺼내가려고 하는 소스 정보들이 동일시된다
- decoder의 hidden state vector와 encoder의 hidden state vector와의 구분이 없음 (자기자신 내적)
- 주어진 Sequence를 attention model을 통해 encoding할 수 있음
- Sequence data를 encoding할 때 쓰이는 attention module을 Self-Attention이라 한다
3. Scaled Dot-product Attention
Query Vector를 Key Vector들에 내적하여 Attention Score를 구하고
$\sqrt{d_{k}}$로 나눈 후 Softmax에 적용하여 나온 Attention Weight를
Value Vector에 가중치로 사용, 합하여 Attention Output (Hidden State Vector)를 구한다
Query Vector
- Decoder의 특정 time step의 hidden state vector
- 정보를 찾고자 하는 주체
Source Vector
- Encoder의 hidden state vectors (multiple)
- 끌어오려고 하는 소스 정보들
- Query Vector를 각 source information (자기자신 포함)에 모두 내적을 한 후에 유사도를 구한다
- 그 후 softmax를 취하여 합이 1인 가중치 vector를 가중치로 Source Vector에 적용
- Source Vector들의 가중합을 구할 수 있다
- 해당 가중합을 당시 Query Vector로 사용됐던 정보에 대한 Sequence상의 Encoding된 vector로 생각
3가지의 다른 용도로서 같은 vector set이 사용
- Query: Query vector (decoder hidden state vector)로서 사용, 내적 기준이 되는 vector
- Key: Source vector로서 사용, Query vector와 유사도를 구하는 데 사용되는 vector
- Values: softmax에서 나온 가중치를 실질적으로 적용해서 가중합을 구하게 되는 Source vector
Query / (Key, Value) 들은 각각 Query Vector / Source Vector들이 행하는 역할이다
Vector들이 각각의 용도로 사용될 때 Layer의 유연성이나 확장성을 위해 각기의 용도로 사용될 때 Source vector에 그에 맞는 linear transformation layer가 존재한다
- Queries: query vector가 $W^{q}$라는 linear transformation layer를 통과
- Keys: source vector가 $W^{k}$라는 linear transformation layer를 통과
- Values: source vector가 $W^{v}$라는 linear transformation layer를 통과
행별로 전체 sequence를 encoding했을 때 나타나는 hidden state vector를 구하기
Query, Key, Value Vector들은 Row Vector로 인식하여 세로로 쌓는다
- softmax를 취해주게 되면 각 Query에 대해 주어진 단어들을 (row별로) 합이 1인 가중치 vector 혹은 attention weight를 뽑아주게 된다
- 여기에 Value vector를 곱해주면 결과 matrix의 행 vector는 query vector(row vector)를 사용했을 때 value vector들의 attention weight를 사용해서 만들어진 가중평균 vector
- softmax 결과값을 value vector의 가중치로 사용하여 두 개 value vector에 대한 가중평균 vector를 구하기
- 결과 matrix $Z$의 각 Row는 각 Query(단어)에 대응 & 각 query를 잘 encoding했을 때 나오는 output으로서의 hidden state vector이다
- 그게 곧 해당 query 단어에 대한 sequence항을 잘 encoding한 결과 vector가 된다 = hidden state vector가 된다
Matrix Multiplication 해석
- $QK^{T}$: RC(Row-Column 내적) 관점으로 Matrix Multiplication
- $(QK^{T}) V$: RR(Row-Row 분배) 관점으로 Matrix Multiplication
Attention Score -> Attention Weight -> Attention Output(Hidden State Vector)로 사용
- $\sqrt {d_{k}}$: key vector의 dimension (row 개수) = query vector의 dimension (column 개수)
- $d_{k}$가 커질수록 더 많은 개수의 숫자들의 합이 내적값으로 반환 = 고차원 벡터의 내적값들이 확률분포에서의 분산 값이 더 크다
- softmax의 결과가 값이 크면 클수록 지수함수적으로 더 큰 값으로 mapping을 시켜주기 때문에 전체 확률 분포가 하나의 값에 100%의 확률이 몰리게 된다 = 하나의 단일한 peak을 가지게 된다
- 학습의 측면에서 gradient가 잘 흐르지 않는다
- $d_{k}$가 의도치 않게 softmax의 입력으로 사용되는 logit vector의 분산 값에 영향을 주는 만큼 그 영향을 없애기 위해서 $\sqrt {d_{k}}$로 나누어줌으로써 일정한 분산 값을 가지도록 하는 추가적인 장치를 만들어준다
4. Multi-head Attention
Encoding된 Hidden State Vector를 구하는 것
- 다양한 기준과 정보를 바탕으로 sequence를 encoding한 형태로 확장
- attention을 여러 개의 linear transformation set을 사용해서 attention을 수행한다 = 여러 개의 head를 가진다
- scaled-dot product 기반의 self-attention module을 다양한 형태로 확장한 Multi-head Attention
- Sequence encoding을 할 때 어떤 기준으로 유사도 및 attention weight를 구하고 어떤 기준으로 value vector를 만들지를 결정하는 세 개의 선형변환의 matrix $W^{q}, W^{k}, W^{v}$를 여러 개의 set를 둔다
- 각각의 set을 통해 변환된 query, key, value vector들을 사용해서 attention model을 통해 sequence의 각 단어들을 encoding
- 그 다음에 각각의 set에 선형변환을 사용해서 나온 attention model의 output들을 concat하는 형태로 정보를 합침
- 각기 서로 다른 기준으로 encoding한 self-attention module의 output vector들을 concatenation 처리
- concat을 할수록 dimension이 점차 커지게 된다
- 그런데 encoding하고 나서의 hidden state vector를 내가 원하는 dimension으로 encoding해주기 위하여 최종적으로 각각의 head별로 나온 attention model의 output vector를 추가적인 linear transformation을 더 거쳐서 원하는 dimension으로 변환
각 Set의 Attention Output Matrix는 각 단어가 Row Vector 형태로 저장이 되어있으므로,
Concatenation은 가로방향으로 이루어져야 계속 각 Row를 Sequence(단어)로 해석가능하다
long-term dependency 문제를 해결
- 각각의 단어들이 query로 사용되어 전체 sequence에 존재하는 각 단어들의 유사도를 구하고 거기서 유사도가 높은 단어를 단어의 time step 간의 차이에 무관하게 해당 정보를 직접적으로 꺼내갈 수 있기 때문
- 단어들의 time step간의 차이와 상관없이 Encoding된 Hidden State Vector를 구할 수 있다
Memory 요구량이 높다는 단점
- self-attention model의 핵심 수식에서 $QK^{T}$ 각각의 모든 query vector와 key vector간의 내적을 하게 될 때 주어진 입력 sequence의 단어가 늘어날수록 $QK^{T}$의 가로, 세로 길이 size가 결국 sequence의 길이가 되고 늘어난다
- 행렬을 계산하고 저장하는 과정에서 sequence 길이의 제곱만큼의 memory size가 필요하게 된다
5. Block-Based Model
- 화살표 3개 중 가장 오른쪽은 query vector, 왼쪽 두 개는 key vector & value vector
- Multi-head Attention의 input vector와 output vector(각 input에 대해 encoding된 vector)는 동일한 차원을 가진다
- residual network에서 나온 skip connection을 사용하기 위함
- ResNet (Residual Network)
- Layer를 추가하여 깊게 쌓았을 때 task를 위해 도움이 되는 순기능을 할 수 있다
- 다만 초반에는 random initialization에서 시작하는 수많은 parameter들이 순기능을 내기까지 많은 시간이 걸릴 수 있다
- Layer를 필요할 때 건너뛸 수 있는 skip connection
- 이전에 Deep Learning Layer들이 만들어낸 중간 결과물을 Input $x$으로 넣었을 때 Layer들의 Output $F(x)$이 나옴
- 해당 Output $F(x)$에다 입력을 $x$를 같이 더하는 식으로 최종 Output $F(x)+x$ 을 구성
- Skip을 하고 싶다면 $F$ 라는 layer 내의 parameter들을 거의 다 0으로 학습을 하면 됨
- 만들고 싶은 출력물은 입력 $x$ 대비 얼마만큼을 $F(x)$ 더할지 빼줄지 해당 차이 값만을 추가적인 Layer에서 만들어 주면 된다
- 즉, Layer의 역할은 입력 대비 해당 입력이 추가 혹은 제거할 값 $F(x)$만을 만들어주면 된다는 의미에서 Residual (나머지 값)
Add & Normalization
- Add: 화살표가 각 vector들을 encoding된 hidden state vector에 더해준다는 의미 (입력 벡터를 출력 벡터에 더해준다)
- Norm: Batch Norm과 비슷한 역할을 하는 normalization layer가 하나 더 추가된다
Layer Normalization
- 각 단어에서 발견한 특정한 dimension으로 이루어진 vector의 각 원소들을 모아서 한 단어 내의 평균과 분산을 구하게 된다
- 각 단어 내에서 발생한 네 개의 노드로 이루어진 vector 각각의 원소 값을 정규화 진행 (평균 0, 분산 1)
- 원하는 평균을 주입하기 위해서 affine transformation을 수행 ($y = ax+b$ 형태의 변환)
- 학습을 안정화시키고 성능을 향상시키는 효과
Fully-Connected Layer를 거쳐서 나온 Vector에 skip-connection을 이용하여 Input Vector를 더해주고 Layer Normalization을 거친 후 최종 Encoding된 Hidden State Vector가 주어진다
- Encoder 부분에 $N x$라고 표시된 부분은 Block 자체가 N번에 걸쳐서 DL에서 layer를 쌓듯이 network가 구성된다
- N번 layer를 쌓았을 경우 N번 이후에 최종적으로 나오는 vector는 dimension이 skip connection에 의해 동일하지만 N번의 self-attention block에 의해 입력 sequence의 각 단어별로 encoding된 hidden state vector가 최종적인 encoder의 output으로 얻어지게 된다
6. Positional Encoding
self-attention 기반의 sequence encoding이 각 단어의 순서 혹은 위치를 구분할 수 있는 능력 부여
- 특정한 순서로 입력 vector를 set으로 주었을 때, self-attention을 통해 각각의 단어를 encoding한 hidden state vector를 얻는다
- 동일한 단어들을 순서만 바꿔서 동일한 self-attention block를 통과하여 나오는 encoding된 hidden state vector들은 동일 단어에 대한 query, key, value vector들은 동일하다
- 즉, self-attention module을 적용할 때 vector들의 순서와 상관없이 (가중평균을 구할 때 덧셈은 교환 법칙이 성립) & 단어를 encoding할 때 전혀 영향을 주지 못한다 -> 순서를 구분하지 못하는 self-attention model의 단점
각 단어의 input vector에 몇 번째 순서로 나타났다라는 정보를 주입 = position encoding이라는 부분
- 특정 입력값(x)을 기준으로 각 그래프 상의 함수값(y)을 읽음
- 해당 함수 값을 원소로 하는 하나의 vector를 만들고 해당 vector를 특정 단어의 input vector와 더해준다
- 같은 단어가 주어졌어도 순서 (time step)에 따라 sin, cos 함수 값은 분명 다른 값을 가지므로 순서에 따라 서로 다른 vector로 구분이 된다
- 사전에 정의된 서로 다른 주파수 성분을 가지는 sin, cos함수를 사용할 수 있지만, position encoding 자체도 특정 task나 loss function 기반해서 자체적으로 학습 및 최적화를 수행하는 경우도 존재
7. Encoder Self-attention Visualization
- Self-attention 기반으로 sequence encoding을 하고 이를 바탕으로 기계 번역 task를 학습했을 때 학습된 attention module의 pattern이 어떻게 나타나는지 분석
- making이라는 단어를 query로 사용하여 단어를 encoding할 때 주로 큰 가중치가 부여되는 혹은 큰 attention weight값을 가지는 단어들이 목적어나 목적 보어에 해당하는 단어들임
- Multi-head Attention을 이용하여 its라는 query를 encoding할 때는 첫번째 head에서 Law에 큰 가중치를 부여했고, 두 번째 head는 its가 한정시키는 application이라는 단어에 강한 attention 가중치를 가함
- 주어진 입력 sequence내에서 다른 기준으로 필요로 하는 정보를 잘 가져가서 통합한 방식으로 multi-head self attention이라는 model이 동작하는 것을 알 수 있음
8. Decoder
- Encoder의 self-attention block을 N번 반복해서 최종적으로 encoding된 hidden state vector를 encoder의 output으로 얻게 됨
- Decoder의 첫번째 time step에 입력으로 주어지는 단어는 start of sentence token일 것이고, 이후 time step마다 input 단어마다 번역해준 후에 마지막에는 end of sentence token 까지 예측하는 autoregressive한 형태로 decoder가 동작
- Character-level modeling처럼 Decoder의 각 time step에 예측하고자 하는 입력 문장의 처음 부분을 순차적으로 주게 됨
- Self-attention module을 사용해서 sequence를 encoding
Masked Self-attention
- attention 가중치 vector는 $QK^{T}$ matrix의 row vector(query)를 기준으로 column vector(key)와의 유사도를 원소로 가진다: Row = Query, Column = Key
- 이 과정에서 다음 time step에서 나타날 입력 단어에 가중치를 많이 부여하면 (특정 query에 대해 원하는 key와의 내적값을 높게 setting해버리면) 다음 단어를 쉽게 예측할 수 있는 cheating의 문제가 발생
- 따라서 Decoder에서의 self-attention block은 masking 연산을 사용함
- 각 query(row vector)를 기준으로 그 다음 time step에 나타나는 단어들을 보지 못하도록, 특정 decoder time step에서는 그 단어를 포함해서 그 이전에 나타난 단어들만을 encoding할 수 있도록 setting
- 각 query 단어 다음에 나타나는 단어에 해당하는 attention weight 혹은 softmax 입력으로 주어지는 logit 값을 $ -\infty$ 로 대체
Decoder에서 Query를 사용하여 주어진 Sequence를 Encoding할 때는
이전의 time step에 해당하는 단어만을 보고 Encoding하게 된다
결국 $QK^{T}$에 scaled dot product 그리고 softmax를 취했을 때
Attention Weight을 이후 time step에 나타나는 단어의 가중치를 0으로 encoding
Encoder-Decoder Attention
- Seq2Seq Model with attention model에서 3번째 module이었던 attention block에 해당
- decoder time step에서 Encoding된 hidden state vector들이 query로 주어짐
- 기존의 self-attention module에서 같은 vector set가 query, key, value 모두로 쓰였던 것과 달리 여기서의 key value들은 encoder hidden state vector를 입력으로 줌
- decoder time step의 hidden state vector가 encoder hidden state vector들에서 필요로 하는 정보들을 잘 적절하게 가져갈 수 있도록 하는 기존의 Seq2Seq model의 attention block의 역할을 여기서 수행
- 최종적으로 나타난 decoder의 hidden state vector들에다가 추가적인 linear layer 및 softmax layer를 통과시켜서 각 time step에서 다음 단어로 나타날 단어를 예측하게 됨
- 처음에 최초로 적용된 task는 기계 번역 task였고, 여기서 기존의 Seq2Seq with attention와 같은 RNN 기반 그리고 CNN 기반의 Sequence를 encoding하는 model들보다 더 좋은 성능을 나타냄
- 좋은 성능을 나타나게 된 원인은 근본적으로 long-term dependency 문제를 해결했기 때문
- Transformer Model은 자연어 처리 모델 뿐만 아니라 많은 도메인으로 확장되어 좋은 성능을 내고 있음
- Transformer에서 제한된 layer 수를 더 많이 늘리되 제한된 block 그 자체의 설계 혹은 디자인은 그대로 계승하는 식으로 model size는 늘리되 self-supervised learning이라는 task를 이용하여 굉장히 대규모 data로 학습한 사전 학습 모델들이 NLP에서 두각을 나타내고 있음
- Decoder 파트는 학습인 각 time step에 있는 단어들을 한번에 예측하는 형태로 동작하지만 학습이 다 된 후에 inference time에서는 autoregressive model의 제약조건에서는 벗어나지 못한다