Paper Review원 논문·수식·구조 대조

Transformer를 제대로 이해하기 위한 Attention Is All You Need 읽기

Transformer를 외우는 글이 아니라 설명할 수 있게 이해하는 글. Attention, QKV, multi-head, encoder-decoder, mask, positional encoding을 원 논문 흐름대로 풀어 쓴다.

Transformer는 AI를 공부할 때 피해 갈 수 없는 근간이다. LLM을 한다면서 Transformer를 설명하지 못하는 것은, Spring 백엔드 개발자가 Java의 기본 문법과 객체지향을 모른다고 말하는 것과 비슷하다. 프레임워크는 쓸 수 있어도 어디서 문제가 생기는지, 왜 이런 구조가 나왔는지, 다음에 무엇을 공부해야 하는지 잡기 어렵다.

그래서 이 글의 목표는 "용어를 많이 나열하기"가 아니다. 목표는 하나다.

누가 Transformer가 뭐냐고 물었을 때, 내가 내 말로 설명할 수 있게 만드는 것.

Attention Is All You Need는 Transformer를 제안한 2017년 논문이다. 논문은 기계 번역을 다루지만, 지금 우리가 쓰는 GPT, BERT, T5 같은 모델의 기본 뼈대가 여기서 시작됐다.

처음 읽으면 이름이 많다. attention, self-attention, Q, K, V, multi-head, encoder, decoder, mask, positional encoding, feed-forward network, residual connection, layer normalization. 하나씩 외우면 금방 흩어진다.

그래서 이 글에서는 Transformer를 한 문장으로 먼저 붙잡고, 그 문장을 계속 풀어간다.

Transformer는 문장 속 token들이 서로를 직접 바라보며, 필요한 정보를 골라 섞고, 그 과정을 여러 층 반복해 문맥을 이해하는 모델이다.

이 문장만 제대로 이해하면 나머지는 부품 이름이다.

먼저 Transformer를 한 장면으로 잡기

문장을 하나 보자.

The animal didn't cross the street because it was tired.

여기서 it은 무엇을 가리킬까? 아마 animal이다. 왜냐하면 피곤할 수 있는 것은 보통 동물이지, 길거리 자체는 아니다.

사람은 이걸 자연스럽게 한다. it을 읽는 순간 앞에 있던 animal, street, cross, tired를 같이 떠올리고, 의미가 맞는 대상을 고른다.

Transformer가 하는 일도 이와 비슷하다.

it이라는 token은 혼자 있으면 뜻이 약하다. 그래서 주변 token들을 본다. animal을 많이 보고, street는 덜 보고, 중요하지 않은 단어는 아주 조금 본다. 그런 다음 여러 token의 정보를 비율대로 섞어 it의 새 의미를 만든다.

이때 "얼마나 볼지"를 정하는 장치가 attention이다.

암기 문장:

Attention은 지금 token을 이해하기 위해 다른 token들을 얼마나 참고할지 정하는 방법이다.

논문이 깨고 싶었던 방식

Transformer 이전의 대표 구조는 RNN 계열이었다.

RNN은 문장을 앞에서부터 차례대로 읽는다.

I -> love -> cats -> .

이 방식은 직관적이다. 문장도 원래 순서가 있으니, 왼쪽에서 오른쪽으로 하나씩 읽는 것이 자연스럽다.

하지만 문제가 있다.

긴 줄을 생각하면 쉽다. 100번째 사람이 정보를 받으려면 1번째 사람부터 99번째 사람을 거쳐야 한다. 중간에 정보가 흐려질 수 있고, 모두가 동시에 일하기 어렵다.

RNN의 약점도 비슷하다.

  • 앞 token 계산이 끝나야 다음 token을 계산할 수 있다.
  • 멀리 떨어진 token 관계를 배우기 어렵다.
  • GPU가 잘하는 병렬 계산을 충분히 쓰기 어렵다.

여기서 병렬 계산은 여러 일을 동시에 처리하는 것이다. 반 학생 30명이 각자 문제를 동시에 풀면 빠르다. 그런데 한 명이 풀고 다음 사람에게 넘기는 방식이면 오래 걸린다.

