Skip to main content
Summary

우리가 만든 모델이 갑자기 똑똑해지지 않는 이유

앞 장에서 우리는 Mini GPT가 문장을 생성하는 과정을 살펴보았습니다. 처음에는 아무렇게나 글자를 뱉던 모델이 학습을 거치면서 데이터셋의 말투를 조금씩 흉내 내기 시작했습니다. 손실이 내려가고, 생성 결과가 조금 더 그럴듯해지는 장면은 꽤 짜릿합니다.

하지만 동시에 이런 생각도 들었을 것입니다.

"왜 아직도 이상한 문장을 만들지?"

모델은 단어를 반복하기도 하고, 문장을 시작해 놓고 끝맺지 못하기도 하며, 그럴듯한 분위기만 낼 뿐 실제 의미는 흐릿한 결과를 내놓습니다. 앞에서 구현한 구조는 분명 GPT의 핵심 원리를 담고 있습니다. 토큰 임베딩, 위치 임베딩, Self-Attention, Multi-Head Attention, Feed Forward Network, LayerNorm, Residual Connection까지 들어갔습니다. 그런데도 상용 LLM처럼 대답하지는 못합니다.

이 차이를 이해하는 것이 이번 장의 목표입니다.

우리가 만든 것은 ChatGPT가 아닙니다. ChatGPT의 핵심 원리를 이해하기 위한 작은 GPT입니다. 이 작은 모델은 실패작이 아니라 현미경입니다. 너무 작기 때문에 오히려 LLM의 중요한 특징이 잘 보입니다. 데이터가 부족하면 어떻게 흔들리는지, 모델이 작으면 무엇을 놓치는지, 손실이 낮아져도 왜 좋은 글이 나오지 않는지, 그리고 상용 LLM 뒤에 얼마나 큰 비용과 설계가 숨어 있는지 확인할 수 있습니다.

작은 모델의 한계 이해하기

작은 데이터는 모델을 암기하게 만든다

언어 모델은 데이터를 보고 다음 토큰의 패턴을 배웁니다. 여기서 중요한 단어는 "패턴"입니다. 모델이 충분히 다양한 데이터를 많이 보면, 특정 문장을 그대로 외우는 대신 여러 문장에 공통으로 나타나는 규칙을 배울 가능성이 커집니다.

예를 들어 다음과 같은 문장을 많이 봤다고 해 봅시다.

고양이는 창가에 앉았다.
고양이는 소파에 누웠다.
강아지는 마당에서 뛰었다.
아이는 창가에서 책을 읽었다.

이런 데이터가 충분히 많으면 모델은 "고양이", "강아지", "아이" 같은 주어 뒤에 어떤 행동이 올 수 있는지, "창가에", "마당에서" 같은 표현 뒤에 어떤 동사가 어울리는지 조금씩 배웁니다. 물론 작은 모델은 이 규칙을 깊게 이해하지 못하지만, 적어도 여러 문장에서 반복되는 통계적 관계를 포착할 수 있습니다.

반대로 데이터가 너무 작으면 상황이 달라집니다. 모델이 볼 수 있는 세계가 몇 문단, 몇 페이지뿐이라면, 모델은 일반적인 언어 규칙을 배우기보다 훈련 데이터에 나온 표현을 그대로 재사용하려고 합니다. 이것은 시험 범위가 너무 좁은 시험을 보는 학생과 비슷합니다. 교과서를 이해한 것이 아니라 예상 문제의 답을 외운 학생도 시험 점수는 잘 받을 수 있습니다.

Mini GPT도 마찬가지입니다. 작은 텍스트 파일 하나로 오래 학습하면, 모델은 그 파일에 자주 등장한 글자 조합과 문장 조각을 강하게 기억합니다. 그래서 생성 결과가 어느 순간 훈련 데이터의 말투를 닮기 시작합니다. 겉보기에는 발전한 것 같지만, 새로운 주제나 낯선 문맥을 주면 금방 무너질 수 있습니다.

이 현상을 보통 과적합, 영어로는 overfitting이라고 부릅니다. 과적합은 모델이 훈련 데이터에는 지나치게 잘 맞지만, 새로운 데이터에는 약한 상태를 말합니다. 우리가 만든 Mini GPT에서는 과적합이 매우 쉽게 일어납니다. 데이터도 작고, 모델도 작고, 학습하는 세계도 좁기 때문입니다.

