임베딩을 오해하며 이해하기

이전 글에서 RAG를 위한 자료창고에는 자료를 ‘의미적으로 완결된 덩어리(chunk)’로 쪼개서 저장하며,
이 한 덩어리가 하나의 숫자벡터로 표시되는 임베딩의 단위가 된다고 했었다.

※ 임베딩은 텍스트, 이미지 등 사람이 사용하는 복잡한 데이터를 컴퓨터가 이해하고 처리할 수 있도록 숫자의 나열인 벡터로 변환하는 기술로서, 핵심은 데이터 간 의미적 관계와 유사성을 벡터 공간에 배치하는 것이다.

숫자벡터라는 단어를 보니,
아, 선형대수 공부를 진작 다시 했어야 하는데.. 여태 뭐한 거지 싶었다.
그런데 지금 내 공부를 도와주고 있는 클로드가
이번 워크스루 중에는 “왜 그렇게 되는지” 증명까지는 필요 없고,
벡터·유사도·클러스터링 정도의 직관만 있으면 충분하다고 했다.
그 직관을 “왜 그런지” 증명 수준으로 이해하고 싶을 때, 선형대수를 따로 공부하면 된다고.

그러네.. 선형대수를 먼저 다 공부하고 실습하는 평소 하던 대로의 순서로 했다면,
선형대수 공부를 하는 동안 이걸 대체 왜 공부하고 있는지
늘어지다가 중간에 포기할 거 같다.
실습을 통해 벡터가 왜, 어떤 식으로 필요한 건지 직관을 먼저 얻고 나면,
선형대수 책을 진득이 들고 있기가 훨씬 수월할 거라는 얘기.
그래, 맞아. 그런 이유로 먼저 워크스루를 쭉 해보는 거지.

그래서 오늘은 선형대수 공부 없이 클로드에게 반복해서 물어보고 답변받으며,
임베딩에 대한 잘못된 이해를 바로잡는 방식으로 감을 잡아본 기록이다.

아스키코드와 임베딩을 헷갈리다

의미 단위로 자른 반야심경 각 구절이 숫자벡터로 표시된다는 설명을 보고 맨 처음엔,
아.. 그게 혹시 아스키코드처럼 텍스트를 정해진 규칙에 따라 숫자로 바꿔서 연산할 수 있게 만든다는 얘긴가 싶었다.

“관자재보살”의 ‘ㄱ’을 기계어(아스키코드 같은 것)로 바꾸면 숫자가 나오는 거잖아.
그 숫자들을 글자 순서대로 나열한 게 벡터인가?”

직관적으로 그렇게 찍었는데, 실제로는 완전히 다른 개념이었다.

아스키코드(문자 인코딩)는 “관”이라는 글자를 컴퓨터가 저장·표시할 수 있도록 미리 약속해둔 숫자다.
“관”은 언제나 같은 숫자, “자”도 언제나 같은 숫자 — 글자 하나하나가 독립적으로 미리 약속된 숫자에 매핑될 뿐, 의미는 전혀 담겨 있지 않다.

임베딩은 “관자재보살”이라는 구절 전체를 하나의 벡터로 바꾼다.
미리 매핑되도록 정해진 코드에 따라 숫자들을 나열한 게 아니라,
인공지능 모델이 학습을 통해 “이 구절이 의미공간 어디에 위치하는지”를 계산한 결과다.

그래서 “관자재보살”과 “관세음보살”은 글자가 달라서 아스키코드 나열은 전혀 다르지만,
의미가 같은 구절이므로 임베딩 벡터는 서로 아주 가까울 수 있다.
반대로 “관광버스”는 “관”이라는 글자가 “관자재보살”의 “관”이라는 글자와 겹치는데도,
의미가 전혀 다르므로 임베딩 벡터는 “관자재보살”과 전혀 안 가깝다.

한 문장으로 정리하면,
아스키코드는 글자를 숫자로 약속한 것이고, 임베딩은 의미를 숫자로 학습한 것이었다.
전자는 사전만 있으면 계산 없이 바로 나오고,
후자는 방대한 텍스트를 학습한 인공지능 모델을 거쳐야 나오는 결과였다.

질문의 “의미벡터”와 자료창고 안에 쌓아둔 각 자료의 “의미벡터”가 얼마나 가까운지를 계산해서
질문에 적합한 자료를 뽑아주는 것이 다음 편 글에서 정리할 검색이다.

딥러닝 모델 이해하기 – 노드·가중치 구조

임베딩 벡터가 보통 384개나 768개의 숫자로 이뤄진다고 해서, 처음엔 이렇게 생각했다.

예전에 벡터 공부할 때를 어렴풋이 되짚어 보면..
함수에서 변수 개수가 차원의 개수랑 같고, 각 변수의 가중치를 행렬로 만들어 계산했던 것 같은데.
그럼 노드 개수가 가중치 개수랑 같은거 아닌가? 입력노드=출력노드=384개? 이 384개가 모델의 가중치(parameter) 개수인가?

