본 게시물은 LG aimer 커리큘럼에 수록된 주재걸 교수님과 강필성 교수님의 강의 자료를 포함하고 있습니다.
Transformer architecture
Transformer: Solving Long-term Dependency Problem

transformer의 구조를 본격적으로 설명하기에 앞서 장기의존성 문제에 대해 잠깐 설명하겠습니다. 장기의존성 문제는 은닉층의 과거 정보가 마지막까지 전달되지 못하는 현상을 의미합니다. transformer모델은 attention module을 사용해서 sequence data를 encoding할 때 특정 time step에서 먼 과거 혹은 가까운 과거 정보에 빠르게 접근해 장기 의존성 문제를 해결한 것으로 유명합니다.
Architecture

- Attention module은 Seq2Seq with attention 모델에서 인코더와 디코더의 역할을 수행했습니다.
- RNN 혹은 CNN을 사용할 필요 없이 attention modlue만 사용해도 충분하다는 뜻입니다.
Transformer는 Attention의 병렬적 사용을 통해 효율적인 학습이 가능한 구조의 언어 모델입니다. 화살표 왼쪽 도식에서 Multi head attention을 볼 수 있는데 이는 Attention 모듈을 병력적으로 사용했음을 나타냅니다. 또한 내부에 encoder 파트와 decoder 파트가 존재하며 이 둘 사이를 이어주는 연결고리가 존재합니다. 화살표 오른쪽 그림에서 볼 수 있듯이 encoder는 단계적으로 정보를 받고 decoder는 단계 별, encoder로부터 정보를 전달받습니다.
Transformer에는 self-attention이라고 불리는 핵심 아이디어가 존재합니다. self-attention은 여러 벡터들을 생성하고 내적하는 기존 attention과는 살짝 차이가 있습니다. 서로 다른 vector 뿐만 아니라 자기 자신과도 내적하기 때문에 self-attention이라고 불립니다. 정보를 찾는 주체와 필요한 정보를 가져오는 source 정보들이 동일하기 때문에 self라는 말이 붙은 것 같습니다. 이처럼 self-attention은 transformer model에서 sequence를 encoding하는 가장 핵심 model입니다.
Input embedding
transformer는 개별 단어에 대한 embedding vector를 최초 입력으로 사용합니다.

- 단어 임베딩은 가장 아래에 위치한 encoder에서만 입력으로 1회 사용됩니다.
- 나머지 인코더들은 하위 인코더에서 출력된 결과물을 입력으로 사용합니다. 해당 논문에서는 6개의 encoder를 사용했습니다.
- 최초 논문에서는 512차원의 임베딩을 사용했습니다.
- 입력으로 사용되는 리스트는 사용자가 지정하는 하이퍼파라미터로써 컴퓨팅 자원이 충분하다면 큰 값을 지정할 수 있습니다.
Positional encoding

Transformer의 장점은 모든 단어를 병렬적으로 입력받아 빠른 연산을 자랑한다는 것입니다. 이 때, 한 가지를 유의해야 합니다. 문장과 같은 sequence data는 각 단어의 순서가 중요합니다. 단어가 뒤죽박죽 섞이면 문장을 이해할 수 없으니까요. 그래서 과거에 많이 쓰이던 RNN 계열 모델의 경우 앞 단어부터 순서대로 입력되었습니다. 하지만 transformer처럼 병렬적으로 단어를 입력 받는다면 입력 시퀀스에서 단어들 간의 위치 관계를 표현해줄 필요가 있습니다. 이러한 역할을 수행하도록 설계된 vector를 positional encoding이라고 하며, 모든 단어 embedding에 positional encoding을 더해서 input vector를 구성합니다. positional encoding을 통과한 embedding은 time signal을 갖게 됩니다.
Self - Attention

먼저 'I', 'go', 'home' 세 단어가 embedding을 한 후 positional encoding을 거쳤다고 가정하겠습니다. 세 단어의 vector를 각각 $x_1$, $x_2$, $x_3$ 라고 하겠습니다. 우리는 세 개의 input vector를 통해 query, key, value라고 불리는 세 종류의 vector를 생성하게 됩니다. 단어의 개수와 상관없이 생성하는 vector의 종류는 3개로 고정입니다. 연산 흐름을 이해하기 전에 세 종류의 vector를 좀 더 구체적으로 이해해보겠습니다.

