핵심 수식
GraphSAGE의 핵심은 다음 두 단계로 요약됩니다:
-
Aggregation (집계)
hN(v)(k)=AGGREGATEk({hu(k−1),∀u∈N(v)})
-
Update (업데이트)
hv(k)=σ(W(k)⋅CONCAT(hv(k−1),hN(v)(k)))
여기서
- hv(k): 노드 v의 k번째 레이어에서의 임베딩
- N(v): 노드 v의 이웃 집합
- W(k): 학습 가능한 가중치 행렬
- σ: 활성화 함수 (이번 예제에서는 생략)
이제 이 수식을 실제 그래프와 숫자로 직접 계산해보겠습니다.
[0단계] 준비: 그래프와 초기 데이터
1. 예시 그래프 구조
노드와 간선은 다음과 같습니다:
- 노드: A, B, C, D, E, F
- 간선:
- A–B, A–C, A–D
- B–C
- C–E, C–F
즉, 각 노드의 이웃은:
| 노드 | 이웃 |
|---|
| A | B, C, D |
| B | A, C |
| C | A, B, E, F |
| D | A |
| E | C |
| F | C |
목표: 노드 A의 2단계 임베딩 hA(2)를 계산하기
GraphSAGE는 바깥에서 안쪽으로 계산합니다:
2-hop 이웃 → 1-hop 이웃 → 타깃 노드
2. 초기 특징 벡터 (k=0)
모든 노드는 2차원의 초기 특징 벡터를 가집니다:
- hA(0)=[1,2]
- hB(0)=[3,3]
- hC(0)=[4,1]
- hD(0)=[2,5]
- hE(0)=[1,6]
- hF(0)=[4,6]
3. 설정
- Aggregator: Mean Aggregator (이웃 벡터의 평균)
- 가중치 행렬:
W(1)=W(2)=(10010.5000.5) → 입력은 4차원 (CONCAT 결과), 출력은 2차원
- 활성화 함수 σ: 계산 편의상 생략 (선형 변환만 수행)
[1단계] k=1: 1-hop 정보 집계
1-1. 노드 B의 hB(1) 계산
- 이웃: A, C
- Aggregation:
hN(B)(1)=Mean(hA(0),hC(0))=Mean([1,2],[4,1])=[2.5,1.5]
- CONCAT:
CONCAT(hB(0),hN(B)(1))=[3,3,2.5,1.5]
- Update:
hB(1)=(10010.5000.5)⎝⎜⎜⎜⎛332.51.5⎠⎟⎟⎟⎞=(3+1.253+0.75)=[4.25, 3.75]
1-2. 노드 C의 hC(1) 계산
- 이웃: A, B, E, F
- Aggregation:
Mean([1,2],[3,3],[1,6],[4,6])=[49,417]=[2.25, 4.25]
- CONCAT: [4,1,2.25,4.25]
- Update:
hC(1)=(1⋅4+0.5⋅2.251⋅1+0.5⋅4.25)=[4+1.125, 1+2.125]=[5.125, 3.125]
1-3. 노드 D의 hD(1) 계산
- 이웃: A
- Aggregation: hN(D)(1)=hA(0)=[1,2]
- CONCAT: [2,5,1,2]
- Update:
hD(1)=(1⋅2+0.5⋅11⋅5+0.5⋅2)=[2.5, 6]
1-4. (참고) 노드 A의 hA(1) 계산
- 이웃: B, C, D
- Aggregation:
Mean([3,3],[4,1],[2,5])=[39,39]=[3, 3]
- CONCAT: [1,2,3,3]
- Update:
hA(1)=(1⋅1+0.5⋅31⋅2+0.5⋅3)=[2.5, 3.5]
[2단계] k=2: 노드 A의 최종 임베딩 계산
이제 A가 이웃의 h(1) 정보를 받아 최종 임베딩을 만듭니다.
2-1. Aggregation (A의 이웃: B, C, D)
-
hB(1)=[4.25, 3.75]
-
hC(1)=[5.125, 3.125]
-
hD(1)=[2.5, 6]
-
평균 계산:
hN(A)(2)=Mean(hB(1),hC(1),hD(1))
=[34.25+5.125+2.5, 33.75+3.125+6]=[311.875, 312.875]≈[3.9583, 4.2917]
2-2. Update
- CONCAT:
CONCAT(hA(1),hN(A)(2))=[2.5, 3.5, 3.9583, 4.2917]
- 행렬 곱:
hA(2)=(10010.5000.5)⎝⎜⎜⎜⎛2.53.53.95834.2917⎠⎟⎟⎟⎞=(2.5+0.5×3.95833.5+0.5×4.2917) =(2.5+1.979153.5+2.14585)≈[4.479, 5.646]
최종 결과:
hA(2)≈[4.48, 5.65]
결론: GraphSAGE가 만든 "지능적인" 임베딩
| 단계 | 노드 A의 임베딩 |
|---|
| 초기 (k=0) | [1, 2] |
| 1단계 (k=1) | [2.5, 3.5] |
| 2단계 (k=2) | [4.48, 5.65] |
처음에는 A만의 정보였던 벡터가,
→ 1단계에서는 B, C, D의 직접 이웃 정보를 흡수하고,
→ 2단계에서는 E, F 같은 2-hop 이웃의 정보까지 간접적으로 포함하게 됩니다.
이 최종 벡터 hA(2)는 그래프 내 A의 구조적 역할과 문맥을 풍부하게 표현합니다.
이제 이 벡터를 활용해 노드 분류, 링크 예측, 클러스터링 등 다양한 작업을 수행할 수 있습니다.
핵심 포인트 정리
- GraphSAGE는 전체 그래프를 보지 않고도 새로운 노드에 대한 임베딩을 생성할 수 있음 (inductive)
- Aggregation + Update 구조로 이웃 정보를 계층적으로 통합
- 실제 구현에서는 W(k)를 학습하지만, 이 예제에서는 이해를 위해 고정된 값 사용
- Mean Aggregator 외에도 Max, LSTM 기반 aggregator도 가능