LLM이 어떻게 작동하는지 파헤쳐보자 — 가중치·벡터·토큰·임베딩의 정체

LLM 이론 집중코스 · 1편
이 코스는 태일러가 LLM을 직접 공부하면서 막힌 지점을 모아 그 막힘을 푸는 흐름 그대로 풀어쓴 글입니다. 어려운 수학 없이 직관으로 끝까지 갑니다.

Ollama 알아보다가 갑자기 궁금해졌어요. 가중치가 뭐고 벡터가 뭔지, 그 안의 숫자들이 도대체 어떻게 작동하는 건지. 정리해서 올려요.

처음엔 가중치/벡터/학습/추론 4가지면 다 이해할 줄 알았는데, 하다 보니 문맥 임베딩, Attention, Transformer까지 같이 가야 하더라고요. 그래서 시리즈로 풀어요. 일단 이 1편에서는 가중치와 벡터 영역을 끝까지 갑니다.

📍 LLM 이론 집중코스 — 1/6편
이 글은 LLM 내부를 직관으로 끝까지 파헤치는 6편 시리즈의 1편입니다. 읽는 시간 약 18분.
이번 편에서 잡고 가는 것:
1. 가중치는 뭔가 (스팸 모델 → 견종 분류기 → LLM 80억 개)
2. 자연어를 어떻게 숫자로 바꾸는가 (토큰화 → 임베딩)
3. 벡터·차원·문맥 임베딩의 정체
4. 마지막 출력층은 결국 어휘집과의 비교
→ 다음: 2편 학습

가장 작은 모델부터 — 스팸 메일 판별기

복잡한 LLM 얘기 전에 단순한 모델로 시작할게요. 이메일이 스팸인지 아닌지 판단하는 모델이 있다고 해봐요.

이 모델이 보는 건 딱 세 가지예요.

  • “당첨”이라는 단어가 몇 번 나왔나
  • “회의”라는 단어가 몇 번 나왔나
  • 느낌표가 몇 개인가

각 항목의 중요도를 직관적으로 정해보면 이래요.

  • “당첨” → 많이 나오면 스팸일 확률 ↑ (양수, +2.0)
  • “회의” → 많이 나오면 오히려 정상 메일 (음수, -1.5)
  • 느낌표 → 살짝 스팸 느낌 (양수 작음, +0.3)

이 +2.0, -1.5, +0.3이 바로 가중치예요. 영어로는 weight.

뉴런이 하는 일은 한 줄로 끝나요.

출력 = (x₁ × w₁) + (x₂ × w₂) + (x₃ × w₃)

각 입력에 가중치 곱해서 더하기. 정말로 이게 다예요.

예를 들어 어떤 메일에 “당첨” 3번, “회의” 0번, 느낌표 5개 있으면.

출력 = (3 × 2.0) + (0 × -1.5) + (5 × 0.3)
     = 6.0 + 0 + 1.5
     = 7.5  → 스팸 확률 높음!

LLM은 결국 이걸 어마어마한 규모로 하는 거예요. 이 글에서는 일단 이 단순한 식을 머리에 박아두고 갑시다.


가중치의 부호와 크기

여기서 살짝 헷갈리는 지점이 있어요. “+2.0이 -1.5보다 더 중요한 거 아니에요?” 라고 생각하기 쉽거든요.

답부터 말하면, 둘 다 똑같이 중요해요. 부호와 크기는 다른 걸 의미해요.

  • 부호(+/-): 입력이 결과에 어느 방향으로 영향을 미치는가
  • 절대값: 얼마나 강하게 영향을 미치는가

그래서 +5.0이나 -5.0은 똑같이 중요해요. 그냥 방향만 반대인 거예요. 진짜로 안 중요한 입력은 가중치가 0에 가까운 입력이에요. 0에 가까우면 곱해봤자 결과에 영향이 거의 없으니까요.

정리하면:
– 가중치 +5.0 = “결과를 위로 강하게 밀어올림”
– 가중치 -5.0 = “결과를 아래로 강하게 끌어내림”
– 가중치 0.0 = “이 입력은 무시해도 됨”
– 가중치 0.1 = “거의 영향 없음”


그럼 입력은? 단어를 어떻게 숫자로 만드나

