Transformer
Introduction
어탠션 메커니즘에만 기반하여 RNN과 CNN을 배제
LSTM과 GRU는 오랜 시간 동안 SOTA 모델로 자리잡았음 (1997년 LSTM 발표된 이후) 시간에 따라 위치를 정렬하고 이전 은닉 상태를 바탕으로 새로운 은닉 상태를 봄
하지만 이러한 접근은 병렬을 어렵게 만들며 배치 처리 한계가 있음
Background
어탠션 매커니즘
선행 연구 한계) 입력과 출력의 시퀀스 내에 거리와 무관한 의존성의 매커니즘을 만든다. 하지만 이전 연구는 Attention에서 순환 신경망을 포함해야 함
Transformer의 연구 쟁점) 순환 구조를 배제하고 입력과 출력간의 전역적인 의존성을 어탠션 매커니즘 만으로 처리하는 새로운 모델 아키텍쳐 제공
선행연구 한계) Bytenet, ConvS2S 등과 같은 모델은 서로 다른 신호 간에 연결하기 위해 필요한 연산 수가 위치에 따라 선형적으로 증가한다. 먼 거리 위치 간에 의존성 학습에 어려움이 있음
Transformer의 장점) 연산 수를 상수 수준으로 기하급수적 감소 해상도가 낮아지는 문제가 있지만 Multi-head attention으로 극복
Self Attention
하나의 시퀀스 내에 서로 다른 위치 간의 관계를 파악하여 시퀀스의 표현을 계산하는 어텐션 매커니즘
Transformer는 RNN과 CNN을 사용하지 않고 Self-Attention을 시퀀스 정렬 기반으로 사용하는 최초의 모델이다.
Model Architecture
Transformer는 기존 시퀀스 변환 모델들처럼 인코더-디코더 구조를 따릅니다.
- 인코더: 입력 시퀀스 (x1,...,xn)(x_1, ..., x_n)을 연속적인 표현 (z1,...,zn)(z_1, ..., z_n)으로 변환
- 디코더: 이 표현을 바탕으로 출력 시퀀스 (y1,...,ym)(y_1, ..., y_m)을 하나씩 자동 생성(auto-regressive)
- 이전에 생성된 출력 단어들을 다음 생성에 활용
Transformer는 이 구조 속에서 RNN 없이,
모든 층을 Self-Attention + 포인트-와이즈 완전 연결 계층으로 구성합니다.
Encoder and Decoder
1. 인코더란?
- 입력 문장을 받아서 의미 있는 벡터(숫자 표현)로 바꾸는 부분
- 6개의 같은 층(layer)이 쌓여 있음
- 각 층은 두 가지 처리를 해요:
- (Self-Attention) → 문장의 각 단어가 다른 단어들을 참고함.
- (Fully Connected Feed-Forward Network) → 각 단어 표현을 좀 더 다듬기
그리고 각 처리 결과는 원래 입력에 더한 다음, Layer Normalization으로 안정적으로 훈련되도록 함.
2. 디코더란?
- 같은 출력 문장을 하나씩 생성하는 역할
- 역시 6개의 층(layer)이 있고, 한 층은 3가지 처리를 해요:
- Self 어텐션 (하지만 미래 단어는 못 보게 막아둠 → 마스킹)
- 인코더의 출력값을 바라보는 어텐션 (입력 문장에서 어떤 단어를 참고할지 결정)
- Fully connected network
→ 즉, 자기 이전 단어만 보면서, 인코더가 만든 정보를 참고해서, 하나씩 단어를 생성하는 구조
핵심 요약
- 인코더: 입력 문장을 처리하는 6개 층, Self어텐션 + 신경망으로 구성
- 디코더: 출력 문장을 생성하는 6개 층, Self어텐션 + 인코더 참고 + 신경망
- 모든 층마다 안정적 학습을 위해 잔차 연결 + 정규화(LayerNorm) 사용
- 디코더는 미래 단어를 보지 못하도록 마스킹(masking) 함
Attention
하나의 쿼리와 여러 개의 키 값 쌍을 하나의 출력으로 매핑하는 함수
쿼리-키-값 모두 벡터
출력은 값들의 가중합으로 계산되지만 각 값에 부여되는 가중치는 쿼리와 해당 키 간의 유사도를 계산하는 함수에 의해 결정
Scaled Dot-Product Attention
쿼리와 키의차원은 d_k, 값의 차원은 d_v
1. 쿼리와 모든 키 dot product를 계산
2. 각 dot product 결과를 루트 d_k로 나누어 스케일링
3. 이 결과를 softmax 적용해 확률분포(가중치) 얻음
4. 이 가중치 값을 곱하여 최종 출력 벡터 얻음
Multi-Head Attention
기존의 어텐션 방식은 쿼리(Query), 키(Key), 값(Value)를 한 번만 이용해서 어텐션을 수행 하지만 이 논문은 성능을 더 향상시키기 위해 다음과 같은 방식의 멀티헤드 어텐션(Multi-Head Attention)을 수행
어떻게 다르냐면?
- 쿼리, 키, 값을 h번 각각 다른 방식으로 선형 변환합니다.
- 그렇게 나온 개의 쿼리/키/값을 가지고 어텐션을 병렬로 h번 수행
- 각 어텐션의 출력은 v_차원 벡터
- 이 h개의 출력을 이어붙인 뒤(concatenate) 다시 선형 변환하여 최종 출력 생성
🔸 장점은?
멀티헤드 어텐션은 서로 다른 위치에서, 서로 다른 표현 공간(representation subspace)에서의 정보를 동시에 바라볼 수 있게 해줍니다.
단일 어텐션 헤드에서는 평균을 취하게 되어 이런 다양한 시각이 제한되기 쉽습니다.
멀티헤드 어텐션은 하나의 어텐션을 여러 시점과 의미공간에서 병렬로 수행하여 더 풍부한 표현을 만들 수 있도록 하는 핵심 구조입니다.
Positional Encoding
RNN은 앞에서부터 단어를 하나씩 순서대로 처리, Transformer는 단어들을 전부 한꺼번에 보면서 계산, 첫 번째 단어인지 마지막 단어인지 구분 x -> Positional Encoding으로 순서를 넣음
여기에 숫자 정보를 넣어주는 것, sin, cos을 만듦, 고유한 숫자 패턴이 생기며 훈련에서 본 적 없는 긴 문장도 표현 가능함