<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Minhyeok Lee</title>
    <link>https://hydragon516.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 3 Jun 2026 19:56:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hydragon</managingEditor>
    <image>
      <title>Minhyeok Lee</title>
      <url>https://tistory1.daumcdn.net/tistory/3081614/attach/a7ca9dbe588749b9986ea67a9f6a8c38</url>
      <link>https://hydragon516.tistory.com</link>
    </image>
    <item>
      <title>Taming Transformers for High-Resolution Image Synthesis</title>
      <link>https://hydragon516.tistory.com/entry/Taming-Transformers-for-High-Resolution-Image-Synthesis</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VQ-GAN을 이해하기 위해서는 VAE(Variational Auto-Encoder)와 VQ-VAE에 대한 지식이 필요하다.&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;1. VAE&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOyZbV/btsB8VN1aui/l6NcRQSxILmqEUrBBx9k81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOyZbV/btsB8VN1aui/l6NcRQSxILmqEUrBBx9k81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOyZbV/btsB8VN1aui/l6NcRQSxILmqEUrBBx9k81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOyZbV%2FbtsB8VN1aui%2Fl6NcRQSxILmqEUrBBx9k81%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;605&quot; height=&quot;605&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VAE의 대략적인 구조는 위와 같다. &lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;Input image $x$를 인코더에 통과시켜 latent vector $z$를 생성하고, $z$를 다시 디코더에 통과시켜 기존 input $x$와 비슷하지만 새로운 이미지 $x$를 찾아내는 구조이다. 그렇다면 auto-encoder와의 차이점은 무엇인가?&lt;br /&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;1280&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/behv4w/btsB5Flm0uZ/klw6FPYXo5OTtXEvWKM1B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/behv4w/btsB5Flm0uZ/klw6FPYXo5OTtXEvWKM1B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/behv4w/btsB5Flm0uZ/klw6FPYXo5OTtXEvWKM1B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbehv4w%2FbtsB5Flm0uZ%2Fklw6FPYXo5OTtXEvWKM1B0%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;1280&quot; height=&quot;387&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;387&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: #24292f; text-align: start;&quot;&gt;위 그림과 같이 a&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;uto-encoder는 특정 입력 이미지를 잘 임베딩 하여 원본 이미지로 복원하는 과정을 학습한다. 즉 feature 추출과 압축을 위한 과정을 학습한다. 반면 VAE는 어떠한 latent space가 원하는 이미지를 만들어 내는지 그 확률 분포를 학습한다. 즉 새로운 이미지 생성을 위한 모델이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCZ1ha/btsB5GxOIKE/k4AVqHpHDpkt8Vb7jk2JW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCZ1ha/btsB5GxOIKE/k4AVqHpHDpkt8Vb7jk2JW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCZ1ha/btsB5GxOIKE/k4AVqHpHDpkt8Vb7jk2JW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCZ1ha%2FbtsB5GxOIKE%2Fk4AVqHpHDpkt8Vb7jk2JW1%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;948&quot; height=&quot;427&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;427&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;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;결과적으로 &lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;latent space&lt;/span&gt;의 &quot;분포&quot;가 중요하기 때문에 VAE의 인코더는 입력 이미지 $x$를 인코딩한 확률 분포 $q_\phi(\mathbf{z} \mid \mathbf{x})$의 평균 $\mu$와 표준편차 $\sigma$의 값을 학습한다. 반대로 디코더는 latent space $z$를 다시 input $x$로 변환하는 역할을 한다. 만약 입력 이미지로부터 생성된 $z$를 그대로 사용한다면 VAE는 언제나 입력 이미지와 동일한 이미지만 생성이 가능할 것이다. 이러한 문제를 해결하기 위해 가우시안 분포 $N(O,I)$&amp;nbsp;를 따르는 노이즈 $\epsilon$을 샘플링하여 새로운 latent space $\mathrm{z}=\mu+\sigma^2 \cdot \epsilon$를 생성한다. 이러한 방법을&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;reparametererization trick이라고 부르는데, 사실 노이즈를 샘플링하는 과정은 미분이 불가능하기 때문에 학습을 위해 $z$를 이러한&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt; 형태로 표현하는 것이다. 결과적으로 디코더는 latent vector $z$가 주어졌을 때 $x$의 분포 $p_\theta(\mathbf{x} \mid \mathbf{z})$를 approximate하는 것을 목적으로 한다. $z$ 주어짐에 따라 다시 데이터 $x$를 generate하는 역할을 하기 때문에 디코더가가 generative model의 역할을 하게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;이제 VAE를 학습하기 위해 maximum likelihood를 적용한다. 이를 수식으로 표현하면 다음과 같다. (마지막 줄은 KL divergence의 정의를 활용한다.)&lt;br /&gt;&lt;br /&gt;$$&lt;br /&gt;\begin{aligned}&lt;br /&gt;\log&amp;nbsp;p_\theta(\mathbf{x})&amp;nbsp;&amp;amp;&amp;nbsp;=\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;p_\theta(\mathbf{x})&amp;nbsp;d&amp;nbsp;\mathbf{z}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;\frac{p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})&amp;nbsp;p(\mathbf{z})}{p_\theta(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})}&amp;nbsp;d&amp;nbsp;\mathbf{z}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;\frac{p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})&amp;nbsp;p(\mathbf{z})}{p_\theta(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})}&amp;nbsp;\frac{q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})}{q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})}&amp;nbsp;d&amp;nbsp;\mathbf{z}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})&amp;nbsp;d&amp;nbsp;\mathbf{z}-K&amp;nbsp;L\left(q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\|&amp;nbsp;p(\mathbf{z})\right)+K&amp;nbsp;L\left(q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\|&amp;nbsp;p_\theta(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})\right)&lt;br /&gt;\end{aligned}&lt;br /&gt;$$&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;마지막 식에서 첫째 항은 인코더로부터 $z$를 sampling하고, 다시 이 $z$로부터 디코더를 활용해서 $p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})$를 계산함으로써 구할수 있다. 그리고 두 번째 항은 $q$와 $p$가 둘 다 정규분포이기 때문에, 정규분포 두 개 사이의 KL divergence는 쉽게 계산이 가능하다. 하지만 세 번째 항은 우리가 &lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;$p_\theta(\mathbf{z} \mid \mathbf{x})$&lt;/span&gt; 를 알 수가 없기 때문에 계산하는 것이 불가능하다. 하지만 우리는 KL divergence가 항상 양수라는 것을 안다. 그래서 우리는 마지막 식을 다음과 같은 부등식으로 표현할 수 있다. 이것이 그 유명한 (evidence lower bound, ELBO이다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;$$&lt;br /&gt;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;=\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})&amp;nbsp;d&amp;nbsp;\mathbf{z}-K&amp;nbsp;L\left(q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\|&amp;nbsp;p(\mathbf{z})\right)+K&amp;nbsp;L\left(q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\|&amp;nbsp;p_\theta(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})\right)&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;\geq&amp;nbsp;\int&amp;nbsp;q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\log&amp;nbsp;p_\theta(\mathbf{x}&amp;nbsp;\mid&amp;nbsp;\mathbf{z})&amp;nbsp;d&amp;nbsp;\mathbf{z}-K&amp;nbsp;L\left(q_\phi(\mathbf{z}&amp;nbsp;\mid&amp;nbsp;\mathbf{x})&amp;nbsp;\|&amp;nbsp;p(\mathbf{z})\right)&amp;nbsp;\longleftarrow&amp;nbsp;\text&amp;nbsp;{&amp;nbsp;Evidence&amp;nbsp;lower&amp;nbsp;bound&amp;nbsp;(ELBO)&amp;nbsp;}&lt;br /&gt;\end{aligned}&lt;br /&gt;$$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;2. VQ-VAE (Vector Quantization Variational Auto Encoder)&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdr7Zn/btsB5WHrHDj/KDy6JrPgGawYSkbgJqrhi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdr7Zn/btsB5WHrHDj/KDy6JrPgGawYSkbgJqrhi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdr7Zn/btsB5WHrHDj/KDy6JrPgGawYSkbgJqrhi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdr7Zn%2FbtsB5WHrHDj%2FKDy6JrPgGawYSkbgJqrhi0%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;1280&quot; height=&quot;370&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위 그림과 같이 VQ-VAE는 기존 VAE에 discrete 한 codebook을 추가한 버전이다. 인코더의 출력으로 어떤 벡터가 나오면, codebook의 모든 벡터들 간 거리를 계산한다. Codebook의 벡터들 중 인코더의 출력 벡터와 가장 거리가 짧은 벡터를 찾고, 그 벡터를 디코더에 넣어 학습하는 구조이다. 위 그림을 참고하면 다음과 같은 수식으로 계산된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;$z_q(x)=e_k,&amp;nbsp;\quad&amp;nbsp;\text&amp;nbsp;{&amp;nbsp;where&amp;nbsp;}&amp;nbsp;\quad&amp;nbsp;k=\operatorname{argmin}_j\left\|z_e(x)-e_j\right\|_2$&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;문제는 위 식이 미분 불가능함으로 gradient를 계산할 수 없다는 것이다. 대신 straight-through estimator와 비슷한 방법을 사용하여 gradient를 근사할 수 있다. 좀 더 자세히 설명하면 디코더 입력인 $z_q(x)$의 gradient를 인코더의 출력 쪽으로 &amp;nbsp;gradient 복사하면 된다는 것이다. 따라서 전체 loss function은 다음과 같다.&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$L=\log&amp;nbsp;p\left(x&amp;nbsp;\mid&amp;nbsp;z_q(x)\right)+\left\|\operatorname{sg}\left[z_e(x)\right]-e\right\|_2^2+\beta\left\|z_e(x)-\operatorname{sg}[e]\right\|_2^2$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 항은 reconstruction loss로 위에서 설명한 estimator를 통해 decoder와 encoder를 모두 최적화한다. 임베딩&lt;span&gt; $e_i$&lt;/span&gt;는 어떤 gradient도 받지 못하기 때문에 Vector Quantisation(VQ)를 사용한다. 두 번째 항의 VQ objective는 각 $e$를 인코더의 출력&lt;span&gt; $z_e(x)$&lt;/span&gt;로 이동하게끔 한다. 마지막으로 embedding space는 무한하기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: left;&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;msub&amp;gt;&amp;lt;mi&amp;gt;e&amp;lt;/mi&amp;gt;&amp;lt;mi&amp;gt;i&amp;lt;/mi&amp;gt;&amp;lt;/msub&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt; $e_i$ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 인코더 parameter만큼 빠르게 학습되지 않을 수 있다. 인코더가 embedding과 출력이 grow할 수 있게 만들기 위해 3번째 항 commitment loss를 추가한다.&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;3. VQ-GAN&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDkAvy/btsB7WfoMtI/sCizUSVssIZYJ9kdGU4FVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDkAvy/btsB7WfoMtI/sCizUSVssIZYJ9kdGU4FVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDkAvy/btsB7WfoMtI/sCizUSVssIZYJ9kdGU4FVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDkAvy%2FbtsB7WfoMtI%2FsCizUSVssIZYJ9kdGU4FVk%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;1253&quot; height=&quot;495&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;495&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;마지막으로 VQ-VAE의 GAN 확장 버전인 VQ-GAN의 구조는 위와 같다. 그림과 같이 VQ-GAN은 VQ-VAE와 거의 동일한 구조를 가지지만 몇가지 차이점이 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;VQ-VAE와 달리 adversarial learning을 사용하여 학습을 진행한다. VQ-VAE 처럼 Encoder에서 나온 vector 값과 codebook 간의 유클리디안 distance를 비교한 후 distance가 가장 작은 vector 들의 값으로 quantized vector를 구성한다. 이렇게 생성한 feature를 디코더에 넣어 reconstruction image를 생성한다. 그리고 이를 discriminator에 넣어 patch 단위로 real인지 fake인지 판단한다.&lt;/li&gt;
