2장 후반부의 위치 정보를 임베딩 벡터로 변환하는 과정을 공부하면서 떠오른 질문들을 정리했습니다.

1. 왜 이어붙이지 않고 더할까? 초고차원 공간에 정보를 구겨 넣는 방법
- 질문
- 왜 토큰과 위치 벡터를 "덧셈"으로 합치나?
- 페어(Concatenation) 방식의 가능성: 두 벡터를 옆으로 붙여 정보를 온전히 보존하는 방법은 없는지?
- 대안 탐색: 덧셈 외에 위치 정보를 반영하는 다른 방법이 존재하는지?
- 답변 요약: 효율성과 수학적 특성을 고려한 선택
- 덧셈 vs 이어붙이기
- 효율성: 이어붙이기는 차원을 2배로 늘려 모델 크기와 연산량을 크게 증가시키지만, 덧셈은 차원을 유지함.
- 중첩(Superposition): 고차원 공간에서는 두 벡터를 더해도 모델이 각각의 정보를 분리해서 인식할 수 있음.
- 발전된 대안
- 학습 가능/고정 위치 임베딩: 절대적 위치를 벡터화하여 더하는 방식 (BERT 등).
- 회전 위치 임베딩(RoPE): 벡터를 회전시켜 상대적 거리를 학습함 (Llama 등 최신 모델 표준).
- 상대적 위치 인코딩: 토큰 간의 거리에 집중하여 어텐션에 직접 반영함.
- 덧셈 vs 이어붙이기
- 추가 질문: 고차원 중첩(Superposition)의 원리와 정보 분리
- 질문: 덧셈으로 합쳐진 벡터에서 어떻게 정보를 잃지 않고 분리하나?
- 산술적 의문: (1, 3, 2) + (2, 1, 4) = (3, 4, 6)이 되면 원본 숫자를 알 수 없지 않나?
- 정보 손실 우려: 섞여버린 값에서 "사과"라는 의미와 "4번째"라는 위치를 구분하는 메커니즘은 무엇인가?
- 답변: 고차원의 기하학적 특성과 가중치의 필터링
- 근사적 직교성(Near Orthogonality): 768차원 이상의 고차원에서는 무작위로 뽑은 두 벡터가 서로 수직일 확률이 매우 높음.
- 따라서 의미 벡터와 위치 벡터는 서로 간섭하지 않는 독립적인 "축"처럼 존재함.
- 가중치의 필터링 역할: 모델의 가중치 행렬이 특정 정보만 통과시키는 "색깔 안경(Projection)" 역할을 수행함.
- 학습을 통해 의미 정보만 추출하거나 위치 정보만 추출하는 법을 스스로 익힘.
- 노이즈 감내: 일부 간섭(Interference)이 발생하더라도, 고차원 공간은 이를 무시하고 핵심 정보를 추출할 수 있을 만큼 충분히 넓음.
- 근사적 직교성(Near Orthogonality): 768차원 이상의 고차원에서는 무작위로 뽑은 두 벡터가 서로 수직일 확률이 매우 높음.
- 질문: 덧셈으로 합쳐진 벡터에서 어떻게 정보를 잃지 않고 분리하나?
처음 위치 정보를 변환한다고 할 때 기존 토큰 벡터가 담고 있는 의미 정보와 함께 붙여서 학습시킬 것이라 예상했습니다. 그러나 제 예상과 다르게 두 벡터를 더해서 최종 입력 벡터를 구성했는데요. 이 부분에서 떠오른 의문을 Gemini에게 물어보고 정리했습니다.
새롭게 알게된 정보 중 초고차원에서 중첩(Superposition) 개념이 가장 인상깊었습니다. 3차원 공간으로 차원을 축소시켜서 상상할 때는 위치 벡터와 토큰 벡터를 더하면 정보 손실이 크다고 생각했는데, 초고차원에서 임의의 두 벡터가 직교할 확률이 높다는 게 쉽게 이해하기 어려워서 흥미로웠습니다. Gemini의 답변을 들으면서 예전에 수학 유튜브로 유명한 12math님의 영상이 떠올랐습니다. 고차원 데이터에서 일어나는 차원의 저주에 대해 직관적으로 이해할 수 있는 그림과 함께 설명한 영상입니다.
2. 절대 경로 대신 상대 경로: LLM이 "거리"를 인지하는 다양한 방법
- 질문
- 상대 위치 임베딩에서 기준은 무엇인가? 어떤 단어를 기준으로 상대적 관계를 정의하지?
- 상대 위치 임베딩은 "모델의 길이가 다른 시퀀스에도 일반화"될 수 있다는데 이게 무슨 뜻인지?
- "사과"라는 단어를 상대 위치 벡터로 변환하면 단순히 "사과"의 위치가 아니라 "사과"와 주변 모든 단어 간의 위치 관계 정보를 담는거야?
- 답변 요약
- 상대 위치 임베딩의 개념 및 측정 기준
- 기준점: 특정 단어에 고정된 주소를 부여하는 대신, 현재 연산을 수행 중인 자기 자신(Query)을 기준으로 삼음.
- 핵심 메커니즘: 두 토큰 사이의 상대적 거리(Distance)를 어텐션 연산 과정에 동적으로 주입함.
- 시퀀스 길이 변화와 일반화(Generalization)
- 시퀀스 길이의 의미: 모델이 한 번에 처리하는 컨텍스트 윈도우(Context Window)의 크기를 의미함.
- 일반화의 이점: 절대 주소(예: 512번지)를 학습하는 것이 아니므로, 훈련 시의 컨텍스트 윈도우보다 긴 문장이 들어와도 거리 관계를 이용해 무리 없이 처리 가능(Extrapolation, 외삽성).
- 사과의 상대 위치 벡터의 본질
- 동적 관계 정보: 특정 단어에 귀속된 고정 벡터가 아니라, 주변의 모든 단어와 맺는 거리들의 집합(간선 정보)에 가까움.
- 개발자적 비유: 파일 시스템의 절대 경로가 아닌 상대 경로와 같으며, 누가 누구를 참조하느냐에 따라 값이 결정됨.
- 현대적 표준: RoPE (Rotary Positional Embedding)
- 회전 방식: 벡터를 거리에 따라 특정 각도로 회전시켜 위치를 표현하며, Llama 등 최신 모델에서 성능과 효율을 위해 채택함.
- 상대 위치 임베딩의 개념 및 측정 기준
책에서 GPT는 훈련 과정에서 최적화되는 절대 위치 임베딩을 사용한다고 합니다. "훈련 과정에서 최적화"된다는 말의 의미는 다음 질문에서 해결하고, GPT 외에 상대 위치 임베딩 변환에 대해 먼저 알아보았습니다.
"상대 위치"라 함은 기준이 있고, 그것에 대해 상대적인 위치인데 그 기준이 무엇인지 궁금했습니다. Gemini의 대답으로 자기 자신이 곧 기준이라고 하는데 그렇다면 "나"의 상대 위치라기보다는 "나"를 기준으로 주변 모든 단어들의 상대 위치 정보를 담고 있는 벡터가 좀 더 정확한 설명이 아닐까 합니다. 제가 이해한 상대 위치 임베딩이 본질과 다소 떨어진 것 같은 느낌도 들지만 일단 넘어가고 나중에 다시 알아보겠습니다.
3. 왜 GPT는 위치 정보조차 가중치로 학습할까? 최적화의 의미
- 질문
- GPT는 훈련 과정에서 최적화되는 절대 위치 임베딩을 사용한다는데 "훈련 과정에서 최적화된다"는 게 무슨 뜻인지?
- 원본 트랜스포머 알고리즘은 어떤 위치 임베딩을 쓰지?
- 답변 요약
- GPT의 "학습 가능한 절대 위치 임베딩" 방식
- 가중치 최적화: 위치 정보를 "업데이트 가능한 가중치(Weights)"로 취급하여, 훈련 과정(역전파)을 통해 값을 스스로 수정함.
- 데이터 적응: 고정된 규칙이 아니라 "실제 데이터의 특성"에 맞춰 문맥 파악에 가장 유리한 위치 좌표를 모델이 직접 찾아감.
- 원본 트랜스포머의 "고정된 사인 함수" 방식
- 수학적 설계: 미리 정의된 "사인(Sine)"과 "코사인(Cosine)" 함수를 사용하여 위치별로 고유한 값을 상수로 할당함.
- 비훈련성: 모델이 학습한다고 해서 값이 변하지 않는 "정적 테이블"이며, 별도의 파라미터가 추가되지 않음.
- 두 방식의 핵심 특징 비교
- 성능과 비용: 학습 방식(GPT)은 데이터가 많을 때 성능이 더 좋지만, "학습해야 할 파라미터"가 늘어난다는 트레이드오프가 있음.
- 공통 한계: 두 방식 모두 "절대 주소" 개념을 사용하므로, 훈련 시 정해둔 최대 길이보다 긴 문장이 들어오는 상황에는 취약함.
- GPT의 "학습 가능한 절대 위치 임베딩" 방식
앞서 이야기한 "훈련 과정에서 최적화되는 절대 위치 임베딩"이 정확히 무슨 의미인지 확인했습니다. Gemini의 답변을 듣고 제가 짐작한 이미지는 토큰 임베딩 단계에서 최초로 설정한 가중치 행렬이 학습을 진행하면서 자리를 잡아가듯이 절대 위치 임베딩에 대한 가중치 행렬도 마찬가지로 학습을 진행하면서 조정되는 것입니다.
원본 트랜스포머 알고리즘은 어떤 위치 임베딩 방식을 사용하는지 궁금해서 물어봤습니다. 마찬가지로 절대 위치 임베딩을 사용한다고 하지만 구체적인 방식에 대해서는 쉽게 이해하기 어려웠습니다. 일단 현 단계에서는 요약으로 정리해두고 책을 읽으면서 얻은 정보를 토대로 나중에 다시 확인해보겠습니다.
4. 고정 크기 버퍼의 한계: LLM이 긴 문장을 조각내어 읽는 법
- 질문
- 컨텍스트 윈도우보다 긴 텍스트는 어떻게 "잘라서" 적용하나?
- 구현적 의문: 위치 임베딩 층의 크기는 정해져 있는데, 이를 초과하는 인덱스가 들어올 때의 구체적인 처리 메커니즘은?
- 단계별 차이: 훈련(Training) 시의 데이터 구성과 추론(Inference) 시의 처리 방식이 다른지?
- 답변 요약: 단계에 따른 "분할(Chunking)"과 "절단(Truncation)" 전략
- 훈련 단계 - Chunking:
- 파이토치의 DataLoader를 사용하여 전체 텍스트를 컨텍스트 윈도우 단위로 끊어서 여러 개의 배치 데이터로 만듦.
- 모델은 항상 정해진 길이(컨텍스트 윈도우) 안에서만 위치를 인식함.
- 추론 단계 - Truncation:
- 사용자의 입력이 모델이 감당할 수 있는 길이를 넘어서면, 앞이나 뒷부분을 강제로 도려내어 컨텍스트 윈도우에 맞춤.
- 이는 "IndexError"를 방지하고, 훈련 때 본 적 없는 위치(주소)에 대한 연산을 피하기 위한 필수적인 조치임.
- 훈련 단계 - Chunking:
절대 위치 임베딩을 파이토치로 구현하는 코드에서 컨텍스트 윈도우보다 더 긴 길이의 입력이 들어왔을 때 어떻게 대응하는지 짧은 설명이 있습니다. 아쉽게도 간략히 "잘라서" 사용한다는 말 외에 설명이 없어서 Gemini에게 더 자세한 구현 방식을 확인했습니다.
일단 훈련과 추론 관점에 따라 다른 처리 방법이 필요한 것으로 이해했습니다. 훈련 시에는 책에 나온 실습 코드처럼 컨텍스트 윈도우만큼 문장을 잘라서 학습시키고, 추론 시에는 감당할 수 있는 윈도우까지만 사용하는 것으로 이해했습니다. 다만 책에서 언급한 컨텍스트 윈도우는 훈련 시에 한정한 의미일 것 같은데 그렇다면 이미 컨텍스트 윈도우 길이로 잘라져 있는 예시 코드에 대해 왜 그런 이야기를 했는지 이해가 안되어 의문으로 남아있습니다.
마치며
처음엔 "왜 굳이 위치 벡터 정보를 더해서 섞어버릴까?"라는 의문으로 시작했지만, 초고차원 공간의 중첩(Superposition) 원리를 이해하고 나니 그것이 정보의 손실이 아닌 효율적인 압축이라는 사실이 흥미로웠습니다. 3차원의 직관을 벗어나 초고차원의 공간에서 일어나는 일은 내 상상으로 쉽게 짐작할 수 없음을 다시 한 번 인지했습니다.
그 외에도 GPT의 "학습 가능한 임베딩"부터, 나를 기준으로 주변을 바라보는 "상대 위치 임베딩"까지 살펴보며, LLM이 위치 정보를 다루는 방법도 조금씩 윤곽이 잡혔습니다. 다음 글에서는 이 벡터들이 서로의 중요도를 계산하며 문맥을 완성하는 LLM의 어텐션(Attention) 메커니즘을 본격적으로 파헤쳐 보겠습니다.
'기술' 카테고리의 다른 글
| 흩뿌려진 단어 간의 인력과 척력: 랜덤한 좌표가 문맥을 이해하는 과정 (0) | 2026.01.02 |
|---|---|
| LLM 기초 해부: 토크나이저부터 단어 임베딩의 동적 분화까지 (0) | 2025.12.24 |
| 그래서 모나드가 뭔데? 타입 확장과 함수 합성의 관점에서 바라보기 (0) | 2025.12.18 |
| Kotlin JPA의 Entity에 val 필드를 사용해도 될까? (0) | 2025.12.18 |
| Kotlin에서 JPA 설정하기 총정리 (0) | 2025.12.18 |