LLM·트랜스포머

LLM / 8번째 글

GPT: 자기회귀적 언어 모델의 진화

GPT-1부터 InstructGPT까지, Decoder-only 트랜스포머가 사전학습·제로샷·In-Context Learning·사람 선호 정렬로 옮겨 간 과정과 BERT와의 차이를 설명한다.

PALDYN Team27 MIN READ

지난 글에서 BERT가 Encoder만으로 양방향 문맥을 학습하는 방법을 살펴봤다. 같은 시기 OpenAI는 반대 방향으로 나아갔다. Decoder만 써서 다음 토큰을 예측하는 자기회귀 언어 모델, GPT(Generative Pre-trained Transformer)다.

2018년의 GPT-1에서 2022년의 InstructGPT까지는 구조가 거의 그대로다. 블록 모양도 학습 목표도 「앞을 보고 다음 토큰 하나를 맞힌다」에서 벗어나지 않았다. 그 사이에 바뀐 것은 모델의 크기와 데이터, 그리고 모델에게 일을 시키는 방식이다. 태스크마다 헤드를 붙여 파인튜닝하던 것이 프롬프트에 지시를 적는 것으로, 다시 예제 몇 개를 보여 주는 것으로, 마지막에는 사람이 좋아하는 답을 기준으로 모델을 고치는 것으로 옮겨 갔다. 이 글은 그 네 번의 전환을 차례로 따라간다.

디코더 전용 구조

인과 마스크와 두 서브레이어

GPT는 트랜스포머 Decoder 블록에서 Cross-Attention을 뺀 형태다. 원래 Decoder에서 Cross-Attention은 인코더가 만든 소스 문장 표현을 끌어오는 장치였는데, GPT에는 인코더가 없으니 끌어올 곳도 없다. 그래서 블록마다 서브레이어가 둘만 남는다.

  1. 인과 마스크를 건 Multi-Head Self-Attention
  2. Feed-Forward Network

인과 마스크는 각 위치가 자기보다 뒤에 있는 토큰을 보지 못하게 어텐션 점수를 가리는 장치다. 이 한 가지 제약이 GPT를 BERT와 가르는 전부라고 해도 과장이 아니다. 뒤를 못 보니 문장 가운데의 빈칸을 앞뒤 맥락으로 채우는 일은 불리하지만, 대신 지금까지의 토큰만으로 다음을 고르는 일, 곧 글을 이어 쓰는 일이 구조 그대로 된다. 구현은 간단하다. 어텐션 점수 행렬에서 대각선 위쪽, 곧 자기보다 뒤 위치에 해당하는 칸을 음의 무한대로 채운 뒤 소프트맥스를 걸면 그 칸의 가중치가 정확히 0이 된다.

GPT 아키텍처 — Decoder-only 구조

다음 토큰 예측 목표

GPT가 배우는 것은 문장 전체의 확률을 앞에서부터 한 토큰씩 곱해 나간 형태다.

P(w1,…,wN)=∏i=1NP(wi∣w1,…,wi−1)P(w_1, \dots, w_N) = \prod_{i=1}^{N} P(w_i \mid w_1, \dots, w_{i-1})

학습할 때는 이 곱의 로그를 최대화한다. 문장 하나를 넣으면 모든 위치에서 동시에 「여기까지 보고 다음을 맞혀라」가 걸리므로, 길이 1,000짜리 문장은 예측 문제 1,000개가 된다. BERT의 MLM이 입력의 15%만 가려 맞히는 것과 비교하면 같은 텍스트에서 뽑아내는 학습 신호가 훨씬 촘촘하다. 이 차이는 뒤에서 디코더 전용 구조가 우세해진 이유를 말할 때 다시 나온다.

