<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>물공's의 딥러닝</title>
    <link>https://sensibilityit.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 2 Jul 2026 06:48:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Waterbottle</managingEditor>
    <image>
      <title>물공's의 딥러닝</title>
      <url>https://tistory1.daumcdn.net/tistory/1571554/attach/e132d3ba3ffd412dbfb6e29689d422f4</url>
      <link>https://sensibilityit.tistory.com</link>
    </image>
    <item>
      <title>블로그 이사합니다.</title>
      <link>https://sensibilityit.tistory.com/525</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜 시간동안 블로그 이사에 대해 고민을 했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플랫폼은&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Notion (oopy)&lt;/li&gt;
&lt;li&gt;Github 블로그&lt;/li&gt;
&lt;li&gt;medium&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 Github 블로그로 옮기기로 했습니다&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;h3 data-ke-size=&quot;size23&quot;&gt;이사한 블로그 주소: &lt;a href=&quot;https://mulkong.github.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mulkong.github.io&lt;/a&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/525</guid>
      <comments>https://sensibilityit.tistory.com/525#entry525comment</comments>
      <pubDate>Sat, 25 Dec 2021 12:36:14 +0900</pubDate>
    </item>
    <item>
      <title>[ViT 시리즈] Vision Transformer 논문 리뷰 보단 메모.</title>
      <link>https://sensibilityit.tistory.com/524</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;본격적인 Vision Transformer 관련 논문들을 리뷰를 하기 전에, 공부한 내용을 정리할 겸해서 간단하게 메모장을 끄적이는 느낌으로 정리를 해볼까 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;1. 사전 지식&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;span&gt; Attention mechanism&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Encoder &amp;harr;️ Decoder 사이의 correlation을 바탕으로 특징을 추출해 나가는 과정.&lt;/li&gt;
&lt;li&gt;Decoder로 부터 query가 나옴.&lt;/li&gt;
&lt;li&gt;Encoder로 부터 key, value가 나옴.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  참고 그림&lt;/b&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDHyNZ/btroeArfjZl/AInqNosloZfgC3XwfwwXXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDHyNZ/btroeArfjZl/AInqNosloZfgC3XwfwwXXK/img.png&quot; data-alt=&quot;출처:&amp;amp;nbsp;https://blog.promedius.ai/transformer/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDHyNZ/btroeArfjZl/AInqNosloZfgC3XwfwwXXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDHyNZ%2FbtroeArfjZl%2FAInqNosloZfgC3XwfwwXXK%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;747&quot; height=&quot;739&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처:&amp;nbsp;https://blog.promedius.ai/transformer/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;  Self-Attention mechanism&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 데이터로 부터 query, key, value가 계산된다. 그 이후에는 Attention mechanism과 동일한 과정으로 진행.&lt;/li&gt;
&lt;li&gt;데이터 내의 상관 관계를 바탕으로 특징을 추출해 나가는 과정.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;입력 데이터로 부터 query, key, value를 구함.&lt;/li&gt;
&lt;li&gt;query, key의 similarity를 통해 weight를 결정.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transformer Encoder는 Self-Attention mechanism 이용.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;  Inductive bias&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;네트워크 목적&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;Inductiva bias란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 데이터에 대해 좋은 성능을 내기 위해 모델에 사전적으로 주어지는 가정들을 inductive bias라고 부른다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들면, convolution filter를 활용해 local feature patterns을 추출한 수 있는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; CNN vs Transformer&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CNN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀리 떨어진 두 정보들을 통합할 때 여러개의 layer를 거쳐야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TajR0/btromQGe5cb/2duXQxjgjBl2RS8Ci3Smnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TajR0/btromQGe5cb/2duXQxjgjBl2RS8Ci3Smnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TajR0/btromQGe5cb/2duXQxjgjBl2RS8Ci3Smnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTajR0%2FbtromQGe5cb%2F2duXQxjgjBl2RS8Ci3Smnk%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;464&quot; height=&quot;211&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원의 local feature patterns을 유지하면서 layer를 통과한다. 이는, convolution filter를 활용해 local feature patterns을 추출 하는 것이며 이것이 바로 inductive bias이다.&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;Transformer&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5x5 image가 주어졌을 때, 1D 1D vector로 불어냄.&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;1D vector를 Linear Projection 거친 후 patch embedding에 self-attention을 적용하면 Query, Key, Value를 계산하게 됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;Query, Key의 Similarity를 통해 weight를 결정.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-token-index=&quot;0&quot; data-reactroot=&quot;&quot;&gt;Query, Key의 Similarity를 통해 weight를 결정.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;self-attention layer 하나만 거쳐도 멀리 떨어진 정보들을 교환할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4E9X/btrokqBcziy/by5PqPGDEdKsrrVZNx2SB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4E9X/btrokqBcziy/by5PqPGDEdKsrrVZNx2SB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4E9X/btrokqBcziy/by5PqPGDEdKsrrVZNx2SB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4E9X%2FbtrokqBcziy%2Fby5PqPGDEdKsrrVZNx2SB1%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;383&quot; height=&quot;263&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 1D로 만든 후 self-attention을 통해 layer를 통과함. 이는 2차원의 local feature patterns이 유지되지 않아 CNN에 비해 inductive bias가 적은 모델이라고 말할 수 있다.&lt;/li&gt;
&lt;li&gt;inductive bias가 적은 만큼 모델의 자유도가 높아 더 많은 데이터를 학습할 수 있다. 이는, &lt;b&gt;ViT&lt;/b&gt;의 단점으로 작용하는데 이 문제를 극복한 방법이 &lt;b&gt;DeiT&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&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;h2 data-ke-size=&quot;size26&quot;&gt;2. ViT(Vision Transformer)&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NLP 분야에서 사용된 Transformer를 응용하여 Vision task에서 사용할 수 있도록 고안된 첫 논문 ViT&lt;/li&gt;
&lt;li&gt;Transformer만 사용해서 image classification task에 적용&lt;/li&gt;
&lt;li&gt;Architecture의 hyper-parameter에 따라 여러가지 모델들은 제안하고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OuW3w/btronJ1kaMm/liMGXZqWaElMfD2MqkNg50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OuW3w/btronJ1kaMm/liMGXZqWaElMfD2MqkNg50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OuW3w/btronJ1kaMm/liMGXZqWaElMfD2MqkNg50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOuW3w%2FbtronJ1kaMm%2FliMGXZqWaElMfD2MqkNg50%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;608&quot; height=&quot;180&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; 학습 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cigxJd/btrogxgKeLx/CKpUHfotkq4Laaxk4wwp10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cigxJd/btrogxgKeLx/CKpUHfotkq4Laaxk4wwp10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cigxJd/btrogxgKeLx/CKpUHfotkq4Laaxk4wwp10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcigxJd%2FbtrogxgKeLx%2FCKpUHfotkq4Laaxk4wwp10%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;1654&quot; height=&quot;938&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;학습 순서&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이미지 입력&lt;/li&gt;
&lt;li&gt;16x16 patch로 자름&lt;/li&gt;
&lt;li&gt;각각의 patch들을 1D-vector로 풀어냄&lt;/li&gt;
&lt;li&gt;1D vector로 만들어진 patch들을 Linear Projection을 통해 768 차원의 각 patch의 embedding vector로 표현.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1639911377509&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PatchEmbedding(nn.Module):
    def __init__(self, in_channels: int = 3, patch_size: int = 16, emb_size: int = 768):
        self.patch_size = patch_size
        super().__init__()
        '''
				self.projection = nn.Sequential(
            # break-down the image in s1 x s2 patches and flat them
            Rearrange('b c (h s1) (w s2) -&amp;gt; b (h w) (s1 s2 c)', s1=patch_size, s2=patch_size),
            nn.Linear(patch_size * patch_size * in_channels, emb_size)
        )
				'''
				self.projection = nn.Sequential(
            # using a conv layer instead of a linear one -&amp;gt; performance gains
            nn.Conv2d(in_channels, emb_size, kernel_size=patch_size, stride=patch_size),
            Rearrange('b e (h) (w) -&amp;gt; b (h w) e'),
        )
                
    def forward(self, x: Tensor) -&amp;gt; Tensor:
        x = self.projection(x)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 patch embedding에 classification token, position embedding 추가.&lt;/li&gt;