스팸 모델은 입력이 단순했어요. “당첨 횟수, 회의 횟수, 느낌표 개수”처럼 숫자로 셀 수 있는 것들이었으니까요.

근데 LLM은 사용자가 “오늘 날씨 어때?” 같은 자연어를 그대로 넣어요. 이걸 어떻게 숫자로 바꿔야 모델이 처리할 수 있을까요?

여기서 두 단계가 필요해요.

  • 1단계: 토큰화 (Tokenization) — 문장을 작은 조각으로 쪼개기
  • 2단계: 임베딩 (Embedding) — 각 조각을 숫자 벡터로 변환

이 두 단계는 자주 헷갈려요. 같이 풀어볼게요.


토큰이란 뭐예요?

토큰은 모델이 처리할 수 있는 가장 작은 단위로 쪼갠 조각이에요. 한국어 LLM이 “나는 사과를 먹었다”를 받으면 대충 이렇게 쪼개요.

"나" "는" "사과" "를" "먹" "었" "다"

(실제 쪼개는 방식은 모델마다 달라요. 어떤 모델은 “사과를”을 통째로 한 토큰으로, 어떤 모델은 더 잘게 쪼개요)

여기서 토큰은 아직 숫자가 아니에요. 그냥 텍스트 조각이에요. 모델이 실제로 처리하려면 이 토큰을 숫자로 바꿔야 해요.

방식은 두 단계예요.

먼저 토큰 ID로 변환. 모델은 어휘집(vocabulary)이라는 걸 갖고 있어요. 마치 사전처럼 모든 토큰에 번호가 매겨져 있어요.

"나"   → ID: 1024
"는"   → ID: 47
"사과" → ID: 8932
"를"   → ID: 89

그 다음 ID로 임베딩 벡터를 가져와요. 어휘집의 각 ID마다 임베딩 벡터가 미리 저장돼 있거든요.

ID 1024 → [0.12, -0.45, 0.78, ...] ← 이게 "나"의 임베딩
ID 8932 → [0.34, -0.51, 0.82, ...] ← 이게 "사과"의 임베딩

핵심 정리:
– 토큰 = 텍스트 조각 (“사과”)
– 토큰 ID = 그 조각의 번호 (8932)
– 임베딩 벡터 = 그 토큰의 의미를 담은 숫자 묶음 ([0.34, -0.51, …])

토큰은 글자고, 벡터는 그 토큰의 의미를 담은 표현이에요. 같은 게 아니에요.


벡터, 별거 아니에요

벡터라는 단어가 막연하고 어렵게 들리는데 실체는 진짜 별거 아니에요.

벡터 = 숫자들이 정해진 순서로 늘어선 묶음

이게 다예요.

  • 2차원 벡터: [3, 5] → 숫자 2개
  • 3차원 벡터: [3, 5, -2] → 숫자 3개
  • 100차원 벡터: 숫자 100개

“차원”이라는 말이 SF 영화의 평행우주 같은 신비로운 느낌이지만, 수학적으로는 그냥 벡터 안에 들어 있는 숫자 개수예요. 끝.

근데 왜 굳이 묶나. 단어 하나의 의미를 표현하려면 숫자 하나로는 부족하거든요. 한번 사고 실험을 해볼게요. 만약 “사과”의 의미를 숫자 하나로 표현해야 한다면 어떻게 할 수 있을까요? 0.5? 0.8? 어떤 숫자를 골라도 사과의 색깔, 모양, 맛이 다 사라져요. 숫자 하나로는 의미가 너무 빈약한 거예요.

그래서 여러 측면을 묶어서 표현해요.

사과 = [빨강:0.8, 둥근:0.9, 단맛:0.7, 과일:1.0]

이렇게 4가지 측면으로 표현하면 4차원 벡터가 되는 거예요. 이게 그 단어의 “의미 좌표”예요.

신기한 건 의미가 비슷한 단어들은 벡터 공간에서 가까이 위치한다는 거예요.

강아지 → [0.8, 0.2, 0.5]
개     → [0.79, 0.21, 0.51]   ← 강아지와 거의 같은 자리
자동차 → [0.1, 0.9, 0.3]      ← 멀리 떨어짐

그럼 차원은 도대체 몇 개로 정해요?

