본 논문 리뷰는 저의 개인적인 해석과 의견을 바탕으로 작성된 글입니다. 내용 중 해석의 오류나 개념적인 착오가 있다면, 망설이지 마시고 댓글로 혼내주시면 감사하겠습니다~
이번에 리뷰할 "Attention Is All You Need"은 사실 딥러닝 발전에 있어서 누구도 부정할 수 없는 최고의 논문.....
그래서 NLP에 관심이 많은 학생으로서 정말 많이 들었지만 명확하게 정리해 놓은 노트가 없어서 이번 기회에 시도해보려 합니다. 매번 "그래서 Transformer가 뭔데? Attention이 왜 중요한데? Multi-head Attention은 또 뭔데?"라는 질문에 "아이참 그건 말이다~"라고 시작하면서 점점 목소리가 작아졌던.... 지식이 부족했던 과거를 회상하며 이번 기회에 목소리 유지하면서 설명할 수 있을 정도가 되었으면 하는 목표를 가지고 리뷰를 진행해 보겠습니다😏
Preveiw (리뷰를 마친 후 아래 질문에 답할 수 있기를....)
1. Self-Attention에 대해서 설명하시오.(5점) 2. Dot-Product Attention에 스케일링을 적용한 이유를 설명하시오.(5점) 3. Multi-Head Attention의 장점에 대해 설명하시오.(5점) 4. Transformer 모델에서 사용한 Positional Encoding에 대해서 설명하시오.(5점)
너무 중요한 논문이라 리뷰 블로그나 영상들이 정말 많으니 본 리뷰를 읽으시다가 "엥? 뭔 소리여..."라는 의문이 들으신다면 후다닥 구글링을 통해 정확히 이해하고 넘어가시는 시간을 가지시길 추천드리겠습니다~
📍0. Abstract
기존의 시퀀스 변환 모델들(하나의 시퀀스(문자열)를 입력으로 받아 다른 시퀀스를 출력하는 모델)은 보통 복잡한 순환 구조(RNN)이나 합성곱 구조(CNN) 기반의 인코더-디코더 구조를 사용했음
또한 RNN과 CNN을 기반으로 한 인코더와 디코더 모델 사이에 Attention 메커니즘을 연결하여 성능을 높이곤 했음
본 논문에서는 Transformer라는 완전히 새로운 아키텍처를 제안
Transformer는 오직 Attention 메커니즘만을 사용하고, 순환 구조(RNN)나 합성곱 구조(CNN)를 전혀 사용하지 않음
가장 큰 특징은 병렬 처리가 가능하기 때문에 학습 속도가 빠름
결과적으로 두 가지 기계 번역 과제에서 기존 모델보다 더 나은 품질을 달성
영어 → 독일어 번역(WMT 2014)에서 BLEU 점수 28.4 획득 → 기존 최고 성능보다 2점 이상 향상
영어 → 프랑스어 번역(WMT 2014)에서는 단일 모델 기준 SOTA 점수인 41.8 BLEU 달성 → 단 3.5일, GPU 8개만 사용해 학습
📍1. Instroduction
언어 모델링, 기계 번역 등 시퀀스 모델링과 시퀀스 변환 문제를 다룰 때, 기존에는 주로 RNN, LSTM, GRU 모델들이 사용되었음
그러나 RNN(순환 구조) 같은 경우 "입력 시퀀스의 각 위치를 계산 시간의 단계와 정렬하여, 모델은 t번째 위치의 입력과 이전 시점의 은닉 상태 hₜ₋₁를 기반으로 새로운 은닉 상태 hₜ를 생성하는 반복적인 구조"를 가지기 때문에 명확한 한계점이 존재
병렬 처리가 불가능함 → 훈련 속도 느림
시퀀스가 길어질수록 메모리나 연산량 문제가 커짐
RNN 구조
RNN에서의 Alignment란?
- RNN 관련 논문을 읽다 보면 "Allignemt(정렬)" 단어가 많이 등장한다. 본 논문에서도 RNN을 설명할 때 "Aligning the positions to steps in computation time"이라는 문장이 등장한다. "정렬"... 대체 뭔가... 쉽게 설명하면 "입력이 하나하나 들어올 때마다 계산이 한 번씩 이루어지고, 출력도 하나씩 생성되는 순차적 구조"라는 것이다. 예를 들어 t 시점에 RNN을 통한 계산은 입력 X_t 이 들어오면 이전 시점의 은닉 상태 H_{t-1}를 바탕으로 새로운 은닉 상태 H_t가 계산되고, 그 결과로 출력 Y_t가 생성된다. 즉, 입력이 한 토큰 들어올 때마다 모델 내부에서 계산이 순차적으로 한 번씩 일어나며, 출력도 이에 맞춰 하나씩 나오는 구조이다. 이렇게 입력 위치(position)와 계산 시간 단계(time step)가 일대일로 매칭되는 구조를 두고 “정렬(Alignment)”이라고 표현한다.
- 이 "정렬(Alignment)"은 Transformer처럼 한 번에 전체 시퀀스를 병렬로 처리할 수 있는 모델과 달리, RNN에서는 시간의 흐름을 따르는 연산 흐름이 전제되어 있기 때문에 알고 계시면 관련 논문들을 읽으실 때 편하실 것 같습니다~
위에서 언급한 문제점 이외에도 RNN 구조는 "장기 의존성" 문제를 가지고 있기 때문에 이 대안책으로 Attention 메커니즘이 등장함
장기 의존성 문제? 긴 문장을 RNN 구조를 통해 번역한다고 했을 때, 마지막 단어는 앞선 여러 단계(은닉 1-> 은닉 2->...)를 거치며 의미가 전달되기 때문에 정보가 흐려지거나, 사라질 수 있음 (이걸 “gradient vanishing/exploding problem”이라고도 함)
Attention 메커니즘은 입력과 출력 내의 단어 간 거리에 관계없이 의존성을 효과적으로 모델링할 수 있게 해 줌 (먼 단어들 간 관계를 한 번에 파악할 수 있음)
하지만 본 논문(Transformer) 이전에는 Attention 메커니즘은 여전히 RNN과 함께 사용되고 있었음 (Seq2Seq + Attention)
인코더/디코더는 RNN
중간에 Attention을 삽입하여 성능 보완
Seq2Seq + Attention 구조
따라서, 본 논문에서는 순환 구조를 완전히 배제하고, 대신 입력과 출력 사이의 전역적인 의존성(global dependencies)을 Attention 메커니즘만 사용한 Transformer라는 새로운 모델 아키텍처를 제안
병렬 처리 가능
단 8개의 P100 GPU로 12시간만 학습해도 기계 번역에서 새로운 SOTA 달성
📍2. Background
순차적인 계산을 줄이려는 목표는 Extended Neural GPU, ByteNet, ConvS2S 등의 모델에서도 기본 철학이었음
이들 모델은 모두 합성곱 신경망(CNN)을 기본 구성 요소로 사용하며, 입력과 출력의 모든 위치에 대해 은닉 표현을 병렬로 계산
위 모델들의 단점은 입력 또는 출력 내 임의의 두 위치 간의 정보를 연결하는 데 필요한 연산 수가 위치 간 거리만큼 증가
아무래도 CNN의 기본 전제인 receptive field는 “국소적(local)”이기 때문에 입력 시퀀스를 고정된 커널 크기로 잘라 처리하기 때문에 멀리 떨어진 두 위치 간의 관계를 학습하기 위해서는 여러 계층을 거쳐 점점 확장되며 전달되어함
ByteNet에서는 로그(logarithmic) 형태로 증가 (O(log n))
ConvS2S에서는 선형(linear)으로 증가 (O(n))
ConvS2S 구조
다시 말해, 두 단어가 멀리 떨어져 있을수록 계산이 더 많이 든다는 의미. 이로 인해 서로 멀리 떨어진 위치들 간의 의존 관계를 학습하는 것이 더 어려움
Transformer 특징(장점) 미리 보기
Transformer에서는 이 연산량이 상수 수준으로 줄어듦 (O(1)). 다만, Attention 가중치로 평균을 내기 때문에 표현의 해상도(정보의 선명도)가 떨어지는 단점이 생기지만, 이 문제는 3.2절에서 설명할 Multi-Head Attention 기법을 통해 보완함
어떻게 두 단어가 멀리 떨어져 있어도 계산량이 줄어들까?
Transformer에서 사용한 Self-Attention은 모든 단어가 모든 단어에 바로 접근하여 계산이 가능하기 때문에 연산량은 O(1)
Self-Attention은 (혹은 Intra-Attention이라고도 불리는), 하나의 시퀀스 내에서 서로 다른 위치 간의 관계를 학습하여 그 시퀀스의 전체 표현을 계산하는 방식
End-to-End Memory Network는 전통적인 RNN 기반 순차 정렬 구조 대신 순환 Attention 메커니즘에 기반하여 동작함
End-to-End Memory Network?
문장을 따로 저장해 두고, 그걸 Attention으로 조회해서 정답을 추론
이제 본격적으로 Transformer 모델 구조와 왜 Self-Attention을 사용했는지 알아보겠습니다 🫠
📍3. Model Architecture
Transformer 모델 구조
3.1 Encoder and Decoder Stacks
전체 구조
위 그림에서 볼 수 있듯이 외쪽은 Encoder, 오른쪽은 Decoder 구조 (그림에서 보이는 Encoder, Decoder은 한 층이라고 생각하면 됨. Transformer에서는 각각의 Encoder, Decoder를 6개 쌓아서 만듦)
Decoder에서 각 단계마다 auto-regressive 방식으로 작동하며, 다음 출력을 생성할 때 이전에 생성된 출력들을 추가 입력으로 사용
Encoder,Decoder 각각 2층 쌓았을 때의 구조
Encoder
하나의 인코더 layer 안에는 두 개의 하위 layer가 존재 (Multi-Head Attention과 Feed Forward)
각 하위 레이어마다 잔차 연결(residual connection)을 적용하고, 그 후에 층 정규화(layer normalization)를 수행
다시 말해, 각 하위 레이어의 출력은 LayerNorm(x + sublayer(x)) 이렇게 표현됨
잔차 연결 시 용이한 계산을 위해 모든 하위 layer과 embedding layer의 출력 차원은 512로 통일
Q. 하위 레이어마다 잔차 연결을 적용한 이유는? A. 출력값에 기존 입력값을 더해 줌으로써 정보 손실을 줄이고, 깊은 네트워크에서도 학습이 잘 되게 도와줌
Q. 하위 레이어마다 층 정규화를 적용한 이유는? A. Transformer는 입력 시퀀스를 병렬로 처리하기 때문에, 시퀀스 위치별로 개별적인 피처 분포를 안정화해 주는 것이 중요함. 그래서 층 정규화를 통해 각 입력 벡터의 피처 차원(feature dimension)에서 평균과 분산을 정규화하여, 학습을 안정화하고 수렴을 빠르게 하며, Attention의 학습을 더욱 정교하게 조정하기 위함
Q. 배치 정규화 대신 층 정규화를 사용한 이유는? A. 모델이 입력 시퀀스를 어떻게 처리하는지에 따라 정규화 방식의 적합성이 달라짐. RNN 구조는 입력 시퀀스를 시간 순서대로 하나씩 처리하고, 은닉 상태에 누적해서 정보를 전달하기 때문에, 입력 간 스케일 차이에 비교적 덜 민감함. 이로 인해 과거에는 Batch Normalization이 자주 사용되었음. 반면 Transformer는 "나는 너를 사랑해"와 같은 입력 문장을 각각의 토큰 임베딩 벡터로 변환한 후, 모든 토큰을 동시에 병렬로 Self-Attention에 입력. 이 경우, 각 토큰 벡터 간 스케일 차이가 존재하면, Attention 점수에 직접적인 영향을 주고 문맥이 왜곡될 수 있기 때문에, 각 토큰의 벡터 내 피처 분포를 독립적으로 정규화해 주는 Layer Normalization이 더 적합
Batch Normalization vs Layer Normalization
Decoder
디코더 layer에도 인코더와 마찬가지로 Multi-Head Attention layer와 Feed Forward layer가 존재하고 Masked Multi-Head Attention layer가 추가로 존재함
디코더는 입력된 토큰을 기반으로 다음 토큰을 순차적으로 예측해 출력을 생성하는 역할. 따라서 Transformer의 디코더에서는 Multi-Head Self-Attention에 Masking을 적용하여, 현재 위치에서 미래 위치를 볼 수 없도록 제한함. Self-Attention을 계산할 때 현재 시점보다 이후(미래) 시점의 토큰을 참조하면 안 됨
Masking 전략 (행=현재 토큰 / 열=미래 토큰)
또한 위 [전체 구조] 설명 파트에서 디코더는 Auto-regressive 방식으로 작동한다고 설명드렸는데, 이 부분에 대해 구체적으로 다시 설명드리면, 이를 구현하기 위해 Transformer 디코더에서는 두 가지 핵심 장치가 사용됨
Masked Self-Attention을 통해 각 위치의 토큰이 자기 자신보다 이후(미래)의 토큰을 보지 못하도록 마스킹. 이처럼 디코더는 이전까지의 출력만을 기반으로 다음 출력을 생성하도록 설계되어 있음
학습 시에는 출력 시퀀스를 한 위치씩 오른쪽으로 오프셋(offset) 하여 디코더 입력으로 넣음. 모델이 오직 과거 정보에만 기반해 예측하도록 제한함. 디코더는 출력을 생성할 때 이전까지 생성된 출력 토큰들만을 입력으로 사용하여, 다음 토큰을 하나씩 순차적으로 예측하는 방식으로 작동함
어텐션의 기본 아이디어는 Seq-to-Seq 구조 안에서 디코더에서 출력 단어를 예측하는 매 시점마다, 인코더에서의 전체 입력 문장을 다시 한번 참고한다는 점. 단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 됨
초기 논문(위 NMT)에서는 Query, Key, Value라는 용어는 등장하지 않지만, Self-Attention을 이해하기 쉽게설명하기 위해 이 용어를 미리 사용해서 풀어보자면 다음과 같음
예:“I watched a movie because it was raining”
디코더가 "it”이라는 단어를 생성하려고 할 때, 디코더 내부의 현재 상태를 Query라고 함
→ 지금 “무슨 단어를 넣을지” 스스로 질문하는 역할
이 Query는 인코더가 만든 입력 문장 전체에 대해,→ 예: "I", "watched", "a", "movie",... 와 각각 얼마나 관련 있는지를 비교 후 각 단어가 가진 정보인 Key와 유사도를 계산
계산된 유사도 점수들을 Softmax를 통해 확률처럼 정규화 → 어떤 단어에 더 집중할지를 결정
마지막으로, 그 확률을 각 단어의 Value에 곱해 모두 더함 → 이렇게 만들어진 Context Vector는 “it”을 예측하는 데 필요한 종합 정보가 됨
이제부터 본격적으로 Transformer 모델에서 사용되는 Attention 메커니즘에 대해 설명드리겠습니다. 먼저 전체 구조를 간략히 살펴보면, 3. Model Architecture 파트의 그림에서 볼 수 있듯이, Transformer의 인코더와 디코더에는 모두 입력을 여러 개의 head로 나누어 병렬적으로 Self-Attention을 수행하는 Multi-Head Attention 메커니즘이 사용됩니다. 이 중 디코더에서는 출력 시퀀스를 Auto-regressive 하게 생성해야 하므로, 각 시점에서 미래의 토큰을 참조하지 않도록 Self-Attention 연산 시 미래 위치의 Attention Score를 -∞로 처리하는 마스킹(Masked)을 적용합니다. 이러한 방식은 Masked Multi-Head Attention이라고 불리며, 디코더가 과거 및 현재 토큰만을 기반으로 다음 단어를 예측할 수 있도록 설계된 핵심 메커니즘입니다.
Self-Attention의 기본 아이디어는, 원래 입력(인코더)과 출력(디코더) 사이에서만 작동하던 Attention 메커니즘을 확장하여, 인코더와 디코더 안에서 각각 하나의 문장 안에서도 각 단어가 자기 자신뿐 아니라 문장 내 모든 단어들을 동시에 바라보고(병렬처리), 이들과의 의미적 관계에 따라 가중치를 다르게 부여해 정보를 통합하자는 데 있음
예: "The animal didn't cross the street because it was too tired"
위 예시 문장에서 "it"이 가리키는 것이 animal인지 street인지 모델이 어떻게 학습할 수 있을까?
물론 문장 자체가 임베딩 되어 들어오기 때문에 it - because 토큰과의 유사도보다는 it - animal 토큰 사이의 유사도는 높을 수 있음.
그러나 문맥 자체에서 의미하는 바는 정확히 알지 못하기 때문에 Query, Key, Value값들을 이용해서 찾아냄
Query : 지금 처리하고 있는 토큰 벡터
Key : 문장 모든 토큰 벡터
Value : Key에 해당하는 실제 정보 값 (최종 가중합 대상)
모델은 Query와 모든 Key 사이의 유사도 점수(Attention Score)를 계산하고 이 점수를 Softmax로 정규화한 뒤, 가장 높은 가중치를 갖는 Value들을 종합해 문맥 정보를 구성
결론적으로 Self-Attention에서는 “it”이라는 단어가 문장 내에서 어떤 의미를 갖는지 스스로 결정하기 위해 자신(Query)과 문장 내 다른 단어(Key)들의 관계를 비교하고, 가장 관련 있는 단어(“animal”)의 정보를(Value) 더 많이 반영하도록 학습
Self-Attention
Attention vs Self-Attention
3️⃣ Scaled Dot-Product Attention
Dot-Product
먼저 Scaled 하기 전인 기본 Dot-Product Attention(위에서 설명한 Self-Attention이라고 생각하면 편함)을 살펴보겠음
입력 문장이 들어왔을 때, 이를 하나의 행렬로 표현하고 Query, Key, Value를 구하기 위한 각각의 학습 가능한 가중치 행렬(Wq, Wk, Wv)을 곱해 Query, Key, Value를 구함
그리고 구해진 Query와 Key를 내적(Dot-Proudct)을 통해 Attention Score를 구하고 여기에 Softmax 함수를 취해 Attentions Distribution(가중치)을 구함
마지막으로 Value를 곱해 최종 Attention Value를 구함
그런데 여기서 Softmax 들어가는 Attention Score의 값(Dot-Proudct of Query and Key)이 너무 크거나 작다면 어떻게 될까?
아래 Softmax 함수 그림을 보면 값이 커지거나 작아질 때 출력이 0 또는 1에 가까워지는 포화 영역으로 수렴하는 것을 확인할 수 있음
이렇게 확률 분포가 매우 극단적으로 편향되면 미분(=기울기)이 0에 가까워지게 되고, 결과적으로 역전파 시Gradient가 매우 작아져서(Gradient Vanishing) 학습이 어려워지는 현상이 발생
Softmax 함수
따라서 본 논문 저자들은 이를 방지하기 위해 Attention Score를 Softmax에 넣기 전에 루트 dk로 나누는 스케일링(Scaling) 기법을 도입
이렇게 스케일링 기법을 적용한 Attention을 Scaled Dot-Product Attention이라고 함
Scaled Dot-Product Attention 수식
Scaled Dot-Product Attention 그림
4️⃣ Multi-Head Attention
Single(기존) Attention은 (4*4) 입력이 들어오면 (4*8) Q, K, V를 이용한 Attention 계산을 통해 (4*8) 최종 Attention Value를 구했음
Single Attention
그러나 Transformer 논문 저자들은 Query, Key, Value를 각각 h번 서로 다른 학습 가능한 선형 변환을 통해 각각 d_k, d_k, d_v 차원으로 선형 투영(linear projection) 하는 것이 더 효과적임을 발견함
다시 말해, (4*8) Q, K, V를 임의의(하이퍼파라미터) Head 수로 각각 나눠 계산하고 나중에 Concat 하여 기존과 동일한 (4*8) 크기의 Attention Value를 구하는 방식
아래 그림을 예로 들면, Head는 4 지정하여 (4*8) 크기의 Q, K, V를 각각 4 등분하여 (4*2) 크기로 만들어 문장 안에 있는 다양한 관점들을 병렬적으로 학습하고 결과를 Concat 하여 (4*8) 최종 Attention Value를 구함
Multi-Head Attention
논문 저자들은 전체 모델 차원을 d_model = 512로 설정하였고, Head 수를 8로 지정하여 각 Head가 d_k = d_v = 64차원에서 Attention을 수행하게 하였음
Multi-Head Attention 수식
Multi-Head Attention.. 성능이 그렇게 좋아?
- 앞서 살펴본 바와 같이, Multi-Head Attention은 Self-Attention을 병렬로 h번 수행하는 구조입니다. 이는 단일한 Q, K, V를 사용하여 문장의 의미를 파악하는 것이 아니라, 여러 개의 Q, K, V를 통해 하나의 문장을 다양한 관점에서 바라보고, 각 토큰 간의 다양한 관계를 포착할 수 있게 합니다. 이러한 구조는 모델이 다양한 의미적 관계와 표현을 동시에 학습할 수 있도록 하여, 문맥 이해와 표현력 측면에서 큰 장점을 제공합니다. - 또한, 각 Head의 차원을 (d_model/ h)로 축소하여 연산하기 때문에, 전체 연산량은 단일 Head를 사용하는 경우와 유사하게 유지됩니다. 즉, 표현력은 향상되면서도 연산 효율성은 유지되는 구조입니다. - 추가적으로 동일한 총 Attention Head 수를 갖는 모델에서, 얕은 Multi-Head 구조가 깊은 Single-Head 구조보다 학습 안정성이 높고 수렴 속도가 빠르다는 결과를 보인 연구결과도 있습니다. 이는 Multi-Head 구조가 병렬로 다양한 표현을 학습하면서도, 학습 과정에서의 불안정성을 줄여주는 효과가 있음을 시사합니다. Multi-Head Attention을 통한 다양한 관점 파악
- 카카오에서 개발한 LLM인 Kanana tech blog를 읽다가 "복잡한 추론 능력 저하에 가장 큰 영향을 미치는 요소 중 하나가 어텐션 헤드(Attention head) 수의 감소"라고 연구 결과가 있길래 스윽 첨부합니다. [링크 : https://tech.kakao.com/posts/707]
4️⃣ Masked Multi-Head Attention
위에서 설명한 Multi-Head Attention에다가 Masked를 씌어 디코더에서 사용한 Masked Multi-Head Attention에 대해 살펴보자
Transformer는 입력 문장을 한 번에 전체 시퀀스로 받아 병렬로 처리함. 하지만 디코더는Auto-Regressive 방식으로 작동하기 때문에, 현재 시점까지 생성된 단어들만 기반으로 다음 단어를 예측해야 함
따라서 학습 과정에서도 디코더가 미래의 단어를 미리 참조하지 않도록, Self-Attention 연산 시 이후 위치의 토큰을 마스킹 처리
이 방식은 Masked Multi-Head Attention이라 불리며, Attention Score 계산 시 미래 토큰에 해당하는 위치의 값을-♾️로 설정하여 Softmax 결과가 0이 되게 하고, 오직 (과거 + 현재) 위치 정보만 반영되도록 만듦
5️⃣ Applications of Attention in our Model
Attention 설명 끝나간다........😮💨
최종적으로 Transformer는 Multi-Head Attention을 총 세 가지 방식으로 사용
Encoder-Decoder Attention
Seq-to-Seq 구조에서 인코더와 디코더를 연결하는 부분
Query는 이전 디코더 레이어로부터, Key와 Value는 인코더의 출력에서 가져옴
이 구조는 디코더의 각 토큰이 인코더의 전체 입력 시퀀스(=모든 토큰)를 참조(attention)할 수 있게 해 줌
Encoder Self-Attention
Self-Attention에서는 Query, Key, Value가 모두 같은 위치, 즉 이전 인코더 레이어의 출력에서 나옴
따라서 인코더 내의 모든 토큰은, 인코더의 이전 레이어에서 나온 전체 토큰을 자유롭게 참조할 수 있음
인코더는 전방향 자유롭게 Attention을 할 수 있는 구조 (예: 현재 단어가 앞 단어든 뒷 단어든 자유롭게 관계를 맺을 수 있음)
Decoder Masked Self-Attention
디코더의 Self-Attention도 각 위치가 그 위치를 포함하여 그 이전의 모든 토큰들까지 참조할 수 있게 해 줌
디코더가 Auto-Regressive(순차 생성) 구조를 유지하도록 하기 위해, 왼쪽 방향 정보 흐름(미래 → 과거)을 막을 필요가 있음
이를 구현하기 위해, Scaled Dot-Product Attention 안에서 허용되지 않은 위치(미래 위치)에 대해서는 Softmax 입력을 -♾️로 설정하여 마스킹 처리
3.3 Position-wise Feed-Forward Networks
FFN
Transformer 모델 안 인코더와 디코더에는 Attention 하위 계층 외에도, 완전연결(fully connected) 형태의 피드포워드 네트워크(FFN)를 포함하고 있음
이 네트워크는 문장 내 각 위치에 대해 독립적으로, 그리고 동일하게 적용됨. 즉, 토큰마다 따로 FFN을 적용하지만, 모든 토큰에 똑같은 FFN 구조를 씌운다는 의미(병렬 처리 가능)
이 FFN은 두 개의 선형 변환 사이에 ReLU 활성화 함수를 사용하는 구조로 구성되어 있음
선형 변환 자체는 모든 위치에서 동일하게 적용되지만, "레이어마다 다른 파라미터(W, b)를 사용함"
입력과 출력의 차원은 Transformer의 기본 모델 차원인 512, 중간 은닉층(내부 차원)은 d_ff = 2048로 확장됨
왜 Attention 뒤에 FFN을 적용하는가?
Self-Attention만으로는 충분히 표현되지 않는 비선형 변환과 복잡한 표현을 추가하기 위해
Attention 연산은 각 토큰의 위치 간의 관계는 잘 포착하지만, 개별 토큰에 대한 표현 확장은 제한적이기 때문에 각 위치의 벡터에 비선형 변환 (ReLU 포함 MLP)을 수행함으로써, 그 위치가 담고 있는 의미를 더 복잡하고 강하게 표현하기 위해
3.4 Embeddings and Softmax
이 파트는 Transformer 모델의 입력-출력의 양 끝단에 해당
입력 토큰과 출력 토큰을 학습된 임베딩 벡터로 변환
디코더의 출력은 학습된 선형 변환과 Softmax 함수를 통해 다음 토큰이 나올 확률 분포로 변환됨 (즉, Decoder Output → Linear → Softmax → 확률)
Transformer에서는 입력 임베딩, 출력 임베딩, Softmax 이전의 선형 변환에 "같은 가중치 행렬을 공유"
이렇게 하면 파라미터 수가 줄고, 입력-출력 임베딩 공간의 정렬이 자연스러워짐
임베딩을 할 때는, 해당 임베딩 벡터에 (루트 임베딩 차원)를 곱해줌. 초기값이 너무 작으면 Gradient가 약해지고, 너무 크면 Softmax 포화 문제가 생기므로, 스케일 안정성을 위해 곱해주는 방식
3.5 Positional Encoding
Transformer 모델에서 인코더와 디코더에 각각 입력 문장이 들어갈 때 토큰 단위로 자른 뒤 임베딩 처리뿐만 아니라 "각 토큰의 위치 정보"까지 더해서 들어가게 됨
그 이유는 Transformer는 RNN처럼 입력이 순차적으로 들어오는 것이 아니라 한 번에 통으로 들어오기 때문에 입력 시퀀스의 순서 정보를 자동으로 반영하지 못함
논문 저자들은 사인 함수와코사인 함수를 사용해 위치 인코딩을 생성 (위치 인코딩은 학습 가능한 방식과 고정된 방식이 있음)
왜 주기 함수를 사용할까?
위치 간의 상대적 거리 정보를 표현할 수 있음
PEpos + k는 PEpos와 일정한 수학적 관계를 가짐
위치 3과 7의 차이는 일정한 형태로 표현되므로, 모델이 ‘상대 위치’를 선형 연산만으로 파악할 수 있음
다양한 길이의 관계 표현 가능
사인/코사인 함수에 다양한 주파수(파장)를 넣으면 낮은 주파수(긴 파장)는 천천히 변화하며 장기적 위치 관계를 표현하고 높은 주파수(짧은 파장)는 빠르게 변화하며 국소적(단기) 위치를 표현함
이렇게 하면 멀리 떨어진 단어 간 관계와 가까운 관계를 동시에 모델링할 수 있음
수학적으로 연속적이며 무한한 길이로 확장 가능
학습 기반 위치 임베딩은 정해진 위치 수만 학습함 (예: pos 0~512까지만)
하지만 사인/코사인 기반은 입력 길이에 제한 없이 일반화 가능. 즉, 훈련보다 더 긴 시퀀스를 처리할 때도 자연스럽게 확장 가능
수식
pos : 토큰의 위치(0,1,2...) / i : 임베딩 차원에서의 인덱스(0부터 시작) / 짝수 인덱스는 사인 함수를 홀수 인덱스는 코사인 함수 사용
다양한 주파수의 sin/cos 파형을 조합해서 모델이 위치 정보를 간접적으로 유추할 수 있게 만듦
다양한 파형을 조합해 토큰의 위치 값 생성
📍4. Why Self-Attention
RNN, CNN과 비교하여 왜 Self-Attention이 더 좋은지 설명하는 부분
Self-Attention의 장점을 뒷받침하는 3가지 기준
연산량
RNN의 연산량 보다 높아 보일 수 있지만, 실제로는 병렬 연산 최적화가 가능하기 때문에 효율적
병렬 처리 용이성
시퀀스 전체를 한 번에 병렬로 연산할 수 있어 GPU와 TPU의 연산 효율을 극대화할
긴 거리 의존성 학습 능력
자연어에서는 멀리 떨어진 단어 간의 관계를 이해하는 것이 매우 중요
RNN에서는 이 관계를 학습하기 위해 많은 시간 스텝을 거쳐야 하고, 경로가 길어지면서 정보가 희석됨
CNN도 여러 층을 쌓아야 멀리 떨어진 토큰을 연결할 수 있기 때문에 한계가 존재함
Self-Attention은 입력 시퀀스의 모든 위치가 서로 직접 연결되기 때문에, 어떤 두 단어 사이든 경로 길이(path length)가 항상 1
이렇게 짧은 경로는 정보 전달을 빠르게 하고, 멀리 떨어진 단어 간의 관계도 쉽게 학습할 수 있게 만듦
그러나 Self-Attention은 시퀀스가 길어질수록 비용이 증가하는 단점 존재
이를 보완하기 위해 논문에서는 제한된 Self-Attention(restricted attention)도 제안
예를 들어 주변 단어 r개만 보는 식으로 범위를 좁히면 경로 길이는 O(n/r)로 늘어나지만 계산량은 줄일 수 있음
📍5. Training
Training Data and Batching
WMT 2014 English-German 데이터
Byte-pair encoding
BPE : 자주 등장하는 문자/서브워드를 병합해 어휘를 만드는 압축 기반 토크나이저. “playing” → “play”, “ing”처럼 단어를 잘게 쪼개면서 어휘 크기를 줄임
WMT 2014 English-French 데이터
32,000개 크기의 WordPiece Vocabulary
WordPiece : BERT에서 사용하는 서브워드 분할 방식 (BPE와 유사하지만 확률 기반)
배치 구성 시에는 문장의 길이가 비슷한 것들끼리 묶어 패딩 낭비를 줄였고, 각 배치는 입력 토큰 약 25,000개, 출력 토큰 약 25,000개로 구성
Hardware and Schedule
학습에는 NVIDIA P100 GPU 8개가 장착된 단일 머신
Base 모델: 10만 스텝 (12시간) / Big 모델: 30만 스텝 (3.5일)
Optimizer
학습에는Adam Optimizer를 사용 (beta_1 = 0.9,beta_2 = 0.98,epsilon = 10^{-9})
학습률
모델 차원이 커질수록 학습률을 작게 조정
학습 초반 4000 스텝 동안은 학습률이 선형으로 증가하며(warm up 단계), 그 이후에는 역제곱 루트에 비례해 줄어드는 구조
Regularization
각 서브레이어의 출력값에 Dropout을 적용
임베딩(단어 정보) + 포지셔널 인코딩(위치 정보)의 합에도 dropout을 적용
Base model에서의 드롭아웃 확률은 10%
정답 라벨에 대해 label smoothing 기법을 사용
원-핫 벡터처럼 확신하는 정답(1.0) 대신, 정답은 0.9, 나머지는 소량의 확률(예: 0.1/|Vocab|)로 분산시키는 방식
단점: Perplexity(언어모델의 확신도)는 떨어질 수 있음
장점: 모델이 과하게 확신하지 않게 되어, 결과적으로 정확도(accuracy)와 BLEU 점수(번역 성능 지표)는 향상됨
📍6. Results
Machine Translation
EN-DE
Transformer Big 모델이 기존 최고 성능(앙상블 포함)보다 2.0점 이상 높은 BLEU 점수를 기록
기본 모델(Base Transformer) 조차 기존의 모든 모델(심지어 앙상블)보다 성능이 좋았으며, 훈련 비용은 훨씬 낮음
EN-FR
SOTA 달성. 게다가 학습 비용은 1/4 수준에 불과
Model Variations
Transformer의 다양한 구성 요소가 성능에 미치는 영향을 실험적으로 분석
(A) 어텐션 헤드 수 및 차원 변화
헤드 수가 너무 적으면 (예: single-head) BLEU ↓ (−0.9), 너무 많아도 품질 저하
(B) 어텐션 key 크기 d_k 축소
모델 품질 저하 → 단순한 dot-product 외의 복잡한 함수 고려 필요
(C), (D) 모델 크기 및 드롭아웃
큰 모델일수록 성능 향상, dropout은 과적합 방지에 매우 효과적
(E) 포지셔널 인코딩
사인/코사인 방식 vs 학습된 임베딩 → 거의 동일한 결과
English Constituency Parsing
Transformer가 기계 번역 외 다른 작업에도 일반화 가능한지 확인하기 위해 영어 구문 분석(Constituency Parsing) 실험 수행
Transformer는 구조 제약이 강하고 출력이 더 긴 parsing 작업에도 매우 잘 작동함
태스크 특화 조정 없이도 기존 모델을 대부분 능가함
특히 반지도 학습 설정에서 기존 RNN 기반 파서보다 성능 우수
📍7. Conclusion
Transformer는 최초의 Attention 기반 시퀀스 변환 모델로, 기존 RNN이나 CNN 없이 전적으로 Multi-Head Self-Attention만으로 구성됨
💬 8. Takeaway
리뷰 쓰는데 길고도 정말 길었다.. 그래도 알듯 말듯 했던 Transformer 모델에 대해서 이제는 그나마 알 것 같다. 읽으면서 왜 이 논문이 현재 LLM 뿐만 아니라 AI 전반에 영향을 미치는지 알 수 있었다. 지금도 Attention에 대응하는 새로운 메커니즘(물론.. Mamba!?..였나..)이 나오지 않는 것을 보면 진짜 이걸 어떻게 생각했지...라는 생각이 든다. 오늘로써 리뷰를 끝내는 것이 아니라 아마도 다른 논문들을 읽으면서 이곳을 다시 방문하여 내용적으로 틀린 부분이나 추가할 사항이 있으면 고칠 계획이다. 긴 글 읽어주셔서 감사합니다~