이번 2 주 간에는 deep learning 프로젝트를 진행하였다. 내가 속한 정글 12기에 처음으로 도입한 프로젝트로, 여러 우여곡절이 있었으나 마지막 까지 완수를 해낼 수 있었다. 프로젝트는 교재를 읽고 무엇을 구현할 지 지침이 적혀있었으나, 방대한 내용 중 이해할 범위를 정하고 학습 우선순위를 정하는 것은 나와 팀원들이 개척해야 할 사항이었다. 이번 프로젝트를 진행하면서 얻은 지식과 개념에 대해 서술을 해보고자 한다.
딥러닝은 수학적 이론에 근거한다
흔히 AI, 특히 요즘 생각하는 gpt와 같은 LLM 모델에서 자연스럽게 글이 생성이 되는 모습을 보고 "스스로 생각하고 말하는구나"라고 생각을 할 수 있다. 하지만, 복잡해 보이는 컴퓨터가 구동원리가 이진법으로 모든 계산을 표현할 수 있다는 증명인 만큼, AI(정확히는 deep learning)도 밑바탕이 되는 수학적 이론이 존재한다.
근사 이론(Approximation Theory)
앞의 이진법이 컴퓨터의 밑바탕이 되었듯, 이 이론이 오늘날 deep learning의 기초가 되는 이론이다. 이 이론의 핵심은 충분한 노드(Node)가 존재한다면, 그 어떤 복잡한 곡선(혹은 함수)라 해도 유사하게 흉내를 낼 수 있다는 것이다. 또한, 우리가 알고 있는 다양한 사건/사고도 수학적 수식으로 나타낼 수 있다.
고차원 공간에서의 벡터(Vector)
근사 이론을 적용하려면, 다차원(3차원 이상)의 공간에서의 위치 벡터가 필요하다. 다차원의 각 축은 "권위성", "위험도", "친절도"와 같이 수치화가 가능하며, 특정 위치 벡터로 표시된 사물은 축에 따라 성질이 적용된다. 여기서 사물(단어)들은 LLM에서 학습을 진행하면서 특정 공간에 규칙적으로 자리를 잡게 된다.
벡터 공간에서의 규칙

그럼 이 초공간에서 사물들은 어떻게 위치하게 될까? 간단한 2차원 공간을 예시로 하여 설명을 해보고자 한다. 이 공간에는 King, Queen 그리고 Man, Woman이라는 4개의 사물이 있다. 단어들이 내포한 뜻을 보면, Man에서 무언가의 권위/권력을 반영하면 이는 King, 여성의 경우에도 동일하게 적용됨을 알 수 있다. 즉 이 4개 사물은 king - man 벡터가 적용이 되는 규칙이 형성되며, 초 공간에서는 이보다 더 복잡하고 정교하다.
학습은 미분을 통해 이루어 진다
처음 생성된 모델의 벡터값들은 렌덤하고 엉망에 가깝다. 그러나 모델이 학습을 하면서 위의 내용과 같이 규칙을 형성하게 된다. 그렇다면 학습은 어떻게 이루어 질까? 먼저 LLM은 forward라는, 순전파를 통해 답을 내놓는다는 것을 알 필요가 있다. 물론, 초기인 만큼 추론한 답(예측한 확률값)은 정답과 오차가 매우 클 것이다. 이러한 정답과 추론한 답과의 갭을 산출하는데 이를 Loss(손실)라고 한다.
다음에는 이 Loss를 통해 bakward, 이른바 역전파를 실행한다. 역전파는 신경망이 답을 내놓을 때와 다른 역 방향으로 흐르는데, 단순히 흐를 뿐만 아니라, 각 신경세포가 오답에 얼마나 기여했는지 미분을 통해 계산을 하고, 이(gradient)를 바탕으로 사물의 벡터값이 조정을 하게 된다. 이러한 순전파/역전파를 반복하면서 벡터값은 점진적으로 위의 내용과 같은 규칙을 형성하게 된다.

오차 지형(Loss Landscape)

오차(Loss)는 단조로운 점수표 보단, 위의 그림처럼 다차원 초공간에서 마치 지형도와 같은 형태를 띈다. (다만, 위의 그림은 3차원으로 압축하였다) 여기서 높은 곳은 오차 값이 큰 곳이고, 반대로 낮은 곳은 작은 곳인데, 오차가 작은 쪽으로 가중치(W)라는 요소를 옮겨야 한다. (가중치는 다음 소제목에서 설명) 그럼 가중치는 어떻게 옮겨야 할까? 학창시절, 미분을 통해 주변 경사도를 측정할 수 있음을 배웠었다. 현재 위치한 가중치는 주변 경사도를 측정하여, 점진적으로 낮은 곳으로 이동하는 것이 모델의 학습으로 이어진다.
가중치(Weight)
신경망에는 무수히 많은 신경 세포(Node)가 존재하는데, 각 세포는 y = wx + b 라는 1차 방정식 형태를 띈다. 이 단조로운 1차 방정식으로는 당연히 복잡한 학습이 되지 않으며, 수 천억 개의 세포의 상호작용(행렬 연산)을 통해 진행이 된다. w는 여기서 말한 가중치이며, 오차 지형을 기반으로 하여 수 많은 가중치 요소가 재조정 되고, 이는 사물의 벡터가 다차원 공간에서 규칙을 형성하도록 해준다.
문맥을 파악하기 위한 기법: Attention(어텐션)
AI가 글을 생성을 하려면, 문장 내 단어의 뜻을 이해를 해야 한다. 그러나, 사람의 언어는 한 단어가 문맥에 따라 각기 다른 의미를 내포하는 경우가 태반이다. 그러나 기존 deep learning은 문맥 파악에 어려움이 컸었다. 예를 들어 이 문장을 보자:
배가 많이 평퍼짐하다
뜻 1: 신체의 배가 평평하다는 체형에 대한 평가 의견
뜻 2: 과일 배의 모양이 통상적이지 않다는 의견
이렇게 두 가지 의미로 문맥에 따라 판단이 가능하다. 기존 딥러닝은 각 단어에 고정된 하나의 벡터만 주어지도록 하였으나, 이런 방식으로는 문맥의 입체성을 나타내기에 한계가 있었다. 그래서, 기존 고정된 벡터에 문장이 들어올 때마다 시시각각 산출되는 임시 벡터 추가로 만들어 내는 방식을 고안했는데 이 방법이 attention이다.