CNN도 문장 처리에 쓰였다. CNN은 작은 창문을 밀듯이 가까운 token 묶음을 본다. RNN보다 병렬 계산은 쉽지만, 멀리 떨어진 token을 연결하려면 여러 층을 쌓아야 한다.

Transformer 논문의 도전은 분명했다.

문장을 꼭 순서대로 넘겨 읽어야 할까? 모든 token이 서로를 바로 보면 안 될까?

이 질문에서 self-attention 중심 구조가 나왔다.

제목을 오해하지 않기

논문 제목은 Attention Is All You Need다. 직역하면 "Attention이 네게 필요한 전부다"처럼 들린다.

하지만 말 그대로 attention 하나만 있으면 된다는 뜻은 아니다. Transformer 안에는 embedding, positional encoding, feed-forward network, residual connection, layer normalization, softmax 같은 부품이 모두 들어간다.

제목의 진짜 의미는 이것에 가깝다.

기존 sequence transduction 모델에서 핵심처럼 쓰이던 recurrence와 convolution 없이도,
attention 중심 구조만으로 강한 번역 모델을 만들 수 있다.

여기서 어려운 단어를 풀자.

  • recurrence: 이전 계산 결과를 다음 계산에 넘기는 반복 구조. RNN의 핵심이다.
  • convolution: 작은 창을 움직이며 주변 정보를 모으는 구조. CNN의 핵심이다.
  • sequence transduction: 순서가 있는 입력을 순서가 있는 출력으로 바꾸는 일. 번역이 대표적이다.

그러니까 논문의 주장은 "부품이 attention 하나뿐이다"가 아니라 "문장 처리의 중심을 순차 처리에서 attention으로 바꿀 수 있다"이다.

token부터 시작하자

모델은 문장을 바로 이해하지 못한다. 먼저 문장을 작은 조각으로 자른다. 이 조각을 token이라고 부른다.

예를 들어 한국어 문장 하나가 있다고 하자.

나는 고양이를 좋아한다.

tokenizer에 따라 이렇게 나뉠 수 있다.

[나는] [고양이] [를] [좋아] [한다] [.]

또는 더 작게 나뉠 수도 있다.

[나] [는] [고양] [이를] [좋아] [한다] [.]

중요한 것은 token이 모델이 다루는 기본 조각이라는 점이다.

그다음 token을 숫자 벡터로 바꾼다. 이걸 embedding이라고 한다.

  • vector: 숫자 여러 개가 줄 서 있는 것.
  • dimension: 그 숫자가 몇 개인지.
  • embedding: token을 의미를 담은 숫자 벡터로 바꾼 표현.

예를 들어 cat이라는 token은 이런 식의 숫자 목록이 된다.

cat -> [0.21, -0.53, 1.02, ...]

원 논문의 기본 모델은 d_model = 512를 쓴다. 즉 token 하나를 512개의 숫자로 표현한다.

암기 문장:

Token은 모델이 읽는 글자 조각이고, embedding은 그 조각을 숫자 좌표로 바꾼 것이다.

attention은 "중요한 단어 찾기"가 아니라 "정보 섞기"다

attention을 처음 배울 때 "중요한 단어를 찾는 것"이라고 설명하면 쉽다. 하지만 조금 더 정확히 말하면 attention은 중요한 token을 찾고 끝나는 것이 아니다.

attention의 목적은 다른 token들의 정보를 비율대로 섞어 현재 token의 새 표현을 만드는 것이다.

예를 들어 it이 다음 token들을 본다고 하자.

animal: 0.70
street: 0.10
tired: 0.15
나머지: 0.05

이 숫자는 "정답이 animal이다"라고 출력하는 점수가 아니다. it의 새 벡터를 만들 때 animal의 정보를 70% 정도 많이 섞겠다는 비율이다.

그래서 attention을 이렇게 이해하면 좋다.

현재 token의 뜻 = 원래 token 뜻 + 문맥에서 가져온 정보

그리고 문맥에서 무엇을 얼마나 가져올지 계산하는 규칙이 attention이다.

Q, K, V는 왜 필요할까