&lt;li&gt;Code book에 transformer를 추가하여 codebook의 index를 전에 나왔던 값을 기반으로 auto-regressive 하게 예측한다. $i$ 번째 보다 작은 값들을 이용하여 $i$ 번째의 index를 예측하는 것이다. 따라서 이렇게 예측한 $i$ 번째 index 값을 codebook 과 mapping 하여 생성하는 이미지 다음 patch vector를 구성한다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구성된 이유는 일반적으로 CNN은 local 정보에, transformer는 global 정보에 특화 되어있기 때문에 CNN을 통해 각 영역별 $z$를 추출하고 transformer로 전체 순서를 예측한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VQ-GAN의 loss function은 아래와 같다. VQ-VAE와 거의 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\begin{aligned}&lt;br /&gt;\mathcal{L}_{\mathrm{VQ}}(E,&amp;nbsp;G,&amp;nbsp;\mathcal{Z})=\|x-\hat{x}\|^2&amp;nbsp;&amp;amp;&amp;nbsp;+\left\|\operatorname{sg}[E(x)]-z_{\mathbf{q}}\right\|_2^2+\beta\left\|\operatorname{sg}\left[z_{\mathbf{q}}\right]-E(x)\right\|_2^2&lt;br /&gt;\end{aligned}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN loss는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$\mathcal{L}_{\mathrm{GAN}}(\{E,&amp;nbsp;G,&amp;nbsp;\mathcal{Z}\},&amp;nbsp;D)=[\log&amp;nbsp;D(x)+\log&amp;nbsp;(1-D(\hat{x}))]$&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;따라서 전체 loss는 다음과 같다.&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;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;\mathcal{Q}^*=\underset{E,&amp;nbsp;G,&amp;nbsp;\mathcal{Z}}{\arg&amp;nbsp;\min&amp;nbsp;}&amp;nbsp;\max&amp;nbsp;_D&amp;nbsp;\mathbb{E}_{x&amp;nbsp;\sim&amp;nbsp;p(x)}\left[\mathcal{L}_{\mathrm{VQ}}(E,&amp;nbsp;G,&amp;nbsp;\mathcal{Z})+\lambda&amp;nbsp;\mathcal{L}_{\mathrm{GAN}}(\{E,&amp;nbsp;G,&amp;nbsp;\mathcal{Z}\},&amp;nbsp;D)\right]&lt;br /&gt;\end{aligned}&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;이때 $\lambda$는 &lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;adaptive weight&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;로 두&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;loss&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;간의 균형을 맞추는 값이다. 이는 &lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;$\lambda=\frac{\nabla_{G_L}\left[\mathcal{L}_{\mathrm{rec}}\right]}{\nabla_{G_L}\left[\mathcal{L}_{\mathrm{GAN}}\right]+\delta}$&lt;/span&gt;&lt;/p&gt;</description>
      <category>논문 정리</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/99</guid>
      <comments>https://hydragon516.tistory.com/entry/Taming-Transformers-for-High-Resolution-Image-Synthesis#entry99comment</comments>
      <pubDate>Sat, 16 Dec 2023 20:03:21 +0900</pubDate>
    </item>
    <item>
      <title>DDPM: Denoising Diffusion Probabilistic Model</title>
      <link>https://hydragon516.tistory.com/entry/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DDPM-Denoising-Diffusion-Probabilistic-Model</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DDPM이 무엇인지는 너무 유명하니 패스한다. DDPM에서 설명하는 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;diffusion 방식은 아래 그림과 같다.&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;1280&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9FLT9/btsA9R7jblK/ongiKOziBvGsoIY1B0URY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9FLT9/btsA9R7jblK/ongiKOziBvGsoIY1B0URY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9FLT9/btsA9R7jblK/ongiKOziBvGsoIY1B0URY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9FLT9%2FbtsA9R7jblK%2FongiKOziBvGsoIY1B0URY1%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;1280&quot; height=&quot;305&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;305&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;먼저 DDPM은 이미지에 작은 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;가우시안 노이즈를 더하는 과정의 역과정 (즉 노이즈를 제거하는 과정) 역시 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;가우시안 분포로 모델링이 가능하다는 가정으로 시작한다. 즉 다시 말하면 normal distribution에 대한 노이즈가 주어졌을 때 이를 어떻게 복원할 것인가에 대한 문제를 모델이 해결하는 것이다.&lt;br /&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;819&quot; data-origin-height=&quot;211&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6u9vq/btsBb5LssWn/wZrYKs3Y9Qub44r8LjIsj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6u9vq/btsBb5LssWn/wZrYKs3Y9Qub44r8LjIsj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6u9vq/btsBb5LssWn/wZrYKs3Y9Qub44r8LjIsj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6u9vq%2FbtsBb5LssWn%2FwZrYKs3Y9Qub44r8LjIsj0%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;819&quot; height=&quot;211&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;211&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: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;먼저 $t$ 시간 이미지 $X_t$에 노이즈 $I$를 더하는 과정의 확률분포 $q \left ( X _ { t } \mid X _ { t-1 } \right ) $는 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$q \left ( X _ { t } \mid X _ { t-1 } \right ) = \mathcal{N}&amp;nbsp; \left ( X _ { t } ; \sqrt { 1- \beta _ { t } } X _ { t-1 } , \beta _ { t } I \right )$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$ \beta _ { t } $는 $t$ 시간에서 이미지에 노이즈를 얼마나 더할지에 대한 값이다. 먼저 $ \mathcal{N}&amp;nbsp; \left ( X _ { t } ; \sqrt { 1- \beta _ { t } } X _ { t-1 } , \beta _ { t } I \right )$와 같은 꼴로 표현한 이유를 간단하게 설명하자면&lt;br /&gt;&lt;br /&gt;$Var \left ( ax \right ) =a ^ { 2 } Var \left ( x \right )$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$Var \left ( x+y \right ) =Var \left ( x \right ) +Var \left ( y \right )$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;의 variance 성질을 사용하면&amp;nbsp;&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$Var \left ( \sqrt { 1- \beta _ { t } } X _ { t } + \beta _ { t } \right ) =Var \left ( \left ( \sqrt { 1- \beta _ { t } } \right ) ^ { 2 } + \beta _ { t } \right ) =Var \left ( 1 \right )$&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;variance를 항상 1로 고정할 수 있기 때문이다. &lt;/span&gt;이 값은 learnable parameter로 둘 수도 있지만, 실험을 해보니 상수로 두어도 큰 차이가 없어서 constant로 두었다고 한다. 논문에서는 $t$에따라 $10^-4$에서 $0.02$로 linear하게 증가시킨다.&lt;span style=&quot;color: #333333; text-align: left;&quot;&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;이제 만약 최초의 이미지 $X_0$을 알고 있을때&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;$T$ 시간 이후의 최종 $X_T$에 대한 확률 분포&amp;nbsp; $ q\left(X_{1: T} \mid X_0\right)$ &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;는 다음과 같이 표현이 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;br /&gt;$q\left(X_{1: T} \mid X_0\right)=\prod_{t=1}^T q\left(X_t \mid X_{t-1}\right)$&lt;br /&gt;&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;이 수식이 만족하는 이유는 먼저&lt;br /&gt;&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;$q\left(x_{1:&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)=\frac{q\left(x_0,&amp;nbsp;x_1,&amp;nbsp;x_2,&amp;nbsp;x_3,&amp;nbsp;\ldots,&amp;nbsp;x_T\right)}{q\left(x_0\right)}$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;이고&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;$\prod_{t=1}^T&amp;nbsp;q\left(x_t&amp;nbsp;\mid&amp;nbsp;x_{t-1}\right)=q\left(x_1&amp;nbsp;\mid&amp;nbsp;x_0\right)&amp;nbsp;q\left(x_2&amp;nbsp;\mid&amp;nbsp;x_1\right)&amp;nbsp;q\left(x_3&amp;nbsp;\mid&amp;nbsp;x_2\right)&amp;nbsp;\ldots&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_{T-1}\right)$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;으로 정의됨을 이용하면 Marcov chain에 의해&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;q\left(x_1&amp;nbsp;\mid&amp;nbsp;x_0\right)&amp;nbsp;q\left(x_2&amp;nbsp;\mid&amp;nbsp;x_1\right)&amp;nbsp;q\left(x_3&amp;nbsp;\mid&amp;nbsp;x_2\right)&amp;nbsp;\ldots&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_{T-1}\right)=\frac{q\left(x_1,&amp;nbsp;x_0\right)}{x_0}&amp;nbsp;\frac{q\left(x_2,&amp;nbsp;x_1\right)}{x_1}&amp;nbsp;\ldots&amp;nbsp;\frac{q\left(x_T,&amp;nbsp;x_{T-1}\right)}{x_{T-1}}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\frac{q\left(x_1,&amp;nbsp;x_0\right)}{x_0}&amp;nbsp;\frac{q\left(x_2,&amp;nbsp;x_1,&amp;nbsp;x_0\right)}{x_1,&amp;nbsp;x_0}&amp;nbsp;\ldots&amp;nbsp;\frac{q\left(x_T,&amp;nbsp;x_{T-1},&amp;nbsp;\ldots,&amp;nbsp;x_1,&amp;nbsp;x_0\right)}{x_{T-1},&amp;nbsp;\ldots,&amp;nbsp;x_0}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\frac{q\left(x_0,&amp;nbsp;x_1,&amp;nbsp;x_2,&amp;nbsp;x_3,&amp;nbsp;\ldots,&amp;nbsp;x_T\right)}{q\left(x_0\right)}&lt;br /&gt;\end{aligned}&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;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사실 $t$번의 sampling을 통해 매 step을 차근차근 밟아가면서 $X_0$에서 $X_t$를 만들 수도 있지만, 한 번에 $X_0$에서 $X_t$를 만들 수도 있다. 만약 $\bar{\alpha}_t=\prod_{s=1}^t\left(1-\beta_s\right)$라고 한다면&lt;br /&gt;&lt;br /&gt;$\left.q\left(\mathbf{x}_t \mid \mathbf{x}_0\right)=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{\bar{\alpha}_t} \mathbf{x}_0,\left(1-\bar{\alpha}_t\right) \mathbf{I}\right)\right)$&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;/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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$\mathbf{x}_t=\sqrt{\bar{\alpha}_t} \mathbf{x}_0+\sqrt{\left(1-\bar{\alpha}_t\right)} \epsilon \quad \text { where } \epsilon \sim \mathcal{N}(\mathbf{0}, \mathbf{I})$&amp;nbsp;&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;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;q\left(x_t&amp;nbsp;\mid&amp;nbsp;x_{t-1}\right)&amp;nbsp;\sim&amp;nbsp;N\left(x_t&amp;nbsp;;&amp;nbsp;\sqrt{1-\beta_t}&amp;nbsp;x_{t-1},&amp;nbsp;\beta_t&amp;nbsp;I\right)&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;\rightarrow&amp;nbsp;x_t=\sqrt{1-\beta_t}&amp;nbsp;x_{t-1}+\sqrt{\beta_t}&amp;nbsp;\varepsilon&amp;nbsp;\quad&amp;nbsp;*&amp;nbsp;\alpha_t=1-\beta_t,&amp;nbsp;\overline{\alpha_t}=\prod_{s=1}^t&amp;nbsp;\alpha_s&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\sqrt{\alpha_t}&amp;nbsp;x_{t-1}+\sqrt{1-\alpha_t}&amp;nbsp;\varepsilon_{t-1}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\sqrt{\alpha_t}\left(\sqrt{\alpha_{t-1}}&amp;nbsp;x_{t-2}+\sqrt{1-\alpha_{t-1}}&amp;nbsp;\varepsilon_{t-2}\right)+\sqrt{1-\alpha_t}&amp;nbsp;\varepsilon_{t-1}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;=\sqrt{\alpha_t&amp;nbsp;\cdot&amp;nbsp;\alpha_{t-1}}&amp;nbsp;x_{t-2}+\sqrt{\alpha_t}&amp;nbsp;\sqrt{1-\alpha_{t-1}}&amp;nbsp;\varepsilon_{t-2}+\sqrt{1-\alpha_t}&amp;nbsp;\varepsilon_{t-1}&lt;br /&gt;\end{aligned}&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;인데&amp;nbsp;&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;\begin{aligned}&lt;br /&gt;\sqrt{\alpha_t}&amp;nbsp;&amp;amp;&amp;nbsp;\sqrt{1-\alpha_{t-1}}&amp;nbsp;\varepsilon_{t-2}+\sqrt{1-\alpha_t}&amp;nbsp;\varepsilon_{t-1}&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;\sim&amp;nbsp;N\left(0,\left[\alpha_t\left(1-\alpha_{t-1}\right)+\left(1-\alpha_t\right)\right]&amp;nbsp;I\right)&amp;nbsp;\\&lt;br /&gt;:=&amp;nbsp;&amp;amp;&amp;nbsp;\sqrt{\left(1-\alpha_t\right)+d_t\left(1-\alpha_{t-1}\right)}=\sqrt{1-\alpha_t&amp;nbsp;\alpha_{t-1}}&lt;br /&gt;\end{aligned}&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;/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;\begin{aligned}&lt;br /&gt;x_t=\sqrt{\alpha_t&amp;nbsp;\alpha_{t-1}}&amp;nbsp;x_{t-2}+\sqrt{1-\alpha_t&amp;nbsp;\alpha_{t-1}}&amp;nbsp;\bar{\varepsilon}_{t-2}=\sqrt{\bar{a}_t}&amp;nbsp;x_0+\sqrt{1-\bar{\alpha}_t}&amp;nbsp;\varepsilon&amp;nbsp;\\&lt;br /&gt;\therefore&amp;nbsp;q\left(x_t&amp;nbsp;\mid&amp;nbsp;x_0\right)=N\left(x_t&amp;nbsp;;&amp;nbsp;\sqrt{\alpha_t}&amp;nbsp;x_0,\left(1-\bar{\alpha}_t\right)&amp;nbsp;I\right)&lt;br /&gt;\end{aligned}&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;로 증명이 가능하다. 달리 말하면 이론상 $\bar{\alpha}_T \rightarrow 0$ 인 경우 $\left.q\left(\mathbf{x}_T \mid \mathbf{x}_0\right) \approx \mathcal{N}\left(\mathbf{x}_T ; \mathbf{0}, \mathbf{I}\right)\right)$으로 근사할 수 있다. 한 step씩 학습을 하면 메모리와 resource가 너무 많이 들기 때문에 이렇게 한 번에 계산한다고 논문은 표현한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcuP4H/btsBgaFT5Lx/5qu3l0I7WjuuusJv2joWM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcuP4H/btsBgaFT5Lx/5qu3l0I7WjuuusJv2joWM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcuP4H/btsBgaFT5Lx/5qu3l0I7WjuuusJv2joWM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcuP4H%2FbtsBgaFT5Lx%2F5qu3l0I7WjuuusJv2joWM1%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;842&quot; height=&quot;207&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;207&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 노이즈로부터 이미지를 복원하는 즉 generative 과정이다. 우선 $p\left(\mathbf{x}_T\right)=\mathcal{N}\left(\mathbf{x}_T ; \mathbf{0}, \mathbf{I}\right)$라고 한다면, 임의의 $t$시간에서 $t-1$시간으로의 복원 확률 분포는 다음과 같다.&lt;br /&gt;&lt;br /&gt;$p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)=\mathcal{N}\left(\mathbf{x}_{t-1} ; \mu_\theta\left(\mathbf{x}_t, t\right), \sigma_t^2 \mathbf{I}\right)$&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이때 $\mu_\theta\left(\mathbf{x}_t, t\right)$는 U-net, Denoising Autoencoder과 같은 학습 가능한 모델이다.&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;이제 학습을 적용할 차례이다. 대부분의 오토 인코더가 그렇듯 negative log likelihood를 최소화 하는 방식을 논문은 사용한다. 이를 수식으로 표현하면 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$\mathbb{E}\left[-\log p_\theta\left(\mathbf{x}_0\right)\right] \leq \mathbb{E}_q\left[-\log \frac{p_\theta\left(\mathbf{x}_{0: T}\right)}{q\left(\mathbf{x}_{1: T} \mid \mathbf{x}_0\right)}\right]=\mathbb{E}_q\left[-\log p\left(\mathbf{x}_T\right)-\sum_{t \geq 1} \log \frac{p_\theta\left(\mathbf{x}_{t-1} \mid \mathbf{x}_t\right)}{q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)}\right]=: L$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;이를 증명하는 방법은 비교적 간단하다. 먼저 bayes rule에 의해 $p_\theta\left(x_T \mid x_0\right)=\frac{p_\theta\left(x_T, x_0\right)}{p_\theta\left(x_0\right)}$ 이므로&lt;br /&gt;&lt;br /&gt;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;p_\theta\left(x_0\right)\right]=\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;\frac{p_\theta\left(x_0,&amp;nbsp;x_1,&amp;nbsp;x_2,&amp;nbsp;\ldots,&amp;nbsp;x_T\right)}{p_\theta\left(x_1,&amp;nbsp;x_2,&amp;nbsp;x_3,&amp;nbsp;\ldots,&amp;nbsp;x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\right]&lt;br /&gt;\end{aligned}&lt;br /&gt;이고 이 식은&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$=\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;\frac{p_\theta\left(x_0,&amp;nbsp;x_1,&amp;nbsp;x_2,&amp;nbsp;\ldots,&amp;nbsp;x_T\right)}{p_\theta\left(x_1,&amp;nbsp;x_2,&amp;nbsp;x_3,&amp;nbsp;\ldots,&amp;nbsp;x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}&amp;nbsp;\cdot&amp;nbsp;\frac{q\left(x_{1:&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)}{q\left(x_{1:&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)}\right]$&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;으로 바꿔서 표현이 가능하다. 이제 Evidence of Lower BOund (ELBO)를 적용하면 KL divergence가 양수임을 이용하여&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;$\leq&amp;nbsp;\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;\frac{p_\theta\left(x_0,&amp;nbsp;x_1,&amp;nbsp;x_2,&amp;nbsp;\ldots,&amp;nbsp;x_T\right)}{q\left(x_{1:&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)}\right]$&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$=\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;\frac{p_\theta\left(x_{0&amp;nbsp;;&amp;nbsp;T}\right)}{q\left(x_{1&amp;nbsp;;&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)}\right]$&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;이다. 이제 $p_\theta\left(\boldsymbol{x}_{0: T}\right):=p_\theta\left(\boldsymbol{x}_T\right) \prod_{t=1}^T p_\theta\left(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t\right) \quad q\left(\boldsymbol{x}_{\mathbf{1}: T} \mid \boldsymbol{x}_0\right):=\prod_{t=1}^T q\left(\boldsymbol{x}_t \mid \boldsymbol{x}_{t-1}\right)$인 &amp;nbsp;Markov property를 적용하면 (&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;어떤 시간에 특정 state에 도달하든 그 이전에 어떤 state를 거쳐왔든 다음 state로 갈 확률은 항상 같다는 성질)&lt;br /&gt;&lt;br /&gt;\begin{aligned}&lt;br /&gt;&amp;amp;=\mathbb{E}_{x_T&amp;nbsp;\sim&amp;nbsp;q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;\frac{p_\theta\left(\boldsymbol{x}_T\right)&amp;nbsp;\prod_{t=1}^T&amp;nbsp;p_\theta\left(\boldsymbol{x}_{\boldsymbol{t}-1}&amp;nbsp;\mid&amp;nbsp;\boldsymbol{x}_{\boldsymbol{t}}\right)}{\prod_{t=1}^T&amp;nbsp;q\left(\boldsymbol{x}_{\boldsymbol{t}}&amp;nbsp;\mid&amp;nbsp;\boldsymbol{x}_{\boldsymbol{t}-1}\right)}\right]\\&lt;br /&gt;&amp;amp;=\mathbb{E}_{x_{1:&amp;nbsp;T}&amp;nbsp;\sim&amp;nbsp;q\left(x_{1:&amp;nbsp;T}&amp;nbsp;\mid&amp;nbsp;x_0\right)}\left[-\log&amp;nbsp;p_\theta\left(\boldsymbol{x}_T\right)-\sum_{t=1}^T&amp;nbsp;\log&amp;nbsp;\frac{p_\theta\left(x_{t-1}&amp;nbsp;\mid&amp;nbsp;x_t\right)}{q\left(x_t&amp;nbsp;\mid&amp;nbsp;x_{t-1}\right)}\right]&lt;br /&gt;\end{aligned}&lt;br /&gt;&lt;br /&gt;으로 증명된다. 이 loss function의 우항을 좀 더 정리하면&lt;br /&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;$\mathbb{E}_q[\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_T&amp;nbsp;\mid&amp;nbsp;\mathbf{x}_0\right)&amp;nbsp;\|&amp;nbsp;p_\theta&amp;nbsp;\left(\mathbf{x}_T\right)\right)}_{L_T}+\sum_{t&amp;gt;1}&amp;nbsp;\underbrace{D_{\mathrm{KL}}\left(q\left(\mathbf{x}_{t-1}&amp;nbsp;\mid&amp;nbsp;\mathbf{x}_t,&amp;nbsp;\mathbf{x}_0\right)&amp;nbsp;\|&amp;nbsp;p_\theta\left(\mathbf{x}_{t-1}&amp;nbsp;\mid&amp;nbsp;\mathbf{x}_t\right)\right)}_{L_{t-1}}&amp;nbsp;\underbrace{-\log&amp;nbsp;p_\theta\left(\mathbf{x}_0&amp;nbsp;\mid&amp;nbsp;\mathbf{x}_1\right)}_{L_0}]$&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;와 같은 최종적인 loss function을 얻을 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;이제 loss의 각각의 항에 대해 설명을 해본다. 먼저 첫 번째 항인 $L_T=D_{K&amp;nbsp;L}\left(q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)&amp;nbsp;\|&amp;nbsp;p_\theta&amp;nbsp;\left(x_T\right)\right)$는 $p_\theta&amp;nbsp;$가 생성하는 노이즈 이미지, $x_0$로부터 $q$가 생성하는 노이즈 이미지 간의 분포 차이이다. 물론 각 분포는 아래와 같이 정의된다.&lt;br /&gt;&lt;br /&gt;\begin{aligned}&lt;br /&gt;&amp;amp;&amp;nbsp;q\left(x_t&amp;nbsp;\mid&amp;nbsp;x_0\right)=\mathcal{N}\left(x_t&amp;nbsp;;&amp;nbsp;\sqrt{\bar{\alpha}_t}&amp;nbsp;x_0,\left(1-\bar{\alpha}_t\right)&amp;nbsp;\mathrm{I}\right)&amp;nbsp;\\&lt;br /&gt;&amp;amp;&amp;nbsp;p_\theta\left(x_T\right)=\mathcal{N}\left(x_T&amp;nbsp;;&amp;nbsp;0,&amp;nbsp;\mathrm{I}\right)&lt;br /&gt;\end{aligned}&lt;br /&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;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;하지만 일반적으로 $q\left(x_T&amp;nbsp;\mid&amp;nbsp;x_0\right)=p_\theta\left(x_T\right)$이기 때문에 (이를 위해 논문은 $\beta_t$를 상수로 둔다.) 이 loss term은 항상 0에 가까운 상수이며, 학습과정에서 무시된다.&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;두 번째로 $L_{T-1}$는&amp;nbsp;&amp;nbsp;$p_\theta$와 $q$ 의 reverse, forward process의 분포 차이를 의미한다. 모델은 이들을 최대한 비슷하게 만드는 방향으로 학습된다. $p_\theta$는 모델 출력 부분이니 넘어가고&amp;nbsp;&amp;nbsp;$q\left(x_{t-1} \mid x_t, x_0\right)$은 $P\left(x_{t-1} \mid x_t\right)=\frac{P\left(x_t \mid x_{t-1}\right) P\left(x_{t-1}\right)}{P\left(x_t\right)}$를 이용하면 $q\left(x_{t-1} \mid x_t, x_0\right)=q\left(x_t \mid x_{t-1}, x_0\right) \frac{q\left(x_{t-1} \mid x_0\right)}{q\left(x_t \mid x_0\right)}$임을 알 수 있다. 마지막으로 역 조건부 확률(inverse conditional probability)에 의해&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: left;&quot;&gt;$q\left(x_{t-1}&amp;nbsp;\mid&amp;nbsp;x_t,&amp;nbsp;x_0\right)=N\left(x_{t-1}&amp;nbsp;;&amp;nbsp;\tilde{\mu}\left(x_t,&amp;nbsp;x_0\right),&amp;nbsp;\tilde{\beta}_t&amp;nbsp;\mathrm{I}\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;\begin{aligned} &lt;br /&gt;&amp;amp;&amp;nbsp;\tilde{\mu}_t\left(x_t,&amp;nbsp;x_0\right):=\frac{\sqrt{\bar{\alpha}_{t-1}}&amp;nbsp;\beta_t}{1-\bar{\alpha}_t}&amp;nbsp;x_0+\frac{\sqrt{\alpha_t}\left(1-\bar{\alpha}_{t-1}\right)}{1-\bar{\alpha}&amp;nbsp;t}&amp;nbsp;x_t,&amp;nbsp;\tilde{\beta}_t:=\frac{\left(1-\bar{\alpha}_{t-1}\right)}{1-\bar{\alpha}_t}&amp;nbsp;\beta_t &lt;br /&gt;\end{aligned}&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: left;&quot;&gt;로 계산할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: left;&quot;&gt;이제&lt;span&gt;&amp;nbsp;&lt;/span&gt;$L_{T-1}$의 KL divergence를 계산하면&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$L_{t-1}=\mathbb{E}_{\mathbf{x}_0&amp;nbsp;\sim&amp;nbsp;q\left(\mathbf{x}_0\right),&amp;nbsp;\epsilon&amp;nbsp;\sim&amp;nbsp;\mathcal{N}(\mathbf{0},&amp;nbsp;\mathbf{I})}\left[\frac{\beta_t^2}{2&amp;nbsp;\sigma_t^2\left(1-\beta_t\right)\left(1-\bar{\alpha}_t\right)}\left\|\epsilon-\epsilon_\theta\left(\sqrt{\bar{\alpha}_t}&amp;nbsp;\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}&amp;nbsp;\epsilon,&amp;nbsp;t\right)\right\|^2\right]$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;/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;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: left;&quot;&gt;마지막으로 $L_0$는 $x_1$으로부터 $x_0$를 추정하는 likelihood이다. 모델은 이를 maximize하는 방향으로 학습된다.&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;이제 전체 loss function을 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;epsilon에 대한 식의 형태로 simplify가 가능한데 &lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;simplify 된 형태가 더 학습이 잘된다고 한다. 식은 다음과 같다.&lt;br /&gt;&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;$L_{\text {simple }}(\theta):=\mathbb{E}_{t, \mathbf{x}_0, \boldsymbol{\epsilon}}\left[\left\|\boldsymbol{\epsilon}-\boldsymbol{\epsilon}_\theta\left(\sqrt{\bar{\alpha}_t} \mathbf{x}_0+\sqrt{1-\bar{\alpha}_t} \boldsymbol{\epsilon}, t\right)\right\|^2\right]$&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;span style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;따라서 학습 부분은 아래와 같이 간단하게 표현된다.&lt;br /&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;1280&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRhEw/btsBc14tXts/1N4VIKyxNA3CK6rMbKkh0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRhEw/btsBc14tXts/1N4VIKyxNA3CK6rMbKkh0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRhEw/btsBc14tXts/1N4VIKyxNA3CK6rMbKkh0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRhEw%2FbtsBc14tXts%2F1N4VIKyxNA3CK6rMbKkh0k%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;400&quot; height=&quot;197&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;629&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;반대로 이미지 생성 (sampling 부분은)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6O1v/btsBimTJhdr/eOSVJ87LLobEFXEN97AcK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6O1v/btsBimTJhdr/eOSVJ87LLobEFXEN97AcK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6O1v/btsBimTJhdr/eOSVJ87LLobEFXEN97AcK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6O1v%2FbtsBimTJhdr%2FeOSVJ87LLobEFXEN97AcK1%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;400&quot; height=&quot;195&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 표현된다.&lt;/p&gt;</description>
      <category>논문 정리</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/98</guid>
      <comments>https://hydragon516.tistory.com/entry/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DDPM-Denoising-Diffusion-Probabilistic-Model#entry98comment</comments>
      <pubDate>Wed, 29 Nov 2023 18:37:25 +0900</pubDate>
    </item>
    <item>
      <title>Object-Centric Learning with Slot Attention</title>
      <link>https://hydragon516.tistory.com/entry/Object-Centric-Learning-with-Slot-Attention</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문에서는 CNN을 사용하여 복잡한 장면의 객체 중심 표현(object-centric representation)을 학습하는 새로운 방법을 소개한다. 이 방법 슬롯이라고 하는 task-dependent abstract representation을 생성하는 slot attention module을 사용한다. 이러한 슬롯은 반복적인 attention 과정을 통해 &lt;span&gt;업데이트가 가능하며&lt;/span&gt; 모든 입력 feature와 상호작용한다. 이 논문은 slot attention이 unsupervised object discovery 및 supervised property prediction task에 대해 학습할 때 보이지 않는 구성에 대한 일반화를 가능하게 하는 객체 중심 표현을 추출할 수 있음을 보여준다. 또한 이 논문에서는 이 방법을 객체 표현을 위한 기존의 딥러닝 접근 방식과 비교하고 향후 연구 방향을 제시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Object-centric&amp;nbsp;learning&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 중심 학습은 장면이나 환경에 있는 객체의 표현을 학습하는 데 중점을 두는 딥러닝의 한 유형이다. 이 task의 목표는 장면에서 개별 개체를 식별하고 표현함으로써 low-level perceptual feature으로부터 abstract reasoning을 가능하게 하는 것이다. 이 접근 방식은 시각적 추론, 구조화된 환경 모델링, 다중 에이전트 모델링, 상호 작용하는 물리적 시스템 시뮬레이션 등 다양한 애플리케이션 영역에서 머신러닝 알고리즘의 샘플 효율성과 일반화를 개선할 수 있는 잠재력을 가지고 있다. 그러나 이미지나 비디오와 같은 raw perceptual 입력에서 객체 중심의 표현을 얻는 것은 어렵고 supervision 학습 또는 task-specific architecture가 필요한 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Slot attention&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4adv/btr5Zj0hpZs/nGKrrlQJPzEVRpT9iCqnP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4adv/btr5Zj0hpZs/nGKrrlQJPzEVRpT9iCqnP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4adv/btr5Zj0hpZs/nGKrrlQJPzEVRpT9iCqnP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4adv%2Fbtr5Zj0hpZs%2FnGKrrlQJPzEVRpT9iCqnP1%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;1060&quot; height=&quot;413&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;413&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;a href=&quot;https://github.com/lucidrains/slot-attention&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/lucidrains/slot-attention)&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679735177732&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