- Query: 다른 단어들을 고려하여 표현하고자 하는 대상이 되는 현재 단어에 대한 embedding vector. 어떤 단어가 다른 단어들하고 무슨 관계가 있는지를 알고 싶은 질의 대상이 되는 단어.
- Key: Query가 들어왔을 때 다른 단어들과 매칭을 하기 위해 사용되는 레이블로 사용되는 embedding vector.
- Value: Key와 연결된 실제 단어를 나타내는 embedding vector.
각 vector가 어떤 역할을 하는지 알아봤다면 다음으로 vector간 연산 과정에 대해 알아보겠습니다.
- $x_1$ vector에 $W_{}^{Q}$ 선형 변환을 취하게 되면 $q_1$이라는 query vector가 만들어집니다. $x_1$은 $W_{}^{K}$, $W_{}^{V}$ 선형 변환을 거쳐 각각 key vector들과 value vector들을 만듭니다.
- query vector와 key vector가 내적을 통해 유사도를 구합니다. 위 그림에서 유사도는 3.8, -0.2, 5.9가 계산되었습니다.
- 유사도가 softmax 함수를 통과하면 0~1 사이의 가중치가 나오게 됩니다. 이 가중치들은 value vector와 내적을 통해 최종 $h_1$이 됩니다. $x_2$가 query vector가 되면 $h_2$가 나올 것이고, $x_3$가 query vector가 되면 $h_3$가 나올 것입니다.
여기서 자세히 보면 ‘I’라는 단어가 query vector일 뿐만 아니라 key vector, value vector가 되는 것을 볼 수 있습니다. 내가 누구와 비슷한지 알기 위해 나 자신도 참고하는 것이라고 생각하시면 됩니다. 따라서 self-attention, 즉 자기 자신도 참고하는 방법이 만들어지게 됩니다. 자기 자신을 참고하면 당연히 그 단어의 가중치가 가장 높게 나올 것 아니냐고 생각하실 수 있는데 이를 방지하기 위해 서로 다른 선형 변환을 거치고, 내적하고, softmax 함수까지 통과시켜 비선형적으로 복잡하게 만들기 때문에 그런 일은 일어나지 않습니다.

세 종류의 vector간 연산을 좀 더 구체적으로 설명해보겠습니다. query vector와 key vector를 곱할 때는 먼저 key vector를 역행렬로 만든 후 곱해줍니다. 이 때 $\sqrt{d_k}$로 나눠줍니다. 만약 key vector의 차원의 크기가 너무 크다면 softmax 함수를 통과할 때 몇 개의 값들이 비정상적으로 커져 다른 값들을 충분히 반영하지 못해 기울기가 소실될 수 있습니다. 이를 방지하기 위해 $\sqrt{d_k}$로 나눠주는데 이를 scaled dot-product attetion이라고 부릅니다.
softmax 함수를 통과하고 value vector까지 곱해 최종 hidden state vector를 구할 수 있습니다. $h_t$의 첫 번째 행 vector는 첫 번째 query vector를 사용했을 때 구해진 attention weight을 사용해서 만들어진 가중평균의 최종 vector입니다. 해당 query 단어에 대한 sequence 항을 잘 encoding한 결과 vector입니다. 이는 앞 장에서 'thinking'이 query vector로 사용됐을 때 나타나는 hidden state vector입니다.

마지막으로 단어가 embedding을 거쳐 최종 attention의 $h_t$로 계산되는 과정을 설명하겠습니다.
- Embedding 된 단어 vector로 query, key, value vector를 만듭니다.
- query vector와 key vector를 내적하고 key vector의 차원에 루트를 씌운 값으로 나눠줍니다.
- 내적 값을 softmax에 통과시킨 후 value vector와 곱해 최종 vector를 hidden state vector를 만듭니다. $z_1$은 'Thinking'을 query vector로 사용했을 때 얻은 hidden state vector입니다.
Multi-head Attention