일반화는 외우지 않은 문장에 대응하는 능력이다

언어 모델에서 정말 중요한 능력은 훈련 데이터에 있던 문장을 그대로 재현하는 것이 아닙니다. 훈련 데이터에서 배운 패턴을 바탕으로 처음 보는 입력에도 그럴듯하게 이어 쓰는 능력이 중요합니다. 이것을 일반화라고 부릅니다.

예를 들어 모델이 학습 데이터에서 다음 문장을 봤다고 해 봅시다.

봄이 오면 꽃이 핀다.

일반화가 잘 된 모델은 이런 문장을 입력받았을 때도 어느 정도 자연스럽게 이어 갈 수 있습니다.

여름이 오면
아침이 되면
비가 그치면

하지만 데이터를 거의 외운 모델은 "봄이 오면"이라는 정확한 패턴에는 강하지만, 조금만 표현이 바뀌어도 어색해집니다. "여름이 오면"이라는 입력이 학습 데이터에 없었다면 그다음에 무엇이 자연스러운지 모를 수 있습니다.

우리가 만든 Mini GPT의 생성 결과를 볼 때는 이 차이를 염두에 두어야 합니다. 생성된 문장이 훈련 데이터의 분위기를 닮았다고 해서, 모델이 언어를 폭넓게 배웠다고 결론 내리면 안 됩니다. 특히 문자 단위 모델은 더 그렇습니다. 문자 단위 모델은 단어를 하나의 의미 단위로 다루지 않고, 글자 하나하나를 예측합니다. 그래서 단어의 형태를 흉내 내는 일은 가능하지만, 의미 있는 긴 문장을 안정적으로 유지하기는 어렵습니다.

작은 모델은 가까운 패턴에 강하고, 먼 의미에 약합니다. 바로 이 지점에서 모델 크기와 데이터 규모의 한계가 드러납니다.

파라미터 수를 늘리면 무엇이 좋아질까

모델의 파라미터는 학습을 통해 조정되는 숫자들입니다. 임베딩 테이블의 값, Attention에서 사용하는 선형 변환의 가중치, Feed Forward Network의 가중치가 모두 파라미터입니다. 쉽게 말하면 파라미터는 모델의 기억과 계산 습관이 저장되는 공간입니다.

파라미터 수가 늘어나면 모델은 더 복잡한 패턴을 담을 수 있습니다. n_embd를 키우면 각 토큰을 더 넓은 벡터 공간에 표현할 수 있고, n_layer를 늘리면 여러 단계에 걸쳐 문맥을 가공할 수 있으며, n_head를 늘리면 여러 관점에서 토큰 관계를 동시에 볼 수 있습니다.

예를 들어 아주 작은 모델이 다음 정도만 구분한다고 해 봅시다.

이 글자 다음에는 어떤 글자가 자주 나오는가?

조금 더 큰 모델은 다음 질문까지 다룰 수 있습니다.

이 단어는 문장에서 어떤 역할을 하는가?
앞에 나온 표현과 지금 위치의 표현은 어떤 관계인가?
문장의 초반 분위기를 후반까지 유지해야 하는가?

물론 이것은 비유입니다. 모델이 사람처럼 질문을 떠올리는 것은 아닙니다. 하지만 파라미터와 층이 늘어날수록 더 복잡한 통계적 관계를 표현할 여지가 생기는 것은 맞습니다.

우리가 실습에서 다룬 주요 설정을 다시 떠올려 봅시다.

설정커질 때 기대할 수 있는 점함께 증가하는 비용
n_embd토큰 표현이 풍부해진다메모리 사용량과 연산량 증가
n_head여러 관계를 병렬로 볼 수 있다Attention 계산과 구현 복잡도 증가
n_layer문맥을 여러 단계로 가공한다학습 시간이 길어지고 최적화가 어려워짐
block_size더 긴 문맥을 볼 수 있다Attention 비용이 크게 증가
batch_size한 번에 더 안정적인 통계로 학습한다GPU 메모리 사용량 증가

