포스트

딥러닝 기초 (16) - Transformer: self-attention과 그 너머

어텐션만으로 시퀀스를 처리하는 self-attention과 Query·Key·Value, 멀티헤드와 위치 인코딩, 잔차 연결과 Layer Norm으로 이루어진 Transformer 블록, 그리고 순차성을 없애 RNN을 대체하고 LLM의 토대가 된 과정을 정리하며 시리즈를 마치는 딥러닝 기초 (16)편입니다.

딥러닝 기초 (16) - Transformer: self-attention과 그 너머

딥러닝 기초 시리즈의 마지막, 16편입니다. 전체 목차는 0편에 있습니다. RNN·LSTM이 못 넘은 순차성의 벽을, 이 편의 Transformer가 무너뜨립니다.

self-attention: 시퀀스가 자기 자신을 참조한다

15편의 어텐션은 디코더가 인코더를 참조하는 장치였습니다. Transformer는 이를 시퀀스가 자기 자신을 참조하는 데 씁니다. 이것이 self-attention입니다. 각 토큰이 같은 시퀀스의 다른 토큰들을 둘러보며 자기 표현을 갱신합니다.

이를 위해 각 토큰 벡터를 세 가지로 사상합니다.

  • Query(Q) — 내가 무엇을 찾고 있는가.
  • Key(K) — 나는 무엇을 제공하는가(검색 키).
  • Value(V) — 실제로 전달할 내용.

한 토큰의 Query를 모든 토큰의 Key와 견줘 관련도를 구하고, 그것을 가중치로 Value들을 섞습니다. 전체를 행렬로 쓰면 한 줄입니다.

1
Attention(Q, K, V) = softmax( Q Kᵀ / √d_k ) V

Q Kᵀ가 모든 토큰 쌍의 관련도 점수 행렬이고, √d_k로 나눠 값이 너무 커지는 것을 막은 뒤, softmax로 각 행을 합이 1인 가중치로 만들어 V를 가중 평균합니다. 작은 예로 확인하면 동작이 분명합니다.

1
2
3
4
5
6
7
8
9
10
def softmax(z):
    e = np.exp(z - z.max(axis=-1, keepdims=True))
    return e / e.sum(axis=-1, keepdims=True)

Q, K, V = X @ Wq, X @ Wk, X @ Wv          # X: (토큰 4개, 차원 8)
A = softmax(Q @ K.T / np.sqrt(8))          # (4, 4) 관련도 가중치
out = A @ V                                # (4, 8) 갱신된 표현

A.sum(axis=1)   # [1. 1. 1. 1.] — 각 토큰의 가중치 합은 1
out.shape       # (4, 8)

두 성질이 RNN의 한계를 동시에 무너뜨립니다. 어떤 두 토큰이든 한 번의 연산으로 직접 연결되므로 거리가 멀어도 관련도가 감쇠하지 않고(긴 의존성 해결), 모든 토큰의 계산이 서로를 기다리지 않아 행렬 곱으로 한꺼번에 처리됩니다(순차성 제거, 병렬화).

멀티헤드와 위치 인코딩

멀티헤드 어텐션 — self-attention을 한 번만 하지 않고, Q·K·V를 여러 갈래로 나눠 병렬로 여러 번 수행한 뒤 합칩니다. 헤드마다 다른 관계(문법적 관계, 지시 관계 등)에 주목해 표현력을 높입니다.

위치 인코딩(positional encoding) — self-attention은 모든 토큰을 대등하게 보기 때문에, 그 자체로는 순서 정보가 없습니다. 단어를 뒤섞어도 같은 결과가 나오는 집합처럼 취급합니다. 그래서 각 위치에 고유한 위치 벡터를 임베딩에 더해 순서 정보를 주입합니다. RNN은 순서대로 읽어 순서를 알았지만, Transformer는 순서를 명시적으로 넣어줘야 합니다.

Transformer 블록

Transformer는 이 부품들을 블록으로 쌓습니다. 한 블록은 두 하위 층으로 이루어집니다.

  1. 멀티헤드 self-attention — 토큰들이 서로를 참조해 정보를 섞는다.
  2. 위치별 피드포워드 신경망(FFN) — 각 토큰을 독립적으로 비선형 변환한다.

각 하위 층은 잔차 연결과 Layer Norm으로 감쌉니다. 10편의 스킵 커넥션과 7편의 Layer Norm이 여기서 다시 등장합니다. 이 블록을 여러 개 쌓아 인코더와 디코더를 만듭니다.

RNN을 대체하다, 그리고 LLM으로

Transformer가 RNN 계열을 밀어낸 이유는 명확합니다. 순차성을 없앤 덕분에 GPU로 대규모 병렬 학습이 가능해졌고, 이전보다 훨씬 크고 많은 데이터로 학습할 수 있게 됐습니다. 긴 의존성에도 강합니다. 이 확장성이 오늘날 대형 언어 모델의 토대가 됐습니다 — 인코더 쪽을 발전시킨 것이 BERT 계열, 디코더 쪽을 키운 것이 GPT 계열입니다. 이들은 11편의 전이학습처럼 “큰 데이터로 사전학습 → 내 과제로 파인튜닝”의 골격을 그대로 따릅니다.

한계도 있습니다. 모든 토큰 쌍의 관련도를 계산하므로 시퀀스 길이 n에 대해 연산과 메모리가 O(n²)으로 늘어납니다. 긴 문맥의 비용이 커서, 이를 줄이는 연구가 지금도 활발합니다.

정리

개념한 줄 요약
self-attention시퀀스가 자기 자신을 참조. Q·K·V로 관련도 계산
두 한계 동시 해결임의의 두 토큰 직접 연결 + 병렬 처리
멀티헤드여러 관계에 병렬로 주목
위치 인코딩순서 정보가 없으므로 위치 벡터를 주입
Transformer 블록self-attention + FFN, 잔차 연결 + Layer Norm
대가길이 n에 대해 O(n²) 비용

시리즈를 마치며

퍼셉트론 하나(1편)에서 시작해, 활성화·손실·역전파로 학습의 원리를 세우고, 초기화·최적화·정규화·규제로 깊은 망을 학습시키는 장치들을 익혔습니다. 그 위에서 이미지의 CNN(9–11편)과 시퀀스의 RNN·LSTM(13–14편), 그리고 순차성마저 걷어낸 Transformer까지 왔습니다. 각 구조는 앞선 것의 한계를 푸는 과정에서 나왔고, 그 흐름이 오늘날 딥러닝의 골격입니다.

여기까지가 원리입니다. 이것을 PyTorch라는 도구로 직접 구현하고, 실제 데이터에 아키텍처를 붙여 학습·비교하는 실습은 별도로 이어가겠습니다 — 개념과 도구가 만나는 자리입니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.