Transformer에는 위에서 설명한 scaled dot-product attention이 한 층에 여러 개 존재합니다. 우리는 이를 multi-head attention이라고 부릅니다. Attetion이 한 개만 존재한다면 단어들은 한 가지 방법으로만 서로 상호작용할 것입니다. 하지만 Multi-head attention을 통해 한 query token에 대해서 다양한 관점으로 표현할 수 있는 능력을 제공할 수 있습니다. 이를 통해 여러 단어를 동시 다발적으로 attention할 수 있습니다.
Multi-head라고 부르는 이유는 한 layer 내에서 sequence attention 모듈을 사용할 때 선형 변환 set를 여러 개 두어서 attention model의 output을 concat 하는 형태로, sequence를 encoding하는 형태로 확장했기 때문입니다.

위와 같이 여러 개의 선형 변환 set로 여러 개의 query, key, value vector들을 만들 수 있습니다. 이를 통해 attention head도 여러 개 만들 수 있습니다.

앞서 구한 한 단어에 대한 여러 hidden state vector를 옆으로 나열(concat)한 후 원하는 차원 크기로 linear transformation을 거쳐 최종 hidden state vector를 구합니다.
- 장점: 각각의 단어들이 query로 사용되서 전체 sequence에 존재하는 각 단어들의 유사도를 구하고 유사도가 높은 단어를 어떤 time step에서도 사용할 수 있습니다.
- 단점: 높은 메모리 요구량, 모든 key vector와 query vector 간에 내적을 하게 되면 주어진 입력 sequence의 단어가 많아져 sequence 길이의 제곱만큼 메모리가 필요합니다.

Transformer model은 몇 개의 block으로 구성된 모델입니다. 각 layer는 앞서 설명한 Multi-Head Attention 뿐만 아니라 다음 두 개의 sub layer로 구성됩니다.
- Multi-Head attention
- Two-layer feed-forward NN with Relu
각 Attention block에서는 Residual connection과 layer normalization이 수행됩니다. Decoder 과정에서도 이 절차는 적용됩니다.

Residual connection

일반적인 신경망 모델 학습 시 모델의 층이 깊어질수록 학습 결과가 좋아진다고 알려져 있습니다. 하지만 층을 너무 깊게 쌓거나 노드 수를 너무 크게 증가시키면 입력 정보가 많은 층을 거치면서 이전 층 정보를 손실할 수 있고, 가중치가 잘못된 방향으로 계산될 수 있습니다. 그래서 이전 층의 정보를 이용하기 위해 이전 층의 정보를 복잡한 비선형 layer를 건너뛰면서 다음 층의 정보에 연결하는 것을 Skip connection이라고 합니다. 위 그림에서는 $x_1$과 $x_2$가 self-attention layer를 통과하지 않고 Add&Norm layer로 넘어가는 화살표를 의미합니다. Skip connection은 Residual connection이라고도 불리는데 이는 이전 층의 정보에서 새로운 정보가 추가되었을 때 그 추가된 정보만 학습하면 되기 때문에 residual이라는 단어가 붙습니다. 또한 최소한 이전 층의 정보만큼은 반영할 수 있기 때문에 정보가 유실되어도 안정적으로 학습할 수 있습니다.
Residual connection을 통해 전체 네트워크는 기존 정보를 입력 받으면서 추가적으로 잔여 부분만 학습하도록 만들기 때문에 전반적인 학습 난이도가 낮고, 초기에 모델 수렴 속도가 높습니다. 따라서 Global optima를 좀 더 정확하게 찾을 수 있습니다.
Layer Normalization

Layer normalization은 Batch normalization과 비슷하게 모델을 안정적으로 만들어주고 성능을 좋게 만들어줍니다. 과정은 다음과 같습니다.
- 단어 별 평균과 분산을 구합니다.
- 평균은 0, 분산은 1이 되도록 정규화 합니다.
- 원하는 평균과 분산을 모델에 넣어주기 위해 $y=ax+b$ 형태로 변환합니다.
Feed Forward Neural Network

