blog/public/posts/gugeuleun-geu-manheun-peiji.../index.html

16 lines
21 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>구글은 그 많은 페이지를 어떻게 찾아낼까. | Morgan's Blog</title><meta name=keywords content><meta name=description content="구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다."><meta name=author content="Me"><link rel=canonical href=http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/><meta name=google-site-verification content="XYZabc"><meta name=yandex-verification content="XYZabc"><meta name=msvalidate.01 content="XYZabc"><link crossorigin=anonymous href=/assets/css/stylesheet.31527a12923607f33c1cac9636a2fa755f6ade7c55866bdb96e44c6bcaf6cfbb.css integrity="sha256-MVJ6EpI2B/M8HKyWNqL6dV9q3nxVhmvbluRMa8r2z7s=" rel="preload stylesheet" as=style><script defer crossorigin=anonymous src=/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA=" onload=hljs.initHighlightingOnLoad()></script>
<link rel=icon href=https://blog.morgan.kr/favicon.ico><link rel=icon type=image/png sizes=16x16 href=http://blog.morgan.kr/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=http://blog.morgan.kr/favicon-32x32.png><link rel=apple-touch-icon href=https://blog.morgan.kr/favicon.ico><link rel=mask-icon href=https://blog.morgan.kr/favicon.ico><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><script type=application/javascript>var doNotTrack=!1;doNotTrack||(function(e,t,n,s,o,i,a){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,i=t.createElement(n),a=t.getElementsByTagName(n)[0],i.async=1,i.src=s,a.parentNode.insertBefore(i,a)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-123-45","auto"),ga("send","pageview"))</script><meta property="og:title" content="구글은 그 많은 페이지를 어떻게 찾아낼까."><meta property="og:description" content="구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다."><meta property="og:type" content="article"><meta property="og:url" content="http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/"><meta property="og:image" content="http://blog.morgan.kr"><meta property="article:section" content="posts"><meta property="article:published_time" content="2021-10-30T07:07:55+00:00"><meta property="article:modified_time" content="2021-10-30T07:07:55+00:00"><meta property="og:site_name" content="Morgan's Blog"><meta name=twitter:card content="summary_large_image"><meta name=twitter:image content="http://blog.morgan.kr"><meta name=twitter:title content="구글은 그 많은 페이지를 어떻게 찾아낼까."><meta name=twitter:description content="구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다."><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":2,"name":"Posts","item":"http://blog.morgan.kr/posts/"},{"@type":"ListItem","position":3,"name":"구글은 그 많은 페이지를 어떻게 찾아낼까.","item":"http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"구글은 그 많은 페이지를 어떻게 찾아낼까.","name":"구글은 그 많은 페이지를 어떻게 찾아낼까.","description":"구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다.","keywords":[],"articleBody":"구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. PageRank에서는 각각의 웹페이지를 노드로 보고, 상호 참조와 인용으로 각각의 노드를 연결하여 하나의 거대한그래프를 만든다. 각각의 페이지는 랭크값이라는 고유한 수치를 가지고 있고, 그 페이지에서 인용된 각각의 페이지는 인용한 페이지의 랭크값을 동등하게 나눠가진다. 많이 인용된 페이지는 랭크값이 높을 것이고 적게 인용된 페이지는 랭크값이 낮을 것이므로 이 랭크값으로 페이지들의 중요도를 줄세울 수 있다. 하지만 다중연결 그래프에서 각각의 노드가 각각의 노드의 값을 참조하기 때문에 순환참조 구조가 되어 무한적으로 계산하게 되는 문제가 있고, 결과적으로 노드의 값을 계산할 수 없다는 문제가 있다. 페이지랭크 알고리즘에서는 이 각각의 페이지의 랭크값이 계산을 계속하다 보면 각각 하나의 값으로 수렴한다는 것을 증명하여 문제를 해결하였다. 아니, 애초에 문제가 되지 않았던 것이다. 이 과정에서 그래프의 각 노드 랭크값을 표현한 행렬에 변환연산을 함으로써 계산의 단계를 나아가는데, 이때 이용되는 마르코프 행렬을 구글행렬이라고 한다. 페이지랭크 알고리즘은 이러한 각각의 랭크값을 계산하는 정규화공식과 계산과정의 규칙성, 그리고 수렴한다는 증명으로 완성된다. 물론 산출 과정중에 초기 산출 방법과 루프의 해결 그리고 보정을 위한 서퍼가 존재한다.\n(Step1) 초기화각 노드들의 중요도 초기값은 1N1N으로 설정.(이때 NN은 전체 웹페이지의 개수)\n(Step2) 업데이트노드 K의 t번째 시도에서 중요도를 $PR(K;t)$ 라고 할때, $ PR(K;t+1)$ 은 $ PR(K;t+1) = \\frac{1d}{N} + d \\Sigma{P∈K} \\frac{PR(P;t)}{|Γ_P|} $ 이다. 여기서 $d(0≤d≤1)$는 제동(damping)계수이고, $Γ_K$는 K에서 인용한 노드들의 집합이다. 그리고 $|ΓP|$는 P를 인용한 노드의 개수이다.\n구글행렬은 행렬분리를 하기 좋은 구조로 이루어져 있으며 이 덕분에 반복연산을 행하기에 매우 좋은 구조로 되어있다. 그래프를 인접행렬로 표현한 후, 각각의 페이지값을 확률행렬로 나타낸다. 인접행렬을 n승하면 n번 순회하여 도달하는 페이지를 의미한다. 하지만 인접행렬로 계산하면 수렴성을 보장할 수 없기 때문에 수렴성의 확보를 위해 확률행렬로 변환한 후, 각 열의 합이 1이 되고 나서 n승 계산을 수행한다. 따라서 행렬 S는 다음과 같이 정의한다. $S = H + \\frac{1e^T}{N}$ N은 총 노드의 갯수, 벡터 1인 전체 1인 열벡터이고, e는 특정 열의 합이 0이면 원소값이 1인 열벡터이다.\n이제 이 확률행렬을 수렴하게 계산하기 위해 구글행렬 G를 계산한다.\n$G = dS + (1-d)E$이고, 이때 d는 Damping 계수이다. 이렇게 계산한 구글행렬을 페이지랭크 알고리즘에 대입하면 가장 큰 고윳값이 1인 행렬이 되어 Frobenius 정리에 의해 초기값에 관계없이 일정한 값으로 수렴한다.\n","wordCount":"395","inLanguage":"en","datePublished":"2021-10-30T07:07:55Z","dateModified":"2021-10-30T07:07:55Z","author":{"@type":"Person","name":"Me"},"mainEntityOfPage":{"@type":"WebPage","@id":"http://blog.morgan.kr/posts/gugeuleun-geu-manheun-peijireul-eoddeohge-cajanaelgga/"},"publisher":{"@type":"Organization","name":"Morgan's Blog","logo":{"@type":"ImageObject","url":"https://blog.morgan.kr/favicon.ico"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><script type=text/x-mathjax-config>
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [['$$','$$']],
},
"HTML-CSS": {
scale: 80
},
});
</script><script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><header class=header><nav class=nav><div class=logo><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=http://blog.morgan.kr/categories/ title=Categories><span>Categories</span></a></li><li><a href=http://blog.morgan.kr/tags/ title=Tags><span>Tags</span></a></li><li><a href=http://blog.morgan.kr/posts/ title=Posts><span>Posts</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=http://blog.morgan.kr>Home</a>&nbsp;»&nbsp;<a href=http://blog.morgan.kr/posts/>Posts</a></div><h1 class=post-title>구글은 그 많은 페이지를 어떻게 찾아낼까.</h1><div class=post-meta><span title='2021-10-30 07:07:55 +0000 UTC'>October 30, 30000</span>&nbsp;·&nbsp;395 words&nbsp;·&nbsp;Me</div></header><div class=post-content><p>구글은 방대한 웹페이지를 자사 데이터베이스에 기록하고 있으며, 이를 토대로 사용자가 검색한 검색결과와 가장 매치되는 페이지를 보여줌으로써 검색엔진의 역할을 할 수 있다. 구글이 이렇게까지 클 수 있었던 이유는 정확한 검색 결과를 보여주는 알고리즘 덕분이다. 그렇다면 이 알고리즘은 무엇일까? 구글이 웹페이지들의 관계를 산출하고 그 수치를 계산해내는 알고리즘인 페이지랭크 알고리즘은 구글의 창시자중 한명인 래리 페이지라는 사람이 석사논문으로 발명한 알고리즘이다. PageRank 알고리즘은 각각의 웹 페이지의 상대적 가중치를 계산하여 각각의 중요도와 연관성을 표현하는 방식을 이용하는데, 이를 이용하여 한 페이지와 가장 연관된 다른 페이지를 Rank를 매겨 정확한 연관성을 보여줄 수 있다. PageRank에서는 각각의 웹페이지를 노드로 보고, 상호 참조와 인용으로 각각의 노드를 연결하여 하나의 거대한그래프를 만든다. 각각의 페이지는 랭크값이라는 고유한 수치를 가지고 있고, 그 페이지에서 인용된 각각의 페이지는 인용한 페이지의 랭크값을 동등하게 나눠가진다. 많이 인용된 페이지는 랭크값이 높을 것이고 적게 인용된 페이지는 랭크값이 낮을 것이므로 이 랭크값으로 페이지들의 중요도를 줄세울 수 있다. 하지만 다중연결 그래프에서 각각의 노드가 각각의 노드의 값을 참조하기 때문에 순환참조 구조가 되어 무한적으로 계산하게 되는 문제가 있고, 결과적으로 노드의 값을 계산할 수 없다는 문제가 있다. 페이지랭크 알고리즘에서는 이 각각의 페이지의 랭크값이 계산을 계속하다 보면 각각 하나의 값으로 수렴한다는 것을 증명하여 문제를 해결하였다. 아니, 애초에 문제가 되지 않았던 것이다. 이 과정에서 그래프의 각 노드 랭크값을 표현한 행렬에 변환연산을 함으로써 계산의 단계를 나아가는데, 이때 이용되는 마르코프 행렬을 구글행렬이라고 한다. 페이지랭크 알고리즘은 이러한 각각의 랭크값을 계산하는 정규화공식과 계산과정의 규칙성, 그리고 수렴한다는 증명으로 완성된다. 물론 산출 과정중에 초기 산출 방법과 루프의 해결 그리고 보정을 위한 서퍼가 존재한다.</p><p><strong>(Step1) 초기화</strong>각 노드들의 중요도 초기값은 1N1N으로 설정.(이때 NN은 전체 웹페이지의 개수)</p><p><strong>(Step2) 업데이트</strong>노드 K의 t번째 시도에서 중요도를 $PR(K;t)$ 라고 할때, $ PR(K;t+1)$ 은 $ PR(K;t+1) = \frac{1d}{N} + d \Sigma{P∈K} \frac{PR(P;t)}{|Γ_P|} $ 이다. 여기서 $d(0≤d≤1)$는 제동(damping)계수이고, $Γ_K$는 K에서 인용한 노드들의 집합이다. 그리고 $|ΓP|$는 P를 인용한 노드의 개수이다.</p><p>구글행렬은 행렬분리를 하기 좋은 구조로 이루어져 있으며 이 덕분에 반복연산을 행하기에 매우 좋은 구조로 되어있다. 그래프를 인접행렬로 표현한 후, 각각의 페이지값을 확률행렬로 나타낸다. 인접행렬을 n승하면 n번 순회하여 도달하는 페이지를 의미한다. 하지만 인접행렬로 계산하면 수렴성을 보장할 수 없기 때문에 수렴성의 확보를 위해 확률행렬로 변환한 후, 각 열의 합이 1이 되고 나서 n승 계산을 수행한다. 따라서 행렬 S는 다음과 같이 정의한다. $S = H + \frac{1e^T}{N}$ N은 총 노드의 갯수, 벡터 1인 전체 1인 열벡터이고, e는 특정 열의 합이 0이면 원소값이 1인 열벡터이다.</p><p>이제 이 확률행렬을 수렴하게 계산하기 위해 구글행렬 G를 계산한다.</p><p>$G = dS + (1-d)E$이고, 이때 d는 Damping 계수이다. 이렇게 계산한 구글행렬을 페이지랭크 알고리즘에 대입하면 가장 큰 고윳값이 1인 행렬이 되어 Frobenius 정리에 의해 초기값에 관계없이 일정한 값으로 수렴한다.</p></div><footer class=post-footer><ul class=post-tags></ul><nav class=paginav><a class=prev href=http://blog.morgan.kr/posts/yangjadeulyi-teuraenjiseuteo/><span class=title>« Prev</span><br><span>양자들의 트랜지스터와 핫 캐리어 효과</span></a>
<a class=next href=http://blog.morgan.kr/posts/insaeng-dubeonjjae-silpae/><span class=title>Next »</span><br><span>인생 두번째 실패. 두번째 대학탈락.</span></a></nav><br></footer></article></main><footer class=footer><span>&copy; 2023 <a href=http://blog.morgan.kr>Morgan's Blog</a></span>
<span>Powered by
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html>