attention 수식에는 Q, K, V가 나온다.

처음 보면 이 셋이 가장 헷갈린다.

  • Q, Query: 지금 token이 찾고 싶은 정보의 모양.
  • K, Key: 각 token이 "나는 이런 정보와 잘 맞아"라고 내미는 비교용 표지.
  • V, Value: 실제로 가져와서 섞을 정보.

사물함 비유로 보면 쉽다.

Query는 "나는 지금 주어가 누구인지 알고 싶어"라는 질문이다. Key는 각 사물함에 붙은 이름표다. Value는 사물함 안에 들어 있는 실제 내용이다.

하지만 이 비유에는 한계가 있다. Q, K, V 안에 사람이 읽을 수 있는 문장이 들어 있는 것은 아니다. 셋은 모두 학습되는 숫자 벡터다. 모델이 학습하면서 "이런 Query와 이런 Key가 만나면 정보를 가져오는 게 좋구나"를 스스로 맞춰간다.

입력 벡터를 X라고 하자. Transformer는 같은 X에서 Q, K, V를 만든다.

Q = XW_Q
K = XW_K
V = XW_V

여기서 W_Q, W_K, W_V는 학습되는 행렬이다.

  • X: token들의 현재 표현.
  • W_Q: Query를 만들기 위한 변환 규칙.
  • W_K: Key를 만들기 위한 변환 규칙.
  • W_V: Value를 만들기 위한 변환 규칙.

같은 입력에서 출발하지만 서로 다른 변환을 거치므로 역할이 달라진다.

암기 문장:

Q와 K는 "얼마나 볼지"를 정하고, V는 "무엇을 가져올지"를 담는다.

attention 수식 읽기

논문의 핵심 수식은 이것이다.

Attention(Q, K, V) = softmax(QK^T / sqrt(d_k))V

이 수식을 외우기 전에 문장으로 먼저 바꿔보자.

Q와 K를 비교해서 점수를 만들고,
점수가 너무 커지지 않게 나눈 뒤,
softmax로 비율을 만들고,
그 비율대로 V를 섞는다.

이제 수식을 조각내자.

QK^T는 Query와 Key를 서로 비교하는 부분이다.

한 token의 Query가 다른 token의 Key와 방향이 비슷하면 내적값이 커진다. 내적값이 크다는 것은 둘이 잘 맞는다는 뜻으로 쓰인다.

score(i, j) = q_i · k_j

이 점수는 "i번째 token이 j번째 token을 얼마나 참고할지"를 나타내는 원재료다.

그다음 sqrt(d_k)로 나눈다.

d_k는 Key 벡터의 차원이다. 차원이 커질수록 내적값이 너무 커지기 쉽다. 너무 큰 값이 softmax에 들어가면 한쪽으로 확 몰려 학습이 불안정해질 수 있다.

그래서 sqrt(d_k)로 나누어 숫자 크기를 적당히 눌러준다.

그다음 softmax를 적용한다.

softmax는 점수들을 합이 1인 비율로 바꾼다.

점수: [5, 2, 1]
비율: [0.84, 0.11, 0.05]

마지막으로 이 비율을 V에 곱한다. 그러면 중요한 Value는 많이 섞이고, 덜 중요한 Value는 조금 섞인다.

attention 수식은 결국 이 네 단계다.

비교한다 -> 크기를 맞춘다 -> 비율로 바꾼다 -> 정보를 섞는다

이 네 단어를 기억하면 수식이 훨씬 덜 무섭다.

아주 작은 숫자 예시

계산 느낌만 보려고 2차원 예시를 만들자. 실제 모델 숫자는 학습으로 만들어지고 훨씬 크다.

현재 token의 Query가 있다.

q = [1, 0]

비교할 Key가 세 개 있다.

k1 = [1, 0]
k2 = [0, 1]
k3 = [1, 1]

내적을 계산하면 이렇다.

q · k1 = 1
q · k2 = 0
q · k3 = 1

즉 q는 k1, k3와 잘 맞고 k2와는 덜 맞는다.

이제 softmax를 거치면 대략 이런 비율이 나온다고 생각할 수 있다.

