Transformer는 입력 토큰의 정보를 서로 연결하고, 그 정보를 참고해 출력 토큰을 하나씩 예측하는 모델이다.

  • 1편 · 현재 글: 입력 표현 → Encoder → Decoder → 학습과 생성.
  • 2편 · Attention과 Multi-Head: Q·K·V → 참고 비율 → 가중합 → 여러 head의 결합.
  • 3편 · FFN·위치 인코딩·연산량·KV 캐시: 나머지 구성 요소와 추론 비용.
  • 읽는 기준: 2017년 원 논문의 인코더–디코더 Transformer. 번역 예시와 새 도표는 작성자의 해설이며, 편의상 단어를 토큰처럼 표시한다. 실제 토큰 경계는 토크나이저에 따라 다르다.

1. 무엇을 바꾼 논문인가

순환이나 합성곱 없이 Attention으로 토큰 사이의 정보를 연결해, 학습의 병렬성을 높인 것이 핵심이다.

관점 RNN 기반 모델 CNN 기반 모델 Transformer
층당 연산량 (핵심 연산) O(nd2)O(nd^2) O(knd2)O(knd^2) O(n2d)O(n^2d) (Self-Attention)
토큰 간 연결 이전 위치의 상태를 다음 위치로 전달 주변 위치를 커널로 결합 Self-Attention으로 허용된 위치를 직접 참고
같은 층의 위치 계산 순차 의존성 존재 위치별 병렬 계산 가능 위치별 병렬 계산 가능
먼 위치 사이의 경로 거리에 따라 길어짐 커널·확장 방식과 층 수에 의존 전체 Attention 한 번으로 직접 연결
주의할 비용 순차 계산으로 학습 병렬화 제약 먼 문맥을 연결할 층 필요 긴 입력의 토큰 쌍 계산 증가
  • 복잡도 기호: n은 입력 토큰 수, d는 표현 차원, k는 합성곱 커널 크기.

  • 비교 범위: 배치 1에서 입력 전체를 처리하는 순전파의 산술 연산량. 원 논문 Table 1의 표준 순환층·일반 합성곱·Self-Attention 핵심 연산 비교이며, 실제 실행 시간이나 KV 캐시를 쓴 한 토큰 생성 비용과는 구분.

  • Transformer 블록 전체: 표의 O(n²d)는 QKᵀ와 V 가중합 중심의 비용. Q·K·V 및 출력 투영과 FFN까지 포함하면 O(nd² + n²d) (d_ff가 d의 일정한 배수일 때). 연산별 유도는 3편 참고.

  • Attention만 사용한다는 표현의 범위: RNN·CNN을 대체한다는 뜻. FFN, 임베딩, 잔차 연결, 정규화도 함께 사용.

  • 원 논문의 결과: WMT 2014 영어→독일어에서 당시 최고 성능을 보고했고, 영어→프랑스어에서는 단일 모델 최고 성능을 보고. 모든 과제에서 항상 우월하다는 의미는 아님.

  • 가중 평균의 한계: 여러 위치의 정보가 하나의 결과로 섞임. Multi-Head는 서로 다른 투영과 참고 비율로 이 한계를 완화하는 접근.

  • 근거: 원 논문 §1–2, §4 Table 1, §6.

2. 번역 전체 흐름부터 보기

입력을 읽고, 다음 토큰을 쓰기원문은 인코더를 거쳐 토큰별 memory가 된다. 디코더는 memory와 이전 출력으로 student를 예측한다. 입력을 읽고, 다음 토큰을 쓰기 원문 나는 학생이다 지금까지의 출력 [시작] I am a Encoder 원문의 각 위치를 가공 Memory 입력 위치마다 벡터 하나 Decoder 원문과 작성한 내용을 참고 어휘 점수 → 확률 → 선택 다음 토큰: student Memory는 벡터 한 개가 아님
  • Encoder: 원문을 읽고 각 입력 위치의 표현을 갱신.
  • Memory: 인코더의 최종 출력. 입력 길이가 n이면 n개 벡터가 유지되며, 문장 전체를 벡터 하나로 압축하지 않음.
  • Decoder: 원문 표현과 지금까지의 출력 토큰을 함께 참고.
  • 출력층: 디코더 표현을 어휘별 점수로 변환하고 softmax로 다음 토큰 확률 계산.
  • 생성: 선택한 토큰을 다음 단계 입력에 추가. 끝 토큰을 선택하면 종료.