생성할 때는 이 분포에서 토큰 하나를 뽑아 입력 끝에 붙이고 다시 분포를 구한다. 끝을 알리는 토큰이 나오거나 길이 한도에 닿을 때까지 이 반복이 이어진다. 뽑는 방식은 가장 확률이 높은 것을 고르는 그리디부터, 온도로 분포를 평평하게 만든 뒤 무작위로 뽑는 샘플링까지 여러 가지이고 같은 모델이라도 이 선택에 따라 글의 성격이 달라진다.

GPT-1

사전학습과 태스크 헤드

2018년 6월 OpenAI가 발표한 GPT-1은 두 단계를 제안했다. 먼저 BooksCorpus, 곧 출판되지 않은 책 7천여 권의 텍스트로 언어 모델을 사전학습한다. 그다음 풀려는 태스크마다 출력 층 하나를 붙이고 그 태스크의 라벨 데이터로 모델 전체를 조금 더 학습한다. 사전학습이 언어 일반의 지식을 모델 안의 가중치로 넣어 두고, 파인튜닝이 그 지식을 특정 태스크의 답 형식으로 꺼내 쓰게 만드는 구조다.

모델은 12층, 은닉 차원 768, 헤드 12개로 파라미터가 1억 1,700만 개였다. 논문은 문장 분류, 함의 판정, 질의응답, 유사도 등 12개 과제 중 9개에서 당시 최고 성적을 냈다고 보고했다. 파인튜닝 중에도 언어 모델 손실을 보조로 함께 걸면 일반화가 나아진다는 것도 이 논문이 보인 점이다. 몇 달 뒤 나온 BERT가 같은 두 단계 방식에 양방향 문맥을 더해 이해 과제 대부분을 가져갔지만, 「큰 텍스트로 먼저 배우고 태스크에 맞춰 조금 고친다」는 틀 자체는 GPT-1이 먼저 세웠다.

입력 변환

GPT-1에서 눈여겨볼 대목은 입력을 다루는 방식이다. 모델은 토큰 한 줄만 받을 수 있는데, 함의 판정은 문장 두 개를, 객관식은 지문과 보기 여러 개를 다뤄야 한다. 그래서 논문은 구조를 바꾸는 대신 입력을 한 줄로 이어 붙였다. 함의 판정이면 전제와 가설 사이에 구분 토큰을 넣고, 유사도면 두 문장을 양쪽 순서로 한 번씩 넣어 결과를 합치고, 객관식이면 지문에 보기 하나씩을 붙여 각각 점수를 낸 뒤 비교한다.

이 발상은 작아 보이지만 이후 전부의 씨앗이다. 태스크의 구조를 모델이 아니라 입력 텍스트의 형식으로 표현한다는 것, 그러니 모델은 하나로 두고 입력만 바꿔 여러 일을 시킬 수 있다는 것이다. GPT-2와 GPT-3는 이 생각을 끝까지 밀어붙여, 태스크 헤드조차 떼어 버린다.

GPT-2

제로샷

2019년 2월의 GPT-2는 Reddit에서 사람들이 추천한 링크를 따라 모은 웹 문서 약 800만 건, 40 GB 분량의 WebText로 학습했다. 가장 큰 모델은 48층에 파라미터 15억 개였고, 문맥 길이는 1,024 토큰으로 GPT-1의 두 배였다. 논문 제목이 곧 주장이었다 — 언어 모델은 감독 없이 여러 태스크를 배우는 학습자다.

여기서 보인 것이 제로샷이다. 태스크별 파인튜닝도, 예제도 없이 사전학습만 한 모델에게 입력 형식만으로 일을 시켜 본 것이다. 기사 끝에 TL;DR:을 붙이면 모델이 요약을 이어 쓰고, 「영어 문장 = 프랑스어 문장」 쌍을 몇 줄 보여 준 뒤 영어 문장과 등호를 두면 번역을 이어 쓴다. 웹 문서 안에 이런 형식이 이미 흔했기 때문이다. 성능은 전용 모델에 한참 못 미쳤지만, 언어 모델 벤치마크 8개 중 7개에서는 제로샷만으로 당시 최고 기록을 넘었다.

