//
밑바닥부터 만들면서 배우는 LLM · 세바스찬 라시카
GPT-2 같은 LLM은 한 번에 하나의 토큰씩 새 텍스트를 생성하도록 만들어진 대규모 심층 신경망이다. 구조 자체는 의외로 단순하다.
이 장은 트랜스포머 블록을 구성하는 부품들을 하나씩 만들고, 마지막에 이들을 조립해 GPT-2 124M을 완성한 뒤, 그 모델로 텍스트를 한 토큰씩 생성하는 것이 목표다.
심층 신경망을 학습할 때 자주 마주치는 두 적은 **그래디언트 소실(Gradient Vanishing)**과 **그래디언트 폭주(Gradient Explosion)**다. 층이 깊어질수록 역전파되는 그래디언트가 소실되거나 폭주해서 앞쪽 층의 학습이 제대로 일어나지 않는다.
**층 정규화(Layer Normalization)**의 아이디어는 단순하다. 각 층의 활성화(출력)를 평균 0, 분산 1이 되도록 조정한 다음, 학습 가능한 스케일/시프트 파라미터(γ, β)를 곱해 복원한다.
이 정규화 덕분에 층의 출력이 일정한 통계적 성질을 유지하게 되고, 학습이 훨씬 안정적으로 진행된다. GPT-2는 트랜스포머 블록의 두 곳(어텐션 직전, 피드 포워드 직전)에 층 정규화를 적용한다. 이를 Pre-LN 구조라 부른다.
LLM에서 흔히 쓰이는 활성화 함수는 두 종류다.
| 함수 | 사용 모델 | 특징 |
|---|---|---|
| GELU (Gaussian Error Linear Unit) | GPT-2, BERT | 가우스 오차 함수 기반, 부드러운 곡선 |
| SwiGLU (Swish-gated Linear Unit) | LLaMA, PaLM | 시그모이드 GLU, 더 좋은 성능 |
GELU가 ReLU보다 좋은 이유는 음수 영역의 처리 방식에 있다. ReLU는 음수를 모두 0으로 잘라버리지만, GELU는 음수도 부드러운 곡선으로 작은 값을 흘려보낸다. 이 부드러움 덕에 그래디언트가 죽지 않고 최적화가 더 매끄럽게 진행된다.
GPT의 **피드 포워드 네트워크(FFN)**는 다음 절차로 구성된다.
입력 (B, T, 768)
↓ 선형층 (768 → 3072)
↓ GELU
↓ 선형층 (3072 → 768)
출력 (B, T, 768)
임베딩 차원을 4배로 확장(768 → 3072)했다가 다시 원본으로 줄이는 구조다. 이 "고차원으로 펼쳤다 다시 모으는" 과정에서 모델은 더 풍부한 표현 공간을 탐색할 수 있다.
ResNet에서 처음 제안된 숏컷 연결(스킵 연결, 잔차 연결이라고도 부른다)은 그래디언트 소실 문제를 정공법으로 해결한다.
층을 거치지 않고 입력을 그대로 출력에 더하는 우회 경로를 만든다. 역전파 시 그래디언트가 이 우회 경로를 따라 흐를 수 있어서, 깊은 네트워크에서도 앞쪽 층까지 그래디언트가 살아 도달할 수 있다.
GPT의 트랜스포머 블록에서는 어텐션 출력에도 한 번, 피드 포워드 출력에도 한 번 — 두 곳에 숏컷 연결을 적용한다.
지금까지 만든 부품들을 조립한다.
이 블록 하나에 멀티 헤드 어텐션, 층 정규화, 드롭아웃, 피드 포워드 네트워크, GELU, 숏컷 연결이 모두 들어 있다. 트랜스포머 블록은 GPT의 핵심 부품이고, GPT 모델은 이 블록을 N번 반복해 쌓는 것이다.
1억 2,400만 파라미터의 GPT-2를 만들기 위한 하이퍼파라미터는 다음과 같다.
| 하이퍼파라미터 | 값 |
|---|---|
| 어휘사전 크기 (V) | 50,257 |
| 컨텍스트 길이 | 1,024 |
| 임베딩 차원 (D) | 768 |
| 헤드 수 | 12 |
| 트랜스포머 블록 수 (N) | 12 |
| 드롭아웃 비율 | 0.1 |
전체 파이프라인은 다음과 같다.
입력 토큰 ID (B, T)
↓ 토큰 임베딩 + 위치 임베딩
↓ 드롭아웃
↓ 트랜스포머 블록 × 12
(각 블록 내부에서 LN1 → MHA → DO + 숏컷 1 → LN2 → FFN → DO + 숏컷 2)
↓ 최종 층 정규화
↓ 선형 출력층 (D=768 → V=50,257)
출력 로짓 (B, T, V)
마지막 선형 출력층은 각 토큰 벡터(768차원)를 어휘사전 크기(50,257차원)로 변환한다. 이 출력의 의미는 "어휘사전의 각 단어가 다음 토큰일 확률(로짓)"이다.
학습되지 않은 모델이라도 일단 만들어졌으면 텍스트 생성 절차는 동작한다(결과가 의미가 있느냐는 별개의 문제). 절차는 다음과 같다.
이 과정을 반복하면, 입력 컨텍스트를 기반으로 한 토큰씩 순차적으로 텍스트가 생성된다. 본질적으로 LLM의 텍스트 생성은 이 자기회귀(autoregressive) 루프다.
이 시점의 모델은 가중치가 랜덤 초기화 상태이므로, 생성되는 텍스트는 의미 없는 토큰 나열에 가깝다. "어떻게 의미 있는 텍스트를 만들게 할 것인가"가 다음 장(사전 훈련)의 주제다.
4장은 책의 클라이맥스에 가깝다. 흩어져 있던 개념들 — 임베딩, 어텐션, 정규화, GELU, 숏컷 — 이 한 자리에 모여 하나의 GPT 모델로 조립된다. 코드 한 줄 한 줄을 따라가다 보면, GPT-2 같은 거대한 이름의 모델이 사실은 12번 반복된 트랜스포머 블록 + 작은 부품 몇 개의 조합이라는 것을 손으로 깨닫게 된다.
이 글이 도움이 되셨나요?