<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>유사컴공님의 블로그</title>
    <link>https://juyang22.tistory.com/</link>
    <description>CS와 AI/ML을 공부하는 대학생입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 13 Jul 2026 03:04:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>유사컴공</managingEditor>
    <image>
      <title>유사컴공님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/7571161/attach/7d4b7985771a43c7908e670e29e0c94b</url>
      <link>https://juyang22.tistory.com</link>
    </image>
    <item>
      <title>[정보이론] 허프만 인코딩과 정보 엔트로피</title>
      <link>https://juyang22.tistory.com/entry/%EC%A0%95%EB%B3%B4%EC%9D%B4%EB%A1%A0-%ED%97%88%ED%94%84%EB%A7%8C-%EC%9D%B8%EC%BD%94%EB%94%A9%EA%B3%BC-%EC%A0%95%EB%B3%B4-%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt; &lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt; &lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt; &lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$']]} }; &lt;/script&gt; &lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt; &lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;허프만 인코딩은 정보 엔트로피와 밀접하게 연결되어있다. 정보 엔트로피의 의미는 정보를 표현하는 데에 필요한 평균 '최소' 자원량이다. 여기서 자원량은 비트로 해석할 수 있다. 여기서 중요한 건 '최소' 자원량이라는 점인데, 허프만 인코딩을 활용하여 정보를 표현하면 정보들을 이론적 '최소'자원량에 가까운 비트수로 표현 가능하기 때문이다. 허프만 인코딩은 각 기호의 등장 확률에 따라 가변 길이의 비트 코드를 부여함으로써, 전체 데이터를 표현하는 데 필요한 평균 비트 수를 최소화한다. 이는 정보 이론에서 정의하는 정보 엔트로피가 의미하는 '이론적인 최소 자원량'에 가까운 실제 값을 제공하며, 따라서 허프만 인코딩을 통해 데이터 표현에 필요한 최소 자원량을 구할 수 있다.&lt;br&gt;&amp;nbsp;&lt;br&gt;정보 엔트로피의 수식은 다음과 같다. 이는 각 사건이 제공하는 정보량의 평균을 나타낸다.&lt;br&gt;$$ H(X) = -\sum_{i} p_i \log_2 p_i $$&lt;br&gt;정보 엔트로피의 수식이 다음과 같은 이유는 엄밀하게 정의하자면 아래와 같다.&lt;br&gt;정보량 $I(p)$는 확률 $p$인 사건이 일어났을 때 제공하는 정보를 수량화하며, 이는 다음 세 가지 공리를 만족하는 연속 함수로 정의된다:&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;li&gt;연속성: $I(p)$는 확률 $p$에 대해 연속 함수이어야 한다. 즉, 확률의 작은 변화에 따라 정보량도 변해야 한다.&lt;/li&gt;&lt;li&gt;단조성: 확률 $p$가 낮을수록 정보량 $I(p)$가 더 크다. 즉, $p_1 &amp;lt; p_2 \implies I(p_1) &amp;gt; I(p_2)$, 이는 $I(p)$가 단조 감소 함수임을 의미한다.&lt;/li&gt;&lt;li&gt;가법성: 독립 사건 $A$와 $B$의 결합 확률에 대한 정보량은 각 사건의 정보량의 합이어야 한다: $I(p(A) \cdot p(B)) = I(p(A)) + I(p(B))$&lt;/li&gt;&lt;/ol&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;이 세 공리를 만족하는 연속 함수는 $I(p) = -k \log p$ 형태로 유도된다. 연속성을 가정할 때 위 공리의 유일한 해가 로그 함수이기 때문이다. 확률 $p \leq 1$이므로 $\log p \leq 0$이고, 정보량이 양수이어야 하므로 음수 부호를 붙여 다음과 같이 정의될 수 있다. $$I(p) = -k \log p$$&lt;br&gt;&amp;nbsp;&lt;br&gt;로그의 밑은 정보 단위를 결정한다. 디지털 시스템에서는 정보를 비트단위로 표현하므로 밑은 2가 된다.&lt;br&gt;직관적으로 확률이 0.5인 사건(예: 동전 던지기의 앞면)이 발생했을 때, 그 불확실성을 해소하는 데 필요한 정보량은 1비트이다. 이는 $ I(0.5) = -\log_2 0.5 = 1 $비트로 계산된다. 마찬가지로, 확률이 0.25인 사건(예: 네 가지 결과 중 하나가 $\frac{1}{4}$ 확률로 발생)이 발생했을 때, 그 불확실성을 해소하는 데 필요한 정보량은 $ I(0.25) = -\log_2 0.25 = 2 $비트이다.&lt;br&gt;이는 확률이 낮을수록 사건이 더 드물고, 따라서 더 많은 정보를 제공한다는 의미이다.&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이 정보량의 기댓값으로 엔트로피 H(X)를 정의한다. 따라시 정보 엔트로피의 수식은 다음과 같다.&lt;br&gt;&lt;br&gt;$$H(X) = \sum_i p_i I(p_i) = -\sum_i p_i \log_2 p_i$$&lt;br&gt;&amp;nbsp;&lt;br&gt;L은 허프만 인코딩으로 얻은 평균 비트 수일 때 다음이 증명되어있다.&amp;nbsp;&lt;br&gt;$$H(X) \leq L &amp;lt; H(X) + 1$$&lt;br&gt;허프만 인코딩은 그리디 알고리즘을 사용해 확률이 낮은 두 기호를 반복적으로 결합하여 효율적인 이진 트리를 구성한다. 이 과정에서 확률이 0.5에 가까운 기호들은 대개 1비트 코드(예: '0' 또는 '1')를 받는다. 이는 나머지 기호들의 확률 합이 0.5에 근접하더라도, 높은 확률 기호가 루트 바로 아래에 배치되어 가장 짧은 코드를 얻기 때문이다. 그리디 방식은 확률 분포를 최적화해 코드 길이를 최소화하므로, 평균 비트 수 L을 엔트로피 H(X)에 최대한 근접하게 만든다. 따라서 허프만 인코딩은 데이터를 엔트로피에 가까운 비트 수로 효과적으로 압축한다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCwjJX/btsQ5TgUVyF/lGcOc72To7d1PW4tKfzXz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCwjJX/btsQ5TgUVyF/lGcOc72To7d1PW4tKfzXz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCwjJX/btsQ5TgUVyF/lGcOc72To7d1PW4tKfzXz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCwjJX%2FbtsQ5TgUVyF%2FlGcOc72To7d1PW4tKfzXz1%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;1196&quot; height=&quot;1587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;1587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/정보이론</category>
      <category>정보엔트로피</category>
      <category>허프만</category>
      <category>허프만인코딩</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/7</guid>
      <comments>https://juyang22.tistory.com/entry/%EC%A0%95%EB%B3%B4%EC%9D%B4%EB%A1%A0-%ED%97%88%ED%94%84%EB%A7%8C-%EC%9D%B8%EC%BD%94%EB%94%A9%EA%B3%BC-%EC%A0%95%EB%B3%B4-%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BC#entry7comment</comments>
      <pubDate>Wed, 8 Oct 2025 20:23:58 +0900</pubDate>
    </item>
    <item>
      <title>LG Aimers 7기 AI해커톤 본선진출 후기! [온라인 예선]</title>
      <link>https://juyang22.tistory.com/entry/LG-Aimers-7%EA%B8%B0-AI%ED%95%B4%EC%BB%A4%ED%86%A4-%ED%9B%84%EA%B8%B0-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%98%88%EC%84%A0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVji2/btsQR0I4omi/KAt570umRk8gV33Dxf0iMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVji2/btsQR0I4omi/KAt570umRk8gV33Dxf0iMk/img.jpg&quot; data-alt=&quot;(오른쪽 밑에 나온 나!)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVji2/btsQR0I4omi/KAt570umRk8gV33Dxf0iMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVji2%2FbtsQR0I4omi%2FKAt570umRk8gV33Dxf0iMk%2Fimg.jpg&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;582&quot; height=&quot;592&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(오른쪽 밑에 나온 나!)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-4EAE9054-049D-43F6-B49B-CC8B4CFB42BC&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3학년 여름방학 동안 꽤 신경을 많이 쏟았던 LG Aimers 7기 해커톤이 저번주에 끝났다! &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;최종적으로 예선은 818명중 23등으로 마무리하였고 본선은 6등까지 올라갔지만 마지막에는 public score기준 9등, private score 기준 14등으로 마무리하게 되었다. 사실 참여하면서 너무 즐거웠어서 끝나자마자 이 즐거웠던 기억을 바로 기록하고 깨닫게 된 교훈도 바로 복습을 하고 싶었지만 이리저리 치이다보니 이제서야 남기게 되었다...&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;&amp;nbsp;&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;900&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3Bvv/btsQSl0wPHj/3aQULFwxdTywkJSpTUk3zK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3Bvv/btsQSl0wPHj/3aQULFwxdTywkJSpTUk3zK/img.jpg&quot; data-alt=&quot;지도교수님께 국내 최고 대가라고 들었던 카이스트 전기전자 신진우 교수님&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3Bvv/btsQSl0wPHj/3aQULFwxdTywkJSpTUk3zK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3Bvv%2FbtsQSl0wPHj%2F3aQULFwxdTywkJSpTUk3zK%2Fimg.jpg&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;515&quot; height=&quot;737&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지도교수님께 국내 최고 대가라고 들었던 카이스트 전기전자 신진우 교수님&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;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;사실 이 해커톤은 방학에 할 게 많아 참여할 생각이 없었는데 해커톤에 참여하기 전에 국내 AI분야에서 굉장히 유명하신 교수님들의 강의를 제공한다는 것이 매력적으로 다가와 참여하게 되었다. 또한 우수한 성적을 낸 참여자들에게 LG그룹 채용 연계과 두둑한(?) 상금을 주는 것이 탐났었다..ㅋㅋㅋ &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;900&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw9y3J/btsQSuJjLfJ/JAoLdBQEvJ9KvLhPwC3fe1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw9y3J/btsQSuJjLfJ/JAoLdBQEvJ9KvLhPwC3fe1/img.jpg&quot; data-alt=&quot;잘 몰랐던 Causality..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw9y3J/btsQSuJjLfJ/JAoLdBQEvJ9KvLhPwC3fe1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw9y3J%2FbtsQSuJjLfJ%2FJAoLdBQEvJ9KvLhPwC3fe1%2Fimg.jpg&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;489&quot; height=&quot;569&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘 몰랐던 Causality..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;강의는 Mathmatic for AI, Causality, 지도학습, 강화학습, SCM 등등으로 이루어졌었다. (뭔가 더 있었던 것 같긴한데 기억이 안 난다..) 강화학습 부분의 강의를 못 들었었는데 그때 본가간다고 너무 바쁘기도 했고 어려워 보여서 미루다가 놓쳐버렸던 기억이 난다. 잘 모르는 부분을 위주로 들었어야하는데, 아는 부분만 들어버린 꼴이 되었다..그래도 Causality는 열심히 들었다.&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;900&quot; data-origin-height=&quot;1249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGBlZN/btsQTQ5ZiTg/vePplkXFW5cju6xk6TiM60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGBlZN/btsQTQ5ZiTg/vePplkXFW5cju6xk6TiM60/img.jpg&quot; data-alt=&quot;이런식으로 사람들이 LG Aimers 내부 커뮤니티에서 팀원을 구했음.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGBlZN/btsQTQ5ZiTg/vePplkXFW5cju6xk6TiM60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGBlZN%2FbtsQTQ5ZiTg%2FvePplkXFW5cju6xk6TiM60%2Fimg.jpg&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;867&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이런식으로 사람들이 LG Aimers 내부 커뮤니티에서 팀원을 구했음.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-92A3350C-94E7-4000-B895-F30387F51BC2&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 대망의 온라인 해커톤이 시작되었다. 온라인 해커톤은 예선의 단계로 8~900팀 정도 참가했는데 이 중 30팀만이 본선 오프라인 해커톤에 올라갈 수 있었다. 같이 참여하기로 했던 친구가 있어서 적당히 열심히 하면 본선은 갈 수 있을 줄 알았는데 상위 3%까지밖에 못 간다는 것을 알고 바로 게시판에서 팀원을 구하기 시작했다...&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2A67D0B5-74C8-4652-88F3-2A0926096A29&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-FD73DFCC-5CE1-4085-A7A7-7441F049A49E&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(솔직히 가르쳐주고 시키는 거라 그냥저냥 할만할 줄 알았는데 팀원 모집글 보니 수상이나 연구 경력도 많고 잘 하시는 분들이 정말 많았다...심지어 이런 분들이 Aimers 이전기수 해커톤에서 아쉽게 본선을 못 가서 이번엔 꼭 가고싶다고 하는 걸 보니 내가 너무 만만하게 봤구나싶었음...)&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;900&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vklvF/btsQSq1uo4b/KJkQPCX9EtZPKPla88Hb20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vklvF/btsQSq1uo4b/KJkQPCX9EtZPKPla88Hb20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vklvF/btsQSq1uo4b/KJkQPCX9EtZPKPla88Hb20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvklvF%2FbtsQSq1uo4b%2FKJkQPCX9EtZPKPla88Hb20%2Fimg.jpg&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;740&quot; height=&quot;863&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-342E6036-1BE5-4781-82F0-6B2A4B9B553B&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;온라인 해커톤 시작하기 전에 시간이 조금 남았어서 이때 본가에 있었는데 이것저것 찾아봤던 기억이 난다..!&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-51735A57-84EE-41B4-AB5C-2B92A6C765BB&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딥러닝을 주로 공부했어서 트랜스포머 기반의 시계열 예측 모델인 GateFormer와 BasisFormer에 대해서 알아봤었다. 하지만 조사한 딥러닝 모델들은 아래의 이유로 쓰일 수 없게 되었다.&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;900&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/liTkB/btsQTj8oNkG/K2qcrKiPEmGpVV3W28NLRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/liTkB/btsQTj8oNkG/K2qcrKiPEmGpVV3W28NLRK/img.jpg&quot; data-alt=&quot;ㅠ ㅠ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/liTkB/btsQTj8oNkG/K2qcrKiPEmGpVV3W28NLRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FliTkB%2FbtsQTj8oNkG%2FK2qcrKiPEmGpVV3W28NLRK%2Fimg.jpg&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;398&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅠ ㅠ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-742E7CAA-999A-4E39-BA9B-B65C594C7DD5&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(근데 또 본선 가보니 1등은 딥러닝을 야물딱지게 잘 활용했더라...)&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;900&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxTRsb/btsQSaRV53O/sBQ3b0zuc1Am2mLYAXFXyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxTRsb/btsQSaRV53O/sBQ3b0zuc1Am2mLYAXFXyK/img.jpg&quot; data-alt=&quot;데이터셋 칼럼&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxTRsb/btsQSaRV53O/sBQ3b0zuc1Am2mLYAXFXyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxTRsb%2FbtsQSaRV53O%2FsBQ3b0zuc1Am2mLYAXFXyK%2Fimg.jpg&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;715&quot; height=&quot;400&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터셋 칼럼&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-CF432908-3D2D-441D-A903-6DECD078BDB4&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;데이터셋을 받아보니 주어진 피쳐가 정말 그냥 날짜와 메뉴, 판매량이 모두였다... 심지어 주어진 기간은 1년5개월..ㅋㅋㅋㅋㅋ 게다가 메뉴 개수가 193개나 되는데 21일 입력을 받고 7일간 193개의 메뉴를 수요예측을 하는 것이 문제였다. 심지어 SMAPE라는 듣도보도 못한 score를 줘서 더욱 당황&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-396D845C-D375-4731-BBCF-CFEB873826EA&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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;900&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmbOe/btsQR1nHcvz/RctqKi8tbiZjvkJltoqEjK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmbOe/btsQR1nHcvz/RctqKi8tbiZjvkJltoqEjK/img.jpg&quot; data-alt=&quot;내가 올린 글이었는데 좋아요를 꽤나 받았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmbOe/btsQR1nHcvz/RctqKi8tbiZjvkJltoqEjK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpmbOe%2FbtsQR1nHcvz%2FRctqKi8tbiZjvkJltoqEjK%2Fimg.jpg&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;596&quot; height=&quot;727&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내가 올린 글이었는데 좋아요를 꽤나 받았다.&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;900&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXdWd/btsQS53CyGV/ZL8nlDRuGnJMK90KKKmog1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXdWd/btsQS53CyGV/ZL8nlDRuGnJMK90KKKmog1/img.jpg&quot; data-alt=&quot;EDM&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXdWd/btsQS53CyGV/ZL8nlDRuGnJMK90KKKmog1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXdWd%2FbtsQS53CyGV%2FZL8nlDRuGnJMK90KKKmog1%2Fimg.jpg&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;477&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;EDM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-C98D6A4F-3FD3-41B5-91BA-8A9EB5B3B839&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 간단히 EDM을 해보니 역시 피쳐가 적고 리조트의 수요예측이라는 local한 상황의 특징때문인지 수요가 지멋대로 왔다갔다하고 주기성이 있긴하지만 정확하게 예측을 하기가 힘들었다. 일별 편차도 너무 커서 오차 역시 당연히 컸었다...그래도 주간기준의 매출은 변동성이 크지 않다는 것을 이용해서 주간총매출 예측모델을 만들고 해당 모델의 예측을 7로 나눈 뒤, 편차를 일별보정 모델을 만들어 최종 예측을 만드는 전략을 세웠다. (이렇게 만들면 오차분산을 두 모델이 나눠서 분담하면서 최종 오차분산이 많이 줄어들지 않을까하는 직관에서 나온 전략이었는데 관련 연구를 찾아보니 실제로 그렇다고 하더라)&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-C2CE8106-54B0-4DAC-95C8-5D44FAB77C75&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-B559ED58-92F2-40AC-962E-AA2D731F7421&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또 안 팔리다가 특정 일수에 갑자기 스파이크를 찍어버리는 메뉴들도 간간히 있어 해당 주차의 최고매출 예측&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8E3F46E6-A947-4FCC-B995-D8DB8AC9A73B&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;모델을 따로 만들어 기존 모델이 갑자기 과도하게 높은 수요를 예측할 때 clipping해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #808080; text-align: left;&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;900&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIYxDe/btsQSHvbstr/UhEWEkRhOQ4fEdeGTmiDl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIYxDe/btsQSHvbstr/UhEWEkRhOQ4fEdeGTmiDl0/img.jpg&quot; data-alt=&quot;대회 둘쨋날에 찍은 등수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIYxDe/btsQSHvbstr/UhEWEkRhOQ4fEdeGTmiDl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIYxDe%2FbtsQSHvbstr%2FUhEWEkRhOQ4fEdeGTmiDl0%2Fimg.jpg&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;577&quot; height=&quot;359&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대회 둘쨋날에 찍은 등수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;대회 둘쨋날, 고수들이 많이 들어오지 않았을 때 혼자 먼저 만들어 제출해 본 모델이 리더보드 7등을 찍었다. 솔직히 등수가 내려갈 거라고는 생각했는데 이 등수를 본선에서야 되찾게 될 줄은 몰랐다. (본선 때 6등/820까지 올라감..ㅋㅎ)&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;900&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUf1rx/btsQRCPiOcP/xcsvQDRr8hq8PcNtbEHyz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUf1rx/btsQRCPiOcP/xcsvQDRr8hq8PcNtbEHyz0/img.jpg&quot; data-alt=&quot;노션 페이지를 파서와 모델을 공유했었다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUf1rx/btsQRCPiOcP/xcsvQDRr8hq8PcNtbEHyz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUf1rx%2FbtsQRCPiOcP%2FxcsvQDRr8hq8PcNtbEHyz0%2Fimg.jpg&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;606&quot; height=&quot;780&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노션 페이지를 파서와 모델을 공유했었다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-E7A818CD-3C0D-4976-9578-9E1DA357ABB5&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 그 이후로는 팀원들과 함께 가장 성능이 좋은 모델과 상관계수가 낮으면서도 성능이 괜찮은 모델들을 만들어 앙상블 하기 위해 계속 노력했었다. 사실 글로는 굉장히 빨리 지나가지만 이 과정에서 오만가지 기법과 논문을 서칭하고 시행착오를 겪고 하는 것이 굉장히 힘들었었다. EDM과 피쳐엔지니어링도 계속 다시 했었고...&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-C644DA24-D279-4F25-95C6-24F3B5C6E80D&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4F27153A-46E2-40BB-8A66-32AF1FCE6A17&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;솔직히 이런 과정을 거치고 나니 절대 혼자서는 못해먹겠다라는 생각이 들었다.. 이런 생각이 내가 무능력한가라는 생각까지 이어지긴 했지만 다시 생각해보니 모두가 팀을 이루어서 참여하는 대회니까 뭐ㅋㅋ 그리고 예선 끝나고 보니 팀장으로서 여러가지 귀찮은 행정적인(?) 일들도 많이 했고 1인분은 충분히 한 것 같아서 이런 생각은 예선이 끝나고 사라졌었다. &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;650&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ea2G0L/btsQQUCp4VK/ZoG92fi0CkUf6iEAXzp8Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ea2G0L/btsQQUCp4VK/ZoG92fi0CkUf6iEAXzp8Wk/img.png&quot; data-alt=&quot;GBM&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ea2G0L/btsQQUCp4VK/ZoG92fi0CkUf6iEAXzp8Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fea2G0L%2FbtsQQUCp4VK%2FZoG92fi0CkUf6iEAXzp8Wk%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;552&quot; height=&quot;700&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GBM&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-FA1D5369-49B2-4C4B-85DE-227E5DEE35F3&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;딥러닝에 편파적으로 AI를 공부하다보니 머신러닝 모델에 대해서는 대강 알고있긴 했지만 자세히 알지 못했다. 이번 해커톤에서 Gradient boosting tree 계열의 모델인 Catboost모델을 활용했는데 이번 기회에 GBM모델에 대해서도 자세히 공부를 할 수 있게 되었다. GBM은 회귀의 경우 먼저 제일 처음에는 그냥 평균을 예측한 다음에 해당 잔차를 다음 트리로 학습하는 부스팅 모델이다. 이 과정을 리프 별로 계속 반복하는데 이 과정에서 오차를 그냥 오차를 쓰는 것이 아니라 오차의 기울기를 사용한다. MSE가 아닌 다른 손실함수도 최적화하기 위해 오차 그 자체가 아닌 오차의 기울기를 활용해 경사하강법을 진행한다(MSE의 경우는 절대 오차 그 자체가 그냥 기울기가 된다). 그래서 이름에 Gradient가 들어갔었던 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&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;900&quot; data-origin-height=&quot;771&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Be8x/btsQR6osZL5/PVKkdCcMG2K2XVKWYS0Ge1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Be8x/btsQR6osZL5/PVKkdCcMG2K2XVKWYS0Ge1/img.png&quot; data-alt=&quot;앙상블 후보군에 오른 모델들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Be8x/btsQR6osZL5/PVKkdCcMG2K2XVKWYS0Ge1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Be8x%2FbtsQR6osZL5%2FPVKkdCcMG2K2XVKWYS0Ge1%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;730&quot; height=&quot;625&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;771&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앙상블 후보군에 오른 모델들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-94BE7D9B-E896-4DF7-86E8-93D93E36382A&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그리고 예선 마감 당일... 30등까지 본선에 갈 수 있는데 우리는 44등인가 그랬었던 것 같다. ㅋㅋㅋ 그 날 아침에 눈을 떴는데 본선 못 갈 거 같아서 엄청 우울해했던 게 기억난다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-024B2404-5043-4D8A-BB09-531A10CA121B&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;원래는 validation셋을 좀 빼서 예측한 결과를 토대로 [앙상블 SMAPE+각 모델 간의 상관계수]라는 식을 세워 이를 이 식을 최소화하는 optimizing 문제로 접근하여 모델들의 가중치를 구하는 방법을 써볼랬는데 제출파일은 10개월치에 대한 예측이고, 학습셋이 17개월밖에 안 되는 관계로 validation셋을 많이 빼기가 곤란하였다. 그렇다고 1개월만 빼서 가중치를 구하자니 10개월을 예측해야하는데 너무 데이터에 fit한 결과가 나올 것 같았다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-E8BE6624-6FB9-4BB7-A153-628F94034A79&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-F8EC5D3D-19CC-4DF4-B326-A97423076E72&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 각 모델의 score와 상관계수만으로 구할 수 있는 선형계획법이나 이차계획법을 적용해볼까했는데 가만보니 SMAPE는 절댓값 함수라 이런 최적화 방식을 사용할 수가 없었다.&lt;/span&gt;&lt;span&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;900&quot; data-origin-height=&quot;1071&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oqdwi/btsQQW1cTgv/LRYa7pi3njdPZYcFkVOddk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oqdwi/btsQQW1cTgv/LRYa7pi3njdPZYcFkVOddk/img.jpg&quot; data-alt=&quot;저 말도 안되는 상관계수 맵을 보라.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oqdwi/btsQQW1cTgv/LRYa7pi3njdPZYcFkVOddk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqdwi%2FbtsQQW1cTgv%2FLRYa7pi3njdPZYcFkVOddk%2Fimg.jpg&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;546&quot; height=&quot;650&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1071&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저 말도 안되는 상관계수 맵을 보라.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;아무튼 그래서 위의 말도 안되는 상관계수맵을 보고 직감으로 새벽까지 팀원들과 가중치를 맞춰보기 시작했다ㅋㅋㅋㅋ 1일 제출 제한횟수가 5회였다. 여기서 팀원의 새로운 모델을 한번 내고 앙상블 모델 한 번 내서 2회를 쓰고 3번이 남은 상태였다. 이때 낸 앙상블 모델이 44-&amp;gt;38등으로 올려줬던 것 같다. 이대로는 본선에 갈 수 없는 상황... 그런데 시간날 때마다 앙상블해서 제출해보면서 얻은 미친 직감이 이때 발휘되었다. (본선을 가보니, 우승하신 분들은 처음부터 모델간의 장단점을 상쇄시켜줄만한 모델들을 의도적으로 만든 뒤에 앙상블하였다.)&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;897&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmWDU/btsQS3LwYdK/m8YzsV4tENaZtZAN9MqaKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmWDU/btsQS3LwYdK/m8YzsV4tENaZtZAN9MqaKk/img.jpg&quot; data-alt=&quot;20등의 순간&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmWDU/btsQS3LwYdK/m8YzsV4tENaZtZAN9MqaKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmWDU%2FbtsQS3LwYdK%2Fm8YzsV4tENaZtZAN9MqaKk%2Fimg.jpg&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;477&quot; height=&quot;620&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;1166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;20등의 순간&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-9D015E19-68FD-406D-B08A-B6773CA64D79&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;저 많은 상관계수맵에서 고른 다섯개의 모델중에 하필 고른 그 가중치가 바로 38-&amp;gt;20등을 만들어주었다!! &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-B1D37FA4-A7F2-4998-8246-BE46C0FF871B&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;score로 치면 0.478-&amp;gt;0.465(낮을수록 좋음)였다! 예선마감 4시간 전 새벽이라 본선이 거의 확정인 상황ㅋㅋㅋㅋ&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9E9979C2-0E58-47CA-96A3-FD3B4F805474&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(그리고 예선 끝나고 심심해서 앙상블 후보군 파일을 10개정도 더 조합해서 내봤는데 아무리 내도 저 점수를 뛰어넘는 파일이 나오질 않았다. 제출 3회 남은 상황에서 그냥 신이 빙의된 게 아니면 말이 안됨...) 아무튼 그리고 그 다음 날 보니 public score는 20등 그대로였고 private score 뜬 거 보니 23등이 되어있었다. 운 나빠서 10등 이상 떨어졌으면 사실 못 갈 수도 있었을 수도?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #808080; text-align: left;&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;900&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIdtru/btsQSoWXTCE/aK1fIIsPpGPKe2j70Sx701/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIdtru/btsQSoWXTCE/aK1fIIsPpGPKe2j70Sx701/img.jpg&quot; data-alt=&quot;헤헤&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIdtru/btsQSoWXTCE/aK1fIIsPpGPKe2j70Sx701/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIdtru%2FbtsQSoWXTCE%2FaK1fIIsPpGPKe2j70Sx701%2Fimg.jpg&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;479&quot; height=&quot;440&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;헤헤&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 이렇게 본선진출의 마지막 단계 코드검증을 위해&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-A87D8D88-AE85-43A9-8914-30713DEC4F2D&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ppt 및 코드 제출 대상자가 되었다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3SnQ3/btsQR8fwKs3/0fcHxxOFLk3TWoymtedEOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3SnQ3/btsQR8fwKs3/0fcHxxOFLk3TWoymtedEOk/img.jpg&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;572&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.7793%; margin-right: 10px;&quot; data-widthpercent=&quot;47.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3SnQ3/btsQR8fwKs3/0fcHxxOFLk3TWoymtedEOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3SnQ3%2FbtsQR8fwKs3%2F0fcHxxOFLk3TWoymtedEOk%2Fimg.jpg&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;466&quot; height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmHwXi/btsQTNBo7P4/ywfucRyH9kevNFwagZtN4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmHwXi/btsQTNBo7P4/ywfucRyH9kevNFwagZtN4K/img.jpg&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;514&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.0579%;&quot; data-widthpercent=&quot;52.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmHwXi/btsQTNBo7P4/ywfucRyH9kevNFwagZtN4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmHwXi%2FbtsQTNBo7P4%2FywfucRyH9kevNFwagZtN4K%2Fimg.jpg&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;466&quot; height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;제출 ppt&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1045&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyS3A/btsQQ0P60Vc/qZWeBFOoCyz8YTG2qQtYl0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyS3A/btsQQ0P60Vc/qZWeBFOoCyz8YTG2qQtYl0/img.jpg&quot; data-alt=&quot;모델구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyS3A/btsQQ0P60Vc/qZWeBFOoCyz8YTG2qQtYl0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkyS3A%2FbtsQQ0P60Vc%2FqZWeBFOoCyz8YTG2qQtYl0%2Fimg.jpg&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;578&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1045&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모델구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-B4FDE2C5-E2E4-46E3-A138-0CC2018ED805&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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;900&quot; data-origin-height=&quot;1138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oKLu1/btsQUjNBOQz/aVkJznNjfAiZKcZyklKSCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oKLu1/btsQUjNBOQz/aVkJznNjfAiZKcZyklKSCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oKLu1/btsQUjNBOQz/aVkJznNjfAiZKcZyklKSCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoKLu1%2FbtsQUjNBOQz%2FaVkJznNjfAiZKcZyklKSCk%2Fimg.jpg&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;591&quot; height=&quot;747&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot;&gt;진짜 이게 말이 되나ㅋㅋ predict(pool)이라는 코드가 카톡으로 보내지면서 이모지로 predict 로 바꼈고, (몰랐는데 당구가 영어로 pool이란다 ㅋㅋ) 저걸 다시 코랩에 복붙하면서 predict(당구)로 바뀐 거다... 급하게 제출하느라 제출하고 나서 알았고, 이를 데이콘 측에 설명을 했더니 이미 인지하고 있는 부분이고 수정해서 검증하겠다라는 답변을 받았다. 그 분들도 얼마나 어이가 없으셨을까&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;900&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K3uw2/btsQS8eZmqa/gaycPfnrocuqFjqNITIzK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K3uw2/btsQS8eZmqa/gaycPfnrocuqFjqNITIzK1/img.jpg&quot; data-alt=&quot;예선 최종 순위(23등/818)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K3uw2/btsQS8eZmqa/gaycPfnrocuqFjqNITIzK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK3uw2%2FbtsQS8eZmqa%2FgaycPfnrocuqFjqNITIzK1%2Fimg.jpg&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;595&quot; height=&quot;341&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예선 최종 순위(23등/818)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p id=&quot;SE-9BFF5BB5-9CD2-4020-8187-3363316F52BC&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;레전드 억까와 억빠 끝에 드디어 본선진출이 확정되었다. 이때 너무 기뻣던 것 같다. 드디어 키트 받는건가..라는 생각. 그리고 몰랐는데 본선 진출하면 1인당 100만원씩 주는 것이엇다. 뭔가 방학동안의 노고를 보상받는 느낌이 들어서 너무 기뻤다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2CFCB540-D80F-4B47-BA72-4A70CE606A93&quot; style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 온라인보다 더 재밌었던 오프라인 후기는 다음에 올릴 예정&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #808080; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;002&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/002.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/002.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;</description>
      <category>프로젝트/대회</category>
      <category>AI</category>
      <category>AIMERS</category>
      <category>AI해커톤</category>
      <category>LG</category>
      <category>lgaimers</category>
      <category>ML</category>
      <category>대회</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/6</guid>
      <comments>https://juyang22.tistory.com/entry/LG-Aimers-7%EA%B8%B0-AI%ED%95%B4%EC%BB%A4%ED%86%A4-%ED%9B%84%EA%B8%B0-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%98%88%EC%84%A0#entry6comment</comments>
      <pubDate>Sat, 27 Sep 2025 16:01:46 +0900</pubDate>
    </item>
    <item>
      <title>[CA] 명령어 사이클과 마이크로명령어</title>
      <link>https://juyang22.tistory.com/entry/CA-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EB%AA%85%EB%A0%B9%EC%96%B4</link>
      <description>&lt;div&gt;