여기서 자연스럽게 따라오는 의문. 사과를 4차원으로 표현한다고 했는데, 왜 4개예요? 5개면 안 돼요? 모든 단어가 똑같이 4차원이어야 해요?

답을 하나씩 할게요.

Q1. 차원 수는 누가 정하나요?

모델 설계자가 정해요. 정해진 정답은 없어요. 모델 설계할 때 정하는 하이퍼파라미터 중 하나예요.

실제 모델들이 쓰는 차원 수를 보면 이래요.

  • BERT base: 768차원
  • BERT large: 1024차원
  • GPT-3: 12288차원
  • llama3: 4096차원

모델마다 달라요. 768차원은 그냥 BERT가 이 값일 뿐이에요. 신성한 숫자가 아니에요.

Q2. 차원이 많을수록 좋은 건가요?

대체로 그래요. 차원이 많을수록 단어 의미를 더 풍부하게 표현할 수 있거든요. 4차원으로는 사과를 4가지 측면으로만 보지만, 4096차원이면 4096가지 측면으로 볼 수 있어요.

근데 트레이드오프가 있어요. 차원이 커질수록:

  • 표현력은 풍부해지지만
  • 계산량이 폭발적으로 늘고
  • 메모리도 더 먹고
  • 학습도 더 어려워져요

그래서 작은 모델은 768차원 정도, 큰 모델은 12288차원 같은 식으로 모델 크기에 맞춰서 정해요.

Q3. 모든 단어가 같은 차원이어야 해요?

네. 한 모델 안에서는 모든 토큰의 임베딩이 똑같은 차원이에요. BERT를 쓴다면 사과도 768차원, 자동차도 768차원, 사람도 768차원이에요. 그래야 행렬 곱셈 같은 계산이 일관되게 돌아가거든요.


충격적인 사실 — 각 차원이 뭐 의미하는지 사람도 몰라요

지금까지 제가 사과를 [빨강, 둥근, 단맛, 과일]로 표현했었어요. 사실 이건 이해를 돕기 위한 설명용 거짓말이에요. 죄송해요.

진짜 LLM의 임베딩 벡터는 이렇게 돼요.

사과 = [0.34, -0.51, 0.82, 0.11, -0.27, 0.65, ...] (4096개)

각 숫자가 무슨 의미인지 사람이 모릅니다. “1번째 차원이 빨강 정도, 2번째가 둥근 정도” 이런 식으로 깔끔하게 잘 떨어지지 않아요. 학습이 끝나면 모델이 알아서 정한 추상적인 측면들이고, 인간이 해석할 수 있는 표현이 아니에요.

근데 신기하게도 모델은 그 숫자 패턴으로 의미를 정확히 구분해요. “강아지”와 “개”의 4096차원 벡터는 거의 같고, “자동차”의 벡터는 멀리 떨어져 있어요. 사람은 각 차원이 뭐 뜻하는지 모르지만, 전체 패턴이 의미를 담고 있는 거예요.

이게 딥러닝의 가장 흥미로운 지점 중 하나예요. 사람이 설계한 게 아니라, 학습 과정에서 모델이 스스로 만들어낸 “의미 표현 방식” 이에요. (왜 그런지는 2편 학습 편에서 자세히 풀었어요)


흔한 의문들 — 이쯤 되면 헷갈리기 시작해요

여기까지 읽으면 자연스럽게 떠오르는 의문이 있어요. 저도 공부하면서 똑같이 막혔던 지점이에요.

Q. “행복” 같은 추상명사도 빨강, 단맛 차원이 있어요?

있어요. 그리고 0에 가까워요.

[빨강, 둥근, 단맛, 과일] 차원이 있다고 가정하면:

사과     = [빨강:0.8, 둥근:0.9, 단맛:0.7, 과일:1.0, 추상성:0.0, ...]
행복     = [빨강:0.0, 둥근:0.0, 단맛:0.0, 과일:0.0, 추상성:0.95, ...]
민주주의 = [빨강:0.0, 둥근:0.0, 단맛:0.0, 과일:0.0, 추상성:0.97, ...]

행복은 빨강, 둥근, 단맛 차원에서 거의 0이에요. 그 측면이 행복을 설명하는 데 의미가 없거든요. 대신 행복의 의미 있는 다른 차원들 — 추상성, 감정, 이상 같은 — 에서 큰 값을 가져요.

