이번 포스팅은 GPT, BERT 등 대표적 LLM들의 기반이 되는 transformer 구조에 대한 내용을 정리했다.
Transformer
이전까지의 RNN, LSTM처럼 순차적으로 문장을 처리하는 방식이 아닌, Self attention을 사용해 병렬로 문장을 처리하는 모델이며, 2017년 구글에서 "Attention Is All You Need" 논문으로 발표한 모델이다.
구조는 아래와 같다.

transformer는 인코더와 디코더로 이루어져 있다.
먼저, 인코더의 구조부터 알아보자
1. Encoder
1.1. Input Embedding & Positional Encoding
1.1.1. Input Embedding
입력 시퀀스가 인코더로 들어가기 전 임베딩과 위치 인코딩(positional encoding) 단계를 거친다.
먼저 임베딩 단계에서는 토큰화된 input 벡터를 vocab 인덱스로 변환한 후, 각 인덱스를 실수 벡터로 변환해 의미 공간에 매핑해준다. 그 다음 √d_model을 곱해 스케일을 조정해준다.
1.1.2. Positional encoding
또한, transformer는 셀프 어텐션 기반이기 때문에 문장의 순서 정보를 내부에 갖고 있지 않다.
따라서 토큰 벡터에 위치 정보를 더해줘야 하는데, 이 과정이 positional encoding이다.
논문에 따르면 위치를 홀수/짝수로 분리해 인코딩하는데, 수식은 아래와 같다.

- pos : position을 의미. 즉 위치 정보 (0부터 시작)
- i : 임베딩 벡터 차원 내 인덱스 (0부터 (d_model / 2) -1 까지)
- d_model : 임베딩 차원 수
해당 연산의 결과로 생성된 위치 인코딩 벡터를 앞에서 계산했던 토큰 임베딩 벡터에 그대로 더해줘서 최종 입력 벡터를 생성한다.
1.2. Multi-head attention

Multi-head attention은 이전 포스팅에서 정리했던 Sclaed dot-product attention을 여러 헤드가 병렬로 수행하는 과정.
즉, 한 시점에서 여러 Q, K, V를 만들어서 단어 간 관계를 여러 관점에서 동시에 학습하는 방법이다.
(CNN에서 필터 여러 개 만드는거랑 비슷한 느낌인데, 필터는 작은 부분씩 쪼개서 보고, 헤드는 한 번에 전체를 봄.)
1.2.1. 헤드 나누기
그렇다면 여러 Q, K, V를 만드는 방법은?

위의 방식대로 Q, K, V 하나씩 만드는 방법도 있지만, 한 번에 투영 후 분할하는 아래의 방법이 더 효율적이다.



(W는 학습 가능한 파라미터)
이렇게 헤드를 나눈 다음, 각 헤드 i에 대해 어텐션을 계산한다.
1.2.2. Scaled dot product attention

(1) MatMul
- Q와 K를 행렬곱한다.
- 예:

(2) scaling
- √d_model로 나누어 스케일링한다. (위 그림에서는 루트6)
(3) softmax
- scaling 한 행렬을 softmax에 넣어서 확률값으로 바꾼다.
- 이 결과로 얻은 행렬이 attention weight 를 의미한다.

- 이게 뭔데?
- 각각의 단어들끼리의 상관관계를 나타냄.
- 근데 위 행렬을 보면 다 고만고만한 수치같은데,,
- 왜냐하면처음에 W를 랜덤값으로 초기화해서 시작했기 때문. (아직 학습이 안 된 상태)
- 학습 시 관련 높은 단어쌍은 높은 값으로, 관련이 낮은 단어쌍는 낮은 값으로 학습될거임.
(4) MatMul
- 이제 이 행렬을 V와 행렬곱해서 다음 단계로 보낸다.
- 즉, 입력 + 위치 + 어텐션 임베딩 행렬이 된 상태.
1.2.3. Concat, FC layer
- 어텐션을 마친 모든 헤드의 결과를 이어붙이고(concat),
- FC 레이어로 보내 선형변환 한다.
- 왜 FC 레이어로 보내냐?
- concat한 결과는 단순히 k개의 다른 관점에서 본 정보들을 이어붙인 벡터일 뿐임
- 그래서 “의미 있는 하나의 통합 표현”으로 만들기 위해 랜덤값으로 초기화된 행렬 W를 행렬곱을 한다.
- 그럼 결과적으로 헤드 간의 정보 상호작용이 됨.

W까지 곱해서 input의 차원으로 선형변환을 진행한 행렬이 multi-head attention의 최종 output이 된다.
1.3. Add & Norm
1.3.1. Add
Add는 잔차 연결(residual connection)을 의미한다.
여기서는 이전 단계인 multi-head attention의 output과 positional embedding을 적용한 행렬을 더해준다.
- 왜 갑자기 잔차연결?
- 기울기 소실 완화 + 기존 정보를 어느정도 보존하는 효과가 있음.

이번 단계는 인코더의 멀티헤드 어텐션 직후의 잔차연결 과정이기 때문에 위치 임베딩 행렬을 더해준 것이고, 다른 단계의 잔차연결 과정은 ResNet 포스팅에서 했던 것처럼 직전 단계의 출력을 더해주면 된다.
1.3.2. Normalization
Norm은 정규화를 의미한다.
위에서 잔차 연결을 적용한 값을 열 별로 Normalization 해주면 된다.

1.4. Feed Forward
Feed Forward는 k개의 층으로 이루어져 있는 신경망 구조이며, 활성화 함수로는 ReLU를 사용한다.

여기서도 W와 b 역시 초기화된 학습 가능한 파라미터이다.
- 그래서 Feed Forward는 왜 함?
- 비선형성을 추가해서 복잡한 데이터 처리 능력을 높이기 위해.