Embedding된 단어가 Add&Norm layer까지 통과했다면 다음 encoder 혹은 decoder로 전달해주기 전에 Position-wise Feed-Forward Networks를 통과합니다. 해당 layer는 fully-connected layer로 구성되어 있습니다. Position-wise, '위치 별'이라는 말이 붙는 것은 단어 위치 별로 FFNN layer가 적용되기 때문입니다. Transformer에서 중요한 점은 특정 위치의 단어는 해당 위치를 유지하면서 연산이 수행된다는 것입니다. 단어의 위치를 고정시키고 그 위치에 동시에 FFNN을 적용하기 때문에 position-wise라는 말이 사용됩니다.
FFNN layer는 같은 encoder block에서는 동일한 가중치를 사용하지만 다른 encoder block에서는 서로 다른 가중치를 학습합니다.
Decoder

Decoder는 encoder와 다른 점이 두 가지 있습니다. 바로 Masked Multi-Head Attention layer를 사용한다는 점과 encoder의 output을 두 번째 Multi-Head Attention의 key, value vector로 사용한다는 점입니다. 위 그림에서 보면 최종 encoder output으로 나온 vector들이 decoder 두 번째 multi-head attention으로 이동하는 화살표를 확인할 수 있습니다.

Decoder의 입력은 다음과 같이 예측이 가능하도록 구성합니다. 문장의 시작을 알리는 <SoS>가 입력되면 encoder의 output과 함께 '나는'을 예측하고, 최종적으로 '간다'가 입력되었을 때 <EoS>가 예측되도록 합니다. 위 예시에서는 <SoS>, '나는', '집에', '간다'가 순서대로 입력 되었지만 이는 훈련 과정일 때 예시입니다. 실제 시험 과정에서는 Decoder의 입력으로 <SoS>만 사용됩니다.
Masked Multi-Head Attention

Masked Self-Attention이란 말 그대로 특정 값을 가리는 것입니다. 훈련 과정에서 <SoS> 다음에 나타날 단어가 '나는'이라는 특정 단어인데 이걸 예측하기 위해서 입력 sequence에서 주어진 다음 time step에서 나타난 입력 단어의 가중치를 많이 부여하면 쉽게 예측 가능한 cheating 문제가 발생합니다. Cheating 문제를 방지하기 위해 query vector와 key vector를 내적해서 얻은 유사도 값의 일부를 $-\infty$ 값을 입력해 계산을 해도 의미가 없게 만듭니다. Masking 하는 기준은 query로 선택한 단어를 기준으로 다음 단어들입니다.
따라서 Masked Multi-Head Attention이란 decoding 단계에서 self-attention은 Query token보다 뒤에 위치한 token들에 대한 정보는 가용하지 않는다고 가정하고 해당 부분을 전부 Masking 처리하는 것을 말합니다.
이렇게 encoder와 decoder의 기본 구조에 대해 알아보았습니다. 다음과 같은 block들로 구성된 encoder, decoder는 논문에서는 6개를 사용해 실험했습니다. 논문에서 6개로 설정한 근거는 존재하지 않아 추가할 수도, 뺄 수도 있습니다. 또한 각각의 encoder와 decoder는 서로 다른 파라미터를 가지는 것을 유의해야 합니다.
위 내용들은 제가 LG aimer 주재걸, 강필성 교수님 강의를 듣고 이해한 내용을 정리한 것입니다. 피드백 환영합니다.😊
참고 문헌
LG aimer 주재걸, 강필성 교수님 강의 자료
https://paperswithcode.com/method/position-wise-feed-forward-layer
Papers with Code - Position-Wise Feed-Forward Layer Explained
Position-Wise Feed-Forward Layer is a type of feedforward layer consisting of two dense layers that applies to the last dimension, which means the same dense layers are used for each position item in the sequence, so called position-wise.
paperswithcode.com
https://www.youtube.com/watch?v=AA621UofTUA
https://www.youtube.com/watch?v=dichIcUZfOw
'AI' 카테고리의 다른 글
| Beyond efficient transformer for long sequence time-series forecasting (0) | 2023.02.27 |
|---|---|
| A Transformer-based Framework for Multivariate Time Series Representation Learning (0) | 2023.02.13 |
| Time-series Transformer: Transformer를 사용한 다변량 시계열 데이터 예측 (0) | 2023.01.25 |
| Bert: Pre-training of deep bidirectional transformers for language understanding (0) | 2023.01.25 |
| Seq2Seq and Attention model (0) | 2023.01.18 |