(다시 말하지만 진짜 임베딩에서는 “1번 차원이 빨강”처럼 잘 나뉘지 않아요. 이해를 돕기 위한 설명이에요)

Q. “근면 사과”라고 쓰면 사과 벡터의 근면값이 올라가요?

이게 진짜 좋은 질문이에요. 답이 흥미로워요.

임베딩 벡터 자체는 안 변해요. “사과”라는 토큰의 임베딩은 학습이 끝난 뒤로 고정이에요. 사용자가 “근면 사과”라고 쓰든 “용서 사과”라고 쓰든 “사과” 토큰 자체의 임베딩 값은 동일해요.

근데 LLM 안에서는 단어들이 서로 영향을 주고받아요. “근면 사과”가 입력으로 들어오면, “사과”의 의미가 모델 내부 처리 과정에서 옆에 있는 “근면”의 영향을 받아 그 맥락에서의 사과로 표현돼요.

이걸 문맥 임베딩(contextual embedding) 이라고 해요.

  • 고정 임베딩: “사과”라는 토큰 자체의 의미 좌표. 변하지 않음.
  • 문맥 임베딩: 문장 안에서 처리될 때 주변 단어의 영향을 받은 결과. 매번 다름.

“근면 사과”의 사과는 근면 측면이 강조된 사과로, “용서 사과”의 사과는 부정적 측면이 강조된 사과로 처리돼요. 같은 단어가 맥락에 따라 다르게 표현되는 거예요.

이게 가능한 메커니즘이 Attention 이에요. 단어들이 서로 “주의를 기울이는” 구조인데, 별도 편(4편)에서 깊이 다룰 거예요. 일단 1편에서는 “단어 자체의 임베딩은 고정되지만, 문장 안에서 처리될 때 맥락이 반영된다” 정도만 잡으면 돼요.

Q. 조사도 벡터가 있어요? “은, 는, 이, 가” 같은 거.

있어요. “은”, “는”, “이”, “가” 같은 조사도 다 자기만의 임베딩 벡터를 가져요.

근데 의미가 좀 달라요. “사과”의 임베딩은 사과의 속성을 담지만, “은”의 임베딩은 문법적 역할을 담아요. “이 토큰 다음에는 동사가 온다”는 식의 정보가 그 벡터 안에 압축돼 있는 거예요.

신기한 건, 조사들끼리는 의미 공간에서 서로 가까이 위치해요. “을/를”은 비슷한 문법 역할이니까 비슷한 위치에, “이/가”도 비슷한 위치에, “은/는”도 비슷한 위치에. 모델이 학습 과정에서 자연스럽게 그렇게 배치한 거예요.

Q. 그럼 토큰화할 때 모델은 조사와 단어를 어떻게 구별해요?

구별 안 해요.

모델 입장에서는 둘 다 그냥 토큰일 뿐이에요. “사과”든 “은”이든 똑같이 하나의 토큰이고, 똑같은 방식으로 임베딩 벡터로 변환돼요. 모델은 “은”이 조사인지 명사인지 신경 안 써요. 그냥 토큰 ID로 임베딩을 꺼내올 뿐이에요.

그런데 학습 과정에서 자연스럽게 “은”의 임베딩에 조사스러운 역할이 담기게 돼요. 데이터에서 “은” 다음에는 늘 동사가 오는 패턴이 반복되니까, 모델이 그걸 학습하면서 “은” 임베딩에 그런 정보를 압축해 넣는 거예요.

이게 충격적이지 않아요? 모델은 문법성을 본 적이 없어요. 조사와 명사의 차이를 누가 가르쳐준 적도 없어요. 그냥 텍스트를 수백억 번 보면서 패턴을 학습한 결과로 자연스럽게 “조사스러운 임베딩”과 “명사스러운 임베딩”이 분리돼서 나타나는 거예요. 인간이 문법을 가르쳐준 게 아니라, 데이터에서 모델이 스스로 발견한 거죠.


헷갈리기 쉬운 지점 — 벡터 안의 숫자가 가중치인가요?

저도 여기서 막혔어요. 사과 벡터에 0.34, -0.51 같은 숫자가 있는데, 이 숫자들이 가중치인가? 라고요.

답은 아니에요.

가중치는 벡터 안에 있는 게 아니라 모델 내부에 별도로 존재해요. 스팸 모델로 다시 보면 명확해져요.

