1P by GN⁺ 8시간전 | ★ favorite | 댓글 1개
  • 고차원 임베딩 공간에서는 완전한 직교성 대신 준직교(quasi-orthogonality) 를 활용해 수많은 개념 표현이 가능함
  • Johnson-Lindenstrauss 보조정리는 임의의 고차원 데이터를 정보 손실 거의 없이 낮은 차원으로 투영할 수 있음을 보장함
  • 최적화 과정에서는 손실 함수의 설계가 중요한데, 기본 손실 함수로 인해 비효율적이거나 편향된 벡터 배치가 발생할 수 있음
  • 실험 결과, 임베딩 공간의 실제 용량은 이론적으로 추측했던 것보다 훨씬 크며, 수백만~수십억 개의 개념이 자연스럽게 공존할 수 있음
  • 이러한 발견은 자연어처리, 임베딩 설계 등 머신러닝 실무에서 데이터 표현, 차원 축소에 큰 실용적 의미를 가짐

서론: 언어 모델 임베딩 공간의 용량에 관한 질문

최근 3Blue1Brown의 트랜스포머 모델 영상 시리즈에서, Grant Sanderson는 GPT-3의 12,288차원 임베딩 공간에 어떻게 수백만 개의 현실 세계 개념을 담을 수 있는가라는 흥미로운 질문을 제기함
이 의문점은 고차원 기하학Johnson-Lindenstrauss(JL) 보조정리라는 수학적 결과와 연결됨
이를 탐구하는 과정에서 벡터 공간의 근본적 성질과 최적화에 관한 새로운 통찰을 얻게 되었으며, Grant와의 협업까지 이어짐

벡터의 준직교성과 임베딩 공간의 용량

  • N차원 공간에는 N개의 완전히 직교한 벡터만 존재
  • 실제로 90도에서 약간 벗어난 준직교(quasi-orthogonal) 관계(예: 85~95도 각도)를 허용하면, 같은 공간에서 표현 가능한 벡터 개수가 기하급수적으로 증가함
  • Grant의 영상에서 100차원 공간에 1만 개의 단위 벡터가 거의 직교에 가깝게 배치되는 시각화를 선보임
  • 그러나 동일한 실험을 재현하는 과정에서 최적화 손실 함수 설계의 미묘한 함정이 발견됨

손실 함수의 문제점과 패턴

  • 기본 손실 함수:
    loss = (dot_products.abs()).relu().sum()
  • 실제 유닛 스피어 상에서 이 손실 함수는 두 가지 문제가 발생함
    1. Gradient Trap: 벡터 각도 90도에 접근하면 그라디언트가 강하게 작동하지만, 0도나 180도 근처에선 그라디언트가 거의 0에 가까워 개선이 막힘
    2. 99% 해결책: 최적화 기법은 1만 개 벡터 중 각 벡터가 9,900개와는 제대로 직교하지만 99개와는 거의 평행한 배치(즉, 기준 벡터의 복제)로 전체 손실을 최소화함
  • 이 해법은 전체적으로 보면 기대와 근본적으로 달라 정교한 손실 함수가 필요함
  • 따라서 지수형 패널티를 적용한 손실 함수로 변경: loss = exp(20*dot_products.abs()**2).sum()
  • 이 방식은 원하는 분포에 더 가까운 결과를 냄(최대 쌍별 각도는 약 76.5도)

Johnson-Lindenstrauss(JL) 보조정리: 기하학적 보장

  • JL 보조정리는 임의의 고차원 데이터 점 집합을 낮은 차원으로 무작위로 투영하더라도, 유클리드 거리가 거의 보존됨을 보장
  • 1~N개의 점, 오차 인자 ε, 투영 차원 k에 대해
    (1-ε)||u-v||² ≤ ||f(u)-f(v)||² ≤ (1+ε)||u-v||²
  • 최소 필요한 차원 k는: k ≥ (C/ε²) * log(N)
    여기서 C는 성공 확률을 조정하는 상수임
  • 일반적으로는 C 값을 보수적으로 4~8로 잡지만, 특수한 투영 방식(예: Hadamard matrix, 최적화 방법)에서는 더 작은 C에 도달 가능