&lt;div data-testid=&quot;code-block&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #002339;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;본 게시글의 설명자료로 사용된 사진은 김종현 저서 '컴퓨터구조론' 4장 내용을 기반으로 합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 게시글에서는 CPU의 명령어 사이클이 어떻게 마이크로명령어를 통해 구현되는지 설명하고자 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdgMpB/btsQS7UGDDt/44spxLQB1tVkSIh8JfrZKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdgMpB/btsQS7UGDDt/44spxLQB1tVkSIh8JfrZKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdgMpB/btsQS7UGDDt/44spxLQB1tVkSIh8JfrZKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdgMpB%2FbtsQS7UGDDt%2F44spxLQB1tVkSIh8JfrZKk%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;649&quot; height=&quot;372&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU의 동작 사이클은&amp;nbsp; 기본적으로 인출 사이클, 실행사이클로 나누어진다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;말그대로 &lt;/span&gt;명령어 인출사이클은&amp;nbsp;&lt;/span&gt; 현재 명령어가 어떠한 명령어인지 명령어를 인출해오는 단계이고, 실행사이클은 인출해온 명령어를 실행하는 단계이다. 이때 명령어가 간접지정방식으로 이루어진 경우 명령어 인출사이클과 실행사이클 사이에 간접사이클이 포함되게 된다. 명령어 사이클에 대한 자세한 내용은 아래 링크를 참고하길 바란다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&lt;a title=&quot;명령어사이클&quot; href=&quot;https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1758957204078&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;컴퓨터구조 - 명령어 사이클과 인터럽트&quot; data-og-description=&quot;CPU가 하나의 명령어를 처리하는 과정에는 정해진 흐름이 있고 CPU는 그 흐름을 반복하며 명령어들을 처리해 갑니다. 명령어 사이클은 각각의 명령어들이 일정하게 반복하면서 실행하는 주기를 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&quot; data-og-url=&quot;https://velog.io/@hyunji015/컴퓨터구조-명령어-사이클과-인터럽트&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bT0iiq/hyZJQ4fsHC/rmp5DDuouj07nDYFIXwssk/img.png?width=556&amp;amp;height=252&amp;amp;face=0_0_556_252,https://scrap.kakaocdn.net/dn/dclFNF/hyZJVqVe9X/78sROXQwkTZ0nfbM9mo06K/img.png?width=556&amp;amp;height=252&amp;amp;face=0_0_556_252,https://scrap.kakaocdn.net/dn/vPgnn/hyZJRPBznR/hY7yk3ioTlwzVENA8uBu1K/img.png?width=773&amp;amp;height=528&amp;amp;face=0_0_773_528&quot;&gt;&lt;a href=&quot;https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@hyunji015/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bT0iiq/hyZJQ4fsHC/rmp5DDuouj07nDYFIXwssk/img.png?width=556&amp;amp;height=252&amp;amp;face=0_0_556_252,https://scrap.kakaocdn.net/dn/dclFNF/hyZJVqVe9X/78sROXQwkTZ0nfbM9mo06K/img.png?width=556&amp;amp;height=252&amp;amp;face=0_0_556_252,https://scrap.kakaocdn.net/dn/vPgnn/hyZJRPBznR/hY7yk3ioTlwzVENA8uBu1K/img.png?width=773&amp;amp;height=528&amp;amp;face=0_0_773_528');&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;컴퓨터구조 - 명령어 사이클과 인터럽트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CPU가 하나의 명령어를 처리하는 과정에는 정해진 흐름이 있고 CPU는 그 흐름을 반복하며 명령어들을 처리해 갑니다. 명령어 사이클은 각각의 명령어들이 일정하게 반복하면서 실행하는 주기를&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;그렇다면 CPU가 실행하는 명령어 코드는 어떠한 구조로 이루어져있을까? 명령어 코드는 아래와 같은 형식으로 이루어져있다.&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;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ8A9B/btsQT9xsDO2/7klK4itFI6WVWvK2OQlZh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ8A9B/btsQT9xsDO2/7klK4itFI6WVWvK2OQlZh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ8A9B/btsQT9xsDO2/7klK4itFI6WVWvK2OQlZh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ8A9B%2FbtsQT9xsDO2%2F7klK4itFI6WVWvK2OQlZh0%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;336&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 명령어 코드는 연산코드(opcode), 간접지정비트, 오퍼랜드로 구성되어 있다. 연산코드는 어떤 연산(예: LOAD,ADD,STORE 등)을 수행할지 나타내는 부분이며, &quot;I&quot;는 간접지정비트로 오퍼랜드가 직접적인 값인지 메모리 주소를 참조하는지를 나타낸다. 마지막 11비트는 피연산자의 메모리 주소나 값을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 xxxx라고 적힌 부분은 해당 명령어가 어떠한 연산을 하는 명령어인지 나타내는 비트 부분이다. 위 코드에는 4비트로 연산코드 부분이 이루어져있는데 ADD,STORE,LOAD 등의 동작을 정의하는 명령어로 이루어질 수 있다. 이때 명령어코드의 4비트는 사상함수를 통해 위 동작이 실제로 정의된 주소로 사상될&amp;nbsp; 수 있다. 사상결과로 나온 연산동작의 주소는 제어유니트의 제어기억장치라는 곳에 정의된다.&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;1366&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nuybq/btsQSGwgk2q/MLrIQSqyDsDbissjhAC501/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nuybq/btsQSGwgk2q/MLrIQSqyDsDbissjhAC501/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nuybq/btsQSGwgk2q/MLrIQSqyDsDbissjhAC501/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNuybq%2FbtsQSGwgk2q%2FMLrIQSqyDsDbissjhAC501%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;789&quot; height=&quot;544&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 언급한 제어 기억장치의 내부구성이다. 위의 주소는 십진수로 표현이 되어있다. 연산 동작은 실행사이클 루틴의 부분에 해당하여 64~127의 주소에 저장이 될 수 있다. 위의 사상함수는 1xxxx00의 이진수로 정의가 되었는데 이 코드의 범위는 64~124까지를 나타낸다. 그렇다면 124~127은 왜 지정이 안되느냐? 사상함수의 결과가 나타내는 부분은 각 실행 사이클 루틴의 '시작주소'를 의미한다. 각 실행 사이클 루틴이 위의 경우에는 4개의 동작으로 정의되어있기에 124까지만 지정하고 그 이후는 지정해주지 않는 것이다.&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;1330&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdckJmW%2FbtsQS7mPNzS%2FZD2GZaFZJk8k0FFKj7klRK%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;728&quot; height=&quot;171&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;마이크로명령어는 하드웨어를 이루는 회로를 다루기 위해 사용하는 명령어이다. 그렇기에 위의 명령어코드보다 기계와 가까운 명령어라고 볼 수 있다. 그렇기에 마이크로명령어의 연산필드는 명령어코드의 연산코드보다 더 low-level로 작동하게 된다. low-level의 동작을 이해하기 위해선 제어유니트의 구성을 알아볼 필요가 있다.&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;1202&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YDHWz/btsQTOAmnPV/sqA2i96htXDJPkdrvLMjkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YDHWz/btsQTOAmnPV/sqA2i96htXDJPkdrvLMjkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YDHWz/btsQTOAmnPV/sqA2i96htXDJPkdrvLMjkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYDHWz%2FbtsQTOAmnPV%2FsqA2i96htXDJPkdrvLMjkk%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;698&quot; height=&quot;602&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;/figure&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;1. 명령어 해독기: 명령어 레지스터(IR)로부터 들어오는 명령어의 연산 코드를 해독하여 해당 연산을 수행하기 위한 루틴의 시작주소를 결정한다. 사상과 같은 서비스 루틴의 시작주소를 결정하는 동작이 여기서 이루어진다.&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;2. 제어주소 레지스터(CAR): 다음에 실행할 마이크로명령어의 주소를 저장하는 레지스터이다.&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;3. 제어 기억장치: 위에서 언급한 여러 사이클 루틴의 마이크로 명령어 코드가 저장된 곳이 제어 기억장치이다.&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;4. 제어 버퍼 레지스터(CBR): 제어 기억장치로부터 읽혀진 마이크로 명령어를 일시적으로 저장하는 레지스터이다.&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;5. 서브루틴 레지스터(SBR): 마이크로 프로그램에서 서브루틴을 호출하는 경우에, 현재의 CAR의 내용을 일시적으로 저장한다.&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;6. 순서제어 모듈: 마이크로 명령어의 실행 순서를 결정하는 회로들의 집합이다.&lt;/p&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dckJmW/btsQS7mPNzS/ZD2GZaFZJk8k0FFKj7klRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdckJmW%2FbtsQS7mPNzS%2FZD2GZaFZJk8k0FFKj7klRK%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;728&quot; height=&quot;171&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;먼저 연산필드는 WRITE,READ 등의 마이크로 연산을 레지스터와 메모리를 직접 다루는 수준으로 연산을 하게 하는 동작을 맡는다. 이 동작은 회로수준에서 이루어진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l0Rsn/btsQS4Kormx/QIUIILv28qhPDs04vQmL40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l0Rsn/btsQS4Kormx/QIUIILv28qhPDs04vQmL40/img.png&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;536&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.27%; margin-right: 10px;&quot; data-widthpercent=&quot;52.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l0Rsn/btsQS4Kormx/QIUIILv28qhPDs04vQmL40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl0Rsn%2FbtsQS4Kormx%2FQIUIILv28qhPDs04vQmL40%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;1322&quot; height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tw9ai/btsQRE0EDtg/MXeNy1tBXPELc2fa5UpEWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tw9ai/btsQRE0EDtg/MXeNy1tBXPELc2fa5UpEWK/img.png&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;598&quot; data-is-animation=&quot;false&quot; style=&quot;width: 46.5672%;&quot; data-widthpercent=&quot;47.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tw9ai/btsQRE0EDtg/MXeNy1tBXPELc2fa5UpEWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftw9ai%2FbtsQRE0EDtg%2FMXeNy1tBXPELc2fa5UpEWK%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;1314&quot; height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;연산필드의 마이크로 연산들&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&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HyX1q/btsQSlfaccE/jOL4zhPecyTangZX4UQKS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HyX1q/btsQSlfaccE/jOL4zhPecyTangZX4UQKS0/img.png&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;440&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.5691%; margin-right: 10px;&quot; data-widthpercent=&quot;56.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HyX1q/btsQSlfaccE/jOL4zhPecyTangZX4UQKS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHyX1q%2FbtsQSlfaccE%2FjOL4zhPecyTangZX4UQKS0%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;1332&quot; height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhhBb/btsQTxrPzaQ/29jt42oAxlKDbiYhK294v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhhBb/btsQTxrPzaQ/29jt42oAxlKDbiYhK294v1/img.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;588&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.2681%;&quot; data-widthpercent=&quot;43.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhhBb/btsQTxrPzaQ/29jt42oAxlKDbiYhK294v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhhBb%2FbtsQTxrPzaQ%2F29jt42oAxlKDbiYhK294v1%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;1386&quot; height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 조건필드와 분기필드의 코드와 그에 따른 내용이다. 여기서 분기필드의 코드 11은 MAP을 의미하는데 이는 명령어 코드의 연산코드의 비트들을 사상하여 나온 주소로 분기하는 것을 의미한다.&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;마지막으로 주소필드(ADF)는 다음 실행될 마이크로명령어의 주소를 나타낸다.&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;이제 제어유니트의 구조와 마이크로명령어의 동작방식에 대해 알았기에 CPU의 명령어 사이클(인출사이클, 실행사이클, 간접사이클)이 어떻게 마이크로프로그램을 통해 작동하는지 알아볼 수 있다. 마이크로 명령어는 하나의 명령어당 기본적으로 3개까지의 동작을 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 첫 번째 연산필드에 따른 연산 동작&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;3. 분기 동작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 동작은 하드웨어 회로를 기반의 low-level로써 동작한다.&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;(1) 인출사이클&amp;nbsp;&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;- PCTAR은 PC의 명령어코드 주소를 MAR로 옮기라는 것을 의미한다. U JMP NEXT는 무조건적으로 다음 마이크로 명령어 주소로 점프하라는 것을 의미한다. &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;- READ,INCPC는 PC의 주소에 해당하는 명령어를 MBR에 넣고 PC를 +1해준다. 이후 똑같이 무조건적으로 다음 마이크로 명령어로 점프한다.&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;- 마지막으로 MBR에 넣어둔 다음 명령어를 명령어 레지스터(IR)에 넣고, 해당 명령어의 연산코드에 해당하는 실행사이클 루틴의&amp;nbsp; 마이크로 명령어로 무조건적으로 분기한다.&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;1270&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOZOBI/btsQSOHAIAC/A5Bn6PB1ZW3rX6uKHw36Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOZOBI/btsQSOHAIAC/A5Bn6PB1ZW3rX6uKHw36Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOZOBI/btsQSOHAIAC/A5Bn6PB1ZW3rX6uKHw36Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOZOBI%2FbtsQSOHAIAC%2FA5Bn6PB1ZW3rX6uKHw36Z1%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;702&quot; height=&quot;360&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;1238&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7CjiP/btsQTDevJkh/GDLRFMq8dUHD4MNGalRLck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7CjiP/btsQTDevJkh/GDLRFMq8dUHD4MNGalRLck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7CjiP/btsQTDevJkh/GDLRFMq8dUHD4MNGalRLck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7CjiP%2FbtsQTDevJkh%2FGDLRFMq8dUHD4MNGalRLck%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;1238&quot; height=&quot;300&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;300&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;&lt;b&gt;(2) 간접사이클&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간접사이클은 명령어 레지스터(IR)에 저장된 주소필드가 간접주소를 담고있기에 직접 주소로 바꿔주는 과정이다. 이를 위해 다음과 같은 세 과정을 실행한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 명령어 레지스터(IR)에 담긴 명령어의 주소필드 부분을 MAR에 넣는다. 이때의 주소필드 내용은 간접주소를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MAR에 저장된 주소에 담긴 직접 주소를 MBR에 담는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마지막으로 MBR에 담긴 직접주소를 명령어 레지스터(IR)의 주소필드에 바꾼다. 그리고&amp;nbsp; U RET를 통해 무조건적으로 원래 실행사이클 루틴으로 복귀한다. 이는 SBR에 저장해두었던 원래 실행사이클 루틴의 주소를 다시 CAR에 저장함으로써 이루어진다.&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;이 과정을 통해 IR의 주소필드에 담긴 내용은 간접주소에서 직접주소로 바뀔 수 있다.&amp;nbsp;&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;1276&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu34fA/btsQR2sPRSv/WiKXvfb1jN1RtfYyn2oYu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu34fA/btsQR2sPRSv/WiKXvfb1jN1RtfYyn2oYu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu34fA/btsQR2sPRSv/WiKXvfb1jN1RtfYyn2oYu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu34fA%2FbtsQR2sPRSv%2FWiKXvfb1jN1RtfYyn2oYu0%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;679&quot; height=&quot;301&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;1240&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ajPy/btsQRGQ7Gba/KHFlrBOQ9Cft9Nuqhbtep0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ajPy/btsQRGQ7Gba/KHFlrBOQ9Cft9Nuqhbtep0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ajPy/btsQRGQ7Gba/KHFlrBOQ9Cft9Nuqhbtep0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ajPy%2FbtsQRGQ7Gba%2FKHFlrBOQ9Cft9Nuqhbtep0%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;628&quot; height=&quot;143&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) 실행사이클&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;여기서는 LOAD와 JMP부분만 알아보고 넘어가도록 하겠다.&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;1. LOAD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 간접주소 지정비트 I=1이라면 CALL INDRT를 통해 간접사이클 루틴을 호출한다.&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;- 복귀 후 MAR에&amp;nbsp; IR의 주소필드 부분을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 주소필드에 담긴 내용을 MBR에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마지막으로 AC에 MBR을 저장하고, 무조건적으로 인출 서비스루틴(FETCH)로 다시 분기하여 인출 사이클루틴을 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인출 사이클루틴에서 PC=PC+1을 해주었으므로, 다음 PC의 내용부터 명령어 사이클을 시작할 수 있다.&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;2. JUMP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 코드의 연산코드가 JUMP인 경우 IR의 주소필드는 점프할 주소가 담기게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 PC에 IR의 주소필드, 즉 점프할 주소가 담기게 되고 다시 인출사이클 루틴으로 돌아가게 된다.&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;만약 원래 PC=0이었고 분기할 주소가 100이라고 가정하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 인출사이클에서 PC=0 -&amp;gt; PC=1 -&amp;gt; PC=100으로 바뀐 후 다시 PC=100에서 인출사이클루틴을 실행하게 되는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC=0에서 PC=1이 되는 이유는 인출사이클 루틴에서 실행사이클 루틴으로 가기 전 PC=PC+1을 해주기 때문이다.&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;834&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdgNtH/btsQSpuNgrv/jXumKlUqb2vm5MlJozb3nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdgNtH/btsQSpuNgrv/jXumKlUqb2vm5MlJozb3nK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdgNtH/btsQSpuNgrv/jXumKlUqb2vm5MlJozb3nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdgNtH%2FbtsQSpuNgrv%2FjXumKlUqb2vm5MlJozb3nK%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;736&quot; height=&quot;706&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;800&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;이를 통해 CPU의 명령어 사이클이 어떻게 마이크로 명령어를 통해 구성될 수 있는지 알아보았다.&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/컴퓨터구조</category>
      <category>CPU</category>
      <category>마이크로명령어</category>
      <category>명령어사이클</category>
      <category>제어기억장치</category>
      <category>제어유니트</category>
      <category>컴퓨터구조</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/5</guid>
      <comments>https://juyang22.tistory.com/entry/CA-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9D%B4%ED%81%B4%EA%B3%BC-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EB%AA%85%EB%A0%B9%EC%96%B4#entry5comment</comments>
      <pubDate>Fri, 26 Sep 2025 16:10:29 +0900</pubDate>
    </item>
    <item>
      <title>[GNN] GNN을 위한 그래프 푸리에 변환과 스펙트럴 필터링</title>
      <link>https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VmNaY/btsQQjHHnwk/heKqSwto6ODWtccu2hKinK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VmNaY/btsQQjHHnwk/heKqSwto6ODWtccu2hKinK/img.png&quot; data-alt=&quot;GFT&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VmNaY/btsQQjHHnwk/heKqSwto6ODWtccu2hKinK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVmNaY%2FbtsQQjHHnwk%2FheKqSwto6ODWtccu2hKinK%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;806&quot; height=&quot;586&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GFT&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;그래프 푸리에 변환은 GNN과 그래프 신호 처리에서 왜 중요할까? 이는 그래프 내 중요한 구조적 특성, 예를 들어 커뮤니티 구조, 노드 간 연결 패턴, 경계나 노이즈를 주파수 도메인에서 포착하기 위한 핵심 도구다. 전통적인 푸리에 변환처럼 신호를 주파수별로 분해함으로써, 그래프의 복잡한 패턴을 효과적으로 분석하고 활용할 수 있다. 이 과정은 스펙트럴 필터링을 통해 구체화되며, 필터링은 주파수별로 신호를 조작해 원하는 패턴을 강조하거나 억제한다. 아래에서 이 흐름을 단계별로 설명하며, GFT가 그래프의 어떤 특성을 포착하는지, 그리고 필터링이 이를 어떻게 구체화하는지 알아보자.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;1. 그래프 신호와 라플라시안 고유벡터의 의미&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 그래프 신호 $x$&lt;/b&gt;&lt;br /&gt;그래프의 각 노드는 하나의 값(스칼라) 또는 벡터(예: 사용자 노드 임베딩)로 표현되며, $n$개 노드에 대해 벡터 $x = [x_1, x_2, \dots, x_n]$로 나타낸다. GNN에서는 이 $x$가 노드 특성 행렬로 사용되며, 그래프 구조를 반영해 학습된다.&lt;br /&gt;예: 소셜 네트워크에서 $x$는 각 사용자의 나이, 관심사 등을 담은 벡터일 수 있다. 예를 들어, 페이스북 그래프에서 각 노드는 사용자, $x_i$는 해당 사용자의 프로필 벡터(관심사 임베딩)일 수 있다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;- 라플라시안 고유벡터&lt;/b&gt;&lt;br /&gt;그래프의 라플라시안 행렬 $L$의 고유벡터 $U$는 그래프의 &quot;주파수 기저&quot; 역할을 한다. 작은 고유값(저주파)의 고유벡터는 인접 노드 간 값이 비슷한 패턴(천천히 변하는)을 나타내고, 큰 고유값(고주파)의 고유벡터는 급격히 변하는 패턴(경계, 노이즈 등)을 표현한다.&lt;br /&gt;예: 소셜 네트워크 그래프에서 저주파 고유벡터는 비슷한 관심사를 가진 사용자 그룹(커뮤니티)을 포착하며, 고주파 고유벡터는 서로 다른 그룹 간의 경계나 노이즈를 강조한다. 이는 그래프 내 커뮤니티 구조(저주파)와 이질적 경계(고주파) 같은 중요한 특성을 드러낸다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;2. 그래프 푸리에변환($U^T x$)을 수행하는 이유&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;그래프 푸리에 변환은 그래프 신호 $x$를 라플라시안 고유벡터 $U$의 기저로 분해하는 과정이다(그래프에서의 기저는 노드 간 차이에 대한 정보를 담고있다.)이는 $U^T x$로 표현된다. 이 식은 신호를 주파수별 성분으로 분해해 그래프 내 숨겨진 패턴을 포착할 수 있다.&amp;nbsp; 이렇게 그래프 푸리에변환을 수행해 그래프의 구조적 특성(예: 노드 사이의 차이, 유사도, 클러스터, 경계)를 주파수 도메인에서 분석 가능하게 한다. 전통적인 푸리에 변환에서 시간 도메인 신호를 사인/코사인 기저로 분해해 주파수 스펙트럼을 보는 것처럼 GFT는 그래프 신호를 고유벡터 기저로 분해해 구조적 패턴을 분석한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;예: 소셜 네트워크에서 $U^T x$는 사용자 특성($x$)을 커뮤니티 사이의 유사한 패턴(저주파)과 그룹 간 차이(고주파)로 분해한다. 이는 단순히 노드 값만 보는 것보다 더 깊은 구조적 이해를 제공한다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;3. 고유값(주파수 크기)을 곱하는 이유&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;GFT에서 고유값은 주파수의 크기를 의미한다.&amp;nbsp; 주파수 크기(고유값 $\lambda_i$)는 그래프 신호가 노드 간에서 얼마나 크게 변하는지, 즉 노드 간 차이의 크기를 간접적으로 반영한다. 이를 이용하여 신호가 그래프 구조에서 얼마나 부드럽게 또는 급격히 변하는지를 주파수 도메인에서 포착할 수 있다. &lt;span style=&quot;color: #333333;&quot;&gt;Spectral Filtering은 &lt;/span&gt;각 주파수 방향(고유벡터 성분)에 고유값 $\Lambda$ (주파수 크기)을 곱해주는 과정을 포함한다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이때 고유값 행렬을 필터로 변환하여, 특정 주파수를 강조할 수 있다. 필터는 $\Lambda$의 고유값행렬 $\lambda_i$에 적용되는 함수 $g(\lambda_i)$ 를 의미한다. 필터를 행렬로 표현하고, 고유값행렬에 필터를 행렬곱하여 선형변환 할 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) 저주파 필터링&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 인접 노드 값을 평균화해 커뮤니티 유사패턴 구조를 강조(스무딩)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;ex: 소셜 네트워크에서 비슷한 관심사를 가진 사용자 그룹을 부각.&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(2)고주파 필터링&lt;/b&gt;: 경계나 노이즈를 강조해 이질적인 부분을 포착.&lt;br /&gt;ex: 그래프에서 그룹간의 차이 추출을 강조.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;수학적 과정: 필터링은 $U\cdot g(\Lambda)\cdot U^T x$ 형태로 구현되며, $g(\Lambda)$는 각 주파수 성분의 가중치를 조절한다.&lt;br /&gt;&lt;br /&gt;예시: 소셜 네트워크에서 저주파 성분(작은 $\lambda_i$)은 같은 커뮤니티 내 사용자들의 특성이 비슷함을 나타내고(작은 차이), 고주파 성분(큰 $\lambda_i$)은 서로 다른 커뮤니티 간 특성이 크게 다름을 나타낸다.(큰 차이).&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;4. 다시 원래 신호로 환원하는 이유&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;그래프 푸리에 도메인에서 필터링된 신호는 다시 실제 노드값(의미있는 노드 특징 벡터)으로 되돌리기 위해 역변환($U$)을 적용한다. 이는 Graph Filtering의 완성 단계로, 주파수 도메인에서 조작된 정보를 원래 그래프 공간으로 되돌려 실용적으로 사용하기 위함이다. 예를 들어, 노드 분류 태스크에서는 필터링된 신호를 역변환해 새롭게 표현된(그래프의 노드들 사이의 차이 구조와 차이의 정도가 반영된) 각 노드의 특징 벡터를 얻고, 이를 통해 더 정확한 분류를 수행할 수 있다. 예를 들어, 소셜 네트워크에서 커뮤니티 구조를 강조한 특성 벡터는 사용자 그룹 분류 정확도를 높인다. 이를 통해 기존 노드의 값들이 그래프에서의 다른 노드들과의 차이를 반영해서 재구성될 수 있게 한다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;5. 스펙트럴 GNN에서 커널을 학습시키는 방법&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;기존 푸리에 변환에서는 고유값 $\Lambda$만 곱해 라플라시안 구조에 고정된 필터만 가능했다. 하지만 GNN에서는 $\Lambda$ 대신 학습 가능한 함수(커널) $g(\Lambda)$를 사용해, 데이터와 라벨에 맞춰 각 주파수 성분별로 &quot;얼마나 강조/억제할지&quot; 파라미터를 학습한다. 학습 가능한 커널은 그래프의 복잡한 특성을 데이터 중심으로 필터링해, 태스크(예: 노드 분류, 그래프 분류)에 최적화된 신호를 생성한다. 이는 Graph Filtering을 데이터와 태스크에 맞춰 구체화하는 과정으로 고정 필보다 훨씬 강력하다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;6. 초기 입력 $x$도 학습 가능한 임베딩&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;GNN에서는 초기 입력 $x$(노드 특성)를 고정된 값이 아닌 학습 가능한 임베딩으로 설정한다. 이를 통해 여러 레이어를 거치며 그래프 구조와 태스크에 최적화된 표현으로 변환된다. 예를 들어,&amp;nbsp;소셜 네트워크에서 초기 $x$는 사용자 프로필 벡터로 시작하지만, GNN 레이어를 거치며 커뮤니티 구조나 태스크(예: 관심사 예측)에 맞는 임베딩으로 진화한다.&amp;nbsp;학습 가능한 $x$는 GFT와 필터링으로 포착된 그래프 특성을 초기 입력부터 동적으로 반영해, 최종 표현력을 극대화한다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;Graph Fourier Transform과 스펙트럴 GNN은 &quot;라플라시안 고유분해 &amp;rarr; 주파수 변환($U^T x$) &amp;rarr; 커널로 적합 필터링 &amp;rarr; 역변환($U$)&quot;의 흐름을 통해 그래프의 구조적 특성을 포착하고 활용한다. GFT는 그래프 내 커뮤니티, 경계, 노이즈 같은 중요한 패턴을 주파수 도메인에서 포착하며, 이는 Graph Filtering을 통해 저주파 스무딩(커뮤니티 강조)이나 고주파 강조(경계 탐지)로 구체화된다. GNN의 학습 가능한 스펙트럴 커널($g(\Lambda)$)은 이 필터링을 데이터와 태스크에 최적화해, 소셜 네트워크의 커뮤니티 탐지나 화합물 분자의 특성 예측 같은 응용에서 뛰어난 성능을 발휘한다.&lt;/p&gt;</description>
      <category>AI/딥러닝</category>
      <category>AL/ML</category>
      <category>gcn</category>
      <category>GFT</category>
      <category>GNN</category>
      <category>Spectral</category>
      <category>그래프푸리에변환</category>
      <category>딥러닝</category>
      <category>지식그래프</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/4</guid>
      <comments>https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81#entry4comment</comments>
      <pubDate>Fri, 26 Sep 2025 02:38:07 +0900</pubDate>
    </item>
    <item>
      <title>[논문리뷰] VAE: Auto-Encoding Variational Bayes</title>
      <link>https://juyang22.tistory.com/entry/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-VAE-Auto-Encoding-Variational-Bayes</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&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;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&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/1312.6114&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/abs/1312.6114&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1759989088887&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;Auto-Encoding Variational Bayes&quot; data-og-description=&quot;How can we perform efficient inference and learning in directed probabilistic models, in the presence of continuous latent variables with intractable posterior distributions, and large datasets? We introduce a stochastic variational inference and learning &quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/1312.6114&quot; data-og-url=&quot;https://arxiv.org/abs/1312.6114v11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYSJxo/hyZKRIi9FC/LxnubzeUyGZk2KJf7BIVV0/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/UIUjn/hyZKI5Hx1C/7wYtkMkbzl2mWAIprNuHn1/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/1312.6114&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/1312.6114&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYSJxo/hyZKRIi9FC/LxnubzeUyGZk2KJf7BIVV0/img.png?width=1200&amp;amp;height=700&amp;amp;face=0_0_1200_700,https://scrap.kakaocdn.net/dn/UIUjn/hyZKI5Hx1C/7wYtkMkbzl2mWAIprNuHn1/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;Auto-Encoding Variational Bayes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;How can we perform efficient inference and learning in directed probabilistic models, in the presence of continuous latent variables with intractable posterior distributions, and large datasets? We introduce a stochastic variational inference and learning&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;&amp;nbsp;이번 글에서는 잠재변수의 확률분포를 정규분포로 근사하여 데이터를 생성하는 변분 오토인코더(VAE)에 대해 리뷰한다. VAE의 핵심은 인코더가 잠재변수의 분포를 원하는 사전 분포(주로 표준정규분포)에 근사하도록 유도하는 정규화 손실(KL-divergence)과 디코더가 입력 데이터를 재구성하도록 만드는 재구성 손실의 합으로 정의된 손실함수(ELBO)를 최적화하는 것이다. 인코더는 입력 데이터를 바탕으로 다양한 잠재벡터를 생성하고, 디코더는 이 잠재벡터를 활용해 입력 데이터와 유사하면서도 다양한 형태로 재구성된 출력을 생성한다. 이 과정에서 인코더는 잠재변수의 분포를 학습하여 다양한 잠재벡터 표현을 만들어내고, 디코더는 이 잠재벡터를 바탕으로 입력 데이터를 다양하게 재구성하도록 학습된다. 이를 통해 VAE는 입력 데이터와 유사한 출력을 재구성하면서도 잠재변수 공간에서 샘플링을 통해 다양한 형태의 데이터를 생성할 수 있도록 설계되었다.&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;b&gt;VAE 아키텍쳐&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1vDI/btsQ3adFskt/xTraC2f4fSUrrzunVZJm2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1vDI/btsQ3adFskt/xTraC2f4fSUrrzunVZJm2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1vDI/btsQ3adFskt/xTraC2f4fSUrrzunVZJm2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1vDI%2FbtsQ3adFskt%2FxTraC2f4fSUrrzunVZJm2K%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;1081&quot; height=&quot;601&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;VAE 손실함수 유도 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 VAE의 모델 구조와 손실함수(ELBO)를 정의하고, 이를 구성하는 재구성 손실과 정규화 손실(KL-divergence)을 통해 최적화하는 수식을 정리한 것이다. VAE는 입력 데이터의 재구성 확률의 로그우도 $ \log p_\theta(x) $를 최대화하여 데이터를 잘 설명하는 모델 파라미터 $ \theta $를 학습한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;($p_\theta(x) = \int p_\theta(x \mid z) \, p(z) \, dz$는 모든 잠재벡터 &lt;span&gt;&lt;span&gt;z&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;로그우도 $ \log p_\theta(x) = \log \left( \int p_\theta(x|z) p(z) \, dz \right) $는 잠재변수 $ z $에 대한 적분을 포함하므로 직접 계산하기 어렵다. 이를 해결하기 위해 VAE는 ELBO를 최대화한다.&amp;nbsp; ELBO는 재구성 손실 $\mathbb{E}_{q_\phi(z|x)}[\log p_\theta(x|z)] $와 정규화 손실 $ \text{KL}(q_\phi(z|x) || p(z)) $로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 VAE에서는 잠재변수 샘플링의 오차역전파를 위한 Reparameterization trick과 ELBO의 기대값 추정을 위한 몬테카를로 샘플링 등 다양한 트릭을 활용한다. 아직 내가 다양하게 잘 몰라서 그럴 수도 있지만, 개인적으로 인코더의 출력인 평균(&amp;mu;)과 표준편차(&amp;sigma;) 벡터를 원하는 사전 분포에 맞게 학습시키기 위해 KL-Divergence를 사용하여 인코더에만 따로 손실함수를 정의하는 기법이 매우 흥미로웠다..&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;2176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egZ3Jg/btsQ3hjxsOJ/OkKyvhD48jvmRGJ4nEwea1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egZ3Jg/btsQ3hjxsOJ/OkKyvhD48jvmRGJ4nEwea1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egZ3Jg/btsQ3hjxsOJ/OkKyvhD48jvmRGJ4nEwea1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FegZ3Jg%2FbtsQ3hjxsOJ%2FOkKyvhD48jvmRGJ4nEwea1%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;1598&quot; height=&quot;2176&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;2176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1979&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9z22o/btsQ2fGyseO/5bKSmLfxLCxlQaE3faP2qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9z22o/btsQ2fGyseO/5bKSmLfxLCxlQaE3faP2qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9z22o/btsQ2fGyseO/5bKSmLfxLCxlQaE3faP2qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9z22o%2FbtsQ2fGyseO%2F5bKSmLfxLCxlQaE3faP2qk%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;1600&quot; height=&quot;1979&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1979&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;1867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nRL1N/btsQ4Qec6TX/cATs7Ag9h05cYqGqR6E2o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nRL1N/btsQ4Qec6TX/cATs7Ag9h05cYqGqR6E2o0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nRL1N/btsQ4Qec6TX/cATs7Ag9h05cYqGqR6E2o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnRL1N%2FbtsQ4Qec6TX%2FcATs7Ag9h05cYqGqR6E2o0%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;1461&quot; height=&quot;1867&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;1867&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 얘를 최대화해야하는데 적분이 매우 어려움, (특히나 z는 고차원 벡터이기에 다중적분을 여러번 해야하고, p자체가 신경망함수이기에 계산량이 매우 큼)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;*&amp;nbsp;$p_\theta(x)$는&amp;nbsp;&quot;신경망&amp;nbsp;파라미터&amp;nbsp;&amp;theta;&quot;에&amp;nbsp;의해&amp;nbsp;정의된&amp;nbsp;생성모델에서&amp;nbsp;데이터&amp;nbsp;x가&amp;nbsp;나올&amp;nbsp;주변확률(확률밀도함수)&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;-&amp;gt;&amp;nbsp;입력&amp;nbsp;데이터를&amp;nbsp;재구성하기&amp;nbsp;위해선&amp;nbsp;얘의&amp;nbsp;기댓값이&amp;nbsp;커져야함.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$ &lt;br /&gt;p_\theta(x)&amp;nbsp;=&amp;nbsp;\int&amp;nbsp;p_\theta(x&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;\,&amp;nbsp;p(z)&amp;nbsp;\,&amp;nbsp;dz &lt;br /&gt;$$&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 그래서 &amp;nbsp;근사$q_\phi(z \mid x)$&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;(얘가 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;인코더가 학습하는 근사 분포&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;를 도입해서 아래처럼 전개&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$&lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;=&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\big[&amp;nbsp;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;\big]&lt;br /&gt;$$&lt;br /&gt;$$&lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;=&amp;nbsp;\mathbb{E}_{z}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;\frac{p_\theta(x^{(i)}&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;p_\theta(z)}{p_\theta(z|x^{(i)})}&amp;nbsp;\right]&lt;br /&gt;$$&lt;br /&gt;$$&lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;=&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;\frac{p_\theta(x^{(i)}&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;p_\theta(z)}{q_\phi(z|x^{(i)})}&amp;nbsp;\cdot&amp;nbsp;\frac{q_\phi(z|x^{(i)})}{p_\theta(z|x^{(i)})}&amp;nbsp;\right]&lt;br /&gt;$$&lt;br /&gt;$$&lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;=&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;p_\theta(x^{(i)}&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;\right]&amp;nbsp;-&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;\frac{q_\phi(z|x^{(i)})}{p_\theta(z)}&amp;nbsp;\right]&amp;nbsp;+&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;\frac{q_\phi(z|x^{(i)})}{p_\theta(z|x^{(i)})}&amp;nbsp;\right]&lt;br /&gt;$$&lt;br /&gt;$$&lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;=&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;p_\theta(x^{(i)}&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;\right]&amp;nbsp;-&amp;nbsp;D_{KL}(q_\phi(z|x^{(i)})&amp;nbsp;\|&amp;nbsp;p_\theta(z))&amp;nbsp;+&amp;nbsp;D_{KL}(q_\phi(z|x^{(i)})&amp;nbsp;\|&amp;nbsp;p_\theta(z|x^{(i)}))&lt;br /&gt;$$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. ELBO 정의: 얘를 최대화해야함.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$ &lt;br /&gt;\log&amp;nbsp;p_\theta(x^{(i)})&amp;nbsp;\geq&amp;nbsp;\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x^{(i)})}&amp;nbsp;\left[&amp;nbsp;\log&amp;nbsp;p_\theta(x^{(i)}&amp;nbsp;\mid&amp;nbsp;z)&amp;nbsp;\right]&amp;nbsp;-&amp;nbsp;D_{KL}(q_\phi(z|x^{(i)})&amp;nbsp;\|&amp;nbsp;p_\theta(z)) &lt;br /&gt;$$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;* ELBO를 최대화해야하지만, 보통 최적화 문제는 식을 최소화하는 방향으로 진행되기에 ELBO식에 -를 붙여서 최적화 진행함.&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Regularization Loss (KL Divergence Term)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ELBO를 최적화하기 위해, ELBO의 두 번째 항인 Regulation Loss을 정의함.&amp;nbsp; 이 항은 KL divergence를 이용하며, $p(z)$와 &lt;span style=&quot;background-color: oklch(0.9902 0.004 106.47); color: oklch(0.3039 0.04 213.68); text-align: start;&quot;&gt;$q_\phi(z \mid x)$&lt;/span&gt;가 정규분포를 따른다고 가정하면 계산이 훨씬 간단해짐&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(1) $p_\theta(z)$는 x에 종속되지 않으므로 고정 분포로 설정하여도 생성 모델의 목표와 모순되지 않음.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(2) 반면 $p_\theta(z|x^{(i)})$는 x에 종속되므로 고정 분포로 설정해 버리면, 입력데이터에 따라 적절한 잠재변수를 만든다는 인코더의 목표와 애초에 모순되어버림.&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(3) $ q_\phi(z|x)$를 정규분포라고 가정하고, KL divergence로 $p_\theta(z)$와 최대한 유사하게 학습하면, 처음 가정한 정규분포 형태로 학습된다.&amp;nbsp;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;$$D_{KL}(q_\phi(z|x) || p_\theta(z)) = \frac{1}{2} \left[ \sum_{j=1}^J (\mu_j^2 + \sigma_j^2 - \log \sigma_j^2 - 1) \right]$$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Reconstruction Loss&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;264&quot; data-start=&quot;61&quot; data-ke-size=&quot;size16&quot;&gt;ELBO를 최적화하기 위해, ELBO의 첫 번째 항인 Reconstruction Loss를 정의함. 기댓값을 정확히 구하기 위해 적분을 한다면 계산량이 매우 높으므로, 이 손실은 몬테카를로 기법을 이용하여 재구성 기댓값을 랜덤으로 샘플링함으로써 계산할 수 있음. 디코더가 베르누이 분포(이진분류)를 따른다고 가정하면, 이 손실 함수는 크로스엔트로피 손실과 동일한 형태가 됨.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$ &lt;br /&gt;-\mathbb{E}_{z&amp;nbsp;\sim&amp;nbsp;q_\phi(z|x)}&amp;nbsp;[\log&amp;nbsp;p_\theta(x|z)]&amp;nbsp;\approx&amp;nbsp;-\sum_{i=1}^N&amp;nbsp;\left[&amp;nbsp;x_i&amp;nbsp;\log&amp;nbsp;\hat{x}_i&amp;nbsp;+&amp;nbsp;(1-x_i)&amp;nbsp;\log&amp;nbsp;(1-\hat{x}_i)&amp;nbsp;\right] &lt;br /&gt;$$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;후기:VAE는 현대 생성 모델의 뿌리가 될 만큼 획기적인 논문이었다. VAE가 발표된 지 10년이 넘은 지금, 많이 사용되는 모델인 Diffusion 모델에도 VAE가 상당한 영향을 끼쳤다는 것을 알 수 있다. 이러한 AI분야의 혁신은 대부분 탄탄한 수학적 기반과 아이디어에서 비롯되는 것 같다. 사실 이 논문을 읽을 때 수식이 너무 많고 변분추론 등 처음보는 수학 개념이 많아 이해하는 데 애를 먹었다. 그런데 이런 아이디어를 스스로 내시는 연구자분들은 얼마나 열심히 공부하신 걸까... 나도 이런 연구자가 되려면 수학공부..열심히 해야겠지?&lt;/p&gt;</description>
      <category>논문리뷰/생성모델</category>
      <category>AI</category>
      <category>ELBO</category>
      <category>GAN</category>
      <category>ML</category>
      <category>VAE</category>
      <category>디퓨전 모델</category>
      <category>딥러닝</category>
      <category>변분추론</category>
      <category>생성모델</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/3</guid>
      <comments>https://juyang22.tistory.com/entry/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-VAE-Auto-Encoding-Variational-Bayes#entry3comment</comments>
      <pubDate>Thu, 25 Sep 2025 20:08:48 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] GCN: SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS</title>
      <link>https://juyang22.tistory.com/entry/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-SEMI-SUPERVISED-CLASSIFICATION-WITH-GRAPH-CONVOLUTIONAL-NETWORKS</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;원본 논문: &lt;a href=&quot;https://arxiv.org/pdf/1609.02907&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://arxiv.org/pdf/1609.02907&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTLObv/btsQND0JZUh/KkfgqE5QUcxyRyZI0rMTh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTLObv/btsQND0JZUh/KkfgqE5QUcxyRyZI0rMTh1/img.png&quot; data-alt=&quot;GCN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTLObv/btsQND0JZUh/KkfgqE5QUcxyRyZI0rMTh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTLObv%2FbtsQND0JZUh%2FKkfgqE5QUcxyRyZI0rMTh1%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;1216&quot; height=&quot;478&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GCN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;이번 글에서는 그래프 구조 데이터를 효과적으로 처리하는 딥러닝 모델인 GCN:&quot;Graph Convolutional Network&quot; 을 리뷰한다. GCN은 2016년 Thomas Kipf와 Max Welling이 발표한 논문 &amp;ldquo;Semi-Supervised Classification with Graph Convolutional Networks&amp;rdquo;에서 처음 제안된 모델로 그래프에서 노드 간의 이웃 구조를 활용해 효과적으로 노드 임베딩을 학습시키고 분류 문제를 해결할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;논문의 제목에서도 드러나듯이 GCN 모델은 &lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;노드와 엣지로 구성되어있는 &lt;/span&gt;그래프를 기반으로 한다. GCN모델에서는 그래프에서 노드를 잘 표현하는 임베딩을 학습시키고, 그 임베딩을 이용하여 노드를 분류하는 것이 task이다. 이러한 GNN모델은 추천시스템나 지식그래프 등에 사용되곤 하는데, 인스타그램의 추천시스템을 예로 들어보자.&lt;br /&gt;인스타그램에서는 사용자가 있고, 게시글(릴스 등)이 있다. 여기서 각 사용자나 릴스는 하나의 노드로 표현이 된다. GCN모델의 task는 노드의 클래스를 분류하는 것이라고 하였다. 그렇다면 이를 인스타그램 추천시스템에 적용시켜본다면 각 사용자나, 게시글이 어떠한 클래스로 분류되는지 맞추는 것이 task에 해당하는 것이다. 위 예시에서 사용자가 릴스에 좋아요를 누른다면 사용자를 표현하는 노드, 릴스를 표현하는 노드는 엣지로 연결되는 것이다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이러한 문제는 그래프 기반 준지도 학습(semi-supervised learning)로 분류할 수 있다. 모든 노드의 레이블을 알 수 없으며, 모델을 활용하는 과정에서 그래프에 새로운 노드들이 계속 추가될 수 있다. 새로 추가된 노드의 레이블을 미리 알 수 없기 때문에, 이러한 환경이 준지도 학습의 필요성을 만드는 근본적인 원인이다. 실제로 해당 논문에서 실험을 할 때 레이블이 정해져있던 노드는 전체의 5%에 불과했다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이전 그래프 기반 준지도학습 방식에서는 라벨 정보가 그래프 구조에서의 명시적인 정규화(식1)을 활용하여 전체 노드 임베딩에&amp;nbsp; 반영될 수 있게 하였다. 손실함수를 라플라시안 정규화를 활용하여 아래의 식과 같이 정의하였다.&amp;nbsp; &lt;br /&gt;$$&lt;br /&gt;L = L_0 + \lambda L_{\mathrm{reg}},\;\mathrm{with}\; L_{\mathrm{reg}} = \sum_{i,j} A_{ij} \| f(X_i) - f(X_j) \|^2 = f(X)^{\top} \Delta f(X) \tag{1} &lt;br /&gt;$$&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 이 방식은 Zhu et al., 2003, Zhou et al., 2004에서 제안된 그래프 라플라시안 정규화 기반 준지도 학습 접근법이다.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;* 라플라시안 행렬이란, 차수행렬에서 인접행렬을 뺀 행렬이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2148&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cubc4x/btsQNs6bLT5/iqP72yIAcWv225Xq0YxAX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cubc4x/btsQNs6bLT5/iqP72yIAcWv225Xq0YxAX0/img.png&quot; data-alt=&quot;순서대로 차수행렬, 인접행렬, 라플라시안 행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cubc4x/btsQNs6bLT5/iqP72yIAcWv225Xq0YxAX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcubc4x%2FbtsQNs6bLT5%2FiqP72yIAcWv225Xq0YxAX0%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;2148&quot; height=&quot;500&quot; data-origin-width=&quot;2148&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순서대로 차수행렬, 인접행렬, 라플라시안 행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;위 식에서 $L_0$은&amp;nbsp; 라벨이 있는 노드에 대한 손실을 의미한다. 한편, 라벨이 없는 노드에 대한 손실은 $ L_{\mathrm{reg}}$로 정의되는데, &lt;span style=&quot;color: #000000;&quot;&gt;이는 라벨이 있는 노드의 예측값과 라벨이 없는 노드의 예측값 사이의 차이를 기반으로 한다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt; 이때 인접행렬 $A_{ij}$를 곱하여, 서로 연결된 노드에 대해서만 손실이 반영되게 한다.&amp;nbsp; 함수 $f$는 신경망으로 구성된 함수이고, $X$는 노드의 특징행렬(임베딩 등)을 의미한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;식 $ L_{\mathrm{reg}}$는&amp;nbsp;$ f(X)^{\top} \Delta f(X) $로&lt;span style=&quot;color: #333333;&quot;&gt; 다시 표현될 수 있는데, $ \Delta $&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;는 라플라시안 행렬을 의미한다. &lt;/span&gt;식 $ f(X)^{\top} \Delta f(X) $ 는 그래프 간의 연결 관계 및 강도를 나타내는 라플라시안 행렬을 이용해서, 인접 노드들 사이의 예측의 차이를 나타낸다. 이렇게 설정한 손실은 인접 노드들 간의 출력이 유사해야 한다는 가정을 반영한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이 수식에서 라벨이 없는 노드들에 대한 손실을 보면 라벨이 있는 노드와 인접한 라벨이 없는 노드들은 유사할 것이라는 가정을 전제로 한다.&amp;nbsp; 본 논문의 저자는&amp;nbsp; 그래프의 엣지가 꼭 노드의 유사성만을 의미하는 것은 아니기에 이러한 정규화된 손실함수 식의 한계를 지적한다. 따라서 본 논문은 라벨이 있는 노드들만을 대상으로 손실을 계산하되, 그 손실이 라벨이 없는 노드들까지도 역전파될 수 있도록 아키텍쳐를 설계하였다. 이를 통해 레이블이 있든 없든, 모든 노드의 특징 표현을 효과적으로 학습할 수 있게 만들었다.&lt;br /&gt;&lt;br /&gt;후술하겠지만 기존의 방식은 인접노드만을 반영하는 spectral 방식이었다. 하지만 GCN은 인접노드들에 대해 convolution연산을 여러 레이어에 결쳐 반복적으로 수행한다. 이를 통해 인접하지는 않은 노드들(이웃노드의 이웃노드..)도 반영할 수 있도록 하여 그래프 전반적인 구조가 모델에 반영될 수 있게 하였다.&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Fast approximate convolution on graphs&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;GCN모델은 각&amp;nbsp; 노드들의 임베딩을 다음과 같은 함수에 여러 레이어에 걸쳐 통과시키면서 업데이트한다.&amp;nbsp;&lt;br /&gt;$$&lt;br /&gt;H^{(l+1)} = \sigma\left( \tilde{D}^{- \frac{1}{2}} \tilde{A} \tilde{D}^{- \frac{1}{2}} H^{(l)} W^{(l)} \right) \tag{2}&lt;br /&gt;$$&lt;br /&gt;여기서 $H^{(l+1)}$는 l+1번째 레이어에서의 노드들의 임베딩, $W^{(l)}$는 l번째 레이어에서의 학습 가능한 가중치 행렬, $\sigma$는 활성화 함수이다.&amp;nbsp;$\tilde{A} = A + I_N$은 원본 인접행렬 $A$에 항등행렬 $I_N$을 더한 것이다. $\tilde{D}$는 인접행렬 $\tilde{A}$에 대응하는 차수행렬이다. 또한 &amp;nbsp;$0$번째 레이어(입력 계층)의 $H$는 초기 노드의 임베딩 $X$이다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이 수식을 직관적으로 봤을 때 그래프 간의 연결관계를 인접행렬과 차수행렬을 이용해서 표현했다고 생각할 수 있다. 하지만 그래프의 연결관계를 표현해주는 행렬은 인접행렬 $A$이다. GCN은 기본적으로 인접노드만을 반영하여 노드 상태를 업데이트한다. 이를 여러번 재귀적으로 적용하여 인접노드의 인접노드, 인접노드의 인접노드의 인접노드... 이렇게 반영하게 하여 전체 그래프를 모델에 주입해주는 것이다. 따라서 한번에 모든 그래프의 연결관계를 모델에 주입해주는 것이 아니기에, 그래프의 연결관계는 인접행렬 $A$ 혼자 담당할 수 있게 된다. 그렇다면 $\tilde{D}$는 왜 필요한 걸까? 그를 알기전에 인접행렬 $A$가 어떻게 인접한 노드들을 연결해주는지 자세히 알아보아야한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;먼저 간단한 예시로 노드 A가 노드B,C,D 연결된 아래의 그림과 같은 상황을 가정해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zCXNo/btsQOBuyyN4/LQjmlRcnr1AbPYTpCspVG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zCXNo/btsQOBuyyN4/LQjmlRcnr1AbPYTpCspVG1/img.png&quot; data-alt=&quot;그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zCXNo/btsQOBuyyN4/LQjmlRcnr1AbPYTpCspVG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzCXNo%2FbtsQOBuyyN4%2FLQjmlRcnr1AbPYTpCspVG1%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;275&quot; height=&quot;275&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;l+1번째에서 노드A의 임베딩을 주위의 노드들의 임베딩을 반영하여 나타내기 위해 아래와 같이 나타낼 수 있다.&amp;nbsp;&lt;br /&gt;$$&lt;br /&gt;H^{(l+1)}_A&amp;nbsp;=&amp;nbsp;\sigma&amp;nbsp;\bigg(&amp;nbsp;H^{(l)}_A&amp;nbsp;W^{(l)}&amp;nbsp;+&amp;nbsp;H^{(l)}_B&amp;nbsp;W^{(l)}&amp;nbsp;+&amp;nbsp;H^{(l)}_C&amp;nbsp;W^{(l)}&amp;nbsp;+&amp;nbsp;H^{(l)}_D&amp;nbsp;W^{(l)}&amp;nbsp;+&amp;nbsp;b^{(l)}&amp;nbsp;\bigg) &lt;br /&gt;$$&lt;br /&gt;이제 l+1번째 레이어에서 모든 노드(A,B,C,D)의 임베딩을 한 번에 행렬로써 표현하려 한다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;노드A의 임베딩을 행렬 $N_A \in \mathbb{R}^{1 \times d}$로 나타낼 때,&amp;nbsp; $H^{(l+1)}_i = (N_A, N_B, N_C, N_D) \in \mathbb{R}^{4 \times d}$이라하자.&amp;nbsp; 그리고 아래와 같이 $A \in \mathbb{R}^{4 \times 4}$에 $H^{(l)}_i \in \mathbb{R}^{4 \times d}$를 곱해주면, 행렬곱만으로 이웃 노드 임베딩끼리의 합을 구할 수 있다. 여기에 $W \in \mathbb{R}^{d \times d}$를 곱해주고 bias를 더한 뒤, 활성화 함수에 넘기면 다음 레이어의 각 노드들의 임베딩 행렬을 바로 구할 수 있다.&amp;nbsp;&lt;br /&gt;$$&lt;br /&gt;H^{(l+1)}_i&amp;nbsp;=&amp;nbsp;\sigma&amp;nbsp;\left(&amp;nbsp;\sum_{j&amp;nbsp;\in&amp;nbsp;N(i)}&amp;nbsp;H^{(l)}_j&amp;nbsp;W^{(l)}&amp;nbsp;+&amp;nbsp;b^{(l)}&amp;nbsp;\right&amp;nbsp;) &lt;br /&gt;= \sigma \left( A H^{(l)}_i W^{(l)} + b^{(l)} \right)&lt;br /&gt;$$&lt;br /&gt;&amp;nbsp;&lt;br /&gt;위 수식에서 행렬 $A$는 단위행렬과 인접행렬의 합으로 표현되었다.&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;1306&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmtab/btsQMMqmViH/ak7ap9amKrVFjBlwmt8Sv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmtab/btsQMMqmViH/ak7ap9amKrVFjBlwmt8Sv0/img.png&quot; data-alt=&quot;인접행렬 A(그치만 단위행렬을 더한)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmtab/btsQMMqmViH/ak7ap9amKrVFjBlwmt8Sv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpmtab%2FbtsQMMqmViH%2Fak7ap9amKrVFjBlwmt8Sv0%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;206&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인접행렬 A(그치만 단위행렬을 더한)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;노드별 임베딩 행렬 $H^{(l)} \in \mathbb{R}^{4 \times d}$은 아래와 같이 표현될 수 있다.&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;1562&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfnJJM/btsQN1m0F1g/fScBUJgAeKA5udPCogH0xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfnJJM/btsQN1m0F1g/fScBUJgAeKA5udPCogH0xK/img.png&quot; data-alt=&quot;노드 임베딩 행렬 H&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfnJJM/btsQN1m0F1g/fScBUJgAeKA5udPCogH0xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfnJJM%2FbtsQN1m0F1g%2FfScBUJgAeKA5udPCogH0xK%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;697&quot; height=&quot;192&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;노드 임베딩 행렬 H&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;이제 인접행렬만으로 인접 노드들의 관계를 나타낼 수 있는데 왜 차수행렬을 썼을까? 라는 의문이 들 수 있다. 위의 예시행렬 A와 H를 곱해보면 인접한 이웃 노드가 가장 많은 노드A의 임베딩은 다른 노드들의 임베딩에 비해 값이 훨씬 커지게 된다. 이러한 상황은 학습을 불안정하게 만들게 되고, 따라서 이를 정규화해주기 위해 차수행렬&amp;nbsp;&amp;nbsp;$\tilde{D}^{-1/2}$을 양옆에 곱해주는 것이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;기존 스펙트럴 그래프 이론에서는 그래프 라플라시안 행렬 $ L $을 활용하여 노드 간의 관계와 그래프의 전체 구조를 표현하였다. 그래프는 유클리드 공간이 아닌 비유클리드 공간에 정의되므로, CNN의 전통적인 컨볼루션 연산을 직접 적용할 수 없다. 이를 해결하기 위해 라플라시안 행렬을 고유분해하여 고유벡터 행렬 $ U $와 고유값 행렬 $ \Lambda $를 얻는다. 고유벡터 행렬 $ U $는 그래프의 구조적 특성을 반영하는 기저로 사용되며, 이를 통해 그래프 신호를 푸리에 도메인으로 변환하여 표현한다. 이후 푸리에 도메인에서 필터 $ g_\theta(\Lambda) $를 적용하여 스펙트럴 컨볼루션 연산을 수행한다. 이 과정은 다음과 같은 식으로 표현된다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;$$ g_\theta * x = U g_\theta(\Lambda) U^T x $$.&lt;br /&gt;이 수식에 대한 자세한 논의는 해당 링크를 참조하길 바란다:&amp;nbsp;&lt;a href=&quot;https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;2025.09.26 - [AI/딥러닝] - [GNN] GNN을 위한 그래프 푸리에 변환과 스펙트럴 필터링&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;[GNN] GNN을 위한 그래프 푸리에 변환과 스펙트럴 필터링&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;그래프 푸리에 변환은 GNN과 그래프 신호 처리에서 왜 중요할까? 이는 그래프 내 중요한 구조적 특성, 예를 들어 커뮤니티 구조, 노드 간 연결 패턴, 경계나 노이즈를 주파수 도메인에서 포착하기&quot; data-og-host=&quot;juyang22.tistory.com&quot; data-og-source-url=&quot;https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/XD1lF/hyZJ4uiH8F/AAAAAAAAAAAAAAAAAAAAAHcgBjiCFY-vGU1b-7znY7kKCiR2e1_LDfrdxjAxGFJA/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1759244399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=ZGUXOkXQ%2BaJQkM1nR%2FdHmnZKRz0%3D&quot; data-og-url=&quot;https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81&quot;&gt;&lt;a href=&quot;https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://juyang22.tistory.com/entry/GNN-GNN%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B7%B8%EB%9E%98%ED%94%84-%ED%91%B8%EB%A6%AC%EC%97%90-%EB%B3%80%ED%99%98%EA%B3%BC-%EC%8A%A4%ED%8E%99%ED%8A%B8%EB%9F%B4-%ED%95%84%ED%84%B0%EB%A7%81&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/XD1lF/hyZJ4uiH8F/AAAAAAAAAAAAAAAAAAAAAHcgBjiCFY-vGU1b-7znY7kKCiR2e1_LDfrdxjAxGFJA/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1759244399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=ZGUXOkXQ%2BaJQkM1nR%2FdHmnZKRz0%3D');&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;[GNN] GNN을 위한 그래프 푸리에 변환과 스펙트럴 필터링&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;그래프 푸리에 변환은 GNN과 그래프 신호 처리에서 왜 중요할까? 이는 그래프 내 중요한 구조적 특성, 예를 들어 커뮤니티 구조, 노드 간 연결 패턴, 경계나 노이즈를 주파수 도메인에서 포착하기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;juyang22.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;그러나 라플라시안 행렬의 고유분해는 $ O(N^3) $의 시간 복잡도를 가지며, 행렬 곱셈 또한 $ O(N^3) $로 대규모 그래프에서 비효율적이다. 따라서 본 논문에서는 체이비쇼프 다항식에 정규화 트릭($ \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2} X \Theta $)을 반영해 컨볼루션을 근사하여 고유분해 없이 그래프 구조를 반영하였다. 인접 행렬 $ \tilde{A} $는 희소 행렬이므로, 행렬 곱의 시간 복잡도는 간선 수 $ |E| $에 비례한다. 한 레이어의 시간 복잡도는 $ O(|E| C F) $로, 여기서 $ C $는 입력 특징 차원, $ F $는 출력 특징 차원이다. 여러 레이어를 사용할 시, 레이어 개수=$H$라면 연산의 시간복잡도는 $O(|E| C H F)$이다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;그렇다면 전체 그래프의 구조를 모델에 어떻게 반영해주는 걸까? GCN은 다층 레이어를 쌓아 그래프의 전체 구조를 모델에 반영한다. 첫 번째 레이어에서 각 노드는 1-홉 이웃(예: 노드 A는 B, C, D)의 정보를 집계하고, 두 번째 레이어에서는 2-홉 이웃까지 포함한다. 이를 표현한 2층 GCN 수식은 다음과 같다.&amp;nbsp;&lt;br /&gt;$$Z = f(X, A) = \text{softmax} \left( \hat{A} \text{ReLU} \left( \hat{A} X W^{(0)} \right) W^{(1)} \right)$$&lt;br /&gt;여기서 $\hat{A} = \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2}$, $\tilde{A} = A + I_N$은 자기 루프를 추가한 인접 행렬, $W^{(0)}$와 $W^{(1)}$은 각각 첫 번째와 두 번째 레이어의 가중치 행렬이다. 다층 레이어를 쌓으면 더 넓은 이웃 정보를 포함해 그래프 전체 구조를 학습할 수 있지만, 너무 많은 레이어(보통 2~3층 초과)를 쌓으면 오버 스무딩(over-smoothing)으로 인해 노드 특징이 희석되어 구분력이 떨어진다. 이를 인스타그램 추천 시스템에 비유하자면, 내가 보는 릴스는 내 친구(A가 B, C, D를 팔로우)와 그 친구들의 친구들의 취향이 반영된 결과와 비슷하다. 하지만 너무 먼 이웃(4-홉 이상)까지 포함하면 추천이 너무 일반화되어 내 개별 취향을 반영하지 못할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mgdQE/btsQMGREFEE/xCsm8TJQl4MUBKJJX9NZgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mgdQE/btsQMGREFEE/xCsm8TJQl4MUBKJJX9NZgk/img.png&quot; data-alt=&quot;over-smoothing&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mgdQE/btsQMGREFEE/xCsm8TJQl4MUBKJJX9NZgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmgdQE%2FbtsQMGREFEE%2FxCsm8TJQl4MUBKJJX9NZgk%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;253&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;over-smoothing&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;여러 레이어를 통과시키면 이웃의 이웃노드까지 반영할 수 있다는 것을 직관적으로 설명하기 위해&amp;nbsp; A-B-C로 연결된 그래프 상황을 가정해보자. 레이어를 한 개 통과시키면 B 노드는 A노드의 정보를 반영할 수 있다. 하지만 노드C는 노드A와 직접 연결되어있지 않기에 노드A의 정보를 반영할 수 없다. 이후 두 번째 레이어에 통과시키면 노드C는 노드A의 정보를 반영한 노드B의 정보를 반영할 수 있게 되므로 그래프의 전체적인 구조를 반영할 수 있게 되는 것이다. $node(n)$을 n번 연결되어야 나오는 노드라고 한다면, n개의 레이어를 통과시키면 $node(n)$까지의 노드들을 반영할 수 있게 된다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;마지막으로 GCN모델의 손실함수가 어떻게 정의되는지 알아보자. GCN모델은 준지도학습 모델이기에 손실함수도 조금 독특하다.&lt;br /&gt;$$L = - \sum_{l \in Y_L} \sum_{f=1}^{F} Y_{lf} \ln Z_{lf}$$&lt;br /&gt;(식1)의 손실 $L=L_0+ \lambda L_{\mathrm{reg}},\;\mathrm{with}\; L_{\mathrm{reg}}=\sum_{i,j} A_{ij} \| f(X_i) - f(X_j) \|^2$은 라벨이 없는 노드의 경우 라벨이 있는 노드와의 차이도 함께 손실에 반영되었다. 하지만 GCN모델은 라벨이 있는 노드만 손실에 반영하고, 이 손실이 라벨이 없는 노드까지 역전파되게 한다. 이는 인접행렬을 통해 인접한 노드들의 임베딩이 서로 이어져있다고 볼 수 있기에 가능하다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;GCN의 손실함수는 라벨이 있는 노드($Y_L$)에 대해 크로스엔트로피 손실을 계산한다. 여기서 $Y_{lf}$는 노드 $l$의 실제 라벨(원-핫 벡터로 구성)을, $Z_{lf}$는 모델이 예측한 클래스 $f$의 확률을 나타낸다. 이 손실은 라벨이 있는 노드만 대상으로 하지만 그래프의 인접 행렬을 통해 라벨이 없는 노드까지 학습이 전파되어 준지도 학습의 효과를 극대화한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>논문리뷰/추천시스템</category>
      <category>AL/ML</category>
      <category>gcn</category>
      <category>GNN</category>
      <category>논문리뷰</category>
      <category>추천시스템</category>
      <author>유사컴공</author>
      <guid isPermaLink="true">https://juyang22.tistory.com/1</guid>
      <comments>https://juyang22.tistory.com/entry/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-SEMI-SUPERVISED-CLASSIFICATION-WITH-GRAPH-CONVOLUTIONAL-NETWORKS#entry1comment</comments>
      <pubDate>Wed, 24 Sep 2025 19:34:31 +0900</pubDate>
    </item>
  </channel>
</rss>