입력 벡터: [당첨 횟수: 3, 회의 횟수: 0, 느낌표 개수: 5]
가중치:    [+2.0,        -1.5,         +0.3]

출력 = (3 × 2.0) + (0 × -1.5) + (5 × 0.3)

입력 벡터와 가중치가 별개로 존재하는 거 보이시죠. 둘 다 숫자 묶음이지만 역할이 완전히 달라요.

  • 입력 벡터의 숫자: 지금 모델에 들어가는 데이터예요. 매번 달라져요.
  • 가중치의 숫자: 모델이 학습으로 얻은 지식이에요. 한번 학습하면 고정돼요.

요리 비유가 잘 맞아요. 요리 비율(가중치) 이랑 재료 양(입력) 이 별개잖아요. 둘 다 숫자로 표현되지만 역할이 완전히 달라요. 요리 비율은 셰프가 정한 거고 변하지 않아요. 재료 양은 주문마다 달라지고요.

LLM에서도 똑같아요. 사과 임베딩 [0.34, -0.51, …]은 입력이고, 모델 내부의 가중치는 별도로 존재해요. 가중치는 80억 개고, 사과 임베딩은 그 중 마지막 출력층에서 다시 등장해요 (밑에서 다룰게요).

💡 여기까지 정리
가중치는 모델이 학습으로 얻은 고정된 숫자. 입력 벡터는 매번 달라지는 데이터. 둘 다 숫자 묶음이지만 별개. 가중치는 입력에 곱해지는 숫자다.

출력이 여러 개라면? — 강아지 분류기

이제 살짝 키워봐요. 출력이 1개가 아닌 모델로 가요. 강아지 사진을 보고 어떤 견종인지 맞추는 모델이라고 해봅시다.

입력 3개:
– x₁ = 빨간 픽셀의 평균
– x₂ = 털 길이 측정값
– x₃ = 귀의 크기

출력 5개: 각 견종일 확률
– y₁ = 푸들일 확률
– y₂ = 진돗개일 확률
– y₃ = 시바견일 확률
– y₄ = 골든 리트리버일 확률
– y₅ = 비글일 확률

이때 가중치는 몇 개일까요?

y₁ (푸들 확률) 을 만들려면:

y₁ = (x₁ × w₁₁) + (x₂ × w₁₂) + (x₃ × w₁₃)

푸들 점수를 만드는 데 가중치 3개 필요해요. 빨간 픽셀이 푸들 판단에 얼마나 영향 미치는지, 털 길이가 영향 미치는지, 귀 크기가 영향 미치는지.

y₂ (진돗개 확률) 을 만들려면:

y₂ = (x₁ × w₂₁) + (x₂ × w₂₂) + (x₃ × w₂₃)

진돗개도 가중치 3개 필요. 그런데 이 가중치는 푸들 가중치랑 달라요. 진돗개 판단에는 털 길이가 더 중요할 수도 있고, 귀 크기 영향이 다를 수도 있으니까요.

y₃, y₄, y₅도 마찬가지로 각각 가중치 3개씩.

이 가중치는 3 × 5 = 15개예요. 표로 보면 명확해요.

              x₁(빨강)  x₂(털길이)  x₃(귀크기)
y₁ (푸들):     w₁₁       w₁₂        w₁₃
y₂ (진돗개):   w₂₁       w₂₂        w₂₃
y₃ (시바견):   w₃₁       w₃₂        w₃₃
y₄ (골든):     w₄₁       w₄₂        w₄₃
y₅ (비글):     w₅₁       w₅₂        w₅₃

15칸 = 가중치 15개.

핵심: 모든 입력이 모든 출력에 영향을 줘요. 그래서 가중치는 입력 개수 × 출력 개수만큼 필요해요.

x₁(빨간 픽셀)이 푸들 판단에도, 진돗개 판단에도, 시바견 판단에도 다 영향을 줘요. 단지 가중치가 다를 뿐이에요. 푸들 판단에서 빨강이 미치는 영향과 시바견 판단에서 빨강이 미치는 영향은 다르니까요.


이제 LLM 한 층으로

LLM의 한 층(layer) 안에서 일어나는 일을 보면 이래요.

  • 입력: 4096차원 벡터 (숫자 4096개)
  • 출력: 4096차원 벡터 (숫자 4096개)