위의 이미지는 하나의 문장 내에서 단어가 각 단어들 간의 관계를 파악하는 Attention을 표현한 도식도이다. 위의 이미지에서 알 듯, 연산량은 문장 길이의 제곱에 비례한다. (따라서 길이 조절에 신경을 써야 한다) Attention 연산에는 가중치 행렬을 필요로 하는데, 질문 상태인 Query(Q), 적합성을 판단하는 Key(K), 단어 간 유사도를 측정하는 Value(V), 3개의 벡터가 있다. 이 벡터들이 고정된 벡터(임베딩 벡터)에 가중치를 적용하여 문맥에 따른 위치 변경을 한다.
이렇게 시시각각으로 각 문맥에 따라 단어의 벡터 값이 변경이 되고, 이를 통해 다차원 공간에서 벡터는 규칙을 띄게 된다. 다음 단락에서는 이 규칙을 통해 무엇이 산출되는지 알아보고자 한다.
다음 단어를 확률적으로 생성된다
가스 누출이 발생했으니 신속히 .. 라는 문장이 있다고 가정해보자. LLM은 이 문장 단어를 순차적으로 읽으면서(forward) 문맥에 따라 가중치가 적용된다. 이렇게 가중치가 적용되다가 마지막 단어 "신속히"에서는 앞의 단어들의 모든 맥락을 함축한 벡터값이 나타나게 된다.
내적(Dot Product)을 통한 단어 선출
이렇게 마지막에 산출된 벡터값은 해당 LLM 모델이 보유한 단어 사전(예: 5만 단어)의 고유 좌표와 비교한다. 정확히는 내적이라는 연산을 통해, 두 벡터가 얼마나 가까운 방향을 가리키는지 찾는 것이다. 이 연산을 통해 5만개의 단어의 점수가 쭈욱 산출된다. 아마 이 예시 문장이라면 "대피소로", "대피"와 같은 단어가 가장 높은 점수를 가질 것이다. 여기서 LLM은 확률에 기반하여 다음 단어를 선택한 다음 next 주기로 넘어간다.
| 단어 | 연산점수(Logit) | 최종 확률(Softmax) |
| 대피 | 12.5 | 65.2% |
| 대피소로 | 11.2 | 17.8% |
| 밖으로 | 9.8 | 4.4% |
| ... 나머지 단어들(5만 개) | ... 다머지 점수들 | ... 나머지 확률들 |
LLM은 생각을 하는 기계일까..?
이렇게 학습을 진행하면서 고찰을 하다보면, 통상적으로 우리가 생각하는 AI는 생각을 하는 기계라기 보다는, 좀 더 복잡하고 정교한 수학 연산을 기계라는 것을 느낄 수 있다. 기존 사람의 언어에서의 패턴을 찾고, 방정식을 통해 연산을 하여 확률적으로 단어를 내놓기 때문이다. 생각이란, 각 개념에 대한 사유화, 혹은 가치 판단이 필요하다. 하지만 LLM의 다차원 공간 내의 벡터값은 또 다른 숫자값에서 이상의 의미를 가지기 힘들다.
사실 이번 프로젝트를 진행하면서, LLM이 "생각을 하는 것이 아니다"라는 내용을 통해 기대치가 낮아지지는 않았다. 오히려, 창의적이고 예측 불가능하다고 생각했던 언어가, 복잡한 수학적 연산을 통해 구현이 가능함에 놀라움을 자아냈고, 추후 더 기회가 닿는다면 더 깊게 파보고 싶다는 동기가 마음 한 구석을 차지하게 되었다.
이번 글은 여기서 마치고자 한다. 긴 글 읽어주신 분들께 감사의 말씀을 드린다. 그럼 끝!
'크래프톤 정글 > WIL' 카테고리의 다른 글
| 정글[Week_17-21]: PC 서비스 플랫폼 설계기(上) (3) | 2026.07.15 |
|---|---|
| 정글[Week_11-12]: Pintos의 VM 구현하기 (0) | 2026.05.21 |
| 정글[Week_10]: Pintos의 프로세스의 생애 주기 구현하기 (0) | 2026.05.07 |
| 정글[Week_09]: Pintos의 스레드 알고리즘을 설계하다 (4) | 2026.04.30 |
| 정글[Week_08]: 소켓으로 간단한 서버(tiny•proxy) 만들기 (2) | 2026.04.23 |