안녕하세요, Devlos 입니다.
오랜만에 CloudNet@에서 진행하는 Hands-On LLM Serving and Optimization Study에 참여하게 되었습니다.
항상 공부할때마다 아리송한 Transformer 모델을 이해하고자 필요한 내용을 정리해 보았어요.
스터디에서 추천해 주신 침착맨과 정승재 강사님의 영상 개념이 곱의 법칙과 합의 법칙을 상기하는데 도움이 많이 되었어요 ㅎㅎ
수학적 개념들을 최대한 풀어서, 이런 개념들이 왜 Transformer 모델에 필요한지에 대한 설명을 정리해 보았습니다
Transformer Model을 이해하기 위한 기초 수학
이 페이지에는 어려운 기호가 거의 안 나옵니다. 나오더라도 바로 옆에 한국어로 무슨 뜻인지 적어뒀습니다.
순서가 조금 특이합니다. 교과서는 보통 내적부터 가르치는데, 여기서는 회전 → 사원수 → 내적 순으로 갑니다. 실제로 그 순서로 발견됐기 때문입니다. 1843년 해밀턴이 사원수를 만들었고, 거기서 내적과 외적이 떨어져 나와 오늘날의 벡터 계산이 됐어요. 이 순서로 보면 "왜 하필 이런 계산이 있는가"가 훨씬 자연스럽게 이해됩니다.
모든 장은 똑같은 순서입니다 — ① 이걸 왜 배우나 → ② 낯선 단어 뜻풀이 → ③ 그림으로 확인 → ④ 세 줄 요약. 중간에 회색으로 접혀 있는 상자(▸ 수식으로도 보고 싶다면)는 안 열어도 전혀 상관없습니다. 궁금할 때만 눌러보세요.
시작 전에 — 이 페이지에 나오는 기호는 딱 4개입니다
기억 안 나셔도 됩니다. 필요할 때마다 그 자리에서 다시 설명합니다.
01벡터
한 줄 요약: 숫자 몇 개를 순서대로 묶어놓은 것. 그걸 화살표로 그린 것.
컴퓨터가 다룰 수 있는 건 숫자뿐이에요. 그래서 AI는 모든 단어를 숫자 묶음으로 바꿔서 저장합니다.
"고양이"는 예를 들면 [0.12, -0.98, 0.44, ...] 같은 식이죠.
이 숫자 묶음이 바로 벡터입니다. AI 안에 있는 모든 값이 이 형태예요. 그래서 이걸 모르면 그다음 이야기가 하나도 안 됩니다. 대신 이것만 알면 절반은 끝납니다.
보물지도로 생각해 보세요
"여기서 동쪽으로 3걸음, 북쪽으로 2걸음" — 이런 지시를 받았다고 해봅시다.
이 지시를 숫자로만 적으면 [3, 2]가 됩니다. 그리고 그 결과를 종이에 그리면 비스듬한 화살표 하나가 나옵니다.
이 셋은 완전히 같은 것입니다. 지시문이든, 숫자 묶음이든, 화살표든 — 표현만 다를 뿐이에요. 수학에서는 이걸 벡터라고 부릅니다.
- 벡터 (vector)
- 숫자를 순서대로 묶어놓은 것.
[3, 2]처럼요. 순서가 중요해서[2, 3]은 다른 벡터입니다. - 성분 (component)
- 묶음 안의 숫자 하나하나.
[3, 2]에서 3과 2가 각각 성분입니다. - 차원 (dimension)
- 숫자가 몇 개 들어있는지.
[3, 2]는 2차원. AI가 쓰는 건 보통 768차원, 즉 숫자 768개짜리입니다. - 길이 / 노름 (‖v‖)
- 화살표가 얼마나 긴지. 기호로는 양쪽에 두 줄을 그어
‖v‖라고 씁니다.
숫자가 2개면 종이에 그릴 수 있고, 768개면 못 그립니다. 그림으로 못 그린다는 것뿐, 다른 건 아무것도 안 바뀝니다. 아래에서 배우는 규칙은 2개짜리든 768개짜리든 글자 하나 다르지 않아요. 그래서 2개짜리 그림으로 감만 잡으면 나머지는 그대로 따라옵니다.
화살표 끝을 마우스로 끌어보세요
↔ 드래그화살표를 어디로 옮기든 숫자 두 개면 충분합니다. 거꾸로 숫자 두 개만 주면 화살표를 그릴 수 있고요.
화살표의 "길이"를 구하는 법
동쪽으로 3걸음, 북쪽으로 4걸음 갔다면 실제로는 출발점에서 얼마나 멀어졌을까요? 3+4=7걸음이 아닙니다. 비스듬히 갔으니까요.
중학교 때 배운 직각삼각형을 떠올리시면 됩니다. 밑변 3, 높이 4인 직각삼각형의 빗변이 바로 이 거리예요.
= √(9 + 16)
= √25
= 5 ← 실제로는 5걸음만큼 멀어진 것
끝입니다. 각 숫자를 제곱해서 다 더하고, 루트를 씌운다. 숫자가 768개여도 방법은 똑같습니다.
수식으로도 보고 싶다면
왼쪽 ‖v‖는 "v의 길이"라고 읽습니다. 오른쪽은 방금 한 계산 그대로고요.
숫자가 여러 개면 항이 늘어날 뿐입니다: √(x² + y² + z² + ...)
벡터로 할 수 있는 일 — 딱 세 가지
- 더하기화살표 두 개를 이어서 걸어간 결과. 지도로 치면 "동쪽 3걸음 간 다음, 거기서 또 북쪽 2걸음". 계산은
[3,1] + [1,2] = [4,3]처럼 같은 자리끼리 더하면 끝입니다. - 늘이기·줄이기 (숫자 곱하기)방향은 그대로 두고 길이만 바꾸는 것.
2 × [3,1] = [6,2]. 곱한 숫자가 음수면 정반대 방향으로 뒤집힙니다. - 길이를 1로 맞추기 (정규화)화살표를 자기 길이로 나누면 길이가 딱 1이 됩니다. "얼마나 큰지"는 버리고 "어디를 가리키는지"만 남기는 것이에요. 2장에서 아주 중요하게 쓰입니다.
세 가지 연산을 직접 해보세요
↔ 화살표 드래그 + 버튼a+b에서 파란 화살표 끝에 주황 화살표가 이어 붙는 모양을 보세요. ② k·a에서 슬라이더를 음수까지 내려 뒤집히는 걸 보세요. ③ 정규화에서 화살표를 아무리 길게 늘여도 초록 화살표는 원 위에 딱 붙어 있습니다.그래서 AI는 이걸로 뭘 하나
AI는 단어 하나하나에 숫자 묶음을 하나씩 배정합니다. 이걸 임베딩이라고 불러요. 중요한 건 이 숫자들이 아무렇게나 정해진 게 아니라는 점입니다.
수많은 문장을 학습하고 나면, 비슷한 자리에 등장하는 단어들끼리 비슷한 방향을 가리키도록 숫자가 자리를 잡습니다. "고양이"와 "강아지"는 비슷한 문장에 자주 나오니 방향도 가까워지고, "고양이"와 "트럭"은 멀어지는 식이죠.
단어들의 지도 — 비슷한 뜻은 비슷한 방향
단어 클릭"방향이 가깝다"를 컴퓨터는 어떻게 숫자로 판단할까요? 그 도구는 5장에 나옵니다. 왜 2장이 아니라 5장이냐면 — 그 도구가 사원수에서 튀어나왔기 때문이에요. 먼저 그 길을 따라가 봅시다.
※ 실제 AI는 숫자를 768개씩 씁니다. 위 그림은 눈으로 보려고 2개로 줄인 예시예요.
- 벡터 = 순서대로 묶은 숫자들. 2개면 화살표로 그릴 수 있다.
- 길이는 제곱해서 더하고 루트. 더하기는 같은 자리끼리.
- AI는 단어를 벡터로 바꿔 저장하고, 뜻이 비슷하면 방향이 비슷해지도록 학습한다.
— 1843년, 아일랜드. 이야기는 "회전"에서 시작합니다 —
02회전과 복소수
한 줄 요약: 평면에서 무언가를 돌리는 일은 곱셈 한 번으로 끝난다.
1830년대 수학자들은 신기한 사실을 하나 알고 있었습니다. 평면 위의 회전은 복소수 곱셈 딱 한 번이면 끝난다는 것이었죠. 놀랄 만큼 깔끔했습니다.
그래서 자연스러운 질문이 나옵니다. "그럼 3차원 공간에서도 똑같이 되지 않을까?" 이 질문에 10년을 매달린 사람이 해밀턴이고, 그 답이 3장의 사원수입니다. 그러니 회전 이야기부터 하는 게 순서예요.
- 회전
- 화살표를 원점 중심으로 빙글 돌리는 것. 길이는 절대 안 변하고 방향만 바뀝니다.
- 복소수 · 허수 i
- 고등학교 때 "제곱해서 −1이 되는 수"로 배운 그것. 실은 90도 돌리기 버튼이라고 이해하는 게 훨씬 쉽습니다.
- 단위 복소수
- 길이가 정확히 1인 복소수. 곱해도 길이를 안 바꾸므로 순수한 회전이 됩니다.
시계바늘을 떠올려 보세요
시계바늘은 길이가 절대 변하지 않습니다. 오직 각도만 바뀌죠. 그런데도 우리는 바늘 각도만 보고 몇 시인지 정확히 압니다.
회전이 위치 표시에 좋은 이유가 정확히 이겁니다. 벡터 안에 담긴 "의미" 정보는 길이에 들어 있는데, 회전은 길이를 안 건드리니까 의미를 망가뜨리지 않으면서 순서 정보만 얹을 수 있어요.
허수 i의 정체 — 90도 돌리기 버튼
학교에서 "i는 제곱해서 −1이 되는 이상한 수"라고 배우고 끝났을 겁니다. 실용적으로는 이렇게 보는 게 맞습니다.
그래서 i를 두 번 곱하면 90도 + 90도 = 180도, 즉 정반대 방향이 됩니다.
정반대 방향은 −1을 곱한 것과 같죠.
그래서 i × i = −1인 겁니다. 이상한 수가 아니라 회전 버튼이었어요.
그럼 90도 말고 아무 각도로 돌리는 버튼도 만들 수 있겠죠. 그런 버튼을 "길이가 1인 복소수"라고 부릅니다. 곱하기만 하면 딱 그 각도만큼 돌아갑니다.
여기서 규칙 두 개만 기억하시면 됩니다.
- 복소수를 곱하면 각도는 더해집니다 (30도짜리를 곱하면 30도 더 돎)
- 복소수를 곱하면 길이는 곱해집니다 (길이 1짜리를 곱하면 길이가 안 변함)
그래서 길이 1짜리를 곱하는 것 = 순수한 회전입니다. 아래에서 직접 확인해 보세요.
곱했더니 돌아간다
↔ 파란 화살표 드래그 + 슬라이더평면에서는 숫자 2개짜리(복소수)로 회전이 끝났습니다.
그렇다면 공간에서는 숫자 3개짜리를 만들면 되지 않을까요?
해밀턴도 정확히 그렇게 생각했습니다. 그리고 10년을 실패했습니다.
- 회전은 길이를 안 바꾸고 방향만 바꾼다. 그래서 정보를 안 망가뜨린다.
- 허수 i는 90도 돌리기 버튼. 두 번 곱하면 180도라 −1이 되는 것뿐이다.
- 복소수를 곱하면 각도는 더해지고 길이는 곱해진다. 길이 1짜리를 곱하면 순수한 회전이다.
— 평면에서 되던 것이 공간에서는 왜 안 됐을까요 —
03사원수
한 줄 요약: 공간에서 무언가를 돌리려면 숫자가 3개가 아니라 4개 필요하다.
매일 아침 아들이 물었다고 합니다. "아빠, 오늘은 세 개짜리 곱셈 됐어요?" 아버지는 매번 고개를 저었죠. 곱셈은 되는데 나눗셈이 안 됐거든요.
1843년 10월 16일, 아내와 운하를 따라 산책하던 중 답이 떠올랐습니다. 세 개로는 안 되고, 네 개여야 한다. 너무 흥분한 나머지 지나던 다리 돌에 칼로 공식을 새겼다는 일화가 유명합니다.
이게 왜 우리에게 중요하냐면 — 여기서 오늘날의 내적과 외적이 통째로 나오기 때문입니다. 그건 5장에서 보고, 이 장에서는 사원수가 무엇인지부터 봅니다.
사원수 자체는 ChatGPT 같은 언어 모델에 직접 쓰이지 않습니다. 헷갈리실까 봐 분명히 해둡니다.
다만 5장의 내적이 여기서 나오고, 3D·로봇·자율주행 쪽 AI에서는 지금도 그대로 쓰입니다.
문을 여는 것과 똑같습니다
문이 열리는 걸 떠올려 보세요. 문을 돌리려면 딱 두 가지만 정하면 됩니다.
- 어디에 경첩이 달렸나 — "축" 문은 경첩을 중심으로 돕니다. 이 회전의 중심선을 축이라고 해요. 입체 공간에서 방향 하나를 가리키려면 숫자 3개가 필요합니다(앞뒤·좌우·위아래).
- 얼마나 열 것인가 — "각도" 30도만 빼꼼 열지, 90도로 활짝 열지. 이건 숫자 1개면 되죠.
축 3개 + 각도 1개 = 숫자 4개. 사원수의 "사(四)"가 여기서 나옵니다. 뜬금없이 4개인 게 아니라, 입체 회전을 적으려면 최소 4개가 필요해서입니다.
- 사원수 (quaternion, 쿼터니언)
- 숫자 네 개로 입체 회전을 표현한 것. 코드에서는 그냥
float[4]입니다. - 축 (axis)
- 회전의 중심선. 문의 경첩, 팽이의 심, 나사의 방향 같은 것. 축 위에 있는 점은 아무리 돌려도 제자리입니다.
- 짐벌락 (gimbal lock)
- 다른 방식으로 회전을 다룰 때 생기는 고장. 특정 각도에서 갑자기 한 방향으로 못 돌게 되는 현상입니다. 아래에서 설명합니다.
- 보간 (interpolation) · slerp
- 자세 A에서 자세 B로 부드럽게 넘어가는 중간 단계를 만들어내는 것. 애니메이션에 꼭 필요합니다.
축과 각도를 정해서 직접 돌려보세요
↔ 배경 드래그 = 보는 방향 바꾸기1, 0, 0, 0이 됩니다 — "안 돌린 상태"입니다.맨 위 w는 "얼마나 안 돌았나", 아래 x·y·z는 "어느 쪽으로 돌았나"를 담고 있습니다.
숫자 4개가 어떻게 만들어지는지 궁금하다면
(x, y, z) = sin(θ/2) × 축 방향
왜 θ가 아니라 θ의 절반일까요? 사원수로 실제 회전을 시킬 때는
q × 점 × q⁻¹처럼 양옆에서 두 번 곱합니다. 두 번 거치니 회전이 두 배가 되죠.
그래서 미리 절반만 넣어두는 겁니다. "두 번 곱하니까 반씩"만 기억하시면 충분합니다.
회전을 이어 붙이는 것은 그냥 곱셈입니다: q₂ × q₁.
단 순서가 중요해요. 손바닥을 "위로 젖힌 다음 옆으로 돌리기"와 "옆으로 돌린 다음 위로 젖히기"를
직접 해보시면 결과가 다르다는 걸 바로 느끼실 겁니다.
왜 굳이 사원수를 쓰나 — 이유 세 가지
가장 흔한 대안은 "x축으로 얼마, y축으로 얼마, z축으로 얼마"처럼 세 번 나눠 돌리는 방식입니다(오일러 각). 직관적이지만 치명적인 고장이 있어요.
비행기가 기수를 수직으로 90도 들어 올리면, 세 축 중 두 개가 겹쳐버립니다. 그러면 아무리 조종해도 어떤 방향으로는 돌 수가 없게 돼요. 실제로 아폴로 우주선에서도 문제가 됐던 현상입니다.
사원수는 축을 통째로 하나로 다루기 때문에 이런 상황이 아예 생기지 않습니다.
캐릭터가 자세 A에서 자세 B로 자연스럽게 움직이려면 중간 단계를 만들어야 합니다. 오일러 각으로 하면 중간에 엉뚱한 길로 빙 돌거나 속도가 출렁거려요. 사원수는 가장 짧은 길로 일정한 속도로 미끄러지듯 갑니다. 이 방법을 slerp이라고 부릅니다.
같은 회전을 표 형태로 적으면 숫자가 9개 필요한데 사원수는 4개면 됩니다. 회전을 수천 번 이어 붙이면 컴퓨터 소수점 오차가 조금씩 쌓이는데, 사원수는 길이를 다시 1로 맞춰주기만 하면(정규화) 원상복구됩니다. 1장에서 배운 그 정규화예요.
두 방식을 나란히 비교 — 같은 A에서 같은 B로
↔ 배경 드래그 = 보는 방향 바꾸기초록 = 사원수(slerp) · 분홍 = 오일러 각
사원수끼리 곱해보니, 그 결과 안에 성격이 완전히 다른 두 개의 계산이 섞여 있었습니다.
하나는 숫자 하나로 나오고, 다른 하나는 새로운 화살표로 나왔죠.
그 둘이 바로 오늘날의 내적과 외적입니다. 5장에서 그 장면을 봅니다.
- 공간의 회전은 "어느 축으로(숫자 3개) 얼마나(숫자 1개)" — 그래서 숫자가 4개 필요하다.
- 그 4개짜리 묶음이 사원수. 문의 경첩과 열린 각도라고 생각하면 된다.
- 쓰는 이유는 짐벌락이 없고, 부드럽게 이어지고, 가볍기 때문. 3D·로봇에는 지금도 필수다.
— 내적으로 가기 전에, 반드시 짚고 가야 할 게 하나 있습니다 —
04더하기와 곱하기, 그리고 행렬
한 줄 요약: 언제 더하고 언제 곱하는가. 이걸 알면 다음 장부터가 전부 쉬워집니다.
많은 사람이 여기서 그냥 외우고 넘어갑니다. 그러다 나중에 행렬 곱이 나오면 무너지죠. "이건 왜 곱하고 저건 왜 더하지?"가 계속 걸리거든요.
사실 이 둘에는 아주 명확한 구분 기준이 있습니다. 고등학교 경우의 수에서 배운 합의 법칙과 곱의 법칙이 그것이고, 이 원칙 하나면 내적도 행렬 곱도 외울 필요 없이 그냥 이해됩니다.
- 분류의 원칙
- 무언가를 셀 때 나누는 기준. 조건은 두 개입니다 — 겹치지 않게, 그리고 빠뜨리지 않게.
- 합의 법칙
- 동시에 일어날 수 없는 경우들을 셀 때는 더한다.
- 곱의 법칙
- 연달아 일어나서 하나가 끝나야 다음이 시작되는 단계들을 셀 때는 곱한다.
- 행렬 (matrix)
- 숫자를 격자(표) 모양으로 늘어놓은 것. 엑셀 시트 한 장이라고 생각하시면 정확합니다.
- 행 / 열
- 행(row)은 가로 한 줄, 열(column)은 세로 한 줄.
먼저 분류의 원칙 — 겹치지 않게, 빠뜨리지 않게
무언가를 세려면 먼저 제대로 나눠야 합니다. 나누는 규칙은 딱 두 가지예요.
- 겹치지 않게 (동시에 일어날 수 없게) 같은 것이 두 칸에 들어가면 두 번 세게 됩니다. 예를 들어 "짝수"와 "3의 배수"로 나누면 6이 양쪽에 들어가서 겹치죠.
- 빠뜨리지 않게 (전부 담기게) 어느 칸에도 안 들어가는 게 있으면 세다가 놓칩니다. 나눈 것들을 다 합치면 원래 전체가 되어야 합니다.
이 두 조건을 지켜 나눴을 때만 "더하기"와 "곱하기"를 마음 놓고 쓸 수 있습니다. 실무에서 MECE라고 부르는 그 원칙과 정확히 같은 이야기예요.
합의 법칙 — "이거 아니면 저거"는 더한다
서울에서 부산 가는 방법을 셉니다. 기차 3편, 비행기 2편이 있다면 총 몇 가지일까요?
← 기차를 타면 비행기를 못 탄다. 동시에 일어날 수 없다 → 더한다
핵심은 "동시에 일어날 수 없다"는 점입니다. 기차이면서 동시에 비행기일 수는 없죠. 이렇게 서로 배타적인 선택지를 셀 때는 더합니다.
곱의 법칙 — "이거 하고 나서 저거"는 곱한다
이번엔 옷을 고릅니다. 상의 3벌, 하의 4벌이 있다면 조합은 몇 가지일까요?
← 상의를 고르고 이어서 하의를 고른다. 둘 다 골라야 끝난다 → 곱한다
핵심은 "연달아 일어나서, 끝까지 가야 하나가 완성된다"는 점입니다. 상의만 골라서는 아직 끝이 아니에요. 하의까지 골라야 한 가지 경우가 완성되죠. 이럴 때는 곱합니다.
"둘 다 해야 끝나는가?" → 곱한다. (연달아, 끝까지)
"둘 중 하나만 일어나는가?" → 더한다. (동시에 불가능)
두 법칙을 눈으로 확인해 보세요
슬라이더 + 버튼이제 행렬입니다
행렬은 숫자를 표로 늘어놓은 것입니다. 엑셀 시트 한 장이라고 생각하시면 딱 맞아요. 그리고 행렬로 할 수 있는 일은 더하기와 곱하기인데, 방금 배운 두 법칙이 그대로 적용됩니다.
행렬의 합 — 같은 자리끼리만 더한다
행렬 둘을 더할 때는 같은 자리에 있는 숫자끼리만 더합니다. 그게 전부예요.
[ 3 4 ] + [ 7 8 ] = [ 3+7 4+8 ] = [ 10 12 ]
왜 같은 자리끼리만일까요? 서로 다른 자리는 애초에 다른 항목이기 때문입니다. 1번 칸과 2번 칸은 겹치지 않는 별개의 것이니, 섞을 이유가 없죠. 분류의 원칙대로 잘 나뉘어 있으니 각 칸이 자기들끼리만 더해지는 겁니다.
그래서 행렬의 합은 크기가 똑같아야만 가능합니다. 3행 2열끼리는 더해지지만, 3행 2열과 2행 4열은 짝이 안 맞아서 더할 수 없어요.
행렬의 곱 — 변환을 연달아 적용한다
곱은 성격이 완전히 다릅니다. "연달아 일어나서 끝까지 가야 완성된다"는 곱의 법칙이 그대로 적용돼요.
행렬 하나를 "공간을 이렇게 찌그러뜨려라"는 지시서라고 생각해 보세요. 행렬을 곱한다는 건 지시서를 하나 적용하고, 이어서 또 하나를 적용하는 것입니다. 둘 다 거쳐야 최종 위치가 정해지죠 — 그래서 곱입니다.
행렬 하나를 벡터에 곱하면 그 벡터가 다른 자리로 옮겨갑니다. 모눈종이 전체를 잡아 늘이거나, 비틀거나, 돌리거나, 뒤집는다고 생각하시면 됩니다.
비결은 이겁니다. 행렬의 세로줄 하나하나가 "기준 화살표가 어디로 옮겨가는지"를 알려줍니다. 오른쪽으로 한 칸(가로 기준)이 어디로 가고, 위로 한 칸(세로 기준)이 어디로 가는지만 정하면 나머지는 자동으로 따라옵니다.
행렬이 모눈종이를 어떻게 바꾸는지 보세요
↔ 파란 화살표 드래그 + 슬라이더1, 0, 0, 1로 맞추면 아무것도 안 변하는 상태가 됩니다.격자가 뒤집혔다는 뜻입니다. 0이면 납작하게 눌려서 정보가 사라진 상태예요.
입력 벡터에 행렬을 곱해 다른 자리로 옮기고, 살짝 구부린 다음(활성화 함수), 또 다른 행렬을 곱해 옮기고… 이걸 수십 번 반복합니다.
학습한다는 건 이 행렬 안의 숫자들을 조금씩 고치는 일이에요. 어떻게 고치는지는 8장에서 다룹니다.
수식으로도 보고 싶다면
Σ(시그마)는 "다 더해라"는 뜻입니다.
즉 가로줄과 세로줄을 짝지어 곱하고(곱의 법칙), 그걸 전부 더하라(합의 법칙)는 말이에요.
이 한 줄 안에 두 법칙이 다 들어 있습니다. 코드로는 for 문 세 개면 끝나고요.
(3행 2열) × (2행 4열) = (3행 4열)
가운데 2가 서로 같아야 곱할 수 있습니다. 앞 지시서가 내놓는 결과의 개수와, 뒤 지시서가 받아들이는 개수가 맞아야 이어 붙일 수 있기 때문입니다. 곱의 법칙에서 "연달아"가 성립하려면 당연한 조건이에요.
코드에서 만나는 shape mismatch 오류가 대부분 이것입니다.
- 셀 때는 먼저 겹치지 않게, 빠뜨리지 않게 나눈다. 그래야 더하기·곱하기를 쓸 수 있다.
- 동시에 일어날 수 없는 것은 더한다(합의 법칙). 연달아 일어나 둘 다 해야 끝나는 것은 곱한다(곱의 법칙).
- 행렬의 합은 같은 자리끼리. 다른 자리는 애초에 별개 항목이라 섞이지 않는다.
- 행렬의 곱은 지시서를 연달아 적용하는 것. 그래서 가운데 크기가 맞아야 이어 붙는다.
— 여기가 분기점입니다. 사원수에서 두 개가 갈라져 나옵니다 —
05내적과 외적
한 줄 요약: 사원수 곱셈 하나를 풀어 헤쳤더니, 그 안에 두 개의 계산이 들어 있었다.
검색, 추천, 어텐션, 행렬 곱 — 앞으로 나올 모든 것의 바닥에 이게 깔려 있습니다. 이 장만 확실히 잡으면 나머지는 응용입니다.
그리고 이게 어디서 왔는지도 여기서 밝혀집니다. 사원수 곱셈을 풀어보면 내적과 외적이 그냥 툭 떨어져 나옵니다. 먼저 그 장면부터 보시죠.
사원수 곱셈을 풀어 헤쳐 보면
3장에서 사원수는 숫자 4개라고 했습니다. 그런데 맨 앞 숫자를 0으로 두면 어떻게 될까요? 남는 건 숫자 3개, 즉 그냥 평범한 3차원 화살표입니다.
이런 화살표 두 개를 사원수 규칙대로 곱해보면 이런 결과가 나옵니다.
결과의 맨 앞 숫자 1개 = − (a 와 b 의 내적)
결과의 나머지 숫자 3개 = (a 와 b 의 외적)
내적과 외적은 누가 따로 발명한 게 아닙니다.
사원수 곱셈 하나에 원래부터 같이 들어 있던 두 부분이었어요.
실제로 "스칼라(scalar)"와 "벡터(vector)"라는 단어 자체를 해밀턴이 만들었습니다.
사원수의 맨 앞 숫자를 스칼라부, 나머지 셋을 벡터부라고 부른 게 그 어원이에요.
그런데 사원수는 무겁습니다. 전자기학이나 역학을 하는 사람들에게는 필요한 부분만 따로 쓰는 게 훨씬 편했어요. 그래서 1880년대에 기브스와 헤비사이드가 이 두 부분을 아예 독립된 연산으로 떼어냅니다. 그게 지금 우리가 배우는 벡터 대수이고요.
당시 "사원수를 통째로 써야 한다"는 쪽과 "떼어 쓰는 게 낫다"는 쪽 사이에 꽤 격한 논쟁이 있었습니다. 결과적으로 떼어 쓰는 쪽이 이겨서, 오늘날 교과서는 내적부터 가르치고 사원수는 아예 안 다루거나 맨 뒤로 밀려났습니다. 순서가 뒤집힌 이유가 이겁니다.
- 내적 (dot product) · 기호
a · b - "a 닷 b". 화살표 두 개를 넣으면 숫자 하나가 나옵니다. 얼마나 같은 쪽을 보는지를 뜻합니다.
- 외적 (cross product) · 기호
a × b - 화살표 두 개를 넣으면 새 화살표 하나가 나옵니다. 둘 다에 수직인 방향을 가리킵니다.
- 코사인 유사도
- 내적에서 길이 영향을 지운 것. 항상 −1에서 1 사이라 비교하기 편합니다.
먼저 스칼라부 — 내적
사원수 곱셈 결과의 맨 앞 숫자가 내적이었습니다. 이게 뭘 뜻하는지 감을 잡는 데는 이 비유가 제일 좋습니다.
수레를 미는 두 사람
수레 하나를 두 사람이 민다고 상상해 보세요.
- 같은 방향으로 밀면 → 힘이 합쳐져서 잘 나갑니다. (내적: 큰 양수)
- 한 명이 옆에서 90도로 밀면 → 앞으로 나가는 데는 도움이 안 됩니다. (내적: 0)
- 반대 방향으로 밀면 → 서로 방해합니다. (내적: 음수)
내적은 정확히 이 "도움이 되는 정도"를 숫자로 만든 것입니다. 방향이 같을수록 큰 양수, 직각이면 0, 반대면 음수.
계산은 허무할 정도로 쉽습니다
같은 자리끼리 곱해서, 전부 더한다. 이게 전부예요. 직접 해봅시다.
곱하는 이유 — 첫 번째 자리와 첫 번째 자리는 둘 다 있어야 하나의 기여가 완성됩니다(곱의 법칙).
더하는 이유 — 첫 번째 자리의 기여와 두 번째 자리의 기여는 서로 다른 별개 항목입니다(합의 법칙).
내적은 이 두 법칙을 한 줄에 붙여놓은 것입니다. 외울 필요가 없어요.
첫 번째 자리끼리 : 3 × 1 = 3
두 번째 자리끼리 : 2 × 4 = 8
──────────────────
다 더하면 : 3 + 8 = 11
숫자가 768개여도 똑같습니다. 768번 곱해서 768개를 더할 뿐이에요. 코드로는 for 문 한 줄이고, 그래서 컴퓨터가 엄청나게 빠르게 처리합니다.
방금 한 건 그냥 곱하고 더하는 산수였습니다. 그림은 하나도 안 그렸죠. 그런데 이 결과가 "두 화살표가 얼마나 같은 쪽을 보는가"와 정확히 일치합니다. 산수와 도형이 만나는 지점이고, 이게 내적이 특별한 이유입니다.
부호만 봐도 절반은 읽힙니다
| 두 화살표가 | 내적 값은 | 뜻 |
|---|---|---|
| 거의 같은 방향 | 큰 양수 | 많이 닮았다 |
| 비스듬히 | 작은 양수 | 조금 닮았다 |
| 직각 (90도) | 0 | 아무 상관 없다 |
| 정반대 | 음수 | 반대다 |
두 화살표를 끌면서 숫자가 어떻게 변하는지 보세요
↔ 두 화살표 모두 드래그그림자로 이해하기
위 그림에서 초록색 굵은 선이 보이실 겁니다. 이게 뭐냐면 —
주황 화살표(b) 바로 위에서 손전등을 비췄다고 생각해 보세요. 파란 화살표(a) 위에 주황 화살표의 그림자가 생깁니다. 그 그림자의 길이가 초록색 선이에요.
- 두 화살표가 같은 쪽을 보면 → 그림자가 앞쪽으로 길게 생김 → 내적 큼
- 두 화살표가 직각이면 → 그림자가 사라짐 → 내적 0
- 두 화살표가 반대면 → 그림자가 뒤쪽으로 생김 → 내적 음수
그래서 내적은 "상대방이 내 방향으로 드리운 그림자의 크기"라고 이해하시면 됩니다. 이 이미지 하나만 가져가셔도 충분해요.
수식으로도 보고 싶다면
a · b = ‖a‖ ‖b‖ cos θ (도형)
위·아래 두 줄은 항상 같은 값입니다. 위는 "곱해서 더하기", 아래는 "a의 길이 × b의 길이 × 사잇각의 코사인".
‖b‖ cos θ 부분이 바로 본문에서 말한 그림자 길이예요.
길이를 지우면 — 코사인 유사도
내적에는 불편한 점이 하나 있습니다. 화살표가 길기만 해도 값이 커집니다.
비유하자면 목소리 큰 사람 같은 거예요. 내용이 비슷해서가 아니라 그냥 목소리가 커서 점수가 높게 나오는 상황이죠. 우리가 알고 싶은 건 "얼마나 닮았나"인데 "얼마나 큰가"가 섞여 들어옵니다.
해결은 간단합니다. 둘 다 자기 길이로 나눠버리면 됩니다. 그러면 크기 차이는 사라지고 순수하게 방향만 비교하게 돼요. 이걸 코사인 유사도라고 부릅니다.
항상 −1에서 1 사이 숫자가 나옵니다.
1에 가까우면 거의 같은 뜻 · 0 근처면 아무 관계 없음 · −1에 가까우면 정반대.
벡터 데이터베이스, RAG, 추천 시스템에서 "비슷한 것 찾기"는 대부분 이 값 하나로 정렬하는 겁니다.
단어 유사도 — 기준 단어를 바꿔보세요
단어 클릭이번엔 벡터부 — 외적
사원수 곱셈 결과의 나머지 숫자 3개는 새로운 화살표였습니다. 이게 외적이에요. 성격이 내적과 정반대입니다.
내적 a · b | 외적 a × b | |
|---|---|---|
| 결과가 | 숫자 하나 | 새 화살표 하나 |
| 가장 클 때 | 두 화살표가 나란할 때 | 두 화살표가 직각일 때 |
| 0이 될 때 | 직각일 때 | 나란할 때 |
| 뜻하는 것 | 얼마나 같은 쪽을 보는가 | 둘이 만드는 평면과 넓이 |
| 몇 차원에서 | 몇 차원이든 (768차원도 OK) | 3차원에서만 |
a × b와 b × a는 길이는 같고 방향이 정반대입니다.
내적은 순서를 바꿔도 같은데, 외적은 다릅니다. 아래 그림에서 두 각도 슬라이더를 서로 넘겨보시면
초록 화살표가 위아래로 뒤집히는 걸 보실 수 있어요.
3장에서 "사원수는 곱하는 순서가 중요하다"고 했던 것과 같은 이유입니다.
외적이 가리키는 방향은 두 화살표가 만드는 평면에 수직입니다. 오른손으로 a에서 b 쪽으로 손가락을 감아쥐면 엄지가 가리키는 쪽이에요(오른손 법칙). 그리고 그 길이는 두 화살표가 만드는 평행사변형의 넓이와 같습니다.
사원수 곱이 두 개로 갈라지는 장면
↔ 배경 드래그 = 보는 방향AI 쪽에서는 거의 안 씁니다. 대신 3D 그래픽에서는 없으면 안 되는 도구예요. 면이 어느 쪽을 향하는지(법선 벡터), 빛이 얼마나 비스듬히 닿는지, 카메라의 위·오른쪽 방향을 잡는 일이 전부 외적 한 줄로 끝납니다. 물리에서 회전력(토크)과 각운동량도 전부 외적이고요.
돌아보기 — 4장의 행렬 곱, 그 칸 하나가 내적이었습니다
4장에서 행렬 곱을 "지시서를 연달아 적용하는 것"으로 배웠습니다. 그때는 일부러 말을 아꼈는데, 이제 내적을 알았으니 진짜 정체를 밝힐 수 있습니다.
가장 실용적인 이해는 이겁니다.
결과표의 (3번째 줄, 2번째 칸)에 들어갈 숫자는
왼쪽 표의 3번째 가로줄과 오른쪽 표의 2번째 세로줄을 내적한 값입니다.
그게 전부이고, 모든 칸에 대해 이걸 반복할 뿐입니다.
바로 3장의 어텐션 점수표를 만들어 봅시다. 질문 단어 3개, 후보 단어 4개가 있으면 점수가 12개 나오죠. 아래 표에서 칸을 하나 눌러보세요.
점수표의 칸 하나하나가 내적입니다
칸 클릭보셨듯이 새로운 계산은 하나도 없습니다. 2장의 "곱해서 더하기"를 12번 한 것뿐이에요. 행렬 곱이라는 이름은 이 반복 작업에 붙인 이름입니다.
- 사원수 곱셈 하나를 풀면 맨 앞은 내적(−붙어서), 나머지는 외적이 나온다. 둘은 원래 한 몸이었다.
- 내적 = 같은 자리끼리 곱해서 다 더하기. 얼마나 같은 쪽을 보는가를 숫자 하나로.
- 외적 = 둘 다에 수직인 새 화살표. 길이는 평행사변형의 넓이. 3차원에서만 된다.
- 길이 영향을 지운 내적이 코사인 유사도(−1~1). AI의 "비슷한 것 찾기"는 거의 이걸로 한다.
- 행렬 곱의 칸 하나하나가 바로 내적이다. 그래서 행렬 곱이 AI 계산의 전부가 된다.
— 여기서부터는 현대입니다. 내적이 실제로 어디에 쓰이는지 —
06어텐션
한 줄 요약: "지금 이 단어를 이해하려면 어느 단어를 봐야 하지?"를 내적으로 정하는 것.
사람은 당연히 '사과'라고 압니다. 하지만 컴퓨터 입장에서 '빨간'은 그냥 숫자 묶음 하나예요. 문장 안 다른 단어들 중 누구를 봐야 할지 스스로 정해야 합니다.
그 "누구를 볼지 정하는 장치"가 어텐션입니다. ChatGPT를 포함한 요즘 AI의 핵심 부품이고, 놀랍게도 5장에서 배운 내적이 거의 전부입니다.
도서관에서 자료 찾기
어텐션은 도서관에서 책 찾는 과정과 구조가 완전히 똑같습니다. 이렇게 생각해 보세요.
- Q (Query, 큐) — 내가 찾는 것을 적은 쪽지
- 도서관 검색창에 친 검색어. "나는 지금 이런 정보가 필요해"라는 요청입니다.
- K (Key, 케이) — 책등에 붙은 라벨
- 각 책이 "나는 이런 내용을 담고 있어요"라고 스스로 붙여둔 꼬리표. 검색어와 맞춰보는 대상입니다.
- V (Value, 브이) — 책의 실제 내용
- 라벨을 보고 고른 다음, 실제로 꺼내서 읽는 알맹이입니다.
Q, K, V는 전부 그냥 벡터입니다. 1장에서 배운 그 숫자 묶음이에요. 이름이 세 개라 복잡해 보일 뿐, 하는 일은 "검색어 하나, 라벨 여러 개, 내용 여러 개"가 전부입니다.
딱 세 단계입니다
- 점수 매기기 — 내적을 쓴다 검색어(Q)와 각 라벨(K)이 얼마나 맞는지 내적으로 점수를 냅니다. 5장에서 배운 그대로예요. 방향이 비슷하면 점수가 높게 나옵니다.
- 점수를 비율로 바꾸기 — softmax 점수가 [3, 1, 0]처럼 제각각이면 쓰기 불편합니다. 그래서 전부 더하면 100%가 되도록 바꿉니다. 이 변환기의 이름이 softmax예요.
- 비율대로 섞기 84%짜리 책 내용을 84%만큼, 11%짜리를 11%만큼 가져와서 섞습니다. 그 섞인 결과가 이 단어의 새로운 의미가 됩니다.
점수 [3, 1, 0]을 넣으면 [84%, 11%, 4%]가 나옵니다.
① 다 더하면 정확히 100%가 되고, ② 점수 차이를 과장해서 벌립니다(3과 1의 차이가 84%와 11%로 벌어졌죠).
덕분에 "누구를 볼지"가 흐리멍덩하지 않고 또렷하게 정해집니다. 이게 softmax가 하는 일의 전부입니다.
어텐션을 직접 조종해 보세요
↔ 파란 화살표 드래그비율대로 섞어서 나온 최종 출력입니다. 많이 보는 단어 쪽으로 끌려가는 게 보이시죠.
문장에 단어가 10개면, 10개 단어가 서로에 대해 내적을 한 번씩 합니다. 총 100번이죠. 이걸 한꺼번에 처리하는 게 4·5장의 행렬 곱이고요.
즉 여러분이 5장에서 배운 "곱해서 더하기"가 수만 번 동시에 도는 것이 어텐션입니다. 새로운 수학이 추가된 게 아니에요. 같은 계산의 반복입니다.
수식으로도 보고 싶다면
비율 = softmax(점수)
출력 = 비율₁×V₁ + 비율₂×V₂ + ...
√d로 나누는 건 안전장치입니다. 숫자가 768개씩 되면 내적 값이 너무 커져서
softmax가 한 곳에만 100%를 몰아주는 극단적인 결과가 나오거든요. 그걸 눌러주는 역할입니다.
위 그림의 슬라이더가 정확히 이 역할이에요.
- 어텐션은 "어느 단어를 얼마나 볼지" 정하는 장치다.
- 순서는 내적으로 점수 → softmax로 비율 → 비율대로 섞기, 딱 세 단계.
- Q는 검색어, K는 라벨, V는 내용. 셋 다 그냥 벡터이고, 핵심 계산은 5장의 내적 하나다.
— 어텐션에는 구멍이 하나 있습니다. 그걸 2장의 회전으로 막습니다 —
07위치 인코딩 (RoPE)
한 줄 요약: 단어가 몇 번째인지를, 벡터를 그만큼 돌려서 표시한다.
그런데 내적은 순서를 전혀 모릅니다. 단어들이 어떤 순서로 놓여 있든 계산 결과가 똑같아요. 6장의 어텐션을 그대로 두면 AI는 이 두 문장을 구별하지 못합니다.
그래서 "이 단어가 몇 번째인지"를 벡터에 심어줘야 합니다. 요즘 모델(LLaMA, Qwen 등)이 쓰는 방법이 2장에서 배운 회전이에요. 회전은 길이를 안 바꾸니 원래 의미를 망가뜨리지 않고 순서만 얹을 수 있거든요.
- 위치 인코딩 (position encoding)
- 단어가 문장에서 몇 번째인지를 벡터에 담는 방법 전반을 부르는 말입니다.
- RoPE
- Rotary Position Embedding. 이름 그대로 "돌려서 위치를 표시하는 방법". 요즘 모델의 표준입니다.
- 상대 위치
- "몇 번째인가"(절대 위치)가 아니라 "둘이 몇 칸 떨어졌는가". RoPE의 핵심 성질입니다.
RoPE — 단어마다 시계를 조금씩 돌려둔다
이제 본론입니다. 방법은 놀랄 만큼 단순해요.
첫 번째 단어는 안 돌린다. 두 번째 단어는 20도 돌린다. 세 번째는 40도. 네 번째는 60도...
이렇게 몇 번째인지에 비례해서 벡터를 돌려놓는 것이 끝입니다.
각 단어가 자기 순서만큼 시곗바늘을 돌려둔 셈이죠.
그런데 여기서 진짜 좋은 일이 하나 일어납니다. 이게 RoPE가 널리 쓰이는 이유예요.
두 시계를 똑같이 돌려도 사이 각도는 그대로
시계 두 개가 각각 3시와 5시를 가리키고 있다고 해봅시다. 둘 사이는 2시간 차이죠.
이제 두 시계를 똑같이 100시간씩 앞으로 돌려보세요. 103시와 105시가 됩니다. 절대 시각은 완전히 바뀌었지만 — 둘 사이 차이는 여전히 2시간입니다.
RoPE에서 벌어지는 일이 정확히 이겁니다. 두 단어를 각각 자기 위치만큼 돌려서 내적을 하면, 결과는 둘이 몇 번째인지와 무관하게 "몇 칸 떨어져 있는지"에만 좌우됩니다.
왜 좋은가요? 문장 앞부분에 있든 뒷부분에 있든, "바로 앞 단어"는 항상 똑같이 "바로 앞 단어"로 취급됩니다. 덕분에 학습 때 본 적 없는 긴 문장에서도 관계를 제대로 파악할 수 있어요.
같이 돌려도 내적이 안 변합니다
슬라이더 조작- 내적만으로는 단어 순서를 알 수 없다. 순서 정보를 따로 심어야 한다.
- RoPE는 몇 번째 단어인지에 비례해 벡터를 돌려둔다. 회전은 길이를 안 바꾸니 의미가 안 망가진다.
- 그 결과 절대 위치는 지워지고 "몇 칸 떨어졌는지"만 남는다. 긴 문장에도 잘 통하는 이유다.
— 계산 결과를 사람이 쓸 수 있는 형태로 바꾸는 마지막 한 단계 —
08확률과 softmax
한 줄 요약: 제멋대로인 점수들을 "합이 100%인 비율"로 바꾸는 것.
후보 단어가 5만 개쯤 있고, 각각에 대해 점수 하나씩이 나옵니다.
[3.2, -1.4, 0.8, 7.1, ...] 같은 식으로요. 범위도 제각각이고 음수도 섞여 있습니다.
이대로는 "이 단어가 나올 확률이 몇 %인가"를 말할 수 없습니다. 점수를 확률로 바꾸는 마지막 한 단계가 필요하고, 그게 softmax입니다. 6장 어텐션에서 이미 한 번 쓰셨죠 — 여기서 제대로 봅니다.
- 로짓 (logit)
- softmax를 통과하기 전의 날것 점수. 어려운 개념이 아니라 그냥 "아직 확률로 안 바꾼 점수"를 부르는 이름입니다.
- 확률분포
- 후보마다 확률을 매긴 것. 조건은 딱 두 개 — 전부 0 이상이고 다 더하면 1(=100%).
- 온도 (temperature)
- 확률을 얼마나 뾰족하게 만들지 정하는 손잡이. API 설정에서 보셨을 그 temperature가 바로 이것입니다.
문제는 두 가지입니다
점수를 그냥 "전부 더해서 각자 나누기"로 비율을 내면 안 될까요? 두 가지가 걸립니다.
- 음수가 있습니다. −1.4를 확률로 만들 수는 없죠.
- 차이가 잘 안 벌어집니다. 점수 5점과 4점은 꽤 큰 차이인데, 단순 비율로는 55% 대 45% 정도밖에 안 됩니다.
이 둘을 한 방에 해결하는 게 지수함수(e를 거듭제곱하는 것)입니다.
① 무슨 숫자를 넣어도 결과가 양수가 됩니다. 음수를 넣으면 0에 가까운 작은 양수가 나오죠.
② 큰 값은 훨씬 더 크게 벌립니다. 점수 1 차이가 대략 2.7배 차이로 바뀝니다.
덕분에 "확실히 이게 답이다"라고 또렷하게 말할 수 있게 됩니다.
세 단계면 끝납니다
- 온도로 나눈다 모든 점수를 온도 값으로 나눕니다. 온도가 작으면 점수 차이가 커지고, 크면 줄어듭니다. 이 한 번의 나눗셈이 "얼마나 과감하게 고를지"를 정합니다.
- 지수함수에 통과시킨다
각 점수를
e의 거듭제곱으로 바꿉니다. 이제 전부 양수이고 차이도 확 벌어졌습니다. - 전체 합으로 나눈다 다 더한 값으로 각자를 나눕니다. 그러면 합이 정확히 1이 되죠. 확률 완성입니다.
지수함수 통과 : [ 20.1 , 2.72 , 1.00 ] ← 전부 양수, 차이가 벌어짐
다 더하면 : 23.8
각자 나누면 : [ 0.84 , 0.11 , 0.04 ] ← 합이 1
점수를 직접 바꿔가며 확률이 어떻게 되는지 보세요
슬라이더 조작온도가 곧 "창의성 손잡이"입니다
| 온도 | 확률 모양 | 결과물의 느낌 |
|---|---|---|
| 낮음 (0.2~0.5) | 1등이 거의 다 가져감 | 매번 비슷하고 안전한 답. 번역·요약·코드 생성에 적합 |
| 보통 (0.7~1.0) | 적당히 뾰족함 | 일반적인 대화에 쓰는 기본값 |
| 높음 (1.5 이상) | 거의 평평함 | 다양하고 의외성 있지만, 헛소리 위험도 올라감 |
API에서 temperature를 만지신 적 있다면, 지금 바꾸고 계셨던 게 정확히 이 나눗셈 값입니다.
수식으로도 보고 싶다면
s는 점수, T는 온도, Σ는 "다 더해라". 위는 지수함수 통과값, 아래는 그 전체 합입니다.
본문의 세 단계를 한 줄로 압축했을 뿐이에요.
실제 구현에서는 가장 큰 점수를 미리 빼줍니다.
안 그러면 e의 거듭제곱이 순식간에 넘쳐버리거든요(overflow).
전부 똑같이 빼면 결과 확률은 변하지 않는다는 성질을 이용한 안전장치입니다.
- softmax = 제멋대로인 점수를 합이 1인 확률로 바꾸는 변환기.
- 방법은 온도로 나누고 → 지수함수 통과 → 전체 합으로 나누기, 세 단계.
- 온도가 낮으면 또렷하고 안전하게, 높으면 다양하고 위험하게 고른다. API의 temperature가 이것이다.
— 마지막입니다. 지금까지 나온 그 많은 숫자들이 어떻게 정해지는지 —
09미분과 경사하강법
한 줄 요약: 틀린 정도를 재고, 그게 줄어드는 방향으로 조금씩 고치기. 이게 "학습"입니다.
사람이 정한 게 아닙니다. 처음엔 전부 무작위로 채워져 있어요. 그 상태로 문제를 풀리면 당연히 엉망으로 틀립니다.
그럼 틀린 만큼 숫자를 아주 조금씩 고칩니다. 그리고 다시 풀립니다. 또 고칩니다. 이걸 수십억 번 반복한 결과물이 지금의 AI예요. 이 "조금씩 고치는 방법"이 경사하강법이고, 그 방향을 알려주는 도구가 미분입니다.
- 손실 (loss)
- 얼마나 틀렸는지를 나타내는 숫자 하나. 작을수록 좋습니다. "오차", "비용"이라고도 부릅니다.
- 미분 · 기울기 (gradient)
- 지금 위치에서 어느 쪽이 오르막이고 어느 쪽이 내리막인지. 겁먹을 개념이 아니라 발밑 경사입니다.
- 학습률 (learning rate)
- 한 번에 얼마나 크게 움직일지. 보폭이라고 생각하시면 됩니다. 너무 크면 넘어지고 너무 작으면 하루 종일 걸립니다.
안개 낀 산에서 내려오기
깜깜한 안개 속 산 중턱에 서 있다고 상상해 보세요. 아래로 내려가고 싶은데 한 치 앞도 안 보입니다.
그래도 방법은 있습니다. 발밑을 더듬어 어느 쪽이 내리막인지 확인하고, 그쪽으로 한 걸음 옮기는 것. 그리고 또 확인하고, 또 한 걸음. 이걸 반복하면 결국 골짜기에 닿습니다.
산의 높이 = 손실(얼마나 틀렸나) · 내 위치 = 모델 안의 숫자들 ·
발밑 경사 = 미분 · 보폭 = 학습률
목표는 가장 낮은 골짜기에 도착하는 것 = 가장 적게 틀리는 숫자를 찾는 것.
공을 굴려 골짜기로 내려보내기
↔ 공 드래그 + 버튼너무 작으면 영원히 안 끝나고, 너무 크면 골짜기를 계속 뛰어넘어 발산합니다. 적당한 값을 찾는 게 실무의 큰 부분이에요.
기울기가 방향과 크기를 동시에 알려줍니다
발밑 경사(기울기)에는 정보가 두 개 들어 있습니다.
- 부호 — 양수면 오른쪽이 오르막이니 왼쪽으로, 음수면 오른쪽으로 가야 합니다.
- 크기 — 가파르면 크게, 완만하면 작게 움직입니다. 골짜기에 가까워질수록 자동으로 조심스러워집니다.
그래서 규칙은 딱 한 줄입니다. "새 위치 = 지금 위치 − 보폭 × 기울기". 빼는 이유는 오르막의 반대로 가야 하기 때문이고요. AI 학습 코드의 심장이 이 한 줄입니다.
진짜 학습은 이런 모습입니다
위에서는 조절할 값이 하나뿐이었습니다. 실제로는 값이 여러 개죠. 두 개짜리로 해봅시다.
점들이 흩어져 있고, 여기에 가장 잘 맞는 직선을 그으려고 합니다. 직선을 정하는 값은 기울기와 높이 두 개. 이 둘을 고쳐가며 손실을 줄이는 게 목표입니다.
직선 맞추기 — AI 학습의 가장 작은 버전
슬라이더 + 자동 학습각 점에서 직선까지의 세로 거리를 제곱해서 평균낸 값입니다. 제곱하는 이유는 위아래 방향에 상관없이 틀린 정도만 재려고요.
방금 조절한 건 숫자 2개였습니다. GPT 같은 모델은 같은 숫자가 수천억 개입니다.
놀라운 건 방법이 조금도 안 바뀐다는 점이에요. 수천억 개 각각에 대해 "이 값을 조금 키우면 손실이 늘까 줄까"를 계산하고, 줄어드는 쪽으로 아주 조금 움직입니다. 이걸 대신 계산해주는 기법이 역전파(backpropagation)이고, 그걸 빠르게 돌리는 하드웨어가 GPU입니다.
수식으로도 보고 싶다면
기호가 낯설 뿐 뜻은 본문 그대로입니다.
w는 고칠 숫자, η(에타)는 학습률(보폭),
∂L/∂w는 "w를 조금 바꿨을 때 손실 L이 얼마나 변하는가" — 즉 기울기입니다.
←는 "이 값으로 새로 덮어써라".
읽으면 이렇게 됩니다. "고칠 숫자에서, 보폭 곱하기 기울기만큼 빼라." 논문에서 이 줄을 보시면 이제 그냥 지나칠 수 있습니다.
- 학습 = 얼마나 틀렸는지(손실)를 재고, 그게 줄어드는 방향으로 숫자를 조금 고치기의 반복.
- 방향은 기울기(미분)가 알려주고, 얼마나 갈지는 학습률(보폭)이 정한다. 보폭이 너무 크면 발산한다.
- 공식은 한 줄 — "새 값 = 지금 값 − 보폭 × 기울기". 숫자가 수천억 개여도 똑같다.
10전체 정리
여기까지 오셨다면 아래 표가 전부 읽힙니다.
| 이름 | 쉬운 말로 | 기억할 그림 | 어디에 쓰나 |
|---|---|---|---|
| 벡터 | 순서대로 묶은 숫자들 | 화살표 하나 | 단어·문장을 저장하는 방식. AI 안의 모든 값 |
| 길이 ‖v‖ | 화살표가 얼마나 긴지 | 자로 잰 길이 | 정규화, 값이 폭주하지 않게 관리 |
| 회전 | 길이는 그대로, 방향만 바꾸기 | 시계바늘 | 모든 이야기의 출발점. 그리고 RoPE |
| 사원수 | 축(3개)과 각도(1개), 합쳐서 숫자 4개 | 문의 경첩과 열린 각도 | 3D 게임, 로봇, 드론. 내적·외적의 뿌리 |
| 내적 a·b | 같은 자리끼리 곱해서 다 더한 숫자 하나 | 상대가 내 쪽에 드리운 그림자 | 닮은 정도 판정 — AI의 거의 모든 계산 |
| 외적 a×b | 둘 다에 수직인 새 화살표 | 평행사변형과 그 넓이 | 3D 그래픽의 면 방향·조명, 물리의 회전력 |
| 코사인 유사도 | 길이 영향을 지운 내적 (−1~1) | 두 화살표 사이 벌어진 각 | 검색, 추천, RAG의 "비슷한 것 찾기" |
| 어텐션 | 어느 단어를 얼마나 볼지 정하기 | 도서관에서 책 고르기 | ChatGPT를 포함한 요즘 AI의 핵심 부품 |
| RoPE | 순서를 각도로 심기 | 단어마다 조금씩 돌린 시계 | 요즘 언어 모델의 표준 위치 인코딩 |
| 합의 법칙 | 동시에 일어날 수 없으면 더한다 | 기차 아니면 비행기 | 내적의 "더하기", 행렬의 합 |
| 곱의 법칙 | 연달아 일어나 둘 다 해야 끝나면 곱한다 | 상의 고르고 하의 고르기 | 내적의 "곱하기", 행렬의 곱 |
| 행렬 곱 | 지시서를 연달아 적용 = 칸마다 내적 | 공간을 찌그러뜨리는 규칙 | 신경망의 층. GPU가 하는 일의 대부분 |
| softmax | 점수를 합이 1인 확률로 바꾸기 | 제각각인 점수 → 백분율 | 다음 단어 고르기, 어텐션 비율, temperature |
| 경사하강법 | 틀린 게 줄어드는 쪽으로 조금씩 고치기 | 안개 속에서 발밑 보고 하산 | 모든 AI 학습. 이것 말고 다른 방법이 거의 없다 |
① AI가 "두 개가 비슷한가"를 판단할 때 쓰는 자는 사실상 내적 하나뿐이다.
② 정보를 망가뜨리지 않고 무언가를 얹고 싶을 때 쓰는 도구는 회전이다.
③ 그 안의 숫자들은 전부 "틀린 만큼 조금씩 고치기"의 반복으로 정해졌다.
그리고 ①과 ②는 원래 같은 뿌리에서 나왔습니다. 그게 3장의 사원수였고요. ①의 "곱하고 더한다"가 왜 그런지는 4장의 두 법칙이 답합니다.
180년을 한 문단으로
1843년 해밀턴이 "공간에서도 회전을 곱셈으로 하고 싶다"는 욕심 하나로 사원수를 만듭니다. 그 곱셈 안에는 스칼라부와 벡터부가 같이 들어 있었죠. 1880년대 기브스와 헤비사이드가 이 둘을 떼어내 내적과 외적이라는 독립된 도구로 만듭니다. 1950년대 이후 컴퓨터가 등장하면서 내적은 "숫자 묶음끼리 얼마나 닮았는지 재는 도구"로 재발견되고, 2017년 트랜스포머 논문이 그 내적 위에 어텐션을 세웁니다. 그리고 요즘 모델은 위치 정보를 심는 데 다시 회전을 꺼내 씁니다(RoPE). 한 바퀴 돌아 제자리로 온 셈입니다.
문장 하나가 AI를 통과하는 과정
배운 순서와는 조금 다르게, 실제 동작 순서로 정리하면 이렇습니다.
- 단어 → 벡터토큰 하나하나를 숫자 묶음으로 바꿉니다. (1장)
- 위치 정보 심기몇 번째 단어인지에 따라 벡터를 돌려둡니다. (2·7장)
- 서로 참고하기내적으로 점수를 내고, 확률로 바꿔, 그 비율대로 섞습니다. (5·6·8장)
- 변환하고 반복하기행렬을 곱해 다른 공간으로 옮기는 걸 수십 층 되풀이합니다. (4·5장)
- 다음 단어 고르기마지막 점수들을 확률로 바꿔 하나를 뽑습니다. (8장)
- 틀리면 고치기정답과 비교해 손실을 재고, 모든 숫자를 조금씩 수정합니다. (9장)
이 여섯 단계가 전부 아는 말로 읽히신다면 목표 달성입니다. 트랜스포머 논문이나 모델 코드를 열어도 이제 완전히 낯설지는 않을 거예요.
해당 내용을 통해 Transformer 모델을 이해하는 데 필요한 기초 수학적 개념들을 이해하는데 도움이 되셨으면 좋겠어요.
감사합니다.
'AI > [LLMSO] Hands-On LLM 서빙과 최적화 스터디' 카테고리의 다른 글
| [1주차-LLMSO]LLM 기초 동작 원리 (2026.08.02) (0) | 2026.08.08 |
|---|---|
| [1주차-LLMSO]CH2. Large Language Model Serving (2026.08.02) (0) | 2026.08.08 |
| [1주차-LLMSO]CH1. Introduction to Model Serving and Optimization (2026.08.02) (0) | 2026.08.08 |