k1: 0.4
k2: 0.2
k3: 0.4

Value가 다음과 같다면,

v1 = [10, 0]
v2 = [0, 10]
v3 = [10, 10]

출력은 이렇게 섞인다.

0.4v1 + 0.2v2 + 0.4v3

즉 attention 출력은 "가장 중요한 하나"가 아니라 "중요도에 따른 섞인 결과"다.

이 지점이 중요하다. Transformer는 단어 하나를 딱 고르는 기계가 아니라, 문맥 정보를 계속 섞어 더 좋은 표현을 만드는 기계다.

self-attention은 같은 문장 안에서 서로 보는 것

self-attention은 말 그대로 자기 자신이 속한 sequence 안에서 attention을 하는 것이다.

입력 문장이 있다.

The cat sat on the mat because it was tired.

각 token은 같은 문장 안의 모든 token을 볼 수 있다.

The   -> The, cat, sat, on, ...
cat   -> The, cat, sat, on, ...
it    -> The, cat, sat, mat, tired, ...
tired -> The, cat, sat, it, ...

여기서 itcat을 많이 볼 수 있고, tiredit이나 cat과 연결될 수 있다.

RNN은 멀리 있는 단어 정보를 여러 단계를 거쳐 전달받는다. self-attention은 모든 token 쌍을 한 번에 비교한다. 그래서 멀리 떨어진 token 관계를 배우기 쉽다.

암기 문장:

Self-attention은 한 문장 안의 token들이 서로를 직접 보고 문맥을 섞는 방법이다.

multi-head attention은 여러 관점으로 동시에 보는 것

attention을 한 번만 하면 하나의 관점으로만 문장을 본다. 그런데 문장에는 여러 관계가 동시에 있다.

예를 들어 문장 하나에도 이런 관계가 있다.

  • 대명사 it이 무엇을 가리키는지.
  • 형용사 small이 어떤 명사를 꾸미는지.
  • 동사 chased의 주어와 목적어가 무엇인지.
  • 번역할 때 어떤 영어 단어가 어떤 한국어 단어와 대응되는지.

하나의 attention head가 이 모든 관계를 한 번에 잘 담기는 어렵다. 그래서 Transformer는 attention을 여러 개 병렬로 둔다. 이것이 multi-head attention이다.

논문 수식은 다음과 같다.

head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)
MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O

읽는 법은 이렇다.

1. Q, K, V를 head마다 다른 방식으로 바꾼다.
2. 각 head가 자기 관점으로 attention을 한다.
3. 여러 head 결과를 이어 붙인다.
4. 마지막에 한 번 더 섞어 최종 출력을 만든다.

원 논문의 base model은 head를 8개 쓴다. 모델 차원 d_model은 512이고, 각 head의 Key/Value 차원은 64다.

8 heads x 64 dimensions = 512 dimensions

그러니까 head가 8개라고 무조건 전체 계산이 8배로 커지는 식은 아니다. 512차원 하나를 64차원짜리 여러 관점으로 나눠 보는 느낌에 가깝다.

주의할 점도 있다. "1번 head는 문법, 2번 head는 대명사"처럼 사람이 이름표를 붙일 수 있는 경우도 있지만, 항상 그렇게 깔끔하게 나뉘지는 않는다. 중요한 것은 여러 head가 서로 다른 표현 공간에서 관계를 볼 수 있다는 점이다.

암기 문장:

Multi-head attention은 한 문장을 여러 관점의 attention으로 동시에 읽는 방법이다.

Transformer의 큰 구조: encoder와 decoder

원 논문의 Transformer는 번역 모델이다. 번역에는 입력 문장을 읽는 쪽과 출력 문장을 쓰는 쪽이 필요하다.

그래서 구조가 둘로 나뉜다.

입력 문장 -> Encoder -> 입력을 이해한 정보 -> Decoder -> 출력 문장
  • encoder: 입력 문장을 읽고 문맥 표현을 만든다.
  • decoder: encoder가 만든 정보를 참고해 출력 문장을 만든다.

영어를 한국어로 번역한다고 해보자.