모델을 키우면 보통 더 나은 결과를 기대할 수 있습니다. 하지만 "그냥 크게 만들면 된다"는 말은 절반만 맞습니다. 모델이 커질수록 더 많은 데이터가 필요하고, 더 많은 학습 시간이 필요하며, 더 좋은 하드웨어가 필요합니다. 작은 컵에는 물을 조금만 부어도 차지만, 큰 수영장을 채우려면 물도 시간도 훨씬 많이 필요합니다.

레이어 수를 늘린다는 것

Transformer Block 하나는 입력 토큰 표현을 한 번 가공하는 층입니다. 이 안에서 Attention은 문맥을 섞고, Feed Forward Network는 각 위치의 표현을 더 복잡하게 변환합니다. Residual Connection은 원래 정보를 보존하면서 새 정보를 더하고, LayerNorm은 값의 흐름을 안정화합니다.

레이어를 여러 개 쌓는다는 것은 이 과정을 여러 번 반복한다는 뜻입니다.

첫 번째 층에서는 가까운 글자나 단순한 패턴을 볼 수 있습니다. 두 번째, 세 번째 층을 지나면서 표현은 점점 더 추상적인 관계를 담을 수 있습니다. 사람의 눈으로 직접 확인하기는 어렵지만, 깊은 모델은 얕은 모델보다 여러 단계의 변환을 통해 복잡한 패턴을 표현할 수 있습니다.

하지만 레이어를 늘리면 학습이 무조건 쉬워지는 것은 아닙니다. 오히려 반대입니다. 층이 깊어질수록 계산량이 늘고, 메모리 사용량도 늘며, 학습 중 값이 불안정해질 가능성도 커집니다. LayerNorm과 Residual Connection이 중요한 이유도 여기에 있습니다. 깊은 네트워크가 무너지지 않고 학습되도록 도와주는 안전장치이기 때문입니다.

Mini GPT에서 n_layer를 1에서 2, 4, 6으로 늘려 보면 손실이 더 잘 내려갈 수 있습니다. 하지만 어느 순간부터는 속도가 눈에 띄게 느려집니다. 노트북 CPU로는 기다리는 시간이 길어지고, GPU를 쓰더라도 메모리가 부족해질 수 있습니다. 모델을 키우는 것은 성능의 문제가 아니라 자원의 문제이기도 합니다.

Head 수를 늘린다는 것

Multi-Head Attention에서 head는 Attention을 바라보는 여러 개의 시선이라고 설명했습니다. 하나의 head가 모든 관계를 다 보려고 하면 부담이 큽니다. 여러 head를 두면 각 head가 서로 다른 관계를 나누어 볼 수 있습니다.

어떤 head는 가까운 토큰을 주로 볼 수 있고, 어떤 head는 문장 앞쪽의 특정 표현을 참고할 수 있으며, 또 다른 head는 반복되는 구조를 포착할 수 있습니다. 실제로 우리가 만든 작은 모델에서 각 head가 그렇게 깔끔하게 역할을 나누리라고 기대하기는 어렵습니다. 모델도 작고 데이터도 작기 때문입니다. 하지만 구조적으로는 여러 head가 다양한 관계를 병렬로 계산할 가능성을 열어 줍니다.

그렇다고 head 수를 무작정 늘리면 좋을까요? 그렇지 않습니다. 보통 전체 임베딩 차원 n_embd를 여러 head가 나누어 씁니다. 예를 들어 n_embd=64, n_head=4라면 각 head는 16차원 정도를 사용합니다. head 수를 너무 많이 늘리면 head 하나가 사용할 수 있는 차원이 너무 작아질 수 있습니다.

즉, head 수는 단독으로 생각하면 안 됩니다. n_embd, n_layer, 데이터 크기, 학습 시간과 함께 조정해야 합니다. 작은 모델에서는 head를 늘리는 것보다 임베딩 차원이나 데이터 품질이 더 큰 영향을 줄 수도 있습니다.

컨텍스트를 늘리면 비용이 빠르게 커진다

block_size는 모델이 한 번에 볼 수 있는 토큰 수입니다. 앞에서 컨텍스트 윈도우라고 불렀던 개념과 연결됩니다. block_size가 8이면 모델은 최대 8개 토큰의 문맥을 보고 다음 토큰을 예측합니다. block_size가 128이면 훨씬 긴 문맥을 볼 수 있습니다.