1.5. Add & Norm
위의 과정을 거친 output을 다시 잔차 연결 & 정규화를 진행해준다.
이 과정까지 거치면 인코더의 최종 output이 생성된다.
이 output은 디코더의 두 번째 어텐션 단계에서 입력으로 사용할 예정이다.
(아래 디코더 과정에 자세히 설명)
2. Decoder
2.1. Output Embedding & Positional Encoding
디코더는 이전까지 생성된 토큰들을 입력으로 받고, 다음 단어를 예측해서 출력한다.

그런데 위의 그림을 보면 Outputs에 shifted right라고 표기되어 있는데, 이는 디코더의 inputs이 정답값을 오른쪽으로 한 칸 민 형태이기 때문에 그렇다.
2.1.1. Output embedding
인코더에서 진행했던 과정과 동일하다.
이전까지 생성된 토큰들을 입력으로 받아 embedding 레이어를 거치면서 숫자 벡터 공간으로 변환한다.
토큰 ID → Embedding Layer → Dense Vector
2.1.2. Positional Encoding
이 단계 또한 인코더와 동일하다.

해당 수식을 거쳐 입력 벡터에 위치 정보를 더한다.
즉,
토큰 의미 정보 + 위치 정보 = 디코더에 들어갈 입력
2.2. Masked Multi-head attention

인코더에서 했던 multi-head attention의 과정과 유사하므로 자세한 설명은 생략.
(1) X(outputs, 디코더의 입력) 행렬을 랜덤으로 초기화한 W_QKV와 행렬곱해서 헤드별로 초기 Q, K, V를 생성한다.
(2) Q와 K 행렬곱
(3) scaling
(4) masking
인코더의 경우는 문장 전체의 의미를 파악해야 하기 때문에, 전체 단어들의 관계를 모두 파악해야 했지만,
디코더의 경우는 문장을 한 단어씩 출력하는 것이 목표이기 때문에, 아직 출력되지 않은 뒷부분의 단어에 대해서는 주의(attention)을 줄 수 없다(당연).
그래서 transformer의 학습 과정에도 이런 특성을 반영해서,
"특정 단어 기준으로, 미래에 나오는 단어들은 가려서 계산에 영향을 주지 않도록 한다." 라는 것이 mask의 컨셉이다.

- 이때 마스킹된 부분을 -inf로 바꾼 이유는?
- softmax를 거치면 0이 되기 때문 (영향을 주면 안 되니까)
(5) masked 행렬을 softmax에 넣은 다음,
(6) V와 행렬곱한다.
(7) Concat
(8) FC layer
8번까지 끝낸 행렬이 masked multi-head attention의 최종 output이다.
2.3. Add & Norm
인코더에서 진행한 것과 동일하게 잔차 연결, 정규화를 진행한다.
이 단계를 거친 행렬이 다음 단계인 multi-head attention의 Q이다.
2.4. Multi-head attention (Encoder-Decoder attention)

디코더의 multi-head attention은 인코더와는 input이 다르다.
- Q: 방금 masked multi-head attention과 add & norm을 거치고 올라온 행렬에 W를 곱한 행렬
- K, V: 인코더의 출력(1.5. 단계에서 add & norm을 마친 행렬)에 W를 곱한 행렬
수식은 아래와 같다.

물론 여기서도 W는 랜덤으로 초기화된 학습 가능한 파라미터이다.
이후에는 기존의 어텐션과 계산 과정이 동일하다.
2.5. Add & Norm
잔차 연결, 정규화를 진행한다.
2.6. Feed Forward
인코더와 동일하게 k층의 신경망을 통과한다.
2.7. Add & Norm
잔차 연결, 정규화를 진행한다.
2.8. Linear & Softmax
2.8.1. Linear (FC Layer)
최종 add & norm까지 통과한 output을 Linear 연산을 통해서 원래의 vocabulary 길이만큼 다시 회복한다.
2.8.2. Softmax
그 다음 softmax 연산을 통해 transformer의 최종 Output을 생성한다.
마지막으로, 정답값의 index와 비교한 다음,
Crossentropy 등의 손실함수와 backward를 통해 모든 레이어들의 파라미터들을 조절해 나가는 것이 transformer의 학습 과정이다.

회고
여기까지 transformer의 구조를 정리해봤다.
이 모델을 기반으로 BERT, GPT 등 여러 모델들이 파생되기 때문에 잘 알아두면 좋을 것 같다.
공부와 사진들은 아래 영상을 참고했다. 설명을 정말 잘 하시는 것 같다.
https://youtu.be/p216tTVxues?si=ZwLlvesfuZiNZX2y
그리고 필자는 tldraw를 이용해 내용을 정리해봤는데, 이렇게 구조를 도식화하니 이해가 수월했다. tldraw 애용해야겠다.
https://www.tldraw.com/f/XkSYt0pNCykM8hmp42uBN?d=v2384.-2839.12595.8111.page
tldraw
A free and instant collaborative whiteboarding tool.
www.tldraw.com
'AI > NLP' 카테고리의 다른 글
| [11/6~11/11] 아이펠 리서치 15기 TIL | DLthon: 감정 분류 해커톤 (1) (0) | 2025.11.15 |
|---|---|
| [11/05] 아이펠 리서치 15기 TIL | Transformer 구현 (0) | 2025.11.15 |
| [10/29] 아이펠 리서치 15기 TIL | Attention (0) | 2025.11.01 |
| [10/26] 아이펠 리서치 15기 TIL | RNN & LSTM (1) | 2025.10.26 |
| [10/25] 아이펠 리서치 15기 TIL | 임베딩(Embedding) (1) | 2025.10.25 |