그렇지만 그게 아니고..ㅎㅎ

딥러닝이라고 하면 보게 되는 그림은 일반적으로 다음과 같다.

딥러닝 모델 그림
딥러닝 모델 – 동그라미가 노드, 노드를 잇는 선이 에지 (그림: 클로드에게 요청해 그린 다이어그램)

가중치 개수는 노드 개수가 아니라 연결선(edge) 개수다.
입력층 노드 3개, 은닉층 노드 4개면 노드는 7개지만, 연결선(=가중치)은 3×4=12개다.
층이 여러 개 겹치고 노드 수가 많아지면 이 연결선 숫자가 기하급수적으로 늘어난다.
“파라미터가 수십억 개”라는 말이 가리키는 게 바로 이 연결선 개수였다.

※ 가중치는 모델 내부에 저장된, 학습 과정에서 조정되는 숫자들로, 모델 크기에 따라 수백만에서 수십억 개가 있다.

384개는 맨 마지막 출력층의 노드 개수인데, 모델 설계자가 “이 모델의 최종 출력은 384차원으로 하겠다”고 정해놓는 거란다.
입력된 문장 등은 모델에 넣기 전에 먼저 숫자로 바꾸는 토큰화 과정을 거치는데, 이때 입력 노드 개수는 문장 길이 등에 따라 달라지는 거고.

아이.. 소싯 적엔 수학 좀 했었는데.. 영 기억이 없다. 쩝.
빨리 복습을 해야겠는데..

다음 편(검색·생성 파이프라인 완성 편)에서는 이렇게 만들어진 벡터로 실제 검색과 생성까지의 이야기로 넘어간다.

Q. 임베딩이란 무엇인가요?

A. 임베딩은 텍스트, 이미지 등 사람이 사용하는 복잡한 데이터를 컴퓨터가 이해하고 처리할 수 있도록 숫자의 나열인 벡터로 변환하는 기술입니다. 핵심은 단순히 데이터를 숫자로 바꾸는 게 아니라, 데이터 간의 의미적 관계와 유사성을 벡터 공간 안에 배치하는 데 있습니다.

Q. 임베딩과 아스키코드(문자 인코딩)는 어떻게 다른가요?

A. 아스키코드는 글자 하나하나를 미리 약속된 숫자에 매핑하는 것으로, 같은 글자는 언제나 같은 숫자로 변환되며 의미는 전혀 반영되지 않습니다. 반면 임베딩은 구절이나 문장 전체를 인공지능 모델이 학습을 통해 계산한 하나의 벡터로 변환합니다. 그래서 글자가 완전히 달라도 의미가 같으면 임베딩 벡터는 서로 가깝게 위치하고, 반대로 글자 일부가 겹치더라도 의미가 다르면 벡터는 멀리 떨어지게 됩니다.

Q. 딥러닝 모델에서 파라미터(가중치) 개수는 노드 개수와 어떻게 다른가요?

A. 파라미터(가중치) 개수는 노드의 개수가 아니라 노드와 노드를 잇는 연결선(edge)의 개수를 의미합니다. 예를 들어 입력층 노드가 3개이고 은닉층 노드가 4개라면, 노드는 총 7개지만 두 층 사이의 연결선은 3×4=12개가 됩니다. 층이 여러 개 겹치고 노드 수가 늘어날수록 이 연결선 개수는 기하급수적으로 증가하는데, 흔히 말하는 “파라미터가 수십억 개”라는 표현은 바로 이 연결선 개수를 가리킵니다.

Q. 임베딩 벡터가 384개나 768개의 숫자로 이루어진다는 건 무슨 의미인가요?

A. 이 숫자는 모델의 출력층 노드 개수, 즉 모델 설계자가 정해놓은 최종 출력 차원 수를 의미합니다. 반면 입력 노드 개수는 고정되어 있지 않고, 문장을 숫자로 바꾸는 토큰화 과정을 거치면서 입력된 문장의 길이 등에 따라 달라집니다.

Q. AI를 공부할 때 선형대수를 먼저 공부해야 하나요?

A. 반드시 그럴 필요는 없습니다. 임베딩 같은 개념을 이해하는 데는 벡터·유사도·클러스터링 정도의 직관만 있어도 충분하며, “왜 그렇게 계산되는지”를 증명 수준까지 이해하고 싶을 때 선형대수를 별도로 공부해도 늦지 않습니다. 오히려 이론부터 완주한 뒤 실습에 들어가는 순서보다는, 실습을 통해 벡터가 왜 어떤 식으로 필요한지 직관을 먼저 얻고 나서 이론서를 펼치는 편이, 이론공부 중간에 “내가 지금 이걸 왜 공부하고 있는지” 헷갈려서 포기하게 되는 상황을 줄여줍니다.

관련 글 보기