실용적 적용 분야

  1. 차원 축소:
    • 예) 전자상거래 고객 선호를 제품 수만 개 차원에서 수천 차원으로 효율적 변환
    • 고차원 데이터의 실시간 분석, 추천 등에 활용 가능
  2. 임베딩 공간의 용량 한계 분석:
    • 완전 직교가 아니라 개념 간 유사/차이의 스펙트럼을 공간상에서 자연스럽게 표현
    • 실제 단어 예시: "archery", "fire", "gelatinous", "green" 등에서 물리적/추상적 의미가 고차원 공간에 중첩 표현됨

임베딩 용량의 실험적 분석

  • Hadamard matrix 변환 등으로 최적화한 결과, C 값은 2.5~4, GPU 기반 최적화에서는 훨씬 낮아질 수 있음
  • 실험 방법: N개의 표준 basis vector를 k차원 공간에 차례로 투영, 5만 번 반복 최적화
  • 관찰 결과:
    1. C 값은 N이 증가하면 최대치(~0.9) 이후 점차 하락
    2. N/k 비율이 높아질수록 C는 0.2 이하로 내려감
  • 이는 고차원 공간의 sphere packing 효율성에 기인
  • 실제로는 이론적 상한보다 더 많은 개념 표현 여력이 있음을 시사

언어 모델 임베딩의 실제적 의미

  • 임베딩 차원 수 k, 근사 직교각도 F(90°-실제각도), 그리고 C값에 따라 담을 수 있는 개념 수는 Vectors ≈ 10^(k * F² / 1500)
    • k=12,288, F=1(89°) → 10^8
    • F=2(88°) → 10^32
    • F=3(87°) → 10^73
    • F=5(85°) → 10^200 이상의 벡터 저장 가능
  • 86°만으로도 관측 가능한 우주 내 원자 수(10^80)보다 많음
  • 즉, 실제 언어 모델은 상대적으로 적은 차원에서도 수백만 개 의미를 풍부하게 보존함

실무적 응용 및 미래 방향

  1. 효율적 차원 축소:
    • Hadamard 변환, BCH 코딩 등과 결합한 무작위 투영 기반 방식을 통해, 복잡한 최적화 없이도 대규모 데이터 차원 축소와 빠른 연산 가능
  2. 임베딩 공간 설계:
    • 공간 용량에 대한 통찰은 트랜스포머 등 대형 언어 모델에서 "Canadian", "Muppet-like" 등 섬세한 개념까지 의미 관계를 동시 보존할 수 있음을 설명
  • 결론적으로, 현재 임베딩 기준(1,000~20,000차원)은 인간 지식 표현에 충분하며, 관건은 그 공간 내 이상적 배치 학습

결론

  • 손실 함수의 미묘한 최적화 문제 탐구에서 출발해, 고차원 기하와 머신러닝의 기반 구조에 대한 깊은 통찰로 이어짐
  • 1984년 발표된 JL 보조정리는 현재 머신러닝 임베딩, 정보 표현, 차원 축소 원리의 핵심을 제공 중임
  • Grant Sanderson 및 3Blue1Brown 채널, Suman Dev의 협력에 감사를 표하며, 이번 연구 및 집필 경험의 즐거움을 나눔

추가 읽을거리

  1. Sphere Packings, Lattices and Groups – Conway & Sloane
  2. Database-friendly random projections: Johnson-Lindenstrauss with binary coins – Achlioptas
  3. Hadamard Matrices, Sequences, and Block Designs – Seberry & Yamada