모든 입력이 모든 출력에 영향을 주니까, 가중치는 4096 × 4096 = 약 1677만 개.

여기서 “입력 4096개”와 “출력 4096개”가 무엇을 의미하는지가 막막할 수 있는데, 위의 임베딩 영역에서 다 풀었어요. 4096차원 = 토큰 임베딩 차원이고, 각 차원이 의미하는 게 정확히 뭔지는 사람이 몰라요. 그냥 “어떤 추상적인 4096가지 측면이 있고, 이걸 다른 4096가지 측면으로 변환하는 게 한 층의 역할” 정도로 이해하시면 돼요.

강아지 분류기는 입력과 출력의 의미가 사람이 봐도 명확하지만(빨간 픽셀, 푸들 확률), LLM은 그 의미가 추상적이고 사람이 해석하기 어려워요.


층(layer)이 여러 개 있다는 게 뭐예요?

LLM은 한 층으로 끝나지 않아요. 수십 개 층이 있어요.

📊 LLM 32층의 흐름
입력 (토큰 임베딩, 4096차원)
가중치 묶음 1 (1677만 개)
1층 출력 (4096차원) → 2층의 입력
가중치 묶음 2 (1677만 개)
2층 출력 (4096차원) → 3층의 입력
↓ …
가중치 묶음 32
32층 출력 (4096차원)
↓ 마지막 출력층 변환
다음 토큰 확률 분포 (12만 8천 차원)

llama3-8b는 32개 층이 있어요. 매 층마다 4096 → 4096 변환이 일어나니까 가중치가 1677만 개씩 필요하고, 32층이면 약 5억 개. 마지막 출력층 가중치까지 더하면 약 5억 2천만 개. 부속 구조 가중치까지 다 합치면 80억 개에 도달해요.

잠깐, 여기서 의문 — “가중치는 학습으로 정해진 뒤 고정된다”고 했는데, “층마다 새로운 가중치 묶음”이라는 게 모순 아니에요?

저도 처음에 여기서 막혔어요. 답은 모순 아니에요.

  • “가중치가 정해져 있다” = 학습이 끝나면 모든 가중치가 고정된다는 의미
  • “층마다 새로운 가중치 묶음” = 모델 안에 가중치가 한 묶음이 아니라 여러 묶음이 있다는 의미. 모든 묶음이 다 정해져 있어요.

요리책 비유로 풀어볼게요. 요리책을 한 권 다운받았다고 해봐요. 요리책 안에는:
– 1장: 기본 소스 레시피
– 2장: 메인 요리 레시피
– 3장: 디저트 레시피
– … 32장: 마무리 레시피

이 32장의 모든 레시피가 이미 인쇄돼서 고정돼 있어요. 책 자체는 변하지 않아요. 근데 요리할 때 32장을 순서대로 거쳐가요. 1장 결과로 소스 만들고, 그 소스로 2장 메인 요리 만들고…

LLM도 똑같아요. 32개 층 각각의 가중치 묶음이 들어 있고, 이 32개 묶음 모두가 학습으로 정해진 뒤 고정돼 있어요. 입력이 들어오면 1층 가중치로 변환 → 2층 가중치로 변환 → … → 32층 가중치로 변환. 이 변환 자체는 매번 일어나지만, 사용되는 가중치는 절대 안 변해요.


마지막 출력층 — 어휘집과의 만남

32개 층을 거치면 4096차원 벡터가 나와요. 그 다음에 마지막 변환이 한 번 더 있어요.

이 마지막 변환은 4096차원을 어휘집 크기만큼 으로 늘려요. llama3는 어휘집이 12만 8천 개니까 4096 → 128,000으로 변환해요.

근데 이 마지막 변환의 진짜 정체가 흥미로워요.

마지막 출력층의 가중치 = 어휘집의 모든 토큰 임베딩 모음

진짜로 그래요. 마지막 변환에서 일어나는 일을 풀어보면:

32층 출력 벡터: [0.5, 0.3, 0.8, ...] (4096차원)
                       ↓
어휘집의 모든 토큰 임베딩과 각각 곱해서 더하기
                       ↓