from torch import nn
from torch.nn import init

class SlotAttention(nn.Module):
    def __init__(self, num_slots, dim, iters = 3, eps = 1e-8, hidden_dim = 128):
        super().__init__()
        self.num_slots = num_slots
        self.iters = iters
        self.eps = eps
        self.scale = dim ** -0.5

        self.slots_mu = nn.Parameter(torch.randn(1, 1, dim))

        self.slots_logsigma = nn.Parameter(torch.zeros(1, 1, dim))
        init.xavier_uniform_(self.slots_logsigma)

        self.to_q = nn.Linear(dim, dim)
        self.to_k = nn.Linear(dim, dim)
        self.to_v = nn.Linear(dim, dim)

        self.gru = nn.GRUCell(dim, dim)

        hidden_dim = max(dim, hidden_dim)

        self.mlp = nn.Sequential(
            nn.Linear(dim, hidden_dim),
            nn.ReLU(inplace = True),
            nn.Linear(hidden_dim, dim)
        )

        self.norm_input  = nn.LayerNorm(dim)
        self.norm_slots  = nn.LayerNorm(dim)
        self.norm_pre_ff = nn.LayerNorm(dim)

    def forward(self, inputs, num_slots = None):
        b, n, d, device, dtype = *inputs.shape, inputs.device, inputs.dtype
        n_s = num_slots if num_slots is not None else self.num_slots
        
        mu = self.slots_mu.expand(b, n_s, -1)
        sigma = self.slots_logsigma.exp().expand(b, n_s, -1)

        slots = mu + sigma * torch.randn(mu.shape, device = device, dtype = dtype)

        inputs = self.norm_input(inputs)        
        k, v = self.to_k(inputs), self.to_v(inputs)

        for _ in range(self.iters):
            slots_prev = slots

            slots = self.norm_slots(slots)
            q = self.to_q(slots)

            dots = torch.einsum('bid,bjd-&amp;gt;bij', q, k) * self.scale
            attn = dots.softmax(dim=1) + self.eps

            attn = attn / attn.sum(dim=-1, keepdim=True)

            updates = torch.einsum('bjd,bij-&amp;gt;bid', v, attn)

            slots = self.gru(
                updates.reshape(-1, d),
                slots_prev.reshape(-1, d)
            )

            slots = slots.reshape(b, -1, d)
            slots = slots + self.mlp(self.norm_pre_ff(slots))

        return slots&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 &quot;query&quot;, &quot;key&quot;, &quot;value&quot; 기반의 어텐션 메커니즘을 사용한다. 우선 입력 feature를 key, value로 만들고 랜덤 초기화된 슬롯들을 query로 사용한다. 슬롯 어텐션은 &quot;iters&quot; 만큼 반복되면서 (논문의 경우 3) 슬롯을 점진적으로 업데이트 한다. 입력 및 출력의 크기는 아래 코드를 참고하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679735865032&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