입력: I love cats.
출력: 나는 고양이를 좋아한다.

encoder는 I love cats.를 읽어 의미 정보를 만든다. decoder는 그 정보를 보며 나는, 고양이를, 좋아한다를 차례대로 만든다.

원 논문은 encoder layer를 6개 쌓고, decoder layer도 6개 쌓는다.

encoder layer 안에서 일어나는 일

encoder layer 하나는 크게 두 덩어리다.

1. Multi-head self-attention
2. Position-wise feed-forward network

여기에 각 덩어리마다 residual connection과 layer normalization이 붙는다.

전체 느낌은 이렇다.

token들이 서로를 본다
-> 각 token의 정보를 한 번 더 가공한다
-> 이 과정을 여러 층 반복한다

encoder의 self-attention은 입력 문장 전체를 볼 수 있다. 번역할 영어 문장은 이미 주어졌으므로, 각 단어가 앞뒤 단어를 모두 봐도 된다.

예를 들어 cats를 이해할 때 앞의 I, love도 보고, 뒤에 다른 단어가 있다면 그것도 볼 수 있다.

decoder layer 안에서 일어나는 일

decoder layer는 encoder보다 부품이 하나 더 많다.

1. Masked multi-head self-attention
2. Encoder-decoder attention
3. Position-wise feed-forward network

첫 번째는 decoder가 지금까지 쓴 출력 token끼리 보는 attention이다.

두 번째는 decoder가 encoder의 출력 정보를 보는 attention이다. 이것을 cross-attention이라고 부르기도 한다.

예를 들어 decoder가 한국어 단어 고양이를을 만들려면 영어 입력의 cats를 강하게 참고해야 한다. 이 연결을 돕는 것이 encoder-decoder attention이다.

decoder에는 왜 mask가 필요할까

decoder는 출력 문장을 한 token씩 만든다.

<start> -> 나는 -> 고양이를 -> 좋아한다 -> .

고양이를을 예측하는 순간, 미래 단어인 좋아한다를 보면 안 된다. 시험 보는데 뒤쪽 정답을 미리 보는 것과 같다.

그래서 decoder self-attention에는 mask를 씌운다.

길이 4인 출력 문장을 생각해보자.

위치 1: 자기 자신만 볼 수 있음
위치 2: 위치 1, 2만 볼 수 있음
위치 3: 위치 1, 2, 3만 볼 수 있음
위치 4: 위치 1, 2, 3, 4만 볼 수 있음

미래 위치는 가린다. 이걸 causal mask라고도 한다.

  • mask: 못 보게 가리는 장치.
  • causal: 원인과 결과의 순서를 지킨다는 뜻. 미래를 보고 현재를 맞히지 않는다.
  • autoregressive: 이전에 만든 token들을 바탕으로 다음 token을 하나씩 만드는 방식.

GPT 같은 decoder-only 모델도 이 causal mask를 핵심으로 쓴다. GPT가 다음 token을 예측하는 모델이기 때문이다.

암기 문장:

Mask는 decoder가 미래 정답을 훔쳐보지 못하게 막는 장치다.

attention 다음에는 왜 feed-forward network가 있을까

Transformer를 attention만으로 이해하면 절반만 이해한 것이다. 각 layer에는 attention 뒤에 feed-forward network, 줄여서 FFN이 있다.

논문 수식은 이렇다.

FFN(x) = max(0, xW_1 + b_1)W_2 + b_2

말로 풀면 이렇다.

각 token의 벡터를 한 번 넓게 바꾸고,
ReLU로 비선형성을 넣고,
다시 원래 크기로 줄인다.

원 논문의 base model에서는 512차원을 2048차원으로 넓혔다가 다시 512차원으로 줄인다.

attention과 FFN의 역할은 다르다.

Attention: token 사이 정보를 섞는다.
FFN: 섞인 정보를 각 token 자리에서 가공한다.

교실 비유로 말하면 attention은 친구들과 대화하며 정보를 모으는 시간이고, FFN은 자기 자리에서 그 정보를 정리하는 시간이다.

암기 문장:

Transformer block은 attention으로 섞고, FFN으로 가공한다.