"사과"   임베딩 [0.4, 0.3, 0.7, ...] 과 곱해서 더함 → 점수
"바나나" 임베딩 [0.45, 0.32, ...] 과 곱해서 더함 → 점수
"자동차" 임베딩 [0.05, 0.92, ...] 과 곱해서 더함 → 점수
...
                       ↓
12만 8천 개 점수 → 확률로 변환

이 “곱해서 더하기”가 우리가 익숙한 (입력 × 가중치)의 합 그 공식이에요. 스팸 모델에서 봤던 그 한 줄.

점수 = (출력₁ × 임베딩₁) + (출력₂ × 임베딩₂) + ...

스팸 모델에서 봤던 거랑 똑같은 일이 일어나고, 가중치 자리에 어휘집 토큰들의 임베딩이 들어가는 거예요.

직관적으로 풀면, 32층 출력 벡터의 방향이 어떤 토큰의 임베딩 벡터 방향과 비슷할수록 그 토큰의 확률이 높아져요. “32층 출력 벡터가 가리키는 방향에 가까이 있는 토큰”이 가장 확률 높게 선택되는 거예요.

그래서 LLM의 마지막 단계는 “내가 만든 4096차원 벡터에 가장 가까운 토큰이 뭘까?” 를 어휘집 전체 12만 8천 개 토큰과 비교하는 과정이에요.

처음 들으면 “어? 임베딩이 가중치로 다시 쓰인다고?” 싶지만, 잘 보면 자연스러워요. 모델이 답을 내놓는다 = 모델이 어떤 토큰의 임베딩 방향과 가까운 벡터를 만드는 것이라는 거.

가장 확률 높은 토큰을 골라서 출력. 그 다음 또 처음부터 반복. 이게 다음 단어 예측이에요.

"좋다"   → 23%
"많다"   → 18%
"흐리다" → 12%
"어떻다" → 9%
...
"바나나" → 0.0001%

LLM에는 가중치가 몇 개 있어요?

이제 진짜 LLM 규모로 정리해볼게요.

📐 모델별 가중치 개수
스팸 모델  ·  가중치 3개 (입력 3 × 출력 1)
강아지 분류기  ·  가중치 15개 (입력 3 × 출력 5)
LLM 한 층  ·  가중치 1677만 개 (입력 4096 × 출력 4096)
LLM 32층 합치면  ·  약 5억 개
+ 마지막 출력층  ·  약 5억 2천만 개
+ 부속 구조까지  ·  80억 개

이게 llama3-8b의 8b(8 billion)예요.

  • llama3-8b: 가중치 80억 개
  • llama3-70b: 가중치 700억 개
  • GPT-4: 추정 1조 개 이상
  • DeepSeek-V4-Pro: 1.6조 개

스팸 모델이 어마어마하게 부풀어진 게 LLM이에요. 구조의 본질은 같고, 규모만 어마어마하게 커진 거예요.

FROM 바이브코딩 태일러 · 매주 월요일
바빠도 5분이면 읽는
이번 주 AI 흐름
태일러가 고른 AI 뉴스 TOP 3 · 벤치마크 순위 · 급상승 키워드 · 판단 기준 보너스. 광고 없는 클린 미디어입니다.

무료로 받아보기 →

선착순 100명 영구 무료 · 언제든 해지
이 시리즈의 다음 편이 나올 때마다 가장 먼저 받고 싶다면, 무료 회원가입을 추천드려요. 매주 월요일에 그 주의 AI 핵심 뉴스 TOP 3 + 모델 순위 + 신규 기사 소식이 한 통에 도착해요. 광고 없는 클린 미디어예요.


무료 회원가입 (30초) →


이번 편 핵심 정리

LLM = 가중치 80억 개 + 어휘집 12만 8천 개의 임베딩. 이걸로 1편이 닫혀요.

좀 더 풀어쓰면:

  1. 가중치는 입력에 곱해지는 숫자. 부호는 방향, 절대값은 강도. 이 규칙 하나가 80억 번 반복되면 LLM.
  2. 자연어 → 숫자 변환은 토큰화 → 임베딩 두 단계. 토큰은 텍스트 조각, 임베딩은 그 조각의 의미를 담은 4096차원 벡터.
  3. 각 차원이 뭐 의미하는지 사람이 모른다. 학습 과정에서 모델이 스스로 만든 추상 표현. 전체 패턴이 의미를 담음.
  4. 고정 임베딩 vs 문맥 임베딩. 토큰 자체의 임베딩은 고정이지만, 문장 안에서 처리될 때 주변 단어의 영향을 받아 맥락이 반영됨 (Attention).
  5. 마지막 출력층의 정체 = 어휘집의 모든 토큰 임베딩과 거리 비교. 32층 출력 벡터에 가장 가까운 토큰이 다음 단어로 선택됨.

