Search

Transformer

카테고리
DL/ML
Index
DeepLearning
Transformer
날짜
2024/12/19

1. Transformer

2017년에 구글이 제안한 자연어처리 모델로, 컨볼루션 신경망과 순환 신경망 구성요소를 모두 사용하지 않고 Attention만으로 구현한 신경망 구조
Attention 만으로 구현한 모델
인코더-디코더 구조이지만 RNN을 사용하지 않음
문장의 모든 단어를 한꺼번에 입력으로 넣고, self-attention을 수행함
단어는 임베딩을 통해서(Input Embedding Layer) dmodeld_{model} 차원의 임베딩 벡터로 표현
→ T 개 단어를 가진 문장은 T×dmodelT \times d_{model} 행렬이 되는 것!
Position Encoding 을 추가해서 전체 문장 내에서 단어의 위치 정보를 추가

1.1 Model Architecture

인코더로부터 정보를 받아 디코더가 출력 결과를 만들어내는 구조

1. Input Embedding Layer

단어 임베딩을 통해서 입력 단어를 d_{model}의 차원 벡터로 변환
T개 단어로 구성된 문장을 한꺼번에 입력할 때는 T×dmodel T \times d_{model} 크기의 행렬 S를 입력
단어의 순서정보를 기억하기 위한 Positional Encoding 도입
위치정보를 표현한 P를 입력 벡터 S에 더해 X행렬을 만듦 (X=S+P)(X= S+P)
각 임베딩 벡터에 Positional Encoding값을 더하면 같은 단어라도 문장 내 위치에 따라 Transformer의 입력으로 들어가는 임베딩 벡터의 값이 달라져서 순서 정보를 고려한 임베딩 벡터를 만들 수 있음
삼각함수를 이용한 Positional Encoding 행렬 생성
각 pos 별로 벡터의 각 차원 (2i, 2i+1)에 고유한 값을 생성하는 방식으로 position encoding 생성
i : 모델 차원에 대한 인덱스 값 (dmodel=8d_{model}=8 이면, i=0,1,….,7}
sin과 cos은 서로 다른 위상을 가진 함수이고, 서로 직교하는 성질이 있기 대문에 모델이 입력 벡터간의 상대적 위치 정보를 더 효과적으로 계산가능

2. Encoder -6 Encoder blocks

각 인코더는 Self Attention을 수행하는 Multi-head Attention(MHA)과 완전연결층인 Feed Foward(FF) 층으로 구성됨
Encoder의 MHA 층
self-attention을 담당하고, 문장을 구성하는 단어끼리의 attention을 처리
인코더로 입력된 문장의 단어벡터들이 Query=Key=Value 역할을 함(Self-Attention)
Self-Attention
한 문장의 길이가 T개의 단어여서 T개의 단어 각각이 Query이고 ,하나의 행렬 Q로 표현됨
입력 임베딩 X가 Key, Query, Value 값으로 동일하게 사용되고, 자신의 가중치 WQ,WK,WVW^Q, W^K, W^V 로 X를 변환해서 사용
WQ,WK=dmodel×dkey,W^Q, W^K = d_{model}\times d_{key}, WV=dmodel×dvalueW^V = d_{model}\times d{value}
논문에서 dkeydvalued_{key} d_{value} dmodel=512h=8=64\frac{d_{model} =512} {h=8} = 64 로 지정
가중치 벡터 WQ,WK,WVW^Q, W^K, W^V 는 학습으로 알아냄 (trainable-parameters)
Self-Attention 예시
Multi-Head Attention(MHA)
여러 개의 헤드를 가져서 병렬적으로 Self-Attention 연산을 수행
→ 논문에서는 헤드수가 8개여서 5128=64 \frac{512}{8}=64 차원의 Q,K,V를 각 헤드에서 어텐션 수행
각 헤드는 고유한 변환 행렬을 가지고 self-attention을 독립적으로 수행하고 추후 합쳐서 서로 상호보완적인 역할을 해 성능이 향상됨
C=Concatenate(C1,C2,,Ch)WoC = Concatenate(C_1, C_2, … ,C_h)W^o
Ci=softmax(QiKiTdkey)ViC_i = softmax(\frac{Q_iK_i^T}{\sqrt d_{key}})V_i
WoW^odmodel×dmodeld_{model}\times d_{model} 차원변환 행렬

3. Decoder - 6 Decoder blocks