OpenAI는 악용 우려를 들어 가장 큰 모델을 곧바로 공개하지 않고, 2019년 한 해 동안 작은 것부터 네 단계로 나눠 내놓았다. 모델 공개를 둘러싼 논쟁이 처음 크게 벌어진 사례로 남아 있다.

GPT-2는 토크나이저도 바꿨다. 글자가 아니라 바이트 단위에서 출발하는 BPE를 써서, 어떤 언어·기호·이모지가 들어와도 모르는 토큰으로 떨어지지 않게 했다. 어휘는 50,257개였다. 웹 문서를 그대로 먹이려면 어떤 문자열이든 받아야 했으므로 필요한 선택이었고, 이후 GPT 계열 토크나이저가 모두 이 방식을 이어받는다.

태스크를 프롬프트로

제로샷이 중요한 이유는 성능 숫자보다 인터페이스에 있다. GPT-1까지는 태스크를 바꾸면 모델을 다시 학습해야 했다. GPT-2부터는 태스크를 바꾸려면 프롬프트, 곧 모델에 넣는 앞머리 텍스트만 바꾸면 된다. 무엇을 할지를 가중치가 아니라 입력에 적는 것이다.

이 전환에는 비용도 있다. 프롬프트의 글자 하나, 줄바꿈 하나가 결과를 바꾼다. 모델이 「요약을 하라는 지시」를 이해한 것이 아니라 「TL;DR: 뒤에는 대개 요약이 온다」는 통계를 따르는 것이라서, 같은 뜻의 다른 표현을 쓰면 다른 행동이 나온다. 이후 프롬프트 설계라는 분야가 생긴 것도, 뒤에서 볼 InstructGPT가 필요해진 것도 이 약점 때문이다.

from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch

tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model     = GPT2LMHeadModel.from_pretrained('gpt2')
model.eval()

prompt = "Artificial intelligence will"
inputs = tokenizer(prompt, return_tensors='pt')

with torch.no_grad():
    output = model.generate(
        **inputs,
        max_new_tokens=50,
        do_sample=True,
        temperature=0.8,
        top_p=0.9,
        repetition_penalty=1.2,
    )
print(tokenizer.decode(output[0], skip_special_tokens=True))

GPT-3

스케일

2020년 5월의 GPT-3는 구조를 거의 바꾸지 않고 크기를 백 배 넘게 키웠다. 파라미터 1,750억 개, 96층, 문맥 2,048 토큰이다. 학습 데이터는 필터링한 Common Crawl을 중심으로 책·위키백과·WebText2를 섞은 3,000억 토큰이었다.

모델 레이어 은닉 차원 헤드 파라미터 문맥
GPT-1 12 768 12 117M 512
GPT-2 48 1,600 25 1.5B 1,024
GPT-3 96 12,288 96 175B 2,048

세 모델을 나란히 놓으면 바뀐 것은 층 수와 폭, 문맥 길이, 그리고 표에는 없는 데이터 양이다. 블록 안의 구성은 정규화 층 위치 같은 세부를 빼면 같다. 논문은 1억 2,500만 개부터 1,750억 개까지 크기만 다른 모델 여덟 개를 같은 방식으로 학습해, 크기가 늘 때 무엇이 달라지는지를 한 그래프 위에 그렸다.

데이터를 섞는 방식에도 눈여겨볼 점이 있다. 필터링한 Common Crawl은 4,100억 토큰으로 가장 컸지만 학습 중 뽑히는 비중은 60%로 정해 두어 전체를 한 번도 다 돌지 않았다. 반대로 위키백과는 30억 토큰뿐인데 3% 비중을 받아 세 번 넘게 반복해 봤다. 품질이 높다고 판단한 작은 데이터를 여러 번 보고, 크고 거친 데이터는 덜 보는 것이다. 무엇을 얼마나 섞느냐가 크기만큼이나 결과를 좌우한다는 생각은 이후 사전학습 설계의 기본이 된다.

