주변 공간에서 가까운 두 점이 데이터가 놓인 곡면을 따라서는 멀리 떨어져 있을 수 있다. 매니폴드 학습(manifold learning)은 어떤 국소 연결을 믿을지 정하고, 그 연결로 전체 구조를 구성한다.

종이를 둥글게 말아 Swiss roll을 만들었다고 생각하자. 서로 다른 층의 두 점은 공기 중 직선으로 재면 거의 맞닿아 있다. 하지만 종이에서 벗어나지 않고 걸어가려면 둘레를 길게 돌아야 한다. 직선 거리와 곡면 위 거리는 서로 다른 질문의 답이다.

준비와 90분 구성

PCA, 두 점 사이 거리, 그래프의 정점과 간선을 복습한다. 말린 종이 예제 15분, 최근접 이웃 그래프 20분, Isomap 20분, UMAP 15분, 실습과 진단 20분으로 진행한다. 관측 공간의 차원, 내재 차원, 그림의 차원을 구분해 설명하는 것이 목표다.

공통 환경 안내, 전체 실습 묶음, lesson04.py를 사용한다. scikit-learn과 umap-learn이 필요하다. UMAP의 첫 실행은 수치 연산의 로컬 컴파일 때문에 조금 더 오래 걸릴 수 있다.

곡면과 곡선은 다르다

표준적인 Swiss roll은 다음처럼 나타낼 수 있다.

$$ x(u,v)=(u\cos u,\ v,\ u\sin u). $$

관측 좌표는 세 개지만 자유롭게 바뀌는 매개변수는 $u$와 $v$ 두 개다. 따라서 내재 차원은 2다. 이를 펼치면 2D 종이가 되어야 하며, 한 줄짜리 시간축이 되는 것은 아니다. 그 종이에 나선 하나만 그려 놓았다면 그것은 별도의 1D 데이터다.

$(u,v)$라고 적었다고 곧바로 거리가 보존되는 것도 아니다. $u$ 방향으로 움직일 때 속도 크기는 $\sqrt{1+u^2}$다. 실제 곡면의 길이 좌표를 만들려면 이를 적분해야 한다. 알고리즘이 잘 펼친 지도의 가로축이 생성기의 $u$ 숫자와 그대로 같을 필요가 없는 이유다.

매니폴드 가설은 고차원 관측이 더 낮은 차원의 구조 가까이에 모인다는 가정이다. 모든 데이터에 대한 보장은 아니다. 분기점, 떨어진 집단, 급격한 변화, 여러 집단의 혼합은 하나의 매끈한 곡면으로 설명하기 어렵다. 우리가 사용하는 분기 데이터도 하나의 매끄러운 좌표계보다 그래프가 적합할 수 있음을 보여 준다.

먼저 국소 그래프를 만든다

각 점에서 선택한 특징 거리로 가까운 이웃 $k$개를 찾는다. 이웃 사이에 간선을 만들고 유클리드 거리를 가중치로 준다. $j$가 $i$의 이웃이라고 해서 $i$가 $j$의 이웃이라는 보장은 없으므로 대칭화가 필요하다. 이번 실습은 양쪽 중 하나라도 선택하면 간선을 연결한다.

$$ d_G(i,j)=\min_{\pi:i\leadsto j}\sum_{(a,b)\in\pi}\|x_a-x_b\|_2. $$

이 최단 경로 거리는 표본이 충분히 촘촘하고 간선이 실제로 국소적일 때 곡면의 측지 거리를 근사한다. 최단 경로 알고리즘이 숫자를 돌려줬다는 사실만으로 좋은 근사가 되는 것은 아니다.

$k$가 너무 작으면 그래프가 끊기거나 희소한 영역이 조각난다. 너무 크면 Swiss roll의 다른 층 사이에 지름길이 생기거나 서로 다른 생물학적 분기를 연결할 수 있다. 표준화, 잡음, 표본 밀도도 이 선택에 영향을 준다. 연결 요소를 확인하고 이웃 수의 합리적인 범위에서 결론이 유지되는지 점검한다.