Hacker News 의견
  • 이 기하적 특성의 함의는 정말 충격적임. k차원 공간에 거의 직교에 가까운 벡터를 몇 개나 집어넣을 수 있을지 간단히 추정하는 방법을 생각해볼 수 있음. 벡터 간의 최소 각도에만 집중하면, 결국 구 코드(spherical codes)에 대한 분석임. 그런데도 이 글은 구 코드에 대한 기존 연구를 전혀 인용하지 않았고, 상당 부분이 언어모델로 작성된 것처럼 보임. 그리고 수많은 기본적인 불일치들이 결론의 신뢰성을 떨어뜨림. 예를 들어, K와 N에 따른 C값을 보여주는 그래프에서 x축은 K인가 N인가? 캡션에는 x축이 N(벡터 개수)라고 되어있지만, 이후엔 "매우 큰 공간"에서 C=0.2가 나왔다고 설명하고, 그래프에서는 N=30,000, K=2일 때만 C=0.2에 도달함—즉, 2차원 공간에 30,000개의 벡터가 있는 셈임! 반대로 x축이 K라면, 이 글은 30,000차원에 2개의 벡터로 측정된 결과를 12,888차원에 10의 200승 개 벡터의 경우로 외삽하고 있는데 이건 말이 안 됨. 사람들의 작업에 긍정적이고 우호적으로 접근하고 싶지만, 요즘 Hacker News의 LLM 작성글들의 홍수가 정말 압도적으로 많아지고 있음

    • 무언가가 LLM으로 생성됐다고 말하는 것은 입증도 불가능할 뿐더러, 단순히 "오류가 있다"고 지적하는 게 더 직접적이고 의미 있음. 실제로 오류를 지적해준 게 더 도움이 됨. 그 그림에서는 x축을 N으로 보는 게 맞을 것 같음

    • 내가 구 코드를 몰랐던 것을 보면, 이 분야 용어 자체가 꽤 생소하다고 느꼈음. 위키피디아조차 거의 모르는 것 같고, 구글 검색 결과도 결국은 32차원 미만에서 구 골프처럼 최적 패킹을 다루는 게 대부분임. 이렇게 이미 존재하는 수학이 비직관적인 전문용어 아래 숨어서 재발견되는 경우가 종종 있음

    • 맞음. 고차원 벡터 공간의 기하학적 특성이나 정보, 그리고 구 코드에 대해 더 잘 설명해주는 글이 뭔지 궁금함

    • 네가 언급한 그래프에서 K=2일 때 C=0.2에 도달하는 걸 볼 수 없음. K=3도 C=0.3까지만 가다가 중단됨. 그런데 이게 왜 문제라는 건지도 잘 모르겠음. 작성자는 N개의 기저 벡터를 K차원에 프로젝션하고, C는 N공간에서 K공간으로 매핑할 때의 오류 측정값 비슷한 것 같은데, 이 아이디어가 그래프와 불일치하는 이유가 있다면 더 자세히 듣고 싶음. 네 논지에서는 이 개념 자체를 다루지 않은 듯함

  • 저자는 모든 벡터가 완전히 직교하는 상황에만 너무 초점을 맞추고 있어서, 실제로 허용 가능한 오류 수준을 과대평가했다고 생각함. 실제로 중요한 것은 직교 벡터끼리 거의 직교하게 유지하는 것이 아니라, 직교와 멀리 떨어진 벡터 간에도 거리 순서(ordering)가 보장되는 것임. 에플실론이 훨씬 대단히 작아도 실제로는 문제가 생길 수 있음. 즉 “이 연구에서 제시된 바와 같이, 1,000~20,000차원 정도면 인간 지식과 추론을 모두 담기에 충분하다”는 주장은 지나치게 낙관적이라고 봄

    • 벡터들은 보통 n-구의 표면에 정규화되고, 실제로 결과에 의미있는 거리는 코사인 유사도임. 그래서 실전에서는 "거의 직교"가 중요함. 학습 중에는 의미 없는 표현들을 구 위에서 더 “직교”하게 만드는 것이 목표임. 실제 하드웨어로 구현할 때는 부동소수점 정밀도에도 제한이 있어서 이 방법이 특히 잘 통함. 참고로, 이 아이디어는 해당 블로그나 유튜브 영상이 처음 제안한 게 아님. AI나 최소한 신경망 학습에서 이 보조정리의 유의성은 10년 전쯤 C. Eliasmith가 이미 언급했고, GPT 같은 초고차원 지식 네트워크가 실전에서 학습 가능하기 훨씬 전부터 연구됨

    • OP 주장의 논리는 별로지만, 그래도 2만 차원 정도의 표현 능력에는 여전히 희망적임

    • 모든 벡터가 완전히 직교하거나 독립적이라고는 나도 생각하지 못함. 거리 측정, 곡선 공간(curvilinear space), 기울어진 좌표(skew coordinate)에 관해서도 볼만한 글이 있음: https://news.ycombinator.com/item?id=41873650. ‘특성 순서에 따라 거리 측정이 얼마나 달라지는가?’, ‘모든 직교 축의 순서가 바뀌면 알고리즘 출력도 달라지는가?’, ‘고차원 공간의 특성들이 정말 모두 90도 직교인지?’ 등 근본적인 질문이 있음. 만약 특성이 통계적으로 독립적이지 않다면, 실제로 완전 직교일 가능성은 없고, 독립이라고 가정한 거리 측정의 유용성에는 한계가 있을 수 있음. 나이브 베이즈, 선형회귀, 로지스틱 회귀, LDA, PCA 같은 선형 모델들은 비독립 특성하에 신뢰성이 떨어짐. L1 라쏘나 L2 릿지 정규화 같은 기법도 이상치나 비독립, 비직교 데이터에선 위험 요소가 있음. [완전 직교성]을 억지로 압축하기 어렵기 때문에 모델이 충분하다고 보긴 힘듦. 그리고 근본적으로 gbit에서 동시 인코딩이 가능한가 하는 물음도 있음

  • 글 대부분에서 풍기는 ChatGPT 느낌이 꽤 거슬리고 집중하기 어려웠음. 나도 영어를 다듬을 때 AI를 활용하지만, 톤이나 형식을 지나치게 바꾸지 말라는 요청을 줘서 그 정도는 피하려고 노력함. 그럼에도 이 수학적 관찰은 정말 흥미롭다고 생각함. 대형언어모델이나 다른 AI 시스템이 실제로 작동하는 방식을 들여다보게 해주는 근본적 시사점임. 고차원 데이터를 어떻게 저차원에 프로젝션하면서도 그 구조를 보존하는지 살펴보면, 이런 메커니즘이 효율성과 스케일 확장의 핵심이라는 걸 알 수 있음

    • 아이러니하게도 네 두 번째 문단에서 “fascinating”, “crucial”, “delving” 등의 표현과 문단 구조 때문에 바로 ChatGPT를 거친 듯한 느낌을 주고 있음

    • 어떤 부분에서 GPT 느낌이 강하게 들었는지 궁금함? 많이 나열하는 문체 때문인지?

  • 이런 직관적 이론과 존슨-린덴스트라우스(JL) 보조정리가 AI 안전 분야에서 SAEs(희소 오토인코더)와 같은 기계 해석 연구를 가능하게 해주는 핵심임. 이 중 많은 아이디어가 Anthropic이 2022년에 낸 논문에 잘 정리되어 있음: https://transformer-circuits.pub/2022/toy_model/index.html

    • 실제 논문은 어디서 볼 수 있는지, 어디에 출판됐는지 궁금함
  • 언어모델이 한 레이어의 C 차원에 “개념”들을 고정적으로 쑤셔넣는 게 아님(아마 12k라는 숫자가 그런 식으로 쓰인 듯). 벡터간 완전 직교도 없어도 개념을 구별해서 취급할 수 있음. LLM은 벡터 공간에서 개념 간의 거리만 멀게 만드는 것도 아니고, 의미들이 곳곳에 겹쳐 있음. 이런 특징이 바로 밀집 표현(dense representation)의 핵심임. 희소 오토인코더를 학습시키면 어떤 뉴런이 주제별로 활성화됐는지 확인할 수 있음. Neuronpedia가 이런 실제 모습을 잘 보여줌: https://www.neuronpedia.org/

    • 바로 그 희소 오토인코더 연구가 이 글에서 말하는 “거의 직교” 개념에 기반함. 원래는 ‘superposition 가설’로 불림: https://transformer-circuits.pub/2022/toy_model/index.html SAEs는 밀집된 벡터를 과다기저(Overcomplete) 공간에서 거의 직교에 가까운 희소 ‘개념’들로 분해하는 역할임. 이런 방법이 실제로 잘 작동하고, 심지어 서로 다른 LLM 간 임베딩 공간을 효율적으로 매칭하는 데도 써먹을 수 있음

    • 완벽한 직교의 조건을 느슨하게 잡으면, 훨씬 많은 정보를 넣을 수 있음. 본질적으로 추가적인 (분수 차원)의 정보를 기존 차원과 군집시키는 셈임. 달리 말하면 많은 개념들이 서로 완벽히 직교하지 않고, 어느 정도 겹침이나 상관관계를 가짐. 그래서 기사 내용에 대단히 파격적인 내용은 없음. 그리고 “remarkable”, “fascinating”, “profound” 같은 표현을 남발하는 게 다소 은근히 독자를 끌어들이는 LLM 느낌을 줌

  • 조금은 사소하지만 재미있는 점: 여러분도 이만큼의 공간에 수십억 개의 개념을 담을 수 있음. 벡터의 각 컴포넌트에서 4비트만 신경 쓴다고 해도, fp4로 12000차원 벡터는 6KB 정도이고, 이는 UTF-8 여러 페이지 분량 텍스트와 비슷함. 3K 토큰짜리 64K 임베딩 수준임. 이렇게 표현되는 ‘생각’의 경우의 수는 엄청나게 많음. 한 토큰을 처리할 때도 각 레이어가 60번 가량 이전 ‘생각’과 어텐션, FFN으로 학습된 데이터를 섞어냄. 그래서 이 전체 시스템이 복잡한 작업(예: Bash를 Python으로 변환, 단어 문제 풀기 등)을 해낼 수 있음. 물론 100% 공간효율적일 거라 기대하진 않음. 서로 다른 ‘강도’로 벡터를 합성할 때 잘 작동해야 하고, 학습은 항상 최고 효율의 압축을 찾는 방향으로만 수렴하진 않음. 결국 이론적 한계를 상한으로만 생각해도, 초고차원 벡터에 뭐든 실질적으로 ‘생각’이란 개념을 꽉꽉 채워넣을 수 있다는 새로운 감각을 줌

  • 내 직관은 훨씬 단순함 — 개념들이 어느 정도 계층구조를 이룬다는 가정 하에, 12000차원 공간에 몇 개의 개념이 들어가는지 대략적으로 계산할 수 있음. 각 개념이 어떤 차원에서는 다른 모든 개념과 적어도 한 축에서 직교한다고 본다면, 코사인 거리가 충분히 크지 않더라도 두 개념을 선형적으로 분리할 수 있는 함수가 보장된다는 뜻임. 이 경우 극한적으로는 12,000! 개념(팩토리얼)까지 가능해서, 웬만한 분류체계엔 공간이 너무 많음

    • 각 개념마다 차원에 대한 순서를 매칭해야 12,000! 개념을 구현할 수 있는데, 실제 모델은 차원 순서에 의미가 없음. 즉 [weight_1, weight_2,...]와 [weight_2, weight_1,...]는 모델 내에서 완전히 동일함. 실전에서 언어모델은 각 축에서 양수, 음수, 0 중 하나만 있다고 보면 3^12,000개 개념 수준임. 실제로는 대부분의 벡터에서 수십 개 축을 제외하고 거의 다 0임(학습 시간 제한 탓)

    • 그 숫자는 전 우주에 있는 원자 수(10^80)보다 엄청나게 큼(약 10^43741)

    • “코사인 거리가 크진 않다”는 점에서 이미 결정적 한계가 있음

  • 20Questions 게임 해봤다면 수십억 개념에 1000차원이 필요 없다는 걸 알 것임. 이런 거대한 벡터는 수십억 개념보다 훨씬 더 복잡한 정보까지 담을 수 있음. 실제로, 한 편의 시 전체와 오타 위치까지 이런 벡터가 표현하고 찾을 수 있음. GPT에 시를 붙여넣고 오타 위치를 묻는 경우처럼, 내부 레이어 어딘가에서 바로 그 정보를 구체적으로 구별할 수 있음

    • 실제로 그건 단순 벡터가 아니라 모델 전체가 해내는 일임. 모델 전체는 일종의 1조 차원 벡터처럼 행동함

    • 이진 벡터로 하면 20차원으로 100만 개 좀 넘는 개념 표현 가능. 30차원이면 10억 개 개념이 됨

  • 이미 많은 댓글에서 해당 기사에 여러 허점이 지적되었지만, 정말 기본적인 관찰 한 가지만 추가하고 싶음: 12k 차원에서 10^200개 개념을 담는다는 주장 자체가 너무 어처구니 없음. 12k 벡터 공간이 수많은 개별값을 담을 수 있는 건 맞지만, 그게 다 개념은 아님. 이런 주장은 터무니없음. 섀넌(Shannon)도 이 부분은 분명히 지적하고 싶어할 듯함

  • 핵심 오류는 현실적으로 수십억 개념이 존재하지 않는다는 것임. 인간이 사용하는 ‘개념’과 기계적 ‘인스턴스’나 ‘엔티티’는 엄연히 다름. 인스턴스는 무한히 많아도, 우리가 실제로 사고에 쓰는 추상적 개념 수는 훨씬 제한되어 있음