<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>투빅스 GNN 스터디 </title>
        <link>https://velog.io/</link>
        <description>2021 투빅스 GNN 스터디 </description>
        <lastBuildDate>Mon, 12 Apr 2021 12:49:26 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>투빅스 GNN 스터디 </title>
            <url>https://images.velog.io/images/tobigs-gnn1213/profile/f98e4e4d-4c05-410b-bb55-602f820b7657/투빅스로고_정사각형.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 투빅스 GNN 스터디 . All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tobigs-gnn1213" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[18. Limitations of Graph Neural Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/Limitations-of-Graph-Neural-Networks</link>
            <guid>https://velog.io/@tobigs-gnn1213/Limitations-of-Graph-Neural-Networks</guid>
            <pubDate>Mon, 12 Apr 2021 12:49:26 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/taeukkkim">김태욱</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
<li>Limitations of conventional GNNs in capturing graph structure</li>
<li>Vulnerability of GNNs to noise in graph data</li>
<li>Open questions &amp; Future directions</li>
</ol>
<hr>
<h2 id="0-intro">0. Intro</h2>
<p>핵심 아이디어 : 로컬 네트워크 환경을 기반으로 노드 임베딩 생성
neighbor aggregation의 아이디어를 기반으로 노드는 신경망을 사용하여 neighbor로부터 정보를 수집합니다.
<img src="https://images.velog.io/images/tukim/post/ed78700e-b30f-4314-9915-5a9ef82e167f/image.png" alt="">
다양한 신경망 선택에 따라 다양한 모델 변형이 제안되며 모델에 따라 박스 안에 들어가는 내용물이 달라집니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/96aa6fae-a399-4ce7-b3bf-8b9a3e08cc9a/image.png" alt="">
각 노드는 이웃에 따라 computation graph를 정의하고 neighbor aggregation을 통해 노드 임베딩을 구합니다. node representation을 구한 후 해당 graph의 노드들을 더하거나 평균내는 방식(Pooling)으로 하나의 graph representation을 구하게 됩니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/5cb17ebd-57b5-423b-af6f-76ea5b98becd/image.png" alt="">
위의 그림과 같이 GNN을 활용하여 많은 SOTA성능을 내기도 했지만 GNN에는 한계가 존재하고 이번 강의에서 그 한계에 대해 배우게 됩니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/fe1075ae-622e-4551-84e7-28b06989c29b/image.png" alt="">
GNN에는 크게 2가지 한계점이 존재합니다.</p>
<ol>
<li>기존의 GNN으로는 일부 간단한 그래프 구조를 잘 구분하지 못합니다.</li>
<li>GNN은 그래프 데이터의 노이즈(node feature의 변화, edge의 추가/삭제)에 robust하지 못합니다.</li>
</ol>
<h2 id="1-limitations-of-conventional-gnns-in-capturing-graph-structure">1. Limitations of conventional GNNs in capturing graph structure</h2>
<h3 id="graph-isomorphism">Graph Isomorphism</h3>
<p><img src="https://images.velog.io/images/tukim/post/9c6f6fb7-289a-472f-bbcb-8b6923a0e03c/image.png" alt="">
GNN은 위 그림의 두 그래프를 잘 구분해 내지 못할 수 있습니다. 이러한 문제를 완벽하게 해결할 수 있는 다항식 알고리즘은 없기 때문에 GNN이 완벽하게 구분하지 못할 수 있으며 이를 해결하기 위해선 그래프의 설계부터 신경써야 합니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/018fc564-d476-4c02-b6af-75a0b74bcf0f/image.png" alt="">
왼쪽의 그림을 보면 4개의 노드는 다 다른 노드지만 computation graph를 보면 모두 동일하며 각 노드가 다르다는것을 GNN에 이해시키는 것은 불가능합니다. 반면 오른쪽의 그래프를 보면 노드간의 차이가 존재합니다. </p>
<p><img src="https://images.velog.io/images/tukim/post/a2e8fc6c-b9a2-4d3c-b042-a43b7265eb37/image.png" alt="">
graph representation을 위해 neighbor aggregation을 통한 node representation을 하면 두 개의 다른 노드를 가진 그래프가 생깁니다. 하지만 이러한 aggregating 과정에서  mean pooling이나 max pooling을 사용하게 되면 두 그래프는 같은 결과값이 나오게 됩니다. 이를 해결하기 위해 injective function을 aggregate function로 사용합니다.</p>
<h4 id="injectivity">injectivity</h4>
<p><img src="https://images.velog.io/images/tukim/post/ad248804-b480-4fe4-8f6c-3497719ae8a7/image.png" alt="">
하나의 output에 하나의 element를 mapping하는 것으로, 이를 통해 node의 subtree가 다르면 node representation 또한 달라지게 됩니다. 여기서 각 트리의 층마다 injective function을 적용해 줍니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/1d20ac88-c011-474d-966f-3fda795af2e4/image.png" alt="">
Neighbor aggregation은 multi-set로 이루어지는데, 여기서 multi-set는 set에서 중복요소를 추가한 것입니다. 이를 활용함으로써 neighbor aggregation을 더욱 잘 표현할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/b87e010b-7085-4748-a34a-db40d35f2bd7/image.png" alt="">
<img src="https://images.velog.io/images/tukim/post/18ab7050-a59c-463a-b5a5-87df2eb50c22/image.png" alt="">
GCN과 GraphSAGE에는 multi-set를 적용하더라도 injective하지 않습니다. GCN에서 mean pooling을 하는 경우 노란색 1개, 파란색 1개인 경우와 2개,2개인 경우 모드 mean을 한다면 0.5 * 0.5가 되어 같은 결과가 나옵니다. GraphSAGE에서는 max값만 뽑기 때문의 각 노드의 개수는 중요하지 않습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/438d48e9-53b1-4538-8afe-b5ded4a077c3/image.png" alt="">
<img src="https://images.velog.io/images/tukim/post/1f16517b-0035-4de7-bba7-d3d5242dde63/image.png" alt=""></p>
<p>injective mult-set function을 표현하면 위 그림과 같습니다.</p>
<h4 id="graph-ismorphism-network-gin">Graph Ismorphism Network (GIN)</h4>
<p><img src="https://images.velog.io/images/tukim/post/f8b3aa52-cd36-45b1-98ab-accaeaa15170/image.png" alt="">
위의 예시를 GCN과 GraphSAGE는 구별 할 수 없지만 GIN의 Sum pooling을 사용하면 구분할 수 있습니다.</p>
<p>Weisfeiler-Lehman (WL) Graph Isomorphism Test와 마찬가지로 GIN은 동형 그래프를 구별하는 좋은 능력을 가지고 있는데 그 방법은 아래와 같습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/4a106576-f869-420a-8212-bdc60406a8ec/image.png" alt="">
먼저 root로부터 subtree를 하나씩 내립니다. 이때, node간의 다름이 확인되면 거기서 멈추고 같은 개수의 subtree를 가지고 있다면 이를 계속 진행해 시작 노드의 색을 구분합니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/bf85b71e-bb2c-4cdd-8fb9-705fbea793dd/image.png" alt="">
<img src="https://images.velog.io/images/tukim/post/bfa18490-95d0-4e1b-9e16-cf3eee2c1387/image.png" alt="">
이후 각 그래프에서 같은 색의 노드 개수를 세어주고 이를 바탕으로 그래프를 이루는 노드의 개수를 구분합니다. 그 결과가 동일하다면, 두 그래프는 isomorphism 하다고 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/b9ac4a72-77c0-4ca4-8b5f-03896e4ab30a/image.png" alt="">
이렇게 GIN은 좋은 성능을 보여주지만, 위 그림과 같이 모든 노드가 같은 수의 subtree를 가지는 경우에는 WL로 구분할 수 없습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/49449147-48eb-4b36-84dc-2f426ec9ba0e/image.png" alt="">
다른 모델들과 비교해 좋은 성능을 보여줍니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/f1375f79-4e65-44d9-a884-68d3b640d4eb/image.png" alt="">
node feature가 존재하는 경우에는 성능의 차이가 크지 않다고 합니다.</p>
<h3 id="summary-of-the-first-part">Summary of the first part</h3>
<ol>
<li><p>기존의 GNN은 non-injective neighbor aggregation을 사용하기 때문에 구별하는 능력이 떨어짐</p>
</li>
<li><p>GIN은 injective neighbor aggregation을 사용하기 때문에 성능은 WL graph isomorphism test만큼 좋음</p>
</li>
<li><p>GIN은 graph classification에서 SOTA의 성능을 보임</p>
</li>
</ol>
<h2 id="2-vulnerability-of-gnns-to-noise-in-graph-data">2. Vulnerability of GNNs to noise in graph data</h2>
<p><img src="https://images.velog.io/images/tukim/post/7cde7626-18f8-47d4-ad67-1a7cffa7dfbd/image.png" alt="">
DNN은 데이터 교란에 취약합니다. 눈에 보이지 않는 변화만 주더라도 예측 결과에 변화를 주며 이는 이미지 뿐만 아니라 검색엔진, 추천시스템, sns 등 여러 분야에서 쉽게 발생합니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/5064beda-6fd4-45a8-9866-e5f4c329e258/image.png" alt="">
위 그림은 GCN을 활용한 semi-supervised node classification에서 비어있는 label을 채워 넣는 문제입니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/c286a73d-0e03-4ba6-85a4-aaa542597aed/image.png" alt="">
실생활에서 attack possibilities 하는 방법에는 두가지가 있습니다.</p>
<ol>
<li>Direct attack</li>
</ol>
<ul>
<li>target node를 직접적으로 변경하는 방법으로, target의 feature를 변경한 뒤 target에 대한 연결을 해줍니다. 이는 target으로부터의 연결을 제거함으로써 해결할 수 있습니다.</li>
</ul>
<ol start="2">
<li>Indirect attack</li>
</ol>
<ul>
<li>target을 follow한 후 attacker의 feature를 변경합니다. 이후 attacker의 연결을 늘려 spam farm을 만들어줍니다. 이는 attacker로부터의 연결을 제거함으로써 해결 가능합니다.</li>
</ul>
<h3 id="mathematical-formulation-of-attack">Mathematical Formulation of Attack</h3>
<p><img src="https://images.velog.io/images/tukim/post/e9e5f543-21b8-4bae-889b-6b8efa90e44d/image.png" alt="">
이 공식은 타겟노드에 대한 예측된 라벨의 변화를 최대화하는 수정된 그래프를 찾는것이 목적입니다.이 공식에는 두 가지 주요 공격 유형이 있는데, adjacency matrix A를 변경하는 방법과 node feature X를 변경하는 방법이 있습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/b881055b-a57d-4399-b4b6-bc473c2bb046/image.png" alt="">
타겟노드 v가 c로 예측될 loglikelihood을 높이는 것과 변경되기 전의 c_old로 예측되는 대상 노드 v의 loglikelihood을 줄여줍니다.
공격 전에 노드 v는 c_old에 속합니다.공격 후에는 c_old에 속하는 노드 v의 확률이 낮아지고 동시에 c에 속하는 노드 v의 확률이 증가합니다.</p>
<p>즉, 공격 전후에 서로 다른 범주에 속하는 노드 v의 확률이 변경되어 공격이 성공합니다.</p>
<p>여기서 GCN은 수정 된 그래프에서 훈련 된 후 대상 노드의 레이블을 예측하는 데 사용됩니다.</p>
<p>이렇게 변경된 그래프는 원래의 그래프에 가까워야 합니다. </p>
<h3 id="tractable-optimization">Tractable Optimization</h3>
<p>최적의 해를 정확히 구하는 것은 불가능한데, 그 이유로는 두 가지가 있습니다.</p>
<ol>
<li>Graph modification은 이산적이기 때문에 최적화를 위한 gradient descent를 사용할 수 없음</li>
<li>과정의 일부인 GCN을 다시 학습시키는데 비용이 많이 듬</li>
</ol>
<p>이를 해결하고 근사 솔루션을 얻기 위해 그래프의 수정을 단계적으로 해가는 방법과 ReLU를 제거하여 GCN을 단순화 하는 방법등 몇가지 간편 추론(heuristics)이 제안되었습니다.</p>
<p><img src="https://images.velog.io/images/tukim/post/c243d5fd-2fa1-45d9-9446-614c5128c289/image.png" alt="">
<img src="https://images.velog.io/images/tukim/post/83e07713-64ac-4baa-aef6-dbfe79256da8/image.png" alt=""></p>
<h3 id="summary-of-the-second-part">Summary of the second part</h3>
<p>GNN은 robust하지 못하고 공격에 취약합니다.</p>
<h2 id="3-open-questions--future-directions">3. Open questions &amp; Future directions</h2>
<p>향후 화학과 생물학 등 과학 도메인에 GNN을 적용하기 위해 연구할 예정입니다.</p>
<p>현재 직면한 과제로는 </p>
<ol>
<li>라벨링된 데이터의 부족</li>
</ol>
<ul>
<li>라벨링에는 비싼 실험이 필요하고 라벨링된 데이터 부족으로 인해 모델이 오버피팅 됨</li>
</ul>
<ol start="2">
<li>실제 테스트 케이스와 학습한 것이 많이 달라 분포 이탈 예측이 발생함(일반적으로 성능이 좋지 않음)</li>
</ol>
<p><img src="https://images.velog.io/images/tukim/post/33a6781c-b3b0-4fe2-8c00-e2cbcd5f917d/image.png" alt="">
<img src="https://images.velog.io/images/tukim/post/2e9eb46e-d3f1-4cdd-a5ac-c4b1d754848f/image.png" alt="">
과학 분야에서의 pre-training GNN이 연구되고 있으며 공격이 있으면 방어가 있듯 GNN을 robust하게 만들기 위해 노력하고 있음</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[17. Reasoning over Knowledge Graphs]]></title>
            <link>https://velog.io/@tobigs-gnn1213/17.-Reasoning-over-Knowledge-Graphs</link>
            <guid>https://velog.io/@tobigs-gnn1213/17.-Reasoning-over-Knowledge-Graphs</guid>
            <pubDate>Mon, 12 Apr 2021 08:10:38 GMT</pubDate>
            <description><![CDATA[<p>신윤종 지음</p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Reasoning over Knowledge Graphs</li>
<li>Path Queries</li>
<li>Conjunctive queries</li>
<li>Query2Box</li>
</ol>
<hr>
<h1 id="reasoning-over-knowledge-graphs">Reasoning over Knowledge Graphs</h1>
<h2 id="knowledge-graphs">Knowledge Graphs</h2>
<ul>
<li>Knowledge 즉, 지식을 그래프의 형태로 구성한 것<ul>
<li>node = entity (labeled with type)</li>
<li>edge = relationship
<img src="https://images.velog.io/images/tobigs-gnn1213/post/7b78713e-4690-4b19-8439-bbf280690a44/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="kg-representation">KG Representation</h2>
<ul>
<li><p>KG에서의 edge는 triples(h, r, t)로 임베딩 할 수 있다</p>
<ul>
<li>head(h): 출발노드(앵커 노드)</li>
<li>relation(r): edge, 관계</li>
<li>tail(t): 도착 노드</li>
</ul>
</li>
<li><p>우리의 KG를 임의의 차원으로 임베딩 시키고 실제로 연결되어있는 true triple(h, r, t)가 주어졌다고 해보자</p>
</li>
<li><p>Ex) h(기생충)의 r(감독) t(봉준호)</p>
<ul>
<li>Q1) 기생충의 감독은 봉준호. 즉, h에서 r만큼 이동한 위치가 t의 위치와 똑같아야 겠지?</li>
<li>Q2) 그러면 (h, r)을 어떻게 임베딩 시킬까?</li>
<li>Q3) 두 노드 간의 거리는 뭘로 정의하지?</li>
</ul>
<br>

</li>
</ul>
<h2 id="relation-patterns">Relation Patterns</h2>
<p>Relation의 특성 3가지를 살펴보자
<img src="https://images.velog.io/images/tobigs-gnn1213/post/80dd37c2-3310-4e68-b971-80924dc503d6/image.png" alt=""></p>
<br>

<h2 id="transe">TransE</h2>
<p>앞서 Graph representation에서 배웠던 TransE를 써먹을 수 있을 것 같다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/16feaf4f-bcd6-422c-816b-b7c65d842bf6/image.png" alt=""></p>
<ul>
<li>TransE는 h, r, t를 임의의 차원에 매핑하는 임베딩 방법이다.</li>
<li>h에서 r만큼 이동한 위치가 t의 위치가 같을 수록 좋다!</li>
</ul>
<br>

<h3 id="transe-training">TransE Training</h3>
<p>TransE는 어떻게 학습할까?
<img src="https://images.velog.io/images/tobigs-gnn1213/post/bed87df2-833d-4159-8093-bb26ed61951c/image.png" alt=""></p>
<ol>
<li>True triple과 Corrputed triple(가짜) 2가지를 뽑고 2가지 값과 임의의 마진값의 합을 maximize한다<ul>
<li>True tiple의 거리가 가까울 수록 좋다</li>
<li>Corrupted tirple의 거리가 멀 수록 좋다</li>
</ul>
</li>
</ol>
<br>

<h3 id="link-prediction-using-transe">Link Prediction using TransE</h3>
<ul>
<li>TransE는 Link prediction에 써먹을 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/5a383bb4-0892-4827-bfef-cd0394d22711/image.png" alt=""></li>
</ul>
<h3 id="composition-in-transe">Composition in TransE</h3>
<ul>
<li>KG의 특성인 Composition을 만족한다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/fa73cdac-4baa-4a9c-ac94-3a70394c9d91/image.png" alt=""></li>
</ul>
<h3 id="limitations">Limitations</h3>
<ul>
<li>그러나 TransE는 2가지의 KG 특성을 만족시키지 못한다.</li>
</ul>
<h4 id="symmetric-relations">Symmetric relations</h4>
<ul>
<li>만약 r이 0이라면 symmetric 특성에 따라 h와 t가 같아야하지만, 실제로 매핑된 TransE값을 보면 h와 t는 서로 다른 벡터이다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/7be2b23c-c015-4abb-a3a0-62818946f4ed/image.png" alt=""><h4 id="n-ary-relations">N-ary relations</h4>
</li>
<li>일대다, 다대일, 다대다 관계를 만들 수 없다</li>
<li>만약 (h, r)의 결과인 t가 많은 경우<ul>
<li>t1 = h+r</li>
<li>t2 = h+r   -&gt; t1과 t2는 같아야한다</li>
<li>그러나 t1 != t2 
<img src="https://images.velog.io/images/tobigs-gnn1213/post/a075429c-8c7e-48b9-8c7d-f82218117e8f/image.png" alt=""><br>

</li>
</ul>
</li>
</ul>
<h2 id="transr">TransR</h2>
<ul>
<li>TransE와 동일하게 entity vector를 임의의 d차원을 매핑한 후 각 relation을 vector r로써 다른 k차원에 매핑한다. </li>
<li>임베딩 매트릭스 ${M_r}$의 shpae은 (k, d)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/b9c3c624-360a-4316-adb3-56d452c769d1/image.png" alt=""></li>
</ul>
<h3 id="symmetric-relation-in-transr">Symmetric relation in TransR</h3>
<ul>
<li>TransR은 symmetric 특성을 보존할 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/158ee395-46c4-4e1e-b6df-779eb7a87868/image.png" alt=""><h3 id="n-ary-relation-in-transr">N-ary relation in TransR</h3>
</li>
<li>일대다, 다대일, 다대다 관계도 지킬 수 있다</li>
<li>d차원에서 다른 노드더라도 r을 통해 k차원으로 매핑시킨다면 같은 값으로 임베딩 될 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/93966659-a1d1-43ce-a21e-4c5b3f207b72/image.png" alt=""></li>
</ul>
<h3 id="limitation">Limitation</h3>
<ul>
<li>그러나 TransE와 반대로 composition 관계를 보전할 수 없다</li>
<li>왜냐하면 TransR에서 모든 r은 각자 다른 space에 매핑하는 역할이기 때문!
<img src="https://images.velog.io/images/tobigs-gnn1213/post/a5816fa0-3e04-4f7c-9127-e84444292ab8/image.png" alt=""></li>
</ul>
<br>

<h2 id="translation-based-embedding">Translation-Based Embedding</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/d0e685eb-e0c5-4949-9db3-aad2eae2069c/image.png" alt=""></p>
<h1 id="path-queries">Path Queries</h1>
<h2 id="query-type-on-kg">Query type on KG</h2>
<ul>
<li>만약 multi-hop reasoing을 진행한다면 어떻게 될까?</li>
<li>복잡한 질의를 불완전하고 거대한 KG가 다룰 수 있을까?
<img src="https://images.velog.io/images/tobigs-gnn1213/post/99df9e43-b1af-437d-90b0-5ed4fa93b129/image.png" alt=""></li>
</ul>
<br>

<h3 id="one-hop-queries">One-hop queries</h3>
<ul>
<li>간단한 one-hop 질의는 link prediction으로 생각할 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/1f754c84-e9e1-42c0-8121-da65a961d79c/image.png" alt=""></li>
</ul>
<h3 id="path-queries-1">Path queries</h3>
<ul>
<li>one-hop을 일반화하여 여러 단계로 나누어 path를 구성하여 질의를 진행할 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/b3cd0dcb-4a41-4855-8684-321f3f477d73/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/aa6c35ea-9bea-42d2-85bb-695fdacb2a5c/image.png" alt=""></li>
</ul>
<h2 id="traversing-kg">Traversing KG</h2>
<ul>
<li><p>KG에서 multi-hop을 진행해본다고 해보자
<img src="https://images.velog.io/images/tobigs-gnn1213/post/9f8577f8-4c13-457a-8eef-678fa1a8fcaf/image.png" alt=""></p>
</li>
<li><p>IDEA 1) one-hop처럼 link prediction으로 KG를 횡단할 수 있지 않을까?</p>
<ul>
<li>NO! KG는 dense graph이기 때문에 매 스텝마다 모든 노드와의 link 확률을 구한다면 시간복잡도는 path의 길이가 n이라면 $O(|V|^n)$이 걸린다!
<img src="https://images.velog.io/images/tobigs-gnn1213/post/cbe3ef5e-0d04-48cb-8530-e65efef2a1ee/image.png" alt=""></li>
</ul>
</li>
<li><p>IDEA 2) query를 임베딩하자</p>
</li>
<li><p>TransE를 multi-hop reasoning에 사용할 수 있을 것 같다 -&gt; Compoistion을 만족하니까!</p>
</li>
<li><p>score function은 ||q - v||로 바로 구할 수 있으니까 훨씬 빠르다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/02162422-3aa3-41a7-9206-e1fe765b8963/image.png" alt=""></p>
</li>
</ul>
<h3 id="traversing-kg-in-vector-space">Traversing KG in vector space</h3>
<ul>
<li>TransE를 활용한 multi-hop 예시를 보자
<img src="https://images.velog.io/images/tobigs-gnn1213/post/68d3579d-2ffe-4972-9bc1-0f9029b79ee1/image.png" alt=""></li>
</ul>
<br>

<h1 id="conjunctive-queries">Conjunctive queries</h1>
<ul>
<li>더 복잡한 질의는 어떻게 다룰까?</li>
<li>만약 multiple ancohor node에서 출발하면?
<img src="https://images.velog.io/images/tobigs-gnn1213/post/f6d5a435-15a7-4c4d-a5b0-393825c11f38/image.png" alt=""></li>
</ul>
<ul>
<li>과정을 살펴보자<ol>
<li>anchor node 각각 출발하여 두 relation이 겹치는 node를 찾는다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/e13db3c9-63ce-4ca8-8b09-231fc27b7059/image.png" alt=""></li>
<li>multi-hop을 진행한다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/4a17e0c5-1d58-4dd9-9296-c6ae5ffe4a1e/image.png" alt=""></li>
</ol>
</li>
</ul>
<br>

<h3 id="traversing-kg-in-vector-space-1">Traversing KG in vector space</h3>
<ul>
<li><p>Computation grpah와 embedding space를 동시에 비교해보자
<img src="https://images.velog.io/images/tobigs-gnn1213/post/08b3d607-a088-42cc-9522-b9172575db0e/image.png" alt=""></p>
</li>
<li><p>Q) 실제 임베딩 space에서 점 하나로 딱 떨어지지 않는데 뭐가 정확한 intersection인가?</p>
<ul>
<li>A) 아몰랑 Neural Net이 해결해주실거야</li>
</ul>
</li>
</ul>
<h2 id="neural-intersection-operator">Neural intersection operator</h2>
<ul>
<li>여러 query를 받아서 intersection을 찾아야 한다</li>
<li>전지전능 neural intersection operator $J$를 모델링하자<ul>
<li>Input: query embedding set $(q1, ..., q_m)$</li>
<li>Output: intersection embedding $q$</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/fdeefa9a-b2e5-424e-9f4b-71d8fecc4a32/image.png" alt=""></p>
<ul>
<li>그러면 우린 성공적으로 intersection을 찾을 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/d2128ed4-8b36-46a8-8e59-0226baee68fc/image.png" alt=""></li>
</ul>
<h3 id="training">Training</h3>
<ul>
<li><p>entity embedding $v$와 query embedding $q$가 주어졌을 때</p>
</li>
<li><p>score function = $||q - v||$</p>
</li>
<li><p>parameters</p>
<ul>
<li>entity embedding: $d|V|$</li>
<li>relation embedding: $d|R|$</li>
<li>intersection operator φ, β: 그래프 사이즈에 영향받지 않음</li>
</ul>
</li>
<li><p>TransE하고 똑같이 학습하면 됨</p>
<ol>
<li>query q, answer v, negative sample v&#39;를 샘플링한다</li>
<li>q를 임베딩한다</li>
<li>v와 v&#39; score를 구한다</li>
<li>loss 최적화 한다</li>
</ol>
</li>
<li><p>Evaluation</p>
<ol>
<li>test query q를 임베딩한다</li>
<li>모든 triple v에 대하여 score를 구한다</li>
<li>ditance rank를 구하여 prediction한다</li>
</ol>
</li>
<li><p>Limitations</p>
<ul>
<li>단순히 intersection vector 하나 구하는 것은 직관적이지 않음</li>
<li>정답이 될 수 있는 후보군을 추릴 수 없을까?</li>
<li>기하학적으로 더 설득력있는 답을 내놓고싶은데...</li>
</ul>
</li>
</ul>
<h1 id="query2box">Query2Box</h1>
<h2 id="box-embeddings">Box Embeddings</h2>
<ul>
<li>query를 box로 임베딩하자
<img src="https://images.velog.io/images/tobigs-gnn1213/post/c97cbd10-a469-443e-bf3b-462493acab1c/image.png" alt=""></li>
<li>기존 intersection vector를 구하는 방식에 비해 더 직관적이다!</li>
</ul>
<h3 id="embed-with-box">Embed with Box</h3>
<ul>
<li>parameters<ul>
<li>entity embedding: 크기가 0인 box로 초기화</li>
<li>relation embedding: $2d|R|$ center와 offset때문에 2개씩 만든다</li>
<li>intersection operator φ, β: 그래프 사이즈에 영향받지 않음<ul>
<li>input으로 box를 받아서 output으로 box를 뱉을 예정</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="projection-operator">Projection operator</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/26ecf114-c642-4320-809d-8507c7625d75/image.png" alt=""></p>
<ul>
<li>path가 진행될 수록 box는 계속 커지며 간단히 생각해서 error에 해당되는 부분이라고 보면 된다</li>
</ul>
<h3 id="embed-with-box-1">Embed with Box</h3>
<ul>
<li>기존 intersection vector를 구하는 방식과 달리 box를 임베딩하였다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/24704a8e-13d3-4ced-8d9c-5ce7a41c5b37/image.png" alt=""></li>
</ul>
<ul>
<li>모든 box의 교집합 부분을 intersection box로 본다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/b879fe37-a464-4171-a32c-5d9068af7afb/image.png" alt=""></li>
</ul>
<ul>
<li>center는 weighted average로 정한다</li>
<li>new offset은 줄어든 것을 알 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/ef7b1ec8-0a0c-428b-865f-9c63a062871d/image.png" alt=""></li>
</ul>
<ul>
<li>이를 embedding space 관점에서 살펴보자</li>
<li>intersection box를 구하고, 다음 매핑에서 새로운 box를 만들었다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/ee4ad78b-525d-4822-899f-6a5927537acb/image.png" alt=""></li>
</ul>
<br>

<h3 id="entity-to-box-distance">Entity-to-Box distance</h3>
<ul>
<li>query box $q$와 entity vecotr $v$가 주어졌을 때 distance를 구해보자</li>
<li>$q$에서 시작해서 $v$까지의 L1 norm을 distance로 정의할 수 있고 알파를 조절하여 box $q$의 영향을 조절할 수 있다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/9da500be-278f-42a1-bab0-bef8839c135d/image.png" alt=""></li>
</ul>
<br>

<h3 id="training-1">Training</h3>
<ul>
<li>loss를 minimize하는 방식으로 학습한다</li>
<li>좌항에서 true box score를 minimize하고, 우항에서 false box score를 maximize한다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/9b04444a-2bbe-4b24-9d48-4082b920aca6/image.png" alt=""></li>
</ul>
<h3 id="relation-patterns-1">Relation patterns</h3>
<ul>
<li>결론 Leskovec 교수가 갓이다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/f045f760-9f63-494a-9b17-5f602883f239/image.png" alt=""></li>
</ul>
<h1 id="epfo-queries">EPFO queries</h1>
<ul>
<li>Existential Positive First-order (EPFO) : Conjunctive queries + disjunction</li>
<li>기존 embedding 방법으로 처리할 수 있다</li>
<li>Process<ol>
<li>모든 union이 걸린 노드마다 최종 목적지인 $v_{parent}$를 선택한다</li>
<li>모든 union edge를 제거한다</li>
<li>모든 union node를 순회하면서 $v$와 $v_{parent}$로 새로운 compuation graph를 조직한다</li>
</ol>
</li>
<li>쉽게 생각해서 모든 경우의 수를 따로 나누어서 graph를 만든다고 보면 된다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/e98d3a20-cf58-4700-9924-5152fedb5fcd/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[16. Network Evolution]]></title>
            <link>https://velog.io/@tobigs-gnn1213/16.-Network-Evolution</link>
            <guid>https://velog.io/@tobigs-gnn1213/16.-Network-Evolution</guid>
            <pubDate>Mon, 05 Apr 2021 10:03:15 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/jinseock95">오진석</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Introduction of Network Evolution</li>
<li>Macroscopic Evolution of Networks</li>
<li>Temporal Networks</li>
<li>Microscopic Evolution of Networks</li>
<li>Mesoscopic Evolution of Networks</li>
</ol>
<hr>
<h2 id="1-introduction-of-network-evolution">1. Introduction of Network Evolution</h2>
<p><em>Today, we&#39;ll be talking about evolution of networks and dynamic networks and how do we model that.</em></p>
<p><em>networks that change their structure over time.</em></p>
<p>이번 16번 강의에서는 시간의 흐름에 따라 구조가 바뀌는 network의 진화(변화), 동적 네트워크 그리고 그러한 네트워크를 모델링하는 방법에 대해서 다룹니다.</p>
<p>네트워크가 진화하는 과정을 네트워크의 규모적인 관점에서 다르게 바라보게 되며, 해당 관점에서 자세하게 다룰 수 있는 것들에 초점을 마추게 됩니다. 또한 진화 혹은 변화는 항상 시간적인 요소와 관련이 있기 때문에 이번 강의에서는 temporal한 특징을 자주 고려하여 네트워크를 다루게 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/07d8ea0c-628a-4f04-a3df-032b4c67b3b4/image.png" alt=""></p>
<p>사실 거의 모든 real world(복잡계)의 네트워크는 시간이 지남에따라 link와 edge를 추가하고 제거함으로써 evolve(진화)합니다. 아주 간단한 예시로, 우리는 새로운 친구를 사귈 수도 있고 친구를 잃을 수도 있기 때문에 친구 관계라는 네트워크에서 사람들(노드)이 추가되기도 제거되기도 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/3a3219df-a38b-4339-ba3a-a0396933aa37/image.png" alt=""></p>
<p>그 다음으로는 네트워크가 진화하는 예시를 보여주고 있습니다. 좌상단 첫번째 강의노트에서는 과제를 하면서 학우들과의 관계 네트워크가 진화하고 있음을 보여주고 우상단 두번째 강의노트에서는 10개의 큰 산업별 네트워크의 진화 과정이라고 할 수 있습니다. 하단의 예시들도 마찬가지로 시간의 지남에 따라 변화하는 네트워크를 보여주고 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/d9e5f01c-f5c7-468c-a552-0b19d428e537/image.png" alt=""></p>
<p>정리하자면, 오늘 강의에서 중점적으로 다룰 내용은 여러 다른 level에서 진화하는 네트워크를 연구하는 방법입니다. 여러 다른 level이란 네트워크의 규모적인 관점에서의 진화를 바라보는 것으로 이해했습니다.</p>
<ul>
<li><strong>macroscopic level</strong>(거시적인 규모): 네트워크의 전체적인 구조의 특징이 시간에 따라 어떻게 변화하는지</li>
<li><strong>meso level</strong>(inntermediate scale): 네트워크 motif와 같은 보다 작은 substructures가 생겨나고 나타는지</li>
<li><strong>micro level</strong>: 네트워크가 변함에 따라 노드의 중요성 또한 어떻게 변화하는지</li>
</ul>
<p>강의는 macroscopic level을 시작으로 micro level, 마지막으로 meso level 순서로 다룰 예정입니다.</p>
<h2 id="2-macroscopic-evolution-of-networks">2. Macroscopic Evolution of Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/e25c317b-757b-40d6-b06b-27781aa2f5fe/image.png" alt=""></p>
<p>macro level에서 네트워크는 어떻게 진화할까요? 그리고 네트워크의 성장/확장의 전반적인 현상은 무엇일까요? 강의에서는 해당 질문의 포인트에 있어 3가지 question을 던집니다.</p>
<ul>
<li>시간이 지남에 따라 노드의 수와 엣지의 수 간의 관계는 어떻게 정의할 수 있는가?</li>
<li>네트워크 성장에 따라 네트워크의 diameter(지름)은 어떻게 변화하는가?</li>
<li>또한 네트워크의 차수의 분포는 어떻게 변화하는가?</li>
</ul>
<p>이 3가지 포인트 질문은 네트워크의 진화의 보편적인 원칙(universal law)을 통해 확인할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/2aeb286f-a03e-4cfa-9774-5377c22b6a52/image.png" alt=""></p>
<p>t 시점의 시간에서 N개의 노드와 E개의 엣지가 있습니다. 이 때, t+1 시점 혹은 미래의 시점에서 노드의 개수가 2N개가 되었다고 가정할 수 있습니다. 그렇다면 이 때, 엣지의 개수는 어떻게 될지 생각해볼 수 있습니다.</p>
<p>다양한 관점에서 생각해볼 수 있지만, 강의자는 다음과 같이 말합니다.
_
I actually argue that it&#39;s not clear why the number of connections should grow faster that the number of people(node)._</p>
<p>이는 노드의 증가는 명백하게 몇 개가 증가했는지 알 수 있지만 노드와 노드와의 관계는 어떻게 설정되는지에 따라 증가할수도 감소할수도 있기 때문에, 노드의 증가에 따라 엣지가 증가한다는 사실을 명백하게 밝힐 수는 없다고 이해했습니다. 여기서 노드의 증가에 따라 엣지가 증가한다는 것은 어떻게 보면 보통은 당연할 수밖에 없는 상황으로 이해할 수 있습니다.</p>
<p>어쨋든 노드의 개수가 2개가 되는 시점에서의 엣지의 개수에 대한 답변은 <strong>2배 이상</strong>이라고 합니다. 이에 대한 답변?이유?는 <strong>Densification Power Law</strong>라는 것을 따른다고 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/dfaf78ca-383f-4c3b-9168-fa3e5e7169a8/image.png" alt=""></p>
<p>첫번째 포인트 질문입니다. </p>
<p><strong>시간이 지남에 따라 노드의 수와 엣지의 수 간의 관계는 무엇인가?</strong></p>
<p>우측의 Internet 네트워크와 Citations(참고문헌 관계) 네트워크의 로그 스케일상 노드와 엣지의 2차원 관계를 볼 수 있습니다. 각 포인트는 t시점마다의 노드의 개수와 엣지의 개수의 위치이며 결론적으로 노드와 엣지의 관계는 로그 스케일상 선형 관계를 가지고 있음을 알 수 있습니다.</p>
<p>이 때, 기울기는 0과 2사이의 값으로 표현될 수 있는데, 1.2와 1.6의 의미는 노드의 증가보다 엣지의 증가가 보다 빠르며 차수의 평균도 증가한다는 것으로 해석할 수 있습니다. 이러한 과정이 네트워크 진화에서 empirical observation이라고 할 수 있는  네트워크가 보다 빽빽(dense)해지는 <strong>Densification Power Law</strong>를 의미합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/75fefdc8-c796-4b88-bd1d-7dcda16e3446/image.png" alt=""></p>
<p>정리하자면, Densification Power Law는 엣지의 수는 노드의 수보다 빠르게 증가하며 평균 차수 또한 증가함을 말합니다. 이 때 수식으로는 다음과 같이 표현할 수 있습니다. 이 때, 로그 엣지의 수를 로그 노드의 수로 나누게 되면 constant이다 라고 말하는데, 엣지의 수가 로그의 수보다 로그 스케일상 항상 일정 배수를 유지한다고 이해했습니다. (그런데 모든 시점에서 노드와 엣지가 going in/going out 하는 개수가 달라질텐데 로그 스케일상 constant한 배수를 가지는 것이 가능한지 잘은 모르겠습니다.)</p>
<p>앞서 언급했듯이, densification exponent는 엣지의 수가 노드의 수보다 빠르게 증가하기 때문에 1 이상의 값을 가지며 제곱의 형태도 증가하지 않기 때문에 2보다 작은 값을 가집니다. 값이 1이면 기울기값으로 증가하는 1차식 형태를 의미하게 되면 값이 2이면 2차식 형태로 증가하는 형태가 될 것 같습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/ad399eea-7c56-4567-831a-99794bf1999d/image.png" alt=""></p>
<p>두번째 포인트 질문입니다.</p>
<p><strong>네트워크 성장에 따라 네트워크의 diameter(지름)은 어떻게 변화하는가?</strong></p>
<p>먼저 그래프 상에서 지름, Diameter는 <strong>정점 간 거리의 최댓값</strong>을 의미합니다.</p>
<p>강의 1과 2에서 다뤘던 랜덤 그래프의 직경은 노드의 수 N에 따라 logarithmically하게 증가한다고 했습니다. 예를 들어, 노드의 수가 적으면 logarithmically하게 직경은 보다 작을 것이고 노드의 수가 많으면 보다 큰 직경을 가지게 될 것입니다. 그러나 항상 옳은 사실은 아니라고 밝혀졌습니다. 이는 매우 반직관적인데(왜냐하면 시간이 지나면 노드가 증가할 것이고 그림처럼 직경 또한 증가할 것으로 예상하기 때문입니다.), 직접 직경을 측정해서 plot으로 그려보게 된다면 시간에 흐름에 따라 직경이 줄어듦을(shrinking) 알 수 있습니다. 우측 Internet 네트워크와 Citation 네트워크를 보게 되면 시간의 흐름에 따라 직경이 감소하고 있음을 확인할 수 있습니다.</p>
<p><strong>네트워크의 크기가 증가함에도 불구하고 직경이 줄어든다는 의미는 노드 간의 거리가 천천히 감소가고 밀도가 증가했다고 해석할 수 있습니다.</strong> </p>
<p><img src="https://images.velog.io/images/jinseock95/post/9a16b2b7-97c4-469b-9b3a-fed9e77f3e1f/image.png" alt=""></p>
<p>그렇다면 직경의 감소는 그저 밀도로 인한 결과라고 할 수 있을까요? 시뮬레이션을 통해 답을 얻을 수 있었다고 합니다. 서로 다른 크기의 랜덤 그래프를 생성한 뒤에 밀도를 측정합니다. 결과를 살펴보면 네트워크의 크기(여기서는 밀도를 의미한다고 이해했습니다, densify)에 따른 직경의 증가는, densification exponent가 1.3으로 증가한다고 이해할 수 있습니다.</p>
<p><em>if the densification would be the sole contributor to the shrinking diameter, I should see the thing going down, but don&#39;t</em></p>
<p>만약 직경의 감소에 대한 원인으로 densification이라고 한다면 오히려 densification exponent가 1보다 작고 그래프가 감소해야하지만 그렇지 않습니다. 즉, 정리하자면 밀도만이 직경의 감소의 원인이라고 할 수 없으며, 분명 다른 원인이 있을 것입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/cb71d1b4-096b-4fdd-8665-9ba898a0a16f/image.png" alt=""></p>
<p>실제 네트워크와 같은 차수 분포를 가지는 랜덤 네트워크를 비교해봄으로써 직경의 감소에는 밀도와 degree sequence가 영향을 미쳤다는 것을 알 수 있었다고 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/bbe8052d-f658-497c-be06-98012c2b4265/image.png" alt=""></p>
<p>여기서 세번째 포인트 질문이 등장합니다.</p>
<p><strong>네트워크의 차수의 분포(degree distribution)는 어떻게 변화하는가?</strong></p>
<p>degree distribution은 어떻게 densification과 함께 진화할까요? 여기에는 degree sequence가 진화하는 2가지 방법이 있다고 합니다.</p>
<p><strong>Option 1</strong> where the degree exponent $\gamma_t$ is constant over time as network evolves. In this case if $\gamma_t = \gamma \in [1,2]$, then $\alpha  = 2/\gamma$. Power laws with exponents less than 2 hav e infinite expectations, so by maintaining constant degree exponent $\gamma$ the average degree grows.</p>
<p><strong>첫번째 방법</strong>은 네트워크 진화에 따른 degree exponent $\gamma_t$가 상수로 존재한다고 할 때, $\gamma_t$가 [1, 2] 사이의 값이라면 densification은 $2/\gamma$가 된다고 합니다. 솔직히 무슨 말인지 잘 모르겠습니다..</p>
<p>Email 네트워크 예시를 통해 알아보겠습니다. 해당 plot은 Email 네트워크의 degree distribution입니다. 노드의 차수와 그에 따른 노드 개수를 표현한 것이기에 분포도라고 할 수 있습니다. 정확하게 모든 것을 이해하지는 못했지만, 해당 plot에 대한 설명을 보자면, 먼저 차수가 낮은 노드의 개수 자체가 많은 것을 알 수 있는 반면 보통 차수가 많은 노드들의 분포가 많은 것을 알 수 있습니다. 이를 heavy-tailed라고 하는 것 같습니다. 또한 좌측 plot의 기울기(slope)에 대한 값을 $\gamma$라고 표현하는 것 같습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/8c1f122a-431c-4e1b-b976-1042c473ca97/image.png" alt=""></p>
<p><strong>Option 2</strong> where the degree exponent $\gamma_t$ evolves with graph size $n$, if $\gamma_t = \frac {4n^{x-1}<em>{t} - 1}{2n^{x-1}</em>{t} - 1}$ then $x = a$ the densifying constant. Here $\gamma_t -&gt; \text {2 as }n_t -&gt; \infty$. The expected degree in a power law is $E[X] = \frac {\gamma_t - 1}{\gamma_t - 2}x_m$, so $\gamma_t$ has to decay as a function of graph size $n_t$ for the average degree to go up.</p>
<p>결론적으로, 네트워크의 밀도가 높아지고 직경이 감소하는 현상에 대한 이유에는 degree distribution(차수의 분포도)가 시간에 따라 진화하고 either it&#39;s being basically having the distribution is constant and accoring to a given shape, that gives us densification.(뭔소리일까요..)</p>
<p><img src="https://images.velog.io/images/jinseock95/post/f1b740f5-212c-43e6-a7d7-7d0a76e0f667/image.png" alt=""></p>
<p>이러한 네트워크를 생성할 수 있는 Forest Fire Model에 대해서 소개합니다. 여기서 이러한 네트워크는 밀도가 높아지면서 직경이 감소하는 그래프를 말하는 것 같습니다.(graphs that densify and have shrinking diameters)</p>
<p>그래프가 진화하는 과정을 파티에서 친구를 만나 관계가 확장되는 것으로 예시를 들게 됩니다.  친구가 하나도 없던 v가 w라는 친구를 만남으로써 w의 친구들을 계속해서 소개받음으로써 친구 관계를 생성해나간다고 합니다. 여기서 w의 친구를 소개받고 w의 친구의 친구를 소개 받는 것을 fire spreads라고 표현합니다. 이 때, w의 친구를 모두 소개하는(spread) 과정을 가지는 것이 아니라 <em>decide to spread it</em> 과정을 가지는 것 같습니다.(어떤 기준인지에 대해서는 언급하지 않습니다.) 그리고 fire dies할 때까지 (소개할 친구가 없을 때까지) 이러한 과정이 반복됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/c2736a73-44e1-424d-8207-2f36d5c35894/image.png" alt=""></p>
<p>해당 과정에서는 <strong>forward burning probability, $p$</strong> 와 <strong>backward burning probability, $r$</strong> 이라는 2가지 파라미터가 필요합니다. 방향성이 존재하는 graph에서 새로운 v가 추가될 때마다 무작위로 &#39;ambassador&#39; 노드를 선택하게 됩니다.(ambassador 노드는 불을 번지게 하는 첫번째 노드 w를 의미하는 것 같습니다.)</p>
<p>다음으로 파라미터 $p, r$에 기반하여 spread할 노드의 in/out을 결정하는 binary 과정을 통해 최종적으로 몇 개의 노드에 fire spread할 지 결정하게 됩니다. 새롭게 spread한 노드에 대해서 다음 과정을 반복하면서 fire dies될 때까지 진행되며 새로운 노드 v는 fire spread된 모든 노드와 연결되게 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/1f2903dd-2450-46b0-80eb-47fa4401aa0d/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/jinseock95/post/e3219b69-aca9-4599-8146-c037bb953d54/image.png" alt=""></p>
<p>Forest Fire Model로 생성된 노드의 개수와 엣지의 개수를 로그 스케일상에서 살펴보면, densification exponent는 1.32가 나오게 되며 노드 개수가 증가함에 따라 직경이 감소하다는 것을 알 수 있게 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/894ce50c-8345-49b5-97db-26270fcd2517/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/jinseock95/post/a5914514-780e-4257-a67d-19b0fdcbfdd4/image.png" alt=""></p>
<p>위 그림은 Forward burning probability, $p$에 대한 computational 과정에 대한 것입니다. $p$가 작게되면 fire spread를 위한 burning이 작으며, 크게 되면 많은 노드들을 burning하는 것으로 이해할 수 있습니다. 점선은 densification에 대한 변화를 의미하며 $p$가 작을 시에는 적은 관계가 형성되기 때문에 densification 또한 거의 없다고 볼 수 있습니다. </p>
<p>그래프의 지름의 경우에는 처음에는 증가하는 현상을 보입니다. 이렇게 되는 이유는 노드 간의 엣지(연결)이 dense하지 않고 sparse하기 때문에 한 노드에서 노드로 갈 수 있는 거리가 굉장히 멀기 때문입니다. 하지만 어느 시점에서는 diameter가 감소하게 되는데, 노드 간의 연결이 많아졌기 때문에 이제는 노드에서 노드로 갈 수 있는 거리가 가까워졌음을 의미합니다. 그리고 diameter가 일정하게 유지되는 이유를 complete graph라고 하는데 모든 노드간의 연결이 존재하기 때문으로 이해했습니다.</p>
<h2 id="3-temporal-networks">3. Temporal Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/8ccdcaa7-f49d-4397-a8c7-880fa0270186/image.png" alt=""></p>
<p>지금까지 살펴본 macroscopic level에서의 graph evolve는 어떠한 기준의 주기의 snapshot을 통해 변화를 살펴볼 수 있었습니다.</p>
<p>What we will do now is how nodes and edges are coming and leaving.</p>
<p>이번 목차에서는 어떻게 노드와 엣지가 추가되고 삭제되는지 알아보는 것 같습니다. 이 때 temporal networks를 정의하게 되는데, temporal networks란 동일한 집합의 정적 그래프의 연속?변화?입니다. 노드와 노드의 엣지에는 timestamp가 존재한다고 합니다. 이 timestamp가 연속에 대한 order를 의미하는 것 같습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/3343a668-797b-42cf-bd5a-b81c27c2e3a0/image.png" alt=""></p>
<p>해당 네트워크를 보면 모두 같은 노드의 집합임을 알 수 있습니다. 그리고 time이 지날 수록 엣지가 변화하는 것 또한 볼 수 있습니다. 시점 1,2,3에 대한 snapshop을 통해 엣지가 변화하는 것을 볼 수 있는데, 엣지 (c,d)의 경우에는 시점 1,2,3에 모두 존재하기 때문에 최종 네트워크에서 엣지 (c,d)가 가지는 timestamp는 1,2,3이 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/bea1a033-fef4-45a6-9c80-c6f117d02886/image.png" alt=""></p>
<p>temporal network의 예시로는 다음과 같습니다.</p>
<ul>
<li><strong>communication networks</strong> like phone calls</li>
<li><strong>proximity networks</strong> like people in the same hospital room, meeting at a conference</li>
<li><strong>Transportation networks</strong> like trains or planes fly</li>
<li><strong>Cell biology networks</strong> like protein-protein interactions, gene regulation and etc</li>
</ul>
<p>또한 하단의 그림은 일주일간 24시간 동안의 email communication에 대한 temporal network입니다. 그리고 하단 우측의 그림은 각 요일의 그래프를 집계한 것으로 이해했으며 이메일을 주고 받은 2명 간의 엣지가 표현되었습니다.</p>
<h2 id="4-microscopic-evolution-of-networks">4. Microscopic Evolution of Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/b807bcf6-c239-4375-b55a-308a919dd038/image.png" alt=""></p>
<p><em>we can now start thinking about how do networks evolve at this microscopic level. how do the nodes change over time.</em></p>
<p>이번 목차에서는 microscopic level에서 네트워크가 진화하는 과정과 어떻게 노드들이 변화하는지에 대해 다뤄보고자 합니다. micro level에서 네트워크는 어떻게 진화할까요? macro level에서도 알아봤듯이, micro level에서도 질문의 포인트에 있어 2가지 question을 던집니다.</p>
<ul>
<li>How do we define paths and walks in temporal networks?, 어떻게 temporal networks에서 path(경로)와 walk(보행)을 정의할 것인가?</li>
<li>How can we extend network centrality measures to temporal networks?, 어떻게 network centrality measures like PageRank or node importance를 temporal networks로 확장할 수 있는가?</li>
</ul>
<p><img src="https://images.velog.io/images/jinseock95/post/1e19370a-b9f9-48ce-b568-231c20157636/image.png" alt=""></p>
<p>먼저 walk(보행), path(경로)에 대해 정의하고 그 개념들을 simple graph에서 temporal graph로 확장시킬 수 있습니다.</p>
<p>temporal path 또한 temporal network에서 이해했듯이, 시점마다 존재하는(sequential) 엣지들의 집합?이라고 할 수 있을 같습니다. 예시를 보자면, path (5, 1)이 만족하기 위해서는 시점 $t_1, t_3$의 temporal path이 필요하게 됩니다. </p>
<p>사실 이렇게 temporal path를 정의하는 이유를 정확히 이해하지는 못했지만 단순 그래프에서 경로를 계산할 때와, 시점이 존재할 때에 경로를 계산하는 것이 다른 결과를 초래하기 때문에 이처럼 시계열적인 특징을 고려하기 위해서 temporal path를 정의하는 것으로 이해했습니다.</p>
<p>그리고 TPSP-Djikstra algotirhm을 통해 가장 짧은 temporal path를 찾을 수 있다고 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/6890d09a-e81c-498d-b718-88c0fc78f6de/image.png" alt=""></p>
<p>해당 알고리즘의 예시를 한번 볼 수 있습니다. 총 5개의 시점으로 이루어진 해당 그래프는 시점 마다 엣지의 관계가 변하고 있음을 알 수 있습니다. 해당 그래프에서 각 시점마다 $path(a, f)$를 찾을 수 있습니다.</p>
<ul>
<li>$t_1: a-c-d-e-f$</li>
<li>$t_2: a-c-d-f$</li>
<li>$t_3: a-c-d-g-f$</li>
<li>$t_4: a-b-g-f$</li>
<li>$t_5: a-b-g-f$</li>
</ul>
<p><img src="https://images.velog.io/images/jinseock95/post/8a7c0847-3d65-4621-b999-3fb25bf1c023/image.png" alt=""></p>
<p>이렇게 가장 짧은 경로를 구하는 알고리즘을 적용하는 이유는 closeness centrality 때문입니다. Temporal closeness는 시점마다 네트워크의 특정 노드와 모든 노드 간의 근접도 측정 방식입니다. 노드 간의 거리를 측정하게 되면 해당 노드가 네트워크의 중심부에 있는지 가장자리에 있는지 추측할 수 있습니다. 이 과정이 어떻게 보면 node importance, 노드의 중요성에 대해 판단할 수 있는 요소가 될 수 있습니다.</p>
<p>수식을 살펴보면, 주어진 시점에서 노트 x와 모든 노드 y들 간의 shortest path를 계산하여 합함으로써 closeness centrality를 구할 수 있습니다. 즉 closeness centrality가 1에 가까울수록 네트워크의 중심부라고 해석할 수 있을 것 같습니다.</p>
<p>example을 보게 되면 이해가 되지 않는 부분이 있었습니다. $c_clos(A, 2)$를 구하기 위해서 A와 C의 $t_2$의 distance가 1임을 알 수 있지만 A와 E의 $t_2$의 distnace가 왜 2가 나오는지 모르겠습니다. $t_2$에서는 path (A, E)가 성립되지 않는 것으로 이해했는데, 절대적인 path (A, E)라서 2가 더해지는 것인지 정확히 이해할 수 없었습니다. 아.. 혹시 path (A, B)와 path (A, E)가 $t_1$에 이미 만족하고 있기 때문에 성립되는 것인지 갑자기 생각이 들긴합니다. 확실하지는 않습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/fd14fb6c-c122-4153-bdd6-0f96c96c6339/image.png" alt=""></p>
<p>이 전 강의에서 페이지와 페이지가 연결되어 있는 인터넷 구조에서 페이지(노드)의 중요성을 판단하기 위해서 PageRank 알고리즘을 적용할 수 있었습니다. 사실 이 알고리즘에서도 temporal(시계열적)인 특징을 적용해볼 수 있습니다. 시간의 흐름에 따라 페이지와 페이지의 연결이 생기기도하고 사라지기도 하면서 해당 페이지의 중요도가 바뀔 수 있기 때문입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/d033af16-bae5-4715-9696-8c3f0309336a/image.png" alt=""></p>
<p>이번에는 temporal walk에 대한 개념을 정의해보도록 하겠습니다. 사실 해당 슬라이드의 설명으로는 temporal walk에 대한 개념을 이해하지 못했습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/e53e609d-78c6-4cd9-b689-8e3d7aa9b33f/image.png" alt=""></p>
<p>해당 페이지랭크의 예시를 보면 time-respecting의 의미를 조금은 이해할 수 있었습니다. path (c -&gt; b -&gt; a -&gt; c) 의 경우에는 엣지에 존재하는 timestamp가 시계열 특징을 만족하는 반면 path (a -&gt; c -&gt; b -&gt; a)는 시점의 순서가 얽혀 time respecting 하지 못한다고 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/27cb16d7-9b4f-4c8e-abea-dad9c589f644/image.png" alt=""></p>
<p>그렇다면 temporal path의 확률에 대해 생각해볼 수 있습니다.</p>
<p>$$P[(u,x,t_2)|(v,u,t_1)]$$</p>
<p>는 $t_1$시점에서 노드 v가 노드 u와 연결되어 있을 때, $t_2$시점에 노드 u가 노드 x와 연결될 확률을 의미합니다. 지수 분포 상에서 해당 확률을 정의하게 되면 다음과 같습니다.</p>
<p>$$P[(u,x,t_2)|(v,u,t_1)] = \beta^{|Γ_u|}$$</p>
<p>이 때, $\beta$는 transition probability로 0~1 의 값을 가지게 되며, $Γ_ 
u$는 해당 시점에서 노드 u가 가지는 엣지의 개수라고 할 수 있습니다. 그렇기 때문에 많은 노드와 연결되어 있는 엣지의 개수가 많아지게 되면 결국 특정 노드와의 연결 확률이 낮아지는 결과를 낳게 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/1ff0500f-6c82-4d74-96dc-ac2dbae44a34/image.png" alt=""></p>
<p>그런데 t 시점에 대한 제한이 없을 경우에는 temporal PageRank는 static PageRank에 수렴하게 됩니다. 이렇게 되는 이유는 결국 $t_1 - t_\infty$에서 발생하는 네트워크의 변화에 대한 축적이 static PageRank에서 다루는 완성된 네트워크와 동일하다고 볼 수 있기 때문으로 이해했습니다.</p>
<h3 id="참고문헌">참고문헌</h3>
<ul>
<li><a href="https://wandb.ai/syllogismos/machine-learning-with-graphs/reports/16-Network-Evolution--VmlldzozODUxMzI">Anil, 16.Network Evolution</a></li>
<li><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter16.">Tobigs graph study, Chapter16. network evolution graph</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[15. Outbreak Detection in Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/15.-Outbreak-Detection-in-Networks</link>
            <guid>https://velog.io/@tobigs-gnn1213/15.-Outbreak-Detection-in-Networks</guid>
            <pubDate>Mon, 05 Apr 2021 10:01:18 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/minjoong507">정민준</a></p>
<ul>
<li>이번 강의에서는 네트워크에서 특정 사건이 발생하고 이를 어떤방식으로 탐지하고 처리하는 방법에 대해서 소개합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/5f4a9176-afc4-4f38-94f0-9ef57eb4f868/image.png" alt=""></p>
<ul>
<li>먼저 문제에 대해서 정의하고 이를 해결하는 알고리즘 중 그리디하게 접근하는 hill-climbing 알고리즘에 대해서 소개합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/ebac4f0a-b0e7-485c-baa6-38237af4c88d/image.png" alt=""></p>
<ul>
<li>사진의 네트워크의 노드는 가정집이고 간선은 수도로 정의합니다. </li>
<li>여기서 수질오염이 발생하여 이를 센서를 통해 탐지하고자 합니다. 센서를 모든 노드마다 배치하여 수질오염을 탐지할 수 있으면 좋겠지만 아시다시피 정해진 cost내에서 센서를 효율적으로 배치하여 수질오염을 탐지하는게 목표입니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/54899649-7877-4aca-b50e-23b1f7cbea46/image.png" alt=""></p>
<ul>
<li>여기서 파란 박스를 유저로 두고 박스 내에 있는 p는 post, 글입니다. 어떤 포스트를 따라가야 repost된 관계 구조를 효율적으로 파악할 수 있을까가 문제입니다. 이는 위에서 소개했던 예시와 유사합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/8fda2c95-05f2-4d81-9d7b-78061d77df8c/image.png" alt=""></p>
<ul>
<li>주어진 네트워크 내 노드를 선택하여 문제를 효율적으로 탐지하고자 합니다. 이는 전염병, 네트워크 보안등에 적용될 수 있습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/a1796c9e-a03a-4d0e-88d9-95158ec6d550/image.png" alt=""></p>
<ul>
<li>센서위치를 어디에 두는지에 따라 센서가 탐지하는 범위가 달라집니다. S1의 경우는 넓은 범위를 탐지하지만 오른쪽에 센서들은 작은 범위만을 탐지합니다.</li>
<li>여기서 trade off는 여러개 센서를 두어 효율적으로 일찍 탐지를 할것인지 아니면 늦게 탐지하더라도 넓은 범위를 탐지할 수 있도록 센서를 둘것인지를 결정해야합니다. </li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/74e94fde-c2d2-44fb-a4ad-17463c8232fe/image.png" alt=""></p>
<ul>
<li>주어진 그래프에서 u 노드가 사건을 탐지하는데 걸리는 시간을 다음과 같이 정의합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/2429808c-766c-4399-85f1-b1b56c403385/image.png" alt=""></p>
<ul>
<li>그래서 가장 큰 reward를 얻을 수 있는 노드 집합을 찾아 고르는 것이 우리의 목표입니다. 여기서 cost는 주어진 예산보다 작아야 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/9c85f972-3c2c-4ce4-bcd1-7fb9ba8bd74c/image.png" alt=""></p>
<ul>
<li>여기서 reward의 가치는 다음과 같이 둘 수 있습니다. 이전에 언급했듯이 사건 탐지를 가장 빠르게 할것인지, 느리게 탐지하더라도 넓은 범위를 커버하는지가 있습니다.</li>
<li>연결이 너무 많이된 노드에 센서를 두면 탐지하기 위해 많은 시간을 사용합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/d25c1933-caab-4fdf-be6f-5895b4459d02/image.png" alt=""></p>
<ul>
<li>Time to detection : 오염을 탐지하는데 걸린 시간.</li>
<li>Detection likelihood : 얼마나 오염을 탐지하였는지.</li>
<li>Population affected : 얼마나 많은 사람들이 오염된 물을 마셨는가.</li>
<li>여기서 중요한 점은 무조건 빨리 탐지하는게 좋다고 교수님께서 말씀 하셨습니다. 이 점을 이용하여 후에 그리디한 알고리즘으로 문제를 해결한다고 저는 이해했습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/776e31f0-8f85-4945-81c3-a599e18d9c65/image.png" alt=""></p>
<ul>
<li>다음과 같이 목적함수를 정의합니다.</li>
<li>왼쪽에서 새로운 센서를 다음과 같이 두면 효율적으로 오염을 탐지할 수 있습니다. 하지만 오른쪽에 똑같이 적용하면 왼쪽에서만큼 효율을 발휘하지 못합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/48517608-2b7a-4ab0-90fe-b7f3954930d1/image.png" alt=""></p>
<ul>
<li><p>A, B는 주어진 그래프의 노드 셋입니다. 서브 그래프 개념으로 본다면 B는 A를 포함하는 더 큰  서브그래프인 셈입니다.</p>
</li>
<li><p>위의 식이 성립하는 이유는 앞서 센서가 겹쳐서 탐지하는 부분이 많다면 효율이 떨어지는 경우를 보았습니다. 이처럼 A가 B의 부분집합일 때 A에 센서를 추가하는것이 B에 추가하는것 보다 더 효율적일 수 있습니다.</p>
</li>
<li><p>탐지하는 시간의 경우를 세 가지로 나누어 봅니다.
<img src="https://images.velog.io/images/mjjung/post/310d029f-7eda-4b0b-ab3b-659f852def40/image.png" alt=""></p>
</li>
<li><p>첫번째 경우는 x 센서를 두어도 탐지하는데 가장많은 시간이 걸리기 때문에 필요가 없습니다.</p>
</li>
<li><p>두번째 경우는 A에 대해선 더 좋지만 B에는 아니라는 점입니다.</p>
</li>
<li><p>세번째 경우는 x가 A,B보다 빨리 탐지합니다.</p>
</li>
<li><p>그래서 우리가 사용하는 목적함수는 Submodular라는 것입니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/c6da35d4-945f-45e8-a5f7-6d268fb45fbc/image.png" alt=""></p>
<ul>
<li><p>매번마다 노드의 reward를 갱신하고 이를 선택하는 알고리즘입니다. 하지만 특정 문제에서만 해결 가능하며 시간복잡도가 느린 알고리즘입니다.</p>
</li>
<li><p>Hill-climbing은 노드 자체의 cost를 무시합니다. 그리고 이 방법을 사용하면 가진 예산을 금방 낭비할 가능성이 큽니다. 고의적으로 최선을 선택하지 못하는 상황이 발생합니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/7aa50309-31c6-4b7c-ae42-76612afe6e02/image.png" alt=""></p>
<ul>
<li>여기서 n개 센서에 B 예산을 가지고 있습니다. s1은 r과 B를 가지는데 나머지 센서의 reward는 s1보다 작습니다. 따라서 Hill-climbing 알고리즘을 적용하면 s1을 선택하게 되고 주어진 예산을 전부 사용하게 됩니다. 하지만 나머지 센서들을 여러개 선택할 수 있고 더 좋은 reward를 얻을 수 있었지만 s1을 택하게 되는 현상이 발생합니다. </li>
<li>따라서 이를 조율할 수 있는(최적화 할 수 있는) benefit-cost ratio를 적용합니다. 하지만 이또한 위와 유사한 문제가 발생하게 됩니다.
<img src="https://images.velog.io/images/mjjung/post/2a48e01e-a608-411d-909b-25026639ff95/image.png" alt=""></li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/5017867b-73e5-41c8-a701-c4647ab488c3/image.png" alt=""></p>
<ul>
<li>CELF 알고리즘은 그리디 알고리즘을 적용하여 두 결과중 최적의 결과를 선택합니다. 앞서 발생한 문제가 있었지만 그래도 정답과 유사한 결과를 선택할 수 있다고 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/19395ce3-e84d-4842-a557-e4965c5dc8ba/image.png" alt=""></p>
<ul>
<li>여기서 각 노드들의 Marginal gain을 고려하여 탐색을 진행하는데 S1이 a인 상태에서 gain을 구했고 남은 노드들에 대해서도 구하고 정렬합니다.
<img src="https://images.velog.io/images/mjjung/post/54dffe7e-ac76-4005-b512-ced141d8f6d7/image.png" alt="">
<img src="https://images.velog.io/images/mjjung/post/973cce83-4093-4abf-9253-0ecc6a49192d/image.png" alt=""></li>
<li>a를 서브셋에 넣고 다음 노드들을 집합에 넣어 marginal gain을 다시 계산합니다. 이를 반복적으로 적용하여 셋을 구합니다.</li>
<li>무조건 marginal gain이 높은걸 선택해야 최적화된 답입니다. 이유는 이를 택하지 않는 최적의 경우의수가 있다고 생각했을 때 다른 노드를 선택하면 당연히 gain이 낮은것들만 선택함으로 greedy하게 접근하는 것이 가능합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/a4f8ca74-983e-4c1e-863e-b20a3743930a/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/mjjung/post/91088420-e9a0-47f6-8341-583d9f074736/image.png" alt=""></p>
<ul>
<li>여기서는 Solution quality에 대해서 얘기합니다. 알고리즘을 통해서 구한 답은 정답이 아니라 정답에 가까운 답을 구해줍니다. Submodular 함수는 1-1/e의 바운드가 존재합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/25562a5a-5ef9-4d9c-85d9-2160d7e54df8/image.png" alt=""></p>
<ul>
<li>여기서 델타 u는 u를 선택하였을 때 얻는 margin. 그리고 OPT는 구한 최적의 노드 셋을 의미합니다.</li>
<li>다음 식을 따라서 최적의 셋의 스코어가 다음 보다 작다고 정의하고 있습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[14. Influence Maximization in Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/Influence-Maximization-in-Networks-xoljzlmm</link>
            <guid>https://velog.io/@tobigs-gnn1213/Influence-Maximization-in-Networks-xoljzlmm</guid>
            <pubDate>Sat, 27 Mar 2021 06:26:31 GMT</pubDate>
            <description><![CDATA[<h3 id="intro">INTRO</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/579ea3a5-764a-4fac-9acf-90fa6ebd9b57/image.png" alt=""></p>
<p>우리는 어떠한 상품을 구매할 때, 주로 낯선 사람들보다 주변 사람들에게 영향을 많이 받습니다. 통계 역시도 68%가 친구들이나 가족들에게 조언을 구한다고 제시하고 있습니다.</p>
<p>그렇다면, 우리는 다음과 같은 마케팅 요소를 생각해볼 수 있을 것입니다. </p>
<p><strong>어떠한 사람이 가장 친구들에게 영향을 많이 끼치는가?</strong></p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/48e9c9d4-2e08-4d73-bb85-dae54cffda4f/image.png" alt=""></p>
<p>한 예로, Kate Middleton effect를 생각해볼 수 있습니다.</p>
<p><strong>&quot;... when she does wear something, it always seems to go on a waiting list.&quot;</strong></p>
<p>그녀가 입은 옷은 모두 완판된다는 것으로 그 만큼, 상품을 구매하는데 큰 영향을 끼친다는 것을 알 수 있습니다.</p>
<p>그렇다면, 우리는 Kate와 같이 &quot;Influential Person&quot;을 어떻게 찾을 수 있을까요? Kate와 같은 사람들을 다수 찾는다면, 그만큼 광고 효과를 크게 낼 수 있을 것입니다. (Influence Maximization)</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/51d94e3b-4e23-4f7d-ae64-58c4accb6597/image.png" alt=""></p>
<hr>
<h3 id="two-classical-propagation-models">Two Classical Propagation Models</h3>
<h4 id="linear-threshold-model">Linear Threshold Model</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/8fbed2c8-b47e-4d27-8a06-b22eb55c5914/image.png" alt=""></p>
<p>노드마다 임의의 threshold가 있습니다. 이것은 node v가 영향을 받는 정도의 weight를 나타내는 값으로 영향력을 나타냅니다. 예를 들어, 나를 기준으로 친한 친구한테 받은 영향력이랑 학교 선생님한테 받은 영향력이 다를겁니다. 이를 표현한 것이라고 생각하시면 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/18aff8c4-4f37-4ebc-86ce-3c52a39d553e/image.png" alt=""></p>
<p>node v부터 시작해봅시다. 각각의 노드들은 앞서 말한 threshold들을 가지고 있고, 그 값보다 크면 영향을 받게 됩니다. node w의 경우, node의 threshold보다 이웃에게 받은 영향이 더욱 크게 나타납니다. (파란색 사각형보다 빨간색 사각형의 크기가 더 큼으로부터 알 수 있습니다.) 따라서 Active Node가 됩니다. 이러한 과정들을 지속적으로 반복하면 Active Node와 Inactive Node를 구분할 수 있게 됩니다.  </p>
<h4 id="independent-cascade-model">Independent Cascade Model</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/84cdaa2f-e95c-4273-897e-4462b8822688/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/15a8194f-f95b-4744-ba8c-a670513e8e3c/image.png" alt=""></p>
<p>각각의 edge (v, w)는 확률들로 구성되어있으며, node v가 active 되었을 때, node w가 active될 확률들 나타냅니다. 즉, 영향받은 확률을 나타내는 것으로 볼 수 있습니다.</p>
<p>각각의 edge (v, w)는 probability  를 가지고 있다. 이때, 는 node v가 node w에게 영향을 줄 확률이다. 즉, node w가 node v에게 영향을 받아 상품을 살 확률이라고 생각하시면 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/0de616f4-12fa-47f9-83ea-2fb18de05943/image.png" alt=""></p>
<p>그러한 작업들을 반복하였을 때, 각각의 subset을 확인할 수 있으며, 영향력이 가장 크게 나타나는 경우 역시 확인해볼 수 있습니다. 위의 그림을 보면 a와 d의 합이 가장 영향력이 크다는 것을 직관적으로 확인할 수 있습니다. </p>
<hr>
<h3 id="how-hard-is-influence-maximization">How hard is influence maximization?</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/270dde05-5bbe-4b38-8e58-c24844f07b48/image.png" alt=""></p>
<p>정리하면, K개의 node를 찾는 것이며, K개의 node의 subset S가 maximize되어야 한다는 것입니다.</p>
<p><strong>&quot;Influence maximization NP-complete&quot;</strong></p>
<p>NP-complete문제로 해결하지가 쉽지 않습니다. 하지만, approximation algorithm을 활용하여 다음과 같은 문제를 해결할 수 있습니다. 이 algorithm을 사용한다면 최적해 결과의 63%의 효율을 끌어올 수 있습니다.</p>
<h4 id="greedy-hill-climbing-algorithm">Greedy Hill Climbing Algorithm</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/9a82cc6c-e0c5-4e5d-aca5-07538cd1e644/image.png" alt=""></p>
<p>해당 알고리즘은 매시점마다 Si가 최대가 되도록 선택하는 것입니다. 예를 들어, 처음 값을 보면 d가 높은 값을 가지고 있으므로, Si에 d를 추가합니다. 다음 step으로 Si와 합집합하였을 때, 가장 높은 값을 선택하게 됩니다. 이 경우 b이기 떄문에 Si에 b를 추가해줍니다.</p>
<p>이러한 과정을 계속해서 반복하여 최적값을 찾아가는 것이 해당 알고리즘이라고 생각하시면 됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/8807b3c3-924a-4822-a97c-3bcd14825fb1/image.png" alt=""></p>
<p>해당 함수는 두가지 특성이 나타나게 됩니다.</p>
<ul>
<li>f is monotone</li>
<li>f is submodular</li>
</ul>
<hr>
<h3 id="prove-1-our-fs-is-submodular">Prove 1: our f(S) is submodular</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/24754eb2-3ca5-4fb4-8878-d3c37769dde5/image.png" alt=""></p>
<p>T가 S를 포함하고 있다고 가정해봅시다. 그렇다면 u라는 순수영역을 더욱 보존하고 있는 경우는 당연히 S가 될 것입니다. 그림에서 녹색으로 채워진 부분이 S이며, 녹색과 파란색으로 채워진 부분이 T입니다. 해당 집합들과 u간의 차집합을 구했을 때, S인 경우가 u의 면적이 더 많이 남아있음을 알 수 있습니다.</p>
<h4 id="principle-of-deferred-decision">Principle of deferred decision</h4>
<p>f(S)를 확률적으로 접근했기 때문에 우리는 f(S)에 해당하는 parallel possible worlds를 만들 수 있고, 이걸 average함으로써 우리의 알고리즘(무작위 알고리즘)에 신뢰를 줄 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/44a32564-6c37-476a-b597-45837eb355f5/image.png" alt=""></p>
<hr>
<h3 id="prove-2-hill-climbing-gives-near-optimal-solutions">Prove 2: Hill Climbing gives near-optimal solutions</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/98da5cb5-d56c-4fdc-afb1-b36c3123dd90/image.png" alt=""></p>
<p>해당 식의 증명과정은 <a href="http://snap.stanford.edu/class/cs224w-2019/handouts/CS224W_Influence_Maximization_Handout.pdf">이곳</a>은 참고하면 됩니다!</p>
<h4 id="greedy-algorithm-is-slow">Greedy algorithm is Slow</h4>
<p>위의 모든 과정들을 생각해봤을 때, 연산속도가 매우 느리다는 것이 큰 단점인 것을 파악할 수 있습니다. 우리는 k만큼의 영향력있는 사람들을 알길 원하며, 모든 node에 대해서 iteration을 진행해야 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/9639a7de-779b-4842-b979-b49d82b7ba2e/image.png" alt=""></p>
<hr>
<h3 id="sketch-based-algorithms">Sketch-based Algorithms</h3>
<p>그리디 알고리즘을 수행할 경우, 많은 시간이 소요됨을 확인할 수 있었습니다. 따라서, 연산시간을 줄이기 위해서 Sketch-based Alogrithms을 사용하고자 합니다. 이 모델은 기존의 시간복잡도 O(M)을 O(1)로 줄일 수 있습니다. (m = number of edges)</p>
<ol>
<li>Take a possible world G(i)</li>
<li>Give each node a uniform random number from 0~1</li>
<li>Compute the rank of each node v, which is the minimum number among the nodes that v can reach</li>
</ol>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/56903d4f-0662-4e71-ade0-c83ac735ca27/image.png" alt=""></p>
<p>여기서의 핵심 아이디어는 node v가 많은 node들과 연결되어있다면, 그 만큼 rank가 작을 것이라는 것입니다. 따라서, 해당 rank 정보를 활용하여 영향력을 추정해볼 수 있게 되는 것입니다.</p>
<p>하지만, 이러한 추정은 물론 불안정합니다. 하지만, 다수의 random number와 rank를 부여한다면 추정의 불안정성을 어느정도 개선할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[13. Probabilistic Contagion and Models of Influence]]></title>
            <link>https://velog.io/@tobigs-gnn1213/13.-Probabilistic-Contagion-and-Models-of-Influence</link>
            <guid>https://velog.io/@tobigs-gnn1213/13.-Probabilistic-Contagion-and-Models-of-Influence</guid>
            <pubDate>Fri, 26 Mar 2021 04:49:38 GMT</pubDate>
            <description><![CDATA[<h3 id="intro">Intro</h3>
<h4 id="epidemics-vs-cascade-spreading">Epidemics vs Cascade Spreading</h4>
<p><strong>epidemic spreading</strong></p>
<ul>
<li>의사결정이 결핍되어있음</li>
<li>감염의 과정이 매우 복잡하고 눈에 보이지 않습니다.</li>
</ul>
<p>당연하게도 높은 감염률이면 질병이 퍼져나가게 되며, 낮은 감염률이면 질병이 소멸하게 됩니다.</p>
<h3 id="probabilistic-spreading-models">Probabilistic Spreading Models</h3>
<p><img src="https://images.velog.io/images/leejongj/post/9502dfbb-f573-4024-a4a3-ec6b3e12793b/image.png" alt="">
&#39;d&#39;를 자식노드의 수 &#39;q&#39;를 감영확률이라고 가정한다면, 전염벙이 지속되는 d와 q값은 무엇일까요?</p>
<p>임의의 노드 h에서 한 노드가 감염될 확률이 0보다 크다면 우리는 전염병이 확산된다고 말할 수 있습니다. 임의의 노드 h가 무한대로 갈 때 (시기가 계속된다면), 전염병은 지속되고 있다고 말할 수 있을 겁니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/95a45e40-4ba7-4d64-b6d5-64cdfad703d0/image.png" alt=""></p>
<p>그렇다면, 우리는 임의의 노드 h에서 한 노드가 감염될 확률을 구한다면, 전염병의 지속여부에 대해서 파악할 수 있습니다.</p>
<p>임의의 노드 h에서의 확률은 다음과 같이 구할 수 있습니다. 이전 노드에서 나온 자식노드들이 모두 감염되지 않을 확률을 1에서 빼면 됩니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/95325444-4f27-4183-8695-93b1a259e924/image.png" alt=""></p>
<p>결국 root 노드 (초기감염자)의 확률 1에서 시작하여, 확률이 점차 낮아지는 형태의 함수가 만들어집니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/5c32e415-9895-4c7f-9e8d-e11288f64836/image.png" alt=""></p>
<p>여기서 중요한 것은 변화율 qd에 따라 전염병이 확신이 될지 안될지 결정할 수 있다는 점입니다. qd는 감염된 사람들의 기대평균 수를 나타내는 값으로, qd가 1보다 작다면 x=p가 0으로 수렴하게 되므로 0으로 수렴하게 됩니다. </p>
<p><img src="https://images.velog.io/images/leejongj/post/0463af42-1d81-4acf-8ad6-68b00e65e165/image.png" alt=""></p>
<h3 id="applicaition-social-cascades-on-flickr-and-estimating-r0-from-real-data">Applicaition: Social cascades on Flickr and estimating R0 from real data</h3>
<p><strong>Dataset</strong></p>
<ul>
<li>Users can be exposed to a photo via social influence (cascade) or -external links</li>
<li>Did a particular like spread through social links</li>
<li><ul>
<li>No, if a user likes a photo and if none of his friends have previously liked the photo</li>
</ul>
</li>
<li><ul>
<li>Yes, if a users likes a photo after at least one of her friends liked the photo-&gt; Social cascade</li>
</ul>
</li>
<li>Example social cascade: A-&gt;B and A-&gt;C-&gt;E</li>
<li>Flickr social network</li>
<li><ul>
<li>Users and connected to other users via friend links</li>
</ul>
</li>
<li><ul>
<li>A user can like/favorite a photo</li>
</ul>
</li>
<li>Data:</li>
<li><ul>
<li>100 days of photo likes</li>
</ul>
</li>
<li><ul>
<li>Number of users : 2 million</li>
</ul>
</li>
<li><ul>
<li>34,734,221 likes on 11, 267, 320 photos</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/leejongj/post/5cec2ee5-76e6-4ea7-8abc-8006ea88c492/image.png" alt=""></p>
<p>R0를 추정하는 방법에는 두가지 방법이 있습니다. Estimate of R0 방법과 Empirical R0를 획득하는 방법입니다. Estimate of R0의 경우, 실제와 유사한 값을 가지기 위해서 보정상수(Correction factor)을 곱해주어 다음 값을 구해줍니다. Empirical R0의 경우, start node를 기반으로 cascade 과정을 통해 직접 감염된 노드를 세주는 것입니다. </p>
<p>확실하진 않지만, Estimate of R0는 전체적인 연산과정을 통해 R0를을 추정하는 것이며, Empirical R0는 단편적인 부분만 보고 R0를 유추한다는 것으로 이해됩니다.</p>
<p>여기서는 Empirical R0가 Estimate of R0를 얼마나 따라갈 수 있을지 확인해보는 것이 포인트 입니다. 만약 잘 따라간다면, 단편적인 부분 (부모노드)만 보고서 해당값을 유추할 수 있을 것입니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/54471e9a-5622-44be-9976-8c7d8634929f/image.png" alt=""></p>
<p>결과적으로 높은 상관관계가 나타나고 있습니다.</p>
<h3 id="epidemic-models">Epidemic models</h3>
<p>Virus Propagtion에는 두 개의 파라미터가 있으며, 
Birth rate: probability that an infected nieghbor attacks
Death rate: Probability that an infected node heals</p>
<p>Epidemic models에는 SEIR, SIR, SIS Model 등이 있습니다.</p>
<h4 id="more-generally-seir-models">More Generally: S+E+I+R Models</h4>
<p><img src="https://images.velog.io/images/leejongj/post/37e8d433-a621-4e17-9c89-deee3be695dc/image.png" alt=""></p>
<p>각각 노드가 갈 수 있는 상태를 나타낸 것입니다.</p>
<h4 id="sir-model">SIR Model</h4>
<p><img src="https://images.velog.io/images/leejongj/post/92979e9e-03ec-4533-bfc8-ca2483829e46/image.png" alt=""></p>
<p>Susceptible people changing (<em>-BSI</em>): 취약층에서 감염된 사람들만큼 줄기 때문에 -의 부호가 붙습니다.</p>
<h4 id="sis-model">SIS Model</h4>
<p><img src="https://images.velog.io/images/leejongj/post/794fafcd-6b9d-4f4d-8c63-e267ed9456a6/image.png" alt=""></p>
<p>virus &quot;strength&quot;을 측정은 다음과 같이 측정할 수 있습니다.
$$
s = beta / delta &lt; tau
$$
SIR모형과의 차이점은 unsusceptible people changing의 값이 다르다는 점입니다. 이는 노드가 다시 susceptible 상태로 이동할 수 있음을 나타내고 있습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/22a45840-5bb4-4eb8-ae2e-d2de8a1b2b07/image.png" alt=""></p>
<p>당연하게도, 치료확률 (cured value)이 훨씬 더 커지게 되면, 전염병은 더이상 확산되지 않을 것입니다. 위의 그림은 다음과 같은 논리를 수식으로 표현하고 있습니다.</p>
<p>threshold 값을 넘는다면 바이러스는 지속되게 됩니다. 그렇다면 주어진 그래프에서 Epidemic threshold (<em>tau</em>)를 어떻게 구할 수 있을까요? (증명과정은 여기서 생략합니다.) 결론적으로, 가장 큰 고유값의 역수의 값으로 Epidemic threshold를 규정할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/465c8f4e-c226-4b0b-8dd5-b78bcc0158b3/image.png" alt=""></p>
<h3 id="application-rumor-spread-modeling-using-seiz-model">Application: Rumor spread modeling using SEIZ model</h3>
<p><img src="https://images.velog.io/images/leejongj/post/e51f7566-0431-4115-8ce4-ad462114e92e/image.png" alt=""></p>
<p>루머의 확산 == 질병의 확산
S: 트위터 계정
I: 루머/뉴스를 믿거나 리트윗한 경우
E: 루머/뉴스를 마주하였으나, 그것을 아직 믿지 않은 상태
S: 루머/뉴스를 믿지 아니하는 것</p>
<p><img src="https://images.velog.io/images/leejongj/post/8b224580-c810-4af0-a154-e1167a23ae5d/image.png" alt=""></p>
<p>Susceptible의 변화율만 본다면,
SI: S에서 I로의 이동과 파라미터(contact rate) B
SZ: S에서 Z로의 이동과 파라미터(contact rate) b
Susceptible에서는 유입되는 것은 없고, 유출되는 것만 있으므로, 둘다 -의 부호를 가지게 됩니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/bd637348-a717-4326-b64a-b6c7921dc1e8/image.png" alt=""></p>
<p>그리드 서치를 통해 실제 rumor의 tweets 수와 모델이 예측한 rumor tweets 수의 차이를 줄이면서 파라미터들을 추정하게 됩니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/70c2f251-0003-4f74-b994-01eac408f5e6/image.png" alt=""></p>
<p>연구자들은 다음과 같은 metric에 대해서 흥미를 가지고 있다고 말합니다. 해당 RSI는 S에서 E로 이동하는 사람의 수와 E에서 I로 이동하는 사람 수의 비율입니다.
비유하자면, 환자가 일상생활에서 병에 노출(Exposed)되는 속도와 노출된 환자가 실제 감염(Infected)되는 속도에 대해서 파악하고자 한 것으로 보입니다. </p>
<p>한 실험에서의 결과를 바탕으로 봤을 때, Rumor의 경우 Real news보다 해당 값의 비율이 높았다고 말하고 있습니다. 그 만큼 Rumor의 경우, 빠르게 사실로 받아지는 것을 알 수 파악해볼 수 있었습니다.</p>
<h3 id="independent-cascade-model">Independent Cascade Model</h3>
<p><img src="https://images.velog.io/images/leejongj/post/0dfb8688-1aa1-4d68-978c-691f9fc149b1/image.png" alt=""></p>
<p>edge (u,v) 는 확률값을 가지고 있으며, 다른 edge들과 독립적입니다.
즉, 한번의 edge마다 동전던지기를 1회 수행하는 것처럼 독립사건이라는 뜻입니다.</p>
<p>하지만, 실제 데이터로부터 이 weight들을 모두 추정하는 것은 굉장히 어렵습니다. 또한, 이 weight들을 모두 동일하게 취급하는 것 역시 너무 simple한 모델이 되어버립니다. 그렇다면 어떻게 이 문제를 해결할 수 있을까요?</p>
<h4 id="exposures-and-adoptions">Exposures and Adoptions</h4>
<p><img src="https://images.velog.io/images/leejongj/post/548ad29d-0cad-4b06-881d-adca50608bdb/image.png" alt="">
<img src="https://images.velog.io/images/leejongj/post/21d490f9-bb13-468c-9215-ff49737154c6/image.png" alt=""></p>
<p>결국, 새로운 행동(전염)의 전파 여부는 이미 행동(전염)이 전파된 주변 노드의 수에 <strong>의존</strong>하는 것을 파악해볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/45c8469e-4e2b-48d1-ad3d-fc7e747603dd/image.png" alt=""></p>
<p>이외의 다양한 형태의 curves들이 존재할 수도 있습니다.
첫번째 그림같은 경우, 광고를 예시로 들을 수 있습니다. 광고의 한두번 노출됐을 때, 구매량이 높게 나타나나, 이후 지속적인 노출은 더이상의 구매량을 증가시키지 못하는 경우를 흔히 찾아볼 수 있습니다.</p>
<h4 id="twitter-example">Twitter Example</h4>
<p><img src="https://images.velog.io/images/leejongj/post/2b407a8c-d7f1-47f9-93a7-dde8851c0e73/image.png" alt=""></p>
<p>해당 실험은 500개의 hastags에 대해 얼마나 노출되었으며, hashtags에 노출된 뒤, 해당 hastags를 얼마나 사용했느냐 측정한 것입니다. 결과적으로 그래프는 다음과 같이 나타나고 있습니다. 일정시점에서 증가하다가 peak를 찍고, 감소하는 추세를 보이고 있습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/7ee2b14f-99bc-4181-b839-d348b658a010/image.png" alt=""></p>
<p>우리는 여기서 persistence의 개념을 파악할 수 있습니다. 만약 가장 높은 peak 점을 찍고 난 후에도 그래프의 곡선이 낮아지지 않는다면 해당 그래프는 지속성이 크다고 말할 수 있을 것입니다. 즉, persistence가 높다고 말할 수 있습니다. 우리는 이를 그래프의 아래의 면적을 통해서 파악할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/cc24b709-defb-4874-902e-c9d778db6dd6/image.png" alt=""></p>
<p>8개의 카테고리에 대해 persistence를 측정한 결과를 보면, Politics와 Sports가 높은 persistence를 가지고 있는 것으로 확인할 수 있었습니다.
8개의 카테고리에 대해 stickiness를 측정한 결과를 보면, Music의 경우, stickiness가 높게 나타나는 것으로 파악해볼 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[12.  Network Effects and Cascading Behavior]]></title>
            <link>https://velog.io/@tobigs-gnn1213/12.Network-Effects-and-Cascading-Behavior</link>
            <guid>https://velog.io/@tobigs-gnn1213/12.Network-Effects-and-Cascading-Behavior</guid>
            <pubDate>Mon, 22 Mar 2021 09:40:52 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/cryingjin">이예진</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro: Spreading Through Networks</li>
<li>Decision Based Model of Diffusion  </li>
<li>Application: Modeling protest recruitment on social networks </li>
<li>Extending the Model: Allow People to Adopt A and B</li>
<li>Summary &amp; PREVIEW</li>
</ol>
<hr>
<h1 id="network-effects-and-cascading-behavior">Network Effects and Cascading Behavior</h1>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/e694d294-80e9-470d-987b-e3a0d0694933/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.45.31.png" alt=""></p>
<h2 id="0-intro-spreading-through-networks">0. Intro: Spreading Through Networks</h2>
<blockquote>
<p><strong>Keyword</strong>
<code>cascade</code>,<code>diffusion</code>,<code>game theoretic model</code>, <code>k-core decomposition</code></p>
</blockquote>
<p>12강은 제목 그대로 Network Effect와 Cascading Behavior에 대해 배웁니다. Spreading Through Networks에는 다음과 같은 분야들이 있습니다. &#39;행동&#39; 들은 network안에서 node에서 node로 흐릅니다(cascade).</p>
<p><strong>Spreading Through Networks</strong></p>
<ul>
<li>Cascading behavior</li>
<li>Diffusion of innovations</li>
<li>Netsork effects</li>
<li>Epidemics</li>
</ul>
<p><strong>Example</strong></p>
<ul>
<li>Biological: 전염병</li>
<li>Technological<ul>
<li>Cascading failures </li>
<li>Spread of information</li>
</ul>
</li>
<li>Social<ul>
<li>Rumors, news, new technology</li>
<li>Viral marketing</li>
</ul>
</li>
</ul>
<p>-&gt; Twitter &amp; Facebook posh sharing(repost) 와 상품 추천 등이 해당</p>
<p><strong>Network Cascades(and Terminology)</strong>
<img src="https://images.velog.io/images/tobigs-gnn1213/post/c30f1cad-b443-4b2f-8020-484172fbdba7/image.png" alt=""></p>
<ul>
<li>contagion</li>
<li>cascade</li>
<li>infection event : Adoption, infection, activation</li>
<li>main players : infected/active nodes, adopters</li>
</ul>
<hr>
<h3 id="확산diffusion을-어떻게-model로-만들까">확산(Diffusion)을 어떻게 model로 만들까?</h3>
<p>의사결정(decision making)여부에 따라 <code>Decision based model</code> 과 <code>Probabilistic model</code> 이 있습니다. 오늘은 Decision based model에 대해서만 알아보도록 하겠습니다.</p>
<hr>
<h2 id="1-decision-based-model-of-diffusion">1. Decision Based Model of Diffusion</h2>
<p>Decision Based Model은 기본적으로 <a href="https://ko.wikipedia.org/wiki/%EA%B2%8C%EC%9E%84_%EC%9D%B4%EB%A1%A0">게임이론</a>을 이용합니다. </p>
<h3 id="game-theoretic-model-of-cascades">Game Theoretic Model of Cascades</h3>
<ul>
<li>2명의 <code>player</code>가 각각 선택A나 선택B를 하는 의사결정 상황</li>
<li>만약 친구들이 내가 한 선택과 같은 선택을 한다면 더 많은 이득을 얻음</li>
<li>ex. BetaMax vs <strong>VHS</strong> , <strong>BlueRay</strong> vs HD DVD
<img src="https://images.velog.io/images/tobigs-gnn1213/post/c91f0566-68b3-40f9-899c-876811da6bb9/image.png" alt="">  </li>
</ul>
<h3 id="the-model-for-two-nodes">The Model for Two Nodes</h3>
<h4 id="payoff-matrix">payoff matrix</h4>
<ul>
<li><strong>v</strong>와 <strong>w</strong>가 모두 <strong>행동A</strong>를 선택하면 payoff <strong><em>a&gt;0</em></strong> 획득</li>
<li><strong>v</strong>와 <strong>w</strong>가 모두 <strong>행동B</strong>를 선택하면 payoff <strong><em>b&gt;0</em></strong> 획득</li>
<li><strong>v</strong>와 <strong>w</strong>가 서로 <strong>반대 선택</strong>을 하면 각각 <strong><em>0</em></strong> 획득</li>
</ul>
<p>-&gt; <code>payoff</code>는 여러 게임에서 보상의 합계로 계산
-&gt; 큰 네트워크에서 각 <code>node v</code>는 근처 이웃의 행동을 따라하게 된다. </p>
<h3 id="calculation-of-node-v">Calculation of Node v</h3>
<p>쉽게 말해서 보상 받는 pay를 고려한 다수결의 선택을 합니다. (보수는 같을 수도, 다를 수도)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/41728e96-9168-4a4a-8f72-448d44c1de98/image.png" alt=""></p>
<h3 id="example-scenario">Example Scenario</h3>
<h4 id="scenario">Scenario</h4>
<ul>
<li><p>Graph 안에 모두는 <strong>B</strong>에서 시작한다.</p>
</li>
<li><p>작은 집단 S들만 <strong>A</strong>를 일찍 적용한다. (Small set S of early adopters of A)</p>
<ul>
<li><strong>Hard-wire S</strong> : 보상에 상관없이 꾸준히 A만 선택 (꾸준하게 애플만 선택하는 앱등이)</li>
</ul>
</li>
<li><p>내 친구 중 50% 이상이 A를 선택하면, 나도 A를 선택한다.(보상 a와 b가 거의 같은 상황인 것)</p>
</li>
</ul>
<blockquote>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/7fdf3122-8cc4-4b51-b013-c72c78e090d4/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/d87cc14e-922d-40ef-a419-1be469f930a0/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/8c3a09c2-0b02-4a2d-832a-e5eb4d0c7c63/image.png" alt=""></p>
</blockquote>
<p>*<U>이게 Cascade입니다. 나(node)는 보상에 충실한 선택(친구따라) 선택했을 뿐인데, 결과적으로 다른 노드에 영향을 주었습니다*</U>*</p>
<h2 id="2-application-modeling-protest-recruitment-on-social-networks">2. Application: Modeling protest recruitment on social networks</h2>
<p><a href="https://arxiv.org/abs/1111.5595">The Dynamics of Protest Recruitment through an Online Network
Bailon et al. Nature Scientific Reports, 2011</a>  </p>
<p>cascade 사례를 보기위해서 스페인에서 일어난 긴축방지 시위(The Spanish &#39;Indignados&#39; Movement)를 예시로 보겠습니다.</p>
<p>Twitter를 사용해서 모이고 모바일 유저들이 참여했습니다. #indignados_movement</p>
<h3 id="1-data-collected-using-hashtags">(1) Data collected using hashtags</h3>
<p>sns를 사용한 운동이었기 때문에 관련 해시태그를 모두 크롤링하고 그 중에 70개의 주요해시태그를 선택했습니다.</p>
<h3 id="2-dataset">(2) Dataset</h3>
<ul>
<li>1달 동안 주요 해시태그가 포함된 트윗(tweets)을 수집했습니다. 결과적으로 <code>581,750</code>개의 트윗을 사용했습니다. </li>
<li>관련 사용자 데이터도 수집했습니다. <code>tweet을 언급한 사람 + 그 사람의 followers</code> 결과적으로 <code>87,569</code>의 유저 데이터를 사용했습니다. </li>
<li>2개의 network를 만들었습니다.<ol>
<li><strong>Full network</strong> : with all Twitter follow links (directed)</li>
<li><strong>Symmetric network</strong> : with only the reciprocal follow links (strong connections only, i&lt;-&gt;j)(undirected)</li>
</ol>
</li>
</ul>
<h3 id="3-definitions">(3) Definitions</h3>
<ul>
<li><strong>User activation time</strong> : Moment when user starts tweeting protest messages (첫 순간, 언제 시작했는지)</li>
<li>$k_{in}$ = The total number of neighbors when a user became active <ul>
<li>유저가 active 시작할 당시 모든 이웃 수</li>
</ul>
</li>
<li>$k_{a}$ = Number of active neighbors when a user<ul>
<li>유저가 active 시작할 때 active 이웃 수</li>
</ul>
</li>
<li><strong>Activation threshold</strong> = $k_{a}/k_{in}$ <ul>
<li>$0 &lt; k_{a}/k_{in} &lt; 1$ </li>
<li>마법의 <code>tradeoff</code>는 없고 상황이나 데이터에 따라 알아내야함</li>
</ul>
</li>
</ul>
<h3 id="4-recruitment--activation-threshold">(4) Recruitment &amp; Activation Threshold</h3>
<ul>
<li><p>$k_{a}/k_{in}\approx 0$ </p>
<ul>
<li>주변에 active 이웃 없는데 active하는 상황</li>
<li>no social pressure</li>
</ul>
</li>
<li><p>$k_{a}/k_{in}\approx 1$</p>
<ul>
<li><p>주변 이웃이 모두 active</p>
</li>
<li><p>high social pressure</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/26c45433-4d1c-4eee-986d-b7778b01d1f6/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h3 id="5-result--significant">(5) Result &amp; significant</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/fbea7451-cf1c-42f3-8e72-92b647fb4988/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/dd5b4f85-10ae-4df7-b36d-6a8a84511d39/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/3390713c-0892-4be7-88d1-d362871230bf/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/51a5da56-5224-46d9-8822-8907b4fe8ef7/image.png" alt=""></p>
<hr>
<h3 id="성공하는-cascade는-누가-시작하나">성공하는 cascade는 누가 시작하나?</h3>
<p>성공하는 cascade는 소수입니다. 네트워크에서 더 중앙에 있는 starter일수록 성공할까요? 성공하는 특정 player들에 대해서 알아보겠습니다. 방법은 <code>k-core decomposition</code>을 사용합니다.</p>
<hr>
<blockquote>
<h3 id="k-core-decomposition">k-core decomposition</h3>
</blockquote>
<ul>
<li>k-core : 모든 노드가 적어도 차수 k개를 가진 연결성이 큰 subgraph.</li>
<li>Method : k보다 작은 차수를 가진 node를 반복적으로 제거해나간다.</li>
<li>Higher k-core number of a node means it is more central
<img src="https://images.velog.io/images/tobigs-gnn1213/post/28e5fa6c-e271-47fb-8e9e-ac93784b9382/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/25e2d07c-bb35-4df3-be99-88a1ba7900d6/image.png" alt=""></li>
</ul>
<blockquote>
<h3 id="summary--cascades-on-twitter">Summary : Cascades on Twitter</h3>
</blockquote>
<ul>
<li>Uniform activation threshold for users, with two local peaks</li>
<li>Most cascades are short</li>
<li>Successful cascades are started by central (more core) users</li>
</ul>
<h2 id="3-extending-the-model-allow-people-to-adopt-a-and-b">3. Extending the Model: Allow People to Adopt A and B</h2>
<p>Decision based model을 <code>multiple contagions</code>가 가능하도록 확장한 모델에 대해서 알아보겠습니다.</p>
<h3 id="extending-the-model">Extending the model</h3>
<ul>
<li>extra strategy <strong>&quot;AB&quot;</strong>를 추가합니다. </li>
<li>한 player가 선택 <strong>A</strong>와 <strong>B</strong>를 <strong>모두</strong> 하는 것을 허용합니다.<ul>
<li><strong>AB-A</strong> : gets a</li>
<li><strong>AB-B</strong> : gets b</li>
<li><strong>AB-AB</strong> : gets max(a,b)</li>
<li>*<em>cost c *</em>: AB라는 선택을 하면 cost c만큼의 비용을 지불해야합니다. 모든 보상과 비용을 합산합니다. </li>
</ul>
</li>
</ul>
<h3 id="cascades--compatibility-model">Cascades &amp; Compatibility: Model</h3>
<ul>
<li>모든 node들은 infinite network에 있고 <strong>B</strong>로 시작합니다.</li>
<li>finite set <strong>S</strong>만 <strong>A</strong>를 선택합니다. (앱등이)</li>
<li>Run the model for t=1,2,3,...<ul>
<li>Each node selects behavior that will optimize payoff(t-1시점에서 이웃이 선택한 상황이 주어지고 t에서 내가 선택)</li>
</ul>
</li>
</ul>
<blockquote>
<h3 id="언제-선택-b에서-a나-ab로-바꿀까">언제 선택 B에서 A나 AB로 바꿀까?</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/a66d2c58-069b-480d-9b5e-5069a629f9ea/image.png" alt="">
<strong>(1) B -&gt; AB</strong> : 3+2-1=<strong>4</strong>, 전에는 2를 받았다면 이제 4를 받기 때문에 AB선택할 것이다. 하지만 A가 흐르는 모습은 볼 수 없다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/aef309ee-0ec1-4d85-babc-b060ab5cae20/image.png" alt="">
<strong>(2) 보상이 바뀜</strong> : 보상이 바뀌면서 A가 흐르게 된다. A를 선택함으로써 얻는 보상을 크게 해서 점점 A나 AB로 선택을 바꿨다.</p>
</blockquote>
<h3 id="general-case">General case</h3>
<p>보상과 비용에 따라 선택이 달라지기 때문에 일반화 해봅시다.
<strong>어떻게 (c,a)를 설정해야 B로 시작하는 곳에서 A가 퍼질 수 있을까요?</strong></p>
<ul>
<li><code>infinite path</code>, start with all <code>B</code></li>
<li><strong>payoffs</strong> for w : <strong>A:a, B:1, AB:a+1-c</strong></li>
</ul>
<blockquote>
<h3 id="ca-에-대해서-x축--a-y축--b로-두고-그래프를-그리면-다음과-같습니다">(c,a) 에 대해서 x축 = a, y축 = b로 두고 그래프를 그리면 다음과 같습니다.</h3>
</blockquote>
<h4 id="1-기본">(1) 기본</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/b46a1ff8-7c97-499d-8d5b-89b9a8c162a2/image.png" alt=""></p>
<h4 id="2-change-payoff--b보상을-늘림">(2) change payoff : b보상을 늘림</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/587f1bfb-5fe8-4557-8712-d201f855bea2/image.png" alt=""></p>
<h4 id="3-두-결과를-합침">(3) 두 결과를 합침</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/dc85a2ba-541e-4081-9cbd-c3589a3213a8/image.png" alt=""></p>
<h3 id="lesson">lesson</h3>
<p>좋은 A나 나올 때까지 디폴트가 B인 상황
<img src="https://images.velog.io/images/tobigs-gnn1213/post/a5a64ed1-ab75-4670-bb98-c4b6eb6f6d06/image.png" alt=""></p>
<ul>
<li><p><span style="color:red">Infilteration</span> : too compatibel</p>
<ul>
<li>B가 호환가능성이 높으면 사람들은 두개 다 해보고 더 나쁜 것 (B)를 버릴것</li>
</ul>
</li>
<li><p><span style="color:blue">Direct conquest</span> : not compatible</p>
<ul>
<li>A가 호환되지 않는 경우, 경계에 있는 사용자가 선택. 더 좋은 것을 고름. 더 좋은 (A)를 선택 할 것</li>
</ul>
</li>
<li><p><span style="color:green">Buffer zone</span> </p>
<ul>
<li>최적인 상태를 고르는 경우, A와 B사이가 정적인 buffer 가 유지됨</li>
</ul>
</li>
</ul>
<blockquote>
<p>이 그림을 보면 A가 B랑 호환성을 높게 만들면(즉, c가 낮아지면) B -&gt; AB -&gt; A 로 넘어가지만, 호환성을 낮게 만들면 direct하게 A로 바뀝니다. 애플의 이어폰단자를 생각해보면 쉽게 이해할 수 있을거라고 생각합니다. a를 쓰는 이점이 매우 크기 때문에, 호환성을 낮춰서 B를 버리고 A로 오게 하는거죠.. ㅠㅠ 
(갓진혁의 정리중...발췌)</p>
</blockquote>
<h2 id="4-summary--preview">4. Summary &amp; PREVIEW</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/531db520-b6dd-469c-9c2f-9d1e25ca6214/image.png" alt=""></p>
<p>*<U> Cascade의 기본 개념과 용어에 대해 알아보고, Diffusion(cascade)를 모델링 하는 방법 두 가지 중에 decision based model에 대해서 배웠습니다. decision based model은 게임이론이 베이스가 되고 기본형과 확장형이 있었습니다.  </U>*</p>
<h2 id="reference">Reference</h2>
<p>Stanford CS224W 2019
<a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter12">https://tobigs.gitbook.io/tobigs-graph-study/chapter12</a>.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[11. Link Analysis: PageRank]]></title>
            <link>https://velog.io/@tobigs-gnn1213/11.-Link-Analysis-PageRank</link>
            <guid>https://velog.io/@tobigs-gnn1213/11.-Link-Analysis-PageRank</guid>
            <pubDate>Mon, 15 Mar 2021 10:15:01 GMT</pubDate>
            <description><![CDATA[<h1 id="web-as-as-graph">Web as as Graph</h1>
<h2 id="structure-of-the-web">Structure of the web</h2>
<ul>
<li>인터넷 웹을 그래프로 생각해보자<ul>
<li>nodes = web pages</li>
<li>edges = hyperlinks</li>
<li>웹 페이지 내부에서 외부 웹 페이지로 링크를 달면 edge가 생긴다고 볼 수 있다
<img src="https://images.velog.io/images/yoonjong12/post/66b159d7-3a05-4a48-a891-d3cae1dae31e/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>Web is a Directed Graph<ul>
<li>web grpah를 보면 directed graph인 것을 알 수 있다</li>
<li>이렇게 연결된 링크를 BFS로 크롤링을 하면 Google의 웹페이지를 몽땅 훑어볼 수 있다
<img src="https://images.velog.io/images/yoonjong12/post/96678e32-fa50-42fa-bead-cccc8f391c37/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="what-does-the-web-look-like">What does the web look like?</h2>
<ul>
<li>인터넷 웹을 그래프로 만들었으면 어떻게 생겼을까?</li>
<li>Web as a directed graph [Broder et al, 2000]<ul>
<li>In(v): node v가 directed edge를 따라서 도달할 수 있는 다른 node의 set</li>
<li>Out(v): directed edge를 따라서 node v에 도달할 수 있는 다른 node의 set
<img src="https://images.velog.io/images/yoonjong12/post/09f3923c-a26a-46ce-a53e-bfca3b9c186f/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>Two types of directed graphs</p>
<ul>
<li><p>Strongly connected: 어느 node에서든 다른 node에 도달할 수 있음
In(A) = Out(A) = {A, B, C, D, E}
<img src="https://images.velog.io/images/yoonjong12/post/9971788a-aae0-405d-8218-b3782476d976/image.png" alt=""></p>
</li>
<li><p>Directed Acyclic Graph(DAG): cycle이 없음. 노드 v에서 u에 도달할 수 있다고해도 u에서 v로 갈 수 없을 수도 있음
<img src="https://images.velog.io/images/yoonjong12/post/2a1b7336-2c64-4b5a-b823-1c4721446976/image.png" alt=""></p>
</li>
<li><p>모든 directeed graph(e.g. web)은 이 2가지 타입에 속한다!</p>
</li>
</ul>
</li>
</ul>
<h2 id="strongly-connected-componentscc">Strongly Connected Component(SCC)</h2>
<ul>
<li><p>SCC 내에서 어느 noed에서 출발하든 다른 node에 도달할 수 있음(strongly connected)</p>
</li>
<li><p>현재 SCC를 포함한 또 다른 SCC는 존재할 수 없음 → 모든 node는 한 SCC에만 속한다 
<img src="https://images.velog.io/images/yoonjong12/post/5f782c84-596b-4494-9271-d6efd48c6f6c/image.png" alt=""></p>
</li>
<li><p>FACT: 모든 directed graph는 SCC의 DAG으로 표현할 수 있다</p>
<ul>
<li>SCC는 전체 그래프의 partition이다. partition이라 함은 중복이 없다는 뜻</li>
<li>전체 그래프 G를 참고하여 G의 SCC를 G&#39;로 만들 수 있다. 이 때 edge는 G와 G&#39; 모두 동일하게 매핑할 수 있고 G&#39;는 DAG라고 볼 수 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/yoonjong12/post/25d6375e-455d-4218-9f04-a3c61a4c0b88/image.png" alt=""></p>
<h2 id="graph-structure-of-the-web">Graph structure of the web</h2>
<ul>
<li>Computational issue: 현재 node가 어느 SCC에 포함되어있는지 어떻게 알 수 있을까?</li>
<li>Observation: node v를 포함하는 SCC = Out(v)∩In(v) = Out(v, G)∩Out(v, G&#39;)
<img src="https://images.velog.io/images/yoonjong12/post/f7dfd5ad-4094-4401-9a8f-e5958d29890b/image.png" alt=""></li>
</ul>
<ul>
<li><p>Directed version of the web graph</p>
<ul>
<li>웹을 graph로 정의하고 일부 노드에서 시작해서 BFS어디까지 탐색할 수 있을까?</li>
<li>결과를 살펴보면 출발 node 노드 비중이 어느 시점을 기준으로 대부분 탐색할 수 있거나 조금 밖에 탐색할 수 없는 경우로 나타났다
<img src="https://images.velog.io/images/yoonjong12/post/142f3010-f65a-439a-8a97-b519828cf65b/image.png" alt=""></li>
</ul>
</li>
<li><p>random node v에 대하여</p>
<ul>
<li>Out(v): 1억(전체 node의 50%)</li>
<li>In(v): 1억(전체 node의 50%)</li>
<li>가장 큰 SCC: 5천 6백만(전체 node의 28%)</li>
<li>이러한 인사이트를 바탕으로 Bowtie structure를 그릴 수 있다
<img src="https://images.velog.io/images/yoonjong12/post/deee4725-f147-4e33-8dd1-94dfb1c8f478/image.png" alt=""></li>
</ul>
</li>
</ul>
<h1 id="pagerank">PageRank</h1>
<ul>
<li>How to organize the web</li>
<li>made by Google research</li>
</ul>
<h2 id="ranking-nodes-on-the-graph">Ranking nodes on the graph</h2>
<ul>
<li>모든 웹 페이지 각각의 중요성은 저마다 다를 것이다<ul>
<li>신윤종의 깃헙 vs HuggingFace 깃헙</li>
</ul>
</li>
<li>그래서, web graph를 활용하여 rank를 매겨보자</li>
<li>Link analysis approaches<ul>
<li>PageRank</li>
<li>Personalized PageRank</li>
<li>Random Walk with Restarts</li>
</ul>
</li>
</ul>
<h2 id="link-as-votes">Link as Votes</h2>
<ul>
<li>IDEA: link(edge)는 민주주의적으로 투표로 따집시다</li>
<li>link가 많은 page는 중요도가 높을 것이다!</li>
<li>In-link를 중요도의 지표로 따져보자<ul>
<li>신윤종의 깃헙(팔로워 11명) vs HuggingFace 깃헙(Transformers만 해도 star 42만개)</li>
</ul>
</li>
<li>모든 in-link가 중요할까?<ul>
<li>중요한 페이지에서 보낸 link가 다른 link보다 더 중요할 것이다</li>
</ul>
</li>
<li>Recursive question!</li>
</ul>
<h2 id="pagerank-the-flow-model">PageRank: The &quot;Flow&quot; Model</h2>
<ul>
<li>중요한 페이지에서 보낸 &quot;투표&quot;가 더 가치 있을 것이다<ul>
<li>각 link는 source page의 중요성 비율이다</li>
<li>만약 page i의 중요도 $r_i$가 $d_i$ out link를 가지고 있을 때, 각 link는 $\frac{r_i}{d_i}$만큼의 vote 가중치를 가진다</li>
<li>page j의 중요도 $r_j$는 j의 in-link vote의 합이다
  $r_j = \displaystyle\sum_{i→j}\frac{r_i}{d_i}$ 
<img src="https://images.velog.io/images/yoonjong12/post/8f099803-abdf-442c-b639-da8f97f79e58/image.png" alt=""></li>
</ul>
</li>
</ul>
<h2 id="matrix-formulation">Matrix Formulation</h2>
<ul>
<li><p>Stochastic adjacency matrix M</p>
<ul>
<li>page j는 out link {d_j}를 가진다고 하자</li>
<li>만약 j에서 i로 링크가 연결된다면 ${M_{ij}} = \frac{1}{d_j}$<ul>
<li>$M$의 column 하나의 sum은 1이다
<img src="https://images.velog.io/images/yoonjong12/post/a07cb74e-f76d-43aa-aefa-3698d5968549/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
<li><p>Rank vector r</p>
<ul>
<li>$r_i$는 page i의 중요도를 의미한다</li>
<li>$\sum_{i}{r_i} = 1$</li>
</ul>
</li>
<li><p>flow equation
${r} = {M}\cdot{r}$<br><img src="https://images.velog.io/images/yoonjong12/post/e244e1fb-cf5a-4f27-9056-008722ae60d8/image.png" alt=""></p>
</li>
</ul>
<h2 id="random-walk-interpretation">Random walk interpretation</h2>
<ul>
<li>random web surfer<ul>
<li>특정 time t에 page i를 서핑하고 있다고 해보자</li>
<li>다음 t+1에 uniformly random하게 결정된 out-link를 따라 page j로 이동한다</li>
<li>이 과정을 무한히 반복한다
<img src="https://images.velog.io/images/yoonjong12/post/82d9f8aa-c1b4-4f37-886f-c1e9328d82ff/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li><p>$p(t)$: 전체 페이지 개수만큼의 벡터로, i째 원소는 time t에서 i에 도달할 확률을 의미한다</p>
</li>
<li><p>time t+1에 어디에 있을까?</p>
<ul>
<li>균등확률로 랜덤하게 움직여보자
$p(t+1) = {M}\cdot{p(t)} = p(t)$
p(t)는 aP = a를 만족하는 stationary distribution 상태이다
<img src="https://images.velog.io/images/yoonjong12/post/b5fcdf74-1097-4881-addc-b3bb542b372a/image.png" alt=""></li>
</ul>
</li>
<li><p>앞서 배운 rank vector는 ${r} = {M}\cdot{r}$인데? </p>
<ul>
<li>따라서 r은 random walk에서 stationary distribution 상태이다</li>
</ul>
</li>
</ul>
<h2 id="eigenvector-formulation">Eigenvector formulation</h2>
<ul>
<li><p>${r} = {M}\cdot{r}$ 에 따라 rank vector r은 stochastic web matrix M의 eigenvector임을 확인하였다 </p>
<ul>
<li><p>임의의 node u에서 출발해서 random walk를 진행한다고 해보자 수식은
$r = \lim\limits_{i \to \infty}M(M(...M(M u)))$가 된다. </p>
</li>
<li><p>좀더 풀어서 써보면 $r = Mu = M(M u) = M(M(M U) = M(M(...M(M u)))$</p>
</li>
<li><p>그럼 우리의 pagerank를 쉽게 뽑을 수 있을 거 같다</p>
</li>
</ul>
</li>
</ul>
<h2 id="power-iteration">Power iteration</h2>
<ul>
<li>Power iteration; simple iterative scheme<ul>
<li>초기화: $r^{(0)} = [1/N, ..., 1/N]^T$  where N= # of nodes</li>
<li>반복: $r^{(t+1)} = {M}\cdot{r^{(t)}}$</li>
<li>기저: $|r^{(t+1)} - r^{(t)}|_1 &lt; ε|$  (L1 norm)</li>
</ul>
</li>
</ul>
<h2 id="pagerank-how-to-solve">PageRank: how to solve?</h2>
<ul>
<li>모든 노드마다 page rank를 초기화한다</li>
<li>power iteartion으로 수렴할 때까지 반복한다
<img src="https://images.velog.io/images/yoonjong12/post/19ab2a3f-55fb-46ca-a59f-54ae5774b18e/image.png" alt=""></li>
</ul>
<h3 id="3-questions">3 Questions</h3>
<ul>
<li>그래서 실제 그래프에서는 수렴하긴 하나?</li>
<li>수렴하면 우리가 원하는 모양으로 수렴하나?</li>
<li>결과는 합리적인가?</li>
</ul>
<p>→그러니까 일반적인 상황에서 써먹을 수 있냐구</p>
<h3 id="problems">Problems</h3>
<ul>
<li><p>Problem 1) 어떤 페이지는 막다른길이다</p>
<ul>
<li>out-link가 없다</li>
<li>importance의 leakage를 유발한다</li>
<li>pagerank의 수렴에는 문제가 되지 않지만 pagerank score가 맘에 들지 않을 것이다
<img src="https://images.velog.io/images/yoonjong12/post/10caf9b8-bfdb-46b4-8fce-3b02ad745894/image.png" alt=""></li>
</ul>
</li>
<li><p>Problem 2) Spider traps</p>
<ul>
<li>모든 out-link가 group에 속해있을 때 모든 importance는 해당 group이 모두 흡수해버린다</li>
<li>pagerank 수렴에 문제가 생긴다
<img src="https://images.velog.io/images/yoonjong12/post/374da270-d39c-41de-84fa-7f3806d4623e/image.png" alt=""><h3 id="solutions">Solutions</h3>
</li>
</ul>
</li>
<li><p>Spider traps의 해결책: 각 time마다 random sufer는 2가지 선택지가 생긴다</p>
<ul>
<li>확률 β는 link를 그대로 따라갈 확률이다</li>
<li>확률 1-β는 연결되어있지 않는 랜덤한 page로 점프할 확률이다</li>
<li>일반적으로 β는 0.8~0.9로 설정한다</li>
</ul>
</li>
<li><p>Dead ends 해결책: </p>
<ul>
<li>Teleports: 막다른 길에 다다른 node에게 다른 node로 연결될 확률은 배분한다<ul>
<li>dead ends node m이 다른 node로 갈 확률의 전체 합은 1이다
<img src="https://images.velog.io/images/yoonjong12/post/1d522f63-4236-4843-bd18-443b768f1b23/image.png" alt=""></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="google-matrix">Google matrix</h2>
<ul>
<li><p>Spider traps를 고려한 Pagerak 수식
${r_{j}} = \displaystyle\sum_{i→j}β\frac{r_i}{d_i} + (1-β)\frac{1}{N}$ </p>
<ul>
<li>이 수식은 $M$에 균등확률을 배정하는 전처리를 진행하여 dead ends 문제를 피할 수 있다.</li>
</ul>
</li>
<li><p>Google Matrix A
${A} = β M + (1-β)[\frac{1}{N}]_{N×N}$ </p>
<ul>
<li>여전히 $r = {A}\cdot{r}$의 재귀적인 문제가 있지만 power iteration을 사용해준다
<img src="https://images.velog.io/images/yoonjong12/post/603fa7b8-d927-4403-b5f0-01269c12f58c/image.png" alt=""></li>
</ul>
</li>
</ul>
<h1 id="how-do-we-actually-compute-pagerank">How do we actually compute PageRank?</h1>
<h2 id="computing-pagerank">Computing PageRank</h2>
<ul>
<li>N = 10억 page<ul>
<li>각 entry마다 4byte를 쓴다고하자</li>
<li>pagerank r이 old, new 2종류가 합해서 8GB가 필요하다</li>
</ul>
</li>
<li>Google matrix A는 N*N크기이다 <ul>
<li>개수만 해도 ${10}^{18}이다</li>
</ul>
</li>
</ul>
<h2 id="sparse-matrix-formulation">Sparse Matrix formulation</h2>
<ul>
<li>수식을 재정의해보면 ${A} = β M + (1-β)[\frac{1}{N}]_{N}$</li>
<li>M은 sparse matrix로 dead ends가 없다는 가정하에 10개의 링크가 각 노드마다 달려있다고하면 10N entries가 있다고 볼 수 있다</li>
<li>매 반복마다 pagerank 공식에 (1-β)/N의 상수를 각 $r^{new}$에 더하면 된다</li>
<li>다만 dead-ends가 우려되는 상황이라면 normalize해주자</li>
</ul>
<h2 id="complete-algorithm">Complete algorithm</h2>
<ul>
<li>Input: Graph G and parameter β</li>
<li>Output: Pagerank vector $r^{new}$<ul>
<li>Set $r^{old}_j = \frac{1}{N}$</li>
<li>수렴할 때까지 반복: $\displaystyle\sum_{j}|r^{new}_j - r^{old}_k| &lt; ε$<ul>
<li>$r&#39;^{new}<em>j = \displaystyle\sum</em>{i→j}βr&#39;^{new}_i / d_i$</li>
<li>in-link가 없는 경우에는 0</li>
</ul>
</li>
<li>leaked pagerank 정보를 더해준다<ul>
<li>$r^{new}_j = r&#39;^{new}_j + (1-S / N)$</li>
</ul>
</li>
</ul>
</li>
</ul>
<h1 id="node-proximity-measurement">Node Proximity Measurement</h1>
<ul>
<li>Bipartite graph에서의 pagerank는?</li>
<li>같은 종류끼리는 독립인데?
<img src="https://images.velog.io/images/yoonjong12/post/6b4cad1a-c8ae-423e-9e5c-b21265483f7c/image.png" alt=""></li>
</ul>
<h2 id="proximity-on-graphs">Proximity on graphs</h2>
<ul>
<li>personalized pagerank: random walk로 계산해보자</li>
<li>query nodes가 주어지면 random walk 수행</li>
<li>restart proba가 주어지면 random walk를 처음부터 수행하게 됨</li>
<li>주어진 query nodes들이 가장 많이 방분한 node가 highest proximity를 보인다
<img src="https://images.velog.io/images/yoonjong12/post/dc8bc7b9-2bf2-4926-9bdf-37baa46e530c/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10. Deep Generative Model for Graphs]]></title>
            <link>https://velog.io/@tobigs-gnn1213/Deep-Generative-Model-for-Graphs</link>
            <guid>https://velog.io/@tobigs-gnn1213/Deep-Generative-Model-for-Graphs</guid>
            <pubDate>Mon, 15 Mar 2021 08:16:00 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/minjung-s">신민정</a></p>
<blockquote>
<p>Content
0. Intro</p>
</blockquote>
<ol>
<li>The Probelm : Graph Generation</li>
<li>Machine Learning for Graph Generation</li>
<li>GraphRNN : Generating Realistic Graphs</li>
<li>Applications and Open Questions</li>
</ol>
<p>지난 강의에서는 Graph를 vector로 encoding하는 방법을 배웠습니다. <strong>Deep Graph Encoders</strong>
<img src="https://images.velog.io/images/minjung-s/post/81454ba7-1bac-4960-8c1f-1fa9e60a32dc/image.png" alt="">
이번 강의에서는 graph를 generate하는 과정을 배우보겠습니다. <strong>Deep Graph Decoders</strong>
<img src="https://images.velog.io/images/minjung-s/post/4417768c-5aa7-41e8-a2f0-12a5c9510728/image.png" alt="">
encoding된 vector으로 부터 grpah structure를 생성할 수 있습니다.</p>
<h1 id="1-the-probelm--graph-generation">1. The Probelm : Graph Generation</h1>
<p>graph generation의 목표는 <strong>realistic한 grpah를 생성</strong>하는 것입니다.
<img src="https://images.velog.io/images/minjung-s/post/14b42929-8215-4457-ad1e-9390ed6480bb/image.png" alt="">
graph generation이 갖는 의의는 다음과 같습니다.</p>
<ul>
<li>Generation : graph 형성 과정에 대한 insight를 얻을 수 있습니다.</li>
<li>Anomaly detection - 비정상적인 부분/동작이 발생하는 이유를 발견할 수 있습니다.</li>
<li>Predictions - 과거로부터 미래를 예측할 수 있습니다.</li>
<li>새로운 구조를 발견할 수도 있습니다.</li>
<li>Graph completion - many graphs are partially observed</li>
<li>&quot;What if&quot; scenarios</li>
</ul>
<p>graph generation의 목표에 따라 모델이 달라 질 수 있습니다.
<strong>Task1 : Realistic graph generation</strong>
-&gt;reference graph와 동일한(유사한) graph를 만들어야 합니다. 
<strong>Task2 : Goal-directed graph generation</strong>
-&gt; 주어진 조건과 제약에 맞게 graph를 만들어야 합니다. (예.Drug molecule generation/optimization)</p>
<p><em>이번 강의에서는 <strong>Task1 : Realistic graph generation</strong>에 대한 내용을 주로 다루겠습니다.</em></p>
<p>Graph Generation을 사용하는 task의 대표적인 예는 <strong>Drug Discovery</strong>입니다. 기존 분자 구조를 완성하여 desired property에 최적화된 새로운 약물을 발견할 수 있습니다.
<img src="https://images.velog.io/images/minjung-s/post/75f66c72-bd49-4400-bc90-f83236070aed/image.png" alt="">
이외에도 <strong>Discovering novel sturctures</strong>, <strong>Network Science</strong>(Null momdels for realistic networks) 같은 분야에도 사용됩니다. </p>
<p>하지만, 그래프를 생성하는 작업은 그리 쉽지 않습니다.
<span style="color:red"><strong>Grpah Generation은 왜 어려울까요??</strong></span>
output space가 크고 다양하기 때문입니다. $n$개의 node를 위해 $n^2$개의 값을 생성해야합니다. (인접행렬)
<img src="https://images.velog.io/images/minjung-s/post/865829a0-d277-4d08-ba24-de425dfa5fe8/image.png" alt="">
또한 7강에서 언급한 바와 같이, Graph의 표현은 고정되어있지 않습니다. 또한 정해진 순서도 없습니다. 같은 그래프이지만, node의 index가 다르면 다르게 표현되고, 이는 objective function으로 최적화하는데 어려움이 있습니다.
<img src="https://images.velog.io/images/minjung-s/post/850ee5fb-de76-4265-831c-367acfbe0d35/image.png" alt=""></p>
<p>또한 복잡한 의존성(complex dependency)문제도 있습니다.(<strong>long-range dependencies</strong>) 만약 6개의 node가 있는 링 그래프를 생성하려면, 먼저 node가 있어야하고 그 node를 연결해야합니다. 연결하는 과정에서 우리가 현재 처리하고 있는 node의 수를 기억해야합니다. 그렇지않으면 우리가 원하는 조건을 만족하지 못할 수도 있습니다. 
<em>it&#39;s hard to generate a graph with respect to some specific conditions.</em></p>
<h1 id="2-machine-learning-for-graph-generation">2. Machine Learning for Graph Generation</h1>
<p><strong><code>Graph Generative Model</code></strong>은 말 그대로 graph를 생성하는 모델입니다. 특정graph의 구조와 특징을 잘 닮은 현실적인 그래프를 생성하려고 합니다. reference graph들의 확률분포 <strong>$p_{data}(G)$</strong>가 있을 때, <strong>$p_{data}(G)$</strong>와 유사한 <strong>$p_{model}(G)$</strong>을 만들면됩니다. <strong>$p_{data}(G)$</strong>에서 sampling한 graph들이 주어지고, 이 그래프들로 $p_{data}(G)$를 만들면, $p_{data}(G)$에서 generated graph를 sampling합니다.
<img src="https://images.velog.io/images/minjung-s/post/f2880ad8-f456-4f9e-a217-74326a751f60/image.png" alt="">
만약 &quot;어떤 특징을 가지고 있는 분자&quot;들의 확률 분포를 $p_{data}(G)$라고 하면, 그 확률 분포에서 sampling해온 <strong>reference graph</strong>들은 동일한 &quot;어떤 특징&quot;을 가지고 있을것입니다. $p_{data}$와 비슷하도록 학습된 $p_{model}$에서 sampling한 <strong>generated graph</strong>들도 &quot;어떤 특징&quot;을 가지고 있도록 하는것이 generation의 목표입니다. <strong>graph 도메인에서의 generative model은 graph의 node를 생성하는 것이 아닌, 전체 graph를 생성합니다.</strong> </p>
<h2 id="recap--generative-model"><strong>Recap : Generative Model</strong></h2>
<p>Generative Model의 개념을 알아보겠습니다. 
앞서 말씀드린 바와 같이 Generative Model의 목표는 <strong>기존 data의 확률분포 $P_{data}$와 유사한 $P_{model}$을 만드는 것</strong>입니다. 우리는 $P_{data}$에서 온 data $x<del>P_{data}$만 있을 뿐, $P_{data}$가 무엇인지 모릅니다. 학습 데이터로 모델 분포에 최적으로 근사시키는 변수 $\theta$를 찾게됩니다. 이는 결합확률 함수 형태로 표현 가능하며, 수치해석이 쉽도록 log 공간으로 변형시켜 maximum likliehood문제로 풀게됩니다. 
<img src="https://images.velog.io/images/minjung-s/post/0bc2db34-9d35-4015-97c1-c325d38d7b0c/image.png" alt="">
대부분의 생성모델에서는 noise distribution에서 $z$를 sampling해옵니다. $z_i$</del>N(0,1)
Deep Neural Net으로 decoding하여 원하는 data를 생성합니다. $x_i=f(z_i;\theta)$</p>
<p><img src="https://images.velog.io/images/minjung-s/post/67fd77da-2248-4fed-890d-c7c2f641e7ae/image.png" alt="">
생성모델에는 많은 종류가 있는데, 오늘 배울 Graph Generation은 <strong>Auto-regressive model</strong>을 사용합니다.  Tractable Density를 추정합니다. fully visible brief network의 일종으로, density를 명시하고 시작하며 likelihood $p(x)$를 모델링합니다.
<img src="https://images.velog.io/images/minjung-s/post/a844c1eb-d14b-4fc7-a7e6-63f00ca0da78/image.png" alt="">
<strong>chain rule</strong>을 통해 graph내의 모든 action(add node, add edge)에 대한 joint likelihood는 <strong>모든 action의 likelihood의 곱</strong>의 형태가 됩니다.</p>
<h1 id="3-graphrnn--generating-realistic-graphs">3. GraphRNN : Generating Realistic Graphs</h1>
<p><strong>idea</strong> : node와 edge를 <strong>sequencial하게</strong> 추가하면서 graph를 생성합니다.
<img src="https://images.velog.io/images/minjung-s/post/6bf11d3c-da72-476f-b6e8-439070491a11/image.png" alt=""></p>
<ul>
<li>$\pi$ : node ordering(Graph의 node순서). Random으로 결정됩니다.</li>
<li>$S^{\pi}$ : Graph의 node의 연결 sequence
graph $G$ with node ordering $\pi$ can be <strong>uniquely</strong> mapped into a sequence of node and edge additions $S^{\pi}$
<em>(예. 1~5까지의 숫자를 가진 5개의 node의 sequence)</em></li>
</ul>
<p><img src="https://images.velog.io/images/minjung-s/post/a6f57c12-a46d-475b-976a-a634e5bbff10/image.png" alt="">
graph $G$의 node ordering $\pi$가 결정되면, sequence $S$는 unique하게 결정됩니다.
$S^{\pi}$의 원소 $S^{\pi}_n$은 모두 작은 graph입니다. 노드의 순서가 고정되면 전체 그래프를 생성하는 방법은 하나뿐입니다.</p>
<p>sequence $S^{\pi}$은 두 가지 level로 나뉩니다. </p>
<ul>
<li><strong><code>Node-level</code></strong> : 새로운 node를 하나 추가합니다.
<img src="https://images.velog.io/images/minjung-s/post/54f1cd57-696c-4fc8-bc87-c7a746b1e5c3/image.png" alt=""></li>
<li><strong><code>Edge-level</code></strong> : 추가된 node와 기존 node를 잇는 edge(link)를 추가합니다.
<img src="https://images.velog.io/images/minjung-s/post/a45aa22f-b198-4729-8e88-299a216ed53f/image.png" alt="">
node-level을 한번 upedate하면, 그 node에 해당하는 edge-level을 update하고, 그 다음 node를 추가하는 node-level을 update하고 다시 edge-level을 update하는 과정을 반복합니다.</li>
</ul>
<p>node-level squence의 요소마다 edge-level sequence가 있으므로, <strong>squence of sequence</strong>라고 합니다. 
<img src="https://images.velog.io/images/minjung-s/post/8470ea12-29b5-42b7-8117-e29c46648ecd/image.png" alt="">
graph generation문제를 sequence generation문제로 볼 수 있습니다. sequence generation은 두 단계로 나뉩니다.</p>
<ul>
<li>Generate a state for a new node (<strong>Node-level sequence</strong>)</li>
<li>Generate edge for the new node based on its state (<strong>Edge-level sequence</strong>)</li>
</ul>
<p>sequence 생성이기 때문에 <strong>Recurrent Neural Network</strong>로 해결할 수 있습니다. </p>
<h2 id="graphrnn">GraphRNN</h2>
<p><strong><code>GraphRNN</code></strong>은 두단계로 나뉩니다.</p>
<ul>
<li><strong><code>node-level RNN</code></strong> : 새로운 node를 만들고, 만들어진 node는 edge-level RNN의 initial state가 됩니다.</li>
<li><strong><code>edge-level RNN</code></strong> : 이전 방법대로 한다면 Node 5를 생성할 때, Node 1~4까지의 모든 연결을 고려해야했습니다. 하지만 이제 새로운 node의 edge를 만듭니다. 만들어진 edge는 node-level RNN의 state를 update합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/minjung-s/post/7d1d54cd-9fef-4a42-acb6-30eee9832cea/image.png" alt=""></p>
<p>이제 RNN으로 sequence를 만드는 방법에 대해 자세하게 알아보겠습니다. (RNN,LSTM,GRU...)</p>
<ul>
<li>$s_t$ : state for RNN after time $t$</li>
<li>$x_t$ : input to RNN after time $t$</li>
<li>$y_t$ : output of RNN after time $t$</li>
<li>$W,U,V$ : parameter matrices</li>
<li>$\sigma()$ : non-linearlity
<img src="https://images.velog.io/images/minjung-s/post/6b44be5e-ff58-4eef-a27b-a979e707a2bc/image.png" alt="">
Auto-regressive model이기 때문에 <strong>이전 cell의 output이 다음 cell의 input</strong>으로 들어가는 구조이므로 $x_{t+1}=y_t$입니다.
또한 처음 state와 처음 input인 $s_0,x_1$은 <strong>SOS(Start Of Sequence)</strong> start tocken으로 지정해주고, end tocken인 <strong>EOS(End Of Sequence)</strong>로 생성을 멈춰줍니다. (SOS,EOS $\rightarrow$ zero vector)
<img src="https://images.velog.io/images/minjung-s/post/1115b016-dc20-489f-8bbe-ce4908d762b6/image.png" alt="">
<span style="color:red">하지만, 이렇게 $x_{t+1}=y_t$이라면 모델이 deterministic하여 같은 graph만 생성될 것입니다. (diversity가 없다.)</span> 
따라서 이전 cell의 output을 다음 cell의 input으로 바로 넣어주는 것이 아닌, <strong>$y_t$로 확률을 출력하여, 그 확률 분포에 맞게 $x_{t+1}$을 sampling해줍니다.</strong> $x_{t+1}~y_t$
<img src="https://images.velog.io/images/minjung-s/post/a95c3750-a6ba-4e5e-baf3-0a9ddeddefa6/image.png" alt="">RNN의 각 step의 output $y$는 확률 vector입니다.</li>
</ul>
<h3 id="training">Training</h3>
<p>edge에 대한 Ground Truth(Adjacency matrix) $y^<em>$로 *</em>teacher forcing**을 합니다.</p>
<blockquote>
<p><strong>teacher forcing</strong>
techer forcing이란, Ground Truth를 디코더의 다음 입력으로 넣어주는 기법입니다.
<img src="https://images.velog.io/images/minjung-s/post/692f2bf5-e830-4db5-b6ae-fa464b7a6178/image.png" alt=""></p>
</blockquote>
<h4 id="loss">Loss</h4>
<p>$y^<em>={1,0,1,....}$ 로 <strong>Binary Cross Entropy</strong>를 계산합니다.
$L=-[y^</em>_1log(y_1) + (1-y^<em>_1)log(1-y_1)]$
BCE를 minimize하는 방향으로 학습합니다.
실제값 $y^</em>$=1이면  $y^<em>_1log(y_1)$ term을 최소화하고,
실제값 $y^</em>$==0이면 $(1-y^*_1)log(1-y_1)$ term을 최소화합니다.</p>
<h4 id="training-process">training process</h4>
<p><img src="https://images.velog.io/images/minjung-s/post/0e710873-4649-49c9-af21-a0043b1f0509/image.png" alt="">
이 graph가 data로 주어졌습니다.
<img src="https://images.velog.io/images/minjung-s/post/a71842f8-8450-4610-a886-3f5b83a8eb09/image.png" alt="">
Node 1이 graph에 있다고 가정하고, Node2를 추가해보겠습니다.
<img src="https://images.velog.io/images/minjung-s/post/b7c162eb-cb70-443b-95b2-85deb8cbe749/image.png" alt="">
Edge RNN은 Node 1과 Node 2사이의 edge를 예측합니다. 첫번째 Edge RNN cell에서 0.5의 확률을 output으로 출력했고, teacher forcing하기 때문에 실제 GT인 1을 다음 Edge RNN cell의 입력으로 넣어줍니다.
<img src="https://images.velog.io/images/minjung-s/post/45300790-570f-4039-bfec-2139761b6b06/image.png" alt="">
Edge RNN에 GT가 supervision으로 오게됩니다. 
<img src="https://images.velog.io/images/minjung-s/post/72a74f9f-0c1c-41f8-89ef-9f17d40c5051/image.png" alt="">
Edge RNN의 최종 output sequence {1}을 Node RNN의 입력으로 주어 다음 node level(Node 3)로 update합니다.
<img src="https://images.velog.io/images/minjung-s/post/2bc73a1a-a163-4217-925b-faafa181c3a4/image.png" alt="">
다음으로 Edge RNN은 새로운 노드 Node 3와 기존 Node들이 연결되어있는지 확인합니다. 역시 Edge RNN에서는 teacher forcing을 해줍니다.
<img src="https://images.velog.io/images/minjung-s/post/5b433696-9a50-412c-afc2-8b8c12deae75/image.png" alt="">
다음으로 GT를 supervision으로 줍니다.
<img src="https://images.velog.io/images/minjung-s/post/f565a42c-a9ec-4b0f-af23-56e31482f48b/image.png" alt="">
Edge RNN의 output인 결과를 Node RNN의 입력으로 보내줍니다.
<img src="https://images.velog.io/images/minjung-s/post/743a0a56-305f-43f3-9891-b3df30a0492c/image.png" alt="">
동일하게 Edge RNN에서 edge에 대한 확률값을 예측하는데, Node 4는 아무 node와 연결되어있지 않으므로 graph 생성을 중단합니다.
<img src="https://images.velog.io/images/minjung-s/post/9d58a15d-757d-40e1-a1a5-eac1d0069415/image.png" alt="">
reference graph (GT)를 가지고 BCE loss를 사용하여 전체 RNN layer에 대해 backprob을 진행합니다.</p>
<h3 id="test">Test</h3>
<p><img src="https://images.velog.io/images/minjung-s/post/ebb403c4-62a2-49c4-92f1-70a277ef449f/image.png" alt="">
Edge RNN의 output으로 나온 확률이 threshold이상일 경우 1, 반대의 경우에는 0값을 얻을 수 있습니다. GT가 없기 때문에, 이전 Edge RNNcell의 결과인 1 또는 0값이 다음 Edge RNN cell의 input으로 들어갑니다. 
<img src="https://images.velog.io/images/minjung-s/post/271fe388-ce71-4247-999a-4cdff938fb64/image.png" alt=""></p>
<p><strong>GraphRNN</strong>을 정리하자면, graph 생성은 <strong><code>node-level sequence</code></strong>과 <strong><code>edge-level sequence</code></strong> 두 단계로 진행되며, <strong>RNN을 사용하여 sequnce를 생성</strong>합니다.</p>
<h2 id="issue---tractability">Issue :  Tractability</h2>
<p>어느 node든지 모든 node와 연결될 수 있습니다. edge generation을 하기에 많은 단계를 거쳐야 합니다. 우선 전체 adjacency matrix가 필요하고, edge의 종속성이 너무 길어져 복잡해집니다. 이러한 한계를 해결하기 위해 <strong>BFS</strong>를 사용합니다.</p>
<blockquote>
<h4 id="기존-random-node-ordering">기존 Random node ordering</h4>
<p>Node 5 may connect to any/all previous nodes
<img src="https://images.velog.io/images/minjung-s/post/ce0d9820-8d33-45cd-9711-dfed4c156846/image.png" alt=""></p>
</blockquote>
<ul>
<li>Node 1을 놓는다.</li>
<li>Node 2를 놓는다.</li>
<li>Node 2와 Node 1의 edge를 확률에 따라 생성한다.</li>
<li>Node 3를 놓는다</li>
<li>Node 3와 Node 2, Node 1의 edge를 확률에 따라 생성한다.</li>
<li>Node 4를 놓는다.
......</li>
</ul>
<blockquote>
<h4 id="bfs-node-ordering">BFS node ordering</h4>
</blockquote>
<ul>
<li>Node 4와 Node 1은 연결되어있지 않기 때문에, 어쩌라고...</li>
</ul>
<p>BFS node ordering을 적용한 결과 Node ordering과 Edge generation 모두 시간복잡도가 대폭 줄게됩니다.
<img src="https://images.velog.io/images/minjung-s/post/1a0b9e15-f33f-4380-9432-a45ab2b59077/image.png" alt=""></p>
<h2 id="evaluating-generated-graphs">Evaluating Generated Graphs</h2>
<p>GraphRNN같은 graph generative model로 생성한 graph가 reference와 얼마나 유사한지 어떻게 측정할 수 있을까요?? 
<img src="https://images.velog.io/images/minjung-s/post/4fb4739a-49af-40a7-ab54-7a04dd4cad9c/image.png" alt="">
어느 그래프에나 적용할 수 있는 효율성있는 Graph Isomorphism test가 없습니다.
따라서 <strong><code>Visual similarity</code></strong>와 <strong><code>Graph statistics similarity</code></strong>로 두 그래프의 유사한 정도를 판단합니다.</p>
<h1 id="4-applications-and-open-questions">4. Applications and Open Questions</h1>
<p>GraphRNN은 앞서 한번 언급한 <strong>Drug Discovery</strong>에 사용될 수 있습니다. 
<img src="https://images.velog.io/images/minjung-s/post/e45d108f-5154-4f92-90bc-cfe35bcb92ae/image.png" alt=""></p>
<ul>
<li>주어진 목적에 따라 모델을 최적화 시켜야 합니다.(<strong>High score</strong>)</li>
<li>주어진 제약 조건을 지켜야합니다.(<strong>Valid</strong>)</li>
<li>실제 그래프 데이로부터 학습을 해야합니다.(<strong>Realisitc</strong>)</li>
</ul>
<p>특정 요구 사항, 주어진 화학적 특성의 높은 점수, 화학적 valency와 realistic을 만족하도록, 세가지 다른 방향으로 접근을 했습니다. </p>
<ul>
<li>GCN + 강화학습</li>
<li>adversarial training</li>
<li>Policy Network in 강화학습</li>
</ul>
<p>Drug Discovery에 대표적으로 사용되지만, graph generation은 아직 open problem이 많습니다.</p>
<ul>
<li>3D,point cloud,scene graph같은 다른 domain에서의 graph generation</li>
<li>큰 그래프 생성</li>
<li>Anomaly detection (예. real graph vs fake graph)</li>
</ul>
<p>이번강의에서는 Graph Generation에 의의와 문제, ML으로 Graph를 생성하는 GraphRNN을 배워보았습니다.</p>
<h1 id="reference">Reference</h1>
<p><a href="https://zhuanlan.zhihu.com/p/147675627">https://zhuanlan.zhihu.com/p/147675627</a>
<a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter10">https://tobigs.gitbook.io/tobigs-graph-study/chapter10</a>.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[9. Graph Neural Networks: Hands-on Session]]></title>
            <link>https://velog.io/@tobigs-gnn1213/9.-Graph-Neural-Networks-Hands-on-Session</link>
            <guid>https://velog.io/@tobigs-gnn1213/9.-Graph-Neural-Networks-Hands-on-Session</guid>
            <pubDate>Mon, 08 Mar 2021 09:47:59 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/jbeen2">이재빈</a>
<code>PyTorch Geometric</code> 을 이용하여 <code>Graph Neural Networks</code> 를 구현하고 학습하는 내용을 공부합니다. </p>
<h1 id="pytorch-geometric">PyTorch Geometric</h1>
<p><code>torch-geometric</code> : GNN implementation module </p>
<ul>
<li>Docs : <a href="https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html">https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html</a> </li>
<li>git : <a href="https://github.com/rusty1s/pytorch_geometric">https://github.com/rusty1s/pytorch_geometric</a> </li>
</ul>
<hr>
<ul>
<li><a href="https://pytorch-geometric.readthedocs.io/en/latest/modules/nn.html#torch_geometric.nn.conv.GCNConv">torch_geometric.nn</a> : GNN Layer </li>
<li><a href="https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html">torch_geometric.utils</a> : Loss / Evaluation Metrics / Utility Function   </li>
<li><a href="https://pytorch-geometric.readthedocs.io/en/latest/modules/transforms.html">torch_geometric.transforms</a> : Transform Data </li>
<li><a href="https://github.com/networkx/networkx">networkx</a> : Visualize Graph Structure  </li>
</ul>
<br>

<p><code>torch_geometric.data.Data</code> : Graph Attributes </p>
<ul>
<li><code>data.x</code> : node feature matrix , [num_nodes, num_node_features]</li>
<li><code>data.edge_index</code> : graph connectivity , [2, num_edges]</li>
<li><code>data.edge_attr</code> : edge attribute matrix , [num_edges, num_edge_features]</li>
<li><code>data.y</code> : Graph or node targets<ul>
<li>graph level : [num_nodes, *]</li>
<li>node label : [1, *]</li>
</ul>
</li>
</ul>
<h1 id="setup">Setup</h1>
<pre><code class="language-python"># install 

!pip install --verbose --no-cache-dir torch-scatter
!pip install --verbose --no-cache-dir torch-sparse
!pip install --verbose --no-cache-dir torch-cluster
!pip install torch-geometric 
!pip install tensorboardX
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip</code></pre>
<pre><code class="language-python">import torch
import torch.nn as nn
import torch.nn.functional as F

import torch_geometric.nn as pyg_nn        # GNN module 
import torch_geometric.utils as pyg_utils  # GNN Utility Function
import torch_geometric.transforms as T


import time
from datetime import datetime

import networkx as nx                      # visualize Graph Structure 
import numpy as np
import torch
import torch.optim as optim

# dataset 
from torch_geometric.datasets import TUDataset
from torch_geometric.datasets import Planetoid
from torch_geometric.data import DataLoader

# visualize 
from tensorboardX import SummaryWriter     
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt</code></pre>
<h1 id="define-the-model">Define the Model</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/fc62875d-d52c-401c-953f-29950a5e495f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.44.58.png" alt=""></p>
<h2 id="1-torch_geometric">1. torch_geometric</h2>
<pre><code class="language-python">class GNNStack(nn.Module):      # stacking of Graph Convolutions 
    def __init__(self, input_dim, hidden_dim, output_dim, task=&#39;node&#39;):
        super(GNNStack, self).__init__()
        self.task = task
        # nn.ModuleList() : nn.Module()을 list로 정리! 각 layer를 list로 전달하고, layer의 iterator를 만듭니다. 
        self.convs = nn.ModuleList()    
        self.convs.append(self.build_conv_model(input_dim, hidden_dim))
        self.lns = nn.ModuleList()
        self.lns.append(nn.LayerNorm(hidden_dim))
        self.lns.append(nn.LayerNorm(hidden_dim))
        for l in range(2):
            self.convs.append(self.build_conv_model(hidden_dim, hidden_dim))

        # post-message-passing
        self.post_mp = nn.Sequential(
            nn.Linear(hidden_dim, hidden_dim), nn.Dropout(0.25), 
            nn.Linear(hidden_dim, output_dim))
        if not (self.task == &#39;node&#39; or self.task == &#39;graph&#39;):
            raise RuntimeError(&#39;Unknown task.&#39;)

        self.dropout = 0.25
        self.num_layers = 3

    # task에 따른 convolution layer를 만들어 줍니다. 
    def build_conv_model(self, input_dim, hidden_dim):
        # refer to pytorch geometric nn module for different implementation of GNNs.
        if self.task == &#39;node&#39;:  # node classification 
            return pyg_nn.GCNConv(input_dim, hidden_dim)
            # return CustomConv(input_dim, hidden_dim) : run my method 
        else:
            return pyg_nn.GINConv(nn.Sequential(nn.Linear(input_dim, hidden_dim),
                                  nn.ReLU(), nn.Linear(hidden_dim, hidden_dim)))

    def forward(self, data):
        &#39;&#39;&#39;
        x : feature matrix (# of nodes, # of node feature dim) 
        edge_index : sparse adj list, 연결된 edge에 대한 node 저장  
                     ex. node 1 : [1,4,6]
        batch : (array) batch마다 node 개수가 달라지므로 -&gt; 어떤 node가 어떤 graph에 속하는지에 대한 정보 저장 
                ex. [1,1,1,1,1] : 5 nodes in graph 1 , [2,2,2] : 3 nodes in graph 2 
        &#39;&#39;&#39;

        x, edge_index, batch = data.x, data.edge_index, data.batch
        if data.num_node_features == 0:         # feature 없으면 -&gt; constant 
          x = torch.ones(data.num_nodes, 1)

        # Neural Network 
        for i in range(self.num_layers):
            x = self.convs[i](x, edge_index)    # Conv Layer 
            emb = x
            x = F.relu(x)
            x = F.dropout(x, p=self.dropout, training=self.training)
            if not i == self.num_layers - 1:
                x = self.lns[i](x)

        if self.task == &#39;graph&#39;:                # mean pooling : average all the nodes 
            x = pyg_nn.global_mean_pool(x, batch)

        x = self.post_mp(x)

        return emb, F.log_softmax(x, dim=1)     

    def loss(self, pred, label):
        return F.nll_loss(pred, label)          # negative log-likelihood </code></pre>
<h2 id="2-custom-model">2. Custom Model</h2>
<pre><code class="language-python">class CustomConv(pyg_nn.MessagePassing):    # inherenting from MessagePassing 
    def __init__(self, in_channels, out_channels):
        super(CustomConv, self).__init__(aggr=&#39;add&#39;)  # Neighborhood Aggregation : Mean, Max, Add, ... 
        self.lin = nn.Linear(in_channels, out_channels)
        self.lin_self = nn.Linear(in_channels, out_channels)

    def forward(self, x, edge_index):
        &#39;&#39;&#39;
        x : feature matrix 
        edge_index : connectivity, Adj list in the edge index  
        &#39;&#39;&#39;

        # x has shape [N, in_channels]
        # edge_index has shape [2, E]

        # original code 
        # Add self-loops to the adjacency matrix : neighbor + self 
        # pyg_utils.add_self_loops(edge_index, num_nodes = x.size(0))   # A + I 

        # 여기에서는 remove self-loops : skip layer on top of that 
        edge_index, _ = pyg_utils.remove_self_loops(edge_index)    

        # Transform node feature matrix.
        self_x = self.lin_self(x)   # B 
        # x = self.lin(x)           # W 

        return self_x + self.propagate(edge_index, size=(x.size(0), x.size(0)), x=self.lin(x))

    def message(self, x_i, x_j, edge_index, size):
        &#39;&#39;&#39;
        GCN : D^(-1/2)*A*D(1/2)*W*X
        x_i : self  
        x_j : neighborhood 
        &#39;&#39;&#39;

        # Compute messages
        # x_j has shape [E, out_channels]

        row, col = edge_index
        deg = pyg_utils.degree(row, size[0], dtype=x_j.dtype)
        deg_inv_sqrt = deg.pow(-0.5)
        norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]

        return x_j

    def update(self, aggr_out):
        # aggr_out has shape [N, out_channels] : add additional layer after message passing 

        # GraphSAGE : L2 Normalization 
        # F.normalize(aggr_out, p=2, dim=-1) 

        return aggr_out</code></pre>
<pre><code class="language-python"># Custom Model 을 사용하는 경우, GNNStack class 내의 build_conv_model return 값을 다음과 같이 수정해 주면 됩니다. 

    def build_conv_model(self, input_dim, hidden_dim):
        # refer to pytorch geometric nn module for different implementation of GNNs.
        if self.task == &#39;node&#39;:
            # return pyg_nn.GCNConv(input_dim, hidden_dim)
            return CustomConv(input_dim, hidden_dim) # run my method 
        else:
            return pyg_nn.GINConv(nn.Sequential(nn.Linear(input_dim, hidden_dim),
                                  nn.ReLU(), nn.Linear(hidden_dim, hidden_dim)))</code></pre>
<h2 id="model">Model</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/6c276a68-8129-4417-8ca3-9110deeccd30/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.56.32.png" alt=""></p>
<h1 id="training-setup">Training Setup</h1>
<h2 id="train">Train</h2>
<pre><code class="language-python">def train(dataset, task, writer):
    if task == &#39;graph&#39;:
        data_size = len(dataset)
        loader = DataLoader(dataset[:int(data_size * 0.8)], batch_size=64, shuffle=True)
        test_loader = DataLoader(dataset[int(data_size * 0.8):], batch_size=64, shuffle=True)
    else:
        test_loader = loader = DataLoader(dataset, batch_size=64, shuffle=True)

    # build model
    model = GNNStack(max(dataset.num_node_features, 1), 32, dataset.num_classes, task=task)
    opt = optim.Adam(model.parameters(), lr=0.01)

    # train
    for epoch in range(200):
        total_loss = 0
        model.train()
        for batch in loader:
            #print(batch.train_mask, &#39;----&#39;)
            opt.zero_grad()
            embedding, pred = model(batch)
            label = batch.y
            if task == &#39;node&#39;:
                pred = pred[batch.train_mask]
                label = label[batch.train_mask]
            loss = model.loss(pred, label)
            loss.backward()
            opt.step()
            total_loss += loss.item() * batch.num_graphs
        total_loss /= len(loader.dataset)
        writer.add_scalar(&quot;loss&quot;, total_loss, epoch)

        if epoch % 10 == 0:
            test_acc = test(test_loader, model)
            print(&quot;Epoch {}. Loss: {:.4f}. Test accuracy: {:.4f}&quot;.format(
                epoch, total_loss, test_acc))
            writer.add_scalar(&quot;test accuracy&quot;, test_acc, epoch)

    return model</code></pre>
<h2 id="validation--test">Validation / Test</h2>
<pre><code class="language-python">def test(loader, model, is_validation=False):
    model.eval()

    correct = 0
    for data in loader:
        with torch.no_grad():
            emb, pred = model(data)
            pred = pred.argmax(dim=1)
            label = data.y

        # mask 를 통해 validation, test 결정 
        if model.task == &#39;node&#39;:
            mask = data.val_mask if is_validation else data.test_mask
            # node classification: only evaluate on nodes in test set
            pred = pred[mask]
            label = data.y[mask]

        correct += pred.eq(label).sum().item()

    if model.task == &#39;graph&#39;:
        total = len(loader.dataset) 
    else:
        total = 0
        for data in loader.dataset:
            total += torch.sum(data.test_mask).item()
    return correct / total</code></pre>
<h1 id="training-the-model">Training the Model</h1>
<pre><code class="language-python"># Setting TensorboardX in Colab 
get_ipython().system_raw(
    &#39;tensorboard --logdir {} --host 0.0.0.0 --port 6006 &amp;&#39;
    .format(&quot;./log&quot;)
)
get_ipython().system_raw(&#39;./ngrok http 6006 &amp;&#39;)
!curl -s http://localhost:4040/api/tunnels | python3 -c \
    &quot;import sys, json; print(json.load(sys.stdin)[&#39;tunnels&#39;][0][&#39;public_url&#39;])&quot;</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/f712464a-6d55-428c-a3d0-3d5a5aa23fbb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.59.12.png" alt=""></p>
<h1 id="visualize-node-embeddings">Visualize Node Embeddings</h1>
<pre><code class="language-python">color_list = [&quot;crimson&quot;, &quot;orange&quot;, &quot;green&quot;, &quot;royalblue&quot;, &quot;purple&quot;, &quot;dimgrey&quot;, &quot;gold&quot;]

loader = DataLoader(dataset, batch_size=64, shuffle=True)
embs = []
colors = []
for batch in loader:
    emb, pred = model(batch)
    embs.append(emb)
    colors += [color_list[y] for y in batch.y]
embs = torch.cat(embs, dim=0)

xs, ys = zip(*TSNE().fit_transform(embs.detach().numpy()))

plt.figure(figsize=(10, 8))
plt.scatter(xs, ys, color=colors, alpha=0.5)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/c6095c5c-5cf3-4a4b-9c50-4e2299ae7dea/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B31.png" alt=""></p>
<h1 id="learning-unsupervised-embeddings-with-graph-autoencoders">Learning Unsupervised Embeddings with Graph AutoEncoders</h1>
<pre><code class="language-python"># VGAE : variational graph auto-encoder
# Knowledge Graph, Graph Reasoning 

class Encoder(torch.nn.Module):
    &#39;&#39;&#39;
    Encoder : Graph Conv to get embeddings 
    Decoder : inner product -&gt; 2개 node 사이의 값이 크면, there&#39;s a likely link between them 
    &#39;&#39;&#39;

    def __init__(self, in_channels, out_channels):
        super(Encoder, self).__init__()
        self.conv1 = pyg_nn.GCNConv(in_channels, 2 * out_channels, cached=True)
        self.conv2 = pyg_nn.GCNConv(2 * out_channels, out_channels, cached=True)

    def forward(self, x, edge_index):
        x = F.relu(self.conv1(x, edge_index))
        return self.conv2(x, edge_index)

def train(epoch):
    model.train()
    optimizer.zero_grad()
    z = model.encode(x, train_pos_edge_index)
    loss = model.recon_loss(z, train_pos_edge_index)    # reconstruction loss 
    loss.backward()
    optimizer.step()

    writer.add_scalar(&quot;loss&quot;, loss.item(), epoch)

def test(pos_edge_index, neg_edge_index):
    model.eval()
    with torch.no_grad():
        z = model.encode(x, train_pos_edge_index)
    return model.test(z, pos_edge_index, neg_edge_index)</code></pre>
<pre><code class="language-python">writer = SummaryWriter(&quot;./log/&quot; + datetime.now().strftime(&quot;%Y%m%d-%H%M%S&quot;))

dataset = Planetoid(&quot;/tmp/citeseer&quot;, &quot;Citeseer&quot;, transform = T.NormalizeFeatures())
data = dataset[0]

channels = 16
dev = torch.device(&#39;cuda&#39; if torch.cuda.is_available() else &#39;cpu&#39;)
print(&#39;CUDA availability:&#39;, torch.cuda.is_available())</code></pre>
<pre><code class="language-python"># encoder: written by us; decoder: default (inner product)
model = pyg_nn.GAE(Encoder(dataset.num_features, channels)).to(dev)
labels = data.y
data.train_mask = data.val_mask = data.test_mask = data.y = None

# data = model.split_edges(data) # split_edges 안 돌아가서 변경!  
data = pyg_utils.train_test_split_edges(data)   # construct positive/negative edges (for negative sampling!)
x, train_pos_edge_index = data.x.to(dev), data.train_pos_edge_index.to(dev)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

for epoch in range(1, 201):
    train(epoch)
    auc, ap = test(data.test_pos_edge_index, data.test_neg_edge_index)
    writer.add_scalar(&quot;AUC&quot;, auc, epoch)
    writer.add_scalar(&quot;AP&quot;, ap, epoch)
    if epoch % 10 == 0:
        print(&#39;Epoch: {:03d}, AUC: {:.4f}, AP: {:.4f}&#39;.format(epoch, auc, ap))</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/ea83da47-11b8-4a2c-8638-7e50d50a5bbf/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.04.44.png" alt=""></p>
<pre><code class="language-python">model.eval()
z = model.encode(x, train_pos_edge_index)
colors = [color_list[y] for y in labels]

xs, ys = zip(*TSNE().fit_transform(z.cpu().detach().numpy()))

plt.figure(figsize=(10, 8))
plt.scatter(xs, ys, color=colors, alpha=0.5)
plt.show()</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/624e179c-cd2e-411b-9357-176d63578308/%E1%84%83%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%85%E1%85%A9%E1%84%83%E1%85%B32.png" alt=""></p>
<h1 id="reference">Reference</h1>
<ol>
<li><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter9.">Tobigs Graph Study : Chapter9. Graph Neural Networks:Hands-on Session</a></li>
<li><a href="https://baeseongsu.github.io/posts/pytorch-geometric-introduction/">예제를 통해 알아보는 PyTorch Geometric 5 Basic Concepts</a></li>
<li><a href="http://web.stanford.edu/class/cs224w/slides/07-GNN2.pdf">Lecture 7. Graph Neural Networks - 2: Design Space</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[8. Graph Neural Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/8.-Graph-Neural-Networks</link>
            <guid>https://velog.io/@tobigs-gnn1213/8.-Graph-Neural-Networks</guid>
            <pubDate>Fri, 05 Mar 2021 21:32:47 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/jbeen2">이재빈</a></p>
<blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
</ol>
</blockquote>
<ol>
<li>Deep Learning for Graphs </li>
<li>Graph Convolutional Network</li>
<li>Graph Attention Network </li>
<li>Application </li>
</ol>
<p><strong>Keyword</strong> : <code>Deep Learning on Graph</code> , <code>Neighborhood Aggregation</code> , <code>GNN</code> , <code>GCN</code> , <code>GAT</code>  </p>
<h1 id="0-intro">0. Intro</h1>
<h2 id="node-embedding">Node Embedding</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/2286e2a9-2f62-41f5-9afb-982359b52f07/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.23.33.png" alt=""></p>
<p>7강에서는 <strong><code>Node Embedding</code></strong> 에 대해 공부했습니다. 
<code>embedding node</code> ($z_u$, $z_v$) 사이의 관계가 <code>original network node</code> ($u$, $v$) 사이의 관계 (<code>Similarity</code>) 를 가장 잘 표현해 주는 <code>encoder</code> ($ENC(⋅)$) 를 찾는 방법을 배웠습니다. </p>
<h2 id="from-shallow-to-deep">From &quot;Shallow&quot; to &quot;Deep&quot;</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/0220256e-c3b8-4f2d-be55-aba89147b332/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.37.11.png" alt=""></p>
<p>이 때 <code>Shallow Encoder</code> (Lookup table) 를 공부했습니다. 
Shallow Encoder는 <strong>single layer</strong> ($f$) 로 구성되어 있으며, 이를 통해 <strong>node embedding</strong> 을 진행하고 ($u$ → $z_u$), <strong>similarity</strong> (${z_v}^T z_u$) 를 계산합니다. </p>
<h3 id="limitations-of-shallow-embedding">Limitations of Shallow Embedding</h3>
<ol>
<li>$O(|V|)$ parameters are needed <ul>
<li>parameter 개수 = # of nodes 
node 끼리 parameter 를 공유하지 않습니다. </li>
<li>각 node 들은 unique embedding 값을 가지게 됩니다. </li>
</ul>
</li>
<li>Inherently &quot;transductive&quot; <ul>
<li>I have to re-embed everything</li>
<li>train 과정에서 보지 않은 node/embedding 을 generalize 할 수 없습니다. </li>
</ul>
</li>
<li>Do not incorporate node features <ul>
<li>node attribute feature 를 사용하지 않습니다. </li>
</ul>
</li>
</ol>
<hr>
<h2 id="deep-graph-encoders">Deep Graph Encoders</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/27015e58-68ac-4c21-87c3-690029d0e45e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.56.40.png" alt=""></p>
<p>따라서 위의 한계를 극복하고자, <strong>multiple layer</strong> 로 구성된 <code>Deep Encoder</code> 를 고려하게 됩니다. </p>
<h3 id="challenges">Challenges</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/9935e514-4118-4e78-8c41-7bb56b459b41/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.14.39.png" alt=""></p>
<p><code>Graph Network</code> 를 <code>Deep Neural Network</code> 구조에 통과시켜서, <code>node embedding</code> (good prediction) 을 만들어 내고 싶지만, 이는 쉽지 않습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/13c9da50-8f8e-43ce-b9a8-3c021531e0f9/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.53.24.png" alt=""></p>
<p>단순하게 Deep Learning을 적용하기에는, 실제 Network가 매우 <strong>복잡</strong>하기 때문입니다. </p>
<ul>
<li>현존하는 <code>ML/DL ToolBox</code> 는 <strong>Image</strong> (Grids = Fixed Size Graph) &amp; <strong>Text</strong> (Sequences = Line Graph) 에 특화되어 있습니다. </li>
<li>Network는 위상학적으로 매우 복잡한 구조를 가지고 있습니다. </li>
<li>node들은 고정된 순서 &amp; 기준점이 없습니다. </li>
<li>dynamic 하며, Multimodal features를 갖는 경우도 있습니다. </li>
</ul>
<h3 id="a-naive-approach">A Naive Approach</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/46a9cc57-4217-49b1-a3b1-db7c7a951e54/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.10.46.png" alt=""></p>
<p><code>Adjacency matrix</code> 와 <code>Feature vector</code> 를 concat 해서 Deep Neural Network 의 input 으로 넣는 방법 또한 적용이 어렵습니다. </p>
<h4 id="issues">Issues</h4>
<ol>
<li>$O(N)$ : parameter 개수 (node + feature) 가 많아집니다. </li>
<li>different size 의 graph 에 적용할 수 없습니다. </li>
<li>node 의 순서가 바뀌면, 의미가 달라질 수 있습니다. <ul>
<li>Adj node 의 ordering 이 shuffle 될 수도 있습니다. <ul>
<li>2 additional feature node 를 어디에 넣어야 할지 모호해집니다. </li>
</ul>
</li>
</ul>
</li>
</ol>
<h2 id="idea--convolutional-networks">idea : Convolutional Networks</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/8befebe1-bd85-4e8d-a7ca-edfbbe9672bb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.37.23.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/a68ef20a-de19-4c5c-be77-5b0034487fce/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.34.14.png" alt=""></p>
<p>Convolutional 연산의 원리는 위와 같습니다. 
sliding window 통해 얻은 정보를 다 더하여, output 을 도출합니다. </p>
<p>$(f \ast g)(t) = \int_{a}^{b} f(\tau) g(t-\tau) , d\tau$</p>
<p><img src="https://images.velog.io/images/jbeen2/post/e4063c05-fc72-4f78-8065-230cde14dd71/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.29.01.png" alt=""></p>
<p><code>neighborhood</code> 의 message 를 <strong>collect</strong> 하여, <code>node</code> 의 message 와 <strong>combine</strong> 하고, 이를 통해 <code>new value</code> 를 <strong>produce</strong> 하고자 합니다. </p>
<p>이러한 과정을 가장 잘 수행할 수 있는 연산 방법이 ConV 이기 때문에, 
<strong><code>Convolutional</code></strong> 을 graph 에 적용해서, <code>information</code> 을 <code>aggregate</code> 하고자 합니다. </p>
<br> 

<h1 id="1-deep-learning-for-graphs">1. Deep Learning for Graphs</h1>
<h3 id="setup">Setup</h3>
<p>graph $G$ 에 대하여, </p>
<ul>
<li>$V$ : vertex set = node 집합 </li>
<li>$A$ : Adjacency matrix = 인접행렬 </li>
<li>$X$ : Node Feature matrix </li>
</ul>
<h3 id="graph-convolutional-networks">Graph Convolutional Networks</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/f7cee865-572c-432c-8f43-b5579d0fc9ef/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.23.54.png" alt=""></p>
<p>Learn how to <strong>propagate information</strong> across the graph to compute <strong>node features</strong> </p>
<p><code>node i</code> 에 대한 prediction 을 하고 싶을 때, </p>
<ol>
<li>node <strong>computation graph</strong> 를 결정하고, </li>
<li>neighborhood information 을 <strong>propagate</strong> 하고 <strong>aggregate</strong> 합니다. </li>
</ol>
<h2 id="aggregate-neighbors">Aggregate Neighbors</h2>
<h3 id="key-idea">Key idea</h3>
<p>Local Network Neighborhoods 정보를 기반으로 <strong>node embedding</strong> 을 진행합니다.</p>
<p><img src="https://images.velog.io/images/jbeen2/post/d81b23dd-3c29-4024-bd71-70f2f6479a01/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.35.20.png" alt=""></p>
<ul>
<li>node B 는 A, C 로 부터, node A 는 B, C, D 로 부터 정보를 얻습니다.</li>
<li>Graph 에서는 4~5 level 이상의 Layer를 쌓지 않는데, (Ch2 MSN 예시에서도 path length = 6.6 이었듯이) Depth 6 정도면 graph 내의 모든 node 를 방문할 수 있기 때문입니다. </li>
</ul>
<h3 id="intuition-1">Intuition 1</h3>
<p>Neural Network 를 통해 <strong>neighborhood information</strong> 을 <strong>aggregate</strong> 합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/ff85d740-03e0-4f99-a5b2-eb66605cbd3c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.46.25.png" alt=""></p>
<h3 id="intuition-2">Intuition 2</h3>
<p>neighborhood 가 <strong>computation graph</strong> 를 결정합니다. 
모든 node들은 자기 자신만의 Neural Network Architecture 를 갖고 있으며, 각자의 neighborhood에 근거하여 computation graph를 정의합니다.</p>
<p><img src="https://images.velog.io/images/jbeen2/post/58cdf2d7-d279-4418-ab68-d0de1c987607/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.52.14.png" alt=""></p>
<h3 id="neighborhood-aggregation">Neighborhood Aggregation</h3>
<p>Neighbors 로 부터 정보를 모아 Average 한 뒤, Neural Network 를 적용합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/37b08917-773a-4e1e-af51-6810aee59a8b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.56.53.png" alt=""></p>
<h2 id="models">Models</h2>
<h3 id="deep-layer-model">Deep Layer Model</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/14c0c84b-1357-4d9e-94d2-a3f409ec28d4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.10.03.png" alt=""> </p>
<p>Model의 depth는 자유롭게 설정할 수 있습니다. </p>
<ul>
<li>Node는 각 layer에서 embedding 값을 가지게 됩니다. </li>
<li>Layer-0에서의 node A의 embedding 은 $X_A$ 가 됩니다. </li>
<li>Layer-K에서의 embedding 은, Layer-0 에서 시작하여 Hidden Layer를 거쳐 K번 전달된 정보에 대한 값을 가지게 됩니다. </li>
</ul>
<h3 id="deep-encoder">Deep Encoder</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/4bc023fd-d5ed-4cc4-991a-c10c9bcf0314/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.02.02.png" alt="">
정보가 전달되어 embedding 값을 가지게 되는 과정을 수식적으로 표현하면 위와 같습니다. </p>
<ul>
<li><code>W</code> : Average of <strong>neighbor&#39;s</strong> previous layer embeddings </li>
<li><code>B</code> : Message <strong>myself</strong> from the previous layer </li>
</ul>
<h3 id="training-the-model">Training the Model</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/aa2f4ecc-8be0-48c4-9a46-35abf9b68758/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.39.25.png" alt=""></p>
<p>위의 식에서, Train의 대상은 Weight Matrix 인 <code>W</code> 와 <code>B</code> 입니다. 
<code>W</code> 와 <code>B</code> 비율을 통해, friend / own property 중 어디에 더욱 주목할 지 결정합니다. </p>
<ul>
<li><code>W</code> ↑ , <code>B</code> ↓ : Neighbor 정보 더욱 많이 고려</li>
<li><code>W</code> ↓ , <code>B</code> ↑ : 이전 레이어의 자신의 정보를 더욱 많이 고려 </li>
</ul>
<p>embedding 값은 어떠한 loss function에도 적용 가능하며, 
Stochastic Gradient Descent 를 통해 Weight를 update 합니다. </p>
<br>

<p><strong>Loss Function</strong>은 Task에 따라 달라집니다. </p>
<h4 id="1-unsupervised-training">1. Unsupervised Training</h4>
<p><img src="https://images.velog.io/images/jbeen2/post/c4d02874-d556-49b7-ad88-7146f4a5a0fe/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.50.21.png" alt=""></p>
<p><code>Task</code> : graph structure 를 고려한 node embedding</p>
<ul>
<li>node u 와 node v 가 similar 할 때, $y_{u,v} = 1$ 이 됩니다. </li>
<li>CE : Cross Entropy </li>
<li>DEC : Decoder (ex. inner product)</li>
<li>Loss Function : Random Walks, Graph Factorization, Node Proximity in the Graph </li>
</ul>
<h4 id="2-supervised-training">2. Supervised Training</h4>
<p><img src="https://images.velog.io/images/jbeen2/post/c3155e05-bb33-4cb0-a5f6-df5650dd5844/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.48.52.png" alt=""></p>
<p><code>Task</code> : node classification </p>
<ul>
<li>Cross Entropy Loss </li>
<li>$y_v$ : ground-truth label </li>
<li>Positive node 라면 $\sigma({z_v}^T\theta)$ 값이 커지고, Negative node 라면 $1 - \sigma({z_v}^T\theta)$ 값이 커지게 됩니다. </li>
</ul>
<h2 id="overview">Overview</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/c091b414-b93d-48dc-9258-ef2790db8f35/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.07.29.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/150a23b6-e508-4baa-8c66-7649c438eab1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.07.46.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/bf8c0624-a32a-4ab7-a804-d24dae23de91/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.08.02.png" alt=""></p>
<h3 id="parameter-sharing">Parameter Sharing</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/d243b891-5efe-4e32-99c5-d25cd4064388/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.13.42.png" alt=""></p>
<p>The <strong>same aggregation parameters</strong> are shared for all nodes
new nodes &amp; new graphs 에 대해서도, generalize 가능합니다. </p>
<h2 id="summary">Summary</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/7968034c-99c0-450a-8952-9288a966d2fd/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-05%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.59.09.png" alt=""></p>
<p><strong>Generate <code>node embeddings</code> by aggregating <code>neighborhood information</code></strong></p>
<h3 id="graph-neural-network">Graph Neural Network</h3>
<p>Layer에서 Neighborhood 와 자기 자신의 <code>message</code> 를 <code>Aggregate</code> 하여 <strong>embedding</strong> 을 만들고, 이를 전달하여 최종 target node의 embedding 을 만드는 것입니다. </p>
<br>

<h1 id="2-graph-convolutional-network-gcn">2. Graph Convolutional Network (GCN)</h1>
<h2 id="matrix-formulation">Matrix Formulation</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/bc1c792e-ce12-46d8-a61e-e40f59d61042/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%202.33.39.png" alt=""></p>
<p>k-1 hidden layer에서 information aggregation을 통해 k hidden layer 로 전달하는 <code>Neighborhood Aggregation</code> 식은 위와 같습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/1900d079-c8b6-40d1-b25a-d1b17fa7339a/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%202.37.06.png" alt=""></p>
<p>$A$ (인접행렬)은 node 연결 여부에 대한 정보(0/1)를 담고 있는 행렬입니다. 
따라서 $AH^{(l)}$ 는 node i 와 relationship이 있는 state 값만 더한 값으로 update 한다는 의미입니다.<br>여기에 $D^{-1}$을 곱해 row normalized matrix 를 만들어 냅니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/56560cc0-b4a6-4db5-80ac-6ebfa6bbe8c6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%202.53.14.png" alt=""></p>
<p>Neighborhood Aggregation 식을 <code>vector form</code> 으로 표현하면 위와 같습니다. </p>
<hr>
<h2 id="graph-convolutional-networks-1">Graph Convolutional Networks</h2>
<h3 id="idea">idea</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/ecf0f8d1-7c56-4202-aab0-b752c0c7122c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%203.16.50.png" alt=""></p>
<ol>
<li><p>neighborhood aggregate 에는 $W_k$ 를 사용하였고, previous self embedding 에는 $B_k$ 를 곱했는데 → GCN 에서는 neighbor 와 self 모두에 대해 <strong>동일한 parameter</strong> 인 $W_k$ 를 사용합니다. </p>
</li>
<li><p>인접행렬($A$)을 사용하게 되면 자기 자신으로의 연결을 고려하지 않게 되므로 → <strong>self-connection</strong>을 추가한 $\hat{A} = A + I_N$ 행렬을 사용합니다.</p>
</li>
<li><p>단순히 neighborhood 정보의 평균 ($D^{-1} A$)을 구하지 않고 → neighborhood aggregation 에 <strong>symmetric normalization</strong> ($D^{-1/2} A D^{1/2}$)을 적용하여 계산합니다.  </p>
</li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/d0b16889-5cea-4ad2-bbba-0343a214e789/gcn_web.png" alt=""></p>
<h3 id="fhl-a--sigma-hatd-frac12hatahatdfrac12hlwl">$f(H^{(l)}, A) = \sigma ({\hat{D}}^{-\frac{1}{2}}\hat{A}{\hat{D}}^{\frac{1}{2}}H^{(l)}W^{(l)})$</h3>
<ol>
<li>graph 에서 $\hat{A}$, $\hat{D}$ 를 얻습니다.</li>
<li>각 node에 연결된 edge 개수에 대해 normalization 을 진행합니다.</li>
<li>l번째 hidden state 인 $H^{(l)}$ 을 곱합니다. </li>
<li>학습 가능한 parameter $W^{(l)}$ 을 곱합니다. </li>
<li>activation function $\sigma$ 를 거쳐 비선형성을 학습합니다. </li>
</ol>
<p><code>Output</code> : 인접 노드들의 가중치 $\ast$ feature vector $\ast$ W의 합
즉, GCN은 특정 node의 representation으로, 해당 node에 연결되어 있는 node들을 가중합하는 방법입니다.</p>
<hr>
<h2 id="graphsage">GraphSAGE</h2>
<h3 id="idea-1">idea</h3>
<ol>
<li><strong><code>Concatenate</code></strong> neighbor embedding &amp; self embedding </li>
<li>다양한 <strong><code>Aggregation</code></strong> 방법론을 적용합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/b2ea8c89-323c-4562-b0dd-1d0f509bad73/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204.08.05.png" alt=""></p>
<ul>
<li><p>GCN : neighbor 과 self 의 message 를 더합니다. 
<img src="https://images.velog.io/images/jbeen2/post/36b2a081-99c5-44dd-9c69-80bd718cf688/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%203.56.35.png" alt="">
GraphSAGE : neighbor 과 self 의 message 를 concat 합니다. 
<img src="https://images.velog.io/images/jbeen2/post/00c167ca-3a86-47aa-b113-60d750719871/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%203.57.15.png" alt=""></p>
</li>
<li><p><code>Aggregation</code> 방법은 여러 가지가 있습니다. 
<img src="https://images.velog.io/images/jbeen2/post/a3401c3a-2aec-4908-82d2-139e4c3990d8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204.00.18.png" alt=""></p>
</li>
</ul>
<br>

<h1 id="3-graph-attention-network-gat">3. Graph Attention Network (GAT)</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/dee76953-e53e-4edc-ad44-2422f3cd72d3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204.18.46.png" alt=""></p>
<p>각 neighborhood node들의 중요도를 같다고 보지 않고 ($\neq \frac{1}{|N(v)|}$), <code>attention coefficients</code> $e_{vu}$ 를 적용해 neighborhood node 마다 가중치를 다르게 적용합니다. </p>
<h2 id="attention-mechanism-in-nlp">Attention Mechanism in NLP</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/4bc1a86e-f2ff-40b9-bd5f-2b72e6a78cef/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204.40.25.png" alt=""></p>
<p>출력 값을 예측할 때, encoder의 모든 입력 단어들의 정보(확률값)를 <strong>다시 한번 참고</strong>하여 손실했던 정보를 반영합니다. </p>
<ol>
<li>$e^t = [{s_t}^T h_1, {s_t}^T h_2, ... , {s_t}^T h_N]$
encoder 에서 나온 hidden state 에, 현재 시점 t에서의 decoder hidden state 값을 dot product 연산을 통해 구합니다. </li>
<li>$a^t = softmax(e^t)$
attention distribution 을 구합니다. </li>
<li>$a_t = \sum\limits_{i=1}^N a_i^t h_i$
encoder의 hidden state와 Attention Weights를 곱하고, Weighted Sum 합니다. </li>
<li>$v_t$ = concat($a_t$, $s_t$) 
attention value 와 decoder hidden state 값을 concat 한 후, 최종 layer 를 통과하여 output 을 계산합니다. </li>
</ol>
<h2 id="attention-mechanism-in-graph">Attention Mechanism in Graph</h2>
<h3 id="process">PROCESS</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/fa43b777-5f0e-4b83-b106-ae981d1223e3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.08.16.png" alt=""></p>
<p>$e_{vu}$ 를 통해서 노드 $u$에서 노드 $v$로 가는 <code>message importance</code> 를 계산합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/291690ad-968b-4025-8262-17c46b4bb1d3/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.09.14.png" alt=""></p>
<p>각 node 의 hidden state 값이 concat 되고, linear 를 거쳐 <code>attention coefficient</code> $e_{vu}$ 가 계산됩니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/f7c865ec-f91a-44a5-95dc-9121a1b76292/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.08.30.png" alt=""></p>
<p><code>softmax 함수</code> 를 거치고, 이를 통해 나온 값 $\alpha_{vu}$ 을 곱해 <code>가중합</code> 하여 $h_v^{(l)}$ 을 계산합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/93a49df9-a887-4152-a07c-a3e25e454b82/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.17.29.png" alt=""></p>
<p><code>Multi-head attention</code> 을 통해 값을 여러 개 도출하여, 이를 <code>aggregate</code> 해서 최종 output을 계산합니다. 
✔︎ Multi-head attention : 서로 다른 attention mechanism을 여러 번 계산하여, input을 여러 관점(head)에서 해석 </p>
<p><img src="https://images.velog.io/images/jbeen2/post/bfab31f3-0cd2-46c8-a966-f9efc6e94d66/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204.58.36.png" alt="">
Allows for (implicitly) specifying <strong><code>different importance values</code> to different neighbors</strong></p>
<h2 id="experiments">Experiments</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/7968dd8b-5538-4b0c-a091-21a52fc68b43/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.23.22.png" alt=""></p>
<p>MLP 보다는 Random Walk 가, 이보다는 GCN 과 GAT 가 훨씬 성능이 좋다고 합니다. </p>
<br>

<h1 id="4-application">4. Application</h1>
<h2 id="pinterest">Pinterest</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/c409e467-621d-4654-a8c3-92238b84bb17/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.25.32.png" alt=""></p>
<p>Graph 를 이용해서 더 나은 Recommendation 결과를 도출합니다. </p>
<h2 id="pinsage">PinSAGE</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/ae50efe9-1d2e-457b-8367-b979308c7a61/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.24.50.png" alt=""></p>
<p>visual 로만 구분하면, fence 와 bed 를 제대로 구분할 수 없게 됩니다.
따라서 <strong>Image</strong> 와 이를 한 곳에 모아 놓은 <strong>Pins</strong> 를 <strong>node</strong> 로 하여, <strong>bipartite graph</strong> 를 구축해 좀 더 나은 추천 결과를 도출합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/930a5181-c3cc-44a5-b044-2c4c9d40325d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.30.44.png" alt=""></p>
<p>node v image 를 embedding 하여, similar 한 node u 를 찾고, node u의 neighbor 를 추천해 줍니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/5ce27763-ec18-4c32-85a1-49365aa09855/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-06%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%205.35.25.png" alt=""></p>
<p>Graph 적용 시 훨씬 좋은 추천 결과를 보인다고 합니다. </p>
<br>

<h1 id="reference">Reference</h1>
<h3 id="reviews">Reviews</h3>
<ol>
<li>Tobigs Graph Study : <a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter8.">Chapter8. Graph Neural Networks</a></li>
<li>데이터 괴짜님 Review : <a href="https://data-weirdo.github.io/data/2020/09/30/data-graph-08.graph_nn/">CS224W - 08.Graph Neural Networks</a></li>
<li>snap-stanford Review : <a href="https://snap-stanford.github.io/cs224w-notes/machine-learning-with-networks/graph-neural-networks">Graph Neural Networks</a></li>
</ol>
<hr>
<h3 id="cs224-winter-2021">CS224 Winter 2021</h3>
<ol>
<li>Lecture 6. <a href="http://web.stanford.edu/class/cs224w/slides/06-GNN1.pdf">Graph Neural Networks - 1: GNN Model</a></li>
<li>Lecture 7. <a href="http://web.stanford.edu/class/cs224w/slides/07-GNN2.pdf">Graph Neural Networks - 2: Design Space</a></li>
</ol>
<hr>
<h3 id="gcn">GCN</h3>
<ol>
<li>Paper : <a href="https://arxiv.org/pdf/1609.02907.pdf">Semi-Supervised Classification with Graph Convolutional Networks</a></li>
<li>Review : <a href="https://tkipf.github.io/graph-convolutional-networks/">Graph Convolutional Networks</a></li>
<li>PyTorch Code : <a href="https://github.com/tkipf/pygcn">tkipf/pygcn</a></li>
<li>reference <a href="https://github.com/naganandy/graph-based-deep-learning-literature/blob/master/conference-publications/folders/publications_pre18/gcn_iclr17/README.md">links</a></li>
<li>GraphSAGE : <a href="https://papers.nips.cc/paper/2017/file/5dd9db5e033da9c6fb5ba83c7a7ebea9-Paper.pdf">Inductive Representation Learning on Large Graphs</a></li>
</ol>
<hr>
<h3 id="gat">GAT</h3>
<ol>
<li>Paper : <a href="https://arxiv.org/pdf/1710.10903.pdf">Graph Attention Networks</a></li>
<li>PyTorch Code : <a href="https://github.com/Diego999/pyGAT">Diego999/pyGAT</a></li>
<li>reference <a href="https://github.com/naganandy/graph-based-deep-learning-literature/blob/master/conference-publications/folders/publications_conf18/gan_iclr18/README.md">links</a></li>
</ol>
<hr>
<h3 id="etc">etc.</h3>
<ol>
<li><a href="https://brunch.co.kr/@chris-song/24">컨볼루션(Convolution) 이해하기</a></li>
<li>jihoon님 Review : <a href="http://www.secmem.org/blog/2019/08/17/gnn/">Graph Neural Network</a></li>
<li><a href="http://deeploria.gforge.inria.fr/thomasTalk.pdf">Deep Learning on Graphs with Graph Convolutional Networks</a></li>
<li><a href="https://math.stackexchange.com/questions/3035968/interpretation-of-symmetric-normalised-graph-adjacency-matrix">Interpretation of Symmetric Normalised Graph Adjacency Matrix?</a></li>
<li>lee-ganghee님 Review : <a href="https://ganghee-lee.tistory.com/27">GNN, GCN 개념정리</a></li>
<li>wikidocs : <a href="https://wikidocs.net/22893">어텐션 메커니즘 (Attention Mechanism)</a> </li>
<li>Yeongmin님 GCN Paper Review : <a href="https://baekyeongmin.github.io/paper-review/gcn-review/">Graph Convolutional Networks Review</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[7. Graph Representation Learning]]></title>
            <link>https://velog.io/@tobigs-gnn1213/7.-Graph-Representation-Learning</link>
            <guid>https://velog.io/@tobigs-gnn1213/7.-Graph-Representation-Learning</guid>
            <pubDate>Fri, 05 Mar 2021 11:14:25 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/minjung-s">신민정</a>
<br></p>
<blockquote>
<h1 id="contents">Contents</h1>
<ol start="0">
<li>Intro</li>
</ol>
</blockquote>
<ol>
<li>Embedding Nodes</li>
<li>Random Walk Approaches to Node Embeddings</li>
<li>Translating Embeddings for Modeling Multi-relation Data</li>
<li>Embedding Entire Graphs</li>
</ol>
<h1 id="0intro">0.Intro</h1>
<p>이번 강의는 graph domain에서의 representation learning에 대해 알아보겠습니다.</p>
<p><strong>representation learning</strong>이란, 어떤 task를 수행하기에 적절하게 데이터의 representation을 변형하는 방법을 학습하는 것입니다. 즉 어떤 task를 더 쉽게 수행할 수 있는 표현을 만드는 것입니다. Raw data에 많은 feature engineering과정을 거치지 않고 데이터의 구조를 학습하는 것으로, 딥러닝 아키텍처의 핵심요소라고 할 수 있습니다. 입력 데이터의 최적의 representation을 결정해주고 이 잠재된 representation을 찾는 것을 representation learning 또는 feature learning이라고 부릅니다.</p>
<p><img src="https://images.velog.io/images/minjung-s/post/2fdf2e9e-a895-41b9-96ab-d265900b0b7a/image.png" alt=""></p>
<p>grpah에서의 representation learning 역시 같은 의미입니다.
graph의 node $u$를 mapping function $f$를 통해 Latent space(=embedding space)로 embedding할 수 있습니다. graph의 feature representation(=embedding)을 통해 다양한 task를 효과적으로 수행할 수 있습니다. 이때 효과적인 representation이란, task에 specific하지 않고 다양한 task에도 적용할 수 있는 representation을 의미합니다.
<br>
<br>
<strong>그렇다면 왜 graph를 Embedding해야 할까요??</strong>
<img src="https://images.velog.io/images/minjung-s/post/680005c6-e219-4f72-8fd4-4b70b2dca1a9/image.png" alt="">
graph의 인접행렬(Adjacency Matrix)는 각 column이 node를 의미하기 때문에 sparse하고 크기 매우 큽니다. 인접행렬을 그대로 다루기에는 computation 측면에서 문제가 있습니다. 그렇기 때문에 grpah의 각 node를 low-dimension으로 mapping할 필요가 있습니다. Adjacency Matrix의 dimension보다 dimension이 낮은 <strong>Latent Dimension</strong>으로 embedding하여 computation의 효과를 얻을 수 있습니다. 각 node를 embedding하는 것이기 때문에 <strong>node별 representation이 가능</strong>합니다. 
단, 각 column이 node를 나타내는 adjacency matirx와는 다르게, latent demension에서 나타낼 수 있는 embedding matrix의 column은 각 node를 나타내지는 않습니다. latent demension의 축들은 node가 아닌 node간의 상관관계와 같은 graph의 정보를 의미하는 feature가 됩니다. 즉, <strong>Adjacency matrix의 그래프 정보를 Latent Dimension으로 encoding하고, node representation을 만들어내는 것입니다. **
graph의 정보를 담았기 때문에,</strong> latent space상에서 나타내지는 node간의 similarity은 실제 graph에서의 node간의 similarty라고 볼 수 있습니다. **
<img src="https://images.velog.io/images/minjung-s/post/a9b80277-7ae6-4872-a845-bb577404900f/image.png" alt="">
위 그림은 grpah를 2D latent space로 embedding한 예시입니다. 앞서 말씀드린것 처럼 각 node를 latent space에 mapping할 수 있고, latent space의 축은 node를 의미하는 것이 아닌 그래프의 정보를 담고있다고 이해할 수 있습니다.
<br>
<br>
*<em>그렇다면 기존 Deep Learning에서 사용하는 network들로 embedding을 할 수 있을까요?? *</em>
결론부터 말씀드리자면 사용할 수 없습니다.
CNN은 고정된 크기의 이미지나 그리드에 적용할 수 있고, RNN이나 Word2Vec은 텍스트나 시퀀스 데이터에 적용됩니다.
하지만, graph는 이러한 데이터들보다 훨씬 복잡합니다. 이미지나 그리드처럼 특정 차원에 표현될 수 없고, 가끔 차원이 변동되고 multi-modal feature를 갖기도 합니다. 따라서 graph를 embedding하기 위해서는 graph만의 방식을 적용합니다.
<br>
<br></p>
<h1 id="2-embedding-nodes">2. Embedding Nodes</h1>
<p>이제 graph의 node들을 embedding하는 방법에 대해 알아보겠습니다.</p>
<ul>
<li>graph $G$</li>
<li>vertex set $V$</li>
<li>adjacency matrix $A$ (assume binary)</li>
</ul>
<p>node feature나 그 외 정보들은 사용되지 않습니다. <em>(이하 Encoding은 Embedding과 같은 의미입니다.)</em>
<img src="https://images.velog.io/images/minjung-s/post/f436eb8f-89d0-45a8-a377-000331433112/image.png" alt="">
encoding의 목적은 <span style = "color:red"><strong>embedding space상에서의 similarity와 원본 graph의 similarity최대한 동일하게 만드는 것</strong></span>입니다.
<strong>embedding space상의 두 vector의 similarity는 dot product $z_v^Tz_u$</strong>로 측정할 수 있습니다.</p>
<blockquote>
<p>The dot product is proportional to both the cosine and the lengths of vectors. </p>
</blockquote>
<p>과정은 다음과 같습니다.
1). <strong>Define <code>encoder</code></strong> -&gt; 각 node를 low-dimentional vecotr로 mapping(embedding)하는 방법 정의 
$z_{node} = ENC(node)$
2). <strong>Define a node <code>similarity function</code></strong> -&gt; 원본 graph의 node간 유사도를 측정하는 함수를 정의 
$similarity(u,v)$
3). <strong>Optimize the parameters of the encoder so that 
$similarity(u,v) \approx z_v^Tz_u$</strong></p>
<h2 id="1-encoder">1) Encoder</h2>
<h3 id="shallow-encoding">Shallow Encoding</h3>
<p><strong><code>shallow encoder</code></strong> :encoding is just an embedding-lookup
$ENC(v)=Zv$
<img src="https://images.velog.io/images/minjung-s/post/1638265c-4a76-4359-81bf-ac8e05c3aec7/image.png" alt=""></p>
<ul>
<li>$Z\in \mathbb{R}^{d\times|V|}$ : matrix. 각 column이 node embedding</li>
<li>$v\in \mathbb{I}^{|V|}$ : indicator vector. node $v$를 지정하는 column과 만나는 element는 1, 그 외에는 0인 vector</li>
</ul>
<p>$similarity(u,v) \approx z_v^Tz_u$을 optimize하며 $Z$를 학습시킵니다. shallow encoding으로 각 node를 개별적으로 representation할 수 있습니다. </p>
<p>shallow encoding 외에도 <strong><code>DeepWalk</code></strong>,** <code>node2vec</code><strong>,</strong><code>TransE</code>**등으로 Embedding할 수 있습니다.</p>
<p>다음 파트 _2. Random Walk Approaches to Node Embeddings_에서 상세히 다루겠습니다.</p>
<h2 id="2-similarity-function">2) Similarity Function</h2>
<p><img src="https://images.velog.io/images/minjung-s/post/413ba596-33b9-46b9-859b-d1eb6eb2d34e/image.png" alt="">
node similarity를 어떤기준으로 정의할지 결정해야 합니다. 예시는 다음과 같습니다. </p>
<ul>
<li>두 노드의 연결관계</li>
<li>공유하는 node(neighbor)</li>
<li>structural role의 유사성</li>
<li>등등</li>
</ul>
<p>이 역시 encoding방법에 따른 similarity fucntion을 _2. Random Walk Approaches to Node Embeddings_에서 자세히 설명드리겠습니다.</p>
<br>

<p><strong>3) Optimization</strong>도 <em>2. Random Walk Approaches to Node Embeddings</em> 에서 자세히 설명드리겠습니다. <em>강의 순서가 뒤죽박죽하군요</em></p>
<h1 id="2-random-walk-approaches-to-node-embeddings">2. Random Walk Approaches to Node Embeddings</h1>
<p>_paper refenece : 
Perozzi et al.2014 :<a href="https://arxiv.org/abs/1403.6652">DeepWalk: Online Learning of Social Representations</a>
Grover et al.2016 : <a href="https://arxiv.org/abs/1607.00653">node2vec: Scalable Feature Learning for Networks</a>
_</p>
<p>paper reference에서 알 수 있듯, <strong><code>DeepWalk</code></strong>, <strong><code>node2vec</code></strong>에 관련된 node embedding방법을 상세하게 다뤄보겠습니다.</p>
<h2 id="random-walk">Random Walk</h2>
<p><strong><code>Random Walk</code></strong>란, 말 그대로 node 위를 random하게 걸어다니는 것을 말합니다. 그래프의 특정한 시작점에서 random하게 neighbor들을 선택해서 나가는데, 그 point의 sequnce를 random walk라고 합니다. 걸어간 발자취를 나열한 것이라고 생각할 수 있습니다.
<img src="https://images.velog.io/images/minjung-s/post/1f1869da-841e-47d3-9273-42642e80d028/image.png" alt="">
예를 들어, 위의 그림에서 노란색 point가 시작점으로 주어지고 4걸음을 간다는 parameter가 주어진다면 [1,3,2,8,11]이 random walk가 될 수 있습니다. 3걸음을 간다고하면 [5,8,11,12]가 될 수 있습니다. 
이러한 random walk는 parameter를 주고 <strong>sampling</strong>한다고 표현합니다.
<br>
<br></p>
<h3 id="random-walk-embedding-deep-walk">Random-walk Embedding (Deep Walk)</h3>
<blockquote>
<p><strong>$z_u^Tz_v \approx$ probability that $u$ and $v$ co-occur on a random walk over the network</strong></p>
</blockquote>
<p><strong>$z_u^Tz_v$를 &quot;network 전체의 random walk에서 $u$와 $v$가 함께 발생할 확률&quot;로 근사</strong>할 수 있습니다. 왜냐하면 $z_u$와 $z_v$의 similarity가 높다면 latent space상에 가깝게 위치할 것이고, 이는 node $u$와 $v$의 similarity가 높다는 의미이므로 random walk에서 동시에 발견될 확률이 높기 때문입니다.
<br>
Random-walk Embedding의 과정은 다음과 같습니다.</p>
<ul>
<li>1.어떤 random walk strategy R을 사용하여 <strong>node u에서 출발하여 node v에 방문할 확률 $P_R(v|u)$ 을 추정</strong>합니다.
<img src="https://images.velog.io/images/minjung-s/post/97958f18-8315-4d78-824f-bda877abd200/image.png" alt=""></li>
<li><ol start="2">
<li>이 <strong>$P_R(v|u)$를 encoding하기 위해 embedding을 최적화</strong>시킵니다.
여기서 두 $z$의 similarity인 dot product는 $cos(\theta)$과 같고, 이는 random walk similarity로 볼 수 있습니다.
<img src="https://images.velog.io/images/minjung-s/post/6271961f-f1a4-4d6e-8616-26d13aa1d3f3/image.png" alt=""><br>
<br></li>
</ol>
</li>
<li>*<span style = "color:red">그렇다면 왜 Random Walks를 사용할까요??</span>**</li>
<li><strong>Expressivity</strong> : Local과 Higher-order neighborhood 정보를 함께 고려하는 node similarity를 유동적으로 정의내릴 수 있습니다. 
_한국어로 풀어쓰니까 의미전달이 직관적이지 않네요... 강의자료에는 &quot;Flexible stochastic definition of node similarity that incorporates both local and higher-order neightborhood information&quot;라고 명시되어있습니다. _</li>
<li><strong>Efficiency</strong> : 학습할 때, 모든 node쌍을 고려할 필요 없이, 오직 random walk에 함께 발견될 쌍들만을 고려하면 됩니다. 
이는 그래프의 크기가 클수록 더 두드러지는 장점입니다. (ex. real social graph)<br>
<br>
### Random Walk Optimization
다시 graph domain에서의 **Unsupervised Feature Learning**의 의미를 생각해봅십다.
목표는 유사성을 보존하는 d-dimension의 latent space에서의 node embedding을 찾는 것이었습니다. 실제 graph에서 가깝다면 latent space상에서도 가깝도록 embedding해야 합니다. 
그렇다면 **node $u$가 주어질 때, node의 주변, neighbor를 어떻게 정의**할 수 있을까요? 다음과 같이 정의됩니다.

</li>
</ul>
<blockquote>
<p>$N_R(u)$ : random walk strategy $R$로부터 얻을 수 있는 $u$의 neighborhood</p>
</blockquote>
<p>graph $G=(V,E)$가 있을 때, feature learning의 목표는 <strong>mapping function $z:u \rightarrow \mathbb{R}^d$를 학습</strong>하는 것입니다. 이때 <strong>Objective function</strong>은 다음과 같습니다.</p>
<blockquote>
<p><strong>Log-likelihood objective</strong>
$max_z \sum_{u \in V}^{}{logP(N_R(u)|z_u)}$
Given node $u$, we want to learn feature representations that are predictive of the
nodes in its neighborhood $N_R(u)$</p>
</blockquote>
<p>node의 neighborhood를 예측하는 방향으로 feature representation을 학습합니다.
<br></p>
<p>Random Walk의 Optimization 과정을 정리해보겠습니다.</p>
<h4 id="random-walk-optimization">Random Walk Optimization</h4>
<ul>
<li><ol>
<li>graph의 각 node에서 정해진 짧은 길이만큼의 random walk를 수행합니다 
(using some strategy $R$)</li>
</ol>
</li>
<li><ol start="2">
<li>각 node의 neighborhood $N_R(u)$를 수집합니다. 
($N_R(u)$ : the multiset of nodes visited on random walks starting from $u$)</li>
</ol>
</li>
<li><ol start="3">
<li>node $u$가 주어질 때, 그 node의 neighborhood $N_R(u)$를 잘 예측하는 방향으로 node를 embedding합니다.
$max_z \sum_{u \in V}^{}{logP(N_R(u)|z_u)}$</li>
</ol>
</li>
</ul>
<blockquote>
<p><strong>loss function</strong>
$L = \sum_{u \in V}\sum_{v \in N_R(u)}-log(P(v|z_u)$</p>
</blockquote>
<p><strong><span style = "color:#1E90FF">intuition</span></strong> Random walk가 동시에 발생(co-occurrrence)할 likelihood를 maximize할 수 있도록 embedding을 최적화
이때 $p(v|z_u)$는 vector representation이 <strong>softmax를</strong> 거친 후의 값입니다.
$P(v|z_u) = {{exp(z_u^Tz_v)}\over{\sum_{u \in V}exp(z_u^Tz_v)}}$
<em>softmax를 사용하는 이유는 node $u$와 가장 유사도가 높은 node $v$를 얻기 위함입니다.
$\sum_iexp(x_i) \approx max_iexp(x_i)$</em></p>
<p><img src="https://images.velog.io/images/minjung-s/post/6f8125a3-e548-4515-8882-ea5f7c0f0338/image.png" alt=""><strong>Optimizing random walk embeddings =
Finding embeddings $z_u$ that minimize $L$</strong>
정리하면 위와 같습니다. grpah의 모든 node에 대해, 각 node의 neighborhood가 random walk시에 동시에 발견될 확률을 높도록 embedding을 학습합니다.</p>
<p><strong><span style="color:red">하지만, 이 naive한 과정은 compuation 측면에서 매우 expensive하다는 단점이 있습니다.</span></strong>
<img src="https://images.velog.io/images/minjung-s/post/5c7dc004-f4f2-40d5-a657-0cd06b82c4f4/image.png" alt="">
softmax의 normalization term $\sum_{u \in V}exp(z_u^Tz_v)$이 원인입니다. log안에 있는 ${exp(z_u^Tz_v)}\over{\sum_{u \in V}exp(z_u^Tz_v)}$부분을 근사하여 이 문제를 해결합니다. 이때 <strong>Negative Sampling</strong>이 사용됩니다.</p>
<h4 id="negative-sampling">Negative Sampling</h4>
<p>위에서 설명한 loss fuction의 log안의 함수를 다음과 같이 근사합니다.
<img src="https://images.velog.io/images/minjung-s/post/1f52e372-0cd4-4e7d-a7c4-4543d94812c5/image.png" alt="">
모든 node를 고려하여 normalize한 기존의 loss는 expensive했기 때문에, random으로 Negative sampling한 k개의 <strong>negative samples $n_i$</strong>에 대해서만 normalize합니다. w2v에서 전체 corpus에서 빈도가 높은 단어를 negative sample로 sampling하였듯이, <strong>node의 degree가 높은 node를 negative sample로 사용합니다.</strong></p>
<p>negative sample의 개수 $k$가 갖는 의미는 다음과 같습니다.</p>
<ul>
<li>Higher $k$ gives more robust estimates</li>
<li>Higher $k$ correspond to higher bias on negative events </li>
</ul>
<p>실제로는 $k$는 5~20으로 설정합니다.
<br><br>
지금까지 randome walk로 node를 embedding하는 방법에 대해 알아보았습니다. 
random walk는 지정한 시작점에서 고정된 길이 &quot;<strong>fixed size</strong>&quot;를 조건으로 시행됩니다. 하지만 이러한 조건때문에 한계가 있습니다. 
만약, 두 노드의 structural role이 비슷하지만 멀리 떨어져있는 경우라면 어떨까요?? 실제로 두 node는 유사하지만, <strong>random walk는 고정된 사이즈로만 노드주변을 보기 때문에 random walk embdding방식으로는 이 유사성을 담지 못할것입니다.</strong> 이러한 경우 node의 similarity를 담도록 latent space에 embedding한다&quot;라는 node embedding의 가장 큰 목적에 맞지 않습니다. 또한 random하게 보기 때문에, <strong>graph의 전체 structure를 고려하지 못한다는 단점</strong>도 있습니다.
<br><br>
이 단점을 보완한 <strong>node2vec</strong>에 대해 알아보겠습니다.</p>
<h2 id="node2vec">node2vec</h2>
<p><strong><code>Deep Walk</code></strong>의 단점을 보완한 <strong><code>node2vec</code></strong>에 대해 알아보겠습니다.
이 역시 graph의 node를 embedding하는 방식이기 때문에, node2vec의 목표는 다양한 task에 적용가능하도록 (downstream task에 상관없이) graph에서 node의 neighborhood간의 유사성을 latent space (feature space)상에서도 유지하는 것입니다. node2vec은 maximum likellihood optimization문제로 접근합니다. </p>
<blockquote>
<p><strong>Abstract</strong>
네트워크의 node와 edge에 대해서 prediction task를 수행하는 것은 feature engineering 측면에서 많은 노력이 소요된다. 최근의 연구들에서는 reprsentation learning 측면에서 feature 자체를 학습하여 이 측면에서 많은 혁신들이 있었으나, network에서 파악되는 connectivity pattern에 대해서는 제대로 학습하지 못한다는 한계를 가지고 있다. 따라서, 이를 해결하기 위해서 network의 이러한 feature를 학습할 수 있는 프레임워크인 node2vec을 제시하였다. <strong>node2vec에서는 network의 node들의 관계(neighborhood)를 우도(likelihood)를 최대화할 수 있는 low-dimensional(저차원) 피쳐 공간을 학습시켰다</strong>. 실제로 기존의 존재하는 데이터들을 대상으로 수행을 해봤는데 괜찮은 결과가 나왔다.</p>
</blockquote>
<blockquote>
<p>** Recap : word2vec**
<em>여기에서 제가 제일 word2vec을 모르겠지만 감히 설명해볼게염...</em></p>
</blockquote>
<ul>
<li>skipgram : 중심단어(center word)로 주변단어(context word)를 예측
<img src="https://images.velog.io/images/minjung-s/post/07375f5e-b88c-4264-8106-b9d57a6acb52/image.png" alt="">
가정 : 실제 문장들에서 비슷한 위치에 있는 word들은 embedding space에서도 비슷한 위치에 있을것이다.
따라서 중심단어(c)가 주어졌을 때 주변단어(o)가 나타날 확률(아래식)을 최대화 하면 됩니다.
$P(o|c)= {{exp(u_o^Tv_c}\over{\sum_{w=1}{W}exp(u_w^Tv_c)}}$
graph에서는 특정 node가 주어졌을 때 그 node의 neighborhood가 나타날 확률을 최대화 하면 되겠네요!</li>
</ul>
<p>random하게 neighbor를 보아서 graph 전체 structure를 고려하지 못한 Deep Walk의 단점을 개선하기 위해, node2vec에서는 기존의 randomwalk를 사용하지 않습니다.</p>
<p><strong>node2vec key idea</strong>
use flexible, biased random walk that can trade off between <strong><span style="color:red">local</span></strong> and <strong><span style="color:blue">global</span></strong> views of the network<img src="https://images.velog.io/images/minjung-s/post/8a6889fb-1860-4538-a5d9-6d5f0ccbd558/image.png" alt=""></p>
<p>특정 node $u$의 neighborhood$N_R(u)$는 DFP와 BFS로 정의할 수 있습니다.</p>
<ul>
<li><strong><span style="color:red">$N_{BFS}(u)$ : </span></strong> <strong><span style="color:red">local</span></strong> 영역으로 neighborhood 지정 (microscopic view)
(위 그림 예시: if size of $N_{R}(u)$ = 3 $\rightarrow$ $N_{BFS}(u)={s_1,s_2,s_3}$)</li>
<li><strong><span style="color:blue">$N_{DFS}(u)$ : </span></strong> <strong><span style="color:blue">Global</span></strong> 영역으로 neighborhood 지정 (macroscopic view)
(위 그림 예시: if size of $N_{R}(u)$ = 3 $\rightarrow$ $N_{DFS}(u)={s_4,s_5,s_6}$)</li>
</ul>
<p>node2vec에서는 <strong><code>Biased 2nd-order random walk</code></strong>를 사용합니다.</p>
<ul>
<li>1st-order random walk : node to node </li>
<li>2nd-order random walk : edge to edge</li>
</ul>
<p>biased fixed-length random walk는 두가지 parameter를 정의해야 합니다.</p>
<ul>
<li><strong>return parameter</strong> $p$ : 이전 node로 돌아갈 가능성을 계산하는 parameter. 주변을 잘 탐색하는지 
$p$가 낮을수록 <strong><span style="color:red">BFS</span></strong> like walk (좁은 지역 고려)</li>
<li><strong>in-out parameter</strong> $q$ : DFS와 BFS의 비율. random walk가 얼마나 새로운 곳을 잘 탐색하는지
$q$가 낮을수록 <strong><span style="color:blue">DFS</span></strong> like walk (넓은 지역 고려)</li>
</ul>
<blockquote>
<p><em><strong>example</strong></em><img src="https://images.velog.io/images/minjung-s/post/bb9b44f9-4707-4303-bca1-f6330974094c/image.png" alt="">
$(s_1,w)$의 경로로 이동하여 지금 $w$인 상태
node $w$의 neighborhood로 $s_1,s_2,s_3$만 가능합니다.
$s_2$는 $s_1$과 $w$의 공통 이웃,
$s_3,s_4$는 $s_1$으로부터 멀어지는 방향입니다.
<img src="https://images.velog.io/images/minjung-s/post/be913b79-4256-47cd-bcf2-7a96f4ee057b/image.png" alt="">
$p$가 낮을 수록 좁은 지역을 보고 $q$가 낮을수록 넓은 지역을 봅니다.</p>
</blockquote>
<h3 id="node2vec-algorithm">node2vec algorithm</h3>
<ol>
<li>예시와 같이 random walk probability를 계산합니다.</li>
<li>grpah의 각 node $u$에 대해 길이 $l$만큼의 random walk를 합니다.</li>
<li>node2vec을 SGD로 최적화합니다.</li>
</ol>
<p>node embedding의 대표적인 두가지 방법 <strong><code>Deep Walk</code></strong>와 <strong><code>node2vec</code></strong>을 배워보았습니다. 이러한 embedding을 통해 graph의 정보를 최대한 보존하면서 computation 효과를 볼 수 있었습니다.
graph의 node $u_i$들을 latent space로 임베딩한 embedding vector $z_i$들은 어디에 사용될 수 있을까요?? 
기존 머신러닝에서 데이터를 임베딩(ex. 차원축소)하여 clustering, classification을 할 수 있듯 graph domain에서도 많은 task를 수행할 수 있습니다.</p>
<ul>
<li>Clustering / Community Detection</li>
<li>Node classification</li>
<li>Link prediction</li>
<li>etc</li>
</ul>
<h1 id="3-translating-embedding-for-modeling-multi-relational-data">3. Translating Embedding for Modeling Multi-relational Data</h1>
<p>이제 <strong><code>Knowledge Graph(KG)</code></strong>의 node들을 embedding할 수 있는 <strong><code>TransE</code></strong>에 대해 배워보겠습니다.</p>
<h2 id="knowledge-graph">Knowledge Graph</h2>
<p>knowledge graph에서는 node를 <strong>entitie</strong>, link <strong>relation이라고</strong> 합니다. 한 KG의 relation에는 많은 종류가 있을 수 있습니다. KG에서의 link는 종류마다 갖는 의미가 다 다릅니다.
<img src="https://images.velog.io/images/minjung-s/post/2286bb19-e6bb-4d9e-ac6a-eba80f37cc46/image.png" alt=""></p>
<blockquote>
<p>The knowledge graph represents a collection of *<em>interlinked descriptions of entities *</em>– objects, events or concepts. Knowledge graphs put data in context via linking and semantic metadata and this way provide a framework for data integration, unification, analytics and sharing.</p>
</blockquote>
<p><img src="https://images.velog.io/images/minjung-s/post/cf7beab6-a7d6-4a13-8053-3e2725d2acc6/image.png" alt="">
KG의 이어지지 않은 entitie(node)의 relation(link)를 예측하는 KG completion (=link prediction)에 대한 연구가 활발합니다.
<strong><span style = "color:#1E90FF">intuition</span></strong>  : KG의 local&amp;global pattern을 잘 학습하는 link prediction model을 만들고자합니다.
downstream task : link prediction은 학습된 패턴을 사용하여 관심 node와 그 외 모든 node간의 relationship을 일반화함으로써 수행됩니다.</p>
<h2 id="transe">TransE</h2>
<blockquote>
<p><strong>Abstract</strong>
지금 우리가 해결할 문제는 구성요소와 관계들을 저차원의 벡터 공간으로 임베딩 시키는 것이고, 무엇보다 지식 그래프의 기반이 되고 학습하기 쉬운 장점을 가지는 것을 목표로 한다. 이에 TransE 라는 모델을 제시하는데 이 모델은 relationship(관계)를 저차원의 임베딩된 구성요소간 translations(전환) 으로 해석한다는 것이 핵심이다.</p>
</blockquote>
<p>knowledge graph를 embedding하는 <strong><code>TransE</code></strong>에서는 KG의 두 node(entity)의 관계를 triplet으로 표현합니다. 
<strong><em><code>h (head entity), l (relation), t (tail entity) → (h,l,t)</code></em></strong>
<img src="https://images.velog.io/images/minjung-s/post/72b51043-ab37-4b0c-9f34-23347f359d73/image.png" alt="">
먼저 Entitie(node)들을 <strong>entitiy space $R^k$</strong>에 embedding하고, 각 Entitie $e$을 mapping function $M_r$을 통해 relation space로 mapping합니다.
TransE model을 통해 KG의 relation이 embedding space상에서 의미를 갖도록 합니다.
이때 핵심은 $(h,l,t)$가 성립한다면, $h + l\approx t$가 성립한다는 점입니다.
즉 embedding된 tail entity $t$는 임베딩 된 head entity $h$와 realtionship 과 관련된 벡터 $l$과의 합과 가까이 위치한다는 의미입니다.</p>
<ul>
<li>$h,t \in E$(set of entities), $l \in L$(set of relationships)</li>
<li>임베딩 벡터의 차원 : $\mathbb{R}^k$(k : hyperparameter)</li>
<li>energy of triplet : $d(h+l,t)$ ($d$:dissimilarity measure,주로 $L_1,L_2-norm$</li>
<li>marginary hyperparameter : $\gamma$
$\mathcal{L}=\sum_{(h,l,t) \in S}\sum_{(h&#39;,l,t&#39;) \in S&#39;<em>{(h,l,t)}} [\gamma _ d(h+l,t)-d(h&#39;+l,t&#39;)]$
$S&#39;</em>{(h,l,t)}= { (h&#39;,l,t)|h&#39;\in E } \cup { (h,l,t&#39;)|t&#39;\in E }$</li>
</ul>
<p>$S&#39;<em>{(h,l,t)}$은 corrupted triplet입니다. 이때 corrupted는 노이즈가 추가된 상태라는 의미입니다. 위 수식에서 알 수 있듯이 head entity나 tail entity에 변화가 있는 상태입니다. $S&#39;</em>{(h,l,t)}$는 실제 KG에는 없는 triplet입니다.
loss $\mathcal{L}$를 mimimize하므로, training triplet $(h,l,t)$의 energy(dissimilariy)는 작게하고 corrupted traiplet$(h&#39;,l,t&#39;)$의 energy(dissimilarity)는 크도록 학습한다는 의미입니다.</p>
<ol>
<li>먼저 Entitie(node)들을 <strong>entitiy space $R^k$</strong>에 embedding합니다.</li>
<li>각 Entitie $e$을 mapping function $M_r$을 통해 relation space로 mapping합니다.</li>
<li>각 Relation(link)들은</li>
</ol>
<p>학습 과정은 다음과 같습니다.<img src="https://images.velog.io/images/minjung-s/post/8f29c2fe-f157-47f4-9f1e-2336e7cd6f75/image.png" alt=""></p>
<p>1) relation set의 $l$에 대해 uniform distribution을 따르게 하고 정규화를 시킵니다.
2) entitiy set의 $e$에 대해 uniform distribution을 따르게 하고 정규화를 시킵니다.
3) triaining triplet set $S$에서 batch size만큼의 triplet을 뽑아 $S_{batch}$를 구성하고, $T_{batch}$를 공집합으로 초기화합니다.
4) $S_batch$에 대한 corrupted triplet을 만들어 $T_batch$에 원소로 넣어줍니다.
5) 구성된 $S_{batch}$와 $T_{batch}$로 loss를 mimize하는 방향으로 임베딩을 업데이트합니다.
6) 2)~5)를 반복합니다.</p>
<p><strong><code>TransE</code></strong>는 KG에서 entities간의 관계를 잘 반영하고 기존 SE model보다 최적화가 간단합니다. 2-way interactions를 표현하는데 있어 강점이 있지만, 3-way dependencies를 표현하는데는 약점을 가집다. 또한 1-to-1 이상의 , 1-to-N, N-to-1 관계를 포함하는데 TransE는 부적합할 수 있습니다.
<br></p>
<h1 id="4-embedding-entire-graphs">4. Embedding Entire Graphs</h1>
<p>이전까지는 node를 embedding하는 방법을 배웠습니다. 
이번 파트에서는 Graph $G$를 embedding하는 방법을 배워보겠습니다.
전체 graph 뿐만 아니라 전체 graph의 sub-graph를 한 point를 embedding할 수 있습니다. 
<img src="https://images.velog.io/images/minjung-s/post/8908cb84-1686-42cd-85b2-7ae0e65f34d3/image.png" alt="">
 (sub)graph embedding을 통해 &quot;Toxic molecules, non-toxic molecules 분류&quot;, &quot;anomalous graph 분류&quot;등을 할 수 있습니다.</p>
<p> 다음으로 (sub)grpah를 embedding하는 몇가지 approach를 알아보겠습니다.</p>
<blockquote>
<p><strong>Approach 1</strong>
(sub)graph $G$의 각 node를 embedding하고(ex.Deep Walk, node2vec...) 그 embedding값을 모두 더하거나 평균을 내어 graph embedding을 할 수 있습니다.
sum : $z_g= \sum_{v \in G}z_v$
avg : $z_g= {{1}\over{# ; of; node}}\sum_{v \in G}z_v$</p>
</blockquote>
<blockquote>
<p><strong>Approach 2</strong>
(sub)graph를 대표하는 <strong>virtual node (super-node)</strong>를 만들고, 그 node를 embedding값을 (sub)graph의  embedding으로 사용할 수 있습니다.
<img src="https://images.velog.io/images/minjung-s/post/a7f3fd76-291f-40c1-95fa-66821083db72/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><strong>Approach 3 : Anonymous Walks Embeddings</strong>
<img src="https://images.velog.io/images/minjung-s/post/4e328983-e8ec-4447-9393-fa991c367ab8/image.png" alt="">
<strong>Anonymous Walk</strong>는 random walk를 하는데 어느 node를 지나왔느냐가 아닌, 지나온 순서를 고려하는 random walk입니다. random walk를 진행하고 그 발자취의 순서(index)를 Anonymous Walk라고 합니다.
Anonymous Walk의 결과로 embedding하는 것을 Anonymous Walks Embeddings이라고 합니다.</p>
</blockquote>
<h1 id="reference">Reference</h1>
<ul>
<li><a href="http://snap.stanford.edu/class/cs224w-2019/slides/07-noderepr.pdf">CS244W fall 2019 : Machine Learning with Graphs의 7강 &quot;Graph Representation Learning&quot;</a></li>
<li>데이터 괴짜님 <a href="https://data-weirdo.github.io/data/2020/09/28/data-graph-07.graph_representation_learning/">CS224W - 07.Graph Representation Learning</a></li>
<li>frhyme님 <a href="https://frhyme.github.io/machine-learning/node2vec/">node2vec은 무엇인가?</a></li>
<li>Sukwon Tun님 <a href="https://sukwonyun.github.io/%EC%A7%80%EC%8B%9D%EA%B7%B8%EB%9E%98%ED%94%84/TransE/">[지식그래프] (TransE) Translating Embeddings for Modeling Multi-relational Data</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[6. Message Passing and Node Classification]]></title>
            <link>https://velog.io/@tobigs-gnn1213/6.-Message-Passing-and-Node-Classification</link>
            <guid>https://velog.io/@tobigs-gnn1213/6.-Message-Passing-and-Node-Classification</guid>
            <pubDate>Fri, 26 Feb 2021 12:00:14 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/jbeen2">이재빈</a></p>
<blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
</ol>
</blockquote>
<ol>
<li>Relational Classification</li>
<li>Iterative Classification</li>
<li>Belief Propagation </li>
</ol>
<hr>
<p><strong>Keyword</strong> : <code>Machine Learning applied on Graph</code>, <code>Node Classification</code></p>
<h1 id="0-intro">0. Intro</h1>
<h2 id="main-question">Main Question</h2>
<p>Network에서 몇 개의 node에만 label이 달려 있고, 몇 개는 모른다면, 
<strong>모르는 node의 label</strong>을 어떻게 설정해 줄 수 있을까요?</p>
<p><img src="https://images.velog.io/images/jbeen2/post/7f71029f-16d9-47bd-bbf6-0d6a65194f8b/94362119-14727e00-00f4-11eb-941d-5be3b67d6259.png" alt=""></p>
<p><strong>주어진 label을 이용</strong>하여, <strong>unlabeled node를 예측</strong>합니다! 
이와 같은 방법론을 <strong><code>semi-supervised node classification</code></strong> 이라고 합니다. </p>
<h3 id="semi-supervised-learning">semi-supervised learning</h3>
<ul>
<li><code>supervised learning</code> 
관측치마다 정답 label이 달려 있는 데이터셋을 이용하여 학습 
ex. Regression, Classification, Neural Network, ...</li>
<li><code>unsupervised learning</code> 
정답 label이 달려 있지 않은 데이터셋을 이용하여, 모델 스스로 학습 
ex. Clustering </li>
<li><code>semi-supervised learning</code><br>label이 달려있는 데이터와 label이 달려있지 않은 데이터를 동시에 학습해서, 더 좋은 모델을 만드는 것 
데이터가 군집의 형태를 따르고 있다면, 학습에 도움이 될 것 </li>
</ul>
<p><img src="https://images.velog.io/images/jbeen2/post/1f8cf631-6d1b-425a-b571-75d2509f40fa/mAMdPAC.png" alt=""></p>
<p>Network를 구성하고 있는 node 끼리는 Cluster(=Community, Correlation)를 형성하고 있을 것이므로, semi-supervised learning을 통해 unlabeled node를 분류해 보자는 것이 핵심 idea 입니다. </p>
<h2 id="collective-classification">Collective Classification</h2>
<p>Network 상에는 <strong>Correlation</strong>이 존재합니다. 
Similar node는 connected 되어 있을 것이고, 
이러한 정보를 기반으로 node에 label을 assign 해 주는 것이 <code>collective classification</code> 개념입니다. </p>
<h3 id="collective-classification-techniques">Collective Classification Techniques</h3>
<pre><code class="language-java">1. Relational Classification
2. Iterative Classification 
3. Belief Propagation </code></pre>
<h2 id="correlations-exist-in-networks">Correlations Exist in Networks</h2>
<p>Individual behaviors are <strong>correlated</strong> in a network environment </p>
<p><img src="https://images.velog.io/images/jbeen2/post/17df0800-c50e-4cb0-8dee-3c163c94fe6d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.11.11.png" alt=""></p>
<ol>
<li><p><strong><code>Homophily</code></strong></p>
<ul>
<li>유유상종 </li>
<li>비슷한 성향을 가진 사람들끼리, 비슷한 social connection을 형성</li>
<li>ex. age, gender, organization roles + AI에 관심 많은 투빅스..    </li>
</ul>
</li>
<li><p><code>Influence</code> </p>
<ul>
<li>나의 취향을 추천하여, 다른 사람도 좋아하게끔 만드는 것 </li>
<li>ex. 내가 좋아하는 연예인을 동료한테 매일 보여줬더니 동료도 결국 그 연예인을 좋아하게 되는 것  </li>
</ul>
</li>
<li><p><code>Confounding</code>
 <img src="https://images.velog.io/images/jbeen2/post/e9033449-b41c-4a01-bb16-4409d094369c/confounding-variable.jpg" alt=""></p>
<ul>
<li>교란 변수 : individual characteristics와 social connections에 동시에 영향을 주는 environment </li>
</ul>
</li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/cdf13588-be4a-4eaa-b12e-a0e0d5133c57/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-23%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.03.07.png" alt=""></p>
<p>correlation 중, <strong>homophily</strong>에 주목해 <strong>node classification</strong>을 수행하고자 합니다. </p>
<hr>
<h2 id="classification-with-network-data">Classification with Network Data</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/f6bb5a05-b8fd-47f6-988a-6159eee2c719/94362358-a929ab80-00f5-11eb-9fe8-0d19d4dbbe1b.png" alt=""></p>
<p>How do we <strong>leverage this correlation</strong> observed in networks to help predict node labels? </p>
<p><code>Guilt-by-association</code><br>If I am connected to a node with label 𝑋, then I am likely to have label 𝑋 as well.
= 내가 투빅스 사람들하고 친구라면, 나도 투빅스 사람일 확률이 크다! </p>
<p><img src="https://images.velog.io/images/jbeen2/post/2c3546cc-5146-4f74-a9f1-bd1af0c42334/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.21.44.png" alt=""></p>
<p><code>v node label</code> 은 위의 세 가지 요소에 영향을 받게 됩니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/e388eac1-0de7-494a-a609-bb06ac76c913/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.27.45.png" alt=""></p>
<p>따라서 node classification task는, 
<code>positive</code> / <code>negative</code> / <code>unlabeled node</code> 에서, 
unlabeled node 가 positive node가 될 확률을 예측하는 것 입니다. 
(cf. logistic regression에서의 p = 1이 될 확률)</p>
<hr>
<h2 id="collective-classification-overview">Collective Classification Overview</h2>
<p>Simultaneous classification of <strong>interlinked nodes</strong> using <strong>correlations</strong></p>
<p><img src="https://images.velog.io/images/jbeen2/post/321ac294-e39b-4be0-a131-02c70224d9e1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.33.31.png" alt=""></p>
<ul>
<li><code>Markov Property</code> : $P(S_t|S_{t-1}, ... , S_1) = P(S_t|S_{t-1})$</li>
<li><code>Markov Assumption</code> : neighbor 에 모든 정보가 함축되어 있다고 생각하고, node v에 연결된 neighbor 정보를 고려합니다.  </li>
</ul>
<p><img src="https://images.velog.io/images/jbeen2/post/357365cf-2a27-4ee4-a419-cd869c9f34a5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.45.20.png" alt=""> </p>
<h4 id="process">PROCESS</h4>
<p>STEP 1. <code>Local Classifier</code> </p>
<ul>
<li>초기 label을 부여합니다. </li>
<li>node 속성만을 사용해 예측하며, network 정보를 사용하지 않습니다.</li>
</ul>
<p>STEP 2. <code>Relational Classifier</code> </p>
<ul>
<li>correlation 을 capture 합니다. </li>
<li>neighborhood node의 label, attribute 정보를 사용해 예측합니다. </li>
</ul>
<p>STEP 3. <code>Collective Inference</code> </p>
<ul>
<li>Propagate the Correlation </li>
<li>각 node마다 Relational Classifier 를 반복적으로 적용합니다. </li>
<li>인접한 neighbor 정보만 사용하는 것이 아니라, neighbor에 전달된 correlation을 사용합니다. 이를 통해 전체 network의 정보를 사용할 수 있게 됩니다.<br>(Basically, we do not want to stop at the level of only using our neighbors, but through multiple iterations we want to be able to <strong>spread the contribution</strong> of other neighbors to each other.)</li>
</ul>
<p>Collective Classification 은 iterative 하게 진행되며, approximate inference 입니다. </p>
<ul>
<li><code>iterative</code> : neighborhood labels 불일치가 최소화 될 때 까지 반복합니다. </li>
<li><code>approximate inference</code> : propagation 진행할 때 neighborhood 범위를 점점 줄입니다.  </li>
</ul>
<h3 id="several-applications">several applications</h3>
<ul>
<li>Document classification</li>
<li>Part of speech tagging</li>
<li>Link prediction</li>
<li>Optical character recognition</li>
<li>Image/3D data segmentation</li>
<li>Entity resolution in sensor networks</li>
<li>Spam and fraud detection</li>
</ul>
<br>

<h1 id="1-relational-classification">1. Relational Classification</h1>
<p><strong>setting</strong> </p>
<ul>
<li><code>idea</code> : $Y_i$의 class probability는 neighbor 노드들의 class probability의 <strong>weighted average</strong> </li>
<li><code>labeled node</code> : ground-truth Y label 로 initialize </li>
<li><code>unlabeled node</code> : uniformly 하게 설정합니다. (0.5 or 신뢰할 만한 prior) </li>
</ul>
<p><strong>training</strong> </p>
<ul>
<li><code>update</code> : 수렴할 때 까지 or 최대 iteration 수에 도달하기까지 모든 노드들을 random order로 업데이트 합니다. </li>
<li><code>repeat</code> : 모든 node i 와 label c에 대해, 다음 과정을 반복합니다.<br><img src="https://images.velog.io/images/jbeen2/post/c45dbc5e-7ca9-4ff9-9584-965d8ad5430e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.30.50.png" alt=""></li>
</ul>
<h2 id="example">Example</h2>
<ol>
<li><code>Initialize</code> : node label 에 맞게, 확률값을 초기화 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/5b32278f-a5d1-40d5-9b64-d38a54cad216/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.41.47.png" alt=""></p>
<ol start="2">
<li><code>1st Iteration</code> : random order 순서대로 update 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/38689249-ccad-4643-b5b5-b44de19e539d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.42.46.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/5281ceac-c1dc-4c00-9c29-d196d8177c60/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.43.17.png" alt=""></p>
<p>... (node 3→4→5→8→9)</p>
<p><img src="https://images.velog.io/images/jbeen2/post/69d189eb-537e-4af1-ac6f-ec2e31d0b6ed/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.44.57.png" alt=""></p>
<ol start="3">
<li><code>Repeat Iteration</code> : 모든 node 가 수렴할 때 까지 or 최대 iteration 수에 도달할 때 까지 반복합니다.  </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/dc8d0bfc-dd5a-4e33-af27-a8c5bc3ae0d6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.46.36.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/807b8f72-91b5-4dd5-a6e6-9fc66ceb5a45/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.46.45.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/b2cde6d3-05d1-4744-8ac0-15a23763aaed/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-24%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%205.47.10.png" alt=""></p>
<ul>
<li>$P(Y_v) &gt; 0.5$ 인 경우 label = 1, $P(Y_v) &lt; 0.5$ 인 경우 label = 0 으로 분류합니다. </li>
<li>cf. node 4 : +/- equally contributing → bridge 역할 가능 </li>
</ul>
<h2 id="challenges">Challenges</h2>
<ol>
<li>convergence 보장되어 있지 않습니다. 위의 예시의 경우 그래프가 작아서 수렴이 잘 되었지만, 그래프 크기가 커지는 경우 취약한 방식이라고 합니다. </li>
<li>node feature information을 전혀 사용하지 않습니다. </li>
</ol>
<br>


<h1 id="2-iterative-classification">2. Iterative Classification</h1>
<p><code>idea</code> : node i의 <strong>attribute</strong> &amp; neighborhood 의 <strong>label</strong> 모두 고려합니다. 
If two objects are related, inferring something about one object can assist inferences about the other.</p>
<h3 id="process-1">PROCESS</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/ced88b11-8c53-40fd-b578-82bdbbbaa9ce/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.15.14.png" alt=""></p>
<ol>
<li><p>Bootstrap Phase </p>
<ul>
<li>$a_i$ : 각각의 node i 에 대해 flat vector $a_i$ 를 생성합니다. </li>
<li>$f(a_i)$ : $a_i$를 local classifier(ex. SVM, KNN, LR) 을 통해 분류합니다. </li>
<li>aggregate neighbors : count, mode, proportion, mean, exists 등의 neighborhood information 을 취합합니다. </li>
</ul>
</li>
<li><p>Iteration phase</p>
<ul>
<li><p>Repeat : 각각의 node i 에 대해 다음 과정을 반복합니다. </p>
<ul>
<li>node vector $a_i$ 를 update 합니다. </li>
<li>$f(a_i)$ 에 대해 label $Y_i$를 update 합니다. </li>
</ul>
</li>
<li><p>Iterate : class label이 stabilize 되거나 최대 iteration 횟수가 만족될 때까지 반복합니다. </p>
</li>
</ul>
</li>
</ol>
<hr>
<p><img src="https://images.velog.io/images/jbeen2/post/d577f5db-b2a5-429e-a7ac-c758a8ae8aef/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.20.30.png" alt=""></p>
<ol>
<li>$\phi_1(f_v)$  = feature vector 만으로 node label을 예측하는 classifier </li>
<li>$\phi_2(f_v, z_v)$ = feature vector + $N_i$ 모두 이용하여 label을 예측하는 classifier </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/5e8dce59-2277-4ed9-8fd5-37407bb471ec/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.20.40.png" alt=""></p>
<h3 id="example--web-page-classification">Example : Web Page Classification</h3>
<ol start="0">
<li><p>Setting </p>
<ul>
<li>$f_v$ : feature vector, node의 정보 
(강의에서 소개해 준 feature vector 예시 : Bag-Of-Words) </li>
<li>$z_v$ : neighborhood label에 대한 정보 통계량 벡터 <ul>
<li>I : Incoming neighbor label information vector </li>
<li>O : Outgoing neighbor label information vector </li>
<li>$I_0$ = 1 : 최소 1개의 label 0 노드가 incoming (count) </li>
</ul>
</li>
</ul>
</li>
<li><p>$\phi_1$ 과 $\phi_2$ 를 학습시킵니다. 
<img src="https://images.velog.io/images/jbeen2/post/792feffd-f52b-4d15-b1a4-81b84b262f45/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.29.01.png" alt=""></p>
</li>
</ol>
<ol start="2">
<li><p>feature vector 만으로 classification ($\phi_1$) 을 진행합니다. 
<img src="https://images.velog.io/images/jbeen2/post/325a262b-58f6-4503-a8ff-2ce49324aa18/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.48.02.png" alt=""></p>
</li>
<li><p>예측한 label 값에 기반하여, $z_v$를 update 합니다. 
<img src="https://images.velog.io/images/jbeen2/post/6ae02ff1-e7d0-4e0f-ad22-321667335329/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.48.25.png" alt=""></p>
</li>
<li><p>feature vector와 $z_v$를 모두 사용하여 classification ($\phi_2$) 을 진행합니다. 
<img src="https://images.velog.io/images/jbeen2/post/8f41105b-5d2e-4b46-94d1-9ba0dd192b42/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.49.22.png" alt=""></p>
</li>
<li><p>수렴할 때 까지 반복합니다. 
<img src="https://images.velog.io/images/jbeen2/post/9e372035-a9e7-4296-9809-a7ae5c570ece/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%201.50.54.png" alt=""></p>
</li>
</ol>
<hr>
<h2 id="rev2--fake-review-detection">REV2 : Fake Review Detection</h2>
<h3 id="fake-review-spam">Fake Review Spam</h3>
<ul>
<li>Review Site에서는 spam이 공공연하게 발생합니다. <ul>
<li>평점이 하나 높아질수록, 수입이 5~9% 상승합니다.</li>
<li>Paid Spammers는 거짓으로 해당 상품들의 평가를 낮게 평가함으로써, 경쟁사를 꺾으려고 합니다. </li>
</ul>
</li>
<li>Behavioral analysis, Language Analysis 만으로는 Spammer를 판별하기 어려운데, Individual Behavior 이나 Content of Review 는 거짓으로 보여주기 쉽기 때문입니다. </li>
<li>따라서, 쉽게 속이기 어려운 <code>graph structure</code> 를 통해 <strong>Reviewers, Reviews, Stores</strong> 사이의 <code>relationship</code> 을 파악하고자 합니다. </li>
</ul>
<h3 id="rev2-solution">REV2 Solution</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/5d63a85f-76b9-4f3a-ab73-76cd9507b8c8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.04.42.png" alt=""></p>
<ol>
<li>Setting </li>
</ol>
<ul>
<li><code>Input</code> : <strong>Bipartite rating graph</strong> as a weighted signed network<ul>
<li><code>node</code> : Users, Products (Items)</li>
<li><code>Edges</code> : [-1, +1] rating scores (Red : -1 &amp; Green : +1)</li>
</ul>
</li>
<li><code>Output</code> : 거짓으로 평점을 평가하는 유저 집단</li>
</ul>
<ol start="2">
<li><p>Intrinsic Properties </p>
<ol>
<li><strong>Users</strong> have <code>fairness</code> scores 
 사기꾼들은 좋은 상품에 낮은 평점, 나쁜 상품에 좋은 평점을 줄 것입니다. </li>
<li><strong>Products</strong> have <code>goodness</code> scores 
 좋은 상품의 평점은 좋을 것입니다. </li>
<li><strong>Ratings</strong> have <code>reliability</code> scores 
 reliability $\neq$ fairness : user는 bias가 있습니다. 
 개인적인 의견이 다수의 의견과 일치하지 않을 수 있습니다.</li>
</ol>
</li>
<li><p>Axiom</p>
<ol>
<li>Better Products get higher ratings.</li>
<li>Better products get more reliable positive ratings. </li>
<li>Reliable ratings are closer to goodness scores.</li>
<li>Reliable ratings are given by fairer users.</li>
<li>Fairer users give more reliable ratings. </li>
</ol>
</li>
</ol>
<h3 id="iterative-classification">Iterative Classification</h3>
<ol>
<li><p>Fairness of Users : goodness와 reliability를 고정시키고, fairness를 update 합니다. 
<img src="https://images.velog.io/images/jbeen2/post/3ebcca32-a6b3-4c0a-9a4e-af3c26447cc4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.45.18.png" alt=""></p>
</li>
<li><p>Goodness of Products : fairness와 reliability를 고정시키고, goodness를 update 합니다. 
<img src="https://images.velog.io/images/jbeen2/post/5836faba-8ed7-4119-97b3-85e353539c09/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.46.10.png" alt=""></p>
</li>
<li><p>Reliability of Ratings : fairness와 goodness를 고정시키고, reliability를 update 합니다.
<img src="https://images.velog.io/images/jbeen2/post/b874e69f-f378-4697-9cfd-64e8c32e89fd/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.49.32.png" alt=""></p>
</li>
</ol>
<h3 id="process-2">PROCESS</h3>
<ol>
<li><p>Initialize to best scores : F, G, R 값을 모두 1로 초기화합니다. 
<img src="https://images.velog.io/images/jbeen2/post/4e04cd47-7fe0-4920-92e8-72c6cfae7236/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.51.24.png" alt=""></p>
</li>
<li><p>Updating goodness 
<img src="https://images.velog.io/images/jbeen2/post/e47f69f2-c277-4ab9-9a58-41ada89da49b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.54.04.png" alt=""></p>
</li>
<li><p>Update reliability
<img src="https://images.velog.io/images/jbeen2/post/76ee6a0a-4052-4a81-bad0-6d01d84b21fb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.55.15.png" alt=""></p>
</li>
<li><p>Update fairness 
<img src="https://images.velog.io/images/jbeen2/post/3e48f14c-6add-4c56-8a46-9cb3452856e4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.55.44.png" alt=""></p>
</li>
<li><p>Convergence : <strong>Fairness가 낮은 user</strong>가 Fraudster 입니다. 
<img src="https://images.velog.io/images/jbeen2/post/76c02e80-6cca-4189-9788-decc93466adc/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.56.14.png" alt=""></p>
</li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/e3a6c463-5c17-4229-864a-3c884d4e70eb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.07.10.png" alt=""></p>
<h3 id="properties-of-rev2-solution">Properties of REV2 Solution</h3>
<ul>
<li>REV2는 수렴이 보장되어 있습니다. </li>
<li>수렴하기까지 총 Iteration 횟수의 상한선이 존재합니다. </li>
<li>시간복잡도는 그래프의 Edge의 수가 증가함에 따라 Linear하게 증가합니다. </li>
<li>위에서 다루지는 않았지만, Laplace Smoothing을 통해 cold start problem도 해결합니다. </li>
</ul>
<br>


<h1 id="3-belief-propagation">3. Belief Propagation</h1>
<p><code>idea</code> : <strong>message passing</strong> 
dynamic programming 접근 방식으로, graph model에서 조건부 확률로 답을 구해내는 방식입니다.  </p>
<h2 id="message-passing">Message Passing</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/419be3dd-52c2-4739-92eb-8ef41f3195e5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.43.04.png" alt=""></p>
<ul>
<li><strong>Task</strong> : graph 에서 node의 개수 세기 </li>
<li><strong>Condition</strong> : 각 node들은 그들의 neighbors와만 interact 할 수 있습니다.  </li>
<li><strong>Solution</strong> : 각 node들은 그들의 neighbor로 부터 message를 전달받고, 이를 update 하여, 앞으로 전달합니다. </li>
</ul>
<p><img src="https://images.velog.io/images/jbeen2/post/787d1e1d-f075-4419-8ebe-2292c8379321/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.49.34.png" alt=""></p>
<h3 id="message-passing-in-trees">Message Passing in Trees</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/f812ecb0-b586-44e3-8a94-74a7b56d498d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.53.38.png" alt=""></p>
<p>노란색 node에서 전달된 정보를 토대로 개수를 파악하여, 앞으로 전달합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/72da3640-3e81-4084-a43e-15b9702af9db/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.54.34.png" alt=""></p>
<p>반대 방향으로 전달할 때에는, 위와 같습니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/14f81c4d-39f3-4ea2-885c-9e386efb2f42/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.55.32.png" alt=""></p>
<p>따라서 전달된 (<code>Passing a belief</code>) 두 정보를 종합하여, 7+3+3+1=14 라는 과정을 통해 총 node의 개수는 14개가 될 것이라는 <strong><code>Belief Propagation</code></strong> 을 내리게 됩니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/961acfaf-e035-41df-9aec-146dc74b7a9b/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.59.11.png" alt=""></p>
<p>다만, graph가 cyclic 한 경우에는 Belief Propagation이 잘 작동하지 않습니다. </p>
<hr>
<h2 id="loopy-belief-propagation">Loopy Belief Propagation</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/d1d84e7a-36b7-4a5f-9ece-626350af6037/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.39.36.png" alt=""></p>
<p>i는 j에게 message를 보낼 때, 주변 neighbor인 k에게 들은 내용을 전달합니다. 
즉, neighbor k는 i에게 belief state를 전달합니다. </p>
<h3 id="notation">Notation</h3>
<ol>
<li><p>$\psi$ : Label-label Potential Matrix </p>
<ul>
<li>node와 neighbor 사이의 dependency </li>
<li>$\psi(Y_i, Y_j)$ : 노드 j의 neighbor i가 state $Y_i$에 있을 때, 노드 j가 state $Y_j$에 속할 확률 
= <strong>correlation</strong> between node i &amp; j </li>
</ul>
</li>
<li><p>$\phi$ : Prior Belief </p>
<ul>
<li>$\phi_i(Y_i)$ : 노드 i가 state $Y_i$에 속할 확률 </li>
<li>$m_{i→j}(Y_j)$ : j가 state $Y_j$에 있을 때 i의 추정치 
= i&#39;s <strong>message</strong></li>
</ul>
</li>
<li><p>$L$ : 모든 state의 집합 </p>
</li>
</ol>
<h3 id="process-3">PROCESS</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/15eeaf44-2eaa-42f0-b149-05b37e060b52/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.18.15.png" alt=""></p>
<ol>
<li><p>모든 message를 1로 초기화 한 후, 각 노드에 대해 다음을 반복합니다. 
<img src="https://images.velog.io/images/jbeen2/post/b585f08f-f259-4110-931a-a80690253ecd/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.04.20.png" alt=""></p>
</li>
<li><p>수렴하면, 각 state에 대한 belief $b_i(Y_i)$를 계산합니다. 
<img src="https://images.velog.io/images/jbeen2/post/ec0d4e9e-9013-459c-b543-ebaad07cf2d2/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.04.31.png" alt=""></p>
</li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/aceba43c-6fb2-4099-94bf-8c56a37e78ed/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.56.32.png" alt=""></p>
<p>Loopy BF는 cyclic graph에서 사용할 수 없습니다. (no longer independent)</p>
<h3 id="summary">Summary</h3>
<ol>
<li>Advantages  <ul>
<li>프로그래밍 및 병렬화가 쉽습니다. </li>
<li>어떤 그래프 모델보다도 general하게 적용 가능합니다. (+ higher order than pairwise) </li>
</ul>
</li>
<li>Challenges <ul>
<li>수렴이 보장되지 않습니다. </li>
<li>특히 많은 closed loop가 있는 경우, 적용이 어렵습니다. 
(Clustering Coef를 확인해 보고, Belief Propagation 적용 가능성을 검토해 볼 수 있습니다.) </li>
</ul>
</li>
<li>Potential Functions <ul>
<li>parameter 추정을 위해 train이 필요합니다. </li>
<li>gradient-based 최적화가 진행됩니다. </li>
</ul>
</li>
</ol>
<hr>
<h2 id="netprobe--online-auction-fraud">NetProbe : Online Auction Fraud</h2>
<h3 id="online-auction-fraud">Online Auction Fraud</h3>
<ul>
<li>경매 사이트는 사기 치기에 상당히 매력적인 장소입니다. 
종종 상품 배달을 못 받았다는 사기를 치곤 하며, 이러한 사기 사건 하나 당 발생하는 평균 손실 비용이 $385 라고 합니다. </li>
<li>단순 individual feature (user attributes, geographic locations, login times, session history, etc) 만으로 사기꾼을 탐지하기는 어렵습니다. </li>
<li>따라서 <code>graph structure</code> 을 구성하여, user 사이의 relationship 을 캐치하여 사기꾼을 탐지하고자 합니다. </li>
</ul>
<h3 id="role-of-users">Role of Users</h3>
<p><strong>Main Question</strong> : How do fraudsters <strong>interact</strong> with other users and among each other?</p>
<p><img src="https://images.velog.io/images/jbeen2/post/19119041-d2f3-4d3f-b1df-f142a8847926/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.12.22.png" alt=""></p>
<p><strong><code>fraudster</code> : 사기꾼</strong> / <strong><code>accomplice</code> : 공범</strong> / <strong><code>honest</code> : 선량한 시민들</strong> </p>
<ul>
<li>경매 사이트에는 Reputation System 이 존재합니다. </li>
<li>사기꾼들끼리는 서로의 Reputation Score를 올려 주지 않는데, 한 명이 걸리게 되면 다 같이 걸리게 되기 때문입니다. </li>
<li>따라서 near-bipartite graph를 형성합니다. <ul>
<li>accomplice      <ul>
<li>perfectly 하게 정상적인 것 처럼 보이는 user를 말하며, honest와 거래하며 high feedback rating 얻습니다.   </li>
<li>fraudster의 feedback rating 을 올려줍니다. </li>
</ul>
</li>
<li>fraudster <ul>
<li>accomplice 와 거래하며, honest 에게 사기를 칩니다. </li>
</ul>
</li>
</ul>
</li>
<li>사기를 치고 나면, fraudster는 사기 현장을 떠나고, accomplice는 사기 현장에 남아 다음 사기를 치는 것을 도와줍니다. </li>
</ul>
<h3 id="detecting-auction-fraud">Detecting Auction Fraud</h3>
<p><code>Markov Random Field</code> &amp; <code>Belief Propagation</code> </p>
<p><img src="https://images.velog.io/images/jbeen2/post/85644b0d-3bc7-45c8-9c7b-d24ef0b21cb8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.27.05.png" alt=""></p>
<h4 id="propagation-matrix">Propagation Matrix</h4>
<p>$\psi(\sigma, \sigma&#39;)$ : the likelihood of a node being in state $\sigma&#39;$ given that it has a neighbor in state $\sigma$</p>
<p><img src="https://images.velog.io/images/jbeen2/post/baf5b016-2105-43c6-8abc-55373d588c43/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.28.44.png" alt=""></p>
<ul>
<li>해당 논문에서의 $\epsilon_p$ = 0.05 입니다. </li>
<li>즉, 노란색으로 칠한 값이 heavily linked 된 관계를 나타냅니다. </li>
<li>Intuition <ul>
<li><code>fraudster</code> 는 accomplice와 heavily link 되어 있으나, 다른 bad node와의 연결은 피하는 양상입니다. </li>
<li><code>accomplice</code> 는 fraudster 와 honest 모두와 연결되어 있으며, 특히 fraudster와 더 잘 연결되어 있습니다. </li>
<li><code>honest</code> 는 accomplice와 다른 honest와 연결되어 있습니다. </li>
</ul>
</li>
</ul>
<h4 id="process-4">PROCESS</h4>
<p><img src="https://images.velog.io/images/jbeen2/post/f8afeb44-8b89-483c-bdea-024bdf908a83/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.35.53.png" alt=""></p>
<ol>
<li>fraudster, accomplice, honest 확률값을 모두 같게 initialize 합니다. </li>
<li>각각의 node는 iteratively 하게 message를 pass하며, belief를 update 합니다. </li>
<li>$\psi(\sigma, \sigma&#39;)$ 에 따르면, iteration 1 이후의 node는 accomplice 가 될 가능성이 높습니다. accomplice 로 분류된 node에 대해서, 이웃을 fraud 혹은 honest 로 두고, 값을 계속적으로 update 합니다.</li>
<li>수렴할 때 까지 update 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/b5707990-d3ac-413a-96bc-e78bff38c9c7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.46.54.png" alt=""></p>
<p>분류가 잘 된 것을 볼 수 있습니다. </p>
<br>

<h1 id="reference">Reference</h1>
<ol>
<li><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter6.">Tobigs Graph Study : Chapter 6. Message Passing and Node Classification</a></li>
<li><a href="https://data-weirdo.github.io/data/2020/09/27/data-graph-06.messagepassing/">데이터 괴짜님 Review : CS224W - 06.Message Passing and Node Classification</a></li>
<li><a href="https://snap-stanford.github.io/cs224w-notes/machine-learning-with-networks/message-passing-and-node-classification">snap-stanford Review : Message Passing and Node Classification</a></li>
<li><a href="http://web.stanford.edu/class/cs224w/slides/05-message.pdf">CS224W Winter 2021 : 5. Label Propagation for Node Classification</a></li>
</ol>
<hr>
<ol start="5">
<li><a href="https://dl.acm.org/doi/pdf/10.1145/3159652.3159729">REV2: Fraudulent User Prediction in Rating Platforms</a></li>
<li><a href="http://www.cs.cmu.edu/~christos/PUBLICATIONS/netprobe-www07.pdf">NetProbe : A Fast and Scalable System for Fraud Detection in Online Auction Networks</a></li>
<li><a href="https://ojs.aaai.org//index.php/aimagazine/article/view/2157">Collective Classification in Network Data</a></li>
</ol>
<hr>
<ol start="8">
<li><a href="https://jayhey.github.io/semi-supervised%20learning/2017/12/04/semisupervised_overview/">Semi-supervised Learning(준지도학습) - Overview</a></li>
<li><a href="https://www.statisticshowto.com/experimental-design/confounding-variable/">Confounding Variable: Simple Definition and Example</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[5. Spectral Clustering]]></title>
            <link>https://velog.io/@tobigs-gnn1213/5.-Spectral-Clustering</link>
            <guid>https://velog.io/@tobigs-gnn1213/5.-Spectral-Clustering</guid>
            <pubDate>Fri, 26 Feb 2021 08:03:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/f3fe9eaf-b87d-4127-969d-1961f77cd327/image.png" alt=""></p>
<p>작성자 : <a href="https://github.com/minjoong507">정민준</a></p>
<p>이전 강의에서는 Network의 구조를 분석하고 Network motifs를 찾고 노드간 Community를 찾아내는 방법에 대해 소개했습니다. 이번 강의에서는 이전 내용에 이어 어떻게 그래프를 군집화 하고 더 나아가 Network motifs를 구성하는 Community를 찾아 그래프를 군집화하는 방법에 대해 소개합니다.</p>
<h1 id="1-spectral-clustering-algorithms">1. Spectral Clustering Algorithms</h1>
<p><img src="https://images.velog.io/images/mjjung/post/78fb5d58-c01d-4da8-aaba-7648263448d0/image.png" alt=""></p>
<ul>
<li><strong>Spectral Clustering</strong>을 위한 세 단계를 살펴보겠습니다. 먼저 전처리 단계를 거치고 고유값, 고유벡터를 구한다음 Grouping을 통해 네트워크를 표현합니다. 각 단계에 대해 자세히 알아봅시다.</li>
</ul>
<h2 id="1-1-partitioning">1-1. Partitioning</h2>
<p><img src="https://images.velog.io/images/mjjung/post/c57d86f9-c673-4f73-9226-78787d17b03a/image.png" alt=""></p>
<ul>
<li>먼저 G라는 Undirected graph가 있다고 가정하겠습니다. 여기서 의문은 우리는 어떻게 노드 1,2,3을 그룹화하고 나머지 노드 4,5,6을 그룹화 하는지입니다. 또한 이런 파티션을 어떻게 알아내는가에 대한 방법도 필요합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/e9581b1d-c7da-4979-b7cb-8c5bc675ebe1/image.png" alt=""></p>
<ul>
<li>좋은 파티션이라 함은 그룹내 노드간 간선이 최대며 그룹간의 간선이 최소여야 합니다. 이전 강의에서 Modularity를 배웠는데 이와 비슷한 개념이라고 이해했습니다. 결국 강한 연결을 지닌 서브 네트워크를 식별하여 분리합니다.</li>
</ul>
<h2 id="1-2-edge-cut">1-2. Edge cut</h2>
<p><img src="https://images.velog.io/images/mjjung/post/9c8e6709-fd9b-4532-8f0e-838cbc56c41f/image.png" alt=""></p>
<ul>
<li>파티션을 표현하는 목적함수로 <em>edge cut</em>을 사용합니다. 이는 각 그룹에서 종점이 있는 간선 수로 나타낼 수 있습니다. 위 그림에서는 파티션 A, B에 대한 <em>edge cut</em>은 2입니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/cc25f38b-3f32-4f9f-9d9e-f8a627d4498d/image.png" alt=""></p>
<ul>
<li>그래서 우리가 하려는 것은 두 파티션에 대한 최소 <em>edge cut</em>를 얻는 것입니다. 위 그림에서 Optimal cut을 찾는 과정이라고 할 수 있습니다. 하지만 이는 오로지 군집간의 연결만 고려하였고 군집 내부의 연결성에 대해선 전혀 고려하지 않았습니다.</li>
</ul>
<h2 id="1-3-conductance">1-3. Conductance</h2>
<p><img src="https://images.velog.io/images/mjjung/post/97cc11ca-1287-48d1-a7cd-3caf5ef36bfc/image.png" alt=""></p>
<ul>
<li><em>edge cut</em> 대신 우리는 Conductance를 사용합니다. 군집간 연결성을 비교하는데 각 군집의 밀도를 반영합니다. <em>edge cut<em>값이 작고 min(</em>vol(A)</em>, <em>vol(B)</em>)의 값이 커진다면(=두 군집의 밀도가 유사) 작은 Conductance값을 얻을 수 있습니다.</li>
<li>이전에 좋은 파티션을 어떻게 알아내야하는지에 대해 얘기했습니다. 답은 최소 Conductance값을 구하는 것입니다. 하지만 이는 NP-hard 문제로 최적의 파티셔닝을 구하기 위해 Conductance값을 계산하는것은 쉽지 않습니다. </li>
<li><strong>NP-hard</strong>: 대표적으로 TSP(Traveling Salesman Problem)문제가 있습니다. 그래프내 간선을 전부 비교하면서 문제를 해결하는 방법으론 다항시간내에 풀 수 없습니다. 이러한 NP-hard문제를 해결하기 위해서 휴리스틱한 방법이나 가지치기, 탐욕법등의 방법을 적용합니다.</li>
<li>이후 내용에서는 그래프에서 얻은 행렬, 고유값, 고유벡터를 통해 파티셔닝을 하는 방법에 대해 소개합니다.</li>
</ul>
<h2 id="1-4-spectral-graph-partitioning">1-4. Spectral Graph Partitioning</h2>
<p><img src="https://images.velog.io/images/mjjung/post/0866a908-5cc4-4feb-95b2-85a68dd494e2/image.png" alt=""></p>
<ul>
<li><strong>Matrix A</strong> : 그래프 <strong>G</strong>에서 얻은 인접행렬. 노드 i,j가 연결되어 있다면 1, 아니면 0을 가집니다.</li>
<li><strong>y</strong> : 우리는 인접행렬에서 x 벡터를 곱하여 y 벡터를 얻었습니다. y벡터는 각 노드가 이웃한 총 노드 수를 표현합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/038592c7-afbf-4287-a290-e1fbcb72a195/image.png" alt=""></p>
<ul>
<li>여기서 고유벡터와 고유값이 등장합니다. </li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/d0bdc3b2-9259-4067-9622-d04ad3e90470/image.png" alt=""></p>
<ul>
<li>그래프 <strong>G</strong>의 모든 노드들이 차수 d를 가지는 <em>d-Regular Graph</em>의 경우를 살펴보겠습니다.</li>
<li>여기서 가장 큰 고유값은 d입니다. <strong>CS230n Lecture7</strong> 의 내용을 빌리자면 이런 가정을 하는 이유는 원하는 결과를 보기 위함이라고 설명했습니다. Deconvolution case를 예를들어 설명하겠습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/f9faef36-2707-47d6-84f9-ee6a9d48c6d7/image.png" alt=""></p>
<ul>
<li>실시간으로 이미지에서 object detection하는 모델이 있다고 가정합시다.</li>
<li>일반적인 CNN를 보면 이미지의 feature extraction을 통해 낮은 차원을 가진 정보를 반복적으로 가지고갑니다. 실제로 Convolution Layer은 이미지 전체를 보지 않습니다. 커널이 지나가는 이미지의 일부분에서 계산된 값을 다음 정보에 저장합니다.</li>
<li>위 그림과 같이 실제로 Convolution Layer을 통해서 나온 값을 확인해보면 해당 object일 확률이 높은 region을 표시하면 다음과 같은 사진이며 이 값들이 Fully Connected layer의 가중치와의 곱과 합을 통해서 Classification을 진행합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/e6f1ac97-2912-4441-aabd-b82b4a1c9261/image.png" alt=""></p>
<ul>
<li>여기서 복원 벡터가 있다고 가정하고 Deconvolution을 통해서 해당 값이 어떤 이미지의 부분을 집중적으로 보았는지 복원해봅니다. 강의에서는 이런 가정을 통해서 우리가 하려는게 정말 가능한지를 확인하기 위해서 한다고 합니다. 사실 학습을 한다면 이런 가정이 무의미하다고 설명합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/283f93fb-1f7c-4894-bef0-6ee7a5f68f2c/image.png" alt=""></p>
<ul>
<li>그래프 <strong>G</strong>가 위 사진처럼 C와 B 파티션을 두 가지 경우로 가진다고 가정하겠습니다. </li>
<li>왼쪽의 경우 C, B 파티션이 연결성이 없으므로 최대 고유값과 두번째로 큰 고유값은 동일합니다. 이전 페이지에서 x가 전부 1인 고유벡터와 최대 고유값을 가짐을 확인했습니다. </li>
<li>다시 돌아와서 x벡터가 C 파티션의 노드 정보만 가지는 경우와 B 파티션의 노드 정보만 가지는 경우를 생각해보면 고유값이 동일함을 알 수 있습니다. 오른쪽의 경우 C, B 파티션이 연결성을 가진다면 근사한 값을 가지지만 동일하진 않습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/446096e8-ba4c-4dc0-af07-262eb917e144/image.png" alt=""></p>
<ul>
<li>여기서 오른쪽 경우가 <strong>d-regular graph</strong>라고 가정하겠습니다. 그러면 이미 아는대로 모든 값이 1인 고유벡터가 최대 고유값을 가집니다.</li>
<li>고유벡터들은 직교함으로 서로 곱하였을때 0이 나와야합니다. 그러면 다른 고유벡터의 모든 값들의 합은 0이 되어야 합니다. 그렇다면 두 그룹의 노드정보에 대해 양수, 음수의 그룹으로 나누어 표현하게 됩니다.</li>
</ul>
<h2 id="1-5-matrix-representations">1-5. Matrix Representations</h2>
<p><img src="https://images.velog.io/images/mjjung/post/2f8e69cb-755b-4f6c-93de-ad425eced25b/image.png" alt="">
<img src="https://images.velog.io/images/mjjung/post/80269fb4-80ca-4373-9c7a-de8effeeb07e/image.png" alt=""></p>
<h2 id="1-6-laplacian-matrix">1-6. Laplacian Matrix</h2>
<p><img src="https://images.velog.io/images/mjjung/post/c038cbc1-9cef-4248-8103-8ad51b9c56f6/image.png" alt=""></p>
<ul>
<li>위에서 차례대로 인접행렬 A와 차수행렬 D를 보았습니다. 여기서 Laplacian Matrix L은 D - A로 표현할 수 있습니다.</li>
<li>여기서 모든 L의 값의 합은 0입니다. 그래서 이전과 동일하게 모든 값이 1인 고유벡터는 최대 고유값을 가지는건 자명합니다.</li>
</ul>
<h2 id="1-7-rayleigh-theorem">1-7. Rayleigh Theorem</h2>
<p><img src="https://images.velog.io/images/mjjung/post/c08446fd-ce74-4251-be9f-108cbda414a4/image.png" alt=""></p>
<ul>
<li>여기서 우리가 구하고싶은 람다2를 통해서 그래프를 파티셔닝합니다.</li>
<li>수식을 정리하면 노드 i, j 차이의 제곱합임을 알 수 있습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/a455f2ce-5454-4c9b-aad5-0316cbcd4f65/image.png" alt=""></p>
<ul>
<li>여기서 y벡터가 A, B파티션에 속하는 노드에 대한 정보를 담고있는데 A에 속하면 1, B에 속하면 -1이라고 합시다. 그러면 우리는 군집내 노드와 다른 군집의 노드만 고려하면 됩니다. </li>
<li>여기서 람다2는 최소 값의 f(y)로 표현할 수 있습니다. 그리고 고유값에 대응되는 고유벡터를 x로 두고 있습니다.</li>
<li>정리하자면 이 x 벡터가 군집을 결정하고 Conductance를 최소화 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/4d1505ed-ccfd-4469-8923-cffe97403891/image.png" alt=""></p>
<h2 id="1-8-summary">1-8. Summary</h2>
<p><img src="https://images.velog.io/images/mjjung/post/3056e97f-f4a8-4748-b20d-35eec27d9432/image.png" alt=""></p>
<ul>
<li>그래서 우리는 지금까지 그래프의 좋은 파티션의 정의를 하였고 이를 찾는법은 cut criterion(=conductance)를 최소화하는 것이었습니다.</li>
<li>파티션을 찾는 좋은 방법은 그래프에서 얻은 행렬에서 고유값, 고유벡터를 사용하여 추정하는 것입니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/a5c5b52d-6399-46fd-a549-2caa367f9adf/image.png" alt="">
<img src="https://images.velog.io/images/mjjung/post/950b80d0-4286-4f62-a32f-17c28a4cce34/image.png" alt=""></p>
<ul>
<li>우리는 지금까지 <strong>Spectral Partitioning Algorithm</strong>에 대해 살펴보았고 총 정리를 하겠습니다.</li>
<li>먼저 <strong>Pre-processing</strong>단계에서 그래프의 인접행렬과 차수행렬을 통해 <em>Laplacian</em> 행렬을 얻습니다.</li>
<li><strong>Decomposition</strong>을 통해 <em>Laplacian</em> 행렬의 고유값, 고유벡터를 구합니다. 우리가 집중해야할 값은 람다2 입니다.</li>
<li>이전 단계에서 얻은 고유벡터에 담긴 노드 정보로 <strong>Grouping</strong>을 하여 파티셔닝을 진행합니다. 여기서 나이브하게 접근하면 0 또는 중간값으로 분리하여 파티셔닝을 하고 벡터내 값을 정규화하여 노드의 파티션을 정한다고 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/bec3b7dc-21b5-43b6-8407-a53210fe2660/image.png" alt="">
-이렇게 파티셔닝한 결과를 보겠습니다. 오른쪽 그래프에서 0을 지나는 구간을 자릅니다. 그리고 가장 0에 가까운 노드 4개는 왼쪽 그래프의 네트워크의 게이트웨이 위치에 있음을 확인할 수 있습니다. 오른쪽 차트가 나타내는 그래프 정보가 왼쪽 실제 그래프와 일치함을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/mjjung/post/fdad277e-6d05-4175-b28d-8ce51b87c1f1/image.png" alt=""></p>
<ul>
<li>다음의 경우를 보겠습니다. 0을 지나는 구간은 왼쪽 그래프의 서브 그래프를 연결하는 간선을 의미합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/06af77ba-6c99-4131-910e-d9a3035856c1/image.png" alt=""></p>
<ul>
<li>다른 람다값의 벡터에 대한 결과입니다. 람다1은 모두 같은 값을 가집니다.</li>
</ul>
<h2 id="1-9-k-way-spectral-clustering">1-9. K-Way Spectral Clustering</h2>
<p><img src="https://images.velog.io/images/mjjung/post/f2a54d7a-4f67-4bab-ab0e-7816e628ad02/image.png" alt=""></p>
<ul>
<li>군집의 수를 정하는 이 k 변수를 어떻게 정해야하는지에 대해 방법을 제시하고 있습니다. PCA에서 고유값, 고유벡터를 사용하는것과 유사하다고 이해했습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/bd78c6d5-d8f6-4c37-819b-9e32a8b82703/image.png" alt=""></p>
<ul>
<li>연속한 두 고유값의 차이가 가장큰 경우의 k를 선택합니다.</li>
</ul>
<h1 id="2-motif-based-spectral-clustering">2. Motif-Based Spectral Clustering</h1>
<p><img src="https://images.velog.io/images/mjjung/post/9bd0e49f-024c-40ee-a12f-41938990d570/image.png" alt=""></p>
<ul>
<li>파티셔닝을 하는데 Network motifs를 바탕으로 할 수 있는지가 main discussion입니다.</li>
</ul>
<h2 id="2-1-modules-of-motifs">2-1. Modules of Motifs</h2>
<p><img src="https://images.velog.io/images/mjjung/post/44d33f3b-9552-44f8-9205-916a96aefa63/image.png" alt="">
<img src="https://images.velog.io/images/mjjung/post/14ab1215-7598-421a-be26-490e331f2f36/image.png" alt=""></p>
<ul>
<li>Based Motif에 따라 다르게 파티셔닝됨을 볼 수 있습니다.</li>
</ul>
<h2 id="2-2-motif-conductance">2-2. Motif Conductance</h2>
<p><img src="https://images.velog.io/images/mjjung/post/782df4bc-06e2-4a80-98c7-2484ff69838c/image.png" alt=""></p>
<ul>
<li>이전까지 우리는 edge cut에서 conductance 개념을 살펴보았는데 이를 <strong>motifs</strong> 관점에서 적용시켜 다루겠습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/7a27b9f0-630e-4bcf-9e3a-2d86a39286b9/image.png" alt=""></p>
<ul>
<li>전체 네트워크에 6개의 motif를 볼 수 있습니다. 그리고 cut을 기준으로 4개의 간선이 존재하는데 두 간선은 motif를 이루는 간선이 아님으로 제외합니다. 그렇다면 파티셔닝된 S 네트워크의 <strong>motif volume</strong>은 2번 노드를 기준으로 4개의 motif가 존재하고 3개의 완전한 motif와 2번 노드만 남은 motif가 있음으로 <strong>10</strong>입니다. 여기서 잘린 motif는 하나 임으로 S 네트워크 Motif Conductance는 10 / 1로 정의할 수 있습니다.</li>
<li>이 과정 또한 NP-hard문제 입니다. 이전 <strong>Spectral Clustering Algorithm</strong>을 적용하겠습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/a5a4a4de-b4cd-456f-916d-56a34c2d8db5/image.png" alt=""></p>
<ul>
<li><strong>Spectral Clustering Algorithm</strong> 의 단계와 동일합니다. 하나씩 살펴보도록 하겠습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/61af5cab-39a5-45d5-a197-92849403e80d/image.png" alt="">
<img src="https://images.velog.io/images/mjjung/post/53267817-141e-4fcb-88ef-27f6a372346f/image.png" alt=""></p>
<ul>
<li>주어진 motif에 대해서 motif를 이루는 서브 그래프를 찾고 간선에 가중치를 주는 Matrix W를 둡니다. </li>
<li>Matrix W는 low motif conductance를 찾도록 합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/53a4e467-a3e8-4386-a13e-32cea5c96597/image.png" alt=""></p>
<ul>
<li>이어서 Laplacian Matrix를 구합니다. 이전에는 인접행렬을 사용했다면 이번엔 W 행렬을 사용합니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/c6fc14ef-9646-464c-8f94-3d653431f001/image.png" alt=""></p>
<ul>
<li>람다값을 구하고 이에 상응하는 고유벡터를 얻습니다. 여기서 최소 Motif Conductance를 띄는 노드의 정보를 통해 Grouping 과정을 진행합니다.</li>
</ul>
<h2 id="2-3-motif-cheeger-inequality">2-3. Motif Cheeger Inequality</h2>
<p><img src="https://images.velog.io/images/mjjung/post/4ac4ad47-bfde-42c9-a32b-69c0f0270fd4/image.png" alt=""></p>
<ul>
<li>Motif conductance가 다음과 같은 값의 범위를 가진다고 설명하고 있습니다. 이는 앞서봤던 람다2와 유사하다고 이해했습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/8b397570-f2b3-4ac1-915d-4f0c5bfa6cd7/image.png" alt=""></p>
<ul>
<li>정리하자면 최적의 Motif conductance은 위의 정리를 따르고 값을 구하여 Motif를 기반으로한 네트워크를 표현합니다.</li>
</ul>
<h2 id="2-4-example">2-4. Example</h2>
<p><img src="https://images.velog.io/images/mjjung/post/4072bf62-12e2-4350-a149-ec77a108f915/image.png" alt=""></p>
<ul>
<li>Network Motif의 유무에 따른 두 가지 경우를 제시합니다. 강의자료에선 Food webs에 대해 설명하고 있습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/68edd681-97cd-4eeb-a8b8-3f5b695288f4/image.png" alt=""></p>
<ul>
<li>Motif Spectral Clustering을 통해 각 Motif에 따른 결과를 보여줍니다.</li>
</ul>
<p><img src="https://images.velog.io/images/mjjung/post/b553404f-5496-46bc-abb7-73d647427338/image.png" alt=""></p>
<ul>
<li>여기서 특정 Motif를 설정하였을때 파티셔닝은 다른 Motif에 대해서는 좋은 파티셔닝이 아니라고 합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[4. Community Structure in Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/4.-Community-Structure-in-Networks</link>
            <guid>https://velog.io/@tobigs-gnn1213/4.-Community-Structure-in-Networks</guid>
            <pubDate>Sat, 20 Feb 2021 01:00:12 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/taeukkkim">김태욱</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Community Structure in Networks</li>
<li>Network Communities</li>
<li>Louvain Algorithm</li>
<li>Detecting Overlapping Communities: BigCLAM</li>
</ol>
<hr>
<h1 id="community-structure-in-networks">Community Structure in Networks</h1>
<h2 id="1-community-structure-in-networks">1. Community Structure in Networks</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/93e59689-7dff-45ca-88f7-7dc77f3d27fc/image.png" alt=""></p>
<p>이번 챕터의 목적, 즉 Community Structure는 &#39;서로간에 밀접하게(densely) 연결된 노드들의 집합을 구분하는 것&#39;입니다.</p>
<p>알고리즘에 들어가기 전에, 사회과학적으로 군집이 생성되는 원리에 대해 먼저 보겠습니다.</p>
<h3 id="granovetters-answer">Granovetter&#39;s Answer</h3>
<p>Granovetter는 &#39;사람들은 어떻게 새로운 직장을 찾는가?&#39;에 대한 연구를 진행</p>
<p>-&gt; 사람들은 자주 만나는 친한 친구가 아닌, 드물게 만나는 지인(Acquaintances)을 통해 직장에 대한 정보를 얻는다고 밝혔습니다.</p>
<p>이런 관계를 생각했을 때, 두 가지 관점의 frendships으로 나누어집니다.</p>
<ul>
<li>Structual: 링크가 네트워크의 어떤 부분을 연결하는가?</li>
<li>Interpersonal: 링크가 강한 연결관계를 가지고 있는가 약한 연결관계를 가지고 있는가?</li>
</ul>
<h4 id="triadic-closure">Triadic Closure</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/111bfb02-523e-45f1-9806-8e9538ae7aa2/image.png" alt=""></p>
<ul>
<li><p>어떤 edge가 더 연결될 가능성이 높은가?</p>
<p>답은 a-b입니다. a-c는 3칸 떨어져 있지만 a-b는 두 명의 공통된 이웃을 가지고 있기 때문에 a-b의 edge가 더 연결될 가능성이 높습니다.</p>
</li>
</ul>
<h4 id="granovetters-explanation">Granovetter&#39;s Explanation</h4>
<ul>
<li><p>First Point: Structure</p>
<ul>
<li>구조적으로 결속된(embedded) edge들은 사회적으로도 강하게 연결되어 있음.</li>
<li>서로 다른 네트워크를 연결하고 있는(long-range) edge들은 사회적으로 약하게 연결되어 있음.</li>
</ul>
</li>
<li><p>Second point: Information</p>
<ul>
<li>구조적으로 결속된(embedded) edge들은 정보 접근의 관점에서 매우 중복(redundant)됨.</li>
<li>Long-range edge들은 지인(Acquaintances)들로부터 새로운 정보를 얻을 수 있게 됨.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/083a1d79-13f7-4d1e-b2ac-0ebb3017127c/image.png" alt=""></p>
<ul>
<li>S
Structure: Socially Strong
Information: Redudant</li>
<li>W
Structure: Socially Weak
Information: Useful information</li>
</ul>
<h3 id="edge-overlap">Edge Overlap</h3>
<p>위의 이론은 Onnela에 의해 2007년 증명되었는데, 사용한 데이터는 EU 소속 국가 인구의 20%의 휴대폰 네트워크 데이터이며 Edge Weight는 통화횟수로 정의하였습니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/c663b9ae-62fb-46d6-8463-2f70103d0e67/image.png" alt=""></p>
<p>네트워크에서 얼마나 많은 지인(nodes)을 공유하고 있는가(overlap)에 대한 정보를 나타내는 수치를 Oij로 정의했습니다.
여기서 분자는 두 노드간의 겹치는 지인의 숫자이며, 분모는 두 노드의 모든 지인의 숫자(합집합)입니다.</p>
<p>즉, 지인을 공유할수록 해당 수치는 1에 가까워집니다.</p>
<h2 id="2-network-communities">2. Network Communities</h2>
<p>Granovetter&#39;s의 이론에 따르면 네트워크는 강하게 연결된 노드의 집합(tightly connected sets of nodes)입니다.</p>
<ul>
<li>Network communities: 내부적으로 연결된 많은 노드와 몇몇 외부적으로 연결된 노드들로 이루어진 집합.</li>
</ul>
<h3 id="modularity-q">Modularity Q</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/e8cf6619-ba4b-44a6-beed-0deaed9c95bc/image.png" alt=""></p>
<p>Communities는 강하게 연결된 노드들의 집합인데, 이 Communities를 찾기 위해 Modularity를 이용하며 이것을 최대화 하는것이 Communities입니다.</p>
<ul>
<li>Modularity Q란?
  네트워크가 communities로 얼마나 잘 나누어져(partitioning) 있는가에 대한 수치</li>
<li>partitioning이란?
  하나의 노드가 어떠한 그룹(community)에 속하도록 네트워크를 쪼개는 것.</li>
</ul>
<p>Q = community s의 edge 수 - 기대되는 community s의 edge 수
이 수치가 클수록(즉, edge수 차이가 클수록) 매우 strong group이라고 할 수 있습니다.</p>
<p>따라서, &quot;기대되는 community s의 edge 수&quot;를 찾기 위해 null model이 필요합니다.</p>
<h4 id="null-model--configuration-model">Null model : Configuration Model</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/ea069ab2-1d79-4a79-89ac-2c41534806f2/image.png" alt="">
Real network G는 n개의 노드와 m개의 엣지를 가지고 있으며, 이를 이용해 rewired network G&#39;을 만들 수 있습니다.</p>
<p>G&#39;은 G와 같은 차수의 분포(degree distribution)를 가지고 있지만 uniformly random하게 연결되어 있으며, multigraph로 가정합니다.</p>
<p>노드 i, 노드 j의 degree를 $k_i, k_j$ 라고 할 때,  edge의 기대값은 ${k_i} × {k_j \over 2m}$ 입니다. </p>
<p>${k_j \over 2m}$는 노드 j와 연결될 확률입니다. 또한 모든 노드는 2번씩 count되기 때문에 2m이 분모가 되며, multi-graph이기 때문에 노드 i의 degree인 ${k_i}$를 곱해주는 것입니다.</p>
<h4 id="modularity">Modularity</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/8ca4dfcd-6613-4215-be0d-3c245a30fd10/image.png" alt=""></p>
<ul>
<li>${A_ij}$: 두 노드 사이의 edge 개수</li>
<li>${k_ik_j \over 2m}$: expected number of edges</li>
<li>${1 \over 2m}$: Normalizing constant</li>
</ul>
<p>m개의 엣지를 가진 그래프가 가질 수 있는 엣지의 합이 최대 2m 였으므로, 2m으로 나눠줘 normalizing 해주면 Q는 -1과 1사이의 값을 가지게 됩니다.</p>
<p>또한 보통 0.3과 0.7 사이 정도면 Significant Community Structure가 있음을 의미합니다.</p>
<p>강의 중 질문에서 Q의 값이 negative일 때의 의미는 서로간에 거의 상관이 없는, 연결되어 있지 않은 community를 정의한 경우라고 합니다.(연결 되어야 하지만 연결되지 않은 경우) </p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/6459b354-b12f-437c-9608-2910ef931953/image.png" alt=""></p>
<p>Equivalently modularity는 위와 같이 표현될 수 있으며 ${c_i}$와 ${c_j}$는 노드들의 community입니다. $\delta(c_i,c_j)$는 indicator function으로 같은 그룹일시 1, 아니면 0 입니다.</p>
<h2 id="3-louvain-algorithm">3. Louvain Algorithm</h2>
<p>Community detection을 위한 Greedy Algorithm이며, 시간복잡도 O(nlogn)으로 매우 빠른 휴리스틱 알고리즘 입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/295b6ba2-fa53-4d9a-a1d6-0659df0acedf/image.png" alt=""></p>
<p>가중치 그래프도 지원하고, Hierarchical communities detection도 가능한데 이 경우 Dendrogram을 통해 네트워크의 Hierarchical한 구조를 나타낼 수 있습니다.</p>
<p>이 알고리즘은 빠르고, 수렴도 빠르고, High Modularity output을 도출해주기 때문에 네트워크에 널리 사용됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/c6534ba7-7422-400d-9425-bf9a4ec3ab60/image.png" alt=""></p>
<ul>
<li>Phase 1: <ul>
<li>가장 처음은 각각의 노드가 single community라고 생각</li>
<li>노드 i를 어떤 neighbor j의 community 속에 넣으면 발생하는 modularity 값의 증가량(Modularity delta: $\Delta Q$)을 측정 </li>
<li>노드 i를, 가장 큰 $\Delta Q$를 발생시키는 community로 이동</li>
<li>$\Delta Q$의 변화가 없을 때까지 Phase1 계속 실행</li>
</ul>
</li>
<li>Phase 2:<ul>
<li>Phase 1에서 찾은 community들을 모아 single super-node를 만들어 줌.<ul>
<li>Super-node들 사이에 하나의 Edge라도 있으면 연결</li>
<li>두 Super-node 간의 edge 가중치는 커뮤니티 간 모든 Edge 가중치들의 합</li>
</ul>
</li>
<li>다시 Phase 1으로(한 개의 Community를 찾을 때까지 계속 반복).</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/83f4c1ba-ede5-4824-845e-2fb9fcc186bf/image.png" alt=""></p>
<p>$\Delta Q(i→C)$ : 노드 i를 C community에 추가시켰을 때 Q의 증가량
$\Delta Q(D→i)$ : D community 에서 노드i를 제거시켰을 때 Q의 증가량
$\Delta Q$ = $\Delta Q(i→C) + \Delta Q(D→i)$</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/adab6209-20aa-4128-bba3-91d8305d2995/image.png" alt=""></p>
<p>위의 그림은 $\Delta Q$식을 더 구체적으로 보여주는 내용입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/776edd1e-9fbb-4071-8306-4e8463d414c2/image.png" alt=""></p>
<p>위의 그림은 Louvain algorithm의 전체적인 과정을 나타냅니다.</p>
<h2 id="4-detecting-overlapping-communities-bigclam">4. Detecting Overlapping Communities: BigCLAM</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/3ab9be27-5798-4457-83ac-ae9bb35c08e2/image.png" alt=""></p>
<p>앞에서의 Community들은 모두 Non-Overlapping 이었지만 실제로는 고등학교 동창이면서 대학교 동창일수도 있는 것처럼 Community가 겹치기도 합니다. 여기서는 이에 해당하는 Overlapping Community를 Detect할 수 있는 방법을 알아봅니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/e3ba7897-d241-4b20-afd4-4dcc8c017816/image.png" alt=""></p>
<p>이는 인접행렬(adjacency matrix)에서도 확인할 수 있는데 만약 community가 discrete하다면 위의 그림처럼 겹치는(overlap) 부분이 존재하지 않을 것이며,
반대로 한 노드가 여러 community에 속할  수 있다면  아래의 그림처럼 겹치는 부분이 존재할 것 입니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/64a7d7ca-c50c-43e5-9b71-f3944383af65/image.png" alt=""></p>
<p>마찬가지로 Overlapping Communities도 2가지 step으로 진행됩니다.</p>
<ul>
<li>Step1<ul>
<li>Node Community affiliation에 근거하여 graph generative model을 정의</li>
<li>Community Affiliation Graph Model (AGM)</li>
</ul>
</li>
<li>Step2<ul>
<li>Graph G가 AGM을 통해 만들어졌다는 가정 하에 진행.</li>
<li>AGM의 파라미터는 Graph G를 만드는데 사용되며, AGM이 G를 generative하도록 파라미터를 학습시킴. (MLE)</li>
<li>여기서 파라미터는 node가 community에 얼마나 속하는지 알려줌.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/a9e2d9f6-a2e5-46ef-962b-ec3247c6479b/image.png" alt=""></p>
<p>왼쪽 그림의 A, B는 communities이며, 밑의 점들은 네트워크 노드 입니다. community와 노드가 이어져 있다면 해당 노드는 해당 community에 속해있는 것이며, 양쪽 community에 모두 이어져 있다면 양쪽 모두에 속하는 것입니다.</p>
<p>이러한 Community affiliation가 모델을 거쳐 네트워크(오른쪽 그림)가 됩니다.</p>
<ul>
<li>Generative model issue: 어떻게 edges를 design할 것인가?</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/1f32c4b8-8e39-44bb-8b29-4918b2655617/image.png" alt=""></p>
<ul>
<li>Model Parameters: ${V, C, M, p_c}$</li>
<li>$p_c$: 어떤 노드가 c community와 연결될 확률</li>
<li>$M_u \cap M_v$: 노드 u, 노드 v의 공통 communities</li>
<li>$p(u,v)$ : u,v가 서로 연결되어 있을 확률, 
1 - 두 노드의 공통 community에 속하지 않을 확률들의 곱</li>
<li><blockquote>
<p>적어도 하나의 공통 커뮤니티에 속할 확률</p>
</blockquote>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/798f307b-9b7f-4e79-adff-f90b50ad577c/image.png" alt=""></p>
<p>AGM은 Overlapping 양상에 따라서 다양한 Community Structure를 표현할 수 있음.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/ff39f136-e1d5-4822-bda8-77cc2a4ea271/image.png" alt=""></p>
<p>지금까지는 model로 네트워크를 생성했지만, 반대로 네트워크로 model(어떤 노드가 어떤 커뮤니티에 속하는지)도 만들어야 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/c93b27ad-87d3-4056-881d-0603485e9662/image.png" alt=""></p>
<ul>
<li>Maximum Likelihood Estimation 사용</li>
<li>F에서 생성된 network가 G이길 바라기 때문에 G를 잘 만들어낼 수 있는 F(model/parameter)를 찾으면 됨. -&gt; real G와 가장 비슷한 G를 만들자!</li>
</ul>
<p>이를 위해 F(model/parameter)가 주어졌을 때 G가 나올 확률(Graph Probability)을 구하고, 이 확률을 최대화(argmax) 시키는 F를 찾아야 합니다.</p>
<p>이것을 위해 우리는 (1) F가 주어졌을 때 G가 나올 확률을 구해야하고, 이 확률을 (2) 최대화시키는 F를 찾아야 한다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/5f7bbac7-ee82-4035-a969-b79258fc3446/image.png" alt=""></p>
<ul>
<li>Graph Likelihood $P(G|F)$ : F가 주어졌을 때 G가 나올 확률</li>
<li>오른쪽 행렬에서 $(u,v) ∈ G$ 일 때 1, $(u,v) ∉ G$ 일 때 0</li>
</ul>
<h4 id="relaxing-agm-towards-puv">&quot;Relaxing&quot; AGM: Towards P(u,v)</h4>
<p>위의 모델은 0,1을 사용하여 노드들이 given community의 member인지 아닌지를 따졌지만, 여기선 모든 node community membership의 strength를 따져보기로 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/f2dbf761-ff50-4aec-bac5-3de446861f90/image.png" alt=""></p>
<ul>
<li>$F_u$: 노드 u가 각각의 커뮤니티에 속할 확률을 가진 벡터</li>
<li>$F_uA$: 노드 u가 community A에 속할 확률</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/5a9e15ed-9db0-4fc6-8d0b-9608a8da7ac2/image.png" alt=""></p>
<ul>
<li>$exp(F_u·F_v)$: 노드 u와 노드v가 각각의 커뮤니티에 동시에 속할 확률 (하나의 노드라도 어떤 커뮤니티에 할 확률이 0이라면 둘의 product는 0)</li>
</ul>
<p>노드 u와 v가 각각의 커뮤니티에 동시에 속할 확률은, shared memberships의 strength에 비례합니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/39bd7360-8276-48b8-8690-bdda225dedac/image.png" alt=""></p>
<ul>
<li>$l(F)$: log-likelihood</li>
</ul>
<p>결국 BigCLAM Model은 F가 주어졌을 때 G가 나올 확률을 구하고, 이 확률을 최대화시키는 F를 찾고자 하는 것입니다. 즉, log-likelihood를 최대화 하는 F를 찾는 것입니다.</p>
<h2 id="reference">Reference</h2>
<p><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter4.-community-structure-in-networks">https://tobigs.gitbook.io/tobigs-graph-study/chapter4.-community-structure-in-networks</a>
<a href="https://data-weirdo.github.io/data/2020/09/05/data-graph-04.communities">https://data-weirdo.github.io/data/2020/09/05/data-graph-04.communities</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3. Motifs and Structural Roles in Networks]]></title>
            <link>https://velog.io/@tobigs-gnn1213/3.-Motifs-and-Structural-Roles-in-Networks</link>
            <guid>https://velog.io/@tobigs-gnn1213/3.-Motifs-and-Structural-Roles-in-Networks</guid>
            <pubDate>Fri, 19 Feb 2021 23:35:46 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/jinseock95">오진석</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol>
<li>Motifs and Structural Roles in Networks</li>
<li>Subgraphs, Motifs, and Graphlets</li>
<li>Graphlets: Node feature vectors</li>
<li>Finding Motifs and Grphlets</li>
<li>Structural Roles in Networks</li>
<li>Discovering Structural Roles in Networks</li>
</ol>
<hr>
<p>we are going to talk about two topics about Network motifs graphlets and then the discovery of structural roles in networks</p>
<p>이번 3번째 강의에서는 Network motifs와 graphlets, 그리고 networks에서의 구조적 역할(discovery of structural roles)에 대해서 다루게 됩니다. 전체적인 graphs와 networks 보다는 구성 요소인 subnetworks에 대해서 보다 배우게 됩니다.</p>
<h2 id="1-motifs-and-structural-roles-in-networks">1. Motifs and Structural Roles in Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/c8480c03-e984-453d-83e6-f53b6d6b7c18/image.png" alt=""></p>
<p>subgraphs는 networks의 구조를 identify하게 하고 다른 유형의 network와 구별할 수 있게 특징화하며 주어진 node를 통해 network의 구조를 describe할 수 있게 해줍니다. 예를 들어, 레고 또한 작은 레고들의 모음으로 만들어진 하나의 레고 집합이며, 작은 레고들은 서로 구별될 수 있는 모양과 역할을 가지고 있습니다.</p>
<p>그러므로 이번 강의의 목표는 bigger network를 구성하는 small network인 subgraphs(=sub networks)에 대해서 배우며 이러한 these building blocks에 대해 이해하는 것입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/560b2786-7113-447c-bef6-1fa8c9c27db0/image.png" alt=""></p>
<p>위는 bigger network를 작은 구조의 network로 분해한 것을 보여줍니다. 3개 노드의 non-isomorphoic한 graphs는 총 13개의 경우의 수를 가지게 됩니다. </p>
<p>they have a different number of edges and in in what they differ is what are the directions of these edges and how many edges there are </p>
<p>이 모든 graphs들은 모두 non-isomorphic인 distinct한 특징을 가지고 있습니다.</p>
<p>isomorphic는 graph가 같은 edges와 같은 방향을 가지고 있으므로 다른 방법으로 그려짐에도 본질적으로 같은 grpah임을 의미합니다.</p>
<p>즉 non-isomorphic graph는 edges에 대한 다른 방향을 가지고 있으므로 본질적으로 동일하지 않은, 다른 graph임을 의미합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/66849636-4714-421b-bdb6-e901789a1f38/image.png" alt=""></p>
<p>그렇다면 이렇게 bigger network를 구성하는 subgraphs들의 frequency와 occurrence에 따라 정해지는 significant(중요성)에 대한 metric에 대해 생각해볼 수 있습니다.</p>
<p>the significance value가 negative 혹은 positive 하다면 network 내에서 under-represented 되거나 over-represented 라고 해석할 수 있습니다.</p>
<p>그렇게 되면 우리는 주어진 network에서 가능한 graph에 대한 significance profile을 작성할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/e18728ea-dfb0-41c9-8599-dc7aaf3f52c2/image.png" alt=""></p>
<p>위는 다른 유형의 network를 보여줍니다. 앞서 언급한 3개의 노드에서 발생하는 유니크한 13개의 subgraphs가 있을 때, 다른 유형의 network에서 어떻게 significance가 달라지는지 확인해볼 수 있습니다.</p>
<p>각 network는 Gene regulation networks, Neurons networks, Web and social betworks, Language networks 입니다. 각 그림의 y축은 significance profile이며 network의 유형에 따라 subgraph의 significance가 달라짐을 볼 수 있습니다.</p>
<p>첫번째 subgraph의 significance는 Language networks에서는 over-represented이지만 Web and social networks에서는 under-represented 되었음을 알 수 있습니다.</p>
<p>그렇다면 어떻게 subgraph의 significance가 정의되고 계산되는지에 대해 학습할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/35df3cf9-1e1c-49e4-9d22-c4921eb74c96/image.png" alt=""></p>
<p>이 강의에서는 3개의 주제에 대해 다루게 됩니다</p>
<ul>
<li><p>먼저 subgraph에 대해서 다루게 되고 network motif와 graphlets의 개념에 대해 정의 후 motif와 graphlets을 찾는 알고리즘에 대해 배우게 됩니다.</p>
</li>
<li><p>이러한 개념에 기반하여, network에서 노드의 구조적 역활을 찾는 방법에 대해 배우게 됩니다.</p>
</li>
<li><p>마지막으로 활용 사례에 대해 다루게 됩니다.</p>
</li>
<li><p>first we kind of we will talk about sub graphs and we will define a notion of network motif and we will define a notion of graphlets and then I will talk about algorithms to find motifs and graphlets </p>
</li>
<li><p>using these types of concepts we will talk about how do we discover structural roles of nodes in the network</p>
</li>
<li><p>I&#39;ll show you some applications of these things</p>
</li>
</ul>
<h2 id="2-subgraphs-motifs-and-graphlets">2. Subgraphs, Motifs, and Graphlets</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/20157845-d69d-438b-ba9b-f7d741cd2357/image.png" alt=""></p>
<p><strong>Network motifs</strong>의 정의는 significant recurring pattern of interconnections in the network 입니다. network motifs를 정의하기 위해서는 pattern, recurring, significant의 대한 개념을 정의해야 합니다.</p>
<ul>
<li>Pattern: Small induced subgraph, subgraph가 유도가 될 수 있는 패턴을 의미하는 것 같습니다.</li>
</ul>
<p>induced: if you have a set of nodes then, you take all the edges between that set of nodes</p>
<ul>
<li><p>Recurring: it occurs muiltiple times with high frequency, 발생 빈도를 의미하는 것 같습니다.</p>
</li>
<li><p>Significant: more frequent than expected, significant 혹은 more frequent라고 하기 위해서는 비교를 할 수 있는 baseline이 필요하다고 말합니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/jinseock95/post/8e5cac04-f2bb-4467-a694-73db66fddc5e/image.png" alt=""></p>
<p>그렇다면 왜 sub structures, motifs가 필요할까요? 위에는 다른 유형의 motifs에 대한 예시가 있습니다. Motif는 어떻게 network가 작동하는지에 대해 이해할 수 있도록 해주며 주어진 상황에서 network의 operation과 reaction을 예측할 수 있도록 도와줍니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/da91751b-45be-4449-8883-70be84950209/image.png" alt=""></p>
<p>subgraph를 induced하는 과정에 대해 알아보겠습니다. motif of interest가 주어졌을 때, network에서 해당 subgraph가 나타나는지 찾아볼 수 있습니다. 주어진 motif는 3개의 node와 2개의 edges로 이루어져있는데, 빨간선의 subgraph에서는 3개의 edges로 이루어져있기 때문에 해당 motif라고 할 수 없으며 파란선의 subgrpah가 주어진 motif와 pattern이 동일하다고 할 수 있습니다.</p>
<p>즉, 빨간선의 subgraph는 내가 가지고 있는 pattern에 존재하지 않기 때문에 induced(유도)되지 못한다..라고 이해했습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/00b39751-5cc7-42cf-95d0-045320e9cb78/image.png" alt=""></p>
<p>두번째는 recurrence의 개념을 정의하는 것입니다. recurrence의 개념은 중복을 허용하여 주어진 motif의 패턴이 몇 번 발견되는지 입니다. 위와 같이 어떠한 motif가 주어졌을 때, 다음과 같은 graph에서는 해당 motif가 4번 발견됩니다. node의 중복을 허용하기는 하지만 결과적으로 발견된 4개의 motif는 다르다고 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/5868af31-fafd-44cd-8e67-e107ce3a5f30/image.png" alt=""></p>
<p>다음으로는 significance를 계산하는 과정을 가집니다. significance를 계산하는 핵심 아이디어는 비교하고자 하는 network와 랜덤 생성된 network에서 주어진 motif의 발생 빈도를 비교하는 것입니다.</p>
<p>그림을 보면 좌측의 target network에서는 주어진 motif(feed-forward loop)가 많이 발견되었고 우측의 랜덤하게 생성된 network에서는 거의 발견되지 않습니다. 이렇게 랜덤 생성된 network와 비교했을 때, 해당 motif는 target network에서 over-represented 혹은 over-expressed 되었다고 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/59d357df-baba-4ce9-af0a-5548bb86931c/image.png" alt=""></p>
<p>significance는 본질적으로 그저 z-score의 개념을 의미합니다. 랜덤 생성된 network에서 발견된 motif의 발생 빈도의 평균과 표준편차를 사용하게 됩니다. 여기서 랜덤 생성된 network를 일반적인 모집단과 같이 생각하는 것으로 이해했습니다.</p>
<p>다음으로 network significance profile를 정의하는 방법이 있습니다. z-score를 z-score의 제곱근의 합으로 나눠줌으로써 해당 motif의 SP, Significance Profile을 구할 수 있습니다.</p>
<p>SP를 계산할 수 잇는 방법에 대해서 학습하게 되었습니다. 그러나 아직 랜덤 그래프를 생성하는 방법에 대해서는 모르며 랜덤 그래프를 생성할 어떠한 null model이 좋은지에 대해서도 생각해보아야 합니다. 만약 null model을 가지고 있다면, 우리는 다수의 랜덤 그래프를 생성할 수 있고 significance 계산을 위한 모집단의 평균과 표준편차를 구할 수 있습니다. 그러므로 다음에 다룰 내용은 어떻게 랜덤 그래프를 생성하는지에 대한 방법입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/ae23edf7-07c0-4208-81b5-10a05a8fa18d/image.png" alt=""></p>
<p>우리는 랜덤 그래프를 생성하고자 합니다. 주어진 degree sequence를 사용하여 랜덤 그래프를 생성할 수 있는데, 이 degree sequence는 real graph(target?)에서 온다고 합니다. </p>
<ul>
<li><strong>Spoke</strong></li>
</ul>
<p>nodes가 존재할 때, 각 node는 주어진 degree를 가지고 있습니다. 이 degree는 spokes라는 half edges 개수를 의미하는 것으로 이해했습니다. half edges가 존재하는 nodes를 연결함으로써 랜덤 그래프를 생성할 수 있습니다.</p>
<p>노드를 하나의 파티션으로 생각하게 되었을 때, 각 파티션끼리 한번 이상의 연결이 존재하게 되면 두 노드 간 edge를 형성하고 우측과 같은 랜덤 그래프가 생성될 수 있습니다.</p>
<p>이러한 방법은 랜덤 그래프를 생성하는 굉장히 빠르고 효율적인 방법입니다. 하지만 Spoke를 이용한 Configuration Model generation은 ‘Double Edges’나 ‘Self-loops’는 고려하지 못해 기존의 주어진 degree sequence를 유지하지 못한다는 단점이 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/3367d4e9-5760-414f-b5e1-d2f2f02b4e60/image.png" alt=""></p>
<ul>
<li><strong>Switching</strong></li>
</ul>
<p>Switching은 보다 expensive한 방법이지만 주어진 degree sequence를 정확하게 유지할 수 있는 방법입니다. 아이디어는 랜덤 edge 쌍을 선택하여 cross하는 방법입니다. (A-B), (C-D)라는 edge 쌍을 선택하게 되었을 때, endpoint를 cross하게 되면 (A-D), (B-C)라는 새로운 쌍이 나타나게 됩니다.</p>
<p>이렇게 주어진 edge를 교체(swap)하는 느낌으로 랜덤 그래프를 생성하게 되면 주어진 degree sequence는 철저히 준수할 수 있게 됩니다. 그러나 해당 rewiring화는 과정은 spoke 방법에 비해 매우 느립니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/02397412-28e3-4abf-94c2-0574ec82655f/image.png" alt=""></p>
<p>일반적으로 랜덤 그래프를 생성할 때에는, 10,000개에서 100,000개 이상의 랜덤 그래프를 생성한다고 합니다. 보통 real graph의 크기에 따라 생성되는 그래프의 개수가 달라지긴 합니다.</p>
<p>랜덤 그래프를 생성한 이후에는 real(target) graph에 존재하는 subgraph의 significance를 모두 구할 수 있고 가장 높은 significance를 가지고 있는 subgraph를 해당 graph의 network motif라고 할 수 있습니다.</p>
<h2 id="3-graphlets-node-feature-vectors">3. Graphlets: Node feature vectors</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/371e06d6-2574-4b5c-bec4-b795a85a67b4/image.png" alt=""></p>
<p>3번째 목차에서 배울 내용은 Graphlets라고 불리는 network motif의 extension입니다. graph motif의 개념을 사용하여 전체 network를 특징화할 수 있습니다. Graphlets의 개념을 사용한다면 주어진 node를 특징화할 수 있습니다. 주어진 node를 바탕으로 network 구조를 설명할 수 있게 됩니다.</p>
<p>전체 network에 대해서 다루기 전에, 네트워크 구성요소를 보고 node와 node 주변을 볼 수 있는데, graphlets에 의해 captured 된다고 합니다.</p>
<p>graphlets은 non-isomorphic한 subgraphs를 의미하며 위와 같은 subgraphs가 있습니다. </p>
<p><img src="https://images.velog.io/images/jinseock95/post/d8479a41-fa91-450f-b9cb-d649857970d6/image.png" alt=""></p>
<p>이러한 graphlets을 통해 node-level representation을 얻을 수 있습니다. motif가 전체 network에서 subgraph에 대한 metric이면, graphlets은 node에 대한 node-level subgraph metric이라고 할 수 있습니다.</p>
<p>여기서도 degree 개념이 차용되는데 노드의 인접한 edges의 개수라고 볼 수 있습니다. graphlet degree vector(GDV)는 주어진 노드가 연결된? 속한? graphlet의 개수</p>
<p><img src="https://images.velog.io/images/jinseock95/post/d5dfcfb4-14fb-44a8-a83a-611c02f60ca8/image.png" alt=""></p>
<p>automorphism orbit은 주어진 subgraph에서 symmetries, 대칭성을 고려해줍니다. 여기서 graphlet degree vector(GDV)는 각 orbit position에서 node의 빈도에 대한 벡터를 의미합니다.</p>
<p>v 노드를 기준으로 GDV를 구하게 되면 c가 v 노드라고 가정했을 때 해당 graphlet이 존재할 수 없기 때문에 0번 발견됩니다. </p>
<p><img src="https://images.velog.io/images/jinseock95/post/d20c1296-f34e-4a0c-87c5-004980c46bfc/image.png" alt=""></p>
<p>이런식으로 GDV는 하나의 노드를 기준으로 73개의 차원으로 구성된 벡터라고 할 수 있습니다. 그렇기 때문에 이 벡터를 가지고 노드를 특징화할 수 있으며 다양한 것에 활용해볼 수 있습니다.</p>
<h2 id="4-finding-motifs-and-grphlets">4. Finding Motifs and Grphlets</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/f4e3b4e0-5263-42ab-8523-7b5e0f604343/image.png" alt=""></p>
<p>그렇다면 어떻게 motifs와 graphlets를 발견할 수 있을까요. 그리고 수학적으로 어떻게 motifs와 graphlets을 계산하여 식별할 수 있을까요. motifs와 graphlets을 발견하기 위해서는 2가지 challenges를 해결해야 합니다.</p>
<p>K-size의 motifs와 graphlets을 찾는다고 가정한다면, 2가지 단계를 거치게 됩니다.</p>
<ul>
<li>Enumerating: K-size의 가능한 모든 subgraphs를 찾는 과정</li>
<li>Counting: 찾은 모든 subgraphs의 occurrences를 세는 과정</li>
</ul>
<p>하지만 이 과정에서 매우 복잡한 computational problem인 np-complete 문제가 발생하게 됩니다. 보통 motifs와 graphlets가 5개에서 8개의 노드로 구성되면서 combinatorial explosion이 발생되기 때문입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/a4cf5b28-706a-4b90-9063-f5f42d286c82/image.png" alt=""></p>
<p>이번 강의에서는 Enumerating과 Counting을 위한 방법으로 2006년에 제안된 ESU 알고리즘을 다루게 됩니다. </p>
<p>ESU 알고리즘은 v 노드를 시작으로 새로운 노드를 추가해나가면서 subgraph를 만들어나가는 과정을 거칩니다. ESU 알고리즘은 재귀적 구조를 가지고 있으며 현재 시점의 subgraph를 저장하는 $V_{subgraph}$와 motif를 확장하기 위한 후보 노드를 보관하고 잇는 $V_{extension}$로 구성되어 있습니다. $V_{extension}$의 후보 노드가 $V_{subgraph}$로 이동하게 되면서 state가 업데이트되는 과정에서 재귀 구조가 발생한다고 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/9afcd123-71f2-4006-bc10-7d7a6b20decd/image.png" alt=""></p>
<p>ESU 알고리즘의 수도코드는 위와 같습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/4e8d7dd1-e096-46f8-87c7-f5592667b6ed/image.png" alt=""></p>
<p>예시를 확인하게 되면 보다 쉽게 이해할 수 있습니다. 1번~5번의 노드로 구성되어 있는 그래프 G가 있을 때, k개의 depth(노드 개수)의 subgraphs를 추출할 수 있습니다. 먼저 각 노드를 시작점으로 생각하면 자연스럽게 확장 가능한 후보 노드를 $V_{extension}$에 저장할 수 있게 됩니다.</p>
<p>1번 노드를 시작으로 하게 된다면 1번 노드와 연결되어 있는 3번 노드가 $V_{extension}$에 추가될 것이고 아직 $V_{subgraph}$의 개수가 3이 되지 않았기 때문에 후보 노드 중 하나를 추가하는 재귀가 발생하고 $V_{subgraph} = {[1,3]}$이 되면서 3번 노드와 연결되어 있는 2,4,5번 노드가 $V_{extension}$에 추가됩니다. 그렇게 다시 한번 재귀 구조가 발생하면서 depth가 3인 subgraphs를 뽑아낼 수 있게 됩니다. 여기서 주의해야할 점은 후보 노드는 항상 시작 노드 v보다 크게 함으로써 중복을 피할 수 있게 됩니다.</p>
<p>이렇게 가능한 subgraph를 찾는 과정이 Enumerating 과정입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/ad991201-69f3-42f4-bc9c-cfc33f132980/image.png" alt=""></p>
<p>다음 단계는 Counting 과정입니다. count를 하는 기준은 non-isomorphic한 graph를 토대로 subgraphs의 개수를 세주는 것입니다. 즉, 3개의 노드와 2개의 edge로 구성되어 있는 subgraph는 topologically equivalent한 isomorphic한 graph이기 때문에 해당 구조가 총 5번 나왔다고 할 수 있으며, 이 때 isomorphic을 구별하기 위해 Mckay&#39;s nauty algorithm을 사용했다고 합니다.</p>
<h2 id="5-structural-roles-in-networks">5. Structural Roles in Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/177eaf6d-eca8-482d-89fc-c3c08e9a03d2/image.png" alt=""></p>
<p><strong>Roles</strong> 은 네트워크에서 노드의 function이라고 할 수 있습니다. 일반적으로 생태계에서 종의 roles, 그리고 회사에서 개인의 roles와 같은 개념이라고 볼 수 있습니다. 회사에서 직무에 따라 부여되고 책임을 지는 roles이 달라지는 것처럼, 궁극적인 목표는 네트워크 구조에서 노드의 <strong>Roles</strong>를 식별하는 것입니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/3f411c41-4a0c-42f6-91d7-a3b9a1e64e8f/image.png" alt=""></p>
<p>Role은 네트워크에 존재하는 비슷한 위치 및 기능을 가지는 nodes의 집합을 의미하는 자료구조라고 할 수 있습니다. 여기서 강조하는 부분은 Role은 Group 혹은 Community와는 다른 개념이라고 말합니다. Role은 similar position이라는 특징을 가지지만 무조건 연결되어 있을 필요는 없다고 합니다. 하지만 Group/Community는 서로가 densely하게 연결되어 있어야 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/6480e9b5-c6ab-4b86-98e9-b96196d06fce/image.png" alt=""></p>
<p>그렇다면 similar position 혹은 similar structural properties로 네트워크 내의 Role을 판단하기 위해서 Structural equivalence라는 개념이 사용됩니다. Structural equivalence는 노드 U, V가 다른 노드와의 관계가 동일하다면 구조적으로 동등한 role로 볼 수 있음을 의미합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/0156918b-ea9b-4924-9d9d-ff8d4d19a4a0/image.png" alt=""></p>
<p>해당 예시 그래프에서 노드 3, 4가 Structural equivalence임을 알 수 있습니다. 노드 간 structural equivalence를 찾을 때에는 어느정도의 noise를 감안하기도 합니다.</p>
<h2 id="6-discovering-structural-roles-in-networks">6. Discovering Structural Roles in Networks</h2>
<p><img src="https://images.velog.io/images/jinseock95/post/0d63f06d-80a6-4734-8a2b-f6ba22b56069/image.png" alt=""></p>
<p>Roles은 네트워크 구조에 존재하는 노드의 서로 다른 특징을 구별해주기 때문에 매우 중요합니다. 또한 노드의 Roles를 가지고 위와 같은 여러 과제를 수행할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/97c6b173-5979-42b6-b694-140bdf4078c9/image.png" alt=""></p>
<p>각 노드의 네트워크 구조 상 roles를 자동으로 찾아주는 방법으로 RolX가 있습니다. 해당 접근법은 unsupervised learning 방법에 속하며, 사전 정보를 요구하지 않습니다. 그리고 각 node에 mixture of roles를 부여하게 됩니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/dad3cd75-5b96-4323-9e2b-1ce6e48266fa/image.png" alt=""></p>
<p>RolX에서 node의 role를 추출하는 과정은 다음과 같습니다.</p>
<ul>
<li>Node * Node 인접 행렬을 생성합니다.</li>
<li>모든 Node별 재귀 구조를 통해 descriptor를 생성해줍니다.</li>
<li>그 다음 Node * Feature(descriptor)이라는 새로운 행렬을 만들어줍니다.</li>
<li>Role Extraction을 통해 Node별 Role에 대한 행렬과 Role을 설명해주는 Role * Feature 행렬이 output으로 나오게 됩니다.</li>
</ul>
<p><img src="https://images.velog.io/images/jinseock95/post/ef29d7f0-f36f-4ee6-ac23-79f92649e652/image.png" alt=""></p>
<p>node에서 feature를 추출해내는 재귀 구조에 대해서 한번 알아보도록 하겠습니다. 어떠한 재귀 구조가 형성되는지 언급하지는 않았지만 개인적으로는 인접 행렬의 정보를 기반으로 feature를 추출할 것이라고 이해했습니다. 결과적으로 Node * Feature 행렬이 만들어 지는데, node와 local network에 대한 정보와 neighborhood 정보, 그리고 노드와의 연결성에 대한 recursive 정보까지 포함한다고 말합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/89cec6cc-0de9-4db1-bba5-dcdf13664770/image.png" alt=""></p>
<p>이러한 feature extraction의 핵심 아이디어는 노드의 정보를 모아 새로운 recursive features를 생성하는 것이라고 할 수 있습니다.</p>
<ul>
<li><p>Local Features: 노드의 차수에 대한 모든 측정치</p>
<ul>
<li>방향 그래프라면, include in- and out-degree, total degree</li>
<li>가중 그래프라면, include weighted feature versions</li>
</ul>
</li>
<li><p>Egonet Features: 노드의 egonet에서 계산되는 값</p>
<ul>
<li>Egonet은 노드에서 유도된 subgraph의 노드와 이웃 그리고 모든 edges를 포함합니다.</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/jinseock95/post/ee587a82-5b04-4ff4-9943-e0ed4d4317df/image.png" alt=""></p>
<p>base set of features 가 형성되었으면 집계를 통해 features를 더욱 확장시킬 수 있습니다. mean과 sum 이라는 2개의 집계 함수를 사용해서 이웃 노드의 평균 차수 혹은 이웃 노드 차수의 합 등과 같은 feature를 계속해서 늘려나갈 수 있게 됩니다. </p>
<p>그런데 재귀를 돌 때마다, 계산해야할 features의 수가 급증하기 때문에 pruning technique이라는 기법을 통해 features의 수를 줄일 수 있다고 합니다.</p>
<p><img src="https://images.velog.io/images/jinseock95/post/e3ef2671-7594-4c4b-afd7-d12ef678e98d/image.png" alt=""></p>
<p>각 노드별로 노드를 표현할 수 있는 features가 벡터로 표현되었다면 clustering을 통해 Roles를 표현할 수 있게 됩니다. 이 때, 다양한 접근법의 clustering을 모두 적용해볼 수 있습니다. clustering 결과를 바탕으로 네트워크 상의 구조적 roles를 부여할 수 있고 role distributions을 통해 노드 간 유사도 또한 계산해볼 수 있습니다. </p>
<h2 id="참고-자료">참고 자료</h2>
<ul>
<li><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter3.">Tobigs graph study, Chapter3. Motifs and Structural Roles in Networks</a></li>
<li><a href="https://data-weirdo.github.io/data/2020/08/31/data-graph-03.motifs/">데이터 괴짜, CS224W - 03.Motifs and Structural Roles in Networks</a></li>
<li><a href="https://medium.com/@zxzxs9182/cs224w-3%EA%B0%95-%EC%A0%95%EB%A6%AC-motifs-and-structural-roles-in-networks-7fb6df05d647">이현준, cs224w 3강 정리( Motifs and Structural Roles in Networks)</a></li>
<li><a href="https://wikidocs.net/92827">Wikidocs, 03-02 Finding motifs and graphlets</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2. Properties of Networks and Random Graph Models]]></title>
            <link>https://velog.io/@tobigs-gnn1213/CS224W-Lecture-2-Properties-of-Networks-and-Random-Graph-Models</link>
            <guid>https://velog.io/@tobigs-gnn1213/CS224W-Lecture-2-Properties-of-Networks-and-Random-Graph-Models</guid>
            <pubDate>Wed, 10 Feb 2021 09:03:43 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/cryingjin">이예진</a></p>
<blockquote>
</blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
<li>Network Properties: How to Measure a Network </li>
<li>Real-World Networks (MSN Messenger) </li>
<li>Erdos-Renyi Random Graph Model</li>
<li>The Small-World Model</li>
<li>Kronecker Graph Model</li>
<li>Summary</li>
</ol>
<hr>
<h1 id="properties-of-networks-and-random-graph-models">Properties of Networks and Random Graph Models</h1>
<h2 id="0-intro">0. Intro</h2>
<p>이 장에서는 기본적인 Network의 속성과 Random Graph Model 들에 대해서 배웁니다. 기본 속성의 개념과 용어를 숙지하는 위주로 리뷰하겠습니다.</p>
<blockquote>
<p><strong>Keyword</strong>
<code>degree distribution</code>,<code>path length</code>,<code>clustering coefficient</code>, <code>connected components</code>,<code>random graph model</code>, <code>small-world</code>, <code>kronecker graph</code>   </p>
</blockquote>
<h2 id="1-network-properties-how-to-measure-a-network">1. Network Properties: How to Measure a Network</h2>
<p>Network 속성들, 즉 어떻게 Network를 정량적으로 측정하는지 알아보겠습니다.
크게 <strong>4가지</strong> 방법이 있습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/b6a8379e-6b18-4496-9e96-f0e08977c144/image.png" alt=""></p>
<h3 id="1-degree-distribution--pk">(1). Degree distribution : P(k)</h3>
<p>degree distribution (차수 분포) 입니다. node에 연결 된 엣지의 갯수가 degree k 라고 할 때, 무작위로 선택한 node 가 k개의 차수를 가지고 있는 확률을 P(k) 라고 합니다.
N_k 는 degree 가 k 인 노드의 수 이고, 이를 Normalize 해서 P(k)를 구합니다. histogram 으로 나타내면 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/0e0a270f-8176-4a30-9779-a8324c40215c/image.png" alt=""></p>
<h3 id="2-paths-in-a-graph---경로">(2). Paths in a Graph - 경로</h3>
<p><strong>Path</strong> : 각 노드가 다른 노드와 연결된 연속성을 경로라고 합니다. 
<img src="https://images.velog.io/images/tobigs-gnn1213/post/bbf210fa-6fc8-49db-8b51-b305df7baf39/image.png" alt="">
<strong>Distance(거리)</strong> : 연결된 node들의 가장 짧은 경로 입니다.<br>directed graphs 에서는 방향을 고려합니다.
<strong>Network Diameter(직경)</strong> : 그래프에서 노드 간의 최대거리입니다. 어떤 그래프에서 Path의 최대값. 가장 먼 두 node의 거리를 나타내주는 값이라고 생각하면 됩니다. 
<strong>Average path length</strong> : directed graph에서 평균 경로 길이를 나타낼 수 있습니다. </p>
<h3 id="3-clustering-coefficient---결집계수">(3). Clustering Coefficient - 결집계수</h3>
<p>Clustering Coefficient 는 undirected graphs 에서 사용됩니다. 
페이스북 소셜 네트워크 같은 곳에서 사용할 수 있습니다.</p>
<p>핵심 아이디어는 *<U>노드 i 의 이웃들은 서로 얼마나 연결되어 있을까?</U>* 입니다.</p>
<p>Clustering Coefficient 는 C 로 나타내고 0~1 사이 값을 가집니다.
노드 i 에 대한 C를 구하는 공식은 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/0733862b-f089-4fe8-a29d-52da38efaee2/image.png" alt="">
노드 i 의 이웃이 실제로 연결된 엣지 갯수 <strong>(e_i)</strong> 를 이웃 차수로 가질 수 있는 경우의 수 <strong>(k_i)(k_i -1)</strong>로 나눠줍니다. 
-&gt; 두번째 경우, i 의 이웃은 4개의 노드가 있습니다. 이 이웃들이 실제로는 3개의 연결된 엣지를 가지고 있기 때문에 분모는 2x3 이고, 분모는 경우의 수 4x3이 됩니다. </p>
<p><strong>Average clustering coefficient</strong> : 평균 결집계수는 각 노드의 C를 구한 값을 평균내서 구할 수 있습니다.</p>
<h3 id="4-connectivity---연결성">(4). Connectivity - 연결성</h3>
<p>연결된 구성요소 중에 가장 큰 크기 입니다. BFS(너비우선탐색) 알고리즘으로 찾습니다.
<strong>Lagest component = Giant component</strong>
(뒤에서는 GCC라고 언급하기도 합니다.)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/39b3cd69-2096-4b68-8f4c-1e765b606dd5/image.png" alt=""></p>
<h2 id="2-real-world-networks-msn-messenger">2. Real-World Networks (MSN Messenger)</h2>
<p>이 네 가지 네트워크 속성이 Real-World Networks 에서는 어떻게 측정되는지 MSN Messenger 예시를 보도록 하겠습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/c2a2986b-4ec2-48e7-9be4-a6104af2b252/image.png" alt=""></p>
<h4 id="1-degree-distribution">1. Degree Distribution</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/254a9e39-937f-4e83-b827-9741756cdfac/image.png" alt="">
정의대로 분포를 시각화하면 분포가 잘 보이지 않아서 로그 스케일링한 log-log degree distribution을 보겠습니다. 대부분의 사람들이 10^3 정도에 몰려서 분포해 있고, 몇몇의 사람들이 더 높은 연결 수(degree k)를 가지고 있습니다.</p>
<h4 id="2-clustering">2. Clustering</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/637107e3-37c0-4e62-82bf-cd7a5ee8a176/image.png" alt=""></p>
<ul>
<li>평균 결집 정도는 0.1140 입니다. 크다, 작다 판단 보다는 그냥 숫자로 이해해야합니다.</li>
<li>C와 K간의 기울기를 보면 반비례함을 알 수 있습니다. degree 가 높은 node 일 수록, 이웃들 간의 연결(결집계수 C) 는 작아진다는 것을 의미합니다.</li>
</ul>
<h4 id="3-connected-components">3. Connected Components</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/7b3ed768-885c-49de-915d-3ab8470bb6dc/image.png" alt="">
largest component(giant component)는 99.9% 의 노드들을 가진 큰 component임을 알 수 있습니다.</p>
<h4 id="4-diameter-of-wcc">4. Diameter of WCC</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/e593a2ee-a50a-4cea-8032-fd6e2125ad2a/image.png" alt=""></p>
<h3 id="msn의-network-properties">MSN의 Network Properties</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/8df54a30-4034-421c-a071-ac236df8b419/image.png" alt=""></p>
<h3 id="another-example-ppi-network-protein-protein-international-network">Another example: PPI Network (protein protein international Network)</h3>
<p>(다른 도메인인데도 비슷하다!)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/4d142ed1-16f3-450c-97a5-622ba4f84199/image.png" alt=""></p>
<h2 id="3-erdos-renyi-random-graph-model">3. Erdos-Renyi Random Graph Model</h2>
<p>Erdos-Renyi Random Graph Model 을 보겠습니다. 2가지 종류로 나뉩니다. 
<img src="https://images.velog.io/images/tobigs-gnn1213/post/10234c56-2a40-43ba-8cd7-91897eaaaa4d/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/aa808b42-58a5-496a-a382-9e3c2fe1f8aa/image.png" alt=""></p>
<p>중점적으로 살펴볼 <strong>G_np</strong> 는 undirected graph에서 n개의 node들이 있을 때, 각 edge(u,v)의 확률 p가 iid 임을 가정합니다. (independent identically distributed, 상호독립 &amp; 동일한 확률분포 가짐)</p>
<p>*<U>이 그래프 모델이 어떤 network를 만드는지 살펴보겠습니다.</U>*</p>
<h4 id="random-graph-model">Random Graph Model</h4>
<p>Random Graph Model은 n개의 노드와 확률 p를 가지지만 그래프를 unique 하게 정의하지는 않습니다. (생성할 때 마다 다른 모양)</p>
<p>그럼 랜덤그래프를 앞에서 배운 4가지 속성으로 평가해보겠습니다.</p>
<h4 id="1-degree-distribution-1">1. Degree Distribution</h4>
<p>random graph model <strong>G_np</strong> 의 degree distribution은  binomial(이항분포)을 따릅니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/88ddae9c-a785-4c4d-b924-84041650cb08/image.png" alt=""></p>
<p>degree k의 평균과 분산도 이항분포의 공식으로 나타낼 수 있습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/68840e61-0fcb-4714-aaee-ff0d3a089acb/image.png" alt=""></p>
<h4 id="2-clustering-coefficient">2. Clustering Coefficient</h4>
<p>C = 2*e_i / k_i(k_i -1) 임을 기억한다면, e_i의 기댓값과 C_i의 기댓값은 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/55f53f2d-6512-4e43-b63c-6182af65b5c6/image.png" alt=""></p>
<h4 id="3-path-length">3. Path length</h4>
<p><strong>Expansion alpha</strong> : Expansion은 subset에서 edge가 퍼져나가는 정도로, 그래프에서 노드 S가 V의 부분일 때, S -&gt; V로가는 edge의 수의 최소값을 <em>Expansion alpha</em> 라고 합니다.</p>
<p>alpha를 다음과 같이 수식화 할 수 있습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/5ace98e0-6e75-407a-a386-1952e4207662/image.png" alt="">
<img src="https://images.velog.io/images/tobigs-gnn1213/post/0f62ecf5-0dc9-4974-96f9-4a6c6ffd88ff/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/82d78620-57f4-42c9-b7e3-5a8e2666ee7f/image.png" alt="">
처음 s개의 노드를 정하고 각각의 노드와 (α⋅S) edges로 연결된 노드들을 구한다. 그 다음, 새롭게 연결된 노드들까지 포함하여 S′ 노드들을 다시 하나의 subset으로 보고 (α⋅S&#39;) edges로 연결된 노드들을 구한다. 이렇게 모든 노드들을 방문할 때까지 반복하여 path를 구할 수 있다. path length는 O((log n)/α) 다. 우측 그림에서 노드 수가 증가할때 shortest path는 log 함수 형태로 증가함을 볼 수 있다.</p>
<p><U>즉 그래프 크기에 비해 짧은 경로들을 가지게 된다.</U></p>
<h4 id="4-connectivity">4. Connectivity</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/0295a351-0d57-442e-8ed8-d710f7f68d51/image.png" alt="">
확률 p 에 변화에 따른 랜덤그래프의 구조는 위와 같은데, 확률이 커질 수록 (1에 가까울 수록) 모든 노드가 서로 연결되어 있는 Complete graph가 된다. </p>
<h4 id="5-비교">5. 비교</h4>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/eca23da1-c9ca-4e49-97b6-270f06feab5a/image.png" alt="">
랜덤 그래프 모델과 실제 네트워크 (MSN) 을 비교해보면 Average Path length 와 Largest Connected Component에 대한 속성은 비슷하고 Degree distribution 과 Clustering Coefficient 은 달랐습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/fbcee759-d585-4be7-9166-6afe3c87aae2/image.png" alt=""></p>
<h4 id="problems-with-random-networks-model">Problems with random networks model</h4>
<ul>
<li>Degree distribution이 실제 네트워크들과 다름</li>
<li>실제 네트워크의 Giant component는 phase transition을 통해 나타나지 않음 </li>
<li>local structure 가 없음. (=clustering coefficient가 너무 낮다.)</li>
</ul>
<p>근본적으로 real world 가 random 이 아니기 때문에 완전히 fit 될리가 없습니다. </p>
<h2 id="4-the-small-world-model">4. The Small-World Model</h2>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/432260d9-4a43-4ac7-a7a2-ffec853a4163/image.png" alt="">
<U>실제 Real world는 random graph model과 다르게 <strong>High Clustering</strong>을 유지하면서 <strong>small diameter</strong>를 유지합니다. </p>
<p>이러한 모델을 만들기 위해서 <strong>Small-World model</strong> 을 설명합니다.</U></p>
<p>small-world model 중에 <strong>Watts-Strogatz</strong> 를 살펴봅니다.</p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/42c872f5-b493-465a-935b-86a2f344a76e/image.png" alt="">
Low-dimensional regular lattice 에서 <strong>rewiring</strong>을 해준다면 절충되는 그래프를 만들 수 있습니다.</p>
<p>Low-dimensional regular lattice는  주변노드끼리만 이어져있는 네트워크를 의미한다. 즉, High clustering이고 따라서 High diameter입니다. </p>
<p>행운의 편지 전달에서 끼리끼리 그룹의 친구에게만 공유하는 것이 아니라 가끔은 별로 안친한 그룹의 친구에게 전달하는 것과 같습니다.</p>
<h2 id="5-kronecker-graph-model">5. Kronecker Graph Model</h2>
<p>오늘 강의의 3번째 모델로는 Kroneckr Graph Model을 살펴보겠습니다.</p>
<p>*<U>핵심 아이디어는 Self-similarity (자기 복제)를 통한 재귀적 그래프 생성입니다. </U>*
<img src="https://images.velog.io/images/tobigs-gnn1213/post/87e40758-13e4-4bfb-b2f5-04dc51ce45d9/image.png" alt=""></p>
<p>Kronecker Graph의 구조는 위와 같이 <strong>recursive model</strong> 입니다. </p>
<p><strong>Kronecker Product</strong> : 인접행렬간의 행렬곱을 위와 같이 정의합니다.</p>
<h4 id="stochastic-kronecker-graphs">Stochastic Kronecker Graphs</h4>
<p>0,1 이 아니라 확률적으로 이루어진 Stochastic Kronecker Graphs는 아래와 같이 생겼는데, 하나의 graph를 생성하기 위해서 사건을 너무 많이 시행해봐야하는 문제점이 있습니다. (동전 던지기를 너무 많이 해봐야함)</p>
<p>-&gt; 이는 노드 수가 증가하면서 run time 에 많은 영향을 주기 때문에 빠르게 생성하는 방법을 고안했습니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/dbc64155-d93b-467f-b640-ce821390e9bf/image.png" alt=""></p>
<h4 id="stochastic-kronecker-graphs-1">Stochastic Kronecker Graphs</h4>
<p><strong>Drop Edge</strong> : 빠르게 Kronecker graphs를 만드는 방법은 그래프에 edge 를 하나씩 &#39;drop&#39;하는 것입니다. (재귀적인 특성 이용)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/25bf51d6-ac20-4c09-8a3e-4e7a04d5bbf5/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/b92002cd-4d34-4901-99e7-6469945e72a8/image.png" alt="">
재귀적으로 drop을 반복합니다.
<img src="https://images.velog.io/images/tobigs-gnn1213/post/47edf895-46f9-4788-9ff1-0fad860a1a2f/image.png" alt="">
Fast Kronecker generator algorithm을 정리하면 위와 같습니다. 
신기하게도 Kronecker 는 real-world 와 아주 닮아있습니다. </p>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/4d9ff607-0c53-4bf7-962f-771d51510e84/image.png" alt="">
결론적으로 <strong><em>Kronecker Graph Model</em></strong> 은 확률적인 속성을 가지고, 적은 파라미터를 사용해서 real world에 잘 fitting 시킬 수 있다는 장점이 있습니다. </p>
<p>(Kronecker의 MLE와 자세한 유도는 <a href="http://www.cs.cmu.edu/~jure/pub/kronecker-cornell-Sept08.pdf">http://www.cs.cmu.edu/~jure/pub/kronecker-cornell-Sept08.pdf</a> 
여기에 나와있습니다.)</p>
<h2 id="6-summary">6. Summary</h2>
<p>*<U>Graph Model의 4가지 속성에 대해서 배우고, 실제 예시에 대입해봤습니다.
실제 real-world를 설명할 수 있는 graph model 만들기 위해서 random graph model, small-world model, kronecker graph model에 대해서 배웠습니다.  </U>*</p>
<h2 id="reference">Reference</h2>
<p><a href="https://tobigs.gitbook.io/tobigs-graph-study/chapter2">https://tobigs.gitbook.io/tobigs-graph-study/chapter2</a>.
<a href="https://leejunhyun.github.io/deep%20learning/graph/2019/03/05/CS224W-02/">https://leejunhyun.github.io/deep%20learning/graph/2019/03/05/CS224W-02/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1. Introduction; Structure of graph]]></title>
            <link>https://velog.io/@tobigs-gnn1213/1.-Introduction-Structure-of-graph</link>
            <guid>https://velog.io/@tobigs-gnn1213/1.-Introduction-Structure-of-graph</guid>
            <pubDate>Wed, 10 Feb 2021 05:51:30 GMT</pubDate>
            <description><![CDATA[<h3 id="networks">Networks</h3>
<p><strong>Network</strong>: graph representation with data</p>
<ul>
<li>네트워크는 서로 상호작용하는 entity 간 복잡한 시스템을 설명할 수 있는 범용 언어임</li>
<li>표현하고자 하는 object를 선으로 연결함으로써 network를 만듦</li>
<li>데이터 가용성을 고려하였을 때 다양한 도메인에서 사용될 수 있음<ul>
<li>web/mobile, bio, health, medical, etc.</li>
</ul>
</li>
<li>Impact!    <ul>
<li>social network, drug design, AI reasoning</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/1bea6b0b-8783-42bb-9568-7c51aac04bbe/image.png" alt=""></p>
<h3 id="many-types-of-networks">Many types of networks</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/2c726a7a-a535-48b2-b22c-d0eaa8b57144/image.png" alt=""></p>
<ul>
<li>모든 network는 저마다 object가 의미하는 바가 다르며, 그들간의 관계 또한 다름</li>
<li>주어진 network를 이해하지 못하면 모델링을 할 수 없음! (투빅스1강이 EDA인 이유)</li>
</ul>
<h3 id="ways-to-analyze-networks">Ways to Analyze Networks</h3>
<ul>
<li>Node classification</li>
<li>Link prediction</li>
<li>Community detection</li>
<li>Netwrok similarity</li>
</ul>
<h2 id="structure-of-graphs">Structure of Graphs</h2>
<h3 id="components-of-a-network">Components of a Network</h3>
<ul>
<li>Objects <strong>N</strong>: nodes, vertices        </li>
<li>Interactiosn <strong>E</strong>: links, edges        </li>
<li>System <strong>G(N, E)</strong>: network, graph        </li>
</ul>
<h3 id="networks-or-graphs">Networks or Graphs?</h3>
<ul>
<li><p>Network: real system</p>
<ul>
<li>web, social network</li>
<li>Language: network, node, drug network</li>
</ul>
</li>
<li><p>Graph: netwowrk의 수학적 표현</p>
<ul>
<li>web graph, social graph</li>
<li>Language: graph, vertex, edge</li>
</ul>
</li>
<li><p>서로 경계가 모호하기때문에 일반적으로 혼용하는 편!</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/215a4901-aff4-4af2-a2d7-46628f4f21a5/image.png" alt=""></p>
<h2 id="choice-of-network-representation">Choice of Network Representation</h2>
<h3 id="direction-of-edges">Direction of edges</h3>
<ul>
<li>Undiredcted graph: 링크가 양방향인 그래프<ul>
<li>EX) collaborations, friendship </li>
</ul>
</li>
<li>Directed graph: 링크에 특정 방향이 주어지는 그래프<ul>
<li>citation/quotation, 인스타 DM, 팔로잉, 좋아요 
<img src="https://images.velog.io/images/tobigs-gnn1213/post/59997f1a-ac4a-466f-a004-1be2172d3d83/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="node-degrees">Node Degrees</h3>
<ul>
<li>Degree(차수): 노드에 부속되어 있는 link의 수</li>
<li>Undirected graoph의 평균 차수
$\overline k = {1 \over N}\displaystyle\sum_{i=1}^{N} k_i = {2E \over N}$    ($E$=edge 개수, $N$=node 개수, $k_i$=i째 node의 차수)
<img src="https://images.velog.io/images/tobigs-gnn1213/post/28b39857-8fe6-4f2b-9622-0a726220bd11/image.png" alt=""></li>
<li>위의 예시에서는  $k_A=4$</li>
<li>Directed의 경우는 in-degree와 out-degree가 구분됨 <ul>
<li>전체 차수는 두 가지 degree 총합임 
$\overline k={2E \over N}$</li>
</ul>
</li>
</ul>
<h3 id="complete-graph">Complete Graph</h3>
<ul>
<li>undirected graph의 최대 edge 개수 $E_{max}={N(N-1) \over 2}$</li>
<li><strong>Complete graph</strong>: 최대 edge개수를 가진 undirected grpah
<img src="https://images.velog.io/images/tobigs-gnn1213/post/50b4d287-d43b-4403-a32d-62e51ab0ae09/image.png" alt=""></li>
</ul>
<h3 id="bipartite-graph">Bipartite Graph</h3>
<ul>
<li><strong>Bipartite graph</strong>: 서로 다른 종류의 독립된 노드들로 구성된 그래프<ul>
<li>두 가지 노드 타입 <strong><em>U</em></strong>, _<strong>V</strong>_로 나눌 수 있음</li>
<li><strong><em>U</em></strong>에 속하는 노드는 <em><strong>V</strong>_에 속한 노드에게만 연결되고 **_U</em>**끼리는 독립임</li>
<li><em><strong>V</strong>_에 속하는 노드는 **_U</em><strong>에 속한 노드에게만 연결되고 _</strong>V**_끼리는 독립임</li>
</ul>
</li>
<li>Bipartite graph는 실제 도메인에서 많이 나타나는 구조이며, 특히 추천시스템에서 많이 사용되는 개념임
<img src="https://images.velog.io/images/tobigs-gnn1213/post/66e08d82-3992-4adf-8a6e-dfdc13565807/image.png" alt=""></li>
</ul>
<h2 id="representing-graphs">Representing Graphs</h2>
<h3 id="adjacency-matrix">Adjacency Matrix</h3>
<ul>
<li>Adjacency Matrix(인접행렬): 그래프를 연결 유무를 1과 0으로 나눠 행렬로 표현한 것</li>
<li>Undirected의 경우 대칭으로 나타나며 Undirected는 단방향일 수 있기 때문에 대칭이 아닐 수도 있음</li>
<li>노드가 많아질 수록 즉, 행렬의 차원이 커질 수록 Sparse해진다는 단점이 있음
<img src="https://images.velog.io/images/tobigs-gnn1213/post/f42a61b8-b6f4-474e-82a7-3a3b168af13b/image.png" alt=""></li>
</ul>
<h3 id="edge-list">Edge list</h3>
<ul>
<li>Edge를 연결된 노드 쌍으로 표현한 것
<img src="https://images.velog.io/images/tobigs-gnn1213/post/c100132b-f51e-4f97-977b-a59de4265809/image.png" alt=""></li>
</ul>
<h3 id="adjacency-list">Adjacency list</h3>
<ul>
<li>출발방향의 노드를 Key값으로, 도착 노드를 Value값으로 가지는 Dictioanry형태</li>
<li>단방향이거나 거대한 그래프에서 효율이 좋음
<img src="https://images.velog.io/images/tobigs-gnn1213/post/ebe1e324-9b57-41c1-bbbd-8ef0e9f32605/image.png" alt=""></li>
</ul>
<h3 id="edge-attrbutes">Edge Attrbutes</h3>
<ul>
<li>Weight: edge에 weight를 줄 수 있음 (와인 추천 시 와인에 대한 평점을 edge에 weight 주기)</li>
<li>Ranking: 짱절친, 절친, 아는 사이</li>
<li>Type: 친구, 친척, 직장동료
<img src="https://images.velog.io/images/tobigs-gnn1213/post/d6347382-39f8-4340-a608-465f8cefbde3/image.png" alt=""></li>
</ul>
<h3 id="more-types-of-graph">More types of Graph</h3>
<p><img src="https://images.velog.io/images/tobigs-gnn1213/post/f5865a00-418f-49c1-8f1a-32ef5d235942/image.png" alt=""></p>
<h3 id="connectivity-of-undirected-graphs">Connectivity of Undirected Graphs</h3>
<ul>
<li>Connected graph(undirected): 어떤 노드에서 출발하든지 다른 모든 노드로 도착할 수 있음</li>
<li>Disconnected graph: 최소 2개 이상의 connected graph로 구성됨</li>
<li>Bridge edge: 삭제되면 connected에서 disconnected로 바꿀 수 있는 edge</li>
<li>Articulation node: 삭제되면 connected에서 disconnected로 바꿀 수 있는 node
<img src="https://images.velog.io/images/tobigs-gnn1213/post/fc8a202c-cfa1-4ba7-9c6f-1213bcf71d8d/image.png" alt=""></li>
</ul>
<ul>
<li>Disconnected의 경우 인접행렬은 block-diagonal 형태가 된다
<img src="https://images.velog.io/images/tobigs-gnn1213/post/89c7601e-4ed7-4300-9e4f-50fad9449723/image.png" alt=""></li>
</ul>
<h3 id="connectivity-of-directed-graphs">Connectivity of Directed Graphs</h3>
<ul>
<li><p>Strongly connected directed graph:  어떤 노드에서 출발하든지 <strong>edge방향을 지키면서</strong> 다른 모든 노드로 도착할 수 있음</p>
</li>
<li><p>Wealky connected directed graph: 어떤 노드에서 출발하든지 <strong>edge방향을 무시한다면</strong> 다른 모든 노드로 도착할 수 있음
<img src="https://images.velog.io/images/tobigs-gnn1213/post/a3a4715a-866d-42bd-a4d4-46e23d051f35/image.png" alt=""></p>
</li>
<li><p>Strongly connected components(SCCs): 그래프에서 부분적으로 나타나는 connected subgraph</p>
<ul>
<li>SCCs 포함유무에 따라 In-component, Out-component로 분류
<img src="https://images.velog.io/images/tobigs-gnn1213/post/899a9d9f-f73e-4e7b-95d2-e3026669d0a9/image.png" alt=""></li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>