from slot_attention import SlotAttention

slot_attn = SlotAttention(
    num_slots = 5,
    dim = 512,
    iters = 3   # iterations of attention, defaults to 3
)

inputs = torch.randn(2, 1024, 512)
slot_attn(inputs) # (2, 5, 512)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문은 object-centric learning 기반의 세그멘테이션 작업을 수행한다. 결과는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1647&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1B1Dd/btr5TqFsZMC/R3kDkLHIm2KZDVOIEdMuX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1B1Dd/btr5TqFsZMC/R3kDkLHIm2KZDVOIEdMuX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1B1Dd/btr5TqFsZMC/R3kDkLHIm2KZDVOIEdMuX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1B1Dd%2Fbtr5TqFsZMC%2FR3kDkLHIm2KZDVOIEdMuX0%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;1647&quot; height=&quot;700&quot; data-origin-width=&quot;1647&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 슬롯에는 개별의 물체에 대한 정보가 저장되며 이 과정은 모두 unsupervised로 이루어진다. 이 세그멘테이션 과정이 슬롯으로 부터 어떻게 이루어 지는지는 아래 코드를 보면 쉽게 알수있다. (&lt;a href=&quot;https://github.com/evelinehong/slot-attention-pytorch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/evelinehong/slot-attention-pytorch&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679736083207&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Slot Attention module.
slots = self.slot_attention(x)
# `slots` has shape: [batch_size, num_slots, slot_size].

# &quot;&quot;&quot;Broadcast slot features to a 2D grid and collapse slot dimension.&quot;&quot;&quot;.
slots = slots.reshape((-1, slots.shape[-1])).unsqueeze(1).unsqueeze(2)
slots = slots.repeat((1, 8, 8, 1))

# `slots` has shape: [batch_size*num_slots, width_init, height_init, slot_size].
x = self.decoder_cnn(slots)
# `x` has shape: [batch_size*num_slots, width, height, num_channels+1].

# Undo combination of slot and batch dimension; split alpha masks.
recons, masks = x.reshape(image.shape[0], -1, x.shape[1], x.shape[2], x.shape[3]).split([3,1], dim=-1)
# `recons` has shape: [batch_size, num_slots, width, height, num_channels].
# `masks` has shape: [batch_size, num_slots, width, height, 1].

