지난 글에서 Transformer의 핵심적인 Building Block인 Attention을 정리해봤습니다. 이어서 Vaswani et al. (2017) 논문을 통해 현재 나오는 수 많은 모델의 기반이 되고 있는 Transformer를 차근차근 이해할 수 있도록 정리해보았습니다.
Transformer에서 사용하는 Attention을 다룬 지난 글에 이어 이번에는 Transformer의 Encoder가 어떻게 구성되었는지 정리해보겠습니다.
Transformer의 전체 구조
Transformer는 Encoder, Decoder Layer가 Attention과 Feed-Forward Network로 구성된 Encoder-Decoder 구조를 따르고 있습니다. Transformer를 이해하는데 가장 병목이 되는 부분은 Multi-Head Attention이라고 생각합니다. 단어에서 유추할 수 있듯이 Attention이 여러 개라는 의미 같은데요 🤔 곧바로 Multi-Head Attention을 이해하는 방법도 있지만 우선은 Encoder Layer가 하는 일의 전체적인 모습을 보기 위해 하나의 Attention(Single-Head Attention)을 이용할 때 입력값이 Encoder Layer를 통과하는 모습을 살펴보겠습니다.
Encoder with Single-Head Self Attention
Single-Head Attention을 이용했을 때 입력값이 하나의 Encoder Layer를 통과하는 모습을 그림으로 표현하면 위 그림과 같습니다. 그림을 보면 생각보다 복잡한 부분이 없다는 것을 알 수 있습니다. 그럼 본격적으로 Encoder Layer를 구성하는 요소들을 하나씩 확인해보겠습니다.
Single-Head Self Attention
Encoder Layer의 첫번째 요소는 입력값들 사이의 연관성을 고려하여 각 입력값의 새로운 Representation을 얻는 Self Attention입니다. 이름에 왜 Self라는 접두어가 붙었는지는 Attention에 들어가는 Query, Key, Value를 확인해보면 알 수 있습니다.
- Query: 모든 입력 벡터
- Key: 모든 입력 벡터
- Value: 모든 입력 벡터
Query, Key, Value가 모두 입력 벡터인 Attention은 입력된 값들 사이의 연관성을 파악할 것입니다. 입력된 값들과 입력된 값들 사이의 연관성을 파악하기 때문에 Self라는 접두어가 아주 적절해보입니다. 그럼 다음으로 Self Attention이 어떻게 계산되는지 구체적으로 살펴보겠습니다.
Calculate Query, Key, and Value
위에서는 Query, Key, Value를 입력 벡터라고 표현하였지만 실제로는 입력 벡터와 학습 가능한 행렬 $W^Q, W^K, W^V$을 곱하여 Query, Key, Value를 얻습니다.
$$\begin{align}q_i={x_i}W^Q\\k_i={x_i}W^K\\v_i={x_i}W^V\end{align}$$
Calculate Attention Value
이전 글에서 다룬 Scaled Dot-Product Attention Score를 이용하여 각 입력값의 Attention Value를 계산합니다.
Residual Connection
Reshaping
입력값과의 Residual Connection가 가능하도록 Attention Value를 학습 가능한 행렬인 $W_O$와의 행렬곱을 통해 $\mathbb{R}^{d_{model}}$로 Linear Transform 해줍니다.
$$o_i={a_i}W^O$$
Add and Layer Normalization
입력값 $x_i$와 $o_i$를 더한 후 Layer Normalization을 진행합니다. 이 때 Layer Normalization은 입력값이 $x_i\in\mathbb{R}^{d_{model}}$이고, 평균이 $\mu_i$, 분산이 $\sigma_i^2$일 때
$$\hat{x}_{i,k}=\dfrac{x_{i,k}-\mu_i}{\sqrt{\sigma_i^2+\epsilon}}$$
$$\text{LayerNorm}({x_i})=\gamma\hat{x}_i+\beta\;\text{,where }\gamma,\;\beta\in\mathbb{R}^{d_{model}}$$
와 같이 진행됩니다.
Point-wise Feed-Forward Network
인덱스 별로(Point-wise) Feed-Forward Network를 통과시켜줍니다. 이 때 네트워크 내에서는 두 번의 선형 변환과 한 번의 활성화 함수 변환이 이루어집니다.
Residual Connection
Point-wise Feed-Forward Network의 입력값과 출력값을 더 해준 후 다시 한 번 Layer Normalization을 진행합니다.
Vector-to-Matrix
Transformer는 RNN과 같이 순차적인 연산이 필요하지 않습니다. 위 설명에서도 순서를 고려하는 부분은 없었지요. (순서가 있는 데이터를 모델링하는데 순서를 고려하지 않으면 문제가 생기지 않을까하는 의문은 이어지는 글에서 해소됩니다 🙂) 따라서 벡터를 행렬로 묶어 연산을 하면 GPU를 통해 행렬 연산을 병렬 처리할 수 있기 때문에 연산 속도의 증가를 이뤄낼 수 있습니다. 이 글에서 설명한 과정을 행렬로 표현하면 다음 그림과 같이 표현할 수 있습니다.
잘못된 내용, 오타, 부정확한 문장 등 어떤 피드백이든 환영합니다. 감사합니다.
References
- Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30. [Link]
- https://jalammar.github.io/illustrated-transformer/
'Data Science > Maching Learning' 카테고리의 다른 글
차근차근 이해하는 Transformer(4): Masked Multi-Head Attention과 Decoder (2) | 2022.05.09 |
---|---|
차근차근 이해하는 Transformer(3): Multi-Head Attention과 Encoder (0) | 2022.05.06 |
차근차근 이해하는 Transformer(1): Scaled Dot-Product Attention (2) | 2022.05.02 |
[DL] 쉽게 풀어쓴 Attention Mechanism (2): Luong Attention (0) | 2022.04.27 |
[DL] 쉽게 풀어쓴 Attention Mechanism (1): Bahdanau Attention (2) | 2022.04.23 |