3. 토큰을 벡터로, 위치를 숫자로

토큰 정보 + 위치 정보임베딩을 모델 차원의 제곱근으로 스케일링하고 같은 차원의 위치 벡터를 더한다. 토큰 정보 + 위치 정보 토큰 임베딩 × √d_model 어떤 토큰인가 위치 인코딩 PE 몇 번째 위치인가 원소별 덧셈 모델 입력 · 차원은 그대로
  • 임베딩: 토큰 ID로 학습 가능한 표에서 d_model차원 벡터 조회.
  • 위치 인코딩: 토큰 순서를 전달하는 같은 차원의 벡터. 임베딩 뒤에 붙이지 않고 원소별로 더함.
  • 원 논문의 입력: 임베딩에 √d_model을 곱한 뒤 위치 인코딩을 더함.
  • 첫 층 이전: 토큰과 위치의 표현. 문맥을 참고하는 계산은 다음 Self-Attention에서 수행.
  • 위치 정보의 필요성: 같은 토큰 집합이라도 순서에 따라 의미가 달라질 수 있음. 구체적인 사인·코사인 식은 3편에서 설명.

4. Encoder: 문맥 정보를 모으고 가공하기

Attention은 위치 사이에서 정보를 모으고, FFN은 각 위치의 벡터를 가공한다.

한 층의 구조: Encoder와 Decoder인코더는 self-attention과 FFN, 디코더는 masked self-attention과 cross-attention 및 FFN을 사용한다. 각 서브레이어에 잔차 연결이 있다. 한 층의 구조: Encoder와 Decoder Encoder Decoder 입력 표현 X 출력 쪽 표현 Y Self-Attention Add & Norm FFN Add & Norm 다음 층으로 Masked Self-Attention Add & Norm Cross-Attention Add & Norm FFN Add & Norm 다음 층으로 6층 뒤 최종 출력 Memory 각 디코더 층의 K·V 원천 원 논문: 각 스택 6층 · dropout 생략 · 층마다 가중치 별개
  • 인코더 한 층: Multi-Head Self-Attention → Add & Norm → FFN → Add & Norm.
  • Self-Attention: 같은 층에 들어온 표현에서 Q·K·V를 생성. 패딩을 제외한 원문의 모든 위치를 참고 가능.
  • FFN: 같은 가중치를 각 위치에 독립적으로 적용. 이 단계에서는 토큰 사이의 정보를 교환하지 않음.
  • 잔차 연결: 기존 입력에 새 계산 결과를 더해 정보와 기울기가 흐를 경로를 제공.
  • LayerNorm: 각 토큰의 특성 차원을 정규화. 원 논문은 잔차 덧셈 뒤에 정규화하는 Post-LN 구조.
  • 스택: 원 논문은 구조가 같은 인코더 층 6개 사용. 층마다 가중치는 별개이며 기본 모델의 d_model = 512.

LayerNorm⁡(x+Sublayer⁡(x))\operatorname{LayerNorm}(x + \operatorname{Sublayer}(x))

  • 위 식과 보충 도표에서는 dropout 생략. 실제 원 논문은 서브레이어 출력에 dropout을 적용한 뒤 잔차 덧셈 수행.

기존 그림: 인코더 한 층과 전체 스택

기존 포스팅의 인코더 한 층 그림

기존 그림 1 — 인코더 한 층의 구성. 새 블록 도표의 왼쪽 열과 대응.

기존 포스팅의 인코더 전체 스택 그림

기존 그림 2 — 인코더 스택. 각 층의 출력이 다음 층의 입력으로 전달되는 흐름.

5. Decoder: 작성한 내용과 원문을 함께 참고하기

서브레이어 Q를 만드는 표현 K·V를 만드는 표현 참고 범위
Masked Self-Attention 현재 디코더 층의 입력 같은 디코더 층의 입력 현재 입력 위치와 그 이전
Cross-Attention 첫 Add & Norm을 지난 디코더 표현 인코더 스택의 최종 출력 패딩을 제외한 원문 전체
FFN 해당 없음 해당 없음 각 위치를 독립적으로 가공
  • 디코더 한 층: 위 세 서브레이어 각각에 잔차 연결과 LayerNorm 적용.
  • 스택: 원 논문은 디코더도 6층. 각 층의 Cross-Attention은 같은 인코더 최종 출력을 사용하되, 각자의 가중치로 K·V를 투영.
  • 표현과 Q의 구분: 첫 Self-Attention의 출력 자체가 Cross-Attention의 Q는 아님. 잔차 연결·정규화를 지난 표현에 다음 어텐션의 Q 변환을 적용.
  • 인코더 표현과 K·V의 구분: Memory 자체를 그대로 비교하는 것이 아니라, 학습된 변환으로 K·V 생성.