residual connection은 원본을 살려두는 지름길

Transformer는 layer를 여러 개 쌓는다. 깊게 쌓으면 표현력이 좋아질 수 있지만, 학습이 어려워질 수 있다. 계산을 많이 거치면서 원래 정보가 흐려지거나 gradient가 잘 전달되지 않을 수 있기 때문이다.

그래서 residual connection을 쓴다.

y = x + Sublayer(x)

Sublayer(x)는 attention이나 FFN이 만든 새 결과다. 여기에 원래 입력 x를 더한다.

이렇게 하면 layer가 모든 것을 새로 만들 필요가 없다. 원래 정보를 그대로 지나가게 하면서 필요한 변화만 더할 수 있다.

비유하면 글을 고칠 때 원본을 완전히 지우고 새로 쓰는 것이 아니라, 원본 위에 수정 사항을 덧붙이는 방식이다.

암기 문장:

Residual connection은 원래 정보를 잃지 않게 해주는 지름길이다.

layer normalization은 숫자 상태를 안정시키는 정리

신경망 안의 숫자는 layer를 지나며 너무 커지거나 작아질 수 있다. 숫자 분포가 흔들리면 학습이 불안정해진다.

Layer normalization은 한 token 벡터 안의 숫자들을 적당한 범위로 정리한다.

쉽게 말하면 "계산 중간의 숫자 컨디션을 맞추는 장치"다.

원 논문의 sub-layer 출력은 다음 형태를 가진다.

LayerNorm(x + Sublayer(x))

즉 원래 입력과 sub-layer 결과를 더한 뒤 정리한다.

요즘 구현에서는 순서가 바뀐 pre-LN 구조도 많이 쓴다. 하지만 원 논문을 읽을 때는 위의 post-LN 구조를 기준으로 보면 된다.

암기 문장:

LayerNorm은 layer를 깊게 쌓아도 숫자 흐름이 흔들리지 않게 정리한다.

위치 정보는 왜 따로 넣을까

self-attention은 모든 token을 한꺼번에 본다. 이것은 장점이지만 문제가 있다. 순서를 모를 수 있다.

다음 두 문장을 보자.

개가 사람을 물었다.
사람이 개를 물었다.

token은 비슷하지만 순서가 바뀌면 뜻이 완전히 달라진다.

RNN은 왼쪽에서 오른쪽으로 읽기 때문에 순서 정보가 자연스럽게 들어간다. 하지만 Transformer는 모든 token을 동시에 비교하므로 "몇 번째 token인지"를 따로 알려줘야 한다.

그래서 원 논문은 positional encoding을 token embedding에 더한다.

입력 표현 = token embedding + positional encoding

positional encoding은 각 위치의 좌석 번호 같은 것이다.

논문은 sine과 cosine 함수를 사용한다.

PE(pos, 2i)     = sin(pos / 10000^(2i / d_model))
PE(pos, 2i + 1) = cos(pos / 10000^(2i / d_model))

무서워 보이지만 뜻은 단순하다.

  • pos: 문장에서 몇 번째 위치인지.
  • i: 벡터 안에서 몇 번째 차원인지.
  • d_model: 모델 벡터 크기.
  • sin, cos: 주기적으로 오르내리는 파도 함수.

위치마다 서로 다른 파도 무늬 벡터를 만들고, 그것을 token embedding에 더한다. 그러면 모델은 "이 token이 어떤 위치에 있는지"를 계산에 사용할 수 있다.

논문은 학습되는 positional embedding도 실험했고 결과가 거의 비슷했다고 말한다. 하지만 원 논문 구조를 이해할 때는 sinusoidal positional encoding을 기준으로 잡으면 된다.

암기 문장:

Positional encoding은 attention이 잃어버린 순서 정보를 token 벡터에 더해주는 좌석 번호다.

전체 흐름을 한 번에 외우기

이제 Transformer의 전체 흐름을 한 번에 보자.