# Normalize alpha masks over slots.
masks = nn.Softmax(dim=1)(masks)
recon_combined = torch.sum(recons * masks, dim=1)  # Recombine image.
recon_combined = recon_combined.permute(0,3,1,2)
# `recon_combined` has shape: [batch_size, width, height, num_channels].&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 모델 그림에서 슬롯 개수 만큼의 여러개의 디코더를 사용하는 것 처럼 표현되어있지만 실은 batch_size x num_slots로 슬롯을 배치 단위로 묶어 연산한다. 모델은 오토 인코더와 유사하게 구성되며 이렇게 하면 3채널의 recons 이미지와 각각에 대한 마스크가 알파 채널로써 생성되는데, recon_combined = torch.sum(recons * masks, dim=1)으로 원래 이미지를 재구성하여 입력 이미지와 loss를 계산한다. 결과적으로 unsupervised로 masks 학습이 가능해진다.&lt;/p&gt;</description>
      <category>논문 정리</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/97</guid>
      <comments>https://hydragon516.tistory.com/entry/Object-Centric-Learning-with-Slot-Attention#entry97comment</comments>
      <pubDate>Sat, 25 Mar 2023 18:29:14 +0900</pubDate>
    </item>
    <item>
      <title>SuperPoint: Self-Supervised Interest Point Detection and Description</title>
      <link>https://hydragon516.tistory.com/entry/SuperPoint-Self-Supervised-Interest-Point-Detection-and-Description</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SuperPoint를 설명하기 앞서 이미지 특징점 (&lt;span style=&quot;background-color: #ffffff;&quot;&gt;keypoint)란 무엇인지 알아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;keypoint&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;1400&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzWzJh/btrvy2NqU3E/2xuaVvNROXJw4dKU0AcVvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzWzJh/btrvy2NqU3E/2xuaVvNROXJw4dKU0AcVvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzWzJh/btrvy2NqU3E/2xuaVvNROXJw4dKU0AcVvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzWzJh%2Fbtrvy2NqU3E%2F2xuaVvNROXJw4dKU0AcVvk%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;1400&quot; height=&quot;510&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;510&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;&quot;&gt;keypoint는 크게 samantic &lt;span style=&quot;background-color: #ffffff;&quot;&gt;keypoint와 interset &lt;span style=&quot;background-color: #ffffff;&quot;&gt;point로 나뉘는데, &lt;span style=&quot;background-color: #ffffff;&quot;&gt;samantic&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;keypoint는 그림과 같이 사람의 골격, 물체의 의미론적인 특정 위치를 기반으로 하기 때문에 정의하기가 쉽지만 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;interset&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;point의 경우 모서리, 꼭짓점과 같은 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;low-level point들로 의미론적인 정의가 어려워 이를 supervised learning으로 다루는 것이 어렵다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;따라서 이러한 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;interset&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;point를 러닝으로서 학습하는 SuperPoint는 아래와 같은 단계의 self-supervised learning을 이용해 이러한 문제를 해결한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #292929;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;먼저 MagicPoint를 찾는 모델을 pre-training 한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfrIO4/btrvtdXFJfg/3MKxHA3MQR1DzmIi7cLc1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfrIO4/btrvtdXFJfg/3MKxHA3MQR1DzmIi7cLc1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfrIO4/btrvtdXFJfg/3MKxHA3MQR1DzmIi7cLc1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfrIO4%2FbtrvtdXFJfg%2F3MKxHA3MQR1DzmIi7cLc1k%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;511&quot; height=&quot;320&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;320&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;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;먼저 위 그림과 같이 간단한 파이썬 코드를 사용하여 정육면체 선 별 및 바둑판과 같은 간단한 기하학적 모양을 포함하는 합성 데이터 세트를 생성한다. 이 과정으로 label과 함께 기하학적 모양 이미지를 만든다. 이러한 점들을&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt; 이용해 MagicPoint라 불리는 Base Detector를 학습시킨다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lj2xv/btrvvDOE2va/268sLDOTBoItZmdaonxAQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lj2xv/btrvvDOE2va/268sLDOTBoItZmdaonxAQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lj2xv/btrvvDOE2va/268sLDOTBoItZmdaonxAQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flj2xv%2FbtrvvDOE2va%2F268sLDOTBoItZmdaonxAQ0%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;394&quot; height=&quot;236&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 이러한 방법으로 학습된 모델은 합성된 이미지에서는 잘 동작하지만 실제 이미지에서는 일반화가 어렵다는 문제가 있다. 이러한 일반화 문제를 해결하기 위해 저자들은 Homographic Adaptation이라 불리는 &lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;multi-scale, multi-transform 기술을 적용한다.&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;700&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ze311/btrvtBRzLxA/knhRh3nxkkDyy48kvjBmO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ze311/btrvtBRzLxA/knhRh3nxkkDyy48kvjBmO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ze311/btrvtBRzLxA/knhRh3nxkkDyy48kvjBmO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fze311%2FbtrvtBRzLxA%2FknhRh3nxkkDyy48kvjBmO0%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;700&quot; height=&quot;213&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;213&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;Homographic Adaptation은 Homography에 강인한 interest point를 찾기 위한 과정으로 psuedo ground truth interest point를 찾는 방법이다. 위 그림과 같이 unlabeled 이미지를 다양한 homography를 적용하여 이미지를 변형 시킨다. 이 다음 pre-train된 &lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;MagicPoint에 집어넣어 예측 interest point들을 뽑고 이 결과들을 모두 합쳐 (원래 이미지로 역변환을 시킨다.) psuedo ground truth interest point를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;이 과정을 합치면 아래 그림과 같다. 이렇게 생성된 &lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;interest point들은 &lt;span style=&quot;background-color: #ffffff; color: #292929;&quot;&gt;MagicPoint 학습에 다시 사용된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNx8U7/btrvy201mIh/IYAsfd0LDAlurGL2EBbeN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNx8U7/btrvy201mIh/IYAsfd0LDAlurGL2EBbeN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNx8U7/btrvy201mIh/IYAsfd0LDAlurGL2EBbeN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNx8U7%2Fbtrvy201mIh%2FIYAsfd0LDAlurGL2EBbeN0%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;422&quot; height=&quot;248&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;248&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;&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;974&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QeQ1B/btrvxknzDSh/KGcMZkTfek5J4erAOKKYJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QeQ1B/btrvxknzDSh/KGcMZkTfek5J4erAOKKYJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QeQ1B/btrvxknzDSh/KGcMZkTfek5J4erAOKKYJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQeQ1B%2FbtrvxknzDSh%2FKGcMZkTfek5J4erAOKKYJ0%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;974&quot; height=&quot;345&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;345&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: #555555;&quot;&gt;SuperPoint는 다수의 이미지 페어들에서 좋은 keypoint matching이 되는 것을 목적이기 때문에 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;matching이 잘 되는 keypoint만을 추출하는 것이 중요하다.&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;402&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV6LPd/btrvuOwolUv/kscZzLLFELKvfgpoD3tFXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV6LPd/btrvuOwolUv/kscZzLLFELKvfgpoD3tFXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV6LPd/btrvuOwolUv/kscZzLLFELKvfgpoD3tFXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV6LPd%2FbtrvuOwolUv%2FkscZzLLFELKvfgpoD3tFXk%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;402&quot; height=&quot;239&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;239&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: #555555;&quot;&gt;우선 Keypoint matching을 하기 위해서는 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;keypoint의 &lt;/span&gt;2D location을 추출해주는 keypoint detector와 keypoint의 매칭을 위한 정보를 추출해주는 keypoint descriptor가 필요하다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;여기서, 같은 keypoint를 다른 각도에서 바라보아도 비슷한 keypoint descriptor가 뽑히며, 다른 keypoint의 descriptor와는 차이가 나타나야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;위 과정을 요약하자면 keypoint detector는 keypoint label을 supervised learning으로 학습하였으며 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;keypoint&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;detector로 찾은 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;keypoint&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;location에서 descriptor를 추출하여 비교한 후 descriptor 학습을 수행한다. 이때 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;keypoint&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;descriptor 학습은 contrastive loss를 이용한 metric learning 기법을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문 정리</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/96</guid>
      <comments>https://hydragon516.tistory.com/entry/SuperPoint-Self-Supervised-Interest-Point-Detection-and-Description#entry96comment</comments>
      <pubDate>Wed, 9 Mar 2022 18:27:15 +0900</pubDate>
    </item>
    <item>
      <title>Neural Ordinary Differential Equations (Neural ODE) [작성 중]</title>
      <link>https://hydragon516.tistory.com/entry/Neural-Ordinary-Differential-Equations-Neural-ODE-%EC%9E%91%EC%84%B1-%EC%A4%91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1806.07366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/1806.07366&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646789956874&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;Neural Ordinary Differential Equations&quot; data-og-description=&quot;We introduce a new family of deep neural network models. Instead of specifying a discrete sequence of hidden layers, we parameterize the derivative of the hidden state using a neural network. The output of the network is computed using a black-box differen&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/1806.07366&quot; data-og-url=&quot;https://arxiv.org/abs/1806.07366v5&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bplDzt/hyNEdxap3D/RJiXqyLBROjIoRab7JhWx1/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/1806.07366&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/1806.07366&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bplDzt/hyNEdxap3D/RJiXqyLBROjIoRab7JhWx1/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;Neural Ordinary Differential Equations&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;We introduce a new family of deep neural network models. Instead of specifying a discrete sequence of hidden layers, we parameterize the derivative of the hidden state using a neural network. The output of the network is computed using a black-box differen&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;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;Neural Ordinary Differential Equations (이하 Neural ODE)는 2018년도 NeurIPS에서 best paper award를 받은 논문이다. 수식적으로 이해하기 상당히 어렵지만 이해해두면 좋을 것 같아 틈틈이 정리해볼까 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;먼저 ResNet으로 유명한 residual block의 구조를 다시 한번 봐보자. ResNet는 전에 정리해둔 글이 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;&lt;a href=&quot;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646790267016&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;Deep Residual Learning for Image Recognition&quot; data-og-description=&quot;Abstract Deep neural networks의 단점은 그 깊이가 깊어질수록 더 학습하기 어렵다는 것이다. ResNet은 이전의 학습 방법들과 달리 residual(어떤 과정이 끝나고 난 뒤에 남은, 잔여[잔류]의)을 학습하는 방&quot; data-og-host=&quot;hydragon-cv.info&quot; data-og-source-url=&quot;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&quot; data-og-url=&quot;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qk1H7/hyNEd4WIZD/FfxxRODrKOKLejap2kMBbk/img.png?width=515&amp;amp;height=291&amp;amp;face=0_0_515_291,https://scrap.kakaocdn.net/dn/czIYJk/hyNEi6dY4s/XtTjlH1cr3divVrvx9ruP0/img.png?width=515&amp;amp;height=291&amp;amp;face=0_0_515_291,https://scrap.kakaocdn.net/dn/uFdbs/hyNElu6eSD/iYMFrXZf1vbETonFljoyuk/img.jpg?width=670&amp;amp;height=1468&amp;amp;face=0_0_670_1468&quot;&gt;&lt;a href=&quot;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hydragon-cv.info/entry/Deep-Residual-Learning-for-Image-Recognition&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qk1H7/hyNEd4WIZD/FfxxRODrKOKLejap2kMBbk/img.png?width=515&amp;amp;height=291&amp;amp;face=0_0_515_291,https://scrap.kakaocdn.net/dn/czIYJk/hyNEi6dY4s/XtTjlH1cr3divVrvx9ruP0/img.png?width=515&amp;amp;height=291&amp;amp;face=0_0_515_291,https://scrap.kakaocdn.net/dn/uFdbs/hyNElu6eSD/iYMFrXZf1vbETonFljoyuk/img.jpg?width=670&amp;amp;height=1468&amp;amp;face=0_0_670_1468');&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;Deep Residual Learning for Image Recognition&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Abstract Deep neural networks의 단점은 그 깊이가 깊어질수록 더 학습하기 어렵다는 것이다. ResNet은 이전의 학습 방법들과 달리 residual(어떤 과정이 끝나고 난 뒤에 남은, 잔여[잔류]의)을 학습하는 방&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hydragon-cv.info&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpWuuk/btrvylMZNRE/U296pa7PLUkulaBABaU2f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpWuuk/btrvylMZNRE/U296pa7PLUkulaBABaU2f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpWuuk/btrvylMZNRE/U296pa7PLUkulaBABaU2f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpWuuk%2FbtrvylMZNRE%2FU296pa7PLUkulaBABaU2f1%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;515&quot; height=&quot;291&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;291&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$h _ { t+1 } =h _ { t } + F \left ( h _ { t } , \theta _ { t } \right )$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;따라서 $h _ { t+1 } -h _ { t } =F \left ( h _ { t } , \theta _ { t } \right )$인데, t의 변화량이 매우 작다면 다음과 같이 표현할 수 있을 것이다.&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: center;&quot; data-ke-size=&quot;size16&quot;&gt;$\frac{ dh \left ( t \right ) } { dt } =f \left ( h \left ( t \right ) ,t, \theta \right )$&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;뉴럴 네트워크에서 $t$의 변화량이 매우 작다는 것은 일반적이지 않지만 위와 같은 레이어가 네트워크에 무수히 많이 쌓여있다고 생각하면 고려할 수 있다. 다시 말해 일반적엔 네트워크가 layer를 통과하면서 값이 이산적으로 변화하겠지만 이를 연속적인 변화로 간주할 수 있다는 것이다.&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;480&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzgx6L/btrvygq6cuV/Le4tE6hu3fcOFqRAWOkK8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzgx6L/btrvygq6cuV/Le4tE6hu3fcOFqRAWOkK8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzgx6L/btrvygq6cuV/Le4tE6hu3fcOFqRAWOkK8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzgx6L%2Fbtrvygq6cuV%2FLe4tE6hu3fcOFqRAWOkK8k%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;480&quot; height=&quot;348&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&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;저자들은 위 식이 상미분 방정식 (o&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;rdinary differential equations, &lt;span style=&quot;color: #666666;&quot;&gt;독립 변수를 하나만 포함하며, 하나 이상의 도함수를 가지고 있는 미분방정식&lt;/span&gt;)와 형태가 유사하다는 것에&amp;nbsp;주목하는데, 실제로 상미분 방정식의 일반 형태는 $\frac{ dz } { dt } =f \left ( z,t \right )$로 매우 유사하다.&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;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;결과적으로 이산적이지 않은, 연속적인 뉴럴 네트워크의 임의의 지점에서의 값을 계산하기 위해서는 위 상미분 방정식의 해를 구하는 것과 동일한다. 아래 그림을 보면 이해가 편하다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tfU5E/btrvymyobwu/KzSIkY8AcdTKkj7gKKdBC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tfU5E/btrvymyobwu/KzSIkY8AcdTKkj7gKKdBC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tfU5E/btrvymyobwu/KzSIkY8AcdTKkj7gKKdBC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtfU5E%2Fbtrvymyobwu%2FKzSIkY8AcdTKkj7gKKdBC1%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;362&quot; height=&quot;293&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&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;위 그래프의 파란색 곡선이 실제 연속적인 레이어를 통과하면서 변화하는 값이라고 가정하자. 일반적인 함수의 경우 초기값 $A _{0}$를 알고 있다면 상미분 방정식의 해는 유일함이 알려져 있는데, 위 상미분 방정식을 풀 수만 있다면 파란색 곡선을 도출하는 것이 가능하다. 이를 근사하는 유명한 방법 중 하나가 바로 오일러 (Euler) 방법이다. 오일러 방법은 아래와 같다.&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;318&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyjTKA/btrvy2GqhWk/mflMdRnpq7ARU9s5gkf0w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyjTKA/btrvy2GqhWk/mflMdRnpq7ARU9s5gkf0w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyjTKA/btrvy2GqhWk/mflMdRnpq7ARU9s5gkf0w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyjTKA%2Fbtrvy2GqhWk%2FmflMdRnpq7ARU9s5gkf0w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;318&quot; height=&quot;333&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$y _{i+1} =y _{i} +f \left( t _{i} ,y _{i} \right) h$&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;위와 같은 방법으로 $t_i$에서의 함수 값을 알면 위 과정을 반복하여 그래프를 근사하는 것이 가능하다. (이 전 그래프의 $A_0$, $A_1$, $A_2$, $A_3$, $A_4$와 유사하며, 단점은 오일러 방법은 뒤로 갈수록 오차가 누적된다는 점이다.) 오일러 방법을 반복해서 그래프를 근사하는 자세한 방법은 아래 글을 참고하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://angeloyeo.github.io/2021/04/30/direction_fields.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2021/04/30/direction_fields.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1646792162546&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;방향장과 오일러 방법 - 공돌이의 수학정리노트&quot; data-og-description=&quot;&quot; data-og-host=&quot;angeloyeo.github.io&quot; data-og-source-url=&quot;https://angeloyeo.github.io/2021/04/30/direction_fields.html&quot; data-og-url=&quot;https://angeloyeo.github.io/2021/04/30/direction_fields.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://angeloyeo.github.io/2021/04/30/direction_fields.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://angeloyeo.github.io/2021/04/30/direction_fields.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;angeloyeo.github.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;어쨌든 이러한 방식을 사용하면 네트워크의 출력 값들을 근사할 수는 있겠지만 이러한 방식은 큰 메모리 비용이 발생하여 비효율적이다. 따라서 저자들은 이러한 상미분 방정식의 해를 효과적으로 계산할 수 있는 adjoint sensitivity method를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 지금까지의 과정을 수식으로 정리하면 아래와 같다. (논문에서 $h$가 $z$로 바뀌었다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$z \left ( t _ { 1 } \right ) =z \left ( t _ { 0 } \right ) + \int _ { t _ { 0 } } ^ { t _ { 1 } } { \frac{ dz \left ( t \right ) } { dt } dt } =z \left ( t _ { 0 } \right ) + \int _ { t _ { 0 } } ^ { t _ { 1 } } { f \left ( z \left ( t \right ) ,t, \theta _ { t } \right ) dt }$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프를 그려보면 당연한 수식이다. 이 값을 참값과 비교해야 하기 때문에 이를 loss function $L$에 집어 넣으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$L \left ( z \left ( t _ { 1 } \right ) \right ) =L \left ( z \left ( t _ { 0 } \right ) + \int _ { t _ { 0 } } ^ { t _ { 1 } } { f \left ( z \left ( t \right ) ,t, \theta _ { t } \right ) dt } \right )$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&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;와 같다. 네트워크를 학습하기 위해서는 위 loss function의 에러 값을 최소화하는 방향으로, 즉 $L \left ( z \left ( t _ { 1 } \right ) \right )$를 최소화 하는 방향으로 학습한다.&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;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt; parameter에 대한 gradient $\frac{ \partial L } { \partial \theta }$를 계산하는 것임을 알고 있을 것이다. &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;결국에 우리가 계산하고 싶은 것은 주어진 loss function $L$과 model parameter $\theta$ 에 대해서 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;gradient $\frac{ \partial L } { \partial \theta }$&lt;/span&gt;를 계산하고 싶은 것인데, adjoint sensitivity method는 이를 계산하기 위해서 &lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;adjoint $a \left ( t \right ) = \frac{ \partial L } { \partial z \left ( t \right ) }$를 정의하게 된다.&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>머신러닝, 딥러닝 공부</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/95</guid>
      <comments>https://hydragon516.tistory.com/entry/Neural-Ordinary-Differential-Equations-Neural-ODE-%EC%9E%91%EC%84%B1-%EC%A4%91#entry95comment</comments>
      <pubDate>Wed, 9 Mar 2022 11:45:22 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 SSH 방화벽 포트 설정 방법</title>
      <link>https://hydragon516.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-SSH-%EB%B0%A9%ED%99%94%EB%B2%BD-%ED%8F%AC%ED%8A%B8-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yDmUF/btrslVEcXdc/7KVOHYdw1b8Snfg18GSrW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yDmUF/btrslVEcXdc/7KVOHYdw1b8Snfg18GSrW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yDmUF/btrslVEcXdc/7KVOHYdw1b8Snfg18GSrW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyDmUF%2FbtrslVEcXdc%2F7KVOHYdw1b8Snfg18GSrW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;353&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH를 설치하면 기본적으로 22번 포트로 접속이 가능하나 가끔 접속이 안되는 경우가 있다. 이 경우 아래와 같이 수동으로 22번 포트의 방화벽을 해제하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643855297960&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw enable