&lt;li&gt;Transformer Encoder&lt;/li&gt;
&lt;li&gt;Transformer Output&lt;/li&gt;
&lt;li&gt;classification&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; 학습을 통해 결정되는 Parameter&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Classification token&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;classification을 위해 사용되는 token&lt;/p&gt;
&lt;pre id=&quot;code_1639911321575&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PatchEmbedding(nn.Module):
    def __init__(self, in_channels: int = 3, patch_size: int = 16, emb_size: int = 768):
        self.patch_size = patch_size
        super().__init__()
        self.projection = nn.Sequential(
            # using a conv layer instead of a linear one -&amp;gt; performance gains
            nn.Conv2d(in_channels, emb_size, kernel_size=patch_size, stride=patch_size),
            Rearrange('b e (h) (w) -&amp;gt; b (h w) e'),
        )
        
        self.cls_token = nn.Parameter(torch.randn(1,1, emb_size))
        
    def forward(self, x: Tensor) -&amp;gt; Tensor:
        b, _, _, _ = x.shape
        x = self.projection(x)
        cls_tokens = repeat(self.cls_token, '() n e -&amp;gt; b n e', b=b)
        # prepend the cls token to the input
        x = torch.cat([cls_tokens, x], dim=1)
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; Position embedding&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;patch의 위치 정보를 가지고 있는 embedding&lt;/li&gt;
&lt;li&gt;position embedding을 사용 안하면?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 입력 &amp;rarr; 일전 크기의 patch로 자름 &amp;rarr; patch를 sequence로 생각하여 transformer Encoder로 입력 &amp;rarr; 각 patch가 어떤 위치에서 왔는지 위치 정보가 손실됨. &amp;rarr; 학습 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(classification token, patch embedding) + position embedding 이 Transformer Encoder로 입력됨.&lt;/li&gt;
&lt;li&gt;classification token, position token은 학습에 의해 결정되는 parameter입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1639911440644&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class PatchEmbedding(nn.Module):
    def __init__(self, in_channels: int = 3, patch_size: int = 16, emb_size: int = 768, img_size: int = 224):
        self.patch_size = patch_size
        super().__init__()
        self.projection = nn.Sequential(
            # using a conv layer instead of a linear one -&amp;gt; performance gains
            nn.Conv2d(in_channels, emb_size, kernel_size=patch_size, stride=patch_size),
            Rearrange('b e (h) (w) -&amp;gt; b (h w) e'),
        )
        self.cls_token = nn.Parameter(torch.randn(1,1, emb_size))
        self.positions = nn.Parameter(torch.randn((img_size // patch_size) **2 + 1, emb_size))

        
    def forward(self, x: Tensor) -&amp;gt; Tensor:
        b, _, _, _ = x.shape
        x = self.projection(x)
        cls_tokens = repeat(self.cls_token, '() n e -&amp;gt; b n e', b=b)
        # prepend the cls token to the input
        x = torch.cat([cls_tokens, x], dim=1)
        # add position embedding
        x += self.positions
        return x&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시각화&lt;/h4&gt;
&lt;pre id=&quot;code_1639911461292&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cos = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
fig = plt.figure(figsize=(10,10))
fig.suptitle(&quot;Visualization of position embedding similarities&quot;, fontsize=24)

for i in range(1, pos_embed.shape[1]):
    sim = F.cosine_similarity(pos_embed[0, i:i+1], pos_embed[0, 1:], dim=1)
    sim = sim.reshape((14, 14)).detach().cpu().numpy()
    ax = fig.add_subplot(14, 14, i)
    ax.axes.get_xaxis().set_visible(False)
    ax.axes.get_yaxis().set_visible(False)
    ax.imshow(sim)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Er8LI/btronJmIVFD/601rciKCWhViDVdYN1Z0l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Er8LI/btronJmIVFD/601rciKCWhViDVdYN1Z0l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Er8LI/btronJmIVFD/601rciKCWhViDVdYN1Z0l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEr8LI%2FbtronJmIVFD%2F601rciKCWhViDVdYN1Z0l1%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;1296&quot; height=&quot;672&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;672&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Architecture&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Transformer Encoder&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ViT는 Vanilla Transformer(Attent is all you need)구조와는 다른 구조로 구성되어 있다.&lt;/li&gt;
&lt;li&gt;Transformer는 layer를 깊게 쌓게되면 학습이 어렵다는 단점이 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 단점을 극복하여 학습이 되게 하기 위해서는 layer normalization의 위치가 중요하다는 것이 후속 연구들을 통해 증명이 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ViT는 NLP 에서 보여진 layer를 깊게 쌓으면 학습이 어렵다는 문제와 이를 극복하기 위해 layer normalization 위치가 중요하다는 연구를 받아드린 Vision Transformer이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 Transformer: Multi-head attention &amp;rarr; normalization&lt;/li&gt;
&lt;li&gt;ViT: normalization &amp;rarr; Multi-head attention&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uz7S1/btronKzaBuy/XWK6yhkZwRm8JjD7koAhe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uz7S1/btronKzaBuy/XWK6yhkZwRm8JjD7koAhe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uz7S1/btronKzaBuy/XWK6yhkZwRm8JjD7koAhe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuz7S1%2FbtronKzaBuy%2FXWK6yhkZwRm8JjD7koAhe1%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;533&quot; height=&quot;486&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;1196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1639911545478&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Transformer Encoder에 입력으로 들어가는 tensor
transformer_input = torch.cat((model.cls_token, patches), dim=1) + pos_embed&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; Attention in Transformer Encoder&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Self-Attention&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순서&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;layer normalization 거친 후 얻어진 $z$&lt;/li&gt;
&lt;li&gt;weight metrix $W_Q$, $W_K$, $W_V$에 곱해져서 Query, Key, VAlue 값들이 계산됨(⭐️ weight metrix의 학습을 통해 attention이 학습)&lt;/li&gt;
&lt;li&gt;Query, Key 값들의 dot product[torch.einsum('bhqd, bhkd -&amp;gt; bhqk', queries, keys)]를 통해 Similarity 계산&lt;/li&gt;
&lt;li&gt;Softmax를 취해 0 ~ 1의 attention score계산&lt;/li&gt;
&lt;li&gt;계산된 attention score에 Value를 곱해 최종적인 output을 얻음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVceRu/btrolTiRhXK/Sdyqq72m47krxobjxngfVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVceRu/btrolTiRhXK/Sdyqq72m47krxobjxngfVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVceRu/btrolTiRhXK/Sdyqq72m47krxobjxngfVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVceRu%2FbtrolTiRhXK%2FSdyqq72m47krxobjxngfVK%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;546&quot; height=&quot;328&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multi-Head Self-Attention&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ViT base model에서는 self-attention 12번 수행.&lt;/li&gt;
&lt;li&gt;768차원 &amp;rarr; Multi-head self-attention 통과 &amp;rarr; 64차원으로 감소 &amp;rarr; self-attention을 12번 수행하니 768차원으로 증가 &amp;rarr; 결국 차원수가 동일하게 유지됨&lt;/li&gt;
&lt;/ul&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;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ec1x6/btroeASmUa2/dbulsim6dSrUkdsFkkbgck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ec1x6/btroeASmUa2/dbulsim6dSrUkdsFkkbgck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ec1x6/btroeASmUa2/dbulsim6dSrUkdsFkkbgck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEc1x6%2FbtroeASmUa2%2Fdbulsim6dSrUkdsFkkbgck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;237&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1639911632179&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MultiHeadAttention(nn.Module):
    def __init__(self, emb_size: int = 768, num_heads: int = 8, dropout: float = 0):
        super().__init__()
        self.emb_size = emb_size
        self.num_heads = num_heads
        self.keys = nn.Linear(emb_size, emb_size)
        self.queries = nn.Linear(emb_size, emb_size)
        self.values = nn.Linear(emb_size, emb_size)
        self.att_drop = nn.Dropout(dropout)
        self.projection = nn.Linear(emb_size, emb_size)
        self.scaling = (self.emb_size // num_heads) ** -0.5

    def forward(self, x : Tensor, mask: Tensor = None) -&amp;gt; Tensor:
        # split keys, queries and values in num_heads
        queries = rearrange(self.queries(x), &quot;b n (h d) -&amp;gt; b h n d&quot;, h=self.num_heads)
        keys = rearrange(self.keys(x), &quot;b n (h d) -&amp;gt; b h n d&quot;, h=self.num_heads)
        values  = rearrange(self.values(x), &quot;b n (h d) -&amp;gt; b h n d&quot;, h=self.num_heads)
        # sum up over the last axis
        energy = torch.einsum('bhqd, bhkd -&amp;gt; bhqk', queries, keys) # batch, num_heads, query_len, key_len
        if mask is not None:
            fill_value = torch.finfo(torch.float32).min
            energy.mask_fill(~mask, fill_value)
            
        att = F.softmax(energy, dim=-1) * self.scaling
        att = self.att_drop(att)
        # sum up over the third axis
        out = torch.einsum('bhal, bhlv -&amp;gt; bhav ', att, values)
        out = rearrange(out, &quot;b h n d -&amp;gt; b n (h d)&quot;)
        out = self.projection(out)
        return out&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MLP (1 hidden layer fully-connected layer)&lt;/h4&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;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vwpfi/btrolUWliqa/hZvtzSknkAMYbmGfK6IZdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vwpfi/btrolUWliqa/hZvtzSknkAMYbmGfK6IZdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vwpfi/btrolUWliqa/hZvtzSknkAMYbmGfK6IZdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvwpfi%2FbtrolUWliqa%2FhZvtzSknkAMYbmGfK6IZdK%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;676&quot; height=&quot;187&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1639911671622&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class FeedForwardBlock(nn.Sequential):
    def __init__(self, emb_size: int, expansion: int = 4, drop_p: float = 0.):
        super().__init__(
            nn.Linear(emb_size, expansion * emb_size),
            nn.GELU(),
            nn.Dropout(drop_p),
            nn.Linear(expansion * emb_size, emb_size),
        )&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Transformer output&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpmG41/btrodSyZYht/OaGKHmkw1lmzLqAlQGk9m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpmG41/btrodSyZYht/OaGKHmkw1lmzLqAlQGk9m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpmG41/btrodSyZYht/OaGKHmkw1lmzLqAlQGk9m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpmG41%2FbtrodSyZYht%2FOaGKHmkw1lmzLqAlQGk9m1%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;519&quot; height=&quot;201&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMUFnP/btrohTcQTGO/Z5tptI4r4UOxMj4Lrl9yYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMUFnP/btrohTcQTGO/Z5tptI4r4UOxMj4Lrl9yYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMUFnP/btrohTcQTGO/Z5tptI4r4UOxMj4Lrl9yYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMUFnP%2FbtrohTcQTGO%2FZ5tptI4r4UOxMj4Lrl9yYK%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;449&quot; height=&quot;337&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;■&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt; 실험적 특징&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;학습 팁&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pretraining dataset의 해상도는 줄이고, fine tunning dataset의 해상도를 증가시키면 모델 성능 &amp;uarr;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Emerald project(Covid-19 Kaist model)에로 위와 같은 방법으로 적용한거로 알고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transformer을 활용하면 기존 CNN 모델보다 효율적인 학습이 가능함. (하지만 ViT 특징만 이용한다면 오히려 단점으로 적용될 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터가 많이 필요하다!&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CNN에 비해 inductive bias가 적음&lt;/li&gt;
&lt;li&gt;&amp;rarr; 입력 이미지를 패치로 구성한 후 데이터를 1D vector로 만들어 self-attention을 통과함 (이 때, sequence로 들어가니 position embedding은 필수!) &amp;rArr; 따라서 2차원의 지역적인 정보가 유지되지 않음.&lt;/li&gt;
&lt;li&gt;inductive bias가 적으면 그만큼 모델의 자유도는 &amp;uarr; &amp;rArr; 이는 많은 데이터로 학습이 가능하다. (결국은 데이터가 많이 필요하다)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터가 많이 필요한 ViT의 단점을 극복한 논문이 DeiT(facebook)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Knowlege Distiliation, Data Augmentation을 활용한 논문.&lt;/li&gt;
&lt;li&gt;순서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 데이터를 Teacher model, Student model에 입력으로 넣어줌&lt;/li&gt;
&lt;li&gt;Teacher model의 output이 Teacher model의 지식이다 라고 가정&lt;/li&gt;
&lt;li&gt;Teacher과 Student의 output을 KL-divergence를 이용하여 계산
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이는 T와 S의 분포 사이의 거리를 최대한 줄여주기 위함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Teachcer과 Student의 분포의 거리를 줄여 Teacher 모델의 지식을 Student 모델로 전이해 주겠다 라는 방법.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핵심 내용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CNN의 inductive bias를 Student model(DeiT) 모델에 넣어줄 수 있기 때문에 Teacher model를 CNN을 사용하여 활용하는게 더 유리함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;https://www.youtube.com/watch?v=bgsYOGhpxDc&amp;amp;t=580s&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.promedius.ai/transformer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.promedius.ai/transformer/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/xmu-xiaoma666/External-Attention-pytorch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/xmu-xiaoma666/External-Attention-pytorch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>Transformer</category>
      <category>vision transformer</category>
      <category>vịt</category>
      <category>논문</category>
      <category>딥러닝</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/524</guid>
      <comments>https://sensibilityit.tistory.com/524#entry524comment</comments>
      <pubDate>Sun, 19 Dec 2021 20:06:27 +0900</pubDate>
    </item>
    <item>
      <title>[생성모델 시리즈] Adversarial Latent Autoencoders</title>
      <link>https://sensibilityit.tistory.com/523</link>
      <description>&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■ 본 논문은, GAN의 Generator &amp;rarr; F, G&amp;nbsp; &amp;amp; Discriminator &amp;rarr; E, D 각각 분리하여 아키테처를 구성하고 있습니다.&lt;/p&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;F에서 나온 latent space와 E에서 나온 latent space가 서로 동일한 분포를 가진다고 가정해서 연구가 진행 되었으며, F는 deterministic하게 latent space mapping이 이루어지고, G﹒E는 독립적이고 이미 알려진 분포의 noise인 $\eta$를 입력으로 주어 stochastic하게 만듭니다.&lt;/p&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;결론적으로 latent space의 확률 분포를 adversarial 하게 학습할 수 있는 장점이 있습니다. 그로 인하여 GAN과 비슷한 생성 능력, disentangled representation을 학습한 점을 보여주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  ALAE(Adversarial Latent Autoencoders)에 대한 리뷰 후 다음 글에서 코드 리뷰를 이어 나가도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ [논문 리뷰] Adversarial Latent Autoencoders&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;◻︎ [코드 리뷰] Adversarial Latent Autoencoders&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Abstract&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Autoencoder란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autoencoder는 encoder-generator map을 동시에 학습하여 generation &amp;amp; representation properties을 결합하는 것을 목표로 하는 unsupervised 접근 방식 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Autoencoder의 한계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Autoencoder에 대한 많은 연구가 진행되었지만, GANs(&lt;i&gt;Generative Adversarial Networks&lt;/i&gt;)와 동일한 생성 능력을 가지고 있는지, 아니면 disentangled representations을 학습하는지에 대한 문제는 완전히 다루어지지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제안&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 위에서 언급한 문제인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;GANs와 동일한 생성 능력을 가지고 있는지&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;disentangled representations을 학습하고 있는지&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에 대한 문제를 해결하는 autoencoder를 소개하며 저자들은 이 네트워크를 ALAE(&lt;i&gt;Adversarial Latent Autoencoder&lt;/i&gt;)라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 Autoencoder 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 2개의 autoencoder를 설계했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;i&gt;MLP Encoder를 기반으로 하는 Encoder&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;StyleGAN의 Generator를 기반으로 하는 StyleALAE&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StyleALAE는 StyleGAN과 비슷한 품질읜 1024x1024 얼굴 이미지를 생성할 수 있으며, 동일한 해상도에서 실제 이미지를 기반으로 face reconstruction, manipulations도 생성할 수 있음을 보여주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로, ALAE는 GAN의 성능과 비슷하거나 그 성능을 능가하는 최초의 Autoencoder라고 논문에서 소개를 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Introduction&lt;/h2&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;i&gt;GAN처럼 얼마나 고해상도 이미지를 실제와 똑같게 생성할 수 있는지&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;disentangled representations 학습이 잘 이루어졌는지&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 진행된 연구들의 논문들을 보면, 고해상도 이미지를 생성하는 네트워크가 무엇이 있을까 생각을 해볼 때 AE(Autoencoder)보다는 GAN이 가장 먼저 떠오를 것 입니다. 또한 AE는 entangled representations을 배원 manipulations가 불가능 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문의 저자들은, abstract에 정리한대로 2가지의 autoencoder를 제안하고 있습니다. 첫째, MLP Encoder를 기반으로 하는 Encoder인 ALAE, 둘째, StyleGAN의 Generator를 ALAE에 적용한 StyleALAE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StyleALAE의 생성 결과부터 보면 아래 그림 1와 같이 GAN처럼 고해상도 이미지를 잘 생성하고 있음을 보여주고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;632&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uLkwj/btrdqRig3gR/gBxItZKjXcqpe6T1tbfmAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uLkwj/btrdqRig3gR/gBxItZKjXcqpe6T1tbfmAk/img.png&quot; data-alt=&quot;그림 1. FFHA generation. Generations with StyleALAE trained on FFHQ at 1024x1024&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uLkwj/btrdqRig3gR/gBxItZKjXcqpe6T1tbfmAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuLkwj%2FbtrdqRig3gR%2FgBxItZKjXcqpe6T1tbfmAk%2Fimg.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;632&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1. FFHA generation. Generations with StyleALAE trained on FFHQ at 1024x1024&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Preliminaries&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. AutoEncoder&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;432&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSLpSY/btrdpsKljpi/lsSvxsZaJJM2pz761hDcsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSLpSY/btrdpsKljpi/lsSvxsZaJJM2pz761hDcsK/img.png&quot; data-alt=&quot;그림 2. Autoencoder architecture (출처:https://learnopencv.com/variational-autoencoder-in-tensorflow/)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSLpSY/btrdpsKljpi/lsSvxsZaJJM2pz761hDcsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSLpSY%2FbtrdpsKljpi%2FlsSvxsZaJJM2pz761hDcsK%2Fimg.png&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;432&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 2. Autoencoder architecture (출처:https://learnopencv.com/variational-autoencoder-in-tensorflow/)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Encoder&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력된 이미지에 대한 특징(feature)인 고차원 input space을 저차원 latent space $z$로 압축하는 모델이며 식을 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$z = E(x)$$&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;Decoder&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder에 의해 고차원에서 저차원으로 인코딩된 $z$를 다시 입력된 이미지 $x$와 동일한 이미지 $\hat{x}$로 재구성 하는 모델이며 식은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\hat{x} = D(z)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. GANs&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;692&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbxFNn/btrdps4EeIq/9sXH1kmzuGgxVCmOqJzJP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbxFNn/btrdps4EeIq/9sXH1kmzuGgxVCmOqJzJP0/img.png&quot; data-alt=&quot;그림 3. GANs architecture (출처: https://developers.google.com/machine-learning/gan/gan_structure)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbxFNn/btrdps4EeIq/9sXH1kmzuGgxVCmOqJzJP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbxFNn%2Fbtrdps4EeIq%2F9sXH1kmzuGgxVCmOqJzJP0%2Fimg.png&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;692&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 3. GANs architecture (출처: https://developers.google.com/machine-learning/gan/gan_structure)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generator와 Discriminator로 구성되어 있으며 서로 &lt;i&gt;adversarial training&lt;/i&gt; 하는 방식으로 고해상도 이미지를 생성하도록 학습하는 생성 모델 입니다. 이는 $q(x)$가 $P_D(x)$만큼 가깝도록 G를 학습하는 것을 목표로 하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Generator&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Autoencoder처럼 입력 이미지 $x$를 latent space로 직접 인코딩하는 방식이 아니라, synthetic distribution $q(x)$를 표현하는 새로운 이미지 $G(x)$를 생성하기 위해 이전에 알려진 $p(z)$의 latent space $Z$를 학습하는 네트워크 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Discriminator&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 데이터셋의 true distribution $P_D(x)$를 나타내는 이미지와 생성된 이미지의 false distribution $P_D(\hat{x})$을 나타내는 이미지를 구분하는 네트워크 입니다.&lt;/p&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;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참고:&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://sensibilityit.tistory.com/505&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;[GAN] Generative Adversarial Network 정리&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Adversarial Latent Autoencoders&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Autoencoder는 지금가지 많은 연구가 진행되었습니다. 하지만 아래 2가지 문제에 대해서는 해결을 하지 못하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GANs와 비슷한 생성 능력을 가지고 있는지.&lt;/li&gt;
&lt;li&gt;Disentangled representations을 잘 학습하였는지.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 autoencoder만으로는 disentangled representation을 학습하기 힘들고 이를 학습하기 위해서는 추가적인 테크닉이 필요.&lt;/p&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은 entangled representation을 학습합니다. 따라서 input noise에서 어느 부분이 어떤 representation을 조절하는지 알기 힘듭니다. 근데 이것을 모델이 disentangle하게 학습한다면 input noise의 어느 부분이 어떤 representation을 조절하는지 해석이 가능하게 됩니다. GAN에서는 disentangled representation을 학습하는 모델들이 많이 나왔지만 Autoencoder는 그렇지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이 논문은 위에서 언급한 두기자 문제를 모두 해결하는 Autoencoder를 설계를 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Architecture&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALAE의 구조에 대해 알아보고 StyleGAN의 Generator을 이용하여 GAN과 비슷한 생성 능력을 지닐 수 있도록 만든 StyleALAE에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. ALAE&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;618&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GUSf9/btrdtLvtYJ5/NNWBKOykEaLp8Seau6LJdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GUSf9/btrdtLvtYJ5/NNWBKOykEaLp8Seau6LJdk/img.png&quot; data-alt=&quot;그림 4.&amp;amp;amp;nbsp; ALAE Architecture. The architecture of an Adversarial Latent Autoencoder.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GUSf9/btrdtLvtYJ5/NNWBKOykEaLp8Seau6LJdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGUSf9%2FbtrdtLvtYJ5%2FNNWBKOykEaLp8Seau6LJdk%2Fimg.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;618&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 4.&amp;nbsp; ALAE Architecture. The architecture of an Adversarial Latent Autoencoder.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALAE는 generator &lt;b&gt;G&lt;/b&gt;, discriminator&lt;b&gt; D&lt;/b&gt;를 $\textit{G} = F \circ G $ and $\textit{D} = D \circ E $로 decomposing한 네트워크 입니다. 이때 decomposed 네트워크 사이의 latent space $w$즉, $w = F(z)$와&amp;nbsp; $w = E(q_G(x\vert w, \eta))$가 서로 동일하다는 가정을 지니고 있으며 이 latent space를 $W라고 표현하고 있습니다.&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;◼︎ Generator F&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F는 prior distribution $p(z)$ &amp;rarr; intermediate latent space $w$ distribution $q_F(w)$로 변환하는 역할을 가지고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;372&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VygkO/btrdooPMdaS/hDwCYjoRKKJAPrqvSVMNg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VygkO/btrdooPMdaS/hDwCYjoRKKJAPrqvSVMNg0/img.png&quot; data-alt=&quot;그림 5. intermediate latent space로 변환하는 역할인 F&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VygkO/btrdooPMdaS/hDwCYjoRKKJAPrqvSVMNg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVygkO%2FbtrdooPMdaS%2FhDwCYjoRKKJAPrqvSVMNg0%2Fimg.png&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;372&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 5. intermediate latent space로 변환하는 역할인 F&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문에서 disentanglement에 대해 아주 중요한 이야기를 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;input space에서 멀리 떨어진 intermediate latent space가 더 나은 disentanglement properties를 갖는 경향이 있음을 보여주고 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 저자는 &lt;b&gt;F&lt;/b&gt;가 가장 일반적인 경우에서 deterministic map 이라고 가정했으며 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;know prior $p(z)$에서 샘플을 가져와 $q_{F}(w)$을 출력하게 됩니다.&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;i&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px; color: #666666;&quot;&gt;deterministic mapping에 대해 궁금하신 분들인 해당 &lt;a style=&quot;color: #666666;&quot; href=&quot;https://wikidocs.net/3413&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wiki&lt;/a&gt;를 참고해 참고해주시기 바랍니다.&lt;/span&gt;&lt;/i&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;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px; color: #000000;&quot;&gt;◼︎ Generator G&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqJKh1/btrdqRC1ZZd/L4deURXS9HV4gVcmkjnxfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqJKh1/btrdqRC1ZZd/L4deURXS9HV4gVcmkjnxfK/img.png&quot; data-alt=&quot;그림 6. Generator G에 해당되는 영역.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqJKh1/btrdqRC1ZZd/L4deURXS9HV4gVcmkjnxfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqJKh1%2FbtrdqRC1ZZd%2FL4deURXS9HV4gVcmkjnxfK%2Fimg.png&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 6. Generator G에 해당되는 영역.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;original GAN과 차이점 부터 비교해가며 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;GAN&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Generator, Discriminator 2개의 네트워크로 adversarial training이 이루어집니다.&lt;/li&gt;
&lt;li&gt;Generator에 대한 입력은 latent space에서 직접 샘플링이 됩니다.&lt;/li&gt;
&lt;li&gt;생성된 이미지 $G(z)$는 binary classifier처럼 True/False로 분류해주는 Discriminator에 바료 입력 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ALAE&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Generator, Discriminator가 $\textit{G} = F \circ G $ and $\textit{D} = D \circ E$로 decompose 되었으며 총 4개의 네트워크로 adversarial training이 이루어집니다.&lt;/li&gt;
&lt;li&gt;F에서 학습된 intermediate latent space $w$에서 샘플링이 됩니다.&lt;/li&gt;
&lt;li&gt;G에서 생성된 이미지가 Encoder를 먼저 거친 위 Discriminator에 입력 됩니다.&lt;/li&gt;
&lt;/ul&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;i&gt;G가 known fixed distribution $p_\eta(\eta)$에서 샘플링된 independent noisy input $\eta$에서 optionally하게 의존할 수 있다고 가정하고 있습니다. 따라서 G는 $q_F(w)$와 optionally $p_\eta(\eta)$2가지 입력을 동시에 받습니다&lt;/i&gt;. 해당 식은 다음과 같이 정의됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;232&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WVYLk/btrdlzKFFUS/wEdnFBeMX4pe2Aq6stL2ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WVYLk/btrdlzKFFUS/wEdnFBeMX4pe2Aq6stL2ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WVYLk/btrdlzKFFUS/wEdnFBeMX4pe2Aq6stL2ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWVYLk%2FbtrdlzKFFUS%2FwEdnFBeMX4pe2Aq6stL2ck%2Fimg.png&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;232&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$q_G(x\vert w, \eta)$: $w$ and $\eta$가 주어지면 생성된 이미지 $\hat{x}$의 조건부 확률&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;◼︎ Discriminator Encoder E&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;450&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GrAeh/btrdop85Wih/wJM59VOdZqLYK2CUKIMTfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GrAeh/btrdop85Wih/wJM59VOdZqLYK2CUKIMTfk/img.png&quot; data-alt=&quot;그림 7. Discriminator Encoder E에 해당되는 영역&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GrAeh/btrdop85Wih/wJM59VOdZqLYK2CUKIMTfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGrAeh%2Fbtrdop85Wih%2FwJM59VOdZqLYK2CUKIMTfk%2Fimg.png&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;450&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 7. Discriminator Encoder E에 해당되는 영역&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 언급한대로 decomposed 네트워크 사이의 latent space가 서로 동일하다는 가정을 지니고 있습니다. 즉, intermediate latent space $w$로 data space를 인코딩하며 이는 $q_F(w)$와 동일한 latent space를 갖습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습중에 Encoder에 대한 입력은 real data distribution $P_D(x)$의 real image $x$ 또는 synthetic distribution $q(x)$를 나타내는 생성 이미지 $\hat{x}$인 $G(w, \eta)$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;synthetic distribution에서 입력될 때 Encoder의 출력은 다음 식과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;262&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/la2xr/btrdo4QSzcJ/TZiJ5aYyLbNuplwiX9w9fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/la2xr/btrdo4QSzcJ/TZiJ5aYyLbNuplwiX9w9fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/la2xr/btrdo4QSzcJ/TZiJ5aYyLbNuplwiX9w9fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fla2xr%2Fbtrdo4QSzcJ%2FTZiJ5aYyLbNuplwiX9w9fK%2Fimg.png&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;262&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$q_E(w)$: 주어진 data space에서 latent space $w$의 conditional probability distribution&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 real data distribution $P_D(x)$에서 입력될 때 Encoder의 출력은 아래 식과 같습니다.&lt;/p&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;q_{E,&amp;nbsp;D}(w)&amp;nbsp;=&amp;nbsp;\int_{x}&amp;nbsp;q(w&amp;nbsp;\vert&amp;nbsp;x)&amp;nbsp;P_D(x)&amp;nbsp;dx$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 식이 성립되는 이유는 F에서 나온 intermediate latent space $w$와 E에서 나온 intermediate latent space $w$가 동일하다는 가정으로 연구가 진행되어서 $q_F(w) = q_E(w)$가 성립됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALAE는 adversarial strategy로 학습이 진행됩니다. 따라서 $q(x)$ &amp;rarr; $P_D(x)$가 되며 이는 $q_E(x)$ &amp;rarr; $q_{E, D}(x)$로 이동하는 것을 의미합니다.&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;◻︎ Matching the latent space&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;latent space에 대한 가정은 $q_E(w)$의 output distribution이 $q_F(w)$의 input distribution과 유사하다는 점 입니다. 이 개념을 바탕으로 실제 학습을 진행할 때 두 분포간 squared difference를 최소화 하는 방향으로 학습을 진행합니다.&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;◻︎ AE가 GAN처럼 선명한 이미지를 만들 수 없는 이유!&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 autoencoder에서 입력된 이미지와 Decoder에 의해 복원된 이미지를 이용하여 reconstruction loss를 구하게 됩니다. 이때 사용된 loss functiondms 보통 L2 loss를 많이 사용합니다. autoencoder가 GAN처럼 선명한 이미지를 생성(복원)할 수 없는 가장 큰 이유가 바로 L2 loss를 사용하기 때문인데요. L2 loss는 data space에서 연산이 이루어지지만 human visual perception을 반영하지는 않습니다. 이러한 이유로 인해 autoencoder가 GAN과 같은 선명한 이미지를 생성할 수 없게 됩니다.&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;◼︎ Discriminator D&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder에 의해 제공되는 intermediate latent space가 입력되면 진짜인지 가짜인지 판별해주는 역할을 하는 네트워크 입니다. 이 네트워크는 학습 과정에서 2번 호출 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;G에 의해 생성된 이미지 $q_G(x\vert w, \eta)$가 E를 통해 latent space mapping이 이루어지고, 그 latent space $q_E(w)$가 D에 제공되는 경우.&lt;/li&gt;
&lt;li&gt;실제 데이터 $x$가 E에 입력되고 그로 인해 얻어진 출력값이 D에 제공되는 경우.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. StyleALAE&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 내용까지는 MLP Encoder를 기반으로 하는 ALAE에 대한 특징 및 아키텍처에 대해 알아보았습니다. 이제 StyleGAN의 Generator을 이용하여 GAN과 비슷한 생성 능력을 지닐 수 있도록 만든 StyleALAE 아키텍처에 대해 간단히 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1058&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IxKED/btrdptpy5zT/US8CSWJAVI5YfPmojXYbA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IxKED/btrdptpy5zT/US8CSWJAVI5YfPmojXYbA1/img.png&quot; data-alt=&quot;그림 8. StyleALAE Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IxKED/btrdptpy5zT/US8CSWJAVI5YfPmojXYbA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIxKED%2Fbtrdptpy5zT%2FUS8CSWJAVI5YfPmojXYbA1%2Fimg.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;1058&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 8. StyleALAE Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StyleALAE는 StyleGAN의 Generator와 ALAE를 결합한 아키텍처 입니다. StyleALAE는 아래와 같이 구성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(그림 9)와 같이 ALAE의 Generator가 StyleGAN의 Generator로 변경&lt;/li&gt;
&lt;li&gt;style information을 추출하는 Encoder network E는 Generator와 대칭이 되도록 구성.&lt;/li&gt;
&lt;/ul&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-origin-width=&quot;1460&quot; data-origin-height=&quot;1084&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mGyDi/btrdo9SoBCe/wLBnuMPsIfukxvuVQeanq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mGyDi/btrdo9SoBCe/wLBnuMPsIfukxvuVQeanq0/img.png&quot; data-alt=&quot;그림 9. MLP Encoder를 기반으로 하는 ALAE에서 StyleGAN의 Generator를 이용하여 구성한 StyleALAE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mGyDi/btrdo9SoBCe/wLBnuMPsIfukxvuVQeanq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmGyDi%2Fbtrdo9SoBCe%2FwLBnuMPsIfukxvuVQeanq0%2Fimg.png&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1084&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 9. MLP Encoder를 기반으로 하는 ALAE에서 StyleGAN의 Generator를 이용하여 구성한 StyleALAE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;◼︎ 개념 정리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;◻︎ IN(&lt;i&gt;Instance Normalization&lt;/i&gt;)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레이어 $i^{th}$의 style content를 추출하며, 입력된 영상에 대한 normalization을 진행합니다.&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;◻︎ Style Information&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IN에 의해 추출된 style content를 구성하는 channel-wise average $\mu$와 $\sigma$를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder는 $i^{th}$의 style content들은 latent space $w$와 선형적으로 관련된 symmetric generator (&lt;i&gt;G of StyleALAE&lt;/i&gt;)의 AdaIN(&lt;i&gt;Adaptive Instance Normalization&lt;/i&gt;)으로 입력됩니다. 따라서 Encoder의 각 레이어의 IN에 의해추출된 style content는 multilinear map을 통해 latent space에 mapping 됩니다.&lt;/p&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;i&gt;AdaIN에 대한 설명 [&lt;a style=&quot;color: #666666;&quot; href=&quot;https://www.notion.so/AdaIN-Arbitrary-Style-Transfer-in-Real-Time-With-Adaptive-Instance-Normalization-9fe8b5fb60154380b6fbe3147e0afe9e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;link&lt;/a&gt;]&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>autoencoder</category>
      <category>disentenaglement</category>
      <category>Gan</category>
      <category>StyleGAN</category>
      <category>글또</category>
      <category>글또6기</category>
      <category>논문리뷰</category>
      <category>생성모델</category>
      <category>오토인코더</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/523</guid>
      <comments>https://sensibilityit.tistory.com/523#entry523comment</comments>
      <pubDate>Sat, 28 Aug 2021 14:58:22 +0900</pubDate>
    </item>
    <item>
      <title>[DCLGAN] Dual Contrastive Learning for Unsupervised Image-to-Image Translation</title>
      <link>https://sensibilityit.tistory.com/522</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Unsupervised image-to-image translation개념&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unsupervised image-to-image translation tasks는 unpaired train data에서 source domain X와 target domain Y간의 mapping이 되는 지점을 찾는 것을 목표로 하는 task 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CUT(Contrastive Learning for unpaired image-to-image Translation)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contrastive Learning for unpaired image-to-image Translation은 두개의 도메인 (X, Y) 모두에 대해 하나의 Encoder만 사용하여 입력, 출력 패치(patch)의 mutual information을 최대화 하여 unsupervised image-to-image translation을 모델링 하는 SOTA 결과를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;제안한 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 unpaired data간의 효율적인 매핑을 위해 contrastive learning, dual learning setting에 기반한 새로운 학습 방법을 제안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;mode collapse 문제 해결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cycle consistency loss의 문제점들을 해결 하기 위해 self-supervised representation learning 분야에서 multiple views of the data 간의 contrastive learning을 이용한 CUT가 SOTA을 달성했지만 mode collapse 문제가 발생 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  DCLGAN은 데이터 도메인에 따라 mode collapse가 발생할 수 있다는 문제점이 존재하여 이를 해결하기 위해 DCLGAN의 변형인 SimDCL도 논문에서 소개를 하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문에서 제안한 방법으로 mode collapse문제를 효율적으로 해결합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CUT&lt;/b&gt;: 1개의 Encoder 사용, 데이터에 따라 mode collapse 문제 발생&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DCLGAN&lt;/b&gt;: 2개의 Encoder 사용, mode collapse 문제를 효율적으로 해결.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image-to-image translation tasks에서 extensive ablation study을 다른 네트워크들에 비해 본 논문에서 제안한 접근 방식이 효과적이라는 것을 본 논문에서 입증하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝으로, unsupervised learning과 supervised learning 방법 사이의 격차를 효율적으로 줄일 수 있음을 보여주고 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image-to-image translation task는 이미지를 한 도메인에서 다른 도메인으로 변환하는 것을 목표로 합니다. 가장 일반적으로 사용하고 있는 방법은 GAN을 기반으로 하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAN이 발전하게 된 이유중 하나는 adversarial loss를 사용한점 입니다. 하지만 adversarial loss를 unpaired unsupervised image-to-image translation에 사용하여 발생되는 문제점은 adversarial loss가 underconstrained 하다는 점 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  adversarial loss가 underconstrained 하다면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  두 도메인(X, Y) 사이에 여러개의 매핑이 존재하게 되어 네트워크 학습이 불안정하게 이루어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 위와 같은 문제를 해결하기 위해 unpaired unsupervised image-to-image translation 에서는 cycle consistency을 사용하여 adversarial loss만 사용했을때 발생되는 문제점을 해결했습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Cycle consistency&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cycle consistency loss는 (그림 1)처럼target Domain ➡️ source Domain으로 역방향 매핑을 학습할 때 사용하는 loss 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;b&gt;역방향 매핑을 학습한다는 의미는?&lt;/b&gt;&lt;br /&gt;  입력된 이미지와 재구성된 이미지가 얼마나 동일하게 만들어 지는지를 학습하는 의미이며 cycle consistency loss가 그 차이를 측정하며 학습을 하게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;419&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blzWmo/btrb8hqfIQF/AT5kN40IVLwwSVl5KFLhr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blzWmo/btrb8hqfIQF/AT5kN40IVLwwSVl5KFLhr1/img.png&quot; data-alt=&quot;(그림 1). CycleGAN의 cycle consistency loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blzWmo/btrb8hqfIQF/AT5kN40IVLwwSVl5KFLhr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblzWmo%2Fbtrb8hqfIQF%2FAT5kN40IVLwwSVl5KFLhr1%2Fimg.png&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;419&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 1). CycleGAN의 cycle consistency loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 cycle consistency을 사용할 때 약간의 가정과 제약이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  cycle consistency의 가정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변환된 이미지는 target domain과 유사한 texture information을 가지므로 geometry 변경이 불가하다는 것을 가정으로 두고 cycle consistency를 사용합니다.&lt;/li&gt;
&lt;li&gt;두 도메인 (X, Y) 간의 관계가 bijection 되도록 즉, 1:1 대응이 되도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  cycle consistency의 제약&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그로 인해 정확도 손실로 인해 재구성 과정이 제한되므로재구성 이미지의 diversity가 감소하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이러한 제약을 해결하기 위해 Contrastive Learning을 이용한 연구가 등장을 하게 되었습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Contrastive Learning을 이용한 Image-to-Image Translation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cycle consistency loss는 재구성 이미지의 diversity가 감소하게 되는 등의 제약들이 발견되었습니다. 따라서 이를 해결하기 위해self-supervised representation learning 분야에서 multiple views of the data 간의 contrastive learning 방법이 이루어 졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법이 기존 cycle consistency loss을 사용한 방법의 제약을 효율적으로 해소함을 보여줌과 동시에 SOTA를 달성하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 최근에 나온 논문 중 대표적인 논문으로CUT(Contrastive Learning for Unpaired Image-to-Image Translation)이 있습니다. CUT는unpaired image-to-image translation taks에서 contrastive learning 방식이 효율적이라는 것을 보여주었으며,patch-based multi-layer PatchNCE loss을 사용하여 unpaired image-to-image translation을 위한 Contrastive Learning을 도입하여 입력 및 출력 이미지의 패치간의 mutual information을 최대화 하는 방향으로 학습이 이루어지게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 SOTA를 찍은CUT도 문제점이 보였습니다. 그 문제점은 바로 아이디어는 좋았지만 두 도메인 (X, Y) 사이의 domain gap을 효율적으로 포착하지 못하여 충분히 성능을 끌어올리지 못하고 있다는 점 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  그럼, 왜 성능을 충분히 끌어 올리지 못했을까요?&lt;/b&gt;&lt;br /&gt;  그 이유는 바로 CUT에서 사용한 아키텍처의 특정 부분의 디자인을 잘못 선택해서 성능이 떨어지게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain gap을 효율적으로 포착하기 위해서는 도메인 수 만큼 임베딩이 사용되어야 합니다. 하지만 CUT는 하나의 임베딩이 사용되어 성능을 제한하고 있다고 본 논문에서 주장을 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 본 논문에서는 cycle-consistency의 제약을 피하고, domain gap을 효율적으로 포착할 수 있도록 한개 이상의 임베딩을 사용하고, contrastive learning 방법을 더욱 활용한 DCLGAN을 제안합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DCLGAN&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;480&quot; data-filename=&quot;CUT_gif_24.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QxSE3/btrb9FDSqJy/XPkkm5LglTPN0UCZRKKBKk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QxSE3/btrb9FDSqJy/XPkkm5LglTPN0UCZRKKBKk/img.gif&quot; data-alt=&quot;(그림 2). Contrastive Learning for Unpaired Image-to-Image Translation (CUT) 논문의 Patchwise Contrastive Learning for one-sided translation.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QxSE3/btrb9FDSqJy/XPkkm5LglTPN0UCZRKKBKk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/QxSE3/btrb9FDSqJy/XPkkm5LglTPN0UCZRKKBKk/img.gif&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;480&quot; data-filename=&quot;CUT_gif_24.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 2). Contrastive Learning for Unpaired Image-to-Image Translation (CUT) 논문의 Patchwise Contrastive Learning for one-sided translation.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  목표&lt;/b&gt;&lt;br /&gt;DCLGAN의 목표는 별도의 임베딩을 사용하여 입력 및 출력 이미지 패치의 상관관계를 학습하여 mutual information을 극대화 하는 것을 목표로 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  학습 방법&lt;/b&gt;&lt;br /&gt;DCLGAN은 CUT의 성능을 제한시킨 디자인인 1개의 임베딩을 사용하는 점을 개선시켜 서로 다른 도메인에 서로 다른 Encoder 및 projection heads를 사용함으로써 두 도메인 간의 접점이 되는 부분을 극대화 시키기 위한 1개 이상의 임베딩을 학습합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  발견한점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUT과 달리 DCLGAN의 학습 방법은 dual learning 방식 입니다. 이 방식이 오히려 학습을 안정화 시키는데 도움이 된다고 합니다.&lt;/li&gt;
&lt;li&gt;또한 CUT에서 사용한 PatchNCE loss에서 RGB pixel을 제거하는 것이 학습하는대에 있어 도움이 될 수 있음을 발견했습니다.&lt;/li&gt;
&lt;li&gt;geometrical structure에 대한 제약이 없는 경우에는 cycle-consistency가 불필요 하다는 점도 발견했습니다.&lt;/li&gt;
&lt;li&gt;DCLGAN은 데이터 도메인에 따라 mode collapse가 발생될 수 있지만 그 변형인 SimDCL은 mode collapse를 방지하는데 효과적인 점을 발견했습니다.&lt;/li&gt;
&lt;/ul&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-origin-width=&quot;2386&quot; data-origin-height=&quot;1070&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rn3zh/btrcb78gdwH/e2VpoHhDhhovjkLY5Lr6Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rn3zh/btrcb78gdwH/e2VpoHhDhhovjkLY5Lr6Sk/img.png&quot; data-alt=&quot;(그림 3). DCLGAN architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rn3zh/btrcb78gdwH/e2VpoHhDhhovjkLY5Lr6Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frn3zh%2Fbtrcb78gdwH%2Fe2VpoHhDhhovjkLY5Lr6Sk%2Fimg.png&quot; data-origin-width=&quot;2386&quot; data-origin-height=&quot;1070&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 3). DCLGAN architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;%EC%A0%95%EB%A6%AC&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 눈문은 CycleGAN과 CUT의 한계를 극복할 수 있는 새로움 프레임 워크와 변형 네트워크를 제시하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  CycleGAN&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cycle consistency으로 발생하는 단점.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  CUT&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;contrastive learning의 효율성을 보여주었지만 한개의 임베딩을 사용해서 domain gap을 효율적으로 포착하지 못할 수 있다는 한계점.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 여러가지 다양한 실험을 통해 SOTA에 비해 본 논문에서 제안한 방식이 훨씬 효과적이라는 점을 입증하게 되었으며, self-supervised learning 분야에서 contrastive learning 방법이 그랬던것 처럼 unsupervised and supervised learning 방법 사이의 격차를 성공적으로 좁힐 수 있다는 점을 보여주고 있습니다.&lt;/p&gt;
&lt;h1 id=&quot;related-work&quot;&gt;Related Work&lt;/h1&gt;
&lt;h2 id=&quot;supervised-methods&quot; data-ke-size=&quot;size26&quot;&gt;Supervised methods&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  관련 논문:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1611.07004&quot;&gt;Pix2Pix&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/pdf/1711.11585.pdf&quot;&gt;Pix2PixHD&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1903.07291&quot;&gt;SPADE&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pix2Pix&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;general methods만 사용하여 여러개의 image-to-image translation tasks을 지원하는 작업에 구애받지 않는 image translation을 처음 수행한 논문 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pix2PixHD&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Pix2Pix 논문에서 확장된 방법으로, 고해상도 이미지를 합성할 수 있는 방법 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SPADE&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 이미지의 품질을 더욱 향상 시키기 위해 spatially-adaptive normalization layer을 도입한 논문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  단점: supervised 접근 방법은 학습을 위해 paired data가 필요합니다.&lt;/p&gt;
&lt;h2 id=&quot;unsupervised-methods&quot; data-ke-size=&quot;size26&quot;&gt;Unsupervised methods&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  관련 논문:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1804.04732&quot;&gt;MUNIT&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1808.00948&quot;&gt;DRIT&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1711.09020&quot;&gt;StarGAN&lt;/a&gt;&lt;br /&gt;비지도 학습 방법은 주로&lt;span&gt;&amp;nbsp;&lt;/span&gt;shared latent space,&lt;span&gt;&amp;nbsp;&lt;/span&gt;cycle-consistency assumption을 가정을 두고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MUNIT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;latent space을 style code &amp;amp; content code로 분리하여 domain-specific features를 분리하는 특징이 있는 논문 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DRIT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domain-specific attribute space and shared information을 포착하는 content space을 포함한 두 space에서 이미지 임베딩을 하는 논문 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;StarGAN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 multi domain image-to-image translation 으로, unified model architecture을 사용하여 여러 도메인에서 이미지를 translation 하는 논문 입니다.&lt;/p&gt;
&lt;h2 id=&quot;break-the-cycle&quot; data-ke-size=&quot;size26&quot;&gt;Break the cycle&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  관련 논문:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://openaccess.thecvf.com/content_CVPR_2020/papers/Nizan_Breaking_the_Cycle_-_Colleagues_Are_All_You_Need_CVPR_2020_paper.pdf&quot;&gt;CouncilGAN&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://papers.nips.cc/paper/2017/file/59b90e1005a220e2ebc542eb9d950b1e-Paper.pdf&quot;&gt;DistanceGAN&lt;/a&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://openaccess.thecvf.com/content_CVPR_2019/papers/Fu_Geometry-Consistent_Generative_Adversarial_Networks_for_One-Sided_Unsupervised_Domain_Mapping_CVPR_2019_paper.pdf&quot;&gt;GCGAN&lt;/a&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;CycleGAN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 unpaired data image-to-image translation으로 cycle-consistency loss을 사용하여 adversairal loss의 문제인 mode collapse 단점을 극복하기 위한 네트워크로, 입력 이미지를 target domain으로 변환하고 입력 및 생성된 이미지의 정확도를 유지하며 두개의 매핑을 동시에 학습하는 네트워크 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 cycle-consistency의 문제를 완화하기 위해 break the cycle을 시도하고 있으며 대표적인 네트워크가 CUT 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CouncilGAN&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;council loss와 함께 두개 이상의 Generator, Discriminator을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⭐️ 본 논문에서는 CycleGAN, CUT의 장점을 모두 활용합니다. 특히 mutual information maximization을 통해 cycleGAN 아키텍처를 기반으로 한 양방향 unsupervised image-to-image translation이 가능하도록 합니다.&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>contrastive learning</category>
      <category>Image-to-Image translation</category>
      <category>unsupervised</category>
      <category>글또</category>
      <category>논문리뷰</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/522</guid>
      <comments>https://sensibilityit.tistory.com/522#entry522comment</comments>
      <pubDate>Sun, 15 Aug 2021 20:04:46 +0900</pubDate>
    </item>
    <item>
      <title>[글또 6기] 글또 6기를 시작하며</title>
      <link>https://sensibilityit.tistory.com/521</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;414&quot; data-filename=&quot;글또로고.png&quot; width=&quot;223&quot; height=&quot;219&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIwDcu/btraSZdFK9C/NKNJo11UiiI9KEbe58kkfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIwDcu/btraSZdFK9C/NKNJo11UiiI9KEbe58kkfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIwDcu/btraSZdFK9C/NKNJo11UiiI9KEbe58kkfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIwDcu%2FbtraSZdFK9C%2FNKNJo11UiiI9KEbe58kkfK%2Fimg.png&quot; data-origin-width=&quot;421&quot; data-origin-height=&quot;414&quot; data-filename=&quot;글또로고.png&quot; width=&quot;223&quot; height=&quot;219&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 참여 계기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 생각을 글로 다듬어 작성하는 일들은 쉽지 않다고 생각됩니다. 그래서 꾸준히 블로그를 작성하려고 노력한지 어느덧 9년이라는 시간이 흘렀습니다. 하지만 아직 부족함이 많고 특히 학문적인 내용에 대한 글들을 다른 사람들이 볼 때 쉽게 이해할 수 있도록 잘 정리를 한다는 것은 정말 어려운 일인거 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그때 글또라는 커뮤니티(?)을 알게 되어 글또 4기부터 지금가지 참여를 하게 되었습니다. 4기때는 그래도 나름 열심히 활동을 했지만 5기때는 활동을 거의 하지 못해서 아쉬움이 많이 남았습니다. 그래서 이번 6기때는 더 나은 글과 더 나은 패드백을 드리기 위해 좀 더 많은 시간을 투자하고 싶어 참여를 신청하게 되었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 얻고 싶은 것.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 글을 작성할 때 전달하고자 하는 내용을 확실하게 전달할 수 있도록 글을 작성하는 능력을 기르고 싶습니다. 블로그 글을 정말 잘 쓰시는 분의 글을 읽어보면, &quot;이건 어떤 내용을 전달하고자 하는 글인지 알겠다!&quot; 라고 바로 생각이 드는데 제가 생각했을때 제가 작성한 글은 아직 많이 부족하다고 판단이 되어... 전달하고자 하는내용을 잘 전달할 수 있는 글을 작성하고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째, 주로 논문 리뷰에 대한 글을 많이 작성할 계획인데, 이번 글또 확동을 통해서 많은 논문들을 읽고 잘 정리하고 싶습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 글쓰기 계획&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;논문 리뷰와 동시에 코드 리뷰 진행.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에 대한 핵심 내용들 위주로 잘 정리해서 글을 작성하고 추가적으로 핵심 내용에 대한 코드도 같이 리뷰를 해보고 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;선형대수 정리.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 연구를 진행하다 보면 수학이 정말 중요하다는 것을 다들 느끼고 계실 것 입니다. 제가 부족한 부분중 하나가 수학이라 다시 기초부터 공부해서 정리 후 글을 작성할 계획입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 부탁 드립니다!!&lt;/p&gt;</description>
      <category>개발자</category>
      <category>글또</category>
      <category>글또6기</category>
      <category>인공지능</category>
      <category>커뮤니티</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/521</guid>
      <comments>https://sensibilityit.tistory.com/521#entry521comment</comments>
      <pubDate>Sun, 1 Aug 2021 22:33:38 +0900</pubDate>
    </item>
    <item>
      <title>글또 5기 회고록</title>
      <link>https://sensibilityit.tistory.com/520</link>
      <description>&lt;h2&gt;글또 5기를 시작했을 때 나의 다짐&lt;/h2&gt;
&lt;p&gt;글또 4기때 나름(?) 열심히 해서 좋은 글들을 읽고 쓰기도 많이 썻었습니다. 그래서! 이번 5기때는 4기때보다 더 열심히 해야겠다!! 보증금을 전액 다 받아야겠다!!!  라는 목표와 다짐으로 5기 참여를 하게 되었었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번 글또 5기때 다짐을 다시 한번 정리를 해보면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보증금 전액 환불 받기&lt;/li&gt;
&lt;li&gt;많은 논문을 읽고 이해하기 쉽도록 리뷰글 작성하기.&lt;/li&gt;
&lt;li&gt;티스토리에서 깃허브 블로그로 이전하기.&lt;/li&gt;
&lt;li&gt;글을 작성할 때 논리적으로 작성하기.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;글또 4기때는 나름 글도 많이 쓰고 피드백도 꾸준히 해드렸지만 글또 5기때는 글도 거의 작성 못하고 활동을 거의 못했던거 같아 아쉬움이 많이 드내요... &lt;/p&gt;
&lt;h2&gt;요즘은 어덯게 살고 있나?&lt;/h2&gt;
&lt;p&gt;글또 5기 활동을 하는 도중 드디어 석사 학위 졸업을 하고 교내에서 진행하는 학회(?)에 상도 받게 되었습니다. 또 좋은 기회로 의료 스타트업에서 제 석사 학위 연구 주제를 살려서 일을 진행하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;회사에서 아주 좋은 경험들을 많이 하고 있는데 제가 회사를 다니며 좋다고 생각된 점들은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git으로 코드 버전 관리와 협업하기&lt;/li&gt;
&lt;li&gt;Docker container 환경으로 개발하기&lt;/li&gt;
&lt;li&gt;내가 공부하고 연구한 내용에 있어서 궁금한 점이 있으면 좋은 피드백을 받을 수 있다는 점.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;앞으로느 어떻게 살것인가?&lt;/h2&gt;
&lt;p&gt;글또 5기가 종료되는 오늘을 기준으로 저는&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;  티스토리에서 github blog로 이전해서 많은 글을 작성해가며 정리하는 삶을 살 것 입니다.!!&lt;/p&gt;
&lt;p&gt;티스토리 스킨도 마음에 안들고.. 마음에 드는 스킨은 다 github blog에 있고, 뭔가 티스토리에 블로그 글 쓰는 맛을 잃어버려서 글을 안쓰게 된거 같습니다. (핑계핑계..) 그래서! 이제 github blog로 이전에서 기록하며 정리하는 삶을 살 것 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;  첫 사회생활을 지금 회사에서 하고 있으니 자기 개발을 더 열심히 해야겠습니다.&lt;/p&gt;
&lt;p&gt;글또에 참여하신 분들은 대부분 직장인으로 알고 있습니다. 정말 일 다니면서 블로그에 글을 작성하는게 쉬운 일이 아니라는것을 이번 활동을 통해서 느끼게 되었습니다. 조만간 환급받을 보증금을 저에게 주는 채찍으로 생각하고 자기 개발에 투자를 많이 해야겠다는 자극을 받았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;글또 6기에 지원한건데...받아주시겠죠?&lt;/span&gt; &lt;/p&gt;</description>
      <category>글또</category>
      <category>회고록</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/520</guid>
      <comments>https://sensibilityit.tistory.com/520#entry520comment</comments>
      <pubDate>Sun, 2 May 2021 23:33:05 +0900</pubDate>
    </item>
    <item>
      <title>[MemAE]Memorizing Normality to Detect Anomaly: Memory-augmented Deep Autoencoder for Unsupervised Anomaly Detection -1</title>
      <link>https://sensibilityit.tistory.com/519</link>
      <description>&lt;h1&gt;1. Abstract&lt;/h1&gt;
&lt;p&gt;정상 데이터를 이용하여 Autoencoder(AE)을 학습하면 정상보단 비정상 데이터에 대해 더 높은 재구성 오류(reconstruction error)을 얻게 됩니다. 하지만 &lt;code&gt;AE는 일반화(Generalization)가 잘 이루어진다는 특징&lt;/code&gt;이 있어서 비정상 데이터가 입력되어도 정상을 재구성 해야하지만 결함이 있는 부분까지 포함하여 재구성 하는 경우가 발생하게 됩니다.&lt;/p&gt;
&lt;p&gt;이런 AE기반 이상 탐지(Anomaly Detection)의 한계점을 개선하기 위한 해결책으로 &lt;code&gt;메모리 모듈(memory module)을 사용하여 AE을 augmented 하는 방법&lt;/code&gt;인 MemAE을 이 논문에서는 제안하고 있습니다.&lt;/p&gt;
&lt;p&gt;방법은&lt;/p&gt;
&lt;p&gt;(1) 입력 $\mathbf{x}$가 주어지면 MemAE는 먼저 Encoder을 통해 인코딩된 $\mathbf{z}$을 얻습니다.&lt;/p&gt;
&lt;p&gt;(2) 그 다음 입력된 이미지 중 메모리 모듈에서 정상 패턴인 부분에 해당하는 항목을 검색한 후&lt;/p&gt;
&lt;p&gt;(3) 이를 query로 사용하여 $\mathbf{\hat{z}}$을 얻고&lt;/p&gt;
&lt;p&gt;(4) 이를 Decoder을 통해 재구성 하는 방법입니다&lt;/p&gt;
&lt;p&gt;학습 단계에서는 정상 데이터에 대한 메모리 내용(memory content)을 메모리 모듈에 기록하도록 학습이 진행됩니다.&lt;/p&gt;
&lt;p&gt;테스트 단계에서는 학습된 메모리의 weight는 더이상 업데이트 되지 않도록 고정되고 테스트할 query가 주어지면 정상 데이터에 대한 memory record을 기반으로 재구성이 이루어집니다.&lt;/p&gt;
&lt;h1&gt;2. Introduction&lt;/h1&gt;
&lt;h2&gt;2-1. AutoEncoder을 이용한 Anomaly Detection의 한계점&lt;/h2&gt;
&lt;p&gt;이상 탐지(anomaly detection)에서 AE는 &lt;code&gt;정상 데이터의 reconstruction loss가 최소화 되도록 학습하며 테스트 과정 때 입력된 정상 데이터는 reconstruction loss가 낮고 비정상 데이터는 reconstruction loss가 커진다&lt;/code&gt; 라는 개념을 가정합니다.&lt;/p&gt;
&lt;p&gt;하지만 이런 가정은 모든 상황에서 무조건 유효하지 않을 수 있습니다. 왜냐하면 AE는 general하게 학습되는 경우가 일반적이며 입력된 데이터를 그대로 복원하려는 성질을 갖고 있어서 비정상 데이터가 입력 되면 그대로 결함이 있는 상태로 재구성 하려는 성질을 갖고 있습니다.&lt;/p&gt;
&lt;p&gt;그래서 소개하고 있는 MemAE 논문에서는 결함이 포함된 상태로 재구성 하는 문제점을 해결하기 위해 &lt;code&gt;정상 데이터를 인코딩할 때 정상 데이터에 대한 메모리를 얻은 후 이를 기반으로 해서 정상 데이터를 생성하는 메모리 모듈(Memory Module)을 추가한 MemAE(Memory-augmen ted Deep Autoencoder)을 제안&lt;/code&gt;하고 있습니다.&lt;/p&gt;
&lt;h2&gt;2-2. Memory Module&lt;/h2&gt;
&lt;p&gt;인코딩된 vector $\mathbf{z}$을 Decoder에 직접 전달하지 않고 (그림 1)와 같이 Memory module에서 입력 데이터를 기반으로 가장 관련성이 높은 메모리 항목을 검색한 후 $\mathbf{\hat{z}}$을 query로 사용하여 Decoder에 전달 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0b81K/btqV2Wn764g/3LVOyzFZ3d5Ae99zy5JJrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0b81K/btqV2Wn764g/3LVOyzFZ3d5Ae99zy5JJrk/img.png&quot; data-alt=&quot;그림 1.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0b81K/btqV2Wn764g/3LVOyzFZ3d5Ae99zy5JJrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0b81K%2FbtqV2Wn764g%2F3LVOyzFZ3d5Ae99zy5JJrk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 1.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;3. Memory-augmented Autoencoder&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNk4GM/btqV37iGzDU/PzAq5yKxJu0DyBKpLcJLk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNk4GM/btqV37iGzDU/PzAq5yKxJu0DyBKpLcJLk1/img.png&quot; data-alt=&quot;그림 2. MemAE의 전체 흐름도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNk4GM/btqV37iGzDU/PzAq5yKxJu0DyBKpLcJLk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNk4GM%2FbtqV37iGzDU%2FPzAq5yKxJu0DyBKpLcJLk1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 2. MemAE의 전체 흐름도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;3-1. Memory module with Attention-based Sparse Addressing&lt;/h2&gt;
&lt;p&gt;이 논문에서 제안한 Memory Module의 구성 요소를 정리 해보자면 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soft addressing vectors $\mathbf{w}$: 입력된 데이터의 패턴을 Memory Address에 기록하는 vectors&lt;/li&gt;
&lt;li&gt;attention-based addressing operator: 데이터의 패턴이 기록된 Memory Address에 접근하기 위한 연산자&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3-1-1. Memory-baed Representation&lt;/h3&gt;
&lt;p&gt;입력 데이터를 기반으로 인코딩된 query $ \mathbb{Z} \in \mathbb{R}^C $가 주어지면 &lt;code&gt;입력 데이터의 패턴을 Memory Address에 기록하기 위해 soft addressing vectors&lt;/code&gt; $ \mathbf{w} \in \mathbb{R}^{1 \times N}$을 얻습니다.&lt;/p&gt;
&lt;p&gt;그 다음 Memory $\mathbf {M} $에 접근한 후 $\hat{\mathbf{z}}$을 얻게 됩니다. 이 과정을 식으로 표현하면 다음 수식과 같이 표현 됩니다.&lt;/p&gt;
&lt;p&gt;$$ \hat{\mathbb{z}} = \mathbb{w}\mathbf{M} = \sum_{i=1}^N {w_i,m_i,} $$&lt;/p&gt;
&lt;p&gt;이 논문에서는 단순 인코딩된 vector $\mathbf{z}$을 바로 디코더에 넣는게 아니라 위와 같은 과정을 거친 후 얻어진&lt;/p&gt;
&lt;p&gt;$\mathbf{\hat{z}}$을을 디코더에 입력하여 정상 패턴만 갖고 있는 데이터를 재구성 해야 하는게 최종 목표입니다. 그러면 세부적으로 어떤 과정을 거쳐가며 위와 같은 과정이 이루어지는지 살펴보도록 하겠습니다.&lt;/p&gt;
&lt;h3&gt;3-1-2. Attention for Memory Addressing&lt;/h3&gt;
&lt;p&gt;메모리 모듈 $\mathbf{M}$은 학습 데이터의 정상 패턴(normal pattern)을 기록하도록 이루어져 있습니다. 정상 패턴을 기록하는 방법은 위에서 soft addressing vectors $\mathbf{w}$로 한다고 설명 드렸습니다. 이 과정을 좀 더 세분화시켜 정리를 하면 다음과 같이 정리를 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;(1) 데이터를 인코더에 입력으로 주어 인코딩된 vector $\mathbf{z}$을 얻습니다.&lt;/p&gt;
&lt;p&gt;(2)$\mathbf{z}$을 memory addressing 체계를 사용하여 정상 패턴을 기록합니다.&lt;/p&gt;
&lt;p&gt;(3)그 기록된 공간을 content addressable memory로 정의합니다.&lt;/p&gt;
&lt;p&gt;(4)softmax 연산을 통해 데이터 패턴을 기록하는 weight $w_i$을 계산합니다.&lt;/p&gt;
&lt;p&gt;이 과정을 수식으로 나타내면 다은과 같이 정의됩니다.&lt;/p&gt;
&lt;p&gt;$$ w_i = \frac{\exp{(d(\mathbf{z}, \mathbf{m_i}))}}{\sum_{j=1}^N {\exp (d(\mathbf{z}, \mathbf{m_j}))} }$$&lt;/p&gt;
&lt;p&gt;정상 패턴을 기록하는 weight $w_i$을 얻는 수식에서 $d(.,.)$형태로 된 수식은 &lt;code&gt;similarity measurement&lt;/code&gt;을 나타내며 이 논문에서는 &lt;code&gt;cosin similarty&lt;/code&gt;로 정의했으며 수식은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;$$d(\mathbf{z}, \mathbf{m_i}) = \frac{\mathbf{z} \mathbf{m_i^T}}{\parallel \mathbf{z} \parallel \parallel \mathbf{m_i} \parallel}$$&lt;/p&gt;
&lt;p&gt;정상 패턴을 기록하는 부분은 (그림 3)에 표시된 부분입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyeNOx/btqWdalAFbY/HmPtICmKXVBd05COtcxlHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyeNOx/btqWdalAFbY/HmPtICmKXVBd05COtcxlHK/img.png&quot; data-alt=&quot;그림 3. 정상 패턴을 기록하는 방법에 대한 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyeNOx/btqWdalAFbY/HmPtICmKXVBd05COtcxlHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeyeNOx%2FbtqWdalAFbY%2FHmPtICmKXVBd05COtcxlHK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 3. 정상 패턴을 기록하는 방법에 대한 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 과정을 거치므로써 메모리 모듈 $\mathbf{M}$은 $\mathbf{z}$와 가장 유사한 메모리 항목을 검색하여 $\mathbf{\hat{z}}$을 얻게 됩니다.&lt;/p&gt;
&lt;h3&gt;3-1-3. 적은 수의 memory items 정상 데이터를 재구성 하다.&lt;/h3&gt;
&lt;p&gt;3-1-2절에서 소개한 방법 중 정상 패턴을 memory addressing 체계를 사용하여 기록하는 과정은 메모리 크기가 무한대로 큰 공간에 기록하는게 아니라 제한적인 메모리 크기를 갖도록 미리 제한을 걸어둡니다.&lt;/p&gt;
&lt;p&gt;이렇게 메모리 크기를 제한해둔 상태면 그만큼 정상 패턴에 대한 items도 많이 부족해서 정상 데이터로 재구성할 수 없게 된다는 생각이 들 수 있습니다. 하지만 이 논문에서 소개하고 있는 &lt;code&gt;sparse addressing technique&lt;/code&gt;을 사용해서 적은 수의 정상 패턴이 기록된 addressing memory items만으로도 효과적으로 Decoder을 통해 정상 데이터를 재구성할 수 있게 됩니다.&lt;/p&gt;
&lt;h3&gt;3-1-4. attention-based addressing의 한계점&lt;/h3&gt;
&lt;p&gt;attention-based addressing 방법을 사용하면 정상인 부분을 효과적으로 잘 재구성 하게 됩니다. 하지만 &lt;code&gt;세부적이고 미세한 결함인 부분들도 함께 재구성될 수 있게 됩니다.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;그래서 이를 해결하기 위해 &lt;code&gt;hard shrinkage operation&lt;/code&gt;을 사용하여 $\mathbf{w}$의 sparsity을 높입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chMPvh/btqWjpbFFwb/DypIz0GRt0ekqsNUR3nFOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chMPvh/btqWjpbFFwb/DypIz0GRt0ekqsNUR3nFOk/img.png&quot; data-alt=&quot;그림 4. 미세한 결함 부분을 제거하기 위한 Hard Shrinkage 작업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chMPvh/btqWjpbFFwb/DypIz0GRt0ekqsNUR3nFOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchMPvh%2FbtqWjpbFFwb%2FDypIz0GRt0ekqsNUR3nFOk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 4. 미세한 결함 부분을 제거하기 위한 Hard Shrinkage 작업&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;3-2. Hard Shrinkage for Sparse Addressing&lt;/h2&gt;
&lt;p&gt;Hard Shrinkage operation을 사용하는 이유는 (그림 3)와 같이 attention-based addressing 까지만 이용한 상태의 weight $\mathbf{w}$을 이용해서 재구성을 하면 미세한 결함 부분들을 포함한 상태로 재구성이 된다는 한계점이 있었습니다.&lt;/p&gt;
&lt;p&gt;그래서 이를 해결하고자 &lt;code&gt;hard shrinkage operation을 적용하여&lt;/code&gt; $\mathbf{w}$의 &lt;code&gt;sparsity을 높여서 한계점을 극복&lt;/code&gt;할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 과정은 (그림 4)와 같으며 shrinkage operation의 수식은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;$$ \hat{w}_i = h(w_i ; \lambda) = \begin{cases} {w_i}, &amp;amp; \mathbf{if} \ w_i &amp;gt; \lambda , \\ 0, &amp;amp; \mathbf{otherwise}, \end{cases}$$&lt;/p&gt;
&lt;p&gt;위 수식에서 $w_i$는 attention-based addressing과정 이후 $\hat{w}$을 지정하는 메모리의 i번째 항목을 나타내며 $\lambda$는 shrinkage threshold value을 나타내는 Hyper parameter입니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;실제로 코드를 구현할 때 threshold $\lambda$는 1/N ~ 3/N 간격으로 설정하면 최적의 결과를 얻을 수 있다고 논문에 나와있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;또한 식에서 discontinuous function의 backward을 구하는 것은 쉽지 않으므로 이 논문에서는 단순화를 위해 &lt;code&gt;$w$의 모든 항목이 음수가 아니라는 점을 고려&lt;/code&gt;해서 &lt;code&gt;continuous ReLU activation function&lt;/code&gt;을 사용하여 &lt;code&gt;Hard shrinkage을 재정의 하게 되었습니다.&lt;/code&gt; 그 수식은 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;$$ \hat{w}_i = \frac{max(w_i - \lambda, 0) \cdot w_i} {|w_i - \lambda | + \epsilon} $$&lt;/p&gt;
&lt;p&gt;위 수식에서 $ max( . , 0) $는 ReLU activation function 이므로 그 값은 매우 작은 scalar 입니다.&lt;/p&gt;
&lt;p&gt;shrinkage후 $\hat{\mathbf{w}}$을 $\hat{w_i} = \hat{w_i} / \parallel \hat{\mathbf{w}}\parallel_1 $로 re-normalize 합니다. 그러면 latent representation $\hat{\mathbf{z}} = \hat{\mathbf{w}}\mathbf{M}$을 얻게 됩니다.&lt;/p&gt;
&lt;h2&gt;4. 학습 방법&lt;/h2&gt;
&lt;h2&gt;4-1. Reconstruction Loss&lt;/h2&gt;
&lt;p&gt;$$ R(\mathbf{x}^t, \mathbf{\hat{x}}^t) = \parallel \mathbf{x}^t - \mathbf{\hat{x}}^t \parallel _{2} ^2 , $$&lt;/p&gt;
&lt;h2&gt;4-2. Entropy Loss&lt;/h2&gt;
&lt;p&gt;shrinkage operation 외에 학습 중 $\mathbf{\hat{w}}$에 대한 sparsity regulartizer을 최소화 합니다.&lt;br&gt;$$ E(\mathbf{\hat{w}}^t) = \sum_{i=1}^T {-w_i \cdot log(\hat{w}_i).}$$&lt;/p&gt;
&lt;h2&gt;4-3. Total Loss&lt;/h2&gt;
&lt;p&gt;$$ L(\theta_e, \theta_d, \mathbf{M}) = \frac{1}{T} \sum_{t=1}^T (R(\mathbf{x}^t, \mathbf{\hat{x}}^t) + \alpha E(\mathbf{\hat{w}}^t)), $$&lt;/p&gt;
&lt;p&gt;논문에서 실험해본 결과 $\alpha = 0.0002$가 가장 좋은 결과를 얻는다고 합니다. 또한 학습중 Memory module $\mathbf{M}$은 backpropagation &amp;amp; Gradient Descent을 통한 최적화가 진행 되었습니다.&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>anomaly detection</category>
      <category>autoencoder</category>
      <category>Memory Module</category>
      <category>paper review</category>
      <category>pytorch</category>
      <category>논문</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <category>오토인코더</category>
      <category>이상 탐지</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/519</guid>
      <comments>https://sensibilityit.tistory.com/519#entry519comment</comments>
      <pubDate>Sun, 7 Feb 2021 22:32:55 +0900</pubDate>
    </item>
    <item>
      <title>GAN을 이용한 효율적인 Anomaly Detection 방법 [f-AnoGAN vs MemAE]</title>
      <link>https://sensibilityit.tistory.com/518</link>
      <description>&lt;p&gt;Unsupervised Learning 방법으로 GAN을 이용한 Anomaly Detection 방법 중 Encoder 부분을 이용한 f-AnoGAN 방법이 있습니다. 이 방법은 효율적으로 Anomaly Detection을 잘 하지만 미세한 결함을 제대로 검출하기 힘들다는 한계점이 있습니다. 본 글에서는 f-AnoGAN의 특징들과 단점에 대해 간략히 소개를 하고 그 해결책에 대한 내용을 간략하게 정리해보기 위한 글 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;비교를 할 논문은 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sciencedirect.com/science/article/pii/S1361841518302640&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;f-AnoGAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1904.02639&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MemAE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;f-AnoGAN&lt;/h3&gt;
&lt;p&gt;참고 링크&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://blog.promedius.ai/f-anogan-fast-unsupervised-anomaly-detection-with-gan/&quot;&gt;blog.promedius.ai/f-anogan-fast-unsupervised-anomaly-detection-with-gan/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Github tutorial&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mulkong/f-AnoGAN_with_Pytorch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/mulkong/f-AnoGAN_with_Pytorch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;f-AnoGAN의 학습 방법은 GAN 학습, Encoder 학습으로 총 2가지 step으로 이루어집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I34ej/btqS1V0EXSR/mPI9k58uarqKUO5WtHqWFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I34ej/btqS1V0EXSR/mPI9k58uarqKUO5WtHqWFk/img.png&quot; data-alt=&quot;f-AnoGAN을 이용한 Anomaly Detection 방법 Framework&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I34ej/btqS1V0EXSR/mPI9k58uarqKUO5WtHqWFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI34ej%2FbtqS1V0EXSR%2FmPI9k58uarqKUO5WtHqWFk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;f-AnoGAN을 이용한 Anomaly Detection 방법 Framework&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GAN 학습&lt;/h4&gt;
&lt;p&gt;정상 데이터로만 GAN 학습을 진행합니다. GAN이 잘 학습이 되었다면 정상 데이터에 대한 학습 분포를 기반으로 학습이 이루어져 정상 이미지만을 생성할 가능성이 높아집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Encoder 학습&lt;/h4&gt;
&lt;p&gt;GAN이 잘 학습 된 상태라면 이제 입력된 query data에 대해 Latent space mapping을 위한 Encoder 모델 학습을 진행합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이와 같은 방식으로 진행한 이유는 query data(정상/비정상) 중 정상 데이터가 입력되면&amp;nbsp; Encoder을 통해서 정상 query data에 대해 latent space mapping된 Z값을 이용하여 Generator에 Z가 입력되게 됩니다. 그러면 Generator는 query data에 대한 정상 데이터를 생성하게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반면 비정상 query data가 입력으로 주어지면 Encoder는 query data에 대한 Feature을 추출해서 Z값으로 만든 후 비정상 query data의 Feature을 Generator에 입력으로 주어지면 query data을 기반으로 한 이미지가 생성됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;GAN은 정상 이미지로만 학습이 진행되어 정상 이미지만을 생성하려고 할 것 입니다. 따라서 비정상 query data의 모양, 질감, 형태와 동일하지만 정상 상태로 이미지를 생성하게 되어 이상 탐지(anomaly detecTion)을 수행합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;일반적으로 AutoEncoder을 이용한 Anomaly Detection을 진행하다보면 AutoEncoder의 특성상 일반화(Generalization)을 너무 잘 해서 정상만 생성하도록 해야하는데 비정상까지 재구성하게 되어 미세한 결함을 제대로 찾기 힘들다는 단점이 존재합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;해결책&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;memory module을 사용하여 AutoEncoder을 augment(보강)하는 MemAE(memory-augmented autoencoder) 방법을 사용.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MemAE&lt;/h3&gt;
&lt;p&gt;MemAE의 핵심 내용은 AutoEncoder가 너무 general하게 학습 되는 경우가 발생하여 정상 뿐만 아니라 간혹 비정상의 결함 부분 까지 포함하여 생성하게 된다는 단점이 존재하니 이를 해결하기 위해 정상 데이터을 Encoding할 때 정상 데이터에 대한 memory을 얻은 후 이를 기반으로 해서 정상 데이터를 생성하는 방법입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqIaSP/btqTfDKCZjB/4GKJzj5fyvyiXPK96hyYCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqIaSP/btqTfDKCZjB/4GKJzj5fyvyiXPK96hyYCk/img.png&quot; data-alt=&quot;제안된 MemAE을 통한 Anomaly Detection 방법.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqIaSP/btqTfDKCZjB/4GKJzj5fyvyiXPK96hyYCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqIaSP%2FbtqTfDKCZjB%2F4GKJzj5fyvyiXPK96hyYCk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;제안된 MemAE을 통한 Anomaly Detection 방법.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;학습 단계에서 memory는 정상 데이터에 가장 관련성이 높은 메모리 항목을 검색하며 데이터를 생성(재구성)하게 됩니다. 테스트 과정시 정상 데이터에 가장 관련성이 높은 메모리를 고정시킨 후 query data가 입력으로 주어지면 query data을 기반으로 한 정상 데이터를 메모리 기록으로 부터 검색을한 후 이를 기반으로 생성(재구성)이 이루어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 포스팅할 글은 MemAE 논문에 대해 정리한 글을 작성하도록 하겠습니다.&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>AnoGAN</category>
      <category>anomaly detection</category>
      <category>autoencoder</category>
      <category>F-AnoGAN</category>
      <category>MemAE</category>
      <category>논문</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>이상탐지</category>
      <category>파이토치</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/518</guid>
      <comments>https://sensibilityit.tistory.com/518#entry518comment</comments>
      <pubDate>Sun, 10 Jan 2021 22:53:37 +0900</pubDate>
    </item>
    <item>
      <title>[Anomaly Detection] Improved anomaly detection by training an autoencoder with skip connections on images corrupted with Stain-shaped noise</title>
      <link>https://sensibilityit.tistory.com/517</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Abstract&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[산업 현장에서 AE를 활용한 Anomaly Detection]&lt;/p&gt;
&lt;p&gt;Industrial vision에서 Anomaly Detection problems은 결함이 있거나 없는 arbitrary image를 clean image에서 mapping하도록 훈련된 AutoEncoder를 사용하여 해결할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[skip-connections이 있는 AutoEncoder(AES)를 사용한 이유]&lt;/p&gt;
&lt;p&gt;이 접근 방식에서 Anomaly Detection과정은 개념적으로 본다면 reconstruction residual 또는 reconstruction uncertainty에 의존합니다. 공통적으로 sharpness of the reconstruction를 높이기 위해 skip-connections이 있는 AutoEncoder를 고려하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[AES + Stain noise model 제안]&lt;/p&gt;
&lt;p&gt;Reconstruction 과정 중 clean image가 나오게끔 하기 위해서 train image의 Clean image만 학습으로 진행하는 전략은, reconstruction을 담당하는 Network가 입력하는 대로 출력을 해버리는 identity mapping으로 수렴 되는것을 방지하기 위해 Noise model로 train image를 손상시키고 출력으로 Clean image가 나오도록 하는 목적으로 Stain noise model을 추가 할 것을 제안합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[우리가 사용한 모델 짱짱  &amp;rarr; AES+Stain model]&lt;/p&gt;
&lt;p&gt;이 모델을 실제 결함 모양에 관계없이 임의의 실제 이미지에서 깨끗한 이미지를 재구성 하는 데 유리하다는 것을 보여줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[우리가 가라로 안했다는것을 증명하기 위해 이런 데이터셋으로 진행했다]&lt;/p&gt;
&lt;p&gt;우리의 접근 방식의 관련성을 입증하는 것 외에도 우리의 검증은 pixel-wise및 image-wise anomaly detection을 위해 MVTec AD dataset에 대한 성능을 비교하여 reconstruction-based 방법에 대한 일관된 평가를 제공합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Methods&lt;/h2&gt;
&lt;p&gt;[Anomaly Detection의 개요]&lt;/p&gt;
&lt;p&gt;Anomaly detection은 Clean(Normal) data의 Distribution에 속하지 않는 다른 데이터들을 식별하는 작업으로 정의할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Supervised Learning으로 하는 Anomaly Detection의 문제점]&lt;/p&gt;
&lt;p&gt;Clean(Normal) data에 비해 Defective(Abnormal) data를 수집하는 것은 한계가 있고 만들다 하더라도 Data Imbalance가 발생합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czAHq1/btqJbxAK0C6/n3bsuBiulelyGgfblMb7b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czAHq1/btqJbxAK0C6/n3bsuBiulelyGgfblMb7b1/img.png&quot; data-alt=&quot;(그림 1) Unsupervised Learning 방법으로 Anomaly Detection 하는 전체 Architecture framework&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czAHq1/btqJbxAK0C6/n3bsuBiulelyGgfblMb7b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczAHq1%2FbtqJbxAK0C6%2Fn3bsuBiulelyGgfblMb7b1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 1) Unsupervised Learning 방법으로 Anomaly Detection 하는 전체 Architecture framework&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;본 논문은 Unsupervised Learning으로 Anomaly Detection을 해결하는 논문입니다. 다만 이전에 정리했었던&amp;nbsp;&lt;a href=&quot;https://sensibilityit.tistory.com/506?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AnoGAN&lt;/a&gt;, &lt;a href=&quot;https://sensibilityit.tistory.com/513?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;F-AnoGAN&lt;/a&gt;와의 차이점은 Query image가 입력으로 들어오면 그것을 구조는 동일하지만 Normal image로 image generation해주는 방법으로 GAN을 사용했습니다. 그러나 이 논문은 GAN이 &lt;span style=&quot;color: #009a87;&quot;&gt;mode collapse&lt;/span&gt;의 문제점을 지적하고 image generation 해주는 대신 image reconstruction 해주는 AutoEncoder 구조를 사용했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; 제 생각이지만 해당 저자는 F-&amp;nbsp; AnoGAN과 AnoGAN의 방법만 인용했지, GAN 모델을 수정한 노력은 없어 보였습니다. 그래서 High resolution을 잘 생성해주는 GAN 모델들을 이용하면 mode collapse 문제는 많이 없어질텐데...좀 아쉽네요&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Training Step&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;[Blue box]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아무튼 그림(1)의 모델의 구조를 뜯어보고 해석 해보도록 하겠습니다. 일단 Blue box를 보시면 GAN 같은 경우 Normal image를 generation 해주는 용도로 사용이 되지만, 여기서는 &lt;span style=&quot;color: #009a87;&quot;&gt;Skip-connections를 사용한 AutoEncoder(AES) 모델을 사용해서 입력 이미지로 query image가 들어오면 그것을 어떤 이미지가 들어오든 Normal image로 reconstruction 해주는 방법&lt;/span&gt;입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Stain Model을 사용한 이유는 AutoEncoder는 입력 이미지가 들어오면 그것을 그대로 복원해주는 성질이 있습니다. 근데 Denoising AutoEncoder를 생각해보면 noise가 있는 입력 이미지가 들어오면 그것을 선명한 이미지로 reconstruction해주는 성질이 있어서 일반 AutoEncoder를 사용할때 보다 더 선명하게 reconstruction 해주는 경향이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마찬가지로 해당 논문에서는 얼룩 무늬를 추가해주는 Stain noise model을 이용해서 입력 이미지를 결함이 있는 이미지로 만들어줘서 다시 깨끗한 이미지로 복원될 수 있도록 하는 역할을 가지고 있습니다. 즉, Identity mapping이 안되도록 방지해주기 위해 Stain noise model을 사용하는 것 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;좀 더 자세히 모델을 뜯어보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nuFn4/btqI9pC2eMo/VItQEuAv1whNIFY5BIkxx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nuFn4/btqI9pC2eMo/VItQEuAv1whNIFY5BIkxx0/img.png&quot; data-alt=&quot;(그림 2) Autoencoder Skip-connection Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nuFn4/btqI9pC2eMo/VItQEuAv1whNIFY5BIkxx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnuFn4%2FbtqI9pC2eMo%2FVItQEuAv1whNIFY5BIkxx0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 2) Autoencoder Skip-connection Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 논문에서 사용한 데이터 크기는 256x256인 오직 Clean(Normal) Image로 학습되었습니다. 여기서&lt;span style=&quot;color: #009a87;&quot;&gt; bottleneck 구조를 갖는 Skip-connection 을 사용함으로 써 model에 projection한 임의의 이미지로부터 좀 더 선명한 이미지가 reconstruction&lt;/span&gt; 된다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AESc 모델 구조를 보면 U-Net과 모양이 비슷하다는 생각이 자연스럽게 들게 됩니다. 그래서 한번 U-Net과 AESc를 비교 해보았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. AESc vs U-Net&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK6Gd7/btqI5ygGojh/CoI4Ay28RhmpXPFmyrJAzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK6Gd7/btqI5ygGojh/CoI4Ay28RhmpXPFmyrJAzk/img.png&quot; data-alt=&quot;(그림 3) AutoEncoder Skip-connection vs U-Net&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK6Gd7/btqI5ygGojh/CoI4Ay28RhmpXPFmyrJAzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK6Gd7%2FbtqI5ygGojh%2FCoI4Ay28RhmpXPFmyrJAzk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 3) AutoEncoder Skip-connection vs U-Net&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 개념은 &lt;a href=&quot;https://sensibilityit.tistory.com/515?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pix2Pix 논문 리뷰&lt;/a&gt; 글에서 언급을 했었던 내용입니다. 다시 한번 정리를 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AutoEncoder&lt;/h4&gt;
&lt;p&gt;AutoEncoder는 입력 이미지에서 핵심 Feature들만 뽑는 구조이며 Bottleneck을 갖고 있습니다. Bottleneck 구조를 갖는 모델은 Image-to-Image translation tasks에서 많이 사용되는 구조이며 결과 이미지의 형태들이 급진적으로 변화하는 특징을 갖고있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp; Bottleneck 구조를 갖는 AutoEncoder 구조의 장단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점: Bottleneck 구조는 갖고 있어서 핵심 Feature를 추출해낼 수 있으며 Domain이 다른 이미지로 변형을 하고 싶을 때 적합하다.&lt;/li&gt;
&lt;li&gt;단점: 생성(복원)된 이미지의 Detail이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp; Bottleneck 구조를 갖는 AutoEncoder를 사용한 이유&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;추가적으로 Bottleneck 구조를 갖는 AutoEncoder를 사용한 이유는 Anomaly Detection tasks에서 defective structures를 image distribution에서 제외하는 것은 반복적으로 발생하는 문제라고 합니다. 그래서 Bottleneck 구조를 갖는 AE로 Feature map을 압축하는 과정은 Normal Image를 Manifold에 놓여지도록 reconstruction을 일반화 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;U-Net&lt;/h4&gt;
&lt;p&gt;U-Net 구조의 특징은 &quot;Skip-connection이 잇다보니 입력된 영상에 대한 detail들이 마지막 layer 까지 잘 전달 된다는 특징&quot;이 있습니다. 그래서 아무래도 AutoEncoder의 결과와 비교해보면 output image quality가 더 좋습니다. 그렇지만 단점도 존재합니다. &quot;Skip-connection은 depth가 거의 없다보니 depth가 어느정도 있는 다른 네트워크 구조에 비해 생성된 결과가 별로&quot;라는 점 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;nbsp; U-Net 구조의 특징과 장단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징: paired된 dataset이 어느정도 비슷한 컨텐츠들이 있는 경우 skip-connection을 많이 사용하는 경향을 보이고 있다.&lt;/li&gt;
&lt;li&gt;장점: 처음 detail들이 마지막 layer까지 잘 전달 된다.&lt;/li&gt;
&lt;li&gt;단점: skip-connection을 사용해서 depth가 거의 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bottleneck 구조를 갖는 AutoEncoder에 Skip-connection을 사용한 이유&lt;/h4&gt;
&lt;p&gt;(그림 2)와 같이 Skip-connections을 사용하면 처음 detail들이 마지막 layer까지 전달되다 보니 reconstruction image가 보다 더 선명해 진다고 합니다. 근데! &lt;span style=&quot;color: #009a87;&quot;&gt;U-Net에서 Skip-connection을 사용할때는 Decoder 구조에 feature map을 Concatenation&lt;/span&gt;해서 사용했지만 해당 논문에선 &lt;span style=&quot;color: #009a87;&quot;&gt;encoder에서 decoder로 feature map을 Addition&lt;/span&gt; 시켜주었다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;red box에서 다시 설명을 하겠지만, Skip-connection이 없는 그냥 AE를 사용해서 얻은 reconstruction image를 query image랑 MSE로 loss를 구하면 reconstruction image가 나중에는 결국 blurry한 image로 reconstruction됩니다. 또한 reconstruction loss가 커지게 되어서 엽력 이미지랑 모양이 똑같은 이미지로 복원이 잘 안이루어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GAN 말고 AESc를 사용한 이유&lt;/h4&gt;
&lt;p&gt;위에서도 언급한 내용으로 본 논문에서는 Clean(Normal) image를 복원 시키는 과정에서 GAN의 mode collapse 문제점을 지적하며 GAN 말고 Skip-connection을 사용한 AutoEncoder(AECs) 구조를 사용했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anomaly Detection은 Unsupervised Learning으로 접근하고 있으며 그중에 대표적인 방법 중 GAN을 사용 안하는 이유는 딱 3가지 입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mode collapse로 인해 학습 하기가 어렵다.&lt;/li&gt;
&lt;li&gt;generative distribution에서 결합 샘플을 제외 못함 -&amp;gt; 이 문제는 AE에서 Bottleneck 구조로 해결.&lt;/li&gt;
&lt;li&gt;inference 과정시 query image의 distribution과 latent space에 속하는 가장 유하산 출력 이미지를 생성해야 하는 latent space 속의 latent vector를 찾기 위해서 추가적인 최적화 단계가 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;비교를 위해 AnoGAN과 여기서 제안한 방법을 비교해보았는데 당연히(?) 이 논문에서 제안한 방법이 더 잘 나왔다 라는 결과가 나와서 GAN 사용 안하고 AES + Stain Model을 사용한 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;  개인적으로 여기서 의문이 드는 점은 AnoGAN의 GAN Architecture는 DCGAN으로 이루어져 있습니다. DCGAN은 mode collapse를 방지할 수 없어서 개선된 모델들이 더 많이 나왔습니다. 근데 굳이 64x64 이미지로 학습을 진행한 AnoGAN과 비교를&amp;nbsp; 하다니.... 의문점이 많다는 생각이 들었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;591&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwTv0/btqJikt3g8I/tcHp7T8lIQh721yxyVKah1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwTv0/btqJikt3g8I/tcHp7T8lIQh721yxyVKah1/img.png&quot; data-alt=&quot;(그림 4) AE와 AESc 모델 각각 Stain noise model를 추가한 것과 추가하기 전 reconstruction image 결과 비교.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwTv0/btqJikt3g8I/tcHp7T8lIQh721yxyVKah1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwTv0%2FbtqJikt3g8I%2FtcHp7T8lIQh721yxyVKah1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;591&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 4) AE와 AESc 모델 각각 Stain noise model를 추가한 것과 추가하기 전 reconstruction image 결과 비교.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;(그림 4)를 보면 AutoEncoder와 Skip-connections를 사용한 AutoEncoder 모델 각각 Identity mapping을 방지하기 위해 넣어준 Stain noise model과 아무것도 안넣어준 경우의 reconstruction image의 결과를 비교한 그림입니다.&amp;nbsp; &lt;span style=&quot;color: #009a87;&quot;&gt;None의 경우 Identity mapping이 이루어져서 입력 이미지 그대로 출력되어 제대로 결측인 부분들은 감지하지 못합니다. 그러나 Stain noise model을 추가한 결과를 보면 Identity mapping을 방지해서 결함이 있는 이미지가 들어오더라도 구조는 동일하게 가지만 정상인 이미지로 reconstruction&lt;/span&gt;하는 것을 볼 수 있습니다. 다만 &lt;span style=&quot;color: #009a87;&quot;&gt;skip connections을 사용하지 않아서 AE기반인 모델들은 이미지가 blurry&lt;/span&gt;하게 나오는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AESc를 보면&amp;nbsp; AE와는 다르게 image가 선명하게 복원되는 것을 볼 수 있으며&amp;nbsp; Stain model을 사용한 결과가 Identity mapping이 안이루어진 모습을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Train 과정에서 있는 중요 내용들을 다시 한번 요약해보도록 하겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GAN의 mode collapse 문제로 AutoEncoder 구조를 사용해서 Normal Image를 reconstruction 하도록 진행.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;AE는 Bottleneck 구조를 갖는다. 따라서 Feature map을 압축하는 과정이 Normal Image Manifold에 놓여지도록 reconstruction을 일반화 시킬 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;AutoEncoder만 사용하면 Identity mapping이 발생되므로 Stain noise model을 사용했다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;AutoEncoder에 Skip-connections을 추가하므로 써 reconstruction image가 blurry하게 복원 되는 것을 방지했으며 U-Net과의 차이점은 concatenation 말고 Addition 시켜주었다는 점이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Test Step&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;[Red box]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;red box에 있는 내용은 test data를 이용해서 inference하는 과정입니다. 여기서 눈여겨 볼 점은 inference할 때 두가지의 전략(&lt;span style=&quot;color: #009a87;&quot;&gt;Residual-based detection과 Uncertainity-based detection&lt;/span&gt;)으로 진행 했습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-1. Residual-based Detection&lt;/h3&gt;
&lt;p&gt;Test과정 중 Query image랑 Query image를 기반으로 Clean(Normal) image로 reconstruction된 image와 차이를 계산하는 것 입니다. 이때 사용되는 loss는 L2Norm(MSE)이고, Image-wise 관점과 Pixel-wise 관점에서 이루어 집니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&amp;bull; residual(잔차)&lt;br /&gt;&amp;rarr;&amp;nbsp; 모집단에서 추출한 표본둘의 평균(표본평균)과 개별 표본갑 간의 '편차'를 말하지만 주로 '추정오차 (Estimation Error)'와 거의 같음 의미를 지닌다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;bull; 추정 오차 (Estimation Error)&lt;br /&gt;&amp;rarr;&amp;nbsp; 표본 집단에 기초해 산출된 기대값(추정값)과 확률 시행 결과의 관측값 과의 차이.&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Residual-baded detection의 단점과 MCDropout 사용 이유&lt;/h4&gt;
&lt;p&gt;Anomaly Detection 하고싶은 부분 말고&lt;span style=&quot;color: #009a87;&quot;&gt; 나머지 뒷 배경과의 대조가 명확하지 않은 경우&lt;/span&gt;. Normal Image로 Reconstruction을 해도 reconstruction loss가 충분하게 높지 않게 됩니다. 따라서 &lt;span style=&quot;color: #009a87;&quot;&gt;MCDropout을 사용해서 prediction uncertainity을 정량화 하여 anomaly detection에 사용&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4-2. Uncertainty-based Detection&lt;/h3&gt;
&lt;p&gt;Uncertainity-based detection 방법은 Bayesian Estimation에서 나온 개념입니다. &lt;span style=&quot;color: #009a87;&quot;&gt;Uncertainty(불확실성)는 확률 변수의 분산 크기이며 확률 변수가 얼마나 random한지 측정하는 sclar 값&lt;/span&gt; 입니다. 그래서 해당 값은 Bayesian Model을 이용한 Estimation에서 확인할 수 있는데 Bayesian Model의 parameter 수가 많아서 model이 많이 무겁다고 합니다. 그래서 이와 비슷한 효과를 주는 방법에서 &lt;span style=&quot;color: #009a87;&quot;&gt;Uncertainity를 정량화 하는 방법으로 MCDropout(Monte Carlo Dropout)을 사용해서 Uncertainity를 정량화&lt;/span&gt; 한다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그래서&lt;span style=&quot;color: #009a87;&quot;&gt; MCDropout으로 추정한 30개의 output image 사이의 variance(분산)으로 추정할 때 훈련중에 볼 수 없는 structures, 즉, 이상징후가 더 높은 불확실성(uncertainties)과 상관성을 갖는 직관에 의존하는 방법&lt;/span&gt;입니다. 그래서 해당 논문에서는 AutoEncoder의 layer가 깊어질수록 dropout level 을 증가하면서 &lt;span style=&quot;color: #333333;&quot;&gt;[0, 0, 10, 20, 30, 40] &lt;/span&gt;적용한 결과 더 정확한 검출이 얻어지는 것을 밝혀냈다고 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(그림 5)는 reconstruction residual가 대부분 uncertainty와 상관관계가 있음을 보여주는 그림 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;671&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crqpWD/btqI8ePHTNy/Jlfs3kBikQnpoQzKb5DcsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crqpWD/btqI8ePHTNy/Jlfs3kBikQnpoQzKb5DcsK/img.png&quot; data-alt=&quot;(그림 5) MCDropout의 중요성을 알려주는 그림.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crqpWD/btqI8ePHTNy/Jlfs3kBikQnpoQzKb5DcsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrqpWD%2FbtqI8ePHTNy%2FJlfs3kBikQnpoQzKb5DcsK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;671&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 5) MCDropout의 중요성을 알려주는 그림.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(그림 5)를 보면 첫번째, 두번째 행은 Stain noise model을 사용하지 않고 AE and AECs networks를 학습한 경우이고 세번째, 네번째 행은 Stain noise model을 사용한 경우입니다. 두가지 경우 공통적으로 test 할 때 MCDropout을 사용 안한 상태로 Residual-based detection과 Uncertainty-based detection한 결과를 나타내고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터셋 상황에 따른 Detection 방법 선택&lt;/h4&gt;
&lt;p&gt;Residual-based Detection은 Reconstruction error threshold를 넘어가면 결함으로 간주하는 원리입니다. AECs가 Normal 한 이미지를 reconstruction을 하도록 학습하는 과정은 결함이 있는 구조를 깨끗한 이미지로 대처하도록 하는 것이 목적이지 그 주변 환경과의 대비를 더 명확하게 주라고 학습을 한 것은 아닙니다. 그래서 reconstruction image가 주변 환경과 대조가 잘 되지 않으면 residual intensities가 낮게 나옵니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;반면에 Uncertainity-based Detection은 이미지의 구조와 주변 환경의 대비에 의존하지 않는다는게 가장 큰 특징입니다. 따라서 대비가 늦은 결함 이미지의 경우 Anomaly Detection 기능이 향상됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정리를 한번 해보도록 하겠습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;주변환경과 데이터셋 대비가 명확하다&lt;br /&gt;&amp;rarr;&amp;nbsp; Residual-based Detection 전략이 좋다.&lt;br /&gt;&lt;br /&gt;주변 환경과 데이터셋 대비가 명확하지 않다.&lt;br /&gt;&amp;rarr;&amp;nbsp; Uncertainity-based Detection 전략이 좋다.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;추가적으로 위에서도 언급했다 싶이 Residual-based Detection 전략으로 진행할 경우 AESc + Stain model은 일반적으로 산발적인 반점으로 구성 된 reconstruction residual을 유발하고 낮은 대비를 갖는 데이터셋에 대해 결함을 놓치게 된다. 이런 경우에는 Uncertainity-based 전략이 효과적이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Conclusion&lt;/h2&gt;
&lt;p&gt;Query image에서 Normal image를 reconstruction 하는 것을 기반으로 한 anomaly detection 방법을 진행하기 위해서 본 논문에서는 &lt;span style=&quot;color: #009a87;&quot;&gt;Skip-connection을 사용한 AutoEncoder인 AESc를 기반으로 MCDropout으로 30번 estimated된 reconstruction residual 또는 prediction uncertainity에 의존하여 Anomaly Detection을 진행&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Skip-connections를 Addition 시켜 사용한 AutoEncoder 구조를 사용할 때 장접을 본 논문에서는 입증을 하였으며 &lt;span style=&quot;color: #009a87;&quot;&gt;Identity mapping이 이루어지지 않도록 train image가 Stain Noise model로 corrupted 시켜서 학습을 진행&lt;/span&gt;하였습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 본 논문에서 사용된 새로운 접근 방법은 일반 AutoEncoder보다 상당히 잘 MVTec AD Dataset들의 결함들을 잘 검출 해냈으며 AECs + Stain noise model을 사용하여 AutoEncoder와의 Uncertainity-based Detection 전략을 공정하게 비교해냈습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Reconstruction residual과 달리 Uncertainity Indicator는 결함과 그 주변 사이 환경의 대비와는 무관합니다. 따라서 주변 환경과 대비가 뚜렷하다면 Reconstruction residual 전략으로 가고 대비가 뚜렷한 대비가 없다는 Uncertainity 기반 전략으로 Anomaly Detection을 진행하면 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 Residual-based detection 전략에 비해 Uncertainty-based detection 전략은 Normal한 query image에서 false-positive rate를 증가키시게 되는 단점이 존재합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>anomaly detection</category>
      <category>paper review</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/517</guid>
      <comments>https://sensibilityit.tistory.com/517#entry517comment</comments>
      <pubDate>Mon, 21 Sep 2020 18:20:09 +0900</pubDate>
    </item>
    <item>
      <title>[CycleGAN] Unpaired image-to-image Translation using Cycle-Consistent Adversarial Networks</title>
      <link>https://sensibilityit.tistory.com/516</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Abstract&lt;/h2&gt;
&lt;p&gt;Image-to-image translation is a class of vision and graphics problems where the goal is to learn the mapping between an input image and an output image using a training set of aligned image pairs. However, for many tasks, paired training data will not be available. We present an approach for learning to translate an image from a source domain X to a target domain Y in the absence of paired examples. Our goal is to learn a mapping G : X &amp;rarr; Y such that the distribution of images from G(X) is indistinguishable from the distribution Y using an adversarial loss. Because this mapping is highly under-constrained, we couple it with an inverse mapping F : Y &amp;rarr; X and introduce a cycle consistency loss to enforce F(G(X)) &amp;asymp; X (and vice versa). Qualitative results are presented on several tasks where paired training data does not exist, including collection style transfer, object transfiguration, season transfer, photo enhancement, etc. Quantitative comparisons against several prior methods demonstrate the superiority of our approach.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사전지식&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. GAN&lt;/h3&gt;
&lt;p&gt;Image-to-Image translation tasks 관점에서 보면 흑백 이미지 사진을 컬러 사진으로 변경 해주는 경우 Generator는 이미지를 실제와 비슷하고 선명하게 생성을 해주는 것이 목적 입니다. 즉, &lt;span style=&quot;color: #009a87;&quot;&gt;GAN은 이미지의 detail을 담당&lt;/span&gt;한다고 볼 수 있습니다. Discriminator는 Generator가 이쁘게 만들어낼 수 있도록 선생님 역할을 담당하여 Generator의 training을 도와주는 역할을 하게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 블로그: &lt;a href=&quot;https://sensibilityit.tistory.com/505?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[GAN] Generative Adversarial Network 정리&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. Pix2Pix&lt;/h3&gt;
&lt;p&gt;Pix2Pix는 GAN의 개념에다가 Image difference 개념을 추가한 것 입니다. 자세한 내용을 이전에 정리했던 블로그 글을 참고해주시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;참고 블로그: &lt;a href=&quot;https://sensibilityit.tistory.com/515?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Pix2Pix] Image-to-Image Translation with Conditional Adversarial Network&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. CycleGAN&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. 목표&lt;/h3&gt;
&lt;p&gt; &amp;nbsp; 주어진 dataset이 동일한 구성요소(&lt;span style=&quot;color: #333333;&quot;&gt;composition)는&lt;/span&gt; 아니고 각각 다른 Style인 경우(=Unpaired Image) 그럴듯한 Image translation을 해보는 것.&lt;/p&gt;
&lt;p&gt; &amp;nbsp; Generator가 &lt;span style=&quot;color: #009a87;&quot;&gt;그림 &amp;rarr; 사진&lt;/span&gt; 으로 변경할 때 다시 &lt;span style=&quot;color: #009a87;&quot;&gt;사진 &amp;rarr; 그림&lt;/span&gt; 으로 복구가 가능한 정도로 바꾸는 것.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;578&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eySUon/btqGqaPniXV/VekKpmtkf6MmLROa0PJ3X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eySUon/btqGqaPniXV/VekKpmtkf6MmLROa0PJ3X0/img.png&quot; data-alt=&quot;(그림 1) Pix2Pix와 CycleGAN 큰 차이점을 비교하는 그림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eySUon/btqGqaPniXV/VekKpmtkf6MmLROa0PJ3X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeySUon%2FbtqGqaPniXV%2FVekKpmtkf6MmLROa0PJ3X0%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;578&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 1) Pix2Pix와 CycleGAN 큰 차이점을 비교하는 그림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;CycleGAN과 Pix2Pix의 차이점은 생성된 이미지를 다시 원래 이미지로 복구 가능한지 아닌지 입니다. CycleGAN을 공부하다가 든 생각인데, 단순하게 생각을 해보면 Pix2Pix model을 두개 만들어서 A &amp;larr;&amp;rarr; B 가 가능하도록 해도 될것을 Cycle이라는 개념을 추가하여 CycleGAN이라는 모델을 제안한 것은 그 당시 기발한 아이디어라고 생각이 들었습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이 부분에서 저와 같은 생각이 드신 분들도 많으실거라고 생각을 합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;두 모델(Pix2Pix &amp;amp; CycleGAN)의 목표는 Image-to-Image translation입니다. 그렇다면 Pix2Pix에서 사용한 GAN Loss를 CycleGAN에 적용해보면 어떻게 학습이 이루어지는지 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &amp;nbsp; Pix2Pix GAN Loss를 CycleGAN에 적용하면 어떻게 될까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;  Generator이 생성해낸 G(z)가 Discriminator를 속이면(&lt;span style=&quot;color: #9d9d9d;&quot;&gt;실제 training data와 비슷하게만 보이면 됨&lt;/span&gt;) 일반적인 GAN의 역할을 하는 것 이니 적용은 가능합니다. 그러나 다른 &lt;span style=&quot;color: #ee2323;&quot;&gt;부작용&lt;/span&gt;이 발생합니다.&lt;/p&gt;
&lt;p&gt;❗️ [&lt;span style=&quot;color: #ee2323;&quot;&gt;부작용&lt;/span&gt;] 입력으로 사람 이미지가 주어졌다고 생각 해보면, Pix2Pix에서 사용한 GAN Loss를 이용해서 학습한 CycleGAN은 입력 데이터로 무엇이 들어왔든 무시하고 &lt;span style=&quot;color: #009a87;&quot;&gt;오직 D를 속이기 위해 가이드 없이 학습을 진행하다 보니 전혀 다른 이미지를 생성해낼 위험이 존재&lt;/span&gt;합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; GAN Loss를 사용하면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력 이미지의 Style을 무시하며 학습 할 위험성이 존재합니다.&lt;/li&gt;
&lt;li&gt;어떤 input data가 들어와도 똑같은 output만 내놓습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p&gt;이러한 문제로 인해서 CycleGAN에서 Generator은 Discriminator를 속이는 것 뿐만 &lt;span style=&quot;color: #009a87;&quot;&gt;그림 &amp;rarr; 사진&lt;/span&gt;으로 바꿀 때 다시 &lt;span style=&quot;color: #009a87;&quot;&gt;사진 &amp;rarr; 그림&lt;/span&gt;으로 복구 가능한 정도로 학습은 하는 기능을 담당하는 &lt;span style=&quot;color: #009a87;&quot;&gt;'Cycle Consistency Loss'&lt;/span&gt;를 추가해서 학습을 하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Cycle Consistency Loss는 아래 Loss 파트에서 다루도록 하겠습니다.&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;749&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NbO0M/btqGxN1De20/bGvkwB2zZDYtLDfDrkEB61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NbO0M/btqGxN1De20/bGvkwB2zZDYtLDfDrkEB61/img.png&quot; data-alt=&quot;(그림 2) CGAN Loss + L1 Loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NbO0M/btqGxN1De20/bGvkwB2zZDYtLDfDrkEB61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNbO0M%2FbtqGxN1De20%2FbGvkwB2zZDYtLDfDrkEB61%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;749&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 2) CGAN Loss + L1 Loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pix2Pix와 CycleGAN의 차이점에 대해 간략하게 한번 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;⭐️&amp;nbsp; Pix2Pix vs CycleGAN&lt;/p&gt;
&lt;p&gt; &amp;nbsp; Pix2Pix: G만 학습 시킨다. (Loss는 G에 대한 Loss 1개)&lt;/p&gt;
&lt;p&gt; &amp;nbsp; CycleGAN: G랑 F를 동시에 학습 시킨다. (Loss G, F에 대한 Loss 2개)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;제 생각이지만... 일반적으로 생각을 해보면 &lt;span style=&quot;color: #009a87;&quot;&gt;generation image와 input image가 자유롭게 Cycle이 가능하다는 것은 Latent Space가 잘 mapping 된 것이 아닐까?&lt;/span&gt; 라는 생각이 들게됩니다. 따라서 mapping이 안되어 있는 흔히 noise라고 불리는 Latent Space 말고 &lt;span style=&quot;color: #009a87;&quot;&gt;AutoEncoder에 Encoder 부분을 이용하여 Latent Space를 입력 이미지와 Mapping한 후 어느정도 중요한 Feature들을 갖고 있는 Latent Space를 이용하여 GAN 학습을 이어서 하는 방법으로 하면 되지 않을까??&lt;/span&gt; 라는 생각이 들 수 있습니다. (&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;저는 실제로 읽다가 이런 생각이 들었습니다.&lt;/span&gt;&lt;/i&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;실제로 이러한 방법들은 DiscoGAN(2017), F-AnoGAN(2019) 등 많은 논문에서 적용이 되었습니다. 자세한 내용을 아래에서 다루도록 하겠습니다.&lt;/i&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. AE + GAN 구조&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;AutoEncoder에서 얻은 latent space를 학습으로 이용하는 GAN 구조부터 한번 알아보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqOhv3/btqGxPj2e9s/7Xvj7H6KrqUuYRX3vKlkAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqOhv3/btqGxPj2e9s/7Xvj7H6KrqUuYRX3vKlkAK/img.png&quot; data-alt=&quot;(그림 3) AE + GAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqOhv3/btqGxPj2e9s/7Xvj7H6KrqUuYRX3vKlkAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqOhv3%2FbtqGxPj2e9s%2F7Xvj7H6KrqUuYRX3vKlkAK%2Fimg.png&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 3) AE + GAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해당 구조를 하면 입력 이미지에 대한 중요한 Feature들을 담고 있는 latent space가 존재하고 그 latent space에서 다시 원래 사진으로 돌아가는 구조입니다. (&lt;span style=&quot;color: #9d9d9d;&quot;&gt;쉽게 생각해서 Generator가 Decoder라고 생각을 하면 좋을거 같습니다.&lt;/span&gt;) 이때 &lt;span style=&quot;color: #009a87;&quot;&gt;latent space를 우리가 눈으로 확인할 수 없다&lt;/span&gt;는 것이 큰 특징 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. CycleGAN 구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R3hJz/btqGzYAQFkK/M8hHKPzchfEMKv25xweqe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R3hJz/btqGzYAQFkK/M8hHKPzchfEMKv25xweqe1/img.png&quot; data-alt=&quot;(그림 4). CycleGAN&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R3hJz/btqGzYAQFkK/M8hHKPzchfEMKv25xweqe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR3hJz%2FbtqGzYAQFkK%2FM8hHKPzchfEMKv25xweqe1%2Fimg.png&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 4). CycleGAN&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 CycleGAN을 보면 input image가 들어가고 중간에 bottleneck 구조를 띈 latent space가 아니라 실제로&lt;span style=&quot;color: #009a87;&quot;&gt; 우리가 시각적으로 볼 수 있는 사진으로 되어있는 latent space가 target image로 존재한다고 생각&lt;/span&gt;을 하면 좋을거 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. DiscoGAN vs CycleGAN&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;483&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dukgg/btqGvZHzfss/36KxR7vZUYxZsn8Y0zWK2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dukgg/btqGvZHzfss/36KxR7vZUYxZsn8Y0zWK2k/img.png&quot; data-alt=&quot;(그림 5). DiscoGAN (https://arxiv.org/abs/1703.05192)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dukgg/btqGvZHzfss/36KxR7vZUYxZsn8Y0zWK2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDukgg%2FbtqGvZHzfss%2F36KxR7vZUYxZsn8Y0zWK2k%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;483&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 5). DiscoGAN (https://arxiv.org/abs/1703.05192)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DiscoGAN은 CycleGAN과 2017년도에 나온 동일한 시기에 비슷한 아이디어로 나온 논문 입니다. DiscoGAN(Learning to Discover Cross-Domain Relations with Generative Adversarial Networks)의 전제 논문 제목을 보시면 &quot;Cross-Domain&quot;라고 나와있습니다. 제목에도 나와있다 싶이 (그림 5) 처럼 Domain이 전혀 다른 이미지로 변형(ex, 가방 &amp;rarr; 신발, 자동차 &amp;rarr; 사람 얼굴)을 해주는 논문입니다. DiscoGAN의 Generator는 Bottleneck 구조를 갖는 Encoder-Decoder 구조입니다. Encoder-Decoder 구조의 특징은 input image의 중요한 feature들만 추출합니다. 이런 &lt;span style=&quot;color: #009a87;&quot;&gt;bottleneck 구조를 갖는 model은 Image-to-Image translation에서 형태가 급진적으로 변형되는 현상이 발생&lt;/span&gt;되게 됩니다. 마침 DiscoGAN의 목표는 Domain을 변형시키는 것(=형태가 급진적으로 변형)이 목표니까 bottleneck을 갖는 Encoder-Decoder 구조가 적합합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그에 비해 &lt;span style=&quot;color: #009a87;&quot;&gt;CycleGAN은 Domain을 바꾸는 것이 아니라 형태는 그대로 유지하되 그 Style을 변경하는 것이 목표&lt;/span&gt;입니다. 그래서 Bottleneck을 갖는 Encoder-Decoder 구조는 맞지 않습니다. (&lt;a href=&quot;https://sensibilityit.tistory.com/515?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PixPix 정리글 3-1 참고&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CycleGAN 논문에서는 Encoder-Decoder 구조는 맞지 않으니 skip-connection을 갖는 U-Net Archutecture를 이용해서 CycleGAN의 Generator에 적용을 해보았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Architecture&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-1. Generator&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;U-Net Architecture&lt;/h4&gt;
&lt;p&gt; &amp;nbsp; Skip-connection 사용&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징 : paired dataset이 어느 정도 비슷한 컨텐츠들이 있는 경우 skip-connection을 많이 사용하는 경향을 보이고 있다.&lt;/li&gt;
&lt;li&gt;장점 : 입력 데이터에 대한 detail들이 마지막 layer까지 잘 전달 된다.&lt;/li&gt;
&lt;li&gt;단점 : skip-connection을 사용해서 detph가 거의 없다. 따라서 생성된 결과가 별로다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ResNet Architecture (9 layers)&lt;/h4&gt;
&lt;p&gt; &amp;nbsp; Residual Block을 사용해 보다 더 효율적으로 Deep하게 쌓을 수 있게 된 네트워크&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징 : Depth도 있고 bottleneck도 없어서 detail도 간직하고 생성 결과 퀄리티도 좋은 편이다.&lt;/li&gt;
&lt;li&gt;단점 : bottleneck이 없어서 많은 메모리를 요구하고 그로 인해 learn of parameter 개수가 적어지게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &amp;nbsp; Encoder-Decoder vs U-Net 구조의 특징 및 장단점은 &lt;a href=&quot;https://sensibilityit.tistory.com/515?category=731657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pix2Pix 리뷰 글&lt;/a&gt;에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5-2. Discriminator&lt;/h3&gt;
&lt;p&gt;&lt;b&gt; &amp;nbsp; PatchGAN을 사용 (참고 blog&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://brstar96.github.io/mldlstudy/what-is-patchgan-D/&quot;&gt;Link&lt;/a&gt;)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;408&quot; height=&quot;NaN&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxsTy/btqGJvF1kgc/d5lmikW02pETkP81xv7MMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxsTy/btqGJvF1kgc/d5lmikW02pETkP81xv7MMK/img.png&quot; data-alt=&quot;(그림 6) PatchGAN의 Discriminator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxsTy/btqGJvF1kgc/d5lmikW02pETkP81xv7MMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxsTy%2FbtqGJvF1kgc%2Fd5lmikW02pETkP81xv7MMK%2Fimg.png&quot; width=&quot;408&quot; height=&quot;NaN&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 6) PatchGAN의 Discriminator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DCGAN의 Discriminator&lt;/h4&gt;
&lt;p&gt;이미지 전체를 보고 진짜인지 가짜인지 판별 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PatchGAN의 Discriminator&lt;/h4&gt;
&lt;p&gt;이미지 전체에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Receptive_field&quot;&gt;Receptive field&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;크기 만큼 특정 Patch(receptive field) 부분을 보고 그 부분이 진짜인지 가짜인지 판별 합니다..&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Loss&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-1. GAN이 Training 하기 어려운 이유&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Adversarial Loss&lt;/h4&gt;
&lt;p&gt;&amp;rarr;&amp;nbsp; For the mapping function G : X &lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr; Y and its discriminator Dy&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;697&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F5q8C/btqGvZ1Oljc/RHqkdYCyV8uIWrEAatSXQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F5q8C/btqGvZ1Oljc/RHqkdYCyV8uIWrEAatSXQk/img.png&quot; data-alt=&quot;(그림 7) Adversarial Loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F5q8C/btqGvZ1Oljc/RHqkdYCyV8uIWrEAatSXQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF5q8C%2FbtqGvZ1Oljc%2FRHqkdYCyV8uIWrEAatSXQk%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;697&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 7) Adversarial Loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Gradient가 Flatten해지는 현상은 X가 Positive일 때 Flatten해져 loss가 0에 가까워집니다. 그로 인해 &lt;span style=&quot;color: #009a87;&quot;&gt;Vanishing gradients&lt;/span&gt; 현상이 발생되게 됩니다. 그래서 Adversarial loss만 사용하는 일반적인 GAN은 Training하기 어려워집니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결 방법&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;746&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kE6NE/btqGAxCOc5E/hPKOr6CKalZP65YdkDpek0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kE6NE/btqGAxCOc5E/hPKOr6CKalZP65YdkDpek0/img.png&quot; data-alt=&quot;(그림 8) Vanishing gradients를 해결하기 위한 LSGAN Loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kE6NE/btqGAxCOc5E/hPKOr6CKalZP65YdkDpek0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkE6NE%2FbtqGAxCOc5E%2FhPKOr6CKalZP65YdkDpek0%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;746&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 8) Vanishing gradients를 해결하기 위한 LSGAN Loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Discriminator의 역할은 진짜를 진짜라고, 가짜를 가짜라고 잘 맞추는 것 입니다. 그래서 진짜일 경우 1에 가까운 값을 내야하고 가짜일 경우 0에 가까운 값을 내야합니다. LSGAN Loss를 사용하면 Vanishing gradients 문제가 없기 때문에 training이 Adversarial Loss를 사용할 때 보다 훨씬 안정적으로 학습이 진행이 되고 생성된 이미지 퀄리티도 훨씬 좋게 됩니다. 또한 GAN 학습 과정 중 불안정하게 학습되는 대표적인 예시인 Mode Collapsing가 발생한다던지 생성된 이미지에 노이즈가 끼면서 생성이 된다던지 하는 현상이 없습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Mode collapsing&lt;/h4&gt;
&lt;p&gt;mode collapsing은 training data의 확률 분포를 모두 커버하지 못한 경우 다양성을 잃어버리게 됩니다. 그러면 GAN 학습시 loss만 줄이는 목표를 갖고 학습을 하다보니 Generator가 전체 데이터 분포를 커버하지 못하고 특정 부분의 데이터 분포만 커버하며 학습을 하게 될 수 있습니다. (ex, MNIST에서 4만 계속 생성하는 경우가 발생)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결방안&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Feature matching: Fake image와 Real image 사이에 Least Square loss function을 사용한다 (LSGAN의 loss)&lt;/li&gt;
&lt;li&gt;mini-batch Discriminator: mini-batch별로 fake image와 real image 사이의 확률분포 거리의 차이를 loss function에 추가해준다.&lt;/li&gt;
&lt;li&gt;Historical averaging: batch 단위로 parameter를 update하면 이전 학습은 잘 잊혀지게 되므로 이전 학습 내용을 기억하는 방식으로 학습을 진행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;참고자료: &lt;a href=&quot;https://towardsdatascience.com/gan-ways-to-improve-gan-performance-acf37f9f59b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GAN - Ways to improve GAN performance&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-2. L1 Loss&lt;/h3&gt;
&lt;p&gt;&amp;nbsp; L1 loss는 Ground truth Y와 generation image G(z)의 차이 값에 사용되는 중요한 loss function입니다. 왜냐하면 흔히 minmax game이라고 하는 GAN loss만 이용하면 G와 D가 경쟁을 하며 학습을 하다보니 training이 잘 안되는 경우가 많습니다. 이때 L1 loss를 GAN loss와 함께 사용을 한다면 &lt;span style=&quot;color: #009a87;&quot;&gt;L1 loss가 GAN이 학습을 할 때 Guide 역할을 해주므로써 길잡이 역할&lt;/span&gt;을 해주게 됩니다. 이때 &lt;span style=&quot;color: #009a87;&quot;&gt;detail한 부분들(이미지를 생성한다거나 선명하게 한다는 부분들)은 GAN loss가 담당&lt;/span&gt;을 하게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pix2Pix에서는 입력 데이터가 어떻게 변경하면 될지 정답이 있는 Paired Image-to-Image translations 입니다. 그래서 L1 loss를 사용해서 흑백 &amp;rarr; 컬러로 변경 했을 때 진짜 정답인 target image랑 동일해야 한는 정답이 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 CycleGAN은 정답이 없는 Unpaired Image-to-Image translations 입니다. 그래서 관련이 없는 이미지를 막 넣어도 된다는 말 입니다. 대표적인 예시로 말 사진을 넣으면 어떤 결과값을 내놓는지는 잘 모르겠지만 반대 방향인 얼룩말 &amp;rarr; 말 로 변경을 해주는 네트워크를 훈련시켜서 얼룩말을 말처럼 만들었을 때 다시 말이 얼룩말로 돌아가야 하는지 정답이 있는 상황으로 학습을 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-3. Identity Loss&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; height=&quot;NaN&quot; width=&quot;664&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejTXN5/btqGRQoQqRv/jskzkbkMe8JJyDf82oXkGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejTXN5/btqGRQoQqRv/jskzkbkMe8JJyDf82oXkGk/img.png&quot; data-alt=&quot;(그림 9) 이미지의 Quality를 향상 시키기 위한 Identity loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejTXN5/btqGRQoQqRv/jskzkbkMe8JJyDf82oXkGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejTXN5%2FbtqGRQoQqRv%2FjskzkbkMe8JJyDf82oXkGk%2Fimg.png&quot; height=&quot;NaN&quot; width=&quot;664&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 9) 이미지의 Quality를 향상 시키기 위한 Identity loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;사실 Identity Loss는 써도 그만 안써도 그만 입니다. 다만 좀 더 detail하고 결과물의 quality가 중요하다고 하면 쓰는게 좋습니다. 예를 들자면 모네 그림같은 경우 그 특정 화가의 화풍을 캐치해야하고 명화니깐 이미지 퀄리티도 좋아야 하니 이러한 경우 Identity Loss를 사용합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 간단히 Identity Loss의 장단점에 대해 정리를 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; Identity Loss의 장단점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점 : 생성 결과물의 quality를 중요시 하고 detail한 결과물을 얻고 싶을때 사용하면 좋음.&lt;/li&gt;
&lt;li&gt;단점 : Parameter 수가 많아져서 연상량이 많아지게 되므로 학습 속도가 느려지게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-4. Cycle Consistency Loss&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBo1ve/btqGJvTyl3Q/nxLaOkwUkHvVF2FFyLUxrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBo1ve/btqGJvTyl3Q/nxLaOkwUkHvVF2FFyLUxrK/img.png&quot; data-alt=&quot;(그림 10) Cycle이 이루어질 수 있도록 하는 Cycle Consistency Loss&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBo1ve/btqGJvTyl3Q/nxLaOkwUkHvVF2FFyLUxrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBo1ve%2FbtqGJvTyl3Q%2FnxLaOkwUkHvVF2FFyLUxrK%2Fimg.png&quot; data-origin-height=&quot;0&quot; data-origin-width=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 10) Cycle이 이루어질 수 있도록 하는 Cycle Consistency Loss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6-5. Total Loss&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qvrnN/btqGIqSukfH/vLzX1Dn947kb1vl5TDzo61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qvrnN/btqGIqSukfH/vLzX1Dn947kb1vl5TDzo61/img.png&quot; data-alt=&quot;(그림 11) CycleGAN에서 사용하는 total loss function&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qvrnN/btqGIqSukfH/vLzX1Dn947kb1vl5TDzo61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqvrnN%2FbtqGIqSukfH%2FvLzX1Dn947kb1vl5TDzo61%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 11) CycleGAN에서 사용하는 total loss function&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Details&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzVNn/btqGJF3gwiw/oOuUNpXwikwGW69egFEIB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzVNn/btqGJF3gwiw/oOuUNpXwikwGW69egFEIB0/img.png&quot; data-alt=&quot;(그림 12) Seed value 변경에 따른 output 값 차이.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzVNn/btqGJF3gwiw/oOuUNpXwikwGW69egFEIB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvzVNn%2FbtqGJF3gwiw%2FoOuUNpXwikwGW69egFEIB0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;(그림 12) Seed value 변경에 따른 output 값 차이.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Seed값을 A에서 training한 모델을 두고 Seed값을 B라는 값으로 변경 후 처음부터 다시 학습을 시켜보니 분명 Seed A일때의 Discriminator에서 진짜라고 인식하던 결과물이 Seed B일때는 가짜라고 인식을 해버리는 현상이 발생되게 된다. 즉, Seed 값이 바뀔때 마다 학습이 안정적으로 될 때가 있고 불안정하게 될 때가 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7-1. Solution&lt;/h3&gt;
&lt;p&gt;  Solution 1 (비추)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징 : Discriminator가 하나가 여러개 모델을 생성한 후 각각 모델에서 나온 값을 평균 내어서 하나의 Generator에 보여주는 방법.&lt;/li&gt;
&lt;li&gt;장점 : Seed 값이 바껴도 학습이 안정적으로 진행.&lt;/li&gt;
&lt;li&gt;단점 : Discriminator 개수가 많아지다보니 메모리를 많이 소모.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt; &amp;nbsp; Solution 2 (강추)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특징 : &lt;span style=&quot;color: #009a87;&quot;&gt;Reinforcement learning(강화학습)&lt;/span&gt;에서 사용하는 방법 중 &lt;span style=&quot;color: #009a87;&quot;&gt;Replay buffer&lt;/span&gt; 방법을 사용. [&lt;a href=&quot;https://kdst.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 Link&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;rarr; Generator가 만들어준 사진들을 Discriminator에 주기적으로 보여주는 방법입니다. 그러면 과거의 Generator가 지금까지 어떻게 행동했는지 Discriminator가 대응을 해야하기 때문에 훨씬 안정적으로 학습이 이루어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;rarr; Discriminator에 주기적으로 생성된 이미지를 보여줄때는 Generator는 Backpropagation 과정은 이루어지지 않고 Discriminator만 이루어 집니다. 그래서 Discriminator가 가짜를 더 잘 구분할 수 있도록 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점 : 학습이 안정적으로 진행.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⭐️&amp;nbsp; 다르게 생각을 해보면 Generator를 여러개 늘리는 방법이라고도 볼 수 있을거 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; Pix2Pix paper [&lt;a href=&quot;https://arxiv.org/pdf/1611.07004.pdf&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; PatchGAN Discriminator 뽀개기 [&lt;a href=&quot;https://brstar96.github.io/mldlstudy/what-is-patchgan-D/&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; Receptive Field Wikipedia [&lt;a href=&quot;https://en.wikipedia.org/wiki/Receptive_field&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; CycleGAN D2 youtube [&lt;a href=&quot;https://www.youtube.com/watch?v=Fkqf3dS9Cqw&amp;amp;t=2242s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;]&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; CycleGAN paper [&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; &lt;/span&gt;Patch GAN Discriminator Issue [&lt;a href=&quot;https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/issues/39&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; Reinforcement learning Replay buffer [&lt;a href=&quot;https://kdst.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;✔️&amp;nbsp; GAN - Ways to improve GAN performance [&lt;a href=&quot;https://towardsdatascience.com/gan-ways-to-improve-gan-performance-acf37f9f59b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;/a&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/머신러닝&amp;amp;딥러닝</category>
      <category>cyclegan</category>
      <category>Gan</category>
      <category>Image Translation</category>
      <category>Paper</category>
      <category>paper review</category>
      <category>pytorch</category>
      <category>글또 4기</category>
      <category>논문</category>
      <category>논문 리뷰</category>
      <author>Waterbottle</author>
      <guid isPermaLink="true">https://sensibilityit.tistory.com/516</guid>
      <comments>https://sensibilityit.tistory.com/516#entry516comment</comments>
      <pubDate>Tue, 18 Aug 2020 16:10:25 +0900</pubDate>
    </item>
  </channel>
</rss>