- [17′ NIPS] Transformer : Attention Is All You Need
- [18′ OpenAI] GPT-1 : Improving Language Understanding by Generative Pre-Training
- [19′ NAACL] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
- [20′ NIPS] GPT-3 : Language Models are Few-Shot Learners
- [22′ NIPS] InstructGPT : Training language models to follow instructions with human feedback
- [21′ ICLR] LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
- [21′ IJCNLP] Prefix-Tuning: Optimizing Continuous Prompts for Generation
- [22′ NeurIPS] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
- [20′ NeurIPS] Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
- [23′ ICLR] Self Consistence : SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS
- Prompt Engineering, PEFT, RAG – LLM이 외부 정보를 사용하는 세 가지 방법
- [22′ NeurIPS] LIFT: Language-Interfaced Fine-Tuning for Non-Language Machine Learning Tasks
- [23′ ICLR] LANGUAGE MODELS ARE REALISTIC TABULAR DATA GENERATORS
1. 들어가며
자연어 처리 분야에서의 연구와 발전은 끊임없이 진행되고 있습니다. 이러한 연구의 중심에는 문장과 문서를 이해하고, 이를 기반으로 머신이 인간처럼 텍스트를 처리할 수 있도록 하는 모델들이 있습니다. 그러나 기존의 Seq2Seq 방식은 여러 가지 문제점을 가지고 있었고, 이를 해결하기 위해 Transformer 라는 새로운 모델이 제안되었습니다.
이번 글에서는 기존 방법의 한계를 시작으로, Transformer의 핵심 철학과 구조에 대해 깊게 알아보겠습니다. Transformer의 핵심 철학에서는 순차적 입력 대신, 한 덩어리의 입력을 받는 방법과 Self Attention의 중요성에 대해 알아봅니다. 이를 통해 Transformer가 어떻게 기존의 문제를 극복하고 더 나은 성능과 효율성을 제공하는지 이해할 수 있습니다.
다음으로, Transformer의 핵심 개념들인 Self Attention, Multi Head Attention, Positional Encoding, Position Wise FFNN, Residual Connection, Layer Normalization 등에 대한 자세한 설명을 통해, 이 모델이 어떻게 구성되고 작동하는지에 대한 깊은 이해를 제공합니다. 이러한 개념들은 Transformer의 성공의 핵심이며, 이를 통해 높은 성능을 달성할 수 있습니다.
본문에서는 또한 Transformer의 구조, 즉 Encoder와 Decoder의 각 구성 요소에 대해 상세히 설명합니다. 이를 통해 Transformer의 전체적인 아키텍처와 작동 원리를 명확하게 이해할 수 있습니다. 이어서, Self Attention의 중요성과 이로 인한 Transformer의 장점을 실험 결과를 통해 확인합니다.
다양한 작업에 대한 실험 결과를 통해 Transformer의 뛰어난 성능을 실제로 확인할 수 있습니다. 이러한 성능은 Transformer를 다양한 자연어 처리 작업에서 효과적으로 사용할 수 있게 만듭니다. 그러나 모든 것이 완벽하지는 않습니다. 이번 글에서는 Transformer의 장단점에 대해서도 논의합니다.
마지막으로, Transformer의 의의를 살펴봄으로써, 이 모델이 자연어 처리 분야에 어떤 영향을 미치고 있는지, 그리고 앞으로 어떤 가능성을 열고 있는지에 대해 논의합니다. 이를 통해 Transformer의 중요성과 그 이상의 가치를 이해할 수 있습니다.
2. 기존 방법의 문제점
먼저 기존 방법의 문제점에 대해 살펴보겠습니다. 기존 Time Series 입력 데이터를 다루는 대표적인 방법은 RNN과 LSTM이었습니다. 이 두 모델은 아래 그림과 같이 공통적으로 입력값을 순차적으로 받는데요.
![[17' NIPS] Transformer : Attention Is All You Need 1 그림1. 기존 Seq2Seq 방법](https://ffighting.net/wp-content/uploads/2023/09/image-3-1024x295.png)
위 그림은 Seq2Seq 모델의 계산 과정을 표현한 그림입니다. 입력으로 ‘ABC’가 들어가면, 모델의 출력으로 ‘WXYZ’가 나오는 모습을 볼 수 있습니다. 이때 모델은 입력값을 ‘A’, ‘B’, ‘C’ 하나씩 순차적으로 받는데요. 이로 인해 필연적으로 계산 속도가 느리다는 단점이 발생합니다. 또한 입력 받은 값을 그대로 간직하는 것이 아닌, 연산을 통해 일부 정보만 다음 연산으로 넘겨주는 과정에서 정보 소실 문제도 발생하죠.
이러한 문제는 입력의 길이가 짧은 경우는 큰 문제가 되지 않습니다. 하지만 많은 경우의 Time Series 데이터는 데이터의 길이가 긴 경우가 많죠. 우리가 사용하고 있는 문장만 생각해봐도, 한 문장마다 수십개의 단어로 구성되어 있다는 것을 알 수 있습니다. 그 말은 수십개의 단어 벡터가 순차적으로 입력이 될 것이고, 이 과정에서 연산 속도는 느려지고 먼저 입력된 단어 정보는 많이 소실될 것을 의미하죠.
3. Transformer 핵심 철학
이러한 기존 방법의 문제점을 Transformer 에서는 어떻게 해결할까요? 크게 두 가지 핵심 철학을 설명하려고 합니다.
3-1. 한 덩어리의 입력 데이터 받기
입력 데이터가 순차적으로 들어온다는 것이 문제라고 말씀드렸는데요. 그럼 입력 데이터를 한 덩어리로 뭉쳐서 입력 받으면 어떨까요? 아래 그림처럼요.
![[17' NIPS] Transformer : Attention Is All You Need 2 그림2. Transformer의 입력 데이터](https://ffighting.net/wp-content/uploads/2023/09/image-4-1024x969.png)
위 그림은 입력 데이터 ‘ABC’를 ‘A’, ‘B’, ‘C’로 나누지 않고, 한 덩어리로 모델에 넣어주는 모습을 표현한 그림입니다. 일단 이렇게 구성해주면 기존의 문제점인 계산 속도가 느리다는 것과 정보가 소실되는 문제점은 막아줄 수 있겠네요. 기존대로라면 세번 해야 할 계산을 한번만 하면 되고, ‘ABC’ 정보를 모두 처리할 수 있으니까요.
3-2. Self Attention 적용
이제 고민해야 하는 부분은 저렇게 ‘한번에 입력 받은 ‘ABC’ 데이터에서 어떻게 중요한 부분만 골라내서 처리할 것인가?’ 하는 부분입니다. 즉, ‘어떻게 정보를 압축할 것인가?’ 하는 문제죠. 이 문제를 해결하기 위해 Transformer에서 적용한 신의 한수 방법이 바로 Self Attention 입니다. Self Attention이란 Attention의 일종인데요. Attention이란 데이터에서 중요한 부분에 더 많은 가중치를 주는 방법을 말합니다. 이때 중요도를 판단하기 위한 다양한 방법이 있는데요. Self Attention이란 이때 스스로의 데이터만으로 중요도를 판단하는 방법입니다. 이러한 Self Attention의 연산 전후를 그림으로 표현하면 이렇게 표현할 수 있습니다.
![[17' NIPS] Transformer : Attention Is All You Need 3 그림3. Self Attention 연산 전후](https://ffighting.net/wp-content/uploads/2023/09/image-5-1024x230.png)
위 그림에서는 Self Attention의 중요한 두 가지 포인트를 표현하고 있습니다.
첫 번째는 Self Attention 연산을 거치면 입력 데이터 요소의 중요도에 따라 가중치가 달라진다는 것입니다. 즉, 중요한 요소는 큰 값을 갖게 되고, 중요하지 않은 요소는 작은 값으로 변하게 되는 것이죠.
두 번째는 Self Attention 연산을 거친 데이터의 사이즈는 변하지 않는다는 것입니다. 즉 Self Attention은 입력값과 출력값의 사이즈가 동일합니다.
이러한 Self Attention의 두 가지 특성은 아래에서 Transformer의 특성과 구조를 설명할때 아주 중요하니 꼭 기억하실 필요가 있습니다. Self Attention은 Transformer를 이해하기 위해 반드시 필요한 핵심 개념인데요. 자세한 내용은 Self Attention 설명글을 참고해주세요.
4. Transformer 핵심 개념
이번 챕터에서는 Transformer 구조를 이해하기 위해 반드시 알아야 하는 핵심 개념 6가지를 설명합니다.
4-1. Self Attention
첫 번째는 역시 Self Attention 입니다. 위에서도 언급했지만 역시 Transformer의 핵심은 Self Attention이라고 할 수 있습니다.
![[17' NIPS] Transformer : Attention Is All You Need 4 그림4. Self Attention 연산 과정](https://ffighting.net/wp-content/uploads/2023/09/image-6-1024x915.png)
Self Attention은 위의 그림과 같은 연산 과정을 거쳐 입력 데이터를 변환합니다. 외부 정보 없이 오직 스스로(Self)의 정보만을 사용하여 데이터별 중요도(Attention)를 판별하기에 Self Attention이라는 이름을 얻었죠. 이러한 Self Attention은 Transformer에서 세 가지 형태로 사용됩니다.
![[17' NIPS] Transformer : Attention Is All You Need 5 그림5. Transformer의 세 가지 Self Attention](https://ffighting.net/wp-content/uploads/2023/09/image-7-1024x822.png)
위 그림은 Transformer의 Architecture를 표현한 그림입니다. 왼쪽은 Encoder, 오른쪽은 Decoder인데요. Encoder에서는 Self Attention, Decoder에서는 Masked Attention, Cross Self Attention이 강조되어 있는 모습을 볼 수 있습니다. 이 세 가지는 모두 Self Attention 기반의 연산인데요. 각각의 목적에 맞게 조금씩 연산 과정이 다릅니다. 자세한 내용은 아래에서 다루도록 하겠습니다.
4-2. Multi Head Attention
다음은 Multi Head Attention에 대해 알아보겠습니다. 논문에서는 Multi Head Self Attention이라는 표현이 자주 언급되는데요. 이는 Self Attention 모듈을 여러개 이어서 이어 붙인 방법을 말합니다.
원래의 Self Attention은 아래 그림과 같이 입력 데이터와 출력 데이터의 사이즈를 동일하게 연산하는데요.
![[17' NIPS] Transformer : Attention Is All You Need 6 그림6. Self Attention](https://ffighting.net/wp-content/uploads/2023/09/image-8-1024x171.png)
이렇게 하면 Self Attention을 한 번밖에 적용할 수 없잖아요? Self Attention이 중요한 부분을 강조하는 모듈이라고 생각한다면, 하나의 데이터에 다양한 Self Attention을 적용하는게 더 유리할겁니다. 왜냐하면 ‘무엇이 중요한지’에 대한 기준은 다양하며, 따라서 다양한 관점을 반영하는것이 더 유리하기 때문이죠. 그럼 어떻게 하면 여러번의 Self Attention을 적용할 수 있을까요?
![[17' NIPS] Transformer : Attention Is All You Need 7 그림7. Multi Head Self Attention](https://ffighting.net/wp-content/uploads/2023/09/image-9-1024x153.png)
Transformer에서는 위의 그림과 같이 Projection 연산을 통해 데이터의 사이즈를 축소한 뒤 Self Attention을 수행하는 방법을 선택합니다. 이렇게 구성하면 기존에는 한번만 수행해야 했던 Self Attention을, 두 번 수행할 수 있죠. 그 만큼 다양한 관점을 반영할 수 있게 되는 것이고요. 두 번의 Self Attention을 거친 출력 데이터는 최종적으로 모두 합쳐서 Multi Head Self Attention의 출력으로 나오게 됩니다. 최종적으로 Transformer에서는 이러한 Multi Head Attention을 6번 거치도록 구성합니다. 그래서 전체적으로는 다음과 같이 구성되게 됩니다.
![[17' NIPS] Transformer : Attention Is All You Need 8 그림8. Transformer Multi Head Self Attention 구성](https://ffighting.net/wp-content/uploads/2023/09/image-15-863x1024.png)
4-3. Positional Encoding
다음으로는 Positional Encoding 이라는 개념을 살펴보겠습니다. 이 Positional Encoding은 Transformer 계열의 모든 방법에서 등장하는 개념인데요. 이는 CNN과 결정적인 차이이기도 합니다. Positional Encoding을 단어 그대로 해석해보면 위치 정보를 입력해주자는 뜻인데요. Transformer는 기존 방법과 달리 입력값을 한 덩어리로 묶어서 구성했다고 했습니다. 이 과정에서 자연스럽게 데이터의 ‘순서’가 사라지게 되는데요. 기존에는 ‘A’, ‘B’, ‘C’ 순차적으로 입력을 받았기에 자연스럽게 데이터의 순서를 인지하며 연산을 할 수 있었죠. 그런데 한 덩어리의 데이터를 입력 받으면서 모델 입장에서는 순서를 중요하게 생각하지 않게 된겁니다.
하지만 이렇게 되면 문제가 있죠. 왜냐하면 실제로는 Transformer가 다루는 데이터에서는 순서가 중요하니까요. 예를 들어 언어 데이터를 입력 받는다고 상상해볼게요. ‘I go to School’ 이라는 문장을 입력 받았다고 상상해 보겠습니다. ‘I’, ‘go’, ‘to’, ‘school’ 4개의 단어 벡터를 한 덩어리로 입력 받겠죠. 이 데이터의 순서를 바꿔서 ‘school’, ‘to’, ‘go’, ‘I’ 라고 입력받으면 어떨까요? 우리는 틀린 문장이라는 것을 알죠. 하지만 Self Attention 기반으로 동작하는 Transformer 입장에서는 전혀 문제가 되지 않습니다. 입력 받은 단어들의 관계를 기반으로 중요도만 계산하면 그만인거죠. 이러한 Transformer의 특징을 ‘Permutation Invariance’ 라고 합니다.
이렇게 Self Attention에서 비롯되는 특성 때문에 Transformer는 CNN과 달리 입력 데이터에 ‘순서’ 정보를 추가로 입력해주어야 합니다. 이때 Positional Encoding 함수는 다양한 방법이 존재합니다만, 일반적으로 위치 정보에 대한 Sin, Cosine 함수를 조합해서 구성합니다. 수식으로는 이렇게 표현됩니다.
![[17' NIPS] Transformer : Attention Is All You Need 9 그림9. Positional Encoding 수식](https://ffighting.net/wp-content/uploads/2023/09/image-10.png)
이렇게만 보면 느낌이 오지 않으니, 실제 구체적인 예시를 통해 Positional Encoding의 의미를 느껴보겠습니다.
위에서 예시로 든 ‘I go to school’ 문장을 그대로 사용할게요. ‘I’, ‘go’, ‘to’, ‘school’ 네 개에 해당하는 단어 벡터를 아래와 같이 임의로 정해주었습니다.
# 각 단어의 초기 벡터
word_vectors = {
"I": np.array([0.2, 0.8, 0.3, 0.5]),
"go": np.array([0.6, 0.4, 0.7, 0.2]),
"to": np.array([0.9, 0.2, 0.2, 0.8]),
"school": np.array([0.3, 0.6, 0.2, 0.9])
}
이렇게 만든 각 단어 벡터를 시각화하면 다음과 같습니다.
![[17' NIPS] Transformer : Attention Is All You Need 10 그림10. Word Vector 시각화](https://ffighting.net/wp-content/uploads/2023/09/image-12.png)
이때 위에서 언급한 Sin, Cosine을 조합한 방식의 Positional Encoding 을 사용해 계산한 각 단어별 Positional Encoding 값은 다음과 같습니다.
# 각 단어의 positional encoding
positional_encodings = {
"I": np.array([0.2, 0.3, 0.2, 0.3]),
"go": np.array([0.3, 0.4, 0.3, 0.4]),
"to": np.array([0.4, 0.5, 0.4, 0.5]),
"school": np.array([0.5, 0.6, 0.5, 0.6])
}
이렇게 만든 Positional Encoding 벡터를 시각화 하면 다음과 같습니다.
![[17' NIPS] Transformer : Attention Is All You Need 11 그림11. Positional Encoding 시각화](https://ffighting.net/wp-content/uploads/2023/09/image-13.png)
이제 최종적으로 Transformer에 들어갈 입력 데이터는 기존 단어 벡터와 Positional Encoding 값을 더해줘서 구성해줍니다. 이렇게 나온 Positional Encoding 벡터는 각각 고유의 위치 정보를 의미합니다.
# 각 단어의 벡터에 positional encoding 더하기
for word in word_vectors:
word_vectors[word] += positional_encodings[word]
이렇게 나온 최종 벡터값을 시각화 하면 다음과 같습니다.
![[17' NIPS] Transformer : Attention Is All You Need 12 그림12. 최종 입력 데이터 시각화](https://ffighting.net/wp-content/uploads/2023/09/image-11.png)
기존 단어 벡터에 고유의 위치 정보인 Positional Encoding 값이 더해진 모습입니다.
4-4. Position Wise FFNN
다음으로 논문에서 Position Wise FFNN (Feed Forward Neural Network) 표현이 등장하는데요. 이는 Self Attention 결과로 나온 데이터에 Non Linearity를 추가하기 위한 연산이라고 할 수 있습니다. 수식으로는 다음과 같습니다.
![[17' NIPS] Transformer : Attention Is All You Need 13 그림13. Feed Forward Network 수식](https://ffighting.net/wp-content/uploads/2023/09/image-14.png)
4-5. Residual Connection
다음으로 Residual Connection 이라는 표현도 자주 등장하는데요. 이는 ResNet 논문에서 제안한 Residual Connection을 의미합니다. 이전 정보를 지름길을 통해 그대로 이어주는 방법이죠.
4-6. Layer Normalization
다음으로 Layer Normalization 이 사용되는데요. Batch Normalization을 알고 있다는 가정하에, 구체적인 예시를 통해 Batch Normalization과 Layer Normalization의 차이점을 살펴보겠습니다.
먼저 입력 데이터는 아래와 같이 (4,2) 사이즈로 구성되어 있다고 가정하겠습니다.
# 데이터
X = np.array([[1, 2], [3, 4], [5, 6]])
Batch Normalization은 Batch 내의 데이터들을 Normalization 해주는 것이죠. 코드로 보면 Batch Normalization 연산은 다음과 같습니다. 연산의 기준 axis가 0인 모습입니다.
# Batch Normalization
mean_batch = np.mean(X, axis=0)
var_batch = np.var(X, axis=0)
X_norm_batch = (X - mean_batch) / np.sqrt(var_batch + 1e-8)
반면 Layer Normalization은 각 데이터를 기준으로 Normalization을 수행합니다. 연산의 기준 axis가 1이죠. 파이썬 코드로는 다음과 같습니다.
# Layer Normalization
mean_layer = np.mean(X, axis=1, keepdims=True)
var_layer = np.var(X, axis=1, keepdims=True)
X_norm_layer = (X - mean_layer) / np.sqrt(var_layer + 1e-8)
5. Transformer 전체 구성
이제 Transformer를 이해하기 위한 핵심 개념들은 모두 살펴봤습니다. 이번 챕터에서는 Transformer의 전체 구성을 살펴보겠습니다.
5-1. 전체 구성
Transformer의 전체 Architecture는 다음과 같습니다.
![[17' NIPS] Transformer : Attention Is All You Need 14 그림14. Transformer Architecture](https://ffighting.net/wp-content/uploads/2023/09/image-16-702x1024.png)
먼저 왼쪽 하단의 Inputs는 Input Embedding을 거쳐 Positional Encoding을 더해주는 모습을 볼 수 있습니다. 그리고 나서 N번의 Encoding, 이어서 N번의 Decoding 과정을 거치고 Linear와 Softmax를 통해 최종 Output이 나오는 구조입니다.
5-2. Encoder
![[17' NIPS] Transformer : Attention Is All You Need 15 그림15. Transformer Encoder](https://ffighting.net/wp-content/uploads/2023/09/image-17-702x1024.png)
위 그림과 같이 Transformer에서 입력 데이터를 Self Attention 연산을 통해 데이터를 변환하는 모듈을 Encoder 라고 합니다. 위에서 설명한 것과 같이 Multi Head Self Attention으로 구성되어 있으며 6개의 동일한 모듈이 직렬로 연결되어 있는 구조입니다. 이때 그림에서 표현한 Multi Head Attention은 우리가 알고 있는 Self Attention 연산을 여러번 수행하는 구조를 말합니다. 아래에서 살펴볼 Decoder에서의 Multi Head Attention과 다른 부분이죠.
5-3. Decoder
![[17' NIPS] Transformer : Attention Is All You Need 16 그림16. Transformer Decoder](https://ffighting.net/wp-content/uploads/2023/09/image-18-845x1024.png)
위 그림과 같이 Encoding을 거친 입력 데이터를 출력 데이터와 같이 연산하여 최종 결과를 출력하는 모듈을 Decoder라고 합니다. 이때 Decoder에는 두 가지 Self Attention 변형 버전이 포함되어 있는데요.
첫 번째는 Masked Multi Head Attention입니다. Masked가 붙은 이유는 특정 데이터를 못 보도록 Masking 처리를 했기 때문인데요. Decoder는 Encoder와 달리 입력 데이터와 출력 데이터를 동시에 입력 받습니다. 번역 문제를 예로 들면 번역할 문장과 번역된 문장을 같이 입력 받습니다. 이때 번역할 문장은 정답에 해당하는데, 모두 입력 받으면 학습을 하는 의미가 없겠죠? 따라서 번역된 문장에서 미래 정보 부분은 Masking 처리해 줍니다. 번역은 순차적으로 출력되기에, 내가 번역해야 하는 단어부터는 모두 Masking 처리해주는 것이죠. 이렇게 Masking을 한 뒤 번역된 정보에 대해 Self Attention 연산을 수행합니다.
두 번째는 Cross Self Attention 입니다. 위 그림에서는 Decoder의 Multi Head Attention이라고 표현된 부분인데요. 이 모듈은 입력으로 입력 (번역할 정보)와 출력 (번역된 정보)를 모두 받는데요. 이 두 가지 정보의 관계를 고려하여 Self Attention을 수행해야 합니다. 따라서 Query와 Key는 번역할 정보로, Value는 번역된 정보로 구성합니다. 자기 자신만을 사용한 Attention이 아니므로 엄밀히 말하면 Self Attention은 아니라고 할 수 있습니다.
5-4. Dense & Softmax
마지막으로 Linear 연산과 Softmax 연산을 거쳐 최종 데이터를 출력해줍니다.
6. Self Attention이 좋은 이유
Transformer 논문에서는 Discussion 챕터를 통해 Self Attention이 좋은 이유에 대해 설명합니다. 먼저 실험 결과 표를 보겠습니다.
![[17' NIPS] Transformer : Attention Is All You Need 17 그림17. Self Attention이 좋은 이유](https://ffighting.net/wp-content/uploads/2023/09/image-19.png)
위 표를 통해 알 수 있는 첫 번째 특징은 Self Attention은 계산량이 작다는 것입니다. RNN과 비교했을때 n<d 인 경우 전체 계산량이 더 작음을 알 수 있습니다.
두 번째 특징은 Sequential Operation이 더 작다는 것입니다. RNN의 경우 n개의 데이터를 순차적으로 입력 받기에 O(n)의 복잡도를 갖습니다. 반면 Transformer는 입력 데이터를 한번에 처리하기에 O(1)의 복잡도를 갖습니다.
세 번째 특징이 가장 중요한데요. Maximum Path Length에 관한 것입니다. 이는 쉽게 말해서, 어떤 모델이 더 긴 데이터를 잘 처리하는가에 관한 내용인데요. Self Attention은 모든 위치에 대해 동일한 Path Length를 갖습니다. 아무리 멀리 떨어져 있는 단어라도 Self Attention을 계산하는 복잡도는 동일하다는 의미입니다. 반면 RNN은 떨어져 있는 거리(n)에 비례해 계산 복잡도가 증가합니다. 입력 데이터를 순차적으로 받기 때문이죠. 따라서 Transformer가 기존 RNN, LSTM 등의 방법들과 비교했을때 더 긴 정보를 잘 처리한다고 할 수 있습니다.
7. 실험 결과
다음은 다양한 데이터셋에 대한 실험 결과를 살펴보겠습니다.
7-1. Machine Translation
먼저 Machine Translation 실험 결과입니다.
![[17' NIPS] Transformer : Attention Is All You Need 18 그림18. Machine Translation 실험 결과](https://ffighting.net/wp-content/uploads/2023/09/image-20.png)
기존 방법들 대비 가장 성능이 좋음을 알 수 있습니다.
7-2. Model Variations
다음은 Ablation 실험 결과입니다.
![[17' NIPS] Transformer : Attention Is All You Need 19 그림19. Ablation 실험 결과](https://ffighting.net/wp-content/uploads/2023/09/image-21.png)
A 결과를 통해 적당한 Head 개수를 가질때 성능이 가장 좋음을 알 수 있습니다.
B 결과를 통해 Attention Key Size를 줄이면 모델의 성능이 크게 하락함을 알 수 있습니다.
C,D 결과를 통해 사이즈가 큰 모델의 성능이 좋고, Dropout은 Overfitting을 완화해줌을 알 수 있습니다.
E 결과를 통해 Learned Positional Encoding을 사용해도 결과가 비슷함을 알 수 있습니다.
8. 장단점
다음은 Transformer의 장단점에 대해 정리해보겠습니다.
8-1. 장점
Transformer는 다음 세 가지의 장점을 갖습니다.
첫 번째로 입력 데이터를 한 덩어리로 처리하여 계산 속도를 크게 향상했습니다.
두 번째로 Self Attention을 사용하여 긴 데이터도 효과적으로 처리할 수 있습니다.
세 번째로 모델의 크기와 복잡성을 쉽게 조정할 수 있어 Scaling이 용이합니다.
8-2. 단점
또한 Transformer는 다음 두 가지의 단점을 갖습니다.
첫 번째로 계산이 복잡합니다. Transformer는 많은 파라미터와 복잡한 구조를 가져, 큰 계산 리소스를 필요로 합니다.
두 번째로 긴 데이터를 처리할때 메모리 요구량이 급격하게 증가합니다.
9. 의의
마지막으로 Transformer의 의의에 대해 생각해보겠습니다.
Transformer 모델은 딥 러닝과 자연어 처리 분야에 큰 영향을 미쳤습니다. 이 모델은 병렬 처리 능력과 뛰어난 성능으로 다양한 NLP 작업에서 활용되고 있습니다. 또한, Transformer는 새로운 모델 아키텍처와 학습 방법의 발전을 촉진시켰습니다. GPT와 BERT와 같은 최신 모델은 Transformer 기반으로 구축되었으며, 이러한 모델은 자연어 이해와 생성 작업에서 뛰어난 성능을 보이고 있습니다.
물론, Transformer 모델도 완벽하지 않으며, 계산 복잡성과 메모리 사용량 등의 문제를 가지고 있습니다. 그러나 이러한 문제를 해결하기 위한 연구와 개발이 계속 진행되고 있으며, Transformer는 앞으로도 자연어 처리와 다른 분야에서 중요한 역할을 계속할 것으로 예상됩니다.
9. 마치며
이번 글에서는 RNN과 LSTM과 같은 기존의 시퀀스 모델링 방법의 한계를 살펴보았습니다. 이러한 문제를 해결하기 위해 제안된 Transformer 모델을 자세히 살펴봤습니다. Transformer의 핵심 개념과 아키텍처를 상세히 살펴보았고, Self Attention 메커니즘이 어떻게 이 모델을 더 효과적으로 만드는지도 탐구했습니다.
실험 결과 부분에서는 Transformer가 다양한 NLP 작업에서 어떻게 뛰어난 성능을 보이는지에 대한 실제 예를 제시했습니다. 이를 통해 Transformer의 효과를 명확히 볼 수 있었습니다. 또한, Transformer의 장단점과 그 의의에 대해서도 다뤘습니다. 이를 통해 이 모델의 중요성과 그 영향력을 더욱 잘 이해할 수 있었습니다.
마지막으로, Transformer는 여전히 연구와 발전의 여지가 많은 모델입니다. 이미 자연어 처리 분야에 큰 변화를 가져왔으며, 앞으로도 계속해서 중요한 역할을 할 것으로 예상됩니다. 이번 글이 Transformer에 대한 이해를 제공하고 도움이 되길 바랍니다.