sudo ufw allow 22

sudo ufw reload&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 22 자리에 다른 포트 번호를 입력하면 해당하는 포트도 방화벽 해제가 가능하다. 현재 방화벽 상태를 확인하려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643855358089&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 입력하자&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/94</guid>
      <comments>https://hydragon516.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-SSH-%EB%B0%A9%ED%99%94%EB%B2%BD-%ED%8F%AC%ED%8A%B8-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95#entry94comment</comments>
      <pubDate>Thu, 3 Feb 2022 11:29:34 +0900</pubDate>
    </item>
    <item>
      <title>LATEX 유용한 코드 모음</title>
      <link>https://hydragon516.tistory.com/entry/LATEX-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%BD%94%EB%93%9C-%EB%AA%A8%EC%9D%8C</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE8D7z/btrr4xEjBNl/DUXGKaKy5QlZmMr02TLo9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE8D7z/btrr4xEjBNl/DUXGKaKy5QlZmMr02TLo9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE8D7z/btrr4xEjBNl/DUXGKaKy5QlZmMr02TLo9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE8D7z%2Fbtrr4xEjBNl%2FDUXGKaKy5QlZmMr02TLo9K%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;1280&quot; height=&quot;1280&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문용 LATEX를 사용할때 유용한 코드들을 모아봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 그림 삽입&lt;/p&gt;
&lt;pre id=&quot;code_1643592433313&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\begin{figure}
	\setlength{\belowcaptionskip}{-24pt}
	\begin{center}
		\includegraphics[width=\linewidth]{이미지 경로}
		\caption{캡션}
		\label{label 이름}
	\end{center}
\end{figure}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수식 삽입&lt;/p&gt;
&lt;pre id=&quot;code_1643769618684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\begin{equation}
	수식 입력
\end{equation}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 글자 색 변경&lt;/p&gt;
&lt;pre id=&quot;code_1645194594276&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;\usepackage{color}

