1. SOM?
대뇌 시각피질이 입력을 공간적으로 배치해서 처리하는 방식을 모사한 인공신경망.
목적은 K-Means와 같다(데이터를 비슷한 그룹으로 묶기)지만, 구조 자체가 신경망이라는 점에서 계열이 다르다.
K-Means·TF-IDF·SVD는 통계적 최적화(고전적 ML)고, SOM은 딥러닝(신경망) 계열이다.
2. K-Means와 다른 점
- KMeans
- $K$개의 중심점이 공간에서 자유롭게 독립적으로 움직임.
- 중심점 5번이 어디로 가든 50번에게 영향 없음.
- SOM
- 노드들이 고정된 격자(grid) 위에 배치
- 학습 중 한 노드가 움직이면 격자에서 가까운 이웃 노드도 같이 끌려감
- SOM은 "이웃 관계"라는 제약을 처음부터 깔고 학습한다.
쉽게 말해, KMeans는 70명이 각자 자유롭게 움직이며 자기 자리를 찾는 것. SOM은 70명이 미리 정해진 10×7 격자 위에 서서, 한 사람이 움직이면 손을 잡고 있는 양옆 사람도 같이 끌려오는 것.

3. 알고리즘
- 초기화: 가중치 행렬(각 격자 노드가 갖는 벡터)을 무작위 값으로 초기화
- BMU(Best Matching Unit) 탐색: 입력 벡터 하나를 보고, 격자의 모든 노드 중 가장 가까운(거리가 가장 작은) 노드를 찾음
- 가중치 갱신: BMU와 그 이웃 노드들의 가중치를 입력 벡터 방향으로 이동
- 모든 입력에 대해 2~3을 반복, 학습률을 점점 줄여가며 여러 epoch 반복
4. 수식
거리 계산 (BMU 탐색)
$$
d_j = \sqrt{\sum_i (x_i - w_{ij})^2}
$$
입력 벡터 $x$와 노드 $j$의 가중치 벡터 $w_j$ 사이의 유클리드 거리. 가장 작은 $d_j$를 가진 노드가 BMU.
가중치 업데이트
$$
w_{new} = w_{old} + \alpha (x - w_{old})
$$
$(x - w_{old})$는 현재 가중치에서 입력 방향으로 향하는 벡터. 학습률 $\alpha$를 곱해서 그 방향으로 일부만 이동(전부 이동하면 $\alpha=1$). $\alpha$는 학습이 진행될수록 점점 작아진다 — 처음엔 크게 움직이고 나중엔 미세조정만.
이웃함수
$$
h(j, \text{BMU}) = \exp\left(-\frac{d_{\text{grid}}^2}{2\sigma^2}\right)
$$
$d_{\text{grid}}$는 격자 위에서 노드 $j$가 BMU로부터 얼마나 떨어져 있는지(격자 거리, 유클리드 거리와는 다른 개념). $\sigma$(시그마)는 이웃 반경을 조절하는 값. 가우시안 함수라서 BMU 자신($d_{\text{grid}}=0$)은 $h=1$(100% 이동), 격자에서 멀어질수록 $h \to 0$(거의 안 움직임).
전체 업데이트 식은 이웃함수가 곱해진 형태가 된다:
$$
w_{new} = w_{old} + \alpha \cdot h(j,\text{BMU}) \cdot (x - w_{old})
$$
$\sigma$가 클수록 더 넓은 영역의 이웃이 함께 끌려온다. 학습 후반부에는 $\sigma$도 점점 줄여서(이웃 반경을 좁혀서) 미세조정 단계로 넘어가는 구현이 많다.