Isomap은 그래프 거리를 보존하려 한다

Isomap은 이웃 그래프를 만든 뒤 학습점 사이의 최단 경로 거리를 계산하고, 고전적 다차원 척도법으로 그 거리를 낮은 차원에 배치한다. 그래프 거리 행렬을 $D_G$, 중심화 행렬을 $H=I-\mathbf1\mathbf1^\top/n$이라고 하면

$$ B=-\frac12H(D_G\odot D_G)H $$

를 만든다. 정확한 유클리드 거리라면 $B$는 중심화된 내적 행렬이다. 가장 큰 양의 고유값과 고유벡터로 $Y=V_d\Lambda_d^{1/2}$를 구하면 좌표가 된다. 추정한 측지 거리를 쓰면 근사 문제가 되고 음의 고유값도 나타날 수 있다. PCA에서 본 고유벡터 연산을 다시 쓰되, 분해하는 행렬이 달라진 것이다.

국소 이웃과 전체 기하의 연결은 Tenenbaum, de Silva, Langford의 Isomap 원 논문에서 다룬다. 새로운 점을 변환하는 API 등 구현 동작은 scikit-learn 매니폴드 안내를 참고한다.

모든 점 쌍의 거리를 담는 행렬은 데이터가 커질수록 메모리를 많이 쓴다. Isomap은 이번의 작은 진단 예제에 적합하다. 수백만 개 세포나 대화 창에 정확한 모든 쌍 거리 계산을 바로 적용하는 것은 기본 선택이 아니다.

UMAP은 가중 이웃 구조를 배치한다

UMAP도 이웃에서 시작하지만 Isomap의 전체 최단 거리 행렬을 그대로 보존하려는 알고리즘은 아니다. 위치마다 조정된 척도로 이웃 소속 강도를 만들고 이를 그래프로 결합한 다음, 그 관계를 반영하는 낮은 차원 배치를 최적화한다. 끌어당기는 항과 밀어내는 항이 배치를 구성한다. 수학적 정의는 UMAP 원 논문에 있다.

n_neighbors는 고려하는 이웃 구조의 범위를 바꾼다. min_dist는 결과 공간에서 점들이 얼마나 조밀하게 모일 수 있는지에 영향을 준다. 따라서 섬의 폭이나 두 섬 사이의 빈 공간은 그림의 설정에 따라 달라질 수 있다. 화면의 틈을 생물학적 장벽이나 이야기 전환에 걸리는 시간으로 바로 바꾸면 안 된다.

UMAP은 탐색적 시각화에 유용하지만 전역 거리, 밀도, 축의 의미를 왜곡할 수 있다. 시간 방향도 제공하지 않는다. 실제 시간으로 색칠하는 것은 진단이지 UMAP 축을 시계로 바꾸는 연산이 아니다. 후속 경로 분석에서는 어떤 공간과 그래프를 쓰는지 근거를 대야 한다. 화면의 점을 보기 좋게 연결하는 것으로 대신할 수 없다.

두 부분으로 나눈 실험

압축을 푼 디렉터리에서 핵심 실험을 실행한다.

from common import make_dataset
from lesson04 import fit_manifolds

data = make_dataset()
embeddings, metrics = fit_manifolds(data)
print(metrics)

함수는 학습 세션으로만 특징을 표준화하고 학습 그래프의 연결성을 확인한다. 그 뒤 학습 관측에 Isomap과 UMAP을 적합하고 평가 세션을 변환한다. 공통 데이터에는 이웃 30개를 쓴다. 생성기의 좌표와 시간 레이블은 학습에 들어가지 않는다.

