각각의 두 sub layer를 중심으로 residual connection을 사용한 후, layer normalization 사용
결국 이 두 sub-layer의 output은 ? : LayerNorm(x+Sublayer(x))
residual connection을 위해서 output dimension을 dmodel=512로 통일 !
이렇게 각각의 인코딩에다가 feed forward를 취한게 point-wise fully connected layer인듯? → input 노드를 512로 취했으니 multihead attention에서 나온 input을 그대로 받아서 합쳐주는 역할인듯 !
Decoder
decoder 또한 N=6개의 동일한 layer의 stack으로 구성
디코더는 3개의 sub-layer로 구성되어 있으며, encoder의 output에 MHA을 수행
첫번째 sub-layer : Masked Multi-Head Attention.
두번째 sub-layer : Encoder와 Decoder 간의 Multi-Head Attention
세번째 sub-layer : Point-wise Feed-forward Network
인코더랑 비슷하게 각각의 레이어에 residual connections를 수행하며, 그 후 layer-normalization 수행
그리고 decoder stack에 position이 subsequent position으로 이동하는 것을 막기 위해서 self-attention 수정
이것을 masking이라고 함 !
i번째보다 앞에 있는 position만 참조하게 해서 예측을 수행하도록 함
3.2 Attention
Attention 함수는 query 및 key-value pair 세트를 output에 매핑하는 것으로 설명할 수 있으며, 여기서 query, key, value 및 output은 모두 벡터
output은 value의 weighted sum으로 계산되며, 각 값에 할당된 weight는 해당 key와 query의 compatibility function에 의해 계산됨
compatibility funtion이라는게 key랑 query가 softmax 거치고 나서까지의 과정을 말하는 듯 = 가중치를 계산하는 과정
3.2.1 Scaled Dot-Product Attention
특정한 attention을 “Scaled Dot-Product Attention”이라고 부른다.
input은 query와 차원 Dk의 key와 차원 Dv의 value로 구성.
key로 query와 dot product를 계산 → 각각을 dk로 나눔 → 소프트맥스 함수를 적용 → 값의 가중치 획득
Additive attention 보다는 dot-product Attetion이 더 빠르고, 공간 효율적(space-efficient)
작은 dk의 value를 가지고 있으면 Additive나 dot-product나 비슷한데 만약 큰 dk의 value를 가지고 있는데 dk 의 scaling을 안해준다면, additive가 성능이 훨씬 좋다.
큰 dk에 대해서는 dot product가 커지기 때문에, softmax 함수를 극도의 적은 gradients로 밀어낼 것 → 그래서 dk 로 나눠줌
dk 로 나눠주는 이유
- Query 벡터와 Key 벡터의 각각 원소의 값을 평균 0, 분산 1을 가지는 확률변수라고 하자
![Untitled](https://prod-files-secure.s3.us-west-2.amazonaws.com/3dbf94fa-5256-425e-8805-b9afd8dc7bcc/8be89593-a6be-4fb1-89f3-b8112f9cfbc3/Untitled.png)
- 그러면 Query 벡터와 key 벡터를 내적한 값의 평균과 분산은 어떻게 될까?
- 평균 : 전체 평균이 0이므로 내적값의 평균도 0
- 분산 : a와 x가 통계적으로 독립이고 분산이 1인 확률변수가 곱해지면 분산 1, b와 y도 마찬가지 ! → 1+1 = 2
- 만약 query 벡터와 key 벡터의 차원이 100이고 각각의 벡터의 원소가 통계적으로 독립이고, 평균이 0, 분산이 1이라면?
- 평균 : 0, 분산 : 100
- 분산의 차원이 커질수록 softmax를 통과했을 때, 확률 분포가 큰 값으로 확률이 쏠리는 현상이 발생 → 역전파 할 때, gradient vanishing 문제 발생
- 내적 값의 분산을 1로 유지시켜서 학습 안정화
3.2.2 Multi-Head Attention
dmodel 차원의 key, value, query에 대해 single attention function을 수행하는 대신, 학습된 다양한 linear projection을 통해 query, key, value를 각각 dk, dk, dv 차원에 linear projection 하는 것이 유리하다는 것을 발견
query, key, value에 대해서 Attention을 병렬로 수행 → dv 차원 output을 산출
그리고 그걸 열방향으로 concat한 다음, 다시 한번 projection
만약에 head가 8이라고 하면(h=8) =, dk=dv=dmodel/h=64 로 사용
이렇게 각각의 head로 차원을 줄였기 때문에, 계산 비용은 single-head attention과 비슷함
혁펜하임 PPT
3.2.3 Applications of Attention in our Model
multi-head attention은 3가지 방법으로 사용할 수 있다.
“encoder-decoder attention”에서 query는 이전 decoder layer에서 나오고, key와 value는 encoder의 output에서 나온다.
이를 통해 decoder의 모든 position에서 input sequence의 모든 position에 대해 어텐션을 수행할 수 있게 된다.
시퀀스 투 시퀀스 모델에서 일반적으로 볼 수 있는 인코더-디코더 어텐션 메커니즘을 모방
encoder는 self-attention layer들이 포함되어 있다.
self-attention layer에서 모든 key, value, query들을 동일한 위치에서 가져오는데, 이 경우 encoder의 이전 layer의 output이다.
encoder에서 각 position들은 encoder의 이전 layer에서 모든 position들에 attention 할 수 있다.
즉, Attention을 계산하는 데 사용되는 "키(keys)", "값(values)", 그리고 "쿼리(queries)"는 모두 이전 층의 출력에서 나온 것
비슷하게, decoder의 self-attention layer는 해당 위치를 포함한 decoder의 모든 position에 Attention을 할 수 있게 한다.
decoder에서는 auto-regressive feature를 보존하기 위해 decoder 내에서 왼쪽방향(오른쪽 → 왼쪽) 정보 흐름을 방지해야 한다.
auto-regressive : 이전에 생성된 출력을 현재의 입력으로 사용하여 시퀀스를 한 단계씩 생성
이를 위해 scaled dot-product Attention 내에서 softmax의 입력 중 부적절한 연결에 해당하는 모든 값을 마스킹(−∞로 설정)하여 왼쪽 방향으로의 정보 흐름을 방지
3.3 Position-wise Feed-Forward Networks
attention sub-layers에 더하여, 인코더와 디코더 각 레이어는 각 위치에 독립적으로 동일하게 적용되는 완전히 연결된 피드포워드 네트워크를 포함하고 있다.
이 네트워크는 ReLU 활성화 함수가 있는 두 개의 linear transformations으로 이루어져 있다.
그냥 fully connected 2번 통과한 것 !
max(0,xW1+b1) 이건 그냥 ReLU
linear transformations은 서로 다른 위치에서 동일하지만, layer 간에는 다른 매개변수를 사용
입력과 출력의 차원은 dmodel=512, 내부 layer의 차원은 dff=2048
3.4 Embeddings and Softmax
학습된 임베딩을 사용하여 input token과 output token을 dmodel의 vector로 변환
그리고 linear transformation과 softmax를 사용해 decoder의 output을 다음에 올 token의 확률로 변환
두 embedding layer와 pre-softmax linear transformation 간에 동일한 가중치 행렬을 공유
GPT 가라사대…
파라미터 공유로 학습 효율성 향상
임베딩 레이어 간 정보 공유
입력과 출력 간에 공유된 가중치를 사용하면 모델이 서로 다른 위치에서 나타난 단어 간에 일종의 유사성을 학습
3.5 Positional Encoding
우리 모델은 recurrence와 conv가 없기 때문에, sequence의 tokens의 위치를 반드시 알려줘야 함 !
positional encodings라는 것을 encoder와 decoder stack 아래에 있는 input embedding에 넣어줌 ! (더해준다 / 참조 링크)
positional encoding은 dmodel과 차원 동일 !
pos는 단어 위치 : 예를 들어서 0번째 단어라고 하면 pos는 0 !
i는 dimension : 만약 dimension이 512라고 하면 i는 256까지 !
그러니까 만약 한 문장에 50까지 단어가 있고, 0번째 단어에 대한 positional encoding을 구하려고 한다면 ? → 0번째 단어는 512개 만큼
혁펜하임 PPT
헷갈리는 것
그럼 input embedding에서는 어떻게 들어가는데?
token 처리된 단어 각각을 input embedding으로 처리해서 dmodel 차원의 임베딩 얻음
그 임베딩에 position embedding을 더해줌
4. Why Self-Attention
왜 self-attention을 수행했는지에 대한 4가지 이유
각각 layer의 전체적인 계산 복잡도 때문
필요한 sequential operations의 최소한의 수로 병렬화할 수 있는 계산량
네트워크에서 long-range dependency 사이의 경로 길이
dependency에 영향을 미치는 것 중 하나 → 신호가 forwar와 backward로 이동해야 하는 길이
입력 및 출력 시퀀스의 각 위치 간의 경로가 짧을수록 (즉, 신호가 짧은 거리를 이동할수록) 장거리 종속성을 학습하기가 더 쉽다
이는 네트워크에서 정보가 더 빨리 흘러가고 연관성 있는 신호를 빠르게 학습할 수 있게 되기 때문
서로 다른 레이어 유형으로 구성된 네트워크에서 입력과 출력 위치 간의 최대 경로 길이를 비교함으로써 이러한 아이디어를 평가
Attention Distribution을 히트맵 형태로 시각화하여 좀 더 해석가능한 모델이 될 수 있다.
self-attention vs Recurrent
Self-attention 레이어는 모든 위치를 일정한 수의 Sequential Operation
Recurrent는 O(n)의 Sequential Operation이 필요
계산 복잡도 측면에서, n이 d보다 작을 때 self-attention 레이어가 Recurrent 레이어보다 빠름
Self-Attention for Long Sequences
매우 긴 시퀀스를 다루는 작업의 계산 성능을 향상시키기 위해, self-attention은 출력 위치를 중심으로 입력 시퀀스의 크기가 r인 근처만 고려하도록 제한할 수 있다. (restricted)
이렇게 하면 최대 경로 길이가 O(n/r)로 증가
O(n/n) → O(n/n)이기 때문에 O(n/r)이 증가한 것이 맞음 ! r는 n보다 작기 때문에
5. Training
5.1 Training Data and Batching
문장 쌍은 대략적인 시퀀스 길이에 따라 일괄 처리됨 → 시퀀스 길이보다 짧은 경우, PAD 처리
각 training batch에는 약 25000개의 source token과 25000개의 target token의 문장 쌍이 포함됨
학습데이터
English-German dataset
standard WMT 2014 English-German dataset consisting of about 4.5 million sentence pairs
English-French dataset
we used the significantly larger WMT 2014 English-French dataset consisting of 36M sentences and split tokens into a 32000 word-piece vocabulary