긴 문맥을 볼 수 있다는 것은 분명 장점입니다. 문장 앞에서 등장한 이름, 주제, 말투를 뒤쪽에서 다시 참고할 수 있기 때문입니다. 하지만 Attention에는 중요한 비용 문제가 있습니다. Self-Attention은 각 토큰이 다른 토큰들과 관계를 계산합니다. 토큰이 10개면 대략 10×10 관계를 보고, 토큰이 100개면 100×100 관계를 봅니다.

토큰 수가 10배 늘면 Attention 관계 수는 대략 100배 늘어납니다. 이것이 긴 컨텍스트가 비싼 이유입니다.

Mini GPT에서 block_size를 늘리면 처음에는 생성 품질이 좋아질 수 있습니다. 그러나 곧 메모리와 속도의 벽을 만납니다. 특히 배치 크기까지 함께 크면, 한 번 학습할 때 필요한 텐서가 급격히 커집니다. 상용 LLM이 긴 문맥을 처리하기 위해 많은 연구와 최적화를 사용하는 이유도 여기에 있습니다.

검증 손실이 낮아도 생성 품질이 낮을 수 있다

학습 중 우리는 훈련 손실과 검증 손실을 확인했습니다. 손실은 모델이 정답 토큰에 얼마나 높은 확률을 주었는지 측정하는 값입니다. 손실이 낮아진다는 것은 평균적으로 다음 토큰을 더 잘 맞히고 있다는 뜻입니다.

그런데 여기서 조심해야 합니다. 검증 손실이 낮다고 해서 사람이 보기에 좋은 글을 생성한다는 뜻은 아닙니다.

이유는 여러 가지입니다.

첫째, 손실은 토큰 단위의 평균 점수입니다. 모델이 많은 위치에서 다음 글자를 조금씩 잘 맞히면 손실은 내려갑니다. 하지만 문장 전체가 논리적으로 자연스러운지, 이야기가 끝까지 이어지는지, 독자가 읽기에 좋은지는 별개의 문제입니다.

둘째, 검증 데이터가 훈련 데이터와 너무 비슷할 수 있습니다. 작은 데이터셋을 train과 validation으로 나누면, 두 데이터가 같은 문체와 같은 주제를 공유하는 경우가 많습니다. 이때 검증 손실은 낮게 나오지만, 완전히 새로운 문맥에서는 모델이 약할 수 있습니다.

셋째, 생성은 연쇄 반응입니다. 모델은 한 토큰을 만들고, 그 토큰을 다시 입력에 붙여 다음 토큰을 만듭니다. 초반에 이상한 토큰을 하나 선택하면 그다음 문맥도 흔들립니다. 손실 계산에서는 정답 문맥을 기준으로 다음 토큰을 예측하지만, 생성할 때는 모델 자신이 만든 문맥을 계속 사용합니다. 작은 실수가 뒤로 갈수록 커질 수 있습니다.

넷째, 좋은 글에는 다음 토큰 예측 이상의 기준이 필요합니다. 정보가 정확해야 하고, 질문 의도에 맞아야 하며, 중복이 적어야 하고, 문체가 일관되어야 합니다. 작은 Mini GPT는 이런 기준을 따로 배우지 않았습니다. 우리는 단지 텍스트의 다음 글자를 예측하도록 학습시켰을 뿐입니다.

그래서 검증 손실은 중요하지만 충분하지 않습니다. 손실은 모델의 기본 체온계와 같습니다. 열이 있는지 확인하는 데는 유용하지만, 그 사람의 건강 상태 전체를 설명하지는 못합니다.

문자 단위 모델의 특별한 한계

우리가 실습에서 사용한 모델은 문자 단위 모델입니다. 이 방식은 이해하기 쉽고 구현하기 좋습니다. 어휘 사전도 단순합니다. 데이터에 등장한 글자들을 모아 번호를 붙이면 됩니다. 그래서 LLM의 원리를 배우기에는 아주 좋은 출발점입니다.

하지만 문자 단위 모델에는 뚜렷한 한계가 있습니다.

예를 들어 "인공지능"이라는 단어를 생각해 봅시다. 문자 단위 모델은 이것을 하나의 의미 덩어리로 바로 보지 않습니다.

인 / 공 / 지 / 능

