핵심 포인트
구글이 2017년에 발표한 “Attention Is All You Need” 논문은 RNN 계열을 완전히 대체할 수 있는 병렬 처리 기반 시퀀스 모델을 제시하며, 이후 모든 NLP·AI 연구의 패러다임을 바꿨습니다. 이 해설에서는 논문의 주요 구성 요소를 코드 구현 관점과 수식, 직관적 설명 세 가지 측면에서 자세히 unpack 합니다.
논문은 인코더(6개 레이어)–디코더(6개 레이어) 구조를 제안합니다.
# 의사 코드(pseudocode)
for layer in 1..6:
x = LayerNorm(x + MultiHeadSelfAttention(x))
x = LayerNorm(x + FeedForward(x))
encoder_output = x
for layer in 1..6:
y = LayerNorm(y + MaskedMultiHeadSelfAttention(y))
y = LayerNorm(y + MultiHeadAttention(y, encoder_output))
y = LayerNorm(y + FeedForward(y))
decoder_output = y
pos와 i에 따라 미리 계산한 행렬을 임베딩에 더해줌. pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
embeddings = token_embeddings + pe[:seq_len]scores = torch.matmul(Q, K.transpose(-2,-1)) / math.sqrt(d_k)
weights = torch.softmax(scores, dim=-1)
output = torch.matmul(weights, V)
heads = []
for i in range(num_heads):
Qi = Q @ W_Q[i]
Ki = K @ W_K[i]
Vi = V @ W_V[i]
head = scaled_dot_product_attention(Qi, Ki, Vi)
heads.append(head)
multi_head = torch.cat(heads, dim=-1) @ W_O
def feed_forward(x):
return self.linear2(F.relu(self.linear1(x)))
x = LayerNorm(x + sublayer(x))
-inf를 더해 softmax가 0을 출력하도록 처리mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()
scores = scores.masked_fill(mask, float('-inf'))
MultiHeadAttention, PositionwiseFFN, PositionalEncoding, TransformerEncoderLayer, TransformerDecoderLayer 등 클래스로 분리 LambdaLR로 워밍업(warmup_steps) 적용 결론:
“Attention Is All You Need” 논문은 병렬성과 유연성, 성능을 모두 잡은 모델로, 이후 GPT·BERT·T5 등 전 세계 AI 커뮤니티가 활용하는 Transformer 패밀리의 출발점입니다. 주니어 개발자라면 위 구성 요소를 하나씩 코드로 직접 구현해 보고, 작은 번역기나 요약기 프로젝트를 통해 학습 흐름을 몸으로 익히길 추천합니다.
출처
[1] <지식 사전> 트랜스포머(Transformer)가 뭔데? AI 혁명의 핵심 ... https://blog.kakaocloud.com/91