퓨샷 곡선

GPT-3 논문의 핵심 그림은 가로축이 모델 크기, 세로축이 정확도인 곡선 세 개다. 예제 없이 지시만 준 제로샷, 예제 하나를 보여 준 원샷, 예제를 수십 개까지 넣은 퓨샷이다. 작은 모델에서는 세 곡선이 거의 붙어 있다. 예제를 보여 줘도 별 도움이 안 된다는 뜻이다. 모델이 커질수록 퓨샷 곡선이 먼저 치고 올라가고, 세 곡선 사이가 벌어진다.

이 곡선을 읽는 요령은 절대값보다 간격을 보는 것이다. 간격이 곧 「예제를 보고 배우는 능력」의 크기이고, 그 능력이 크기와 함께 자란다는 것이 논문의 주장이다. 그렇다고 퓨샷이 모든 과제에서 파인튜닝을 따라잡은 것은 아니다. 번역이나 질의응답 일부에서는 전용 모델에 근접했지만, 두 문장의 관계를 따지는 과제 같은 곳에서는 크게 뒤졌다. 논문 제목 「언어 모델은 퓨샷 학습자」는 모든 문제를 푼다는 뜻이 아니라, 예제로 행동을 바꾸는 능력이 크기에서 나온다는 관찰이었다.

인컨텍스트 러닝

GPT 추론 — 자기 회귀 생성과 In-Context Learning

프롬프트 안의 예제만 보고 새 태스크를 해내는 이 능력을 인컨텍스트 러닝(In-Context Learning, ICL)이라 부른다. 가장 먼저 짚을 점은 이것이 이름과 달리 가중치를 바꾸는 학습이 아니라는 것이다. 파라미터는 모델 안에 든 숫자이고 학습은 그 숫자를 정하는 절차인데, ICL에서는 그 숫자가 하나도 바뀌지 않는다. 예제는 입력의 일부로 들어가 어텐션을 거쳐 다음 토큰 분포를 바꿀 뿐이고, 요청이 끝나면 흔적 없이 사라진다. 다음 요청에서 같은 효과를 보려면 예제를 또 넣어야 한다.

그러면 모델은 예제에서 무엇을 읽는가. 2022년의 한 연구(Min 등)는 퓨샷 예제의 정답 라벨을 무작위로 바꿔 넣어도 성능이 생각보다 덜 떨어진다는 것을 보였다. 모델이 예제에서 주로 얻는 것은 「이 입력에는 이 답」이라는 대응보다, 입력이 어떤 모양이고 답이 어떤 집합에서 나오며 어떤 형식으로 적히는지라는 것이다. ICL은 새 지식을 배우는 것이라기보다, 사전학습 때 이미 본 수많은 패턴 중 지금 무엇을 꺼낼지를 예제가 가리켜 주는 것에 가깝다. 예제의 순서나 형식을 조금 바꿨을 뿐인데 결과가 크게 흔들리는 현상도 이렇게 보면 자연스럽다.

실무에서 퓨샷 예제를 고를 때 이 관찰이 그대로 요령이 된다. 예제는 실제 입력과 모양이 닮은 것으로 고르고, 답의 형식을 한 가지로 맞추고, 가능한 답이 여럿이면 예제에 고루 나오게 한다. 예제 수는 늘릴수록 좋아지다가 금방 평평해지는데, 그만큼 입력 토큰이 늘어 요청마다 비용과 지연이 붙는다. 같은 예제를 수천 번 되풀이해 넣고 있다면, 그때는 파인튜닝으로 그 행동을 가중치에 넣어 두는 편이 싸다.

디코더 전용의 우세

학습 효율

BERT가 이해 과제를 휩쓸던 2019년만 해도 인코더가 이해, 디코더가 생성이라는 분업이 굳어질 것처럼 보였다. 몇 년 뒤 대형 언어 모델의 거의 전부가 디코더 전용이 된 데에는 몇 가지 까닭이 겹친다.