입력 문장
-> token으로 자른다
-> embedding으로 숫자 벡터를 만든다
-> positional encoding으로 위치 정보를 더한다
-> encoder layer를 여러 번 지난다
   -> self-attention으로 입력 token끼리 정보를 섞는다
   -> FFN으로 각 token 표현을 가공한다
   -> residual과 LayerNorm으로 안정화한다
-> decoder layer를 여러 번 지난다
   -> masked self-attention으로 지금까지 쓴 출력만 본다
   -> encoder-decoder attention으로 입력 문장을 참고한다
   -> FFN으로 각 token 표현을 가공한다
   -> residual과 LayerNorm으로 안정화한다
-> linear layer와 softmax로 다음 token 확률을 만든다

이걸 더 짧게 줄이면 이렇게 된다.

자른다 -> 숫자로 바꾼다 -> 위치를 더한다 -> 서로 본다 -> 가공한다 -> 다음 token을 고른다

이 흐름이 머릿속에 있어야 세부 용어가 제자리로 들어간다.

세 종류의 attention을 구분하자

원 논문 Transformer에는 attention이 세 곳에 나온다.

위치이름무엇을 보는가역할
EncoderSelf-attention입력 token끼리 서로 봄입력 문장을 문맥화
DecoderMasked self-attention지금까지 만든 출력 token만 봄미래를 보지 않고 출력 문맥화
DecoderEncoder-decoder attentiondecoder가 encoder 출력을 봄출력 token이 입력 문장을 참고

이 셋을 구분하면 encoder-decoder 그림이 훨씬 덜 복잡해진다.

특히 번역에서는 세 번째가 중요하다. 한국어 단어를 만들 때 영어 원문의 어느 부분을 참고해야 하는지 연결해주기 때문이다.

Transformer가 빠른 이유

Transformer가 강했던 이유는 성능만이 아니다. 계산 방식도 중요하다.

RNN은 앞 token 계산이 끝나야 다음 token으로 갈 수 있다. 학습 중 병렬화가 어렵다.

Transformer의 self-attention은 문장 안 모든 token의 Q, K, V를 행렬로 만들고 한 번에 계산할 수 있다. GPU는 이런 큰 행렬 곱을 매우 잘 처리한다.

즉 Transformer의 변화는 단순히 "좋은 아이디어"가 아니라 "현대 하드웨어가 잘하는 계산 모양"과도 잘 맞았다.

다만 약점도 있다. self-attention은 모든 token 쌍을 비교한다.

문장 길이가 n이면 대략 n x n개의 관계를 본다.

10 token  -> 100 관계
100 token -> 10,000 관계
1,000 token -> 1,000,000 관계

그래서 아주 긴 문장을 처리할 때 attention 비용이 커진다. 이후 많은 연구가 긴 context를 효율적으로 다루는 방향으로 이어졌다.

암기 문장:

Transformer는 token 사이를 한 번에 비교해 병렬 계산이 쉽지만, 긴 문장에서는 attention 비용이 커진다.

논문 실험은 무엇을 보여줬나

논문은 WMT 2014 번역 작업에서 Transformer를 평가했다.

대표 결과는 다음과 같다.

모델영어-독일어 BLEU영어-프랑스어 BLEU
Transformer base27.338.1
Transformer big28.441.8

BLEU는 번역 결과가 정답 번역과 얼마나 비슷한지 재는 점수다. 높을수록 좋다. 완벽한 지표는 아니지만, 당시 번역 모델 비교에 널리 쓰였다.

논문의 중요한 메시지는 이렇다.

RNN이나 CNN 없이 attention 중심 구조만으로도 당시 최고 수준 번역 성능을 냈다.
그리고 학습 비용도 경쟁력 있었다.

이 결과 때문에 Transformer는 단순한 구조 실험이 아니라, 이후 언어 모델 연구의 기본 골격이 됐다.

GPT와 BERT는 여기서 어떻게 이어질까

원 논문의 Transformer는 encoder-decoder 구조다. 하지만 이후 모델들은 이 구조를 목적에 맞게 잘라 쓰거나 바꿔 썼다.

BERT는 encoder 쪽 아이디어를 크게 활용한다. 입력 문장 전체를 양방향으로 보고, 문장 이해나 분류, 임베딩 같은 작업에 강하다.