학습률과 $\sigma$가 시간에 따라 줄어드는 방식은 보통 지수적으로 감소시킨다:
$$
\alpha(t) = \alpha_0 \exp\left(-\frac{t}{\tau_\alpha}\right), \qquad \sigma(t) = \sigma_0 \exp\left(-\frac{t}{\tau_\sigma}\right)
$$
$t$는 현재까지 진행된 학습 스텝(또는 epoch), $\tau$는 감쇠 속도를 조절하는 상수.
- 학습 초반($t$가 작을 때): $\alpha$, $\sigma$가 커서 큰 폭으로, 넓은 이웃까지 움직이며 전체적인 큰 구조를 빠르게 잡음
- 학습 후반($t$가 커질수록): 두 값이 작아지면서 점점 더 좁고 미세한 조정만 함
K-Means의 n_init처럼 "초반엔 거칠게 탐색, 후반엔 정밀하게 수렴"하는 흔한 패턴이 SOM에서는 이런 형태로 구현된다.
5. 결과: 위상 보존(topology preservation)
학습이 끝나면 격자에서 가까운 노드는 비슷한 데이터를 대표하게 된다.
→ SOM의 가장 큰 특징이자 K-Means와의 본질적 차이.
- K-Means는 군집 5번과 군집 6번이 번호만 인접할 뿐 내용은 전혀 무관해도 된다.
- SOM은 격자 위 (2,3) 노드와 (2,4) 노드가 항상 서로 비슷한 의미를 갖는다. → 위상 보존
6. 시각화: U-matrix(Unified Distance Matrix)
이 위상 보존 덕분에 SOM은 학습 후 시각화가 가능하다.
- 10×7 격자 위에 U-matrix(Unified Distance Matrix): 격자 위 인접한 두 노드의 가중치 벡터 사이 거리를 계산해서, 그 거리를 색(밝기)으로 칠한 지도를 만드는 것.
- 인접 노드끼리 가중치가 비슷하면(거리가 가까우면) 밝게, 가중치가 크게 다르면(군집 경계) 어둡게 칠한다.
- (KMeans는 중심점들이 서로 독립적이라 이런 "이웃 간 거리 지도"라는 개념 자체가 성립하지 않는다.)

7. SOM의 약점: 빈 노드(empty cluster)
격자가 고정되어 있다는 게 장점이자 약점.
실제 데이터가 70개의 균등한 군집으로 자연스럽게 나뉘지 않는다면,
격자의 일부 위치는 어떤 데이터와도 가장 가까운 노드가 되지 못하고 텅 비게 된다.
K-Means는 중심점이 자유롭게 이동해서 데이터가 있는 곳으로 따라가지만
SOM은 격자 모양이 고정이라 일부 칸이 비어버릴 수 있다.
e.g) 6만 건의 텍스트 데이터를 70개 군집/노드로 나눌 때
| 지표 | K-Means | SOM |
| Silhouette Score | 상대적으로 높음 | 상대적으로 낮음 |
| 빈 군집 비율 | 거의 없음 | 꽤 발생할 수 있음 |
데이터가 70개 군집에 고르게 나뉘지 않는 경우,
- 격자가 고정된 SOM: 일부 노드가 통째로 비어버림(격자 제약 때문에 노드를 자유롭게 줄일 수 없음)
- 자유롭게 움직이는 KMeans는 빈 군집이 거의 안 생김
→ 그냥 군집 품질만 중요하고 위상 보존은 필요 없는 상황이라면 K-Means가 더 효율적인 경우가 많다.
8. 정리
- SOM은 격자 위에서 이웃 노드끼리 함께 끌려가며 학습하는 신경망 기반 클러스터링
- KMeans와 목적(클러스터링)은 같지만, 중심점이 서로 독립적인 KMeans와 달리 SOM은 "이웃 관계"라는 제약을 깔고 학습함
- 학습률·이웃반경($\sigma$)을 점점 줄여가며 큰 구조 → 미세조정 순서로 수렴
- 위상 보존 덕분에 U-matrix 같은 시각화가 가능하지만, 격자가 고정돼 있어 빈 노드가 생길 수 있음
SOM에서 "신경망의 가중치가 학습된다"는 개념을 봤다면,
그 다음 자연스러운 질문은 "그럼 텍스트의 '의미'를 신경망으로 어떻게 벡터화하는가"다. → 벡터 임베딩.
SOM은 TF-IDF 벡터를 입력으로 받아 클러스터링했지만, 임베딩은 그 자체로 신경망이 "의미"를 학습해서 만들어내는 벡터라는 점에서 한 단계 더 나간 개념이다.
GitHub 댓글