첫째는 앞에서 말한 학습 신호의 밀도다. 다음 토큰 예측은 모든 위치가 예측 목표이므로 같은 데이터에서 더 많은 문제를 뽑는다. 둘째는 구조의 단순함이다. 인코더와 디코더를 따로 두면 입력과 출력의 길이 배분을 미리 정해야 하고 두 스택의 크기를 따로 맞춰야 하지만, 디코더 하나면 모든 토큰이 한 줄에 선다. 셋째는 생성 효율이다. 인과 마스크 덕분에 앞 토큰의 K·V가 뒤 토큰 때문에 바뀌지 않으므로 캐시에 쌓아 두고 재사용할 수 있다. 양방향 어텐션이면 새 토큰이 들어올 때마다 앞 토큰의 표현도 다시 계산해야 한다.

2022년의 한 비교 연구(Wang 등)는 여러 구조와 목표를 같은 조건에서 학습해 봤는데, 사전학습만 마친 상태의 제로샷 성능에서는 다음 토큰 예측으로 학습한 디코더 전용 모델이 가장 좋았다. 다만 여러 태스크로 추가 학습을 한 뒤에는 인코더-디코더 쪽이 앞서는 결과도 함께 나왔다. 디코더 전용의 우세는 「모든 면에서 낫다」가 아니라, 규모를 키우고 범용으로 쓰는 조건에서 가장 손이 덜 가는 선택이라는 뜻에 가깝다.

태스크 통일

가장 큰 이유는 인터페이스다. 분류는 라벨 이름을 생성하면 되고, 추출은 뽑은 문자열을 생성하면 되고, 번역과 요약은 원래 생성이다. 입력 형식으로 태스크를 적는다는 GPT-1의 발상이 GPT-2·3을 거치며, 모든 문제를 「텍스트를 받아 텍스트를 이어 쓴다」 하나로 바꿔 놓았다. 모델을 하나만 운영하면 되고, 새 태스크가 생겨도 학습 없이 프롬프트로 시험해 볼 수 있다.

구분 BERT GPT
아키텍처 Encoder-only Decoder-only
어텐션 방향 양방향 단방향 (인과 마스크)
사전학습 MLM + NSP 다음 토큰 예측
태스크 적용 헤드 추가 후 파인튜닝 프롬프트, 필요하면 파인튜닝
강점 분류·추출·임베딩 생성·범용 지시 수행

BERT 계열이 사라진 것은 아니다. 문장을 벡터로 바꿔 검색에 쓰거나, 대량의 문서를 빠르고 싸게 분류하는 자리에서는 여전히 작은 인코더가 디코더보다 효율적이다. 다만 「무엇이든 시킬 수 있는 하나의 모델」이라는 자리는 디코더 전용이 차지했다.

InstructGPT

세 단계 정렬

GPT-3는 퓨샷으로 많은 것을 해냈지만, 사람이 실제로 쓰기에는 불편했다. 「이 글을 요약해 줘」라고 쓰면 요약 대신 비슷한 요청 문장을 몇 줄 더 이어 쓰기도 했고, 그럴듯한 거짓이나 해로운 내용을 망설임 없이 만들었다. 모델은 인터넷 텍스트를 이어 쓰도록 배웠을 뿐, 지시를 따르도록 배운 적이 없었기 때문이다.

2022년 3월의 InstructGPT는 이 틈을 세 단계로 메웠다. 먼저 사람이 쓴 모범 답으로 GPT-3를 추가 학습하는 지도 파인튜닝(SFT)을 한다. 다음으로 같은 질문에 대한 모델 답 여러 개를 사람이 순위 매기게 하고, 그 순위를 흉내 내어 답에 점수를 매기는 보상 모델을 학습한다. 마지막으로 SFT 모델이 답을 쓰면 보상 모델이 점수를 매기고, 그 점수가 오르는 쪽으로 PPO라는 강화학습 알고리즘이 모델을 고친다. 이 셋을 묶어 사람 피드백 기반 강화학습, 곧 RLHF라 부른다.