GPT는 decoder 쪽 아이디어를 크게 활용한다. causal mask를 사용해 이전 token들만 보고 다음 token을 예측한다.

정리하면 이렇다.

구조보는 방식대표 모델잘 맞는 일
Encoder-only입력 전체를 양방향으로 봄BERT이해, 분류, 임베딩
Decoder-only이전 token만 봄GPT생성, 다음 token 예측
Encoder-decoder입력을 읽고 출력을 씀원 Transformer, T5번역, 요약

그러니까 GPT를 이해하려면 원 논문의 decoder, masked self-attention, 다음 token 예측 흐름을 이해해야 한다.

누가 물어보면 이렇게 대답하자

질문: Transformer가 뭐야?

대답:

Transformer는 문장 속 token들이 서로를 직접 보면서 문맥 정보를 섞는 모델이야.
예전 RNN은 문장을 앞에서부터 차례대로 읽었는데,
Transformer는 self-attention으로 모든 token 쌍의 관계를 한 번에 계산해.
그래서 멀리 떨어진 단어 관계도 잘 잡고, GPU 병렬 계산에도 잘 맞아.

질문: attention은 뭐야?

대답:

Attention은 현재 token을 이해하기 위해 다른 token들을 얼마나 참고할지 정하는 방법이야.
Q와 K를 비교해서 중요도 비율을 만들고,
그 비율대로 V 정보를 섞어서 새 표현을 만들어.

질문: Q, K, V는 뭐야?

대답:

Q는 찾고 싶은 정보의 모양,
K는 각 token이 가진 비교용 표지,
V는 실제로 가져와서 섞을 정보야.
Q와 K는 attention weight를 만들고, V는 최종 출력에 섞여.

질문: multi-head attention은 왜 써?

대답:

문장에는 주어-동사 관계, 대명사 관계, 수식 관계처럼 여러 관계가 동시에 있어.
attention head를 여러 개 두면 서로 다른 관점에서 token 관계를 볼 수 있어.

질문: decoder mask는 왜 필요해?

대답:

다음 token을 맞히는 순간 미래 정답을 보면 안 되기 때문이야.
mask는 decoder가 현재 위치보다 뒤의 token을 못 보게 막아.

질문: positional encoding은 왜 필요해?

대답:

self-attention은 모든 token을 한꺼번에 보기 때문에 순서 정보가 자연스럽게 들어가지 않아.
그래서 각 token에 위치 정보를 더해 몇 번째 token인지 알려줘야 해.

이 정도를 말할 수 있으면 Transformer의 큰 줄기는 잡은 것이다.

마지막으로 다시 한 문장

처음 문장으로 돌아가자.

Transformer는 문장 속 token들이 서로를 직접 바라보며, 필요한 정보를 골라 섞고, 그 과정을 여러 층 반복해 문맥을 이해하는 모델이다.

이제 이 문장을 부품 이름으로 다시 풀 수 있다.

token을 embedding으로 바꾼다.
positional encoding으로 순서를 넣는다.
self-attention으로 token끼리 서로를 본다.
Q와 K로 볼 비율을 정한다.
V를 그 비율대로 섞는다.
multi-head로 여러 관점을 동시에 본다.
FFN으로 각 token의 정보를 가공한다.
residual connection과 LayerNorm으로 깊게 쌓을 수 있게 안정화한다.
decoder는 mask로 미래를 가리고 다음 token을 만든다.

Transformer를 암기한다는 것은 이 문장들을 따로 외우는 것이 아니다. "왜 이런 부품이 필요한가"를 하나의 흐름으로 연결하는 것이다.

이 글을 다 읽고 나서 남겨야 할 핵심은 딱 하나다.

Transformer의 본질은 token 사이의 정보 전달 경로를 순서 기반에서 attention 기반으로 바꾼 것이다.

이 문장을 자기 말로 설명할 수 있다면, 다음에는 GPT block, BERT, RoPE, KV cache, FlashAttention 같은 후속 개념도 훨씬 덜 낯설어진다.

확인한 원문

대화

댓글

0
댓글을 불러오는 중입니다.