\textcolor{red}{red colored text}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>프로그래밍</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/93</guid>
      <comments>https://hydragon516.tistory.com/entry/LATEX-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EC%BD%94%EB%93%9C-%EB%AA%A8%EC%9D%8C#entry93comment</comments>
      <pubDate>Mon, 31 Jan 2022 11:06:35 +0900</pubDate>
    </item>
    <item>
      <title>WACV 2022 학회 참석기 (하와이 여행기) #4</title>
      <link>https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3&quot;&gt;WACV 2022 학회 참석기 (하와이 여행기) #3&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643466979151&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;WACV 2022 학회 참석기 (하와이 여행기) #3&quot; data-og-description=&quot;WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#2 WACV 2022 학회 참석기 (하와이 여행기) #2 WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#1 WACV 2022 학회 참석기 (하와이 여행기) #1 최근에 IEEE/CVF Winter..&quot; data-og-host=&quot;hydragon-cv.info&quot; data-og-source-url=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3&quot; data-og-url=&quot;https://hydragon-cv.info/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cXCJre/hyNgeaJL2i/gsYbHUYh4r9yWS9LxIbZ11/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dquwIt/hyNeMGUNjd/PPJo7Uc2pdz53h9sqFe8EK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/VwLcY/hyNgkIMXlg/k9XZrHTvGvXHFCScaq9GZk/img.jpg?width=703&amp;amp;height=937&amp;amp;face=0_0_703_937&quot;&gt;&lt;a href=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cXCJre/hyNgeaJL2i/gsYbHUYh4r9yWS9LxIbZ11/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dquwIt/hyNeMGUNjd/PPJo7Uc2pdz53h9sqFe8EK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/VwLcY/hyNgkIMXlg/k9XZrHTvGvXHFCScaq9GZk/img.jpg?width=703&amp;amp;height=937&amp;amp;face=0_0_703_937');&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;WACV 2022 학회 참석기 (하와이 여행기) #3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#2 WACV 2022 학회 참석기 (하와이 여행기) #2 WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#1 WACV 2022 학회 참석기 (하와이 여행기) #1 최근에 IEEE/CVF Winter..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hydragon-cv.info&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;사실 하와이 방문 목적이 WACV 학회 참석이었지만 지금까지 너무 여행 위주로 글을 쓴 것 같다. 이번에는 학회 참석기를 써볼까 한다.&lt;/p&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://goo.gl/maps/tQkZ5RiU8gMscqx89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goo.gl/maps/tQkZ5RiU8gMscqx89&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643467084398&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;와이콜로아 비치 매리엇 리조트 &amp;amp; 스파 &amp;middot; 69-275 Waikōloa Beach Dr, Waikoloa Beach, HI 96738 미국&quot; data-og-description=&quot;★★★★☆ &amp;middot; 호텔&quot; data-og-host=&quot;www.google.co.kr&quot; data-og-source-url=&quot;https://goo.gl/maps/tQkZ5RiU8gMscqx89&quot; data-og-url=&quot;https://www.google.co.kr/maps/place/%EC%99%80%EC%9D%B4%EC%BD%9C%EB%A1%9C%EC%95%84+%EB%B9%84%EC%B9%98+%EB%A7%A4%EB%A6%AC%EC%97%87+%EB%A6%AC%EC%A1%B0%ED%8A%B8+%26+%EC%8A%A4%ED%8C%8C/@19.9160807,-155.8860778,17.75z/data=!4m8!3m7!1s0x7954778ec6a99dc5:0xb4cc994c4f9179bc!5m2!4m1!1i2!8m2!3d19.916263!4d-155.884686?hl=ko&amp;amp;shorturl=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDw0l1/hyNgdv72YW/HAM2Fo3bJgAVlvyWtC5JvK/img.jpg?width=129&amp;amp;height=86&amp;amp;face=0_0_129_86&quot;&gt;&lt;a href=&quot;https://goo.gl/maps/tQkZ5RiU8gMscqx89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goo.gl/maps/tQkZ5RiU8gMscqx89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDw0l1/hyNgdv72YW/HAM2Fo3bJgAVlvyWtC5JvK/img.jpg?width=129&amp;amp;height=86&amp;amp;face=0_0_129_86');&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;와이콜로아 비치 매리엇 리조트 &amp;amp; 스파 &amp;middot; 69-275 Waikōloa Beach Dr, Waikoloa Beach, HI 96738 미국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;★★★★☆ &amp;middot; 호텔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.co.kr&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;학회는 와이콜로아 비치 바로 옆의 매리엇 리조트에서 열렸다. 학회는 1월 5일부터 7일까지 3일간 열렸다. 학회 특성상 전체 논문 제출자는 Oral 발표를 진행해야 하고 추가로 포스터 발표를 진행해야 했다. 다만 코로나 때문에 발표는 하이브리드로 진행됐다.&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;1280&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZb4vN/btrr1NAP9xV/8sPRYsZDu4voz2HqPwvjp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZb4vN/btrr1NAP9xV/8sPRYsZDu4voz2HqPwvjp1/img.jpg&quot; data-alt=&quot;학회장 뷰, 역시 하와이에서 열리는 학회장 답다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZb4vN/btrr1NAP9xV/8sPRYsZDu4voz2HqPwvjp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZb4vN%2Fbtrr1NAP9xV%2F8sPRYsZDu4voz2HqPwvjp1%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;1280&quot; height=&quot;576&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;576&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;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM15c7/btrr17lu4TI/f4pBGf9UhZMKUxGXqgTiFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM15c7/btrr17lu4TI/f4pBGf9UhZMKUxGXqgTiFK/img.jpg&quot; data-alt=&quot;Oral 발표 세션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM15c7/btrr17lu4TI/f4pBGf9UhZMKUxGXqgTiFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM15c7%2Fbtrr17lu4TI%2Ff4pBGf9UhZMKUxGXqgTiFK%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;937&quot; height=&quot;937&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Oral 발표 세션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q06kv/btrr1M2ZoVJ/NykeF2J8JaUHhCXwF5l7dk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q06kv/btrr1M2ZoVJ/NykeF2J8JaUHhCXwF5l7dk/img.jpg&quot; data-alt=&quot;첫번째 포스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q06kv/btrr1M2ZoVJ/NykeF2J8JaUHhCXwF5l7dk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ06kv%2Fbtrr1M2ZoVJ%2FNykeF2J8JaUHhCXwF5l7dk%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;1249&quot; height=&quot;937&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫번째 포스터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBWrY/btrr1MPp4mE/nL03prLEdkihuBvJdTIaG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBWrY/btrr1MPp4mE/nL03prLEdkihuBvJdTIaG1/img.jpg&quot; data-alt=&quot;두번째 포스터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBWrY/btrr1MPp4mE/nL03prLEdkihuBvJdTIaG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBWrY%2Fbtrr1MPp4mE%2FnL03prLEdkihuBvJdTIaG1%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;1249&quot; height=&quot;937&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;937&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;총 2편의 논문을 제출하여 포스터도 2편이다. 발표자는 1명인데 포스터는 2개라 포스터 발표 때 좀 바빴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXmf55/btrr2XioYvL/RSuIFybMn7X3jBOBgQdhek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXmf55/btrr2XioYvL/RSuIFybMn7X3jBOBgQdhek/img.jpg&quot; data-alt=&quot;포스터 발표 세션. 사람이 정말 많았는데 거의 유일한 한국인을로 현대자동차 연구원님 3분이 필자의 발표를 들었다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXmf55/btrr2XioYvL/RSuIFybMn7X3jBOBgQdhek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXmf55%2Fbtrr2XioYvL%2FRSuIFybMn7X3jBOBgQdhek%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;703&quot; height=&quot;937&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;포스터 발표 세션. 사람이 정말 많았는데 거의 유일한 한국인을로 현대자동차 연구원님 3분이 필자의 발표를 들었다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사하게도 필자의 연구에 많은 사람들이 관심을 보여주었는데, 영어를 잘 못해서 좀 걱정했지만 전공 분야라 그런지 대화하는 데는 크게 문제가 없었다.&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;1249&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMTfoS/btrr1nh2SB8/qVjGiADlMdo53dCMX0OGH0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMTfoS/btrr1nh2SB8/qVjGiADlMdo53dCMX0OGH0/img.jpg&quot; data-alt=&quot;Oral 세션이 끝나고 발표자들이 모두 모여 저녁을 먹었다. 초면이지만 대부분 연구 분야 이야기를 하며 시간을 보냈다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMTfoS/btrr1nh2SB8/qVjGiADlMdo53dCMX0OGH0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMTfoS%2Fbtrr1nh2SB8%2FqVjGiADlMdo53dCMX0OGH0%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;1249&quot; height=&quot;937&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Oral 세션이 끝나고 발표자들이 모두 모여 저녁을 먹었다. 초면이지만 대부분 연구 분야 이야기를 하며 시간을 보냈다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>여행기</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/92</guid>
      <comments>https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-4#entry92comment</comments>
      <pubDate>Sun, 30 Jan 2022 00:00:03 +0900</pubDate>
    </item>
    <item>
      <title>WACV 2022 학회 참석기 (하와이 여행기) #3</title>
      <link>https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643382094309&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;WACV 2022 학회 참석기 (하와이 여행기) #2&quot; data-og-description=&quot;WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#1 WACV 2022 학회 참석기 (하와이 여행기) #1 최근에 IEEE/CVF Winter Conference on Applications of Computer Vision (WACV 2022)에 1 저자 논문 2편이 accept 되..&quot; data-og-host=&quot;hydragon-cv.info&quot; data-og-source-url=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-2&quot; data-og-url=&quot;https://hydragon-cv.info/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/basPho/hyNezNCTQN/jvuh8Wff6IJO733t2YlKd0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7w5um/hyNeEuEM8I/MROKs9VvKkdCEQyHzR6lCK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zCDlg/hyNeHdPR9b/d4MeyhTsLtRUkgTsbQ3d21/img.jpg?width=703&amp;amp;height=937&amp;amp;face=0_0_703_937&quot;&gt;&lt;a href=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/basPho/hyNezNCTQN/jvuh8Wff6IJO733t2YlKd0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/7w5um/hyNeEuEM8I/MROKs9VvKkdCEQyHzR6lCK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/zCDlg/hyNeHdPR9b/d4MeyhTsLtRUkgTsbQ3d21/img.jpg?width=703&amp;amp;height=937&amp;amp;face=0_0_703_937');&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;WACV 2022 학회 참석기 (하와이 여행기) #2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WACV&amp;nbsp;2022&amp;nbsp;학회&amp;nbsp;참석기&amp;nbsp;(하와이&amp;nbsp;여행기)&amp;nbsp;#1 WACV 2022 학회 참석기 (하와이 여행기) #1 최근에 IEEE/CVF Winter Conference on Applications of Computer Vision (WACV 2022)에 1 저자 논문 2편이 accept 되..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hydragon-cv.info&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;이번에는 하와이에서 방문했던 맛집 위주로 글을 써볼까 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goo.gl/maps/EoiQ9E9hfHzxwNEi9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goo.gl/maps/EoiQ9E9hfHzxwNEi9&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643380826459&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;Tommy Bahama Restaurant, Bar &amp;amp; Store &amp;middot; Shops at Mauna Lani 68, 1330 Mauna Lani Dr #102, Waimea, HI 96743 미국&quot; data-og-description=&quot;★★★★★ &amp;middot; 음식점&quot; data-og-host=&quot;www.google.co.kr&quot; data-og-source-url=&quot;https://goo.gl/maps/EoiQ9E9hfHzxwNEi9&quot; data-og-url=&quot;https://www.google.co.kr/maps/place/Tommy+Bahama+Restaurant,+Bar+%26+Store/@19.9416872,-155.858789,18.5z/data=!4m5!3m4!1s0x0:0xbb48e419db70721!8m2!3d19.941718!4d-155.8587801?hl=ko&amp;amp;shorturl=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cj3yaw/hyNeHLFjnU/tkpoM95ce5ylaKFRPJ3Ms0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://goo.gl/maps/EoiQ9E9hfHzxwNEi9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goo.gl/maps/EoiQ9E9hfHzxwNEi9&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cj3yaw/hyNeHLFjnU/tkpoM95ce5ylaKFRPJ3Ms0/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&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;Tommy Bahama Restaurant, Bar &amp;amp; Store &amp;middot; Shops at Mauna Lani 68, 1330 Mauna Lani Dr #102, Waimea, HI 96743 미국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;★★★★★ &amp;middot; 음식점&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.co.kr&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;Tommy Bahama는 예약 시간 때문에 저녁 8시 30분쯤 늦게 갔는데 사람이 정말 많았던 기억이 있다. 가게 분위기도 좋았다.&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;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pRIhy/btrr3jZcyN0/kNLOsP6XAOlEDg4DKGvMQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pRIhy/btrr3jZcyN0/kNLOsP6XAOlEDg4DKGvMQ0/img.jpg&quot; data-alt=&quot;메인 메뉴가 나오기 전에 나왔던 식전 빵이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pRIhy/btrr3jZcyN0/kNLOsP6XAOlEDg4DKGvMQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpRIhy%2Fbtrr3jZcyN0%2FkNLOsP6XAOlEDg4DKGvMQ0%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메인 메뉴가 나오기 전에 나왔던 식전 빵이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmMfM/btrr16l0oU9/yLI8mBebSkFaL1eHtNMYCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmMfM/btrr16l0oU9/yLI8mBebSkFaL1eHtNMYCk/img.jpg&quot; data-alt=&quot;마히마히라는 하와이의 유명한 생선으로 만든 스테이크이다. 개인적으로는 레스토랑 메뉴중 원픽이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmMfM/btrr16l0oU9/yLI8mBebSkFaL1eHtNMYCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmMfM%2Fbtrr16l0oU9%2FyLI8mBebSkFaL1eHtNMYCk%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마히마히라는 하와이의 유명한 생선으로 만든 스테이크이다. 개인적으로는 레스토랑 메뉴중 원픽이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OmMQ/btrr12jykJg/7CD3UoZVkVNEl2KpwLJi61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OmMQ/btrr12jykJg/7CD3UoZVkVNEl2KpwLJi61/img.jpg&quot; data-alt=&quot;디저트로 먹은 파인애플이 들어간 케이크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OmMQ/btrr12jykJg/7CD3UoZVkVNEl2KpwLJi61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7OmMQ%2Fbtrr12jykJg%2F7CD3UoZVkVNEl2KpwLJi61%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&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;a href=&quot;https://goo.gl/maps/tgyWBTLDNN99Jrxt8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goo.gl/maps/tgyWBTLDNN99Jrxt8&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643381377112&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;Kona Crust &amp;middot; 74-5586 Palani Rd, Kailua-Kona, HI 96740 미국&quot; data-og-description=&quot;★★★★★ &amp;middot; 피자 전문점&quot; data-og-host=&quot;www.google.co.kr&quot; data-og-source-url=&quot;https://goo.gl/maps/tgyWBTLDNN99Jrxt8&quot; data-og-url=&quot;https://www.google.co.kr/maps/place/Kona+Crust/@19.6451676,-155.9975039,17z/data=!3m1!4b1!4m5!3m4!1s0x79540f82b9cc2e55:0x132266af4dfba01f!8m2!3d19.6451436!4d-155.9952873?hl=ko&amp;amp;shorturl=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dMMScF/hyNeIDO7Dw/Pw6NwU4QOu8Uxhdy7kXPOk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://goo.gl/maps/tgyWBTLDNN99Jrxt8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goo.gl/maps/tgyWBTLDNN99Jrxt8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dMMScF/hyNeIDO7Dw/Pw6NwU4QOu8Uxhdy7kXPOk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&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;Kona Crust &amp;middot; 74-5586 Palani Rd, Kailua-Kona, HI 96740 미국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;★★★★★ &amp;middot; 피자 전문점&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.co.kr&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;Kona Crust는 와이콜로아에서 코나를 방문했을 때 방문했었다. 코나 방문기는 기회가 되면 써볼까 한다. 피자로 매우 유명한 가게라는데 코나 방문 당시 우버 기사가 극찬을 했던 가게였다.&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;703&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RpyGh/btrr3nAy2dp/kB5JuUqaMQ9yoG8v8L3tI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RpyGh/btrr3nAy2dp/kB5JuUqaMQ9yoG8v8L3tI0/img.jpg&quot; data-alt=&quot;가게 내부, 코로나 시국 전에는 홀 장사도 했던 것 같다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RpyGh/btrr3nAy2dp/kB5JuUqaMQ9yoG8v8L3tI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRpyGh%2Fbtrr3nAy2dp%2FkB5JuUqaMQ9yoG8v8L3tI0%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;500&quot; height=&quot;666&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가게 내부, 코로나 시국 전에는 홀 장사도 했던 것 같다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQcPDM/btrr0Qkdxrk/7zeIxBZuTI0Y9Tg9FIdou1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQcPDM/btrr0Qkdxrk/7zeIxBZuTI0Y9Tg9FIdou1/img.jpg&quot; data-alt=&quot;가게 메인 메뉴인 kona supreme. 맛도 좋았고 한국 처럼 토핑이 과하지 않아서 좋았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQcPDM/btrr0Qkdxrk/7zeIxBZuTI0Y9Tg9FIdou1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQcPDM%2Fbtrr0Qkdxrk%2F7zeIxBZuTI0Y9Tg9FIdou1%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가게 메인 메뉴인 kona supreme. 맛도 좋았고 한국 처럼 토핑이 과하지 않아서 좋았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKKalC/btrr2XWqnvl/NfYUAkKWqRRoSZDJps5Jb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKKalC/btrr2XWqnvl/NfYUAkKWqRRoSZDJps5Jb0/img.jpg&quot; data-alt=&quot;5달러짜리 사이드 메뉴인 garlic knots&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKKalC/btrr2XWqnvl/NfYUAkKWqRRoSZDJps5Jb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKKalC%2Fbtrr2XWqnvl%2FNfYUAkKWqRRoSZDJps5Jb0%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;5달러짜리 사이드 메뉴인 garlic knots&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;킹스 샵스안에 로이 야마구치(Roy Yamaguchi)라는 유명한 셰프가 운영하는 식당에 방문했다. (로이 야마구치는 고든 램지의 헬스 키친에 심사위원(?)으로 출연했었다 한다.) 거의 한 달 전부터 예약을 하여 호수 뷰의 좋은 자리를 얻었다.&lt;/p&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://goo.gl/maps/pm4HaHXiz9hb9vh48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goo.gl/maps/pm4HaHXiz9hb9vh48&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643465911644&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;Roy's Waikoloa Bar &amp;amp; Grill &amp;middot; 69-250 Waikōloa Beach Dr, Waikoloa Village, HI 96738 미국&quot; data-og-description=&quot;★★★★☆ &amp;middot; 하와이 레스토랑&quot; data-og-host=&quot;www.google.co.kr&quot; data-og-source-url=&quot;https://goo.gl/maps/pm4HaHXiz9hb9vh48&quot; data-og-url=&quot;https://www.google.co.kr/maps/place/Roy's+Waikoloa+Bar+%26+Grill/@19.9160771,-155.8840098,17z/data=!3m1!4b1!4m5!3m4!1s0x79547792fc5ce2e9:0x44984b29371eeb57!8m2!3d19.9160721!4d-155.8818211?hl=ko&amp;amp;shorturl=1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dVdPmr/hyNeEoBgEe/s1jfkdkMnKuFdccdHSFJmk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256&quot;&gt;&lt;a href=&quot;https://goo.gl/maps/pm4HaHXiz9hb9vh48&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://goo.gl/maps/pm4HaHXiz9hb9vh48&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dVdPmr/hyNeEoBgEe/s1jfkdkMnKuFdccdHSFJmk/img.jpg?width=256&amp;amp;height=256&amp;amp;face=0_0_256_256');&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;Roy's Waikoloa Bar &amp;amp; Grill &amp;middot; 69-250 Waikōloa Beach Dr, Waikoloa Village, HI 96738 미국&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;★★★★☆ &amp;middot; 하와이 레스토랑&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.google.co.kr&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;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3751.1975798640665!2d-155.884009784679!3d19.916077130202343!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x79547792fc5ce2e9%3A0x44984b29371eeb57!2sRoy&amp;#39;s%20Waikoloa%20Bar%20%26%20Grill!5e0!3m2!1sko!2skr!4v1643465895121!5m2!1sko!2skr&quot; width=&quot;600&quot; height=&quot;450&quot; style=&quot;border:0;&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&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;703&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oW0ih/btrr0JMtgjh/rKmHsWbFBDyobWChOEPBwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oW0ih/btrr0JMtgjh/rKmHsWbFBDyobWChOEPBwk/img.jpg&quot; data-alt=&quot;식당 외부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oW0ih/btrr0JMtgjh/rKmHsWbFBDyobWChOEPBwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoW0ih%2Fbtrr0JMtgjh%2FrKmHsWbFBDyobWChOEPBwk%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;500&quot; height=&quot;666&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;식당 외부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HnRKn/btrr1MIIXlg/WB0sNPOYMcpTnxBGjEZNgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HnRKn/btrr1MIIXlg/WB0sNPOYMcpTnxBGjEZNgK/img.jpg&quot; data-alt=&quot;에피타이저, 보기보다 맛은 괜찮았다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HnRKn/btrr1MIIXlg/WB0sNPOYMcpTnxBGjEZNgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHnRKn%2Fbtrr1MIIXlg%2FWB0sNPOYMcpTnxBGjEZNgK%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;에피타이저, 보기보다 맛은 괜찮았다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFTz8X/btrr13b7xHF/DUU6IMh64lrwEeDhvu0z7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFTz8X/btrr13b7xHF/DUU6IMh64lrwEeDhvu0z7K/img.jpg&quot; data-alt=&quot;메인 메뉴 3종류, 직원이 메뉴 추천을 해줬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFTz8X/btrr13b7xHF/DUU6IMh64lrwEeDhvu0z7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFTz8X%2Fbtrr13b7xHF%2FDUU6IMh64lrwEeDhvu0z7K%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메인 메뉴 3종류, 직원이 메뉴 추천을 해줬다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkItCo/btrr5VqBllQ/d9okWvFL3t0H2us8JR6q0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkItCo/btrr5VqBllQ/d9okWvFL3t0H2us8JR6q0K/img.jpg&quot; data-alt=&quot;이 식당의 시그니쳐 디저트 메뉴인 초콜릿 수플레, 꼭 먹어봐야하는 디저트로 유명하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkItCo/btrr5VqBllQ/d9okWvFL3t0H2us8JR6q0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkItCo%2Fbtrr5VqBllQ%2Fd9okWvFL3t0H2us8JR6q0K%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;500&quot; height=&quot;500&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 식당의 시그니쳐 디저트 메뉴인 초콜릿 수플레, 꼭 먹어봐야하는 디저트로 유명하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>여행기</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/91</guid>
      <comments>https://hydragon516.tistory.com/entry/WACV-2022-%ED%95%99%ED%9A%8C-%EC%B0%B8%EC%84%9D%EA%B8%B0-%ED%95%98%EC%99%80%EC%9D%B4-%EC%97%AC%ED%96%89%EA%B8%B0-3#entry91comment</comments>
      <pubDate>Fri, 28 Jan 2022 23:58:43 +0900</pubDate>
    </item>
    <item>
      <title>Pyinstaller 사용시 selenium의 chromedriver 콘솔창 제거하는 방법</title>
      <link>https://hydragon516.tistory.com/entry/Pyinstaller-%EC%82%AC%EC%9A%A9%EC%8B%9C-selenium%EC%9D%98-chromedriver-%EC%BD%98%EC%86%94%EC%B0%BD-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDmI7n/btrr1MBjGvq/TZTcRkUXVMayJyGqXa8LQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDmI7n/btrr1MBjGvq/TZTcRkUXVMayJyGqXa8LQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDmI7n/btrr1MBjGvq/TZTcRkUXVMayJyGqXa8LQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDmI7n%2Fbtrr1MBjGvq%2FTZTcRkUXVMayJyGqXa8LQk%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;300&quot; height=&quot;300&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1280&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;span style=&quot;color: #666666;&quot;&gt;selenium으로 만든 프로젝트를 pyinstaller로 프로그램을 만들 때 --noconsole 옵션을 주어도 검은색 콘솔창이 계속 나오는 경우가 있다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이 경우에는 먼저&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;C:\Users\[사용자 이름]\anaconda3\envs\[가상환경 이름]\Lib\site-packages\selenium\webdriver\common&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;경로의 service.py를 찾아서 열어준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;service.py 중간에 다음과 같은 항목이 보일것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643380342104&quot; class=&quot;routeros&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
    cmd = [self.path]
    cmd.extend(self.command_line_args())
    self.process = subprocess.Popen(cmd, env=self.env,
                                    close_fds=system() != 'Windows',
                                    stdout=self.log_file,
                                    stderr=self.log_file,
                                    stdin=PIPE,
                                    creationflags=self.creationflags)
except TypeError:
    raise&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이 부분을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1643380342104&quot; class=&quot;routeros&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
    cmd = [self.path]
    cmd.extend(self.command_line_args())
    self.process = subprocess.Popen(cmd, stdin=PIPE, 
                                    stdout=PIPE,
                                    stderr=PIPE, 
                                    shell=False, 
                                    creationflags=0x08000000)
except TypeError:
    raise&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이렇게 수정하면 된다. 그러면 더 이상 콘솔창이 보이지 않는다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍</category>
      <author>hydragon</author>
      <guid isPermaLink="true">https://hydragon516.tistory.com/90</guid>
      <comments>https://hydragon516.tistory.com/entry/Pyinstaller-%EC%82%AC%EC%9A%A9%EC%8B%9C-selenium%EC%9D%98-chromedriver-%EC%BD%98%EC%86%94%EC%B0%BD-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95#entry90comment</comments>
      <pubDate>Fri, 28 Jan 2022 23:32:49 +0900</pubDate>
    </item>
  </channel>
</rss>