여기 든 사람 손은 생각보다 적었다. 논문에 따르면 외주 라벨러 40명 남짓이 참여했고, 지도 파인튜닝에 쓴 프롬프트는 약 1만 3천 개, 보상 모델용 비교 데이터는 약 3만 3천 개 프롬프트에서 나왔다. 사전학습 데이터 3,000억 토큰과 비교하면 티끌 같은 양이다. 적은 양으로도 행동이 크게 바뀐다는 것은, 능력은 이미 사전학습에서 생겼고 정렬은 그 능력을 어느 쪽으로 쓸지를 고르는 일이라는 뜻이다.

InstructGPT의 세 단계 — 지도 파인튜닝, 보상 모델, 강화학습

강화학습 단계에는 부작용이 하나 있었다. 보상만 쫓다 보면 사전학습 때 갖고 있던 일반 능력이 깎여, 공개 벤치마크 점수가 떨어진다. 논문은 이것을 정렬의 세금이라 부르고, PPO 학습에 사전학습 데이터의 기울기를 섞어 이 손실을 상당 부분 메웠다.

사람 선호라는 기준

InstructGPT가 남긴 가장 큰 변화는 기준 자체다. 그전까지 언어 모델의 발전은 벤치마크 점수로 쟀다. InstructGPT는 실제 사용자 프롬프트를 모아, 두 모델의 답 중 어느 쪽이 나은지를 사람에게 물었다. 그 평가에서 파라미터 13억 개짜리 InstructGPT의 답이 1,750억 개짜리 GPT-3의 답보다 더 자주 선택됐다. 크기를 백 배 넘게 줄여도, 무엇에 맞춰 고쳤느냐가 더 큰 차이를 만든 것이다.

이 결과는 이후 LLM 개발의 순서를 바꿨다. 사전학습으로 능력을 쌓고, 사람 선호에 맞춰 그 능력을 쓰기 좋게 다듬는 두 단계가 표준이 되었고, 같은 해 11월 공개된 ChatGPT는 OpenAI가 InstructGPT의 형제 모델이라고 소개한 대화형 모델이었다. 2023년의 GPT-4는 기술 보고서에서 크기와 구조를 공개하지 않았으므로, 그 내부를 단정하는 말은 확인된 사실이 아니다. 확인되는 것은 구조보다 정렬이 더 큰 몫을 한다는 InstructGPT의 관찰이 그 뒤 모델들의 공통 전제가 되었다는 점이다. 다음 글에서는 인코더와 디코더를 둘 다 쓰는 쪽으로 돌아가, T5와 BART가 사전학습을 어떻게 설계했는지 본다.


읽어주셔서 감사합니다. 😊

LATEST

LLM·트랜스포머의 최신 글

LLM·트랜스포머2026.08.14

작은 모델을 우리 일에 맞추는 법

파인튜닝이 실제로 고치는 것은 지식이 아니라 행동입니다. 데이터 몇 건이 필요한지, LoRA가 무엇을 바꾸는지, 학습 전에 무엇을 먼저 만들어야 하는지를 정리합니다.

15 MIN
LLM·트랜스포머2026.08.13

작은 모델로 내려도 되는지 판단하는 법

비용·지연·품질은 같은 방향으로 움직이지 않습니다. 폴백을 붙였을 때의 손익분기, 격차가 벌어지는 작업 유형, 그리고 내리기 전에 통과해야 할 네 관문을 정리합니다.

10 MIN
LLM·트랜스포머2026.08.13

작은 모델이 다시 쓸 만해진 이유

10억에서 100억 파라미터 사이의 모델이 다시 실무에 들어오고 있습니다. 무엇이 달라졌는지, 메모리는 어떻게 계산하는지, 무엇을 잘하고 무엇을 못하는지 정리합니다.

10 MIN