python lesson04.py --output outputs를 실행하면 별도의 Swiss roll 진단도 추가하고 그림을 저장한다. 이 진단은 800개 roll 점 모두로 학습한다. 기하를 보여 주는 예제이며 새로운 세션 일반화 실험이라는 주장은 하지 않는다. 스크립트는 이 연결성과 세션 실험의 연결성을 따로 보고한다.

평가 세션 지도와 Swiss roll의 성공한 펼치기, 지름길 실패, 정답 거리 진단.

고정 시드의 Swiss roll 실험은 둘 다 연결된 그래프 두 개를 비교한다. 이웃 6개에서는 종이가 펼쳐지지만, 10개에서는 곡면을 따라 먼 구간을 잇는 간선 다섯 개가 지름길을 만든다. 여기서는 알려진 곡면 위 길이가 관측 공간 길이의 두 배를 넘는 간선을 표시한다. 정답을 아는 합성 데이터의 진단이며 실제 미지의 매니폴드에 바로 적용할 규칙은 아니다.

마지막 패널은 스케일을 보정한 거리 오차 $\min_{a>0}\sqrt{\sum_{i

공통 데이터에서는 이웃 10개 기준의 trustworthiness도 계산한다. 이 점수는 원래 특징 공간에서는 멀었는데 임베딩에서 가까운 이웃이 된 점들에 벌점을 준다. 값이 높으면 이런 국소적인 잘못된 이웃이 상대적으로 적다는 뜻이다. 전역 거리, 올바른 시간 방향, 원래 거리의 과학적 타당성을 보장하는 점수는 아니다. 이번 UMAP은 약 0.993을 받지만 공통 경로를 여러 섬처럼 나눠 표시한다. 국소 이웃을 잘 보존하면서 전체 배치는 오해를 유발할 수 있다. 이웃 재현율, 연결성, 설정 민감도, 독립적인 레이블을 함께 점검한다.

바이오와 캐릭터 대화에서 확인할 것

세포 상태의 매끈한 곡선은 분화일 수도 있지만 기술적 변화일 수도 있다. 독립적인 생물학 표지와 함께 공여자와 배치 레이블도 살펴본다. 빈 구간은 불가능한 전이가 아니라 덜 수집된 영역일 수 있다. UMAP이 섬을 어디에 놓았는지만으로 계보를 추론하지 않는다.

캐릭터 대화에서는 의미가 비슷한 문장이 서로 다른 시점에 등장한다. 두 사과가 서로 다른 사건의 앞뒤에 있을 수 있다. 전이를 묻는 데 필요한 과거 정보를 상태 표현이 충분히 담아야 한다. 연속 턴을 연결한 간선과 의미가 비슷해서 연결한 간선을 따로 확인하자. 시간적 이웃과 의미적 이웃은 일치할 필요가 없다.

연습과 해설

  1. 자유도를 세어라. Swiss roll 식에서 $v$를 고정하면 무엇이 달라지는가? 정답: 곡면이 1D 곡선이 된다. 원래 예제에서는 $u$와 $v$가 모두 바뀐다.
  2. 그래프를 흔들어 보자. 이웃 수 5, 15, 50을 비교한다. 힌트: 예쁜 그림을 고르기 전에 연결 요소 수와 지름길을 기록한다. 끊어진 그래프에는 모든 점 쌍을 잇는 유한 경로가 존재하지 않는다.
  3. 주장을 감사하라. “UMAP에서 두 배 멀리 떨어졌으니 전이에 두 배 시간이 걸린다”에 무엇이 빠졌는가? 해설: UMAP 거리는 시간으로 보정되어 있지 않다. 시간을 기록한 전이 관측과 검증한 동역학 모델이 필요하다.

재사용할 원칙은 국소 기하를 먼저 확인하고 전체 구조를 주장하는 것이다. 다음 강의에서는 이웃 그래프 위에 랜덤 워크를 놓고 국소 전이의 반복이 무엇을 알려 주는지 살펴본다.