LLM은 결국 가중치 80억 개의 거대한 행렬 변환 + 어휘집과의 거리 비교예요. 본질은 단순한 곱셈·덧셈의 어마어마한 반복이에요.


다음 편 예고

2편: 학습 (Training)

가중치 80억 개를 누가 정했는지의 답. 등산가 비유로 시작해서 결국 “AI 학습 = 도시 하나의 전기를 먹는 자본주의”까지 도달해요. 1편으로 LLM의 정적인 본체를 봤다면, 2편은 그 본체가 어떻게 만들어졌는지를 다뤄요.

2편 바로 가기 →

그 이후로는 추론(3편) → Attention(4편) → Transformer(5편) → 양자화·RAG·Fine-tuning(6편) 순서로 이어져요.


자주 묻는 질문

Q. 가중치와 파라미터는 같은 말이에요?

거의 동의어예요. 일상적으론 똑같이 써도 됩니다. 엄밀하게는 파라미터 = 가중치 + 편향(bias). 가중치는 입력에 곱해지는 숫자, 편향은 곱한 결과에 더해지는 숫자예요. 가중치가 99% 이상이고 편향은 소수라서 일상 대화에선 같다고 봐도 무방해요.

Q. 모델 이름의 “b”는 뭐예요?

billion(10억)의 b예요. LLaMA-8b = 80억 파라미터, LLaMA-70b = 700억 파라미터, DeepSeek-V4-Pro 1.6T = 1.6조 파라미터예요.

Q. 토큰과 단어는 같아요?

아니요. 토큰은 단어보다 작을 수도 있고 클 수도 있어요. “사과를”이 한 토큰일 수도 있고, “사과”+”를” 두 토큰일 수도 있어요. 영어는 더 자주 단어 일부만 토큰이 돼요 (예: “tokenization” → “token”+”ization”).

Q. 임베딩과 벡터는 같은 말인가요?

거의 같아요. 정확히는 임베딩이 벡터의 한 종류예요. 벡터 = 숫자 묶음 그 자체. 임베딩 = 어떤 의미를 담은 벡터. 모든 임베딩은 벡터지만 모든 벡터가 임베딩은 아니에요.

Q. 차원이 4096이면 사과를 4096가지 측면으로 본다는 뜻인가요?

대략 그렇지만 비유적인 표현이에요. 진짜 LLM 임베딩에서는 1번 차원이 명확히 어떤 측면을 의미하지 않아요. 4096가지 추상적인 축이 있고, 그 축들이 합쳐져서 의미를 담는다고 보는 게 정확해요.

Q. 어휘집 크기는 어떻게 정해요?

모델 설계자가 정해요. 너무 작으면 흔하지 않은 단어를 잘게 쪼개야 해서 비효율적이고, 너무 크면 마지막 출력층 가중치가 너무 많아져요. llama3는 12만 8천 개, GPT-4 추정 10만 개대, BERT는 약 3만 개 정도 써요.


소스 / Sources

  • Andrej Karpathy, “Let’s build GPT: from scratch, in code, spelled out” — YouTube
  • Andrej Karpathy, “Let’s build the GPT Tokenizer” — YouTube
  • 3Blue1Brown, “But what is a neural network?” — YouTube
  • Meta AI, “Introducing Llama 3” 공식 발표 — 블로그

저자: VibeCoding Tailor (테이라)
shuntailor.net 운영. 고려대 신소재공학 전공. AI 도구·바이브코딩을 실무 시선으로 해설합니다. Lovable 공식 앰버서더. 누적 수강생 300명+ AI 강의 경력. 일본어·한국어 바이링구얼.

바이브코딩 태일러
바이브코딩 태일러
AI의 작동 원리와 비즈니스 적용을 일본어·한국어로 기록합니다. 매주 월요일 뉴스레터 발행 중.
뉴스레터 구독하기 →
JAKO