모델은 각 글자의 연결 패턴을 배워야 합니다. "인" 다음에 "공"이 오고, "공" 다음에 "지"가 오고, "지" 다음에 "능"이 오는 식입니다. 이 정도는 자주 나오면 배울 수 있습니다. 하지만 단어의 의미, 문장 속 역할, 주제와의 관계까지 안정적으로 배우려면 훨씬 많은 데이터와 더 큰 모델이 필요합니다.

상용 LLM은 보통 문자 하나하나가 아니라 더 효율적인 토큰 단위를 사용합니다. 자주 등장하는 단어 조각이나 표현을 하나의 토큰으로 다루면, 모델은 더 긴 의미 단위를 한 번에 처리할 수 있습니다. 물론 상용 모델의 토큰화도 완벽하지는 않지만, 단순 문자 단위 방식보다는 긴 텍스트를 효율적으로 다루는 데 유리합니다.

이 말은 문자 단위 Mini GPT가 쓸모없다는 뜻이 아닙니다. 오히려 반대입니다. 문자 단위 모델은 토큰화의 복잡도를 줄여 주기 때문에 Attention과 Transformer 구조 자체에 집중할 수 있게 해 줍니다. 다만 이 모델의 생성 품질을 상용 LLM과 비교하면 안 됩니다. 달리기 자세를 배우기 위해 운동장 한 바퀴를 뛰는 것과 올림픽 결승에서 뛰는 것은 같은 "달리기"지만 완전히 다른 규모의 일입니다.

작은 모델이 자주 보이는 생성 실패

Mini GPT를 여러 번 실행해 보면 비슷한 실패 양상이 반복됩니다. 이것은 구현을 잘못했다는 뜻이 아닐 때가 많습니다. 작은 모델이 자연스럽게 보이는 한계입니다.

대표적인 모습은 다음과 같습니다.

  • 같은 글자나 단어 조각을 반복한다.

  • 문장 초반은 그럴듯하지만 뒤로 갈수록 흐트러진다.

  • 훈련 데이터의 말투는 흉내 내지만 내용은 비어 있다.

  • 줄바꿈, 구두점, 괄호 같은 형식은 배우지만 의미 연결은 약하다.

  • 프롬프트를 조금만 바꿔도 생성 결과가 크게 흔들린다.

이런 실패를 만났을 때 가장 먼저 확인할 것은 코드 오류가 아니라 규모입니다. 데이터가 너무 적은가? 모델이 너무 작은가? 너무 오래 학습해서 외우고 있는가? 컨텍스트가 너무 짧은가? 생성 설정이 지나치게 무작위적인가?

물론 코드 버그도 있을 수 있습니다. causal mask가 제대로 적용되지 않았거나, 입력과 정답이 한 칸씩 밀려 있지 않거나, 모델이 평가 모드와 학습 모드를 제대로 전환하지 않는 경우도 있습니다. 하지만 코드가 정상이어도 작은 모델은 작은 모델다운 결과를 냅니다. 이 사실을 받아들이는 것이 중요합니다.

모델을 키우면 곧바로 상용 LLM이 될까

여기서 자연스러운 질문이 생깁니다.

"그럼 우리가 만든 Mini GPT를 계속 키우면 ChatGPT 같은 모델이 되는 걸까?"

원리적으로는 같은 계열의 방향에 있습니다. 하지만 현실적으로는 엄청난 간격이 있습니다. 우리가 만든 Mini GPT와 상용 LLM의 차이는 단순히 파라미터 숫자 몇 개의 차이가 아닙니다. 데이터, 학습 규모, 최적화 기법, 후처리, 안전성 학습, 평가, 제품 인프라가 모두 다릅니다.

상용 LLM은 매우 큰 텍스트 데이터에서 사전학습됩니다. 사전학습은 다음 토큰 예측을 통해 언어의 넓은 패턴을 배우는 과정입니다. 하지만 여기서 끝나지 않습니다. 이후 사람의 지시를 더 잘 따르도록 지도 미세조정을 하고, 더 선호되는 답변을 만들도록 선호 데이터 기반 학습을 진행하기도 합니다. 또한 위험한 요청을 거절하거나 개인정보를 다루지 않도록 안전성 학습과 정책 조정이 들어갑니다.

우리가 만든 Mini GPT는 이 중 아주 앞부분만 경험한 것입니다.

텍스트 데이터 → 다음 토큰 예측 학습 → 텍스트 생성

