GCN 정규화 행렬, (1,3) 성분을 Step-by-Step으로 계산해보자!
“매트릭스 계산을 생략하지 말고, step by step으로 모두 보여줘!”
— 이 요청은 진짜 기초부터 철저히 이해하려는 태도입니다.
이제 행렬 곱을 하나하나 쪼개서, 숫자까지 대입해서, 완전히 눈으로 따라갈 수 있게 설명드릴게요.
목표
다음 행렬의 (1, 3) 성분, 즉 첫 번째 행, 세 번째 열을 계산해보자:
D~−1/2A~D~−1/2
그리고 이것이 아래 식과 정확히 일치함을 확인하자:
d~1⋅d~31⋅A~13
1. 설정: 작은 그래프 예시 (노드 3개)
- 노드: U1, U2, P1 → 인덱스: 1, 2, 3
- 연결 관계:
- U1–P1 연결됨
- U2–P1 연결됨
- 모든 노드는 자기 자신과 연결 (self-loop 있음)
→ 인접 행렬 A~ (3×3):
A~=⎣⎢⎡101011111⎦⎥⎤
2. 차수 d~i 계산
차수는 행의 합으로 정의됩니다:
d~i=j∑A~ij
- d~1=1+0+1=2
- d~2=0+1+1=2
- d~3=1+1+1=3
💡 여기서 “U1이 3개 구매” 같은 실제 데이터는 무시하고, 그래프 구조에 따라 계산해야 합니다.
3. D~−1/2 만들기
D~는 대각행렬로, 대각 성분이 d~i입니다:
D~=⎣⎢⎡200020003⎦⎥⎤
→ D~−1/2는 각 대각 성분의 제곱근의 역수:
D~−1/2=⎣⎢⎢⎡210002100031⎦⎥⎥⎤
4. Step 1: D~−1/2A~ 계산
행렬 곱:
D~−1/2A~=⎣⎢⎢⎡210002100031⎦⎥⎥⎤⋅⎣⎢⎡101011111⎦⎥⎤
각 행 계산:
-
1행:
- (1,1): 21⋅1=21
- (1,2): 21⋅0=0
- (1,3): 21⋅1=21
-
2행:
- (2,1): 21⋅0=0
- (2,2): 21⋅1=21
- (2,3): 21⋅1=21
-
3행:
- (3,1): 31⋅1=31
- (3,2): 31⋅1=31
- (3,3): 31⋅1=31
→ 결과:
D~−1/2A~=⎣⎢⎢⎡2103102131212131⎦⎥⎥⎤
5. Step 2: (D~−1/2A~)D~−1/2 → (1,3) 성분만 계산
우리는 첫 번째 행과 세 번째 열의 내적만 구하면 됩니다.
- 첫 번째 행: [21, 0, 21]
- D~−1/2는 대각행렬이므로, 세 번째 열은:
⎣⎢⎡0031⎦⎥⎤
→ 내적:
[D~−1/2A~D~−1/2]13=21⋅0+0⋅0+21⋅31=2⋅31=61
6. 기대값과 비교
우리가 기대한 식:
d~1⋅d~31⋅A~13=2⋅31⋅1=61
✅ 완전히 일치!
7. 결론
일반적으로, 다음이 성립합니다:
[D~−1/2A~D~−1/2]ij=d~i⋅d~jA~ij
이번 예시에서 (1,3) 성분을 직접 계산해보니, 이 공식이 정확히 맞는 것을 확인했습니다.
8. 전체 최종 행렬 (참고)
D~−1/2A~D~−1/2=⎣⎢⎢⎡2106102161616131⎦⎥⎥⎤
- 대각 성분: d~i1
- 비대각 성분 (i=j): d~id~jA~ij
9. 직관적으로 기억하자
“두 노드 사이의 연결 강도는, 두 노드의 ‘차수 제곱근’으로 나눠서 조절된다.”
- 연결이 많은 노드 → 분모가 커져서 영향력 ↓
- 연결이 적은 노드 → 분모가 작아서 영향력 ↑
이것이 GCN (Graph Convolutional Network)에서 사용하는 대칭 정규화(symmetric normalization)의 핵심입니다.
10. Step-by-Step 요약
| 단계 | 내용 |
|---|
| 1 | A~ 만들기 (self-loop 포함) |
| 2 | d~i=∑jA~ij 계산 |
| 3 | D~−1/2 생성 (대각 성분 = 1/d~i) |
| 4 | D~−1/2A~ 계산 |
| 5 | 그 결과에 D~−1/2 곱해서 (1,3) 성분 도출 |
| 6 | d~1d~3A~13 와 비교 → 일치 확인 |