작성자: 이정은
웹을 그래프로 본다면, 각 웹페이지를 노드로, 페이지 간의 하이퍼링크를 엣지로 볼 수 있습니다.
이때 동적인 웹페이지나 다크웹과 같은 접근할 수 없는 페이지 등에서 이슈가 발생하는데, 이는 묻어두고 정적인 웹페이지만 고려합니다.
초기의 웹은 페이지와 페이지 간의 링크로만 이루어져 있어 navigational했지만, 현재는 좋아요, 댓글 등의 transcational link로 이루어집니다. PageRank에서는 navigational link만 취급합니다.
웹 이외에도 논문의 인용구와 사전의 레퍼런스도 노드와 엣지로 이루어진 그래프 구조를 가집니다.
실제 웹은 위와 같이 방향성을 가진 그래프로 in-link와 out-link를 가집니다. 이를 통해 페이지 A가 어떤 다른 페이지로 연결되는지를 알 수 있습니다.
모든 웹페이지는 다른 중요도(important)를 가지고 있습니다. 따라서 웹 그래프를 가지고 웹페이지에 rank를 매기고자 합니다.
해당 아이디어는 페이지가 많은 링크를 가질수록 더 중요하다는 것을 의미합니다. 웹페이지는 앞서 말했듯이 방향성을 가진 directed 그래프이므로 in-link와 out-link가 존재합니다.
이때 out-link보다는 in-link를 중요도의 지표로서 사용하여 in-link를 더 많이 갖고 있는 페이지가 중요도가 높다고 판단합니다.
만약 in-link의 개수가 같다면, 더 중요한 페이지에서 들어온 링크의 개수가 많을수록 중요하다고 판단합니다. 이는 중요한 페이지로 다른 중요한 페이지를 찾는 recursive 문제임을 보여줍니다.
위 내용을 수식으로 표현하면 다음과 같습니다.
따라서 의 중요도는 in-links의 중요도인 를 사용한 식으로 정의할 수 있습니다. 노드가 3개인 우측 예시처럼 해당 방정식을 가우시안 소거법을 사용해 풀 수 있습니다. 이는 당연하게도 그래프가 커질수록 너무 많은 시간이 소요되기 때문에 실제로 활용하기엔 문제가 있습니다.
위 문제를 보완한 방법이 Stochastic adjacency matrix를 사용해 그래프를 표현하여 방정식을 해결하는 것입니다.
행렬의 크기는 노드의 개수x노드의 개수가 됩니다.
페이지 j가 out-links를 가지고 있으면, 페이지 j에서 페이지 i로 향하는 vote는 입니다. 따라서 각 열의 합은 1이 되므로 Column stochastic matrix라고 말합니다.
중요도 벡터 은 각 페이지의 중요도를 나타내며 는 페이지 i의 중요도를 말합니다. 이 또한 이 됩니다.
따라서 flow 방정식을 으로 나타낼 수 있습니다.
특정 노드에서 다른 노드로 랜덤하게 옮겨가는 랜덤워크처럼 랜덤하게 페이지를 돌아다니는 web surfer가 특정 시간 t에 페이지 i에 있다고 가정합니다. 그럼 시간 t+1에는 uniformly random하게 선택된 out-link로 서퍼가 이동하고, 이 과정을 페이지 j에 도달할 때까지 계속해서 반복합니다.
는 전체 페이지 개수만큼의 벡터로, i번째 원소는 서퍼가 시간 t에 페이지 i에 있을 확률을 의미합니다. 즉, 는 서퍼가 시간 t에 각 페이지에 있을 확률 분포를 뜻합니다. uniformly random에 따라 서퍼가 움직인다면, 시간 t+1에 서퍼가 어디에 있을지는 로 알 수 있습니다.
만약 랜덤워크가 state에 도달했다면, 가 됩니다. 이때 는 를 만족하는 더 이상 변화하지 않는 stationary distribution 상태입니다.
앞서 보았던 PageRank의 중요도 벡터 r도 의 형태였으므로, r은 랜덤워크에서 stationary distribution 상태라고 할 수 있습니다.
Lecture2에서 다뤘던 eigenvector centrality는 인접행렬 A를 이용해 으로 노드의 중심성을 나타내는 고유벡터 c를 계산해냈다.
PageRank의 flow 방정식은 으로 고유값이 1이고, 중요도 벡터 r은 인접행렬 M의 고유벡터라고 할 수 있습니다.
실제 Pagerank 방정식은 앞서 말했듯이 랜덤워크에서 stationary distribution 상태로 존재하는 중요도 벡터 r을 계산해야 합니다.
이에 Power Iteration을 사용합니다. 해당 방법은 n개의 노드에 대한 벡터 r가 수렴할 때까지 즉, 벡터 r이 시점에 영향을 받지 않을 때까지 계속 반복하여 계산합니다.
전체 과정은 아래와 같습니다.
1. 벡터 r 초기화:
2. 반복 계산 진행:
3. 반복하다가 수렴을 만족하면 종료:
이때 일반적으로 쓰는 L1 norm대신 다른 norm을 사용해도 되고, 보통 반복 횟수 50회 정도에 수렴하게 됩니다.
이런 PageRank에도 두 가지 문제점이 존재합니다.
Spider traps는 모든 out-links가 그룹 안에 속하는 페이지가 존재할 때 발생합니다. 해당 페이지에 서퍼가 한번 들어가면 갇히게 됩니다. 그리고 power iteration 진행 시 수렴에 문제가 발생하는데, 이 페이지가 중요도를 모두 흡수해 다른 페이지는 중요도를 잃게 됩니다.
Dead ends는 in-links는 있지만 out-links가 없는 페이지가 존재하는 경우를 말합니다. 이러한 페이지는 out-links가 없기 때문에 인접행렬 M이 더 이상 column stochastic하지 않고, 중요도에 leakage가 발생합니다. Dead ends는 수렴에는 문제가 되지 않지만 결과로 나온 스코어가 좋지 않을 수도 있습니다.
Random Teleport를 이용해 랜덤 서퍼가 매 스텝마다 두 가지 옵션을 가지게 합니다. 만큼의 확률로 링크를 따라 이동하거나, 의 확률로 다른 웹페이지로 teleport하게 됩니다. 이때 다른 페이지로 이동할 확률은 페이지마다 모두 동일하며, 는 보통 0.8-0.9 사이로 설정합니다.
따라서 매 스텝마다 의 확률로 랜덤한 페이지로 이동하게 되면 특정 페이지에서 빠져나올 수 있고, 다른 페이지가 중요도를 잃는 문제를 해결하게 됩니다.
위와 같은 방법으로 문제를 해결하는데, Dead ends의 경우 무조건 다른 페이지로 이동하게 하여 dead ends 페이지에서 다른 노드로 갈 확률을 균등하게 배분합니다. 이는 column stochastic을 만족하게 하여 문제를 해결합니다.
Random Teleport를 포함한 PageRank의 방정식은 입니다. 이는 spider traps의 문제를 해결했고, 행렬 M에 균등확률을 배정하는 전처리를 진행하여 dead ends 고려하지 않아도 되게 했습니다.
이를 Google matrix G를 사용해 표현하면, 이 됩니다. 이 식은 여전히 recursive 문제를 가지고 있지만 Power iteration을 사용하여 계산합니다.
PageRank로 계산된 중요도를 보게 되면,
위와 같은 사용자와 아이템으로 이루어진 biparatite graph가 존재합니다. 이때 특정 아이템을 구매한 사용자에게 다른 아이템을 추천하려고 한다면, 아이템 간의 유사성을 파악하여 사용자에게 추천해줘야 합니다.
단순히 아이템 간의 최단 경로로 본다면, 아이템 A와 A'가 B와 B'보다 더 관계가 있다고 볼 수 있습니다. 같은 길이의 경로를 가진 C와 C' 그리고 D와 D'의 경우에는 너무 많은 사용자가 연관된 D보다는 C와 C'이 더 관계가 높다고 판단할 수 있습니다.
기존 PageRank는 노드의 중요도를 가지고 rank를 측정하고, 그래프 내 모든 노드에 대해 균등한 확률로 teleport를 실시합니다. 따라서 teleport 집합 S는 [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]로 나타낼 수 있습니다.
Personalized Rank는 모든 노드가 아닌 특정 노드만 포함된 부분 집합 S에서 랜덤하게 teleport를 진행합니다. 이 집합은 균등하거나 가중치가 반영된 S = [0.1,0,0,0.2,0,0,0.5,0,0,0.2]로 표현할 수 있습니다.
이 경우는 부분 집합 S를 랜덤워크를 재시작할 특정 노드 하나로 지정합니다. S = [0,0,0,0,1,0,0,0,0,0,0]와 같이 특정 노드에만 값을 표시합니다.
전체 알고리즘은 다음과 같이 진행됩니다.
랜덤워크를 재시작할 수 있는 확률인 ALPHA가 존재하고, 그 이외에는 기존의 랜덤워크와 동일하고 각각 쿼리 노드만 다르게 구성되어 있습니다.
해당 알고리즘은 Multiple connections / Multiple paths / Direct and indirect connections / Degree of the node에 대해 유사도가 모두 고려할 수 있기 때문에 좋은 해결책이 됩니다.
참고자료
Youtube-Stanford : CS224W Lecture 4.1 - PageRank
CS224W-notes: PageRank
Youtube-설레는 수학: 페이지링크 알고리즘
[14기 김상현]
페이지 랭크와 그의 활용에 대해 이해할 수 있었습니다.
유익한 강의 감사합니다:)
[15기 권오현 - 강의 요약]
웹을 그래프로 보면, 웹 페이지가 node, 하이퍼링크는 edge로 생각할 수 있다. 모든 웹페이지는 다른 중요도를 가지고 있는데 이에 구글에서는 PageRank라는 알고리즘을 통해 웹페이지에 rank를 매기고자 하였다.
기본 idea는 페이지가 많은 링크, 외부 페이지로 부터 자신 페이지로 들어오는 in-link를 중요도의 지표로 사용하여, 페이지의 rank를 매기고자 하는 것이다. 만약 in-link의 개수가 같다면, 더 중요한 페이지에서 들어온 링크의 개수가 많을 수록 중요하다고 판단하기 때문에, recursive한 문제이다.
rank를 매기는 방법은 각 페이지의 중요도를 가우시안 소거법으로 풀 수 있다. 하지만 그래프가 커질수록 너무 많은 시간이 소요 되기 때문에 이를 해결하기 위해 Stochastic adjacency matrix를 통해 문제를 해결한다. (r = Mr) 이 수식을 확률로 생각해 보면, p(t+1) = M p(t)로 생각할 수 있는데, 일반화를 위해 서퍼가 random walk를 통해 웹 페이지를 방문한다고 가정하면 우리는 M을 통해서 서퍼가 어디에 있을지를 알 수 있다. 만약 서퍼가 random walk를 통해 state에 도달하면, 이는 stationary distribution 상태가 되어 우리가 원하는 rank vector를 구할 수 있게 된다.
하지만 이러한 random walk의 경우만 생각하다 보면 'spider trap'이나 ;out-link가 존재하지 않는 경우의 node에서는 dead ends문제가 발생하게 된다. 이를 해결하기 위에 기존의 식에서 random teleport를 포함하여 dead ends 문제를 해결하게 되었다.
이러한 페이지 랭크 알고리즘은 웹페이지의 중요도 뿐만 아니라 추천시스템에도 적용할 수 있다. 유저와 아이템으로 이루어진 biparatite graph 구조를 통해 아이템간의 유사성을 파악하여 유저에게 아이템을 추천을 할 수 있지만 새로운 유저, cold start problem을 해결하기에는 어려움이 있다는 한계를 가지고 있다.
[15기 김재희 - 강의 요약]
웹은 웹페이지를 노드로, 하이퍼링크를 엣지로 볼 수 있다.
이때 웹은 in link와 out link를 가지는 그래프로 표현될 수 있다.
pagerank의 핵심 아이디어는 "더 많은 in link를 가질수록 중요한 페이지다"이다.
이때, 노드 i의 중요도는 이웃 노드의 중요도를 각 이웃 노드의 out link수로 나눈 값의 합이 된다.
이때, stochastic adjacency matrix를 이용해 실제 연산이 이루어지게 된다.
M_{ij} = {1 \over d_j로 행렬이 표현된다. 즉, 각 열은 각 노드의 out link로 랜덤워크가 움직일 표현된 확률분포인 것이다.
중요도 벡터 은 각 페이지의 중요도를 원소로 가지고 있으며, 는 노드 i의 중요도를 의미한다.
이를 이용해 r = Mr의 식으로 표현이 가능하다.
이때, r은 power iteraion을 통해 수렴하는 것을 목표로 한다.
페이지 랭크의 문제점은 두가지가 있다.
이를 해결한 것이 Google matrix이다.
$G = \beta M + (1-\beta)[{1 \over N}]_{N \times N}꼴로 표현된다. 이때, \beta를 통해 텔레포트 될 확률을 조절한다.
페이지 랭크 구조를 활용하여 초기화 포인트를 특정 노드 집합으로 한정짓는 Personalized PageRank, Random woalk with restarts 등이 있다.
[15기 이성범]
웹을 하나의 네트워크로 본다면, 각 웹페이지를 노드로, 페이지간의 하이퍼 링크를 엣지로 볼 수 있다. 페이지 간의 연결을 서로 방향성을 가지고 있기 때문에 in-link와 out-link가 존재한다.
PageRank는 이러한 웹 네트워크의 웹에 rank를 매기는 알고리즘이다.
PageRank의 아이디어는 하나의 노드인 웹에 중요도가 높은 웹들의 in-link가 많을 수록 중요한 웹으로 간주하는 것이다.
PageRank는 행렬 방정식을 활용한 Power Iteration 으로 구할 수 있다.
이는 노드의 개수 x 노드의 개수로 이루어진, 페이지 j에서 페이지 i로 향하는 vote의 행렬로 이루어진 Column stochastic matrix M을 가지고, 각 페이지의 중요도를 나타내는 수렴하는 벡터 r을 찾는 것이다. 여기서 모든 페이지의 링크를 활용하면 정말 많은 시간이 걸리기 때문에 효율적인 Random Walk 방식을 활용한다. 랜덤하게 페이지를 돌아다니는 web surfer가 특정 시간 t에 페이지 i에 있다고 가정한다면, 시간 t+1에는 uniformly random하게 선택된 out-link로 서퍼가 이동하고, 이 과정을 페이지 j에 도달할 때까지 계속해서 반복하여 각 페이지의 중요도를 나타내는 r을 구한다. 이러한 방식이 가능한 이유는 마르코프 체인에 의해 확률은 수렴하기 때문이다.
그런데 이러한 방법에는 두 가지 문제점이 존재한다. 바로 자기 자신으로 향하는 엣지로 인하여 갇히게 되는 Spider traps과 out-links가 없는 페이지가 존재하는 Dead ends 문제이다.
Spider traps이 발생하면 해당 페이지가 다른 페이지의 중요도를 모두 흡수하게 되고, Dead ends는 결과로 나온 스코어에 악영향을 준다. 따라서 두 문제점은 모두 중요도 계산에 악영향을 준다.
이러한 문제점을 해결하는 방법이 바로 Random Teleport이다. Random Teleport는 b의 확률로 링크를 따라 이동하거나 1-b의 확률로 다른 웹페이지로 이동하는 확률을 두어 학습하는 방식인데,
매 스텝마다 (1−β)의 확률로 랜덤한 페이지로 이동하게 되면 특정 페이지에서 빠져나올 수 있게 되기 때문에 다른 페이지가 중요도를 잃는 문제를 해결할 수 있다.
이러한 Random Teleport를 이용한 방식이 The Google Matrix 이다.
Google Matrix는 여전히 recursive 문제를 가지고 있지만, spider traps과 dead ends 문제를 해결하였고 Power iteration을 사용해 계산이 가능하다.
[15기 황보진경 - 강의 요약]
정적인 웹을 그래프로 보면, 웹페이지를 node로 하이퍼링크를 directed edge로 생각할 수 있다. 기본적으로 in-link가 많은 경우, 그리고 중요한 페이지에서 링크가 들어온 경우에 해당 페이지의 랭크가 높다. 가우스-조던 소거법으로 모든 노드의 랭크를 계산할 수 있지만 노드(웹페이지)의 개수가 너무 많기 때문에 현실적으로 무리가 있다. 이를 해결하기 위해 stochastic adjacency matrix를 도입한다. 이 매트릭스를 활용하면 랜덤서퍼의 이동이 stationary 상태(고유방정식)에 도달한 상황을 묘사할 수 있다. Power iteration을 사용하여 rank vector가 수렴할 때까지 반복한다.
두가지 코너케이스가 존재한다.
1. Spider traps: self-loop만 있는 경우 서퍼가 벗어날 수 없기 때문에 중요도가 비상식적으로 높아지는 상황이 발생한다. -> 랜덤 텔레포트를 도입하여 해결할 수 있다: 랜덤서퍼는 이동할 때 두가지 옵션을 가진다. 즉, 링크를 따라 이동하거나 완전히 랜덤한 웹페이지로 텔레포트한다. 따라서 특정 페이지에 갇히지 않고 탈출할 수 있다.
2. Dead ends: out-link가 없는 경우 서퍼가 더 이상 움직일 수 없기 때문에 중요도의 leakage가 발생한다. -> 마찬가지로, 랜덤 텔레포트를 사용한다. Out-link가 없는 경우 무조건 텔레포트로 이동을 한다.
페이지 랭크 알고리즘을 추천시스템에 활용할 수 있다. 사용자와 아이템으로 이루어진 biparatite graph가 존재하다고 하자. 2번 유저가 Q라는 아이템을 보았을 때, Q와 유사한 아이템을 추천해주고 싶은 상황을 가정하자. Q라는 아이템에서 시작하여 이 아이템과 연관있는 유저를 랜덤하게 찾고, 해당 유저와 연관있는 아이템 중 하나로 랜덤하게 이동하는 과정을 반복한다. 앞선 랜덤 텔레포트와 마찬가지로 일정 확률로 랜덤하게 재시작한다.