1. SOM?
Self-Organizing Map. 입력 데이터를 2차원 격자 위에 스스로 배치하도록 학습하는 신경망 구조의 고전적 비지도학습 알고리즘.
목적은 KMeans와 같지만(데이터를 비슷한 그룹으로 묶기), 중심점들이 고정된 격자 위에서 이웃과 함께 움직인다는 점이 다르다.
주의할 점은 SOM을 보통 CNN/Transformer 같은 현대적 의미의 "딥러닝"으로 분류하지는 않는다는 것이다.
여러 층을 깊게 쌓은 모델이라기보다, 경쟁학습(competitive learning)을 사용하는 얕은 신경망에 가깝다.
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$가 커질수록): 두 값이 작아지면서 점점 더 좁고 미세한 조정만 함
KMeans의 여러 초기화 실험처럼, SOM에서도 "초반엔 넓게 탐색, 후반엔 좁게 미세조정"하는 패턴이 중요하다.
다만 KMeans의 `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 댓글