기존 그림: 디코더

기존 포스팅의 디코더 구조 그림

기존 그림 3 — 디코더의 두 어텐션과 FFN. 새 블록 도표의 오른쪽 열 및 위 Q·K·V 출처 표와 대응. 기존 참고자료는 아래에 유지.

계산 순서를 읽는 의사코드

encoder_layer(x):
    x = LayerNorm(x + SelfAttention(x, x, x))
    x = LayerNorm(x + FFN(x))
    return x

decoder_layer(y, memory):
    y = LayerNorm(y + MaskedSelfAttention(y, y, y))
    y = LayerNorm(y + CrossAttention(y, memory, memory))
    y = LayerNorm(y + FFN(y))
    return y
  • 구조 설명용 의사코드: Attention 내부의 Q·K·V 투영, dropout, 패딩 마스크는 생략.
  • 기존 Python 조각의 미정의 변수·내부 메서드 호출 대신 계산 순서를 명시. 실제 구현의 인자·마스크 규약은 PyTorch 공식 구현 참고.

6. 학습: 정답을 한 칸 밀고 미래를 가리기

현재 입력 토큰까지 읽고, 그 다음 토큰을 예측하도록 학습한다.

위치 디코더 입력 예측할 정답 해당 위치가 볼 수 있는 입력
0 [시작] I [시작]
1 I am [시작] I
2 am a [시작] I am
3 a student [시작] I am a
4 student [끝] [시작] I am a student
  • Teacher forcing: 학습에서는 생성한 토큰 대신 정답의 앞부분을 입력으로 제공.
  • Causal mask: 미래 입력 위치의 점수를 softmax 전에 가림. a 위치가 뒤의 정답 student를 미리 보지 못하도록 제한.
  • 병렬 학습: 정답 입력 전체를 알고 있으므로 각 위치의 예측을 한 번의 순전파에서 계산 가능.
  • 병렬화의 범위: 같은 층의 위치 계산을 병렬화. 층 사이의 의존성이나 실제 생성의 토큰 순서는 사라지지 않음.

7. 생성: 예측한 토큰을 다음 입력으로

생성: 토큰 선택과 입력 추가를 반복디코더가 다음 토큰을 선택해 출력에 추가하고 갱신된 앞부분을 다음 단계에서 사용한다. 원문 memory는 매 단계 참고한다. 생성: 토큰 선택과 입력 추가를 반복 디코더 + 어휘 출력층 출력 시퀀스 [시작] 입력 I 선택 · 추가 [시작] I am 선택 · 추가 [시작] I am a 선택 · 추가 원문 Memory를 계속 참고 · student와 [끝]까지 반복

p(y∣x)=∏t=1mp(yt∣y<t,x)p(y\mid x)=\prod_{t=1}^{m}p(y_t\mid y_{<t},x)

  • 자기회귀: 원문 x와 앞서 생성한 토큰 전체 y_<t에 조건을 두고 다음 토큰 예측.
  • 이전 토큰 하나만 사용한다는 뜻도, 고전적인 선형 AR 시계열 식을 그대로 적용한다는 뜻도 아님.
  • 실제 생성: 다음 토큰을 알아야 다음 입력을 만들 수 있으므로 토큰 단위로 순차 진행.
  • 중복 계산 감소: 과거 K·V를 저장하는 KV 캐시를 적용할 수 있음. 3편의 추론 해설에서 concat 축과 복잡도까지 연결.
구분 학습 생성
앞부분 입력 정답 토큰 모델이 선택한 토큰
미래 토큰 알고 있지만 마스크로 차단 아직 생성되지 않음
위치별 예측 한 번에 병렬 계산 가능 다음 토큰을 순서대로 생성
가중치 오차로 업데이트 고정된 가중치 사용

다음 편과 참고자료