상용 LLM은 여기에 훨씬 많은 단계가 붙습니다.

대규모 데이터 수집과 정제
→ 대규모 사전학습
→ 지도 미세조정
→ 선호 데이터 기반 정렬
→ 안전성 학습
→ 평가와 벤치마크
→ API 및 서비스 인프라
→ 모니터링과 지속 개선

따라서 Mini GPT를 실습했다고 해서 상용 모델을 직접 만들 수 있다고 말하면 안 됩니다. 이 실습의 목적은 제품용 모델 제작이 아닙니다. 목적은 원리 이해입니다. 우리가 직접 만들어 본 작은 모델은 거대한 LLM의 축소 모형입니다. 비행기 모형을 조립한다고 해서 여객기를 제작할 수 있는 것은 아니지만, 날개와 동체와 엔진이 어떤 관계를 갖는지는 훨씬 잘 이해하게 됩니다.

상용 LLM의 강력함 뒤에 있는 비용

상용 LLM을 사용할 때 우리는 보통 채팅창만 봅니다. 질문을 입력하면 몇 초 뒤 답변이 나옵니다. 겉으로는 간단해 보입니다. 하지만 그 뒤에는 많은 비용이 숨어 있습니다.

먼저 학습 비용이 있습니다. 큰 모델을 학습하려면 막대한 양의 데이터와 연산 자원이 필요합니다. GPU 여러 대를 오랫동안 사용해야 하고, 학습이 안정적으로 진행되도록 분산 학습 시스템을 구성해야 합니다. 중간에 오류가 나면 체크포인트에서 복구해야 하고, 데이터 품질 문제도 계속 관리해야 합니다.

다음으로 추론 비용이 있습니다. 추론은 학습된 모델이 실제 요청에 답하는 과정입니다. 사용자가 한 명일 때는 괜찮아 보이지만, 수천 명, 수백만 명이 동시에 요청하면 이야기가 달라집니다. 응답 속도를 유지하려면 많은 서버가 필요하고, 긴 입력과 긴 출력은 비용을 더 크게 만듭니다.

마지막으로 운영 비용이 있습니다. 모델이 이상한 답변을 하지 않는지 평가해야 하고, 사용자 로그를 분석해 품질을 개선해야 하며, 보안 문제와 개인정보 문제에 대응해야 합니다. 프롬프트 인젝션처럼 LLM 애플리케이션 특유의 공격도 고려해야 합니다. 뒤의 7부에서 이런 운영과 제품화 문제를 더 자세히 다룰 것입니다.

Mini GPT를 직접 만들어 보면 상용 LLM이 왜 대단한지 더 잘 느낄 수 있습니다. 단지 모델 구조가 크기 때문만이 아닙니다. 그 구조를 실제로 학습시키고, 안전하게 제공하고, 빠르게 응답하게 만들고, 비용을 감당 가능한 수준으로 유지하는 전체 시스템이 대단한 것입니다.

손실, 샘플, 시간표를 함께 보자

작은 모델을 실험할 때는 숫자 하나만 보지 않는 습관이 중요합니다. 손실만 보면 실제 생성 품질을 놓칠 수 있고, 생성 결과만 보면 모델이 실제로 학습되고 있는지 판단하기 어렵습니다. 학습 시간만 보면 모델 품질을 알 수 없습니다.

간단한 실험 기록표를 만들어 두면 좋습니다.

실험n_embdn_headn_layerblock_sizetrain lossval loss생성 품질 메모학습 시간
A324264반복 많음
B6444128문장 형태 개선
C12884128느리지만 더 안정적

이런 식으로 기록하면 모델을 키웠을 때 무엇이 좋아지고 무엇이 비싸지는지 몸으로 이해할 수 있습니다. 특히 생성 품질 메모가 중요합니다. "반복이 줄었다", "줄바꿈은 자연스럽지만 의미가 약하다", "프롬프트를 바꾸면 무너진다"처럼 사람이 읽은 느낌을 함께 적어야 합니다.

LLM을 다룰 때는 숫자 평가와 사람 평가가 함께 필요합니다. 손실은 객관적인 신호를 주고, 생성 샘플은 사용자가 실제로 경험할 품질을 보여 줍니다. 둘 중 하나만 믿으면 모델을 잘못 이해하기 쉽습니다.