각 디코더 블록은 2개의 MHA 층과 1개의 FF층으로 총 3개의 층으로 구성됨
Decoder MHA 층
인코더와 디코더 사이의 attention을 담당, Query, Key, Value가 동일하지 않아서 Self-Attention은 아님
디코더가 인코더의 정보를 기반으로 현재 출력 토큰을 생성할 수 있도록함
Query : 디코더 출력데이터 벡터
Key, Value : 인코더 벡터 → 인코더의 컨텍스트 정보 활용
Decoder의 Masked MHA 층, Self-Attention 수행
디코더의 입력 시퀀스들(이전 시점에서 생성된 토큰들)이 Query=Key=Value 값으로 적용됨
Masking을 통해서 이전 시점의 토큰들만 참고해서 다음 출력을 생성할 수 있도록 함
→ Teacher forcing과 Self Attention 방식의 차이를 극복하기 위해 mask 적용
학습 단계에서는 Self-Attention과 Teacher forcing 중 선택가능, 추론 단계에서는 Self-Attention 만 가능
Transformer는 학습단계에서는 Teacher forcing(Masking), 추론에서는 Self-Attention을 사용
Masking은 QK^T 행렬의 대각선 위쪽에 있는 모든 요소를 아주 큰 음수로 설정
디코더는 시작 심볼인 <sos> 를 입력받아 종료 심볼 <eos>가 나올때 까지 연산을 진행

4. Add&Norm layer

각 층 사이에는 Add&Norm 층이 추가되어 있음
Add : residual connection 수행
모델의 이전 레이어 or 입력 임베딩인 X와 MHA를 거친 컨텍스트 정보 C를 연결하는 잔차연결 수행
X와 C를 더함으로써 원래의 입력정보를 유지하면서 어텐션 정보를 추가
Norm : layer normalization 정규화
X=Norm(X+C)=Norm(X+MHA(X))X' = Norm(X+C) = Norm(X+MHA(X))

5. FF layer (point-wise Feed-Forward Layer)

기존 완전연결층은 벡터와 벡터를 연결하는데 여기서는 T×dmodelT \times d_{model} 크기의 행렬과 dffd_{ff} 차원의 벡터를 연결
X’’=FFN(X)=ReLU(XW1+b1)W2+b2X’’ = FFN(X’) = ReLU(X’W_1 + b_1)W_2 + b_2
X’ : T×dmodelT \times d_{model} 크기의 행렬
W_1 : dmodelxdff d_{model} x d_{ff}

1.2 인코더, 디코더에서 학습 시 알아내야할 가중치

논문에서 주어진 파라미터
dmodeld_{model} = 512
헤드 수 h = 8
dkey,dvalued_{key}, d_{value} = 512/8 = 64
dff=4×dmodel=2048d_{ff} = 4 \times d_{model} = 2048

Encoder

1.
MHA 층
가중치 집합은 W1Q,W1K,W1V,.,WhQ,WhK,WhV,WoW_1^Q, W_1^K, W_1^V , …. , W_h^Q,W_h^K,W_h^V, W^o 로서 총 3h+13h+1
WoW^o : Multi-head Attention의 최종 출력 가중치
Q,K 와 관련된 가중치 행렬은 dmodel×dkey=512×64 d_{model}\times d_{key} = 512 \times 64
V와 관련된 가중치 행렬은 dmodel×dvalue=512×64d_{model}\times d_{value} = 512 \times 64
총 가중치 개수 = 8 * 3 * 512 * 64 + 512*512 = 1,048,776
2.
FF 층
W1:dmodel×dff,W2=dmodel×dffW_1 : d_{model} \times d_{ff}, W_2 = d_{model} \times d_{ff} 개의 가중치 가지고, b1b_1의 크기는 dffd_{ff}, b2b_2의 크기는 dmodel d_{model}
X’’=FFN(X)=ReLU(XW1+b1)W2+b2X’’ = FFN(X’) = ReLU(X’W_1 + b_1)W_2 + b_2
한 블록 당 가중치 수 = 512*(2048+1)+2048*(512+1)
3.
인코더의 총 가중치 개수
6(1,048,576_2,099,712) = 18,889,728

Decoder

1.
두 MHA층의 각각의 가중치 개수는 인코더의 MHA와 같음
→ 2*1,048,576 = 2,097,152
2.
FF층 또한 인코더와 동일
→ 2,099,712
3.
디코더의 총 가중치 개수 = 6(2,097,152 + 2,099,712)= 25,181,184