목차
안녕하세요 윤도현입니다. 오늘 소개할 논문은 2017년 NIPS에 개제된 Attention is All you Need 라는 논문입니다. 이미 너무나도 유명한 논문이지만 제가 이 논문을 리뷰하는 이유는 최근 여러 논문을 읽으면서 Attention 매커니즘이 반복적으로 나왔는데 그때마다 개념적으로는 이해가 갔지만 정확히 어떻게 동작하는지 머릿속으로 잘 그려지지 않아서 한번 제대로 짚고 넘어가야겠다는 생각에 리뷰하게 되었습니다.
논문 리뷰에 앞서 제가 어렴풋하게 알고있던 Attention의 개념은 다음과 같습니다. 사람이 복잡한 문장을 읽을 때 모든 단어를 무작정 하나씩 해석하는 대신 핵심적인 단어에 집중해 문장의 의미를 파악하듯이 Attention 매커니즘도 문장안의 모든 단어를 동시에 살펴보되, 어떤 단어들이 서로 중요한 관계를 맺고있는지 계산하고 핵심 단어에 집중해 문장의 의미를 파악하도록 동작합니다. 이제 논문을 다시 리뷰하면서 개념적인 내용이 아닌 명확하게 머릿속에 시각적으로 그림이 그려질 수 있도록 방향을 잡고 리뷰를 진행해보겠습니다.
1. Introduction
- 기존 시퀀스 변환 SOTA 모델인 RNN, LSTM, GRU 네트워크들은 순차적으로 처리한다는 특징때문에 병렬처리가 어려웠음
순차 처리란?
입력 데이터의 순서를 고려하며, 이전 단계의 결과를 다음 단계의 입력으로 사용하는 처리 방식입니다. 순차 처리는 각 단계가 이전 단계의 결과를 필요로 하기 때문에, 동시에 여러 입력을 병렬로 처리하기 어렵다는 특징이 있습니다.
- 또한 입력 시퀀스가 길어질수록(글의 길이가 길수록) 메모리 제약으로 인해 배치 처리를 할 수 없다는 문제가 있었음
- 이러한 문제를 해결하기 위해 기존 모델들에 Attention 매커니즘을 결합하여 입/출력 시퀀스의 거리에 상관없이 의존성을 모델링 하는 연구가 진행됨
기존 RNN/LSTM/GRU 기반 인코더-디코더 모델
1. 인코더는 입력 시퀀스를 처리하여 고정 크기의 벡터(context vector)를 생성
2. 디코더는 이 고정 크기의 벡터(context vector)를 기반으로 출력 시퀀스 생성
하지만 이 구조의 문제점은 context vector가 고정된 크기라는 점이였습니다. 이 때문에 입력 시퀀스의 길이가 길어질수록 모델이 문맥 정보를 충분히 학습하지 못하게 되었습니다.
Attention 매커니즘을 결합한 RNN/LSTM/GRU 기반 인코더-디코더 모델
이러한 문제를 해결하기 위해 Attention 매커니즘을 기존 인코더-디코더 모델에 결합한 연구가 나왔습니다. Attention 매커니즘은 입력 시퀀스의 모든 시간 단계를 고려하여 그중 중요한 정보만 선택적으로 집중할 수 있도록 하는 매커니즘입니다. 이를 통해, 고정된 크기의 context vector 문제를 해결하고, 모델이 더 긴 문맥 정보를 활용하는 것을 가능하게 하였습니다.
1. 인코더가 출력한 모든 상태(hidden states)를 저장:
- 입력 시퀀스의 각 시간 단계에서 생성된 숨겨진 상태를 모두 보관
- h1,h2,...,hTh_1, h_2, ..., h_Th1,h2,...,hT 형태로 저장 (T는 입력 시퀀스 길이).
2. 디코더가 각 시간 단계에서 어텐션을 계산:
- 디코더는 출력의 현재 시간 단계에서 필요한 입력의 정보가 어디에 있는지 결정
- 이를 위해 디코더의 현재 숨겨진 상태 sts_tst와 인코더의 각 숨겨진 상태 hih_ihi 간의 **유사도 점수(score)**를 계산
3. 가중합 계산:
- 유사도 점수는 **소프트맥스(Softmax)**를 통해 가중치로 변환
- 이 가중치는 인코더 상태에 곱해져서 디코더가 필요한 정보를 집중적으로 활용할 수 있게함
- 결과적으로, 디코더는 입력 시퀀스의 특정 위치에 "집중(attend)"함
- 이렇게 Attention 매커니즘이 결합하여 어느정도 성능개선을 이루었지만, 입력 시퀀스를 순차적으로 처리하는 기본 구조때문에 학습이나 추론단계에서 여전히 병목현상이 존재하였음.
- 그래서 기존 모델에 존재하는 순차 처리 구조를 완전히 제거하고 입력 시퀀스를 병렬처리하기 위해 Attention만으로 이루어진 Trnasformer 라는 모델을 제안하게 됨.
2. Background
- 순차적 처리를 줄이려는 연구는 Extended Neural GPU, ByteNet, ConvS2S와 같은 논문에서 먼저 시작됨.
- 이 모델들은 CNN을 사용하여 입/출력 모든 위치에서 숨겨진 표현을 계산함
- 그러나 두 임의의 입/출력 위치를 연결하는데 필요한 연산량은 거리에 비례하여 증가함
- 따라서 먼 위치 간의 의존성을 학습하는데 어려움이 있었음
- 트랜스포머는 이렇게 거리에 따라 연산량이 증가하는 문제를 Self-Attention을 이용하여 해결하였음
(자세한 내용은 3절에서 설명)
3. Model Architecture
이번 절에서는 Transformer 모델 아키텍처에 대해 설명드리려고 합니다. 하지만 단순히 아키텍처에 대해 개념적으로 설명하기 보다는 시각적으로 어떻게 동작하는지에 그림과 함께 설명해보겠습니다.
Transformer의 동작과정은 크게 4단계로 나눌 수 있습니다.
- Word Embedding: 텍스트 데이터를 고차원 벡터로 변환하여 기계가 이해할 수 있는 형식으로 변환
- Positional Encoding: 위치 정보를 벡터에 추가
- Encoder-Decoder: 인코더에서 입력 시퀀스로부터 고차원 표현을 추출하고, 디코더에서 고차원 표현과 Target 문장을 사용하여 최종 출력을 생성
- Output Generation: 최종적으로 확률분포(Linear+Softmax)를 통해 다음에 올 단어를 예측
3.1. Word Embedding
word embedding의 목적은 입력 시퀀스(텍스트 데이터)를 고차원 벡터로 변환하여 기계가 이해할 수 있는 형식으로 변환하는 것입니다. 그래서 아래 그림과 같이 시퀀스가 입력되면, 시퀀스를 작은 덩어리(토큰)으로 분할하고, 각 토큰을 벡터로 변환합니다.
토큰을 어떻게 벡터로 변환할까?
Transformer는 방대한 언어 데이터셋을 학습하여 존재하는 모든 단어에 대한 임베딩을 갖게있습니다. 각 열은 각 단어에 대한 단일 벡터를 뜻하며, 이 pre-trained된 word embedding 값을 입력 시퀀스 토큰의 초기 임베딩값으로 대입합니다.
예를들어, 입력 시퀀스가
"ab is my brother" 이라는 시퀀스가 입력되었을 때, 입력 시퀀스를 작은 덩어리(토큰)으로 나눠줍니다.
t1: ab
t2: is
t3: my
t4: brother
이후 각 토큰을 벡터로 변환해야 하는데 이때, pre-trained word embedding으로부터 초기 임베딩 값을 가져옵니다.
그렇게되면 각 토큰을 벡터로 변환할 수 있게됩니다.
첫단계에서 각 토큰의 벡터는 pre-trained된 임베딩 행렬에서 단순히 추출해오기 때문에, 문맥적인 의미를 갖고있지 않고 특정 단어의 의미만 인코딩된 값을 갖습니다.
3.2 Positional Encoding
Positional Encoding의 목적은 입력 시퀀스의 위치정보를 추가하여 모델이 순서를 고려할 수 있도록 하는 것입니다.
그런데 왜 모델에 순서정보를 반영해야 할까요?
그 이유는 Self-Attention 매커니즘이 단어 간의 상대적 위치나 순서를 고려하지 않기 때문입니다. 예를들어, "The cat sat on the mat"와 "The mat sat on the cat"은 동일한 Attention 결과를 내게 됩니다.
그렇다면 이런 문제는 어떻게 해결할 수 있을까요?
해결책은 바로 임베딩에 위치정보를 더해주는 것입니다. 위치정보는 단순히 1번째, 2번째 처럼 정수로 표현할 수 있지만, 본 논문에서는 이 정보를 벡터(위치 임베딩)로 사용합니다.
이 벡터(위치 임베딩)는 서로 다른 주파수의 sin, cos 함수를 사용하여 계산됩니다.
- pos: 단어가 시퀀스 내 몇번째 위치하는가
- i: 임베딩 벡터에서 몇 번째 차원을 계산하는지 나타내는 차원의 인덱스
이렇게 계산된 각 토큰의 위치 임베딩을 각 토큰의 임베딩에 더해줘서 고차원 벡터를 생성합니다.
3.3 Encoder-Decoder
Encoder 구조:
- 6개의 동일한 layer로 이루어져 있습니다. 각 layer는 Self-Attention layer + Feed Forward Neural Netwrok 두 개의 sub layer로 구성되어 있습니다.
- 결과적으로 6개((Self-Attention layer + Feed Forward Neural Netwrok) x6) layer로 구성됩니다.
Encoder 계산 과정:
- 앞서 입력 시퀀스를 작은 덩어리(토큰)로 나누고, 각 덩어리를 벡터로 변환한 뒤, 위치 벡터(임베딩)을 더해줘서 만들어진 하나의 고차원 벡터(Xinput= Xembedding + Xpositional)를 Encoder에 입력합니다.
- 입력받은 벡터는 Multi-Head Self-Attention layer를 통해 문맥 정보를 학습합니다.
(query,key,value 생성 -> 유사도 계산 -> 멀티헤드 연산)
- 이후 Feed-Forward Neural Network는 Self-Attention layer의 출력을 입력받아 더 정교한 표현을 생성합니다.
- 이를 6번 반복하면 결과적으로 각 토큰의 임베딩은 문맥 정보를 포함한 새로운 벡터 표현으로 변환됩니다.
Decoder 구조:
- 인코더와 동일하게 6개의 layer로 이루어져 있습니다. 하지만 인코더와 달리 각 layer는 Masked Multi-Head Self-Attention layer가 추가된 총 3개의 sub layer로 구성됩니다.
Decoder 계산과정:
- 인코더의 출력(고차원 벡터)를 디코더에 입력합니다.
(이때 인코더의 출력에는 각 단어의 의미와 문맥정보를 포함합니다.) - 예를들어, 입력 문장이 "나는 사과를 좋아해" 라면 인코더의 출력은 다음과 같습니다.
- 디코더 입력 <Start> 임의의 시작 토큰-> Query <Start>의 벡터값 -> Key, Value(인코더의 출력벡터) -> Encoder-Decoder Attention이 입력 문장과의 관계를 계산하여 "I" 생성
- 디코더 "I" 입력 -> Query "I"의 벡터값 -> Key, Value(동일한 인코더의 출력 벡터) -> Encoder-Decoder Attention이 "사과를"에 더 높은 가중치를 두고 "like" 생성
- 디코더 "like" 입력 -> Query "like"의 벡터값 -> Key, Value(동일한 인코더의 출력 벡터) -> Encoder-Decoder Attention이 "좋아해"에 더 높은 가중치를 두고 "apples" 생성
- 결과적으로 각 단어에 해당하는 확률 분포값을 반환합니다.
3.4 Output Generation
마지막으로 Output Generation에서는 디코더의 출력을 Linear layer에 통과(vocabulary size로 매핑)시키고, Softmax 처리(각 단어에 대해 0~1 사이의 확률분포를 갖도록 처리)하여 다음에 올 단어의 확률분포를 생성합니다. 그 결과 가장 가능성이 높은 단어를 다음에 올 단어로 선택합니다.
결과적으로 Transformer는 아래 그림처럼, 어떤 문장(입력 시퀀스)이 들어오면 어떤 단어가 나올지 예측하게 됩니다.
4. Why Self-Attention
이 절에서는 Self-Attention layer와 RNN/CNN layer를 비교하여 시퀀스의 한 변수 길이(variable_length sequence)를 다른 길이가 동일한 시퀀스로 매핑하는 데 있어 Self-Attention layer를 쓰는 이유에 대해 설명합니다.
Self-Attention | RNN | CNN | |
레이어당 총 계산복잡도 | O(n2⋅d) | O(n⋅d2) | O(k⋅n⋅d2) |
병렬화 가능성 | 완전 병렬화 가능 | 순차적 연산 필요 O(n) |
제한적 병렬화 가능 O(logk(n)) |
장기 의존성 학습의 경로길이 | 항상 1 | O(n) | O(logk(n)) |
제약된 구조의 적용 가능성 | 제약된 범위()에서 사용 시 O(n/r)로 경로 길이 증가 |
적용 불가 | 커널 크기(kk) 조정으로 제한 가능 |
d: Dimension of representation
n: Sequence length
k: Kernel Size
여기까지 Transformer의 Attention 과정이 내부적으로 어떻게 동작하는지 시각적으로 알아봤습니다!
Reference
[1] Transformers (how LLMs work) explained visually | DL5
[2] Attention in transformers, step-by-step | DL6
'논문 리뷰' 카테고리의 다른 글
Tracking Persons-of-Interest via Unsupervised Representation Adaptation (0) | 2024.12.29 |
---|---|
FaceNet: Face Recognition의 기본모델 (2) | 2024.12.12 |
UniDepth: 일반화된 Monocular Metric Depth Estimation! (0) | 2024.11.20 |
[논문리뷰]Co-DETR: LVIS 데이터셋 SOTA (2) | 2024.10.16 |
[논문리뷰]RawHDR: Raw 데이터로부터 HDR 이미지 복원하기 (4) | 2024.09.25 |