작은 실험으로 한계를 확인하기

이번 장의 내용을 더 분명히 느끼고 싶다면 다음과 같은 실험을 해 볼 수 있습니다. 거창한 실험이 아니어도 좋습니다. 오히려 작은 변화가 더 잘 보입니다.

첫 번째 실험은 데이터 크기를 줄이는 것입니다. 원래 데이터의 일부만 사용해 모델을 학습시켜 보세요. 예를 들어 전체 데이터의 10%만 사용하면 생성 결과가 어떻게 바뀌는지 확인합니다. 손실이 내려가더라도 생성 문장이 더 쉽게 반복되거나, 특정 표현만 집요하게 되풀이될 수 있습니다.

두 번째 실험은 모델 크기를 바꾸는 것입니다. n_embd, n_head, n_layer를 조금씩 늘려 보세요. 생성 품질이 나아지는 지점도 있지만, 학습 시간이 급격히 늘어나는 지점도 있을 것입니다. 이때 중요한 것은 "큰 모델이 좋다"가 아니라 "좋아지는 만큼 비용이 든다"는 사실입니다.

세 번째 실험은 낯선 프롬프트를 넣어 보는 것입니다. 훈련 데이터의 분위기와 비슷한 시작 문장, 전혀 다른 시작 문장을 각각 넣어 보세요. 작은 모델은 익숙한 시작에는 그럴듯하게 반응하지만, 낯선 시작에는 금방 흔들릴 가능성이 큽니다. 이것이 일반화의 한계를 보여 줍니다.

이런 실험은 모델을 비판하기 위한 것이 아닙니다. 오히려 모델을 더 잘 이해하기 위한 과정입니다. 좋은 엔지니어는 모델이 잘하는 것뿐 아니라 못하는 것도 압니다. 어디까지 믿을 수 있고, 어디서부터 조심해야 하는지 아는 것이 실전에서 훨씬 중요합니다.

Mini GPT가 우리에게 가르쳐 준 것

이제 3부의 실습을 마무리할 시점입니다. 우리는 처음부터 꽤 먼 길을 왔습니다. 텍스트를 문자 단위로 나누고, 토큰 ID로 바꾸고, 배치를 만들었습니다. Bigram 모델로 가장 단순한 다음 글자 예측을 해 보았고, 작은 신경망 언어 모델을 만들었습니다. 이어서 Self-Attention을 직접 구현하고, Multi-Head Attention과 Transformer Block을 쌓아 Mini GPT를 학습시켰습니다. 마지막으로 모델이 한 글자씩 문장을 생성하는 과정까지 확인했습니다.

이 과정을 통해 얻은 가장 큰 수확은 "LLM은 마법이 아니다"라는 감각입니다. LLM은 입력 토큰을 벡터로 바꾸고, 문맥 안의 토큰 관계를 계산하고, 다음 토큰의 확률을 예측하는 모델입니다. 이 단순해 보이는 원리가 거대한 데이터, 큰 모델, 많은 학습 자원과 결합되면 놀라운 능력으로 나타납니다.

동시에 우리는 또 하나의 사실을 배웠습니다.

LLM은 공짜로 똑똑해지지 않습니다.

좋은 데이터가 필요합니다. 충분한 모델 용량이 필요합니다. 안정적인 학습이 필요합니다. 평가와 후처리가 필요합니다. 사용자의 지시를 따르도록 조정하는 과정도 필요합니다. 안전하게 답하도록 만드는 과정도 필요합니다.

Mini GPT는 작고 서툽니다. 하지만 바로 그 서툶 덕분에 우리는 상용 LLM의 강력함을 더 현실적으로 볼 수 있습니다. 이제부터 이어지는 4부에서는 질문이 바뀝니다. "모델 구조를 어떻게 만들까?"에서 "LLM은 실제로 어떻게 학습되고 다듬어질까?"로 넘어갑니다.

다음 장에서는 사전학습의 의미를 살펴봅니다. 우리가 지금까지 해 온 다음 토큰 예측 학습이 더 큰 규모에서는 어떤 역할을 하는지, 그리고 왜 사전학습이 현대 LLM의 출발점이 되었는지 알아보겠습니다.

책 목록

처음 만나는 LLM: 원리부터 Mini GPT 구현, RAG 서비스 개발까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기