Lecture 13.3 - Louvain Algorithm
CS224W Lecture 13. Community Detection in Networks
- Louvain Algorithm: At High Level
- Louvain: 1st phase (Partitioning)
- Louvain: Modularity Gain
- Deriving $\triangle Q(i\rightarrow C)$
- Louvain: 2nd phase (Restructuring)
- Louvain Algorithm 정리
Lecture 13. Community Detection in Networks
지금까지 community detection의 objective이 modularity의 최대화라는 것을 배웠습니다. 하지만 아직 HOW라는 중요한 문제가 빠져있죠. 13.3 파트에서는 바로 이 HOW, 즉 어떻게 modularity를 최대화 할 것인지에 대해 알아보도록 하겠습니다.
Louvain Algorithm: At High Level
Louvain 알고리즘은 community detection을 위한 탐욕적 알고리즘으로 잘 알려져 있습니다. 간단하게 Louvain 알고리즘의 특징을 짚고 넘어가도록 하겠습니다.
- 낮은 시간 복잡도 & 빠른 수렴: 시간 복잡도가 $O(nlogn)$로써 굉장히 빠르기 때문에 큰 그래프에도 쉽게 적용할 수 있습니다.
- 높은 modularity를 갖는 output: Community detection을 ‘잘’합니다!
-
계층적 커뮤니티 구조를 파악할 수 있습니다.
Louvain 알고리즘은 반복적인 pass를 통해 탐욕적으로 modularity를 최대화합니다. 각 pass는 2 phase로 구성되어 있는데, 각 phase는 다음과 같이 작동합니다.
-
Phase 1 - Partitioning
노드-커뮤니티 소속을 국소적으로 바꾸어 modularity 값의 변화를 살핌으로써 최종적으로 modularity가 극대화되는 방향으로 노드-커뮤니티 소속을 적합시킴 -
Phase 2 - Restructuring
현재 적합된 노드-커뮤니티 소속을 기반으로 동일 커뮤니티 속 노드를 super-node로 aggregate하여 새로운 상위 단계의 네트워크를 생성함 → 이를 통해 계층적 커뮤니티 구조 파악 가능 - 다시 Phase 1으로 돌아감
- Pass는 더 이상 modularity를 증가시킬 수 없을 때까지 반복적으로 일어남
원래 그래프가 unweighted 그래프였을지라도 phase 2에서 weighted 그래프가 생성되기 때문에 기본적으로 Louvain 알고리즘은 인풋 그래프를 weighted 그래프로 간주하고 진행됩니다. 하지만 앞에서 언급했듯이 unweighted 그래프는 그저 특별한 weighted 그래프의 인스턴스로 볼 수 있기 때문에 큰 문제가 되지 않습니다!
Louvain: 1st phase (Partitioning)
이제 Louvain의 각 phase를 좀 더 심도 있게 다뤄볼까요? 첫번째 phase에서는 주어진 그래프에 대해 modularity의 local maxima를 찍도록 커뮤니티를 분리하기 때문에 Partitioning 단계라고 불립니다. Partitioning은 다음과 같은 방식으로 일어납니다.
- 먼저 그래프 상 모든 노드를 각기 다른 커뮤니티에 소속시킴 (한 커뮤니티 당 하나의 노드가 소속된 형태)
- 각 노드 $i$에 대해서,
- 노드 $i$를 이웃 노드 $j$의 커뮤니티로 소속 이동시켰을 때 modularity gain($\triangle Q$)를 구함 (이 또한 노드 $i$의 모든 이웃들에 대해서 다 구함)
- 노드 $i$의 이웃 노드 중, 노드 $i$의 소속 변경 시 가장 큰 modularity gain이 생기는 노드 $j$의 커뮤니티로 $i$를 이동시킴
- 사실 어떤 노드를 먼저 보냐에 따라서 알고리즘의 결과가 바뀔 수 있긴 하지만, 여러 문헌에 따르면 그 차이가 굉장히 미미하기 때문에 노드 순서는 크게 중요치 않다고 합니다.
Louvain: Modularity Gain
그렇다면 본래 커뮤니티 $D$에 소속되어 있던 노드 $i$를 커뮤니티 $C$로 옮길 때 발생하는 modularity gain은 어떻게 계산할 수 있을까요? 전 과정에 대한 modularity gain은 먼저 노드 $i$를 커뮤니티 $D$로부터 제거하고, 그 후 노드 $i$를 커뮤니티 $C$에 소속 시키는 두 단계의 modularity gain 합으로 구할 수 있습니다. 이를 각각 식과 그림으로 표현하면 아래와 같습니다.
사실상 $\triangle Q(D\rightarrow i)$는 단순히 $\triangle Q(i\rightarrow C)$의 역과정으로써 비슷한 방법으로 구할 수 있기 때문에 여기서는 $\triangle Q(i\rightarrow C)$만 수식적으로 도출해보도록 하겠습니다.
Deriving $\triangle Q(i\rightarrow C)$
도출에 앞서서 먼저 커뮤니티 $C$의 modularity를 구하기 위해 $\sum_{in}$과 $\sum_{tot}$를 정의하겠습니다.
💡 Recall: Modularity
앞서 정의한 $\sum_{in}$과 $\sum_{tot}$를 바탕으로 커뮤니티 $C$의 modularity $Q(C)$를 구하면 아래와 같습니다.
이제 더 나아가 노드 $i$를 커뮤니티 $C$에 새로 소속 시키는 상황까지 고려하기 위해 $k_{i,in}$과 $k_i$를 추가로 정의하겠습니다.
최종적으로 $\triangle Q(i\rightarrow C)$를 구하기 위해서는 노드 $i$가 커뮤니티 $C$에 소속되지 않았을 때의 modularity $Q_{before}$과 소속된 후의 modularity $Q_{after}$을 각각 따로 구하여 그 차이를 계산해야 합니다. 따라서 먼저 $Q_{before}$을 구해보도록 하겠습니다. 이 때 노드 $i$는 혼자 따로 떨어진 타 커뮤니티에 소속되어 있기 때문에 $Q_{before}$은 $Q(C)$와 $Q({i})$의 합으로 구할 수 있습니다. 이 때 노드 $i$만으로 구성된 커뮤니티 ${i}$는 내부의 엣지가 존재하지 않기 때문에 $Q$의 앞 term이 0이 됨에 주의하세요!
다음으로 $Q_{after}$을 구해보도록 하겠습니다. 확장된 커뮤니티 $C+{i}$에 대한 modularity는 아래 수식을 통해 구할 수 있습니다.
최종적으로 $\triangle Q(i\rightarrow C)$는 $Q_{after}$과 $Q_{before}$의 차이로 구할 수 있습니다. 최종 수식은 다음과 같습니다.
💡 Louvain 1st Phase Summary
1. 현재 커뮤니티 $C$에 속해있는 모든 노드 $i$에 대해 이웃 노드의 커뮤니티로 소속을 변경함에 따르는 modularity gain을 구한다.
2. 소속 변경에 따르는 modularity gain이 가장 큰 community $C’$를 구한다.
$C’ = argmax_C, \triangle Q(C\rightarrow i \rightarrow C’)$
3. 만약 $\triangle Q(C\rightarrow i \rightarrow C’)$이 0보다 크다면, 노드 $i$의 소속을 $C$에서 $C’$으로 옮긴다.
$C \leftarrow C - \{i\}$
$C’ \leftarrow C’ + \{i\}$
* 모든 노드가 최적의 커뮤니티에 속해 있을 때까지 위 과정을 반복한다.
Louvain: 2nd phase (Restructuring)
Phase 1이 끝난 후, 네트워크의 각 노드들은 특정 커뮤니티에 소속되게 됩니다. 이 후, phase 2에서는 동일 커뮤니티에 속한 노드끼리 aggregate 되어 super-node를 형성함으로써 더 축약된 형태의 상위 단계 네트워크가 생성됩니다. 각 커뮤니티에 속한 노드 간에 적어도 하나 이상의 엣지가 존재하는 경우 대응되는 super-node 사이에도 엣지가 형성되며, 축약된 엣지의 weight는 원본 그래프의 edge weight를 합산함으로써 구할 수 있다. Phase 2가 종료된 후, 비로소 1번의 pass가 종결되며 이어 다시 phase 1이 축약된 네트워크에 수행된다.
💡 Q) 축약된 오른쪽 그래프에서 self-edge는 무엇인가요?
A) 축약되기 이전 원본 그래프에서 각 커뮤니티에 속하는 노드 간 edge weight를 합산하여 전달하기 위해 축약 그래프에서 self-edge를 만들게 됩니다!
Louvain Algorithm 정리
다시 정리하는 느낌으로 지금까지 배운 Louvain 알고리즘을 하나의 도식으로 나타내면 아래 그림과 같습니다.
Louvain 알고리즘은 탐욕적 탐색 방법으로써 시간 복잡도가 낮아 큰 그래프에도 쉽게 적용할 수 있으며, modularity를 효과적으로 최대화하기 때문에 community detection에서 우수한 성능을 보입니다. 실제 task에 적용해보면 Louvain 알고리즘의 우수성을 더욱 명확하게 알 수 있는데요, 프랑스어와 네덜란드어를 주로 사용하는 벨기에 인구에 대해 제공된 통화 네트워크를 Louvain 알고리즘으로 분석하면 사용 언어에 따라 정확하게 커뮤니티가 분리되는 것을 볼 수 있습니다.