<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>산 넘어 산 개발일지</title>
    <link>https://mountain96.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 06:48:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Mountain96</managingEditor>
    <item>
      <title>[논문 리뷰] GPT-1 리뷰</title>
      <link>https://mountain96.tistory.com/42</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 배경&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9jMfX/btrOwmIfkdn/MXQQyyo2q8b9z71qEzWdi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9jMfX/btrOwmIfkdn/MXQQyyo2q8b9z71qEzWdi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9jMfX/btrOwmIfkdn/MXQQyyo2q8b9z71qEzWdi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9jMfX%2FbtrOwmIfkdn%2FMXQQyyo2q8b9z71qEzWdi0%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;1128&quot; height=&quot;626&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;(이미지 출처 : &lt;a href=&quot;https://github.com/pilsung-kang/Text-Analytics/blob/master/08%20Seq2Seq%20Learning%20and%20Pre-trained%20Models/08-4_GPT.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/pilsung-kang/Text-Analytics/blob/master/08%20Seq2Seq%20Learning%20and%20Pre-trained%20Models/08-4_GPT.pdf&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당시 Unlabeled dataset은 6백만개가 넘는 글과 35억개가 넘는 단어들로 넘쳐났지만, Labeled dataset은 너무나 부족한 상황이었다. 따라서 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Unlabeled dataset으로 의미 있는 언어 정보를 학습하는 모델&lt;/span&gt;이 필요했다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Unlabeled dataset으로 언어 정보를 학습한 모델의 장점&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시간 비용이 많이 드는 추가적인 labeling작업을 대체하여 학습에 사용할 수 있음.&lt;/li&gt;
&lt;li&gt;지도학습 하기에 충분한 데이터셋이 있다면, unlabeled dataset에서 학습한 정보들로 성능을 향상시킬 수 있음.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 당시 많은 연구들에서 word embedding과 같은 단어 레벨의 정보를 사용하여 성능 향상을 보였다는 것이 많았다. 그러나 저자들은 이보다 더 높은 레벨의 정보들을 얻고자 하였다. (Phrase-level 혹은 sentence-level embedding)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;unlabeled data로부터 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단어 레벨&lt;/span&gt;&lt;/b&gt;의 정보를 넘어서 더 많은 정보를 얻는 것&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 다음 두&lt;/span&gt; 가지 이유에서 어려운 점이 있다. (단어 레벨&lt;/p&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;target task에 전이학습을 할 때 어떤 방법이 가장 좋은지에 대한 공식적인 합의가 아직 없음.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 당시에도 전이학습에 관한 개념이 있었지만, 대체로 복잡한 방법들을 통해 기존 모델 구조를 뒤바꾸는 형태로 학습이 이루어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 논문 저자들은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;unlabeled dataset에서 학습한 언어 모델&lt;/b&gt;&lt;/span&gt;을 만들고, 이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;언어 모델&lt;/b&gt;&lt;/span&gt;과&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; labeled dataset&lt;/b&gt;&lt;/span&gt;을 사용해 모델 구조의 변환을 최소화하면서 &lt;span style=&quot;color: #ee2323;&quot;&gt;전이학습&lt;/span&gt;을 하고자 하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRUPuH/btrOyMd5UL9/K7fXQoAWltvthdHUFXkEf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRUPuH/btrOyMd5UL9/K7fXQoAWltvthdHUFXkEf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRUPuH/btrOyMd5UL9/K7fXQoAWltvthdHUFXkEf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRUPuH%2FbtrOyMd5UL9%2FK7fXQoAWltvthdHUFXkEf0%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;646&quot; height=&quot;368&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;562&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;1-1. Generative VS Discriminative&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;Discriminative&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs4lTe/btrOw1ci4p0/N6sVZMSW8V29ug4bt6hHsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs4lTe/btrOw1ci4p0/N6sVZMSW8V29ug4bt6hHsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs4lTe/btrOw1ci4p0/N6sVZMSW8V29ug4bt6hHsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs4lTe%2FbtrOw1ci4p0%2FN6sVZMSW8V29ug4bt6hHsK%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;414&quot; height=&quot;329&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 X가 주어졌을 때 Y로 분류될 &lt;b&gt;조건부확률 \(\mathcal{p}(Y|X)\)&lt;/b&gt;을 높이는 방식으로 학습한다. 지도학습에 속하며, 우리가 흔히 아는 분류 문제가 이에 속한다. 조건부확률을 올리기 위해 모델은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Decision Boundary&lt;/b&gt;&lt;/span&gt;를 만들도록 학습이 이루어진다. 학습 데이터의 양이 많다면 충분히 좋은 성능을 내고, generative에 비해 가정이 단순하다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Generative&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brwZNS/btrOzeVO0b0/VU60K0O1TbxfcmW0LMdDT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brwZNS/btrOzeVO0b0/VU60K0O1TbxfcmW0LMdDT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brwZNS/btrOzeVO0b0/VU60K0O1TbxfcmW0LMdDT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrwZNS%2FbtrOzeVO0b0%2FVU60K0O1TbxfcmW0LMdDT0%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;405&quot; height=&quot;299&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 X의 분류를 학습하기보다는&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;b&gt;분포&lt;/b&gt;&lt;/span&gt;를 학습하는 개념이다. \(\mathcal{p}(Y|X)\)를 구하는 것은 동일하지만, 데이터 X가 주어졌을 때 베이즈 법칙을 사용하여 \(\mathcal{p}(Y), \mathcal{p}(X|Y)\)를 이용해 &lt;span style=&quot;color: #000000;&quot;&gt;\(\mathcal{p}(Y|X)\)를 도출한다. label에 대한 정보가 있으면 지도학습, 없으면 비지도학습으로 사용할 수 있다. Generative 모델은 Discriminative 모델에 비해 가정이 많고, 이 많은 가정이 모두 현실에 맞기는 어렵다보니 일반적으로 Discriminative 모델에 비해 성능이 떨어진다. 다만 가정의 수가 많은 만큼 충분히 많은 가정들을 만족한다면 성능이 좋고 outlier에도 크게 영향을 받지 않는 모델이 만들어진다. 또한, Generative는 분포를 학습하므로 이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;분포를 이용해 데이터 X를 샘플링할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 학습 방식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. Transformer Block&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention is All you need에서 나온 Transformer와는 다르게, GPT에서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Transformer의 Decoder&lt;/b&gt;&lt;/span&gt;만 사용했으며 Decoder 구조에도 차이가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YXKCf/btrOwNMaXlt/K2AoPfvIyQeoevlZ7waKo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YXKCf/btrOwNMaXlt/K2AoPfvIyQeoevlZ7waKo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YXKCf/btrOwNMaXlt/K2AoPfvIyQeoevlZ7waKo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYXKCf%2FbtrOwNMaXlt%2FK2AoPfvIyQeoevlZ7waKo1%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;447&quot; height=&quot;412&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 Transformer decoder의 구조에는 Masked Attention과 Encoder에서 정보를 받아서 attention을 수행하는 encoder-decoder attention이 있었지만 이 부분이 사라졌다. 따라서 GPT-1에서 사용하는 Transformer block은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkoWgw/btrOyiRUVLi/pgugMLzscKNUj3kkAjKz21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkoWgw/btrOyiRUVLi/pgugMLzscKNUj3kkAjKz21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkoWgw/btrOyiRUVLi/pgugMLzscKNUj3kkAjKz21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkoWgw%2FbtrOyiRUVLi%2FpgugMLzscKNUj3kkAjKz21%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;957&quot; height=&quot;433&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;433&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;(이미지 출처 : Jay Alammar &lt;a href=&quot;https://jalammar.github.io/illustrated-gpt2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jalammar.github.io/illustrated-gpt2/&lt;/a&gt;)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;GPT-1에서는 위 그림과 같은 디코더 블록을 12개 쌓아서 transformer_block을 만들었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;GPT-1은 목적함수로 우도(likelihood)를 최대화하는 방법으로 모델을 학습한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. Unsupervised pre-training&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pre-training의 목적은 파라미터들의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;좋은 initial 값 찾기&lt;/b&gt;&lt;/span&gt;이다. 또한, 사전학습을 사용한 모델은 사전학습 없이 직접 task에 특화된 모델보다 일반화 성능이 우수한데, 이는 사전학습이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Regulaization&lt;/b&gt;&lt;/span&gt;처럼 작용하기 때문이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ELMO와의 비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ELMO는 GPT 이전에 성공적이었던 언어 모델 중 하나이다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;ELMO&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;GPT-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;구조&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;LSTM&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;Transformer Decoder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;방향&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;양방향(Bi-Directional)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;단방향(Forward) + masking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-1에서는 LSTM이 아닌 Transformer의 디코더를 사용함으로써 긴 범위의 언어 정보를 사용할 수 있게 함으로써 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Long term dependency&lt;/b&gt;&lt;/span&gt;를 해결하였고 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;다양한 Task&lt;/span&gt;&lt;/b&gt;에서도 더욱 좋은 성능을 보여주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[\mathcal{L_1}(\mathcal{U})=\sum_ilog\mathcal{P}(u_i|u_{i-k},\ldots,u_{i-1};\Theta)\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unsupervised pre-training은 위 \(\mathcal{L}_1\)을 최대화하는 방식으로 학습하며, 이때 \(\mathcal{U}\)는 토큰들의 집합 \(\{u_1,\ldots,u_n\}\)을 의미힌다. \(k\)는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;context window&lt;/b&gt;&lt;/span&gt;의 크기를 의미하며, 이를 통해 i번째 토큰을 볼 때 이전 토큰들 중 최대 k개의 토큰만을 본다는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lfyes/btrOw2PQNTi/SveiDm5ddx6D7EXsC2b3U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lfyes/btrOw2PQNTi/SveiDm5ddx6D7EXsC2b3U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lfyes/btrOw2PQNTi/SveiDm5ddx6D7EXsC2b3U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLfyes%2FbtrOw2PQNTi%2FSveiDm5ddx6D7EXsC2b3U0%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;540&quot; height=&quot;125&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\(P(u)\)를 구하는 식은 위와 같다. 먼저 변수들은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\(U=(u_{-k},ldots,u_{-1})\)&lt;/li&gt;
&lt;li&gt;\(W_e\) : Token embedding matrix&lt;/li&gt;
&lt;li&gt;\(W_p\) : Position embedding matrix&lt;/li&gt;
&lt;li&gt;\(n\) : layer 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 U가 입력으로 들어오면 \(W_e\)를 통해 벡터로 임베딩되고 \(W_p\)로 위치정보를 더하여&lt;span style=&quot;color: #ee2323;&quot;&gt; \(h_0\)&lt;/span&gt;을 구한다. 이때 \(W_p\)는 Sinusoid가 아닌 학습된 position embedding이다. 이후 transformer_block을 통과하여(12개의 block) \(h_l\)을 계산하며 최종적으로 \(h_n\)이 계산된다. 토큰 임베딩에 썼던 \(W_e\)의 Transpose를 \(h_n\)에 곱한 뒤(왜 곱하는 걸까요..) softmax를 취해줌으로써 \(P(u)\)를 구할 수 있다.&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;2-3. Supervised fine-tuning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unsupervised pre-training이 끝난 뒤 task에 맞는 지도 학습을 진행하며, 학습 과정에서 기존에 구한 parameter들을 해당 task에 맞게 업데이트하게된다. fine-tuning을 위한 목적함수는 \(L_2\)로 나타내며 이를 최대화하는 방식으로 학습이 진행된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UebrX/btrOyh6z61E/KiLDKwK16KcoMsRAKzOTE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UebrX/btrOyh6z61E/KiLDKwK16KcoMsRAKzOTE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UebrX/btrOyh6z61E/KiLDKwK16KcoMsRAKzOTE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUebrX%2FbtrOyh6z61E%2FKiLDKwK16KcoMsRAKzOTE0%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;404&quot; height=&quot;84&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;84&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;435&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD5Htd/btrOze2EKD7/XeEvBD8IuyrkJxVdsyZfU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD5Htd/btrOze2EKD7/XeEvBD8IuyrkJxVdsyZfU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD5Htd/btrOze2EKD7/XeEvBD8IuyrkJxVdsyZfU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD5Htd%2FbtrOze2EKD7%2FXeEvBD8IuyrkJxVdsyZfU0%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;435&quot; height=&quot;56&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;56&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;\(\mathcal{C}\) : task를 위한 데이터셋. \(\{x^1,\ldots,x^m\}\) 의 토큰들로 이루어진 input들이 포함된다.&lt;/li&gt;
&lt;li&gt;\(h_l^m\) : 사전학습된 모델의 마지막 transformer block을 통과한 출력값&lt;/li&gt;
&lt;li&gt;\(W_y\) : y를 예측하기 위한 선형변환 matrix&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 이전에 학습한 사전학습 모델에 \(\{x^1,\ldots,x^m\}\)을 입력으로 넣는다. 이후 마지막 transformer block에서 나온 출력값 \(h_l\)을 여기서는 사전학습에서의 출력값과 구분을 위해 \(h_l^m\)으로 표시하였다. 이&lt;span style=&quot;color: #ee2323;&quot;&gt; \(h_l^m\)&lt;/span&gt;을 \(W_y\)와 곱하고 softmax를 취하여 \(L_2\)를 구한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 전이학습을 위해 모델에 여러 복잡한 작업을 가했던 과거 연구들과는 달리, GPT에서는 &lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;\(W_y\)&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 와 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;delimiter 토큰&lt;/span&gt;&lt;/b&gt;을 위한 embedding만 학습하면 된다는 장점이 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Auxiliary training objectives(보조학습목적함수)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 데이터셋 &lt;span&gt;\(\mathcal{C}\)&lt;span&gt; 을 사용하여 구한 \(L_2\)와 사전학습에 사용된 모델을 그대로 사용하여 구한 \(L_1\)을 사용하면 일반화 성능이 증가하고 학습이 빨라진다. 이를 저자들은&lt;b&gt; Auxiliary training objective&lt;/b&gt;라고 부르며, 이때 &lt;span style=&quot;color: #000000;&quot;&gt;\(L_1\)을 구할 때에도 &lt;span style=&quot;color: #ee2323;&quot;&gt;똑같은 데이터셋 \(\mathcal{C}\)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwp8M/btrOxn7lvNu/xAq7IWcutuLTGwk90v6dvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwp8M/btrOxn7lvNu/xAq7IWcutuLTGwk90v6dvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwp8M/btrOxn7lvNu/xAq7IWcutuLTGwk90v6dvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwwp8M%2FbtrOxn7lvNu%2FxAq7IWcutuLTGwk90v6dvK%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;309&quot; height=&quot;45&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 supervised fine-tuning시 최적화해야 할&amp;nbsp; 목적함수는 \(L_3\)이다. \(\lambda\)는 \(L_1\)을 얼마나 반영할지에 대한 가중치이다.&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;2-4. Input transformation(traversal-style approach)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT는 연속된 시퀀스 데이터들로 학습되었지만, task마다 input이 구조적인 특징을 지니는 경우도 있다. 가령 QA의 경우 context document와 question, 그리고 answer가 필요하다. 기존 연구들에서는 이런 task를 위해 input을 변형하기보다는 사전학습 모델 위에 여러 복잡한 구조를 쌓았다. 그러나 GPT에서는 input에 토큰들을 추가하고 모델의 출력값에 다양한 연산을 추가하여 이를 해결하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NqOAD/btrOw6xZKeJ/Gwtgs8sllZIJ2ZhfPaMkfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NqOAD/btrOw6xZKeJ/Gwtgs8sllZIJ2ZhfPaMkfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NqOAD/btrOw6xZKeJ/Gwtgs8sllZIJ2ZhfPaMkfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNqOAD%2FbtrOw6xZKeJ%2FGwtgs8sllZIJ2ZhfPaMkfk%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;1057&quot; height=&quot;436&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;공통&lt;/span&gt;&lt;/b&gt;&lt;/h4&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: #ee2323;&quot;&gt;&lt;b&gt; &amp;lt;s&amp;gt;, &amp;lt;e&amp;gt;&lt;/b&gt; &lt;/span&gt;토큰을 추가하여 시퀀스의 시작과 끝을 알린다.&lt;/li&gt;
&lt;li&gt;delimiter token으로&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; $&lt;/b&gt;&lt;/span&gt;을 쓴다. 보통 문장을 구분할 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Textual Entailment(Natural Language Inference)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 문장이 주어졌을 때 두 문장간의 관계를 분류하는 task이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 문장이 다른 문장을 수반하는지(동일한 의미인지)(&lt;span style=&quot;color: #ee2323;&quot;&gt;entailment&lt;/span&gt;), 두 문장이 모순되는지(&lt;span style=&quot;color: #ee2323;&quot;&gt;contradiction&lt;/span&gt;), 아니면 아무 관계도 없는지(&lt;span style=&quot;color: #ee2323;&quot;&gt;neutral&lt;/span&gt;)에 대해 분류한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 문장 중 한 문장을 premise(전제) \(p\), 다른 문장을 &lt;span style=&quot;color: #ee2323;&quot;&gt;hypothesis&lt;/span&gt;(가정) \(h\)라 할 때, 두 문장을 &lt;span style=&quot;color: #ee2323;&quot;&gt;delimiter&lt;/span&gt;를 사이에 두고 concat하여 &lt;span style=&quot;color: #ee2323;&quot;&gt;\([&amp;lt;s&amp;gt;,p_1,\ldots,p_n,$,h_1,\ldots,h_n, &amp;lt;e&amp;gt;]\)&lt;/span&gt; 를 입력으로 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Semantic Similarity&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 문장의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;의미가&amp;nbsp;유사한지&lt;/b&gt;&lt;/span&gt;를 분류하는 작업이다. 예를 들어 &quot;나는 인셉션 영화를 제일 좋아한다&quot; 라는 문장과 &quot;내가 가장 재미있게 본 영화는 인셉션이다&quot; 라는 문장은 유사한 문장이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유사한 문장 간에는 어떤 문장이 먼저 오든지 상관없이 결과값이 일정하므로 문장의&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 순서가 결과에 무관&lt;/b&gt;&lt;/span&gt;하다. 따라서 문장 A, B가 오는 상황과 B, A가 오는 상황 모두에 대해 학습을 진행한다. 이를 위해서 두 개의 input을 준비한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input1 : \([&amp;lt;s&amp;gt;, a_1, \ldots,a_n,$,b_1,\ldots,b_m,&amp;lt;e&amp;gt;]\)&lt;/li&gt;
&lt;li&gt;input2 : \([&amp;lt;s&amp;gt;, b_1, \ldots,b_m,$,a_1,\ldots,a_n,&amp;lt;e&amp;gt;]\)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 transformer를 거친 뒤의 출력을 \(h_1\), \(h_2\)라 한다면 이들을 합하여 linear layer에 넣는다.(즉 위 supervised fine-tuning 식의 \(h_l^mW_y\)에서 \(h_l^m=h_1+h_2\)인 것이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;QA&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;QA에서는 데이터가 &lt;span style=&quot;color: #ee2323;&quot;&gt;context document \(z\)&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;question \(q\)&lt;/span&gt;, 그리고 가능한 &lt;span style=&quot;color: #ee2323;&quot;&gt;answer들의 집합인 \(\{a_k\}\)&lt;/span&gt;으로 이루어져 있다. 이를 input으로 사용하기 위해 \(z\), \(q\), delimiter, \(a_k\)를 &lt;span style=&quot;color: #ee2323;&quot;&gt;concat&lt;/span&gt; 해서 사용하는데, answer의 개수가 n개라면 answer만 바뀌고 나머지는 똑같은 input이 n개가 사용된다.&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;input 1 : \([&amp;lt;s&amp;gt;,z_1,\ldots,z_l,q_1,\dots,q_m,$,a_1,&amp;lt;e&amp;gt;]\)&lt;/li&gt;
&lt;li&gt;input 2 : \([&amp;lt;s&amp;gt;,z_1,\ldots,z_l,q_1,\dots,q_m,$,a_2,&amp;lt;e&amp;gt;]\)&lt;/li&gt;
&lt;li&gt;input n : \([&amp;lt;s&amp;gt;,z_1,\ldots,z_l,q_1,\dots,q_m,$,a_n,&amp;lt;e&amp;gt;]\)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 n개의 input이 각각 독립적으로 transformer에 입력되고 linear layer까지 수행된다. 이후 linear layer에서 출력된 n개의 output에 softmax를 적용하여 확률분포로 만든다.&lt;/p&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;3. 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. layer 개수에 따른 변화&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu1Id8/btrOzrAT75k/btkqjSJnDgt5mgaku6PM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu1Id8/btrOzrAT75k/btkqjSJnDgt5mgaku6PM9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu1Id8/btrOzrAT75k/btkqjSJnDgt5mgaku6PM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu1Id8%2FbtrOzrAT75k%2FbtkqjSJnDgt5mgaku6PM9k%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;416&quot; height=&quot;361&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사전학습 모델에 사용된 layer 개수(transformer block 개수인 듯 하다)에 따라 모델의 성능을 관찰한 결과이다. RACE, MultiNLI 데이터셋에서 모두 layer가 늘어남에 따라 정확도가 높아짐을 확인할 수 있고, 12개의 layer부터는 크게 성능이 좋아지지 않고 수렴했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. fine tuning의 update를 점진적으로 진행했을 때의 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hckfe/btrOzszOYmM/9l324Gu7cvLXFBfFQqmZtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hckfe/btrOzszOYmM/9l324Gu7cvLXFBfFQqmZtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hckfe/btrOzszOYmM/9l324Gu7cvLXFBfFQqmZtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHckfe%2FbtrOzszOYmM%2F9l324Gu7cvLXFBfFQqmZtk%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;446&quot; height=&quot;390&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비지도 사전학습으로 모델을 만든 뒤, 각 task에 대해 fine-tuning을 했을 때 파라미터들을 점진적으로 업데이트함에 따라 나타나는 성능을 보여준다. 일반적으로 많이 업데이트할 수록 성능이 높아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대해 어떤 분들은 &quot;zero-shot VS fine-tuning을 비교하여 fine-tuning의 우수함을 보여주는 자료다&quot; 라고 하시고, 어떤 분들은 &quot;LSTM과 비교했을 때 우수한 성능을 보여주는 자료다&quot;라고도 하시는데, 어떤 것이 맞는지는 잘 모르겠다.&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jalammar.github.io/illustrated-gpt2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jalammar.github.io/illustrated-gpt2/&lt;/a&gt;&lt;/p&gt;</description>
      <category>논문 리뷰/NLP</category>
      <category>GPT</category>
      <category>NLP</category>
      <category>논문리뷰</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/42</guid>
      <comments>https://mountain96.tistory.com/42#entry42comment</comments>
      <pubDate>Fri, 14 Oct 2022 00:55:48 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] Sequence to Sequence Learning with Neural Networks 요약 및 리뷰</title>
      <link>https://mountain96.tistory.com/41</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이번 논문은 기존 SMT에서 부분적으로만 활용되었던 DNN을 본격적으로 활용하여 BLEU 점수에서 이를 뛰어넘거나 비슷한 점수를 기록했다는 점에서 의미가 있다. 그리고 기존 NLP에서는 Input으로 고정된 길이의 벡터를 넘겨줘야만 했는데, 가변 길이의 벡터를 사용할 수 있게 했다는 점도 큰 발전이었다. 어떻게 가변 길이 벡터를 사용할 수 있었고, 어떤 방식으로 훈련을 했는지 위주로 리뷰를 해볼 것이다.&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;본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. RNN vs LSTM&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; RNN은 긴 데이터에 대해서는 기울기 소실 문제로 인해 약한 모습을 보인다. 반면 LSTM은 RNN보다는 긴 데이터에 더 강인한 성능을 보인다. 물론 다른 여러 논문들에서 LSTM 역시 긴 데이터에 약하다는 것을 언급한다. 그러나 본 논문에서는 LSTM을 사용하여 긴 문장의 데이터에 대해서도 높은 성능을 발휘했다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Sentence Reverse&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; LSTM 자체가 어느 정도의 긴 문장에도 적용 가능하여 성능이 좋았겠지만, 높은 성능을 발휘할 수 있었던 또 다른 이유는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;입력 시퀀스의 순서를 거꾸로&lt;/b&gt;&lt;/span&gt; 했기 때문이다. 예를 들어 ['a', 'b', 'c']를 입력으로 받고, target은 ['A', 'B', 'C']라고 해보자. 입력과 target을 이어붙인다고 했을 때, 입력 단어와 매핑되는 target 단어 사이의 거리는 모든 입력에 대해 3으로 동일하다. 이때의 거리들의 평균은 3이고, 최소 거리는 3이 되는데, 이 최소 거리가 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;minimal time lag&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqnzgi/btrGgq6iNqU/SrrzFMMSOKK4Ix7czguct0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqnzgi/btrGgq6iNqU/SrrzFMMSOKK4Ix7czguct0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqnzgi/btrGgq6iNqU/SrrzFMMSOKK4Ix7czguct0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqnzgi%2FbtrGgq6iNqU%2FSrrzFMMSOKK4Ix7czguct0%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;452&quot; height=&quot;146&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이제 입력의 순서를 바꿔보자. ['a', 'b', 'c'] 대신 ['c', 'b', 'a']를 입력하면 거리가 늘어나는 단어와 줄어드는 단어가 모두 생길 것이다. 그러나 거리의 평균은 3으로 변함이 없으며, 대신 최소 거리가 1로 줄어든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L4VJy/btrGfxSaDaK/9Hfe6W4GC5p5lKQNAB2GMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L4VJy/btrGfxSaDaK/9Hfe6W4GC5p5lKQNAB2GMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L4VJy/btrGfxSaDaK/9Hfe6W4GC5p5lKQNAB2GMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL4VJy%2FbtrGfxSaDaK%2F9Hfe6W4GC5p5lKQNAB2GMK%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;426&quot; height=&quot;146&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 논문 저자들은 이같은 최소 거리의 감소가 minimal time lag를 의미하고, 이로 인해 역전파를 할 때 입력 단어와 target 단어 사이의 &quot;관계 형성(establishing communication)&quot; 이 쉬워져서 결국 전체적인 성능 증가로 이어진다고 설명한다. 실제로 입력을 inverse 했을 때는 안했을 때와 비교하여 test perplexity가 5.8에서 4.7로 줄어들었고, BLEU 점수도 25.9에서 30.6으로 증가했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 고정 길이 벡터 VS 가변 길이 벡터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 당시의 DNN은 inputs과 targets이 고정된 차원으로 인코딩된 벡터를 사용해야만 했다. 그러나 현실 세계에서는 다양한 길이의 시퀀스들이 존재하므로 이를 적용하는 것에는 한계가 있었다. 따라서 적용하려는 도메인과는 별개로 Sequence to Sequence로 매핑하는 것을 학습하는 것이 중요하다고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가변 길이의 벡터를 사용하기 위해 논문은 LSTM 하나를 사용하여 입력 시퀀스를 입력으로 받고 고정된 차원의 벡터를 출력한다. 그리고 또 하나의 LSTM을 사용하는데, 이는 이전 LSTM에서 출력된 벡터를 입력으로 받아 출력 시퀀스를 생성한다. 여기서 입력으로 사용된다는 말은 두 번째 LSTM의 초기 hidden state로 사용된다는 것을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7nLkx/btrGgITbRkO/B31KAKPGfyeWSvBcmeApi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7nLkx/btrGgITbRkO/B31KAKPGfyeWSvBcmeApi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7nLkx/btrGgITbRkO/B31KAKPGfyeWSvBcmeApi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7nLkx%2FbtrGgITbRkO%2FB31KAKPGfyeWSvBcmeApi1%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;1040&quot; height=&quot;354&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 그림에서는 [A, B, C]를 입력 시퀀스로 받고 첫 번째 LSTM을 거친다. 모든 데이터의 끝에는 &amp;lt;EOS&amp;gt;로 되어 있다. LSTM이 &amp;lt;EOS&amp;gt;를 입력받고 난 뒤의 벡터가 두 번째 LSTM에 들어가며, 이 벡터가 곧 convext vector가 된다. 두 번째 LSTM에서는 앞서 언급한 것처럼 W를 입력으로 받고 앞서 출력된 context vector를 initial hidden state로 사용한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Model&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/znMbp/btrGhVEhg8c/HkhaArlDiINV37cVurzPcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/znMbp/btrGhVEhg8c/HkhaArlDiINV37cVurzPcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/znMbp/btrGhVEhg8c/HkhaArlDiINV37cVurzPcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznMbp%2FbtrGhVEhg8c%2FHkhaArlDiINV37cVurzPcK%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;638&quot; height=&quot;106&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; LSTM은 조건부 확률 p(y_1, y_2, ..., y_T' | x_1, x_2, ..., x_T)를 계산하게 된다. 이때 입력 시퀀스의 길이 T와 출력 시퀀스의 길이 T'는 다를 수 있음에 유의하자. 이를 계산하기 위해 우선은 첫 번째 LSTM에서 고정된 길이의 context vector v를 계산하고 LSTM_LM formula를 사용하여 y들을 계산한다. initial hidden state은 v로 설정된다.&amp;nbsp;각 확률분포 p는 모든 단어들에 대한 softmax를 적용하여 표현된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBknJf/btrGhVxxdIm/cmMwpoluFIZv50Jt63QtP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBknJf/btrGhVxxdIm/cmMwpoluFIZv50Jt63QtP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBknJf/btrGhVxxdIm/cmMwpoluFIZv50Jt63QtP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBknJf%2FbtrGhVxxdIm%2FcmMwpoluFIZv50Jt63QtP0%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;426&quot; height=&quot;113&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델은 위와 같이 log 확률(log likelihood)를 최대하하는 방식으로 훈련된다. T는 번역된 정답 시퀀스이고, S는 입력 시퀀스(Source)이며, S'는 Training set이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kWvmF/btrGktNBrQN/s2JNStFG4aWyibPIIjYNTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kWvmF/btrGktNBrQN/s2JNStFG4aWyibPIIjYNTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kWvmF/btrGktNBrQN/s2JNStFG4aWyibPIIjYNTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkWvmF%2FbtrGktNBrQN%2Fs2JNStFG4aWyibPIIjYNTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;94&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 훈련이 끝나면, 가장 가능성이 높은 T를 찾아서 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 논문 저자들은 left-to-right beam search decoder를 사용했다고 한다. 이는 번역의 앞부분이 되는 &quot;부분 가정(parital hypotheses)&quot;을 B만큼의 적은 수로 유지하는데, 각 timestep마다 beam 안의 이 부분 가정을 점차 확장해나간다. 계속 확장하면 그 수가 기하급수적으로 늘어나므로, log likelihood에 따라 가장 높은 B개의 부분 가정만 남기고 나머지는 버린다. 이후 &amp;lt;EOS&amp;gt;를 만나게 되면 이 부분 가정을 beam에서 Complete Hypotheses로 옮긴다. 이런 방식으로 번역문을 생성하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. Train&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4개의 layer로 구성된 LSTM을 사용했으며, 각 layer는 1000 cell로 이루어졌고 word embedding은 1000 차원으로 이루어졌다. 입력 사전의 단어는 160,000개이고 출력 사전의 단어는 80,000개이다. 따라서 LSTM은 8000개의 실수를 사용하여 문장을 나타낸다. 그리고 naive softmax를 사용하여 80,000개의 단어에 대한 확률분포를 만든다. 최종적으로 LSTM은 384M개의 파라미터가 존재하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; LSTM의 파라미터들은 [-0.08, 0.08] 에서의 균등분포에 따라 초기화되었다. 또한, LSTM은 기울기 소실 문제가 적지만 기울기 폭주 문제가 존재한다. 따라서 norm이 일정 값을 넘었을 때, 이를 스케일링 해주는 것으로 제약을 걸었다. 각 훈련 배치마다 gradient의 크기를 구한 뒤, 이 크기가 5를 초과한다면 5*gradient / (gradient 크기)로 gradient 벡터를 나눠준다.&amp;nbsp; 또한, 데이터셋에서 짧은 문장은 많지만 긴 문장은 적은 문제가 있다. 이로 인해 각 minibatch마다 많은 양의 계산 낭비가 발생한다. 이를 해결하고자 minbatch 안의 모든 문장들이 어느 정도 비슷한 길이의 문장들로만 구성되도록 설정하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 병렬화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 하나의 GPU만으로 학습하기에는 시간이 너무 오래 걸리기 때문에 8개의 GPU를 사용했다. LSTM의각 layer는 서로 다른 GPU에서 학습되고, 결과를 다음 GPU에 보내준다. LSTM은 4개의 layer로 구성되기 때문에 각 layer마다 하나의 GPU를 사용한다면 4개의 GPU가 남게 되는데, 이 4개의 GPU는 softmax 계산에 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; LSTM을 먼저 읽지 않은 것이 아쉬웠다. 빠른 시일 내로 LSTM을 읽고 다시 살펴봐야겠다. 또한 beam search가 무엇인지에 대해서도 공부할 필요가 있을 것 같다. 한 가지 의문은 Sequence를 inverse 해서 minimum time lag이 줄어든건 알겠지만, 동시에 maximum time lag가 늘어났다. 이로 인해 &quot;establishing communication&quot;에서 어느 정도 문제가 발생할 수 있지 않을까? 그리고 이 문제로 인해 minimum time lag이 감소한 장점이 상쇄될 수도 있지 않을까 하는 의문이 생긴다.&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;출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1409.3215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/1409.3215&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1663560602317&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Sequence to Sequence Learning with Neural Networks&quot; data-og-description=&quot;Deep Neural Networks (DNNs) are powerful models that have achieved excellent performance on difficult learning tasks. Although DNNs work well whenever large labeled training sets are available, they cannot be used to map sequences to sequences. In this pap&quot; data-og-host=&quot;arxiv.org&quot; data-og-source-url=&quot;https://arxiv.org/abs/1409.3215&quot; data-og-url=&quot;https://arxiv.org/abs/1409.3215v3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beBWnt/hyPQjakCNE/MUWgAt3OYoHUkYU09CYvI0/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1409.3215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arxiv.org/abs/1409.3215&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beBWnt/hyPQjakCNE/MUWgAt3OYoHUkYU09CYvI0/img.png?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Sequence to Sequence Learning with Neural Networks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Deep Neural Networks (DNNs) are powerful models that have achieved excellent performance on difficult learning tasks. Although DNNs work well whenever large labeled training sets are available, they cannot be used to map sequences to sequences. In this pap&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arxiv.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문 리뷰/NLP</category>
      <category>NLP</category>
      <category>논문리뷰</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/41</guid>
      <comments>https://mountain96.tistory.com/41#entry41comment</comments>
      <pubDate>Sat, 2 Jul 2022 16:10:45 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] GPT-1 : Improving Language Understanding by Generative Pre-Training (OpenAI)</title>
      <link>https://mountain96.tistory.com/40</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Abstract&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Natural language understanding은 두 문장간의 추론 문제, 두 문장의 의미적 동일성, QA, 문서 분류 등 다방면으로 구성된다. 그러나 unlabeled 된 텍스트 데이터는 많은 반면, labeled된 텍스트 데이터는 적기 때문에 모델 훈련에 어려움이 있다. 따라서 본 논문에서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다양한 unlabeled 텍스트를 사용한 generative pre-training 인 language model&lt;/b&gt;&lt;/span&gt;을 제시하며, 이는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;discriminative fine-tuning을 사용하여 각 특수한 작업에 사용&lt;/b&gt;&lt;/span&gt;될 수 있다. 이를 통해 완성한 모델은 기존 특수한 작업을 위해 만들어진 모델들보다 뛰어난 성능을 보였으며, 12개의 작업 중 9개의 작업에서 그 성능이 우수했다는 결과가 이를 증명한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적은 labeled 텍스트&lt;/b&gt;와 &lt;b&gt;많은 unlabeled 텍스트&lt;/b&gt;로 인한 어려움을 해결하기 위해 등장&lt;/li&gt;
&lt;li&gt;다양한 unlabeled 텍스트로 language model을 generative하게 pretraining하고, 각 작업에 맞게 fine-tuning시킨다.&lt;/li&gt;
&lt;li&gt;실제로 많은 작업에서 기존 작업에 특화된 모델보다 더 좋은 성능을 보였다.&lt;/li&gt;
&lt;/ul&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;Introduction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; raw text에서 효과적으로 학습하는 것은 NLP에서 중요한 문제인데, 왜냐하면 이는 지도학습에 의존하는 방식을 완화해줄 수 있기 때문에다. 많은 딥러닝 방법들에서 labeled된 데이터를 사용하여 학습하는데, 실제 도메인에서는 labeled 된 데이터가 적기 때문에 실용성이 떨어진다. 이런 상황에서, unlabeled data에서 언어적 정보를 이용할 수 있는 모델은 많은 시간과 비용을 들이는 annotation 작업을 대체할 수 있고, 만약 지도학습이 가능한 환경일지라도 unlabeled data에서 좋은 표현을 학습하는 것은 상당한 성능적 이점을 더할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그러나 &lt;b&gt;unlabeld text에서 단어 수준의 정보 이상을 이용하는 것은 두 가지 이유에서 어렵다.&lt;/b&gt; 첫 번째는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;transfer에 유용한 text 표현을 배우는 것에 어떤 형태의 최적화 목적(Optimization Objective)이 가장 좋은지 불분명&lt;/b&gt;하기 때문이다. 최근에는 language modeling, machine translation, discourse coherence와 같은 다양한 objective들이 연구되었는데, 다양한 작업들에서 어느 한쪽이 항상 우위를 점하지 않고 작업마다 우위를 점하는 objective가 달랐다. 두 번째는 이렇게 &lt;b&gt;학습된 표현들을 목표 작업(target task)으로 transfer시키는 가장 효과적인 방법이 불분명&lt;/b&gt;하기 때문이다. 현재로써는 복잡한 학습 방법과 보조 learning objective를 조합하여 사용하는 기술 정도가 있다. 이런 불분명&lt;/span&gt;성은 NLP에서의 준지도학습(semi-supervised learning)을 더 어렵게 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 본 논문에서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;비지도(unsuperivsed) pre-training&lt;/b&gt;&lt;/span&gt;과 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;지도(supervised) 미세조정(fine-tuning)&lt;/span&gt;&lt;/b&gt;을 조합한 NLP에 대한 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;준지도학습&lt;/b&gt;&lt;/span&gt;을 제시한다. 이 연&lt;span style=&quot;color: #000000;&quot;&gt;구의 목표는 &lt;b&gt;다양한 작업에 사용될 수 있으면서도 약간의 변화(adaptation)로 transfer할 수 있는 보편적인 표현들을 학습하는 것&lt;/b&gt;&lt;/span&gt;이다. 즉 이를 위해서는 대량의 unlabeled text corpus와 목표 작업을 위한 labeled 데이터셋이 필요하다. 중요한 것은 unlabeled data와 labeld data가 꼭 같은 도메인에 속할 필요가 없다는 것이다. 이를 위해 두 가지 과정을 만들었다. 첫째는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;unlabeled data에 language modeling objective를 사용하여 초기 파라미터들을 학습&lt;/b&gt;&lt;/span&gt;하는 것이다. 두번째는 &lt;b&gt;labeled data를 사용하여 이 초기 파라미터들을 주어진 목표 작업에 맞게 조금씩 수정&lt;/b&gt;하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델 구조로는&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; Transformer&lt;/b&gt;&lt;/span&gt;를 사용했는데, 이는 기계 번역, 문서 생성, 구분 분석에 큰 효과를 발휘한다고 알려져있다. 또한 이는 &lt;b&gt;긴(long-term) 데이터에 대해서도 기존 RNN이나 LSTM과 같은 모델들보다 훨씬 robust&lt;/b&gt;하게 작동한다. &lt;b&gt;transfer시에는 traversal-style approaches에서 사용된 task에 특정적인 input adaptation을 사용&lt;/b&gt;한다. 이는 뒤에서 설명되겠지만, task마다 요구하는 input text가 다양한데, 이를 연속적인 싱글 시퀀스로 변환하는 것이다. 즉 task에 맞는 미세조정을 위해서 pre-trained 모델의 출력을 변형시킨 것이라 보면 되겠다. 이 때문에 pre-trained 모델의 출력만 바꿔도 다양한 작업에 미세조정이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 본 논문에서 제시한 모델은 4가지 작업에서 검증하였다 - 자연어 추론, QA, 두 문장간의 의미적 동일성, 텍스트 분류. 그리고 총 12개의 작업 중 9개 작업에서 작업에 특화된 기존 모델들보다 높은 성능을 보였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unlabeled data에서 학습하는 것은 실용적인 측면과 성능적인 측면에서 모두 중요하다.&lt;/li&gt;
&lt;li&gt;그러나 이는 유용한 text 표현을 배우기 위한 최고의 Optimization Objective와 목표 작업으로 transfer시키는 최고의 효과적인 방법이 불분명하기 때문에 어렵다.&lt;/li&gt;
&lt;li&gt;본 논문에서는 Unsupervised pre-training과 Supervised fine-tuning을 사용하는데, 이는 unlabeled data로 language model을 만들고, 이를 통해 얻은 결과물을 각 작업에 맞는 labeld data를 사용하여 fine-tuning한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;모델 구조로는 Transformer를 사용하며, language model 에서 fine-tuning으로 넘어가는 시점에서 language model의 출력을 원하는 작업에 맞는 input으로 변형하여 넘겨준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Related Work&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; NLP 준지도학습(Semi-supervised learning for NLP)&amp;nbsp;&lt;/b&gt;: NLP에 대한 준지도학습은 시퀀스 라벨링이나 텍스트 분류에 대한 적용으로 많은 관심을 받았는데, 초기 연구에서는 unlabeled data를 사용해서 단어 수준(word-level)이나 문맥 수준(phrase-level)을 계산하고 이를 feature로 사용하여 지도학습에 적용시켰다. 지난 몇 년간의 연구들에서는 unlabeled corpora로 훈련된 단어 임베딩을 사용하여 다양한 작업에 성능적 발전을 가져다주었다. 그러나 이런 접근 방식들은 주로 단어 수준의 정보를 transfer한다는 점에서 한계가 있으며, 본 논문은 이보다 &lt;b&gt;더 높은 수준의 정보를 transfer&lt;/b&gt;하고자 한다. 최근 연구들에서는 unlabeled data에서 단어 수준의 의미를 넘어서 더 고차원적인 문맥 수준(phrase-level)이나 문장 수준(sentence-level)의 임베딩을 시도하기 시작했다.&lt;/p&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;b&gt;비지도 사전학습(Unsupervised pre-training)&amp;nbsp;&lt;/b&gt;: 비지도 사전학습은 지도 학습 objective를 조절하는 것이 목표가 아니라 &lt;b&gt;좋은 시작점(initialization point)를 찾는 것이 목표&lt;/b&gt;라는 점에서 준지도학습의 특별한 유형이라 할 수 있다. 초기 연구들에서는 이를 이미지 분류와 회귀 문제에 사용했다. 그 다음의 연구들에서는 사전학습이 우수한 정규화(regularization)로 작용한다는 것을 증명하였으며, 이는 DNN에서의 일반성을 높여주었다. 최근 연구에서는 이 사전학습이 이미지 분류, 음성 인식, 다의어 명확화, 기계 번역에서 사용되는 DNN의 학습을 도와주는 용도로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 본 논문과 비슷한 연구로는 언어 모델 objective를 사용하여 사전학습을 진행하고, 이를 목표 작업을 위해 미세조정하는 연구가 있었다. 그러나 이 연구에서는 사전학습을 할 때 언어적 정보를 얻기 위해 LSTM을 사용했는데, 이 때문에 짧은 범위의 데이터에서만 모델이 유효했다. 그러나 본 논문에서는 &lt;b&gt;transformer를 사용하여 긴 범위의 데이터에서도 유효하도록&lt;/b&gt; 했다. 또한 더 큰 범위의 작업에서도 유용한데, 이는 자연어 추론, paraphrase 감지, 그리고 story completion를 포함한다. 또한 다른 연구들에서는 목표 작업을 위한 지도학습을 진행할 때 사전학습이나 기계 번역 모델에서 가져온&amp;nbsp; 은닉 표현(hidden representation)을 보조 feature로써 활용하는데,&amp;nbsp; 이는 각 작업을 위한 상당한 양의 새로운 파라미터를 요구한다. 이에 비해 &lt;b&gt;본 논문의 모델은 transfer 시 모델 구조에 대해 최소한의 변화만을 요구한다&lt;/b&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;b&gt;보조 학습 목적함수(auxiliary training objectives)&lt;/b&gt; : 보조 비지도 학습 목적함수를 추가하는 것은 준지도학습의 대안에 가깝다. 초기 연구에서는 POS tagging과 같은 보조 NLP 작업을 사용하여 sementic role labeling을 개선하였으며, 최근에는 보조 언어 모델링 목적함수를 target task의 목적함수에 사용하여 시퀀스 라벨링에서의 성능적 개선을 증명했다. 본 논문의 실험에서도 &lt;b&gt;보조 목적함수를 사용&lt;/b&gt;하는데, &lt;b&gt;비지도 사전학습 자체가 이미 목표 작업과 연관된 언어적 정보를 학습한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단어 수준보다 더 고차원적인 수준의 정보를 transfer하고자 한다(문맥 수준, 문장 수준 등)&lt;/li&gt;
&lt;li&gt;비지도 사전학습의 목표는 좋은 시작점을 찾는 것이다.&lt;/li&gt;
&lt;li&gt;Transformer를 사용하여 긴 범위의 데이터에서도 유효하다.&lt;/li&gt;
&lt;li&gt;Transfer시 최소한의 변화만을 요구한다.&lt;/li&gt;
&lt;li&gt;보조 목적함수를 사욯하지만, 비지도 사전학습 자체가 이미 목표 작업과 연관된 언어적 정보를 학습한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Framework&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 본 모델의 학습은 두 가지 단계(stage)로 진행된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;대량의 말뭉치(corpus of text)로 대용량의 &lt;b&gt;언어모델을 학습&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;labeled data를 사용하여 목표 작업에 맞게 &lt;b&gt;미세조정&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;비지도 사전학습(Unsupervised pre-training)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 비지도 말뭉치의 토큰들 u={u_1, u_2, ... ,u_n} 이 주어졌을 때, 아래 우도를 최대화하는 방향으로 표준 언어 모델링 목적함수를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBRl82/btruArtTE9F/maMRjB0YFa6b1yCs5czKg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBRl82/btruArtTE9F/maMRjB0YFa6b1yCs5czKg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBRl82/btruArtTE9F/maMRjB0YFa6b1yCs5czKg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBRl82%2FbtruArtTE9F%2FmaMRjB0YFa6b1yCs5czKg0%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;595&quot; height=&quot;87&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 때 k는 context window의 크기이고, 조건부확률 P는 세타를 파라미터로 사용한 신경망을 이용한다. 이 파라미터는 SGD로 학습된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 본 논문의 실험에선, Transforemr의 변형인 &lt;b&gt;multi-layer Transformer decoder&lt;/b&gt;를 언어 모델로 사용한다. 이 모델은 multi-headed self-attention을 input context token들에 적용하며, 이후 position-wise feedforward layer를 거쳐 목표 토큰에 대한 출력 분포를 얻는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6ceRI/btrupIEnRJw/WDYeypmW5p8rxhpLxyRsok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6ceRI/btrupIEnRJw/WDYeypmW5p8rxhpLxyRsok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6ceRI/btrupIEnRJw/WDYeypmW5p8rxhpLxyRsok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6ceRI%2FbtrupIEnRJw%2FWDYeypmW5p8rxhpLxyRsok%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;658&quot; height=&quot;149&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 여기서 U는 U = (u_-k, ..., u_-1)에 해당하는 토큰의 context vector이며, n은 layer 개수이고, W_e는 토큰 embedding matrix, W_p는 position embeddign matrix이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; (이 때 &amp;forall;i는 &amp;forall;l을 의미한다. 즉 오타이다)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지도 미세조정(Supervised fine-tuning)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 비지도 사전학습으로 모델을 훈련한 뒤에, 사용된 파라미터들을 목표 작업에 맞게 미세조정한다. 이 때 작업에 맞는 labeled 데이터셋 C가 있다고 가정하며, 이 데이터셋의 각 요소는 x^1, x^2, ..., x^m으로 이루어진 input token의 시퀀스와 label인 y로 구성된다. 이 input들을 사전 학습된 모델에 통과시켜 transformer의 최종 출력물인&amp;nbsp; h_l^m을 얻게 되고, W_y와 y로 이루어진 선형 출력 layer(linear output layer)에 입력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv8Ml0/btrusPpe0mC/95bbZKRQmxna33vbOGDJt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv8Ml0/btrusPpe0mC/95bbZKRQmxna33vbOGDJt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv8Ml0/btrusPpe0mC/95bbZKRQmxna33vbOGDJt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv8Ml0%2FbtrusPpe0mC%2F95bbZKRQmxna33vbOGDJt1%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;524&quot; height=&quot;60&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이를 사용하여 다음 우도를 최대화한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGN9ZD/btruxkPyVZl/HeuiG08Drq0NLX6OXF1wd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGN9ZD/btruxkPyVZl/HeuiG08Drq0NLX6OXF1wd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGN9ZD/btruxkPyVZl/HeuiG08Drq0NLX6OXF1wd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGN9ZD%2FbtruxkPyVZl%2FHeuiG08Drq0NLX6OXF1wd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;100&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한 언어 모델을 보조 목적함수로써 미세조정에 포함시키는 것이 일반화를 향상시키고 수렴을 가속화한다는 점에서 미세조정의 학습을 돕는다는 것을 알아냈다. 이는 다른 이전 연구에서도 보조 목적함수로 성능을 향상시킨 바가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 구체적으로, 다음 목적함수를 최적화한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ruNfw/btrurTFr1bS/uGriKS03kkNO0q55xk1yR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ruNfw/btrurTFr1bS/uGriKS03kkNO0q55xk1yR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ruNfw/btrurTFr1bS/uGriKS03kkNO0q55xk1yR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FruNfw%2FbtrurTFr1bS%2FuGriKS03kkNO0q55xk1yR0%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;397&quot; height=&quot;57&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 종합적으로, 미세조정 시에 이 모델에서 요구하는 추가 파라미터는 오직 Wy와 구분자 토큰을 위한 embedding이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Task-specific input transformations&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pnaNO/btruqEV3pbI/b3TCKOY4ricNKwtAxxQB50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pnaNO/btruqEV3pbI/b3TCKOY4ricNKwtAxxQB50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pnaNO/btruqEV3pbI/b3TCKOY4ricNKwtAxxQB50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpnaNO%2FbtruqEV3pbI%2Fb3TCKOY4ricNKwtAxxQB50%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;1327&quot; height=&quot;676&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 텍스트 분류와 같은 작업에서는 위 그림에서 볼 수 있듯이 이 모델을 사용해서 바로 미세조정이 가능하다. 그러나 다른 작업들에서는 &lt;b&gt;특별하게 구조화된 input&lt;/b&gt;이 필요하다. 우리의 사전학습 모델은 연속적인 텍스트 시퀀스로 훈련되었기 때문에, 해당 작업에 적용하기 위해서는 약간의 수정이 필요하다. 이전 연구에서는 transfer된 표현 위에 새롭게 해당 작업에 맞는 구조를 쌓아서 모델을 만들었다. 그러나 이는 작업에 맞는 모델 구조를 추가적으로 설계해야 하고 이런 추가적인 구조에 전이학습을 사용하지 않는다. 이 대신, 본 논문에서는 traversal-style approach를 사용하는데, 이는 &lt;b&gt;목표 작업에 맞는 구조화된 입력(structured input)을 사전학습 모델이 사용할 수 있는데 정렬된 시퀀스(ordered sequence)로 변환하는 것&lt;/b&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;b&gt;Textual Entailment&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 함의 문제에 대한 작업에서는, 전제 p와 가정 h를 구분자 토큰 $를 사이에 두고 연결한다.&lt;/p&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;b&gt;Similarity&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;유사 문장에 대한 작업에서는, &lt;b&gt;두 문장의 순서가 결과에 관계가 없다&lt;/b&gt;. 이를 반영하기 위해 입력 시퀀스를 순서가 뒤바뀐 두 개의 입력 시퀀스로 나누어서(물론 두 문장 사이에 구분자 토큰이 존재한다) 독립적으로 모델에 입력한다. 이를 통해 두 시퀀스에 대한 두 개의 시퀀스 표현인 h_l^m이 완성되고, 이는 원소별로(element-wise) 더해져서 선형 출력 layer의 입력으로 사용된다.&lt;/p&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;b&gt;Question Answering and Commonsense Reasoning&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; context document z, 질문 q, 가능한 답변들 {a_k}가 주어진다면, 여기서&lt;b&gt; [z; q; $; a_k]&lt;/b&gt; 식으로 연결해준다.($ : 구분자 토큰) 이렇게 완성된 시퀀스들은 각각 독립적으로 모델에 입력되며, softmax를 통해 정규화(normalize)되고 가능한 답변들에 대한 출력 분포를 생산하게 된다.&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;Experiments&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp; Setup&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 비지도 사전학습(Unsupervised pre-training)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 언어 모델 학습을 위해서 BooksCorpus 데이터셋을 사용했다. 이는 다양한 장르에 속한 7,000권 이상의 출판되지 도서들로 구성된다. 특히 이는 긴 범위의 연속된 text를 포함하는데,&amp;nbsp; 이로 인해 생성 모델이 넓은 범위의 언어적 정보를 학습할 수 있다. 또 다른 데이터셋인 1B Word Benchmark는 ELMo에서도 사용되었는데, 사이즈가 비슷하지만 문장 수준에서 섞여 있어서 넓은 범위의 정보가 파괴되어있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SwgKt/btruAsfh2To/toIF2Z6z0tpZD8N7ObdWfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SwgKt/btruAsfh2To/toIF2Z6z0tpZD8N7ObdWfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SwgKt/btruAsfh2To/toIF2Z6z0tpZD8N7ObdWfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSwgKt%2FbtruAsfh2To%2FtoIF2Z6z0tpZD8N7ObdWfK%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;1319&quot; height=&quot;292&quot; data-origin-width=&quot;1319&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;Model Specifications&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 전반적으로는 Transformer를 따른다.&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 220px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Hyperparameter&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;Layers&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;12-layer decoder-only transformer with masked self-attention heads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Dimensional states&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;768&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Attention heads&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Position-wise FFN dimensional states&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;3072&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Optimization&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Adam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Learning rate&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;max : 2.5e-4.&lt;br /&gt;초기 2000step까지는 최대 2.5e-4까지 선형적으로 증가.&lt;br /&gt;이후 cosine schedule에 따라 0으로 서서히 감소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Batch_size&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Epochs&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Contiguous tokens&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Weight initialization&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;N(0, 0.02)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Subword Segmentation&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;BPE (40,000 merges)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Dropout&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Regularization&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;변형된 L2(w=0.01)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Activation function&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Gaussian Error Linear Unit(GELU)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;Position embedding&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;learned positoin embeddings&lt;br /&gt;(sinusoidal 안씀)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;전처리&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;fify library, spaCy tokenizer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Fine-tuning details&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 특별히 명시되지 않은 것들은 미지도 사전학습에 사용된 하이퍼파라미터들을 재사용했다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #9b9b9b; color: #ffffff;&quot;&gt;Hyperparameter&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;dropout&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;batch size&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;epochs&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;3 (3번이면 충분했다)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;learning rate&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;최대 6.25e-5&lt;br /&gt;linear learning rate decay schedule을 사용했다. (warmup을 포함해 학습당 0.2%, 람다=0.5)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp; Supervised fine-tuning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;b&gt;Natural Language inference(자연어 추론)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/b&gt;이는 짝지어진 두 문장이 모순(contradiction)인지 혹은 중립(neutral)인지를 판단하는 문제이다. Image captions(SNLI),&amp;nbsp; 음성 기록, 유명 소설, 정부 보고서(MNLI), 위키피디아 문서(QNLI), 과학 시험(SciTail)과 뉴스 기사(RTE)등의 데이터셋으로 검증을 한 결과 RTE를 제외한 나머지 데이서테셋에서 유의미한 성능 향상을 보여줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwzVk/btrvdv4pwZ0/pv3aQDk2LOLNczswozzfXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwzVk/btrvdv4pwZ0/pv3aQDk2LOLNczswozzfXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwzVk/btrvdv4pwZ0/pv3aQDk2LOLNczswozzfXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxwzVk%2Fbtrvdv4pwZ0%2Fpv3aQDk2LOLNczswozzfXK%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;875&quot; height=&quot;264&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Question answering and commonsense reasoning&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 이는 QA 문제이다. 사용한 데이터셋으로는 중학교와 고등학교 시험 문제들로 이루어진 RACE 데이터셋, 이야기에서 올바른 엔딩을 선택하는 문제를 다루는 Story Cloze Test 데이터셋이 있다. Story Cloze에서는 약 8.9%, RACE 데이터셋에서는 전반적으로 약 5.7%의 성능 향상을 보여줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C6wlF/btrviHCOaLH/lyVU6KZ9xfZ3AM1nzjQuIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C6wlF/btrviHCOaLH/lyVU6KZ9xfZ3AM1nzjQuIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C6wlF/btrviHCOaLH/lyVU6KZ9xfZ3AM1nzjQuIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC6wlF%2FbtrviHCOaLH%2FlyVU6KZ9xfZ3AM1nzjQuIk%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;879&quot; height=&quot;326&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; Semantic Similarity&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 이는 두 문장이 의미적으로 같은지 다른지를 판단하는 문제이다. 사용한 데이터셋으로는 Microsoft Paraphrase corpus(MRPC), the Quora Question Paris(QQP), Semantic Textual Similarity benchmark(STS-B)가 있다. 이 중 STSB와 QQP에서 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;&amp;nbsp; &amp;nbsp; &lt;b&gt;Classification&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 텍스트 분류로 사용한 데이터셋으로는 문법적으로 맞는지를 판단하는 Corpus of Linguistic Acceptability(CoLA)와 단순히 이진분로 사용되는 Stanford Sentiment Treebank(SST-2)가 있다. CoLA에서는 기존 성능과 비교했을 때 큰 성능 향상을 이루었으며, SST2는 SOTA와 맞먹는 성능을 발휘했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqiayc/btrvhOa4hx8/D3gelt09f7IcHjBohQbUBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqiayc/btrvhOa4hx8/D3gelt09f7IcHjBohQbUBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqiayc/btrvhOa4hx8/D3gelt09f7IcHjBohQbUBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqiayc%2FbtrvhOa4hx8%2FD3gelt09f7IcHjBohQbUBk%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;927&quot; height=&quot;446&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Analysis&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; Impact of number of layers transferred&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 사용되는 transferred layer 개수에 따른 효과를 분석해보았다. MultiNLI와 RACE데이터셋에서 실험을 진행했으며, 좌측 그래프를 보면 transferring embedding들이 layer마다 최대 9%의 성능 향상을 일으킨다는 것을 알 수 있다. 이는 사전학습 모델의 각 layer가 유용한 기능을 포함한다는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;Zero-shot Behaviros&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 저자들은 왜 transformer를 사용한 language model 사전학습이 효과적인지를 밝히고자 했다. 이에 대한 가정은 근본적인 generative model이 language modeling의 capability를 향상시키고자 많은 작업들을 배울 수 있고, LSTM과 비교했을 때 transformer의 구조화된 attentional memory가 transfer시에 도움이 된다는 점이다. 이를 위해 저자들은 몇 가지의 휴리스틱한 solution들을 고안했는데, 이는 지도학습을 통한 미세조정 없이 generative model 그 자체로 작업에 사용해보는 것이다. 이 휴리스틱 solution의 결과가 우측 그래프에 나타나있다. 그래프를 보면 학습 횟수에 따라 안정적으로 꾸준히 성능이 증가하는데, 이는 생성적 사전학습(generative pretraining)이 광범위한 종류의 작업들을 배우는 것에 도움을 준다는 것을 의미한다. 또한 LSTM이 더 높은 편차를 보여주는데, 이는 transformer 구조의 귀납적 편향이 transfer를 돕는다는 것을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxU7z/btrviIhqYbF/t4gK82R2mDHHj6CHp3CUlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxU7z/btrviIhqYbF/t4gK82R2mDHHj6CHp3CUlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxU7z/btrviIhqYbF/t4gK82R2mDHHj6CHp3CUlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxU7z%2FbtrviIhqYbF%2Ft4gK82R2mDHHj6CHp3CUlK%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;861&quot; height=&quot;388&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; CoLA(linguistic acceptability) 데이터셋에서는, 생성 모델이 사용하는 token log-probability의 평균을 score로 사용했고, thresholding으로 예측을 만들었다. SST-2(감성 분석)는, 각 토큰에 &quot;very&quot;라는 토큰을 붙였고 language model의 출력 분포를 &quot;positive&quot;와 &quot;negative&quot;로 제한하여 더 높은 probability를 prediction으로 사용해서 측정하였다. RACE(QA)데이터셋에서는, generative model이 가장 높은 평균 token log-probability로 뽑아내는 것을 정답으로 측정하였고, DPRD(winograd schemas)에서는 확실한 대명사들을 가능한 지시대상 중 두 개로 교체하여 예측을 진행하였다.&lt;/p&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; Ablation studies&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 세 가지 ablation study를 진행하였다. 첫 번째는, 미세조정 시 보저 LM 목적함수를 사용하지 않고 성능을 관찰하엿다. 그 결과 보조 목적함수가 NLI task와 QQP에서 도움을 준다는 것을 확인했다. 또한 전반적으로 큰 데이터셋은 보조 목적함수로부터 도움을 받는 반면, 작은 데이터셋에서는 도움을 받지 못한다는 것도 확인했다. 두 번째는, 같은 framework를 사용하면서 2048 unit의 LSTM과 비교하며 Transformer의 효과를 분석했다. 결과는 LSTM을 Transformer 대신 사용할 때의 성능이 평균 약 5.6점 정도가 떨어졌다. LSTM은 오직 MRPC데이터셋에서만 Transformer보다 더 나은 성능을 보였다. 마지막으로, 논문에서 제시한 transformer구조를 사전학습을 거치지 않고 바로 작업에 맞춘 지도학습을 진행했을 때의 결과를 분석했다. 사전학습을 거치지 않는 것은 모든 작업에서의 성능 저하를 나타냈다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRdPan/btrvgmeRWAD/8twWVv0QLrusae2zPaaOL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRdPan/btrvgmeRWAD/8twWVv0QLrusae2zPaaOL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRdPan/btrvgmeRWAD/8twWVv0QLrusae2zPaaOL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRdPan%2FbtrvgmeRWAD%2F8twWVv0QLrusae2zPaaOL0%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;898&quot; height=&quot;247&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;247&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;h2 data-ke-size=&quot;size26&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 여기서는 생성적 사전학습과 미세조정을 통해 만들어진, &quot;작업에 대한 지식이 없는&quot;, 자연어를 이해하는 것에 강한 framework를 소개했다. 광범위한 정보를 담는 연속된 텍스트로 이루어진 다양한 말뭉치들로 사전학습된 모델은 상당한 일반 지식(world knowledge)과 넓은 범위의 정보 처리가 가능한 기능을 얻었는데, 이는 QA, 의미적 유사도 평가, entailment determination, 텍스트 분류와 같은 작업들에 맞게 성공적으로 전이되었으며, 12개의 데이터셋 중 9개에서 SOTA를 달성하였다. 특화된 작업의 성능 부스트를 위한 비지도 사전학습은 오랫동안 기계학습 연구의 중요한 목적이였다. 우리의 작업은 이 분야에서 상당한 성능 향상도 가능하고, 어떤 모델(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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리뷰&lt;/h2&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; 포스팅을 하다가 중간에 GPT를 먼저 구현해보고 글을 쓰면 더 잘써지지 않을까 해서 구현하는데 1주일이 또 걸렸다. gpt논문을 통해 NLP분야에서의 사전 학습에 대해서 알 수 있었다. 덧붙이자면, 여기서 자주 언급되는 Language model이란 토큰을 입력했을 때 다음 토큰을 예측하는 모델인 것 같다. 방금 써보니 그럼 비지도학습 모델이 아니지 않나? 싶은데 KoGPT는 이런 식으로 훈련이 되었다고 한다. 일단은 LM을 다음 토큰 예측 모델이라고 이해하고 넘어가도 괜찮을 것 같다. 다음으로는 BERT 논문을 분석해보고자 한다. 그 전에 GPT 구현 먼저 정리해야지&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;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문 리뷰/NLP</category>
      <category>GPT</category>
      <category>NLP</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <category>자연어처리</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/40</guid>
      <comments>https://mountain96.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 6 Mar 2022 22:05:21 +0900</pubDate>
    </item>
    <item>
      <title>2021.06 ~ 2021.11 학부연구생 후기</title>
      <link>https://mountain96.tistory.com/39</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제서야 후기를 쓰게 되었지만, 딥러닝 분야에서 연구를 시작한 첫 터전이기도 했고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 때의 경험을 조금이나마 기록해두면 좋지 않을까 싶어서 기록을 남긴다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;AI 보안&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; 운좋게 AI보안 연구실에 들어갈 기회가 생겨서 들어가게 되었다. 사실 AI 보안이라고 해도 AI 개발과 크게 다르지 않을 것이라 생각했다. 조금 더 구체화해본다면, 인공지능을 활용해 해커의 침입을 감지하거나 정보 유출을 막는 그런 기능들을 상상했었다. 그러나 AI 보안은 그것과는 많이 달랐다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; 가장 기억에 남는 것에는 백도어 어택이 있다. 이미지의 한 쪽 구석에 임의의 패턴을 넣어서 모델이 오답 클래스로 분류하도록 유도하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boEKv2/btrroGWjhNJ/TrJn5YwJNGuZBzALM7XPi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boEKv2/btrroGWjhNJ/TrJn5YwJNGuZBzALM7XPi1/img.png&quot; data-alt=&quot;Backdoor attack on Video Recognition&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boEKv2/btrroGWjhNJ/TrJn5YwJNGuZBzALM7XPi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboEKv2%2FbtrroGWjhNJ%2FTrJn5YwJNGuZBzALM7XPi1%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;514&quot; height=&quot;346&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Backdoor attack on Video Recognition&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 사진은 비디오의 프레임마다 한쪽 구성에 임의의 패턴을 입력한 것이다. 이런 방식으로 진행하여 오분류를 유도하는 방식이다. 이를 통해서 즉각적으로 알 수 있었던 사실은, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;사람이 사물을 인식하는 방법과 컴퓨터가 사물을 인식하는 방법은 아직 많이 다르다는 것이다.&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우리는 뚜렷하게 사물을 배경이나 다른 사물과 분리하여 인식할 수도 있고, 사물 그 자체를 인식할 때도 사물의 고유한 색이나 특성을 생각하며 인식한다. 그러나 컴퓨터는 사물을 인식할 때 여러 특성을 고려하지 않고 오로지 그 사물을 이루는 &lt;span style=&quot;color: #ee2323;&quot;&gt;픽셀값&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 통해서 인식한다. 그렇기 때문에 사람이 보기에 강아지로 보이지 않는 그림이라도 컴퓨터가 보기에는 강아지를 이루는 픽셀의 조합과 유사하다는 이유로 해당 사물을 강아지로 인식할 수 있는 것이다. 컴퓨터와 사람의 인식 방식에서 생기는 이러한 괴리감 때문에 백도어 어택과 같은 방식이 가능한 것이라고 생각한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 내가 있었던 AI 보안 연구실은 이런 것과 비슷한 연구들이 진행되는 곳이였다. Train 과정, 혹은 실제 사용하는 과정에서 어떻게 하면 모델의 오작동을 유도할 수 있을지를 주로 연구하는 느낌이였다. 단순히 보면 해커들에게 도움이 되는 연구만 하는 거라고 볼 수도 있겠지만, 이런 연구가 선행이 되어야 이에 대한 대비가 가능하기 때문에 꼭 필요한 연구라고 생각한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; 그러나 내가 원하던 연구 분야와는 살짝 본질적으로 달랐다. 나는 모델 자체의 성능에 조금 더 관심이 있다. 그래서 모델의 정확도를 높일 수 있게끔 구조를 다르게 연구해본다던가, 혹은 이전에는 없었던 새로운 방식으로 AI 모델이 이미지든 텍스트든 사용자가 원하는 방향으로 새롭게 생성할 수 있는 모델을 만들고 싶었다. 이런 점에서 AI 보안 연구실과는 방향이 다르다고 생각해서 기존 계약 기간이였던 11월까지 활동을 하고 연장하지 않았다. 나도 아쉬웠고 연구실 사람들도 아쉬워했지만, 분야가 다르다는 것은 어쩔 수 없는 이유라고 생각한다. 사실 내가 들어오기 전에 먼저 AI 보안에 대해서 조금 더 알아보고 들어왔어야 했다. 그런 점에서는 연구실 사람들에게 많이 죄송하다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&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;&lt;b&gt;연구&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 연구는 모바일 기기에서 이루어지는 사용자 인증, 스푸핑 탐지, 그리고 표정 인식에 대해서 진행되었다. 어떻게 구현했는지를 이런 공개적인 블로그에 써도 되는지에 대해서 잘 모르기 때문에 자세히 언급하지는 않겠다. 연구 환경은 리눅스가 설치되어 있는 서버 컴퓨터에 저사양 노트북으로 원격으로 조종하는 방식이였다. 그래픽 카드는 좋은 편이였고, 나는 2개를 사용하던 박사과정 형의 그래픽 카드 하나를 할당받아서 사용했다. 어차피 훈련이나 코딩은 서버 컴퓨터에서 이루어지기 때문에 고사양 노트북이 필요하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 연구는 MobileNet V2를 기반으로 한 전이학습을 주로 사용했다. 방대한 크기의 이미지 데이터들을 사용했고, 이정도 규모의 훈련은 처음이여서 많이 헤맸던 것으로 기억한다. 연구 과정에서 기억할 만한 것드을 몇 가지 적어본다면 다음과 같다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 작은 데이터셋 -&amp;gt; 큰 데이터셋&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우선 처음부터 모든 데이터셋을 사용하지 않았다. 소규모의 데이터셋을 먼저 사용해서 모델이 잘 작동하는지를 확인하고 이후 점차 모든 데이터셋을 사용하게끔 넓혀갔다. 만약 처음부터 모든 데이터셋을 사용했다면, 훈련하는데 시간이 너무 오래 걸리기 때문에 여러 가지 다양한 시도를 해보지 못했을 것이다. 작은 데이터셋에서 사용한 덕분에 다양한 파라미터를 사용해볼 수 있었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. FRR, FAR, EER&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 세가지는 정확성을 측정하는 기준이며, 각각 FRR(False Reject Rate), FAR(False Acceptance Rate), EER(Equal Error Rate)를 지칭한다. FRR은 시스템에 등록된 사용자가 인증이 거부되는 비율이고, FAR은 시스템에 미등록된 사용자가 인증이 허가되는 비율이며, 마지막 EER은 FRR과 FAR이 겹쳐지는 시점의 오류율이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbtVHo/btrrqZU577c/yfVoCJdzZ1Szs4jxYwmV8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbtVHo/btrrqZU577c/yfVoCJdzZ1Szs4jxYwmV8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbtVHo/btrrqZU577c/yfVoCJdzZ1Szs4jxYwmV8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbtVHo%2FbtrrqZU577c%2FyfVoCJdzZ1Szs4jxYwmV8K%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;356&quot; height=&quot;254&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;500&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 유사도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사용자 인증을 위해 사용자의 얼굴을 시스템에 등록한다고 했을 때, 등록할 때마다 새로운 모델을 훈련시키는 것은 불가능하다. 따라서 이미 훈련된 모델을 사용하여 사용자의 얼굴을 추론시키고, 이 때 추출되는 마지막 Vector를 시스템에 저장한다. 이후 사용자 인증 요청이 들어올 때, 현재 카메라에 잡히는 사람의 얼굴에서 추출된 Vector와 시스템에 등록된 사용자의 Vector를 비교하여 이미 등록된 사용자인지 아닌지를 유추할 수 있어야 한다. 이 때 사용되는 것이 Vector간의 유사도이다. 유사도에는 다양한 종류가 있지만, 그 중 MSE와 코사인 유사도를 간단하게 소개만 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; MSE 유사도는 벡터의 원소별로 차이를 구하고 이를 제곱한 뒤 이들의 평균을 구하는 것이다. 식은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpGe4w/btrrpUUhQbe/U4eaiC17p5u96lg46HxXxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpGe4w/btrrpUUhQbe/U4eaiC17p5u96lg46HxXxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpGe4w/btrrpUUhQbe/U4eaiC17p5u96lg46HxXxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpGe4w%2FbtrrpUUhQbe%2FU4eaiC17p5u96lg46HxXxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;75&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 코사인 유사도는 두 벡터간의 코사인 각도를 이용하여 유사도를 구하는 것이다. 즉 두 벡터의 방향이 동일하면 1, 직각이면 0, 반대면 -1을 나타낸다. 식은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBToPA/btrrqmpubOU/lyZQvVCWcehomUfFzWnPYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBToPA/btrrqmpubOU/lyZQvVCWcehomUfFzWnPYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBToPA/btrrqmpubOU/lyZQvVCWcehomUfFzWnPYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBToPA%2FbtrrqmpubOU%2FlyZQvVCWcehomUfFzWnPYK%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;780&quot; height=&quot;135&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;4. JPG vs PNG&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 사소한 이슈같으면서도 근본적인 이슈였다. 전처리 과정에서 numpy와 텐서프로를 통해 이미지의 픽셀값들을 조정한 다음 새롭게 이미지를 생성하는 과정이 있었다. 이 때 나는 아무런 의심 없이 JPG 파일로 변환했다. 그러나 내가 수정하고 추가한 픽셀 값들은 그대로 저장이 되지 않고, 약간씩 변형되어 저장이 되는 기이한 현상이 발생했다. 불행히도, 나는 당시에 발견하지 못하고 연구가 막바지에 다다를 당시에 이를 발견했다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;새&lt;/b&gt;&lt;b&gt;롭게 생성된 이미지를 조금 더 세세하게 관찰하였으면, 그래서 픽셀 값 자체를 대조해가며 꼼꼼하게 체크를 했으면 이 같은 상황을 방지할 수 있었을 텐데&lt;/b&gt;&lt;/span&gt;. 가장 아쉬운 부분 중 하나였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우선 JPG는 의외로 오래된 파일 포맷 중 하나이다. JPEG라고도 불리는데, 원래 이름이 JPEG이나 옛날 컴퓨터 파일의 포맷 이름이 3개의 문자로만 제한되는 시절에 이를 줄여서 JPG라고 지칭했다고 기억한다. JPEG는 일반적으로 다른 이미지 파일들보다 크기가 적은데, 이는 JPEG가 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;손실압축&lt;/b&gt;&lt;/span&gt; 방식이기 때문이다. JPEG 알고리즘에는 DCT(Discrete Cosine Transform)이라는 이산 코사인 변환을 적용한 뒤에 데이터를 줄이기 위해 양자화 과정을 거치는데, 양자화 과정에서 자연스러운 색상을 단순화시킨다고 한다. 이 때문에 데이터 손실이 발생하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 반면 PNG는 크기가 크지만 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;비손실압축&lt;/b&gt;&lt;/span&gt; 방식이다. 따라서 원본 자체가 훼손되는 일이 없다. 즉 앞으로 임의로 이미지를 저장할 일이 있다면 최대한 PNG로 저장하는 습관을 들여야 할 것 같다.&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;5. 데이터셋&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 데이터셋은 다음과 같은 데이터셋들을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 한국인 안면 이미지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://aihub.or.kr/aidata/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://aihub.or.kr/aidata/73&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642865971147&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;한국인 안면 이미지&quot; data-og-description=&quot;한국인 얼굴 특성에 맞는 각도, 조도, 가림, 표정, 해상도 등으로 한국형 얼굴 데이터 베이스를 구축한 이미지 데이터 제공&quot; data-og-host=&quot;aihub.or.kr&quot; data-og-source-url=&quot;https://aihub.or.kr/aidata/73&quot; data-og-url=&quot;https://aihub.or.kr/aidata/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJ6lzp/hyNajSaU03/gZD3B8GvgdaSZp1F7jtHN0/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/eGTCG/hyNawcS6mb/LLh7pxTW5YxgKedI8TSqE0/img.png?width=394&amp;amp;height=385&amp;amp;face=0_0_394_385,https://scrap.kakaocdn.net/dn/c0NX6j/hyNauTHQ3O/L6QUoygFE9X2VW8nyWFHm0/img.png?width=377&amp;amp;height=209&amp;amp;face=0_0_377_209&quot;&gt;&lt;a href=&quot;https://aihub.or.kr/aidata/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aihub.or.kr/aidata/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJ6lzp/hyNajSaU03/gZD3B8GvgdaSZp1F7jtHN0/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300,https://scrap.kakaocdn.net/dn/eGTCG/hyNawcS6mb/LLh7pxTW5YxgKedI8TSqE0/img.png?width=394&amp;amp;height=385&amp;amp;face=0_0_394_385,https://scrap.kakaocdn.net/dn/c0NX6j/hyNauTHQ3O/L6QUoygFE9X2VW8nyWFHm0/img.png?width=377&amp;amp;height=209&amp;amp;face=0_0_377_209');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;한국인 안면 이미지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한국인 얼굴 특성에 맞는 각도, 조도, 가림, 표정, 해상도 등으로 한국형 얼굴 데이터 베이스를 구축한 이미지 데이터 제공&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aihub.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 한국인 감정인식을 위한 복합 영상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://aihub.or.kr/aidata/27716&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://aihub.or.kr/aidata/27716&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642865987423&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;한국인 감정인식을 위한 복합 영상&quot; data-og-description=&quot;장면의 맥락 정보를 통한 감정 분석을 위한 얼굴 표정 이미지 데이터&quot; data-og-host=&quot;aihub.or.kr&quot; data-og-source-url=&quot;https://aihub.or.kr/aidata/27716&quot; data-og-url=&quot;https://aihub.or.kr/aidata/27716&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rbP7P/hyNaoeSwXb/rc7hQ3cPo99Sv0hMy7QL40/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300&quot;&gt;&lt;a href=&quot;https://aihub.or.kr/aidata/27716&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aihub.or.kr/aidata/27716&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rbP7P/hyNaoeSwXb/rc7hQ3cPo99Sv0hMy7QL40/img.png?width=400&amp;amp;height=300&amp;amp;face=0_0_400_300');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;한국인 감정인식을 위한 복합 영상&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;장면의 맥락 정보를 통한 감정 분석을 위한 얼굴 표정 이미지 데이터&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aihub.or.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CelebA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642866009010&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CelebA Dataset&quot; data-og-description=&quot;Details CelebFaces Attributes Dataset (CelebA) is a large-scale face attributes dataset with more than 200K celebrity images, each with 40 attribute annotations. The images in this dataset cover large pose variations and background clutter. CelebA has larg&quot; data-og-host=&quot;mmlab.ie.cuhk.edu.hk&quot; data-og-source-url=&quot;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&quot; data-og-url=&quot;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mmlab.ie.cuhk.edu.hk/projects/CelebA.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CelebA Dataset&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Details CelebFaces Attributes Dataset (CelebA) is a large-scale face attributes dataset with more than 200K celebrity images, each with 40 attribute annotations. The images in this dataset cover large pose variations and background clutter. CelebA has larg&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mmlab.ie.cuhk.edu.hk&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CelebA_Spoof&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://github.com/Davidzhangyuanhan/CelebA-Spoof&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Davidzhangyuanhan/CelebA-Spoof&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642866021819&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Davidzhangyuanhan/CelebA-Spoof: [ECCV2020] A Large-Scale Face Anti-Spoofing Dataset&quot; data-og-description=&quot;[ECCV2020] A Large-Scale Face Anti-Spoofing Dataset - GitHub - Davidzhangyuanhan/CelebA-Spoof: [ECCV2020] A Large-Scale Face Anti-Spoofing Dataset&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Davidzhangyuanhan/CelebA-Spoof&quot; data-og-url=&quot;https://github.com/Davidzhangyuanhan/CelebA-Spoof&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/baxiXf/hyNayBN5gt/FaXB1KjviopvHjXpAEkEnK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_106_1063_205&quot;&gt;&lt;a href=&quot;https://github.com/Davidzhangyuanhan/CelebA-Spoof&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Davidzhangyuanhan/CelebA-Spoof&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/baxiXf/hyNayBN5gt/FaXB1KjviopvHjXpAEkEnK/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_106_1063_205');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - Davidzhangyuanhan/CelebA-Spoof: [ECCV2020] A Large-Scale Face Anti-Spoofing Dataset&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[ECCV2020] A Large-Scale Face Anti-Spoofing Dataset - GitHub - Davidzhangyuanhan/CelebA-Spoof: [ECCV2020] A Large-Scale Face Anti-Spoofing Dataset&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;10K US Adult Face Database&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;a href=&quot;https://www.wilmabainbridge.com/facememorability2.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.wilmabainbridge.com/facememorability2.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642866280121&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Wilma Bainbridge&quot; data-og-description=&quot;10k US Adult Faces Database Main Citation: Bainbridge, W.A., Isola, P., &amp;amp; Oliva, A. (2013). The intrinsic memorability of face images. Journal of Experimental Psychology: General. Journal of Experimental Psychology: General, 142(4), 1323-1334. . (Related c&quot; data-og-host=&quot;www.wilmabainbridge.com&quot; data-og-source-url=&quot;https://www.wilmabainbridge.com/facememorability2.html&quot; data-og-url=&quot;https://www.wilmabainbridge.com/facememorability2.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.wilmabainbridge.com/facememorability2.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.wilmabainbridge.com/facememorability2.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Wilma Bainbridge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;10k US Adult Faces Database Main Citation: Bainbridge, W.A., Isola, P., &amp;amp; Oliva, A. (2013). The intrinsic memorability of face images. Journal of Experimental Psychology: General. Journal of Experimental Psychology: General, 142(4), 1323-1334. . (Related c&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.wilmabainbridge.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;&lt;b&gt;아쉬웠던 점&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 표정 인식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 표정 인식을 위해 얼굴의 Keypoint를 추출하여 사용하였는데, 이 keypoint들을 조금 더 제대로 활용할 수 있지 않았을까 하는 아쉬움이 남는다. keypoint들을 단순히 CNN을 사용하지 않고, Keypoint들만을 위한 별도의 모델을 만들어서 궁극적으로 멀티모달 형태의 모델을 만들 수 있었으면 조금 더 좋은 결과가 나올 수 있지 않았을까? 물론 결과가 좋았을 것이라는 장담은 없다. 그러나 한 번쯤 해볼만한 시도였다고 생각한다. 예를 들어 Keypoint들을 시계열 데이터로 보고 RNN을 적용해본다던가 Transformer를 적용해 볼 수도 있지 않았을까 싶다. 다만, 당시에는 이에 대한 지식이 너무 적었고, 새로운 시도를 해 볼만한 시간적 여유가 없었다(과제 마감일). 그래도 역시 가장 큰 이유는 내가 준비가 덜 된 상태였다는 것이다. NLP 쪽에 대한 지식이 조금만 있었더라도 시도해봤을 법한데, 이에 대한 아쉬움이 가장 크게 남는다.&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;2. 모델 크기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 정확히는 모델의 파라미터 수이다. 기존 MobilenetV2는 모델에 들어가는 파라미터의 수가 3,000,000개이다. VGG16의 파라미터 수가 약 27,000,000임을 감안하면, 굉장히 적은 파라미터 개수라고 말할 수 있다. 이 때문에 이름도 Mobilenet이라고 붙인 것 같고, 그만큼 모바일 기기에서 모델을 사용한 추론이 수월하다는 뜻일 것이다. 우리가 만들어낸 모델은 30,000,000개가 넘는 파라미터가 사용되었다. 그렇기 때문에 모바일 환경에서 기대했던 것만큼 원활하게 돌아가지 않았다. 물론 Tensorflow lite로 변환하는 과정에서 이 파라미터 수는 현저히 낮아졌을 것이다. 그러나 만약 tflite로 변환하기 전에도 파라미터의 수를 줄일 수 있었다면 결과는 더 좋지 않았을까. 그러나 모델의 크기를 줄이는 가지치키나 양자화에 대한 개념이 전무했던 나로서는 불가능한 작업이였다. 시간 관계상 이에 대한 공부를 진행하기도 힘들었다.&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 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;&amp;nbsp; 이 외에도 여러가지 사건사고가 있었지만(사고라기보다는, 연구 과정에서의 Issue...) 크게 중요한 부분은 대체로 적은 것 같다. 가끔 들어와서 그 당시 내가 어떤걸 잘 못했었고, 어떻게 해결했었고, 무엇을 배웠었는지를 되짚어본다면 좋은 공부가 되지 않을까 싶어서 포스팅을 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 연구실에서의 경험은 정말 인생에 남을 만큼 좋은 경험들로만 가득 차있다. 딥러닝에 대해서 다시 한번 자세히 공부할 수 있는 기회도 있었고, 연구 과정에서 겪은 여러 Issue들과 이를 통해 기대한 것보다 더 큰 성장을 이룰 수 있었던 것 같다. 무엇보다 너무나도 친절하고 재밌었던, 그리고 많은 도움을 준 연구실 사람들에게 감사한다. 학부연구생 기회를 주신 교수님께도 아마 평생을 감사하지 않을까 싶다.&lt;/p&gt;</description>
      <category>후기</category>
      <category>AI</category>
      <category>AI보안</category>
      <category>딥러닝</category>
      <category>연구실</category>
      <category>학부연구생</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/39</guid>
      <comments>https://mountain96.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 23 Jan 2022 01:11:18 +0900</pubDate>
    </item>
    <item>
      <title>[논문 구현] VGG19(ICLR 2015) 구현</title>
      <link>https://mountain96.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mountain96.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.09.06 - [논문 리뷰/CV] - [논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631775092637&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰&quot; data-og-description=&quot;서론 1. 배경 Convolutional networks(ConvNets)는 대용량 이미지 및 영상 인식에서 큰 발전을 이룩하였는데, 이는 ImageNet과 같은 대용량 공공 이미지 데이터셋이 가능해지고, GPU와 같은 고성능 컴퓨팅 시&quot; data-og-host=&quot;mountain96.tistory.com&quot; data-og-source-url=&quot;https://mountain96.tistory.com/37&quot; data-og-url=&quot;https://mountain96.tistory.com/37&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bYqwZF/hyLCJqIYyZ/8xxprlEMu5WNBQQQfLlrOk/img.png?width=800&amp;amp;height=769&amp;amp;face=0_0_800_769,https://scrap.kakaocdn.net/dn/yY5Ya/hyLCvsq5tG/Lq5dDAYnlnKeGS7riuYq9K/img.png?width=800&amp;amp;height=769&amp;amp;face=0_0_800_769,https://scrap.kakaocdn.net/dn/bP2myB/hyLCzIokVd/7xoeKUzUFDBawB8ggz5R3k/img.png?width=885&amp;amp;height=851&amp;amp;face=0_0_885_851&quot;&gt;&lt;a href=&quot;https://mountain96.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mountain96.tistory.com/37&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bYqwZF/hyLCJqIYyZ/8xxprlEMu5WNBQQQfLlrOk/img.png?width=800&amp;amp;height=769&amp;amp;face=0_0_800_769,https://scrap.kakaocdn.net/dn/yY5Ya/hyLCvsq5tG/Lq5dDAYnlnKeGS7riuYq9K/img.png?width=800&amp;amp;height=769&amp;amp;face=0_0_800_769,https://scrap.kakaocdn.net/dn/bP2myB/hyLCzIokVd/7xoeKUzUFDBawB8ggz5R3k/img.png?width=885&amp;amp;height=851&amp;amp;face=0_0_885_851');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서론 1. 배경 Convolutional networks(ConvNets)는 대용량 이미지 및 영상 인식에서 큰 발전을 이룩하였는데, 이는 ImageNet과 같은 대용량 공공 이미지 데이터셋이 가능해지고, GPU와 같은 고성능 컴퓨팅 시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mountain96.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Dataset&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;631&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vw5u8/btrfhfveCim/LKHQfDW02vt2285vKQmLgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vw5u8/btrfhfveCim/LKHQfDW02vt2285vKQmLgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vw5u8/btrfhfveCim/LKHQfDW02vt2285vKQmLgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVw5u8%2FbtrfhfveCim%2FLKHQfDW02vt2285vKQmLgk%2Fimg.png&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;631&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;데이터셋은 CIFAR-10을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CIFAR-10은 총 60,000장(50000 train, 10000 test)의 데이터셋이 있으며, 각 이미지는 32x32사이즈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;train set 중 5000장은 validation set으로 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이를 Tensorflow가 사용하기 용이한 Dataset으로 변환해준다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Data/Input pipeline&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;759&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by3Bli/btrfhb0Mbg2/ErSJiIYJKZyy12LRCPfekK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by3Bli/btrfhb0Mbg2/ErSJiIYJKZyy12LRCPfekK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by3Bli/btrfhb0Mbg2/ErSJiIYJKZyy12LRCPfekK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby3Bli%2Fbtrfhb0Mbg2%2FErSJiIYJKZyy12LRCPfekK%2Fimg.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;759&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;이후 각 Dataset이 사용될 때 이미지 전처리, shuffle, batch를 사용할 수 있도록 세팅한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1. 이미지 전처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이미지 전처리는 standardization과 resize를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 때 .map(map_function)을 사용하는데, 각 이미지별로 매핑될 함수를 지정하는 함수이다. 이 때 들어가는 함수의 매개변수는 Dataset을 생성할때 입력한 매개변수와 같다(이 경우 image, label)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; standardization : 이미지의 픽셀값들이 평균 0, 분산 1 범위로 정규화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; resize : 32x32x3의 이미지를 VGG에 맞게 224x224x3의 이미지로 변환한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2. shuffle&lt;/h3&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; .shuffle()함수를 사용하는데, 이 때 buffer_size를 해당 Dataset크기로 지정해줄 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; buffer_size는 전체 개수에서 buffer_size만큼만 고른 뒤, 이 중에서 랜덤으로 몇 개를 지정해서 훈련에 사용하는 것이다. 그렇기 때문에 이 값이 Dataset의 크기보다 작다면, 그 훈련에 사용되지 않는 이미지가 존재하게 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3. batch&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 말 그대로 batch를 어떻게 나눌지를 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; batch_size로 size를 지정할 수 있으며, drop_remainder는 Dataset을 batch_size만큼 나누다 보면 마지막에 batch_size보다 적은 개수의 데이터들이 남게 될 텐데, 이들을 어떻게 처리할지에 대한 매개변수이다. 만약 True를 준다면 나머지 데이터들은 버린다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Model Build&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;755&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t9GnK/btrfbB7R7CE/IW9rq4JC2zRBmYXKnu8No1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t9GnK/btrfbB7R7CE/IW9rq4JC2zRBmYXKnu8No1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t9GnK/btrfbB7R7CE/IW9rq4JC2zRBmYXKnu8No1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft9GnK%2FbtrfbB7R7CE%2FIW9rq4JC2zRBmYXKnu8No1%2Fimg.png&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;755&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;&amp;nbsp; Model 구성은 위와 같다.(자세한 내용은 논문리뷰 참조)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 때 Conv2D를 쌓을 때 stride와 activation을 지정하지 않아서 애먹었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Keras의 Conv2D는 stride를 지정하지 않으면 디폴트 (1,1)이 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; activation은 지정하지 않으면 활성화함수가 없이 None이 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그렇기 때문에 activation만큼은 절대 잊지 말고 지정해줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;830&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CO0lZ/btrfhpj7srl/YQx8ixMXd3o8uFJNHzuSd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CO0lZ/btrfhpj7srl/YQx8ixMXd3o8uFJNHzuSd1/img.png&quot; data-alt=&quot;직접 작성한 VGG 19 Summary&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CO0lZ/btrfhpj7srl/YQx8ixMXd3o8uFJNHzuSd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCO0lZ%2Fbtrfhpj7srl%2FYQx8ixMXd3o8uFJNHzuSd1%2Fimg.png&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;830&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;직접 작성한 VGG 19 Summary&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;810&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/No4UI/btrfhqi1FHP/teaLufShIoJFlkO1OaI931/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/No4UI/btrfhqi1FHP/teaLufShIoJFlkO1OaI931/img.png&quot; data-alt=&quot;Keras에서 불러온 VGG19 Summary&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/No4UI/btrfhqi1FHP/teaLufShIoJFlkO1OaI931/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNo4UI%2Fbtrfhqi1FHP%2FteaLufShIoJFlkO1OaI931%2Fimg.png&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;810&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;Keras에서 불러온 VGG19 Summary&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 위 그림들은 내가 작성한 VGG19와 Keras에서 불러온 VGG19를 비교한 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 파라미터 개수의 차이는 마지막 Prediction Layer에서 10과 1000개의 차이일 뿐, 만약 똑같이 1000으로 설정하면 파라미터 개수가 동일하다는 것을 확인하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 한 가지 의문이 들었던 것은, Keras에서는 FC layer 다음에 Dropout이 명시되지 않았던 점이다. 이 때문에 다시 논문을 뒤져봤으나, 역시 처음 두 개의 FC Layer 다음에 0.5 비율로 Dropout을 적용했다고 나와 있었다. Keras에서는 Functional API를 사용했는데, 이 때문에 Dropout이 명시되지 않은 건지도 모르겠다.(실제로, Keras에서 로드한 모델의 첫 부분에는 InputLayer가 존재하지만 Sequential로 모델을 쌓을 때는 InputLayer를 입력해도 summary()에서는 명시되지 않았었다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Model Fit&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;517&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5qqqm/btrfh4GC2FY/XhC8JvfPIgFftt3jg3BcC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5qqqm/btrfh4GC2FY/XhC8JvfPIgFftt3jg3BcC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5qqqm/btrfh4GC2FY/XhC8JvfPIgFftt3jg3BcC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5qqqm%2Fbtrfh4GC2FY%2FXhC8JvfPIgFftt3jg3BcC1%2Fimg.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;517&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;&amp;nbsp; 결과를 모니터링할 수 있게 callbacks.TensorBoard를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 논문에서는 validation_accuracy가 증가하지 않으면 learning rate를 0.1배 시켰다고 나왔다. 나같은 경우는 2 에포크동안 증가하지 않으면 0.1배 시키도록 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한 논문에서와 마찬가지로 momentum=0.9를 준 SGD를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 결과는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;681&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KaP2s/btrfhI4Okjo/Jp6N27JKrUyClTomxqjTc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KaP2s/btrfhI4Okjo/Jp6N27JKrUyClTomxqjTc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KaP2s/btrfhI4Okjo/Jp6N27JKrUyClTomxqjTc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKaP2s%2FbtrfhI4Okjo%2FJp6N27JKrUyClTomxqjTc1%2Fimg.png&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;681&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;&amp;nbsp; 마지막 Validation Accuracy는 0.7을 조금 넘은 상태로 수렴했다. 그러나 Loss를 보면 10 에포크부터 Overfitting이 일어났음을 알 수 있다. 왜 Overfitting이 일어났을지 생각해봤는데, 아무래도 이미지 사이즈를 억지로 늘린 것에서 큰 영향이 있지 않을까 싶다. 애초에 32x32 사이즈의 이미지이고, 여기에 적용하기에 VGG19는 너무 깊은 모델이기 때문이다. 이를 224x224로 늘린다 하여도 유용한 데이터가 증가하지는 않았을 것이다. 네트워크의 깊이를 조금 더 줄인다면 보다 괜찮은 정확도 나올 것으로 예상한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1409.1556&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/1409.1556&lt;/a&gt;&lt;/p&gt;</description>
      <category>논문 리뷰/CV</category>
      <category>VGG</category>
      <category>논문구현</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/38</guid>
      <comments>https://mountain96.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 16 Sep 2021 16:17:18 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] VGG16(ICLR 2015) 요약 및 리뷰</title>
      <link>https://mountain96.tistory.com/37</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; Convolutional networks(ConvNets)&lt;/span&gt;&lt;span&gt;는 대용량 이미지 및 영상 인식에서 큰 발전을 이룩하였는데&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이는 &lt;/span&gt;&lt;span&gt;ImageNet&lt;/span&gt;&lt;span&gt;과 같은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;대용량 공공 이미지 데이터셋&lt;/b&gt;&lt;/span&gt;이 가능해지고&lt;/span&gt;&lt;span&gt;, GPU&lt;/span&gt;&lt;span&gt;와 같은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;고성능 컴퓨팅 시스템&lt;/span&gt;&lt;/b&gt;이 등장했으며&lt;/span&gt;&lt;span&gt;, ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)&lt;/span&gt;&lt;span&gt;와 같은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;대회&lt;/b&gt;&lt;/span&gt;가 있었기 때문에 가능했다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; ConvNets&lt;/span&gt;&lt;span&gt;이 사람들에게서 자주 사용됨에 따라&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;기존의 큰 성공을 거두었던 &lt;/span&gt;&lt;span&gt;AlexNet&lt;/span&gt;&lt;span&gt;에서 이를 더 발전시키기 위한 여러 시도들이 나타났다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그 시도들에서 성공한 케이스들 중 하나는, 첫 번째 convolutional layer에서의 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;작은 receptive window 와 작은 stride&lt;/span&gt;&lt;/b&gt;를 사용했다. 또 다른 케이스에서는 이미지 전체와 다중 스케일에 관해서 밀접하게 모델을 훈련시키고 테스트하는 것을 시도했다. 이번 논문에서는, ConvNet의 또 다른 면모인 &quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;깊이&lt;/b&gt;&lt;/span&gt;&quot;에 대해서 다루고자 한다. 마지막에는 파라미터를 고정하고 오로지 네트워크의 층(convolutional layer)만을 늘리는데, 이는 굉장히 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;작은 convolution filter(3x3)&lt;/span&gt;&lt;/b&gt;을 모든 레이어에서 사용하기 때문에 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; 결과적으로, ConvNet 구조를 발전시켜서 ILSVRC에서 SOTA(state-of-the-art)를 달성했으며, 다른 데이터셋에서도 충분한 성능을 발휘했다. 특히, 다른 데이터셋에서의 간단한 파이프라인에서조차 뛰어난 성능을 발휘했다(예를 들어, linear SVM without fine-tuning)&lt;/span&gt;&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;본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. ConvNet 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ConvNet이 향상했다는 것을 측정하기 위해, 모든 ConvNet layer는 같은 원칙으로 디자인되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;851&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FCM6R/btrduINTZjD/EkAlqLcL77xqHEYAKSOEj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FCM6R/btrduINTZjD/EkAlqLcL77xqHEYAKSOEj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FCM6R/btrduINTZjD/EkAlqLcL77xqHEYAKSOEj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFCM6R%2FbtrduINTZjD%2FEkAlqLcL77xqHEYAKSOEj0%2Fimg.png&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;851&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;h4 data-ke-size=&quot;size20&quot;&gt;2-1. 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ConvNet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;Input&lt;/b&gt; : 224 x 224 RGB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;Preprocess&lt;/b&gt; : Training set의 각 픽셀에 RGB의 평균 값을 빼주는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;Conv. filter&lt;/b&gt; : 3x3. 한 configuration에서는 1x1를 사용하여 input channel을 선형변환(linear transformation)했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;Conv. stride&lt;/b&gt; : 1pixel&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;padding&lt;/b&gt; : Conv. layer를 지날 때 data의 크기가 변하지 않도록 padding을 주었다. ex) 3x3 filter라면 padding = 1pixel&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;pooling&lt;/b&gt; : 5개의 max-pooling layer가 있으며, 모든 Conv. layer에 붙은 것이 아니다. pooling은 2x2 사이즈의 window로 진행되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;FC Layer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 3개의 FC layer가 있으며, 처음의 두 개는 4096 차원이고, 마지막 하나는 1000차원이다(ILSVRC의 클래스 개수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 마지막 layer는 soft-max layer이며, 모든 네트워크에 대해서 FC Layer부분은 전부 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 외&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 모든 hidden layer들은 ReLU를 사용했으며, 한 네트워크를 제외한 나머지 모든 네트워크들은 LRN(Local Response Normalization)을 사용하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 이후 LRN이 성능을 향상시키지 못할 뿐더러, memory 사용량과 시간비용을 증가시킨다는 것을 설명한다.&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;2-2. Configuration&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;모델들을 A-E까지 총 6개로 나누어서 비교했으며, 모든 모델의 configuration은 같고, 오직 깊이만이 다르다.(11 layers -&amp;gt; 19 layers)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델의 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;width&lt;/b&gt;&lt;/span&gt;(channel 수)는 적은 편인데, 첫 번째 layer에서 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;64로 시작해서, 최대 512&lt;/span&gt;&lt;/b&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;2-3. Discussion&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 첫 번재 레이어에서 큰 receptive field를 쓰는 대신 3x3 의 작은 receptive field를 사용했다. 이렇게 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3x3의 작은 필터를 사용해서 여러 층을 구성하면 7x7과 같은 큰 필터를 사용해서 한 층에 끝내는 것보다 여러 이점이 있다.&lt;/span&gt;&lt;/b&gt; 첫 번째 이점은 3개의 비선형 레이어를 추가시킴으로써 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;비선형성을 증가&lt;/span&gt;&lt;/b&gt;시켜 모델이 더 잘 구분하도록 돕는다. 두 번째 이점은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;파라미터의 개수&lt;/span&gt;&lt;/b&gt;다. 만약 input, output의 channel 수가 C라고 하면, 3x3으로 3개의 layer를 쌓았을 때의 파라미터 개수는 3(3x3xCxC) = 27C^2이다. 반면, 7x7일 경우 7x7xCxC = 49C^2이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또 주목해볼만한 정믄 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1x1 conv. layer&lt;/span&gt;&lt;/b&gt;를 사용했다는 점이다. 1x1 conv. layer는 채&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;널수조정, 계산량 감소, 비선형성 증가&lt;/span&gt;&lt;/b&gt; 등 여러 이점이 있는데, 이 중 논문에서는 비선형성 증가에 중점을 두었다. 1x1 conv. layer는 receptive field를 건드리지 않고 비선형성을 증가시키는 좋은 방법이다. 물론 위 네트워크에서는 1x1 conv. layer를 사용함에 따른 깊이의 변화가 일어나지 않지만, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;rectification function(아마 ReLU를 지칭하는 듯하다)를 추가함으로써 비선형성이 증가한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 여러 다른 논문들에서 공통점과 차이점을 찾을 수 있는데, 한 논문에서는 첫 번재 layer에 작은 convolution filter를 사용했지만 위 네트워크만큼 깊이 구성하지 못했고 ILSVRC같은 대용량 이미지에 적용하지 못했다. 또 다른 논문에서는 깊은 ConvNet을 사용하여(11 layers) 이 &quot;깊이&quot;가 모델 성능 향상에 기여한다는 것을 밝혔다. 마지막으로 GoogLeNet의 경우 이 논문과 독립적으로 만들어졌지만 모델이 깊다는 점, 그리고 작은 convolution filter를 사용한다는 점에서는 비슷하다. 그러나 GoogLeNet의 배치 혹은 구조(==topology)가 보다 복잡하고, 첫 번째 layer에서 feature map의 크기를 더 과가함게 줄임으로써 계산량을 더욱 감소시켰다.&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. 구현&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1. 훈련(Train)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전반적인 훈련은 기존 AlexNet을 따르며, 이미 전처리 부분만 조금 다르다.&lt;/p&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; - Optimization : multinomial logistic regression / &lt;b&gt;mini-batch gradient descent with momentum&lt;/b&gt; (batch size : 256, momentum : 0.9)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Regularization : weight decay(L2 Norm with 5*10^-4)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - dropout : 0.5(첫 두 개의 FC Layer에 적용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - learning rate : 초기 0.01, 이후 validation accuracy가 증가하지 않으면 lr /= 10. 으로 설정하여 최종적으로 3번 갱신됨(최종 lr : 0.00001)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 74 epochs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 위 네트워크는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;기존 AlexNet보다 더 많은 파라미터와 깊은 네트워크였음에도 불구하고 수렴하기까지 더 적은 에포크가 필요&lt;/span&gt;&lt;/b&gt;했는데, 그 이유로 2가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 첫 번째는 더 깊어진 깊이와 작아진 conv. filter로 인해 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;암묵적(?)으로 적용된 정규화(regularization)&lt;/span&gt;&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 번째는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;몇몇 레이어들에 대한 초기화 작업&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가중치가 나쁘게 초기화되면 깊은 네트워크에서 불안정한 수치 및 기울기로 인해 학습에 안좋은 영향을 끼치는데, 이 때문에 가중치의 초기화가 중요하다. 이처럼 나쁜 초기화를 피하고자 본 논문에서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;configuration A(A 네트워크)를 먼저 학습&lt;/b&gt;&lt;/span&gt;시켰다. 왜냐하면 A 네트워크는 상대적으로 얕기 때문에 무작위 초기화(random initialization)로도 충분히 성능을 낼 수 있기 때문이다. A 네트워크 훈련 이후로 더 깊은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;타 네트워크들을 훈련할 때에는 초기 4개의 convolutional layer와 마지막 3개의 FC layer를 A 네트워크에서 가져와서 초기화하였고, 나머지 중간 레이어들은 랜덤하게 초기화&lt;/b&gt;&lt;/span&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Learning rate의 경우 특별히 인위적으로 줄이진 않았고, 위에서 언급한 것처럼 학습 도중에 줄어들게 설정했다. A네트워크와 타 네트워크의 중간 레이어들에서 랜덤하게 초기화할 때는, [mean=0, var=0.01]인 정규분포에서 샘플링했고 bias는 0으로 설정했다. 그러나 논문 발표 이후 가중치 초기화에 효과적인 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Xavier(Glorot) initialization&lt;/span&gt;&lt;/b&gt;을 알게 되었고 이를 사용할 수 있음을 언급했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이미지 전처리는 244x244사이즈로 맞추기 위해 진행된다. 또한 이미지 증강으로는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;랜덤 좌우반전&lt;/span&gt;&lt;/b&gt;과, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;랜덤 RGB color shift&lt;/b&gt;&lt;/span&gt;가 적용되었다. 이미지 사이즈의 경우 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;최소 256에서 최대 512까지 이미지 크기를 랜덤하게 변환하고, 변환된 이미지에서 객체가 포함된 224x224부분의 이미지를 crop&lt;/b&gt;&lt;/span&gt;하여 사용하였다. 이 때 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;크기 변환을 작게 할 경우(e.g 256) 객체의 전체 크기에 대한 특징을 추출하기에 용이&lt;/span&gt;&lt;/b&gt;하고, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;크게 변환할 경우(e.g 512) 224x224로 crop되는 부분이 객체의 부분에 한정되기 때문에 보다 부분적이 특징을 추출하기에 용이&lt;/b&gt;&lt;/span&gt;해진다. 이처럼 다양한 스케일로 이미지 크기를 변환하여 샘플링한 경우가 하나의 스케일로 이미지를 변환하여 샘플링한 경우보다 분류 정확도가 높았다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-2. Testing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 테스트 시, Single scale과 Multi-scale로 나누었는데, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Single scale의 경우 하나의 사이즈로 고정하여 test 이미지들을 rescale&lt;/b&gt;&lt;/span&gt;해주었다. 다만, 이 rescale에 사용되는 비율은 train과 다를 수 있음에 유의하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Multi-scale&lt;/b&gt;&lt;/span&gt;의 경우 모델 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;네트워크 뒤의 FC Layer들을 Convolutional layer로 변환하여 Fully Convolutinal Network(FCN)&lt;/b&gt;&lt;/span&gt;로 만들었다. 이 때 첫 번째 FC layer는 7x7 conv. filter를 사용하고, 나머지는 1x1 conv. filter를 사용했다. 이렇게 해서 모든 이미지를 crop하지 않고 테스트할 수 있었고, 고정된 크기의 class score에 대한 vector를 얻기 위해 결과물인 class score map은 spatially averaged되었다. 또한 test set은 좌우반전하여 증강시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; FCN이 적용되었기 때문에 crop을 할 필요가 없어&lt;/span&gt;&lt;/b&gt;진다. 사실 crop을 하는 편이 정확도가 높아지기는 한다. 또한, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;multi-crop evaluation은 dense evaluation에 대해 상호보완적으로 작용&lt;/span&gt;&lt;/b&gt;하는데, 왜냐하면 multi-crop evaluation의 경우 crop 될 때&amp;nbsp; convolved feature map이 0으로 padding(zero-padding)되지만, dense evaluation의 경우 crop 될 때 이웃하는 픽셀들에 따라서 padding되기 때문이다. 이렇듯 crop은 시간이 많이 걸리지만 그만큼 정확도가 높아질 수 있다. 그럼에도 불구하고 논문 저자들은 걸리는 시간 비용 때문에 이것이 그만큼 실용적이라고 생각하지는 않는다.(라고 해석했다...조금 어렵다 이부분이..ㅠ) 그래도 본 논문의 모델을 증명하고자 네트워크를 한 scale마다 50crop으로 나누어서(5 x 5, 2flips) 총 3 scale에 대해 150개의 crop을 만들었다.&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;3-3. Detail&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; C++ Caffe toolbox로 작성함(다수의 수정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 여러 GPU를 사용했으며 이를 통해 데이터병렬화를 거쳤고, 각 batch마다 할당된 데이터들을 여러 GPU에 분산해서 계산했다. 이후 나온 결과들은 평균화된 뒤 합쳐져서 full batch에 적용되었기 때문에 하나의 GPU를 사용한 것과 결과는 똑같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ConvNet의 훈련 속도를 향상시키기 위한 방법들이 여러 논문에서 제시되었는데, 본 모델에서는 이미 기존보다 약 3.75배 빠른 속도로 훈련할 수 있는 기법을 사용하고 있었으므로 따로 사용하지 않았다. 사용한 GPU는 4개의 NVIDIA Titan black GPU이며, 하나의 네트워크를 훈련하는데 약 2~3주가 걸렸다.&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. 실험&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 데이터셋 : ILSVRC 사용. Training(1.3M), Validation(50K), Test(100K)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-1. Single Scale Evaluation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rHl7w/btrdIT1BgFL/ksvrORyR9RIOmXyWaLGcO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rHl7w/btrdIT1BgFL/ksvrORyR9RIOmXyWaLGcO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rHl7w/btrdIT1BgFL/ksvrORyR9RIOmXyWaLGcO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrHl7w%2FbtrdIT1BgFL%2FksvrORyR9RIOmXyWaLGcO0%2Fimg.png&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;294&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;&amp;nbsp; 앞서 언급한 것처럼, 본 논문은 Evaluation을 할 때 Single Scale 과 Multi-Scale로 나누어서 진행했다. 이는 Test 시 이미지의 크기를 하나로 고정할지, 또는 여러개를 사용할지를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Train 할 때도 이미지를 하나의 사이즈로 고정하기도 하고, 여러 사이즈로 스케일을 다양하게 해서 훈련하기도 하고 했다. 이 때 사용되는 rescale 비율을 S라고 하고, Test에 사용되는 rescale 비율을 Q라고 하자. 고정된 S로 훈련된 모델의 경우 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Q=S&lt;/b&gt;&lt;/span&gt;로 설정했고, S가 계속 변화한다면 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Q = 0.5 * (S_min + S_max)&lt;/span&gt; &lt;/b&gt;로 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 첫 번째로, A네트워크와 A-LRN네트워크를 비교한 결과 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;LRN이 성능 향상에 도움을 주지 못한다&lt;/b&gt;&lt;/span&gt;는 것을 알 수 있다. 그렇기 때문에 이후 더 깊은 네트워크들에서는 LRN을 사용하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 번째로, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ConvNet의 깊이가 깊어짐에 따라 Classification error가 낮아지는 것을 확인&lt;/span&gt;&lt;/b&gt;할 수 있다. 특이하게도, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;C와 D는 깊이가 같지만 성능은 D가 더 좋다&lt;/span&gt;&lt;/b&gt;. C는 3개의 1x1 conv. layer를 사용했고, D는 오로지 3x3 conv.layer만을 사용했다. 이를 통해 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;추가적인 비선형성이 도움이 되기는 하지만, 필요한 만큼의 receptive field를 사용하여 공간적인 특징을 잘 잡아내는 것도 중요하다&lt;/span&gt;&lt;/b&gt;는 것을 알 수 있다. 본 구조에서는 19layer 이후부터는 error rate가 급증하지만, 더 큰 데이터셋에서는 더 깊은 모델이 잘 작동할 수도 있다고 언급한다. 추가적으로 B네트워크와 이보다 조금 더 얕은 네트워크(B네트워크에서 두 개의 3x3 conv. layer를 하나의 5x5 conv.layer로 바꾼 네트워크)를 만들어서 비교했었는데, 더 얕은 네트워크의 top-1 error가 B네트워크보다 7%가량 더 높았다. 이를 통해 [deep network + small filter]가 [shallow net + large filter]보다 더 성능이 좋다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 마지막으로, 훈련 시 이미지 스케일에 변화를 주는 것(S = 256 ~ 512)이 스케일을 고정하는 것보다 훨씬 더 성능을 높여준다는 것을 확인하였다. 이를 통해 훈련 시 스케일 변화(scale jittering)를 사용한 데이터 증강이 도움이 된다는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-2. Multi-Scale Evaluation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;249&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBmG4O/btrdDJ6yWuy/JcpVodw7d1zhnm5Gkr35T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBmG4O/btrdDJ6yWuy/JcpVodw7d1zhnm5Gkr35T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBmG4O/btrdDJ6yWuy/JcpVodw7d1zhnm5Gkr35T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBmG4O%2FbtrdDJ6yWuy%2FJcpVodw7d1zhnm5Gkr35T1%2Fimg.png&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;249&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;&amp;nbsp; 이번에는 test시 스케일 변화를 준 경우이다. 만약 훈련에서 사용된 스케일이 고정된 경우, 너무 지나친 스케일 변환은 성능을 크게 떨어뜨린다는 것을 확인하였다. 따라서, 훈련에서 사용된 스케일이 고정된 경우, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Q = {S - 32, S, S + 32}&lt;/span&gt;&lt;/b&gt; 이 3가지비율로 변화되었다. 훈련에서 사용된 스케일이 변화하는 경우, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Q = {S_min, 0.5(S_min + S_max), S_max}&lt;/b&gt;&lt;/span&gt; 이 3가지로 변화되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 결과를 보면, test 시 스케일 변화를 주는 것이 성능 향상에 도움이 된다는 것을 알 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-3. Multi-Crop Evaluation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;187&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DuWNT/btrdJ4IlHdo/BrknXWrk3VslJ8NuosEDRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DuWNT/btrdJ4IlHdo/BrknXWrk3VslJ8NuosEDRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DuWNT/btrdJ4IlHdo/BrknXWrk3VslJ8NuosEDRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDuWNT%2FbtrdJ4IlHdo%2FBrknXWrk3VslJ8NuosEDRk%2Fimg.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;187&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;&amp;nbsp; 이번에는 Multi-crop evaluation과 Dense-evaluation, 그리고 이 두 경우를 합한 경우를 비교해본다. 앞에서 언급한 것처럼, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;두 경우는 서로 상호보완적이기 때문에 합할 때 각 모델의 softmax값을 평균해줌으로써 두 모델을 합했다&lt;/span&gt;&lt;/b&gt;고 한다. 결과에서 알 수 있듯이, multi-crop의 성능이 약간 더 좋았고, 이보다 더 좋은 건 두 경우를 합한 경우였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-4. Convent Fusion(앙상블)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;224&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwAaf9/btrdDw7GuJB/U1K10zKfPw2lDRUpjUsfu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwAaf9/btrdDw7GuJB/U1K10zKfPw2lDRUpjUsfu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwAaf9/btrdDw7GuJB/U1K10zKfPw2lDRUpjUsfu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwAaf9%2FbtrdDw7GuJB%2FU1K10zKfPw2lDRUpjUsfu0%2Fimg.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;224&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;&amp;nbsp; 앙상블을 통해 모델끼리 서로 상호보완적으로 작동하여 성능이 높아진다는 논문이 있었다. 이를 사용하여 Single scale 모델 6개와 multi-scale 모델 D를 합쳤고, 그 결과 ILSVRC에서 7.3%의 test error를 기록했다. 기록 이후 따로 또 실험을 했는데, multi-scale모델에서 가장 성능이 좋았던 두 모델 D, E를 사용하여 앙상블을 한 결과 test error 7.0%를 달성했다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4-5. SOTA와의 비교&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;352&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Akaen/btrdEj1joNF/w5ztYfIA5Xu8Il5stQhomk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Akaen/btrdEj1joNF/w5ztYfIA5Xu8Il5stQhomk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Akaen/btrdEj1joNF/w5ztYfIA5Xu8Il5stQhomk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAkaen%2FbtrdEj1joNF%2Fw5ztYfIA5Xu8Il5stQhomk%2Fimg.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;352&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;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;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 논문에서는 deep convolutional networks(최대 19 layer)를 보여주었다. 이를 통해 모델의 &quot;깊이&quot;가 classification 성능에 굉장히 유익하다는 것을 알 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet에 이은 두 번째 딥러닝 네트워크인 VGG 이다. 겉으로 보기에는 단순히 &quot;깊이만 증가시켰더니 모델의 성능이 좋아졌다!&quot; 라고도 보였는데, 그 안의 내용들을 읽으면서 연결되어 있는 많은 개념들을 따로 공부할 기회가 있었다.(물론 논문 자체에서도 배울 점이 많았다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 논문과 연계되어 따로 공부한 것들에는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;1. 비선형성의 증가가 좋은 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 2. 1x1 convolution의 필요성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 3. 가중치 초기화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 4. Fully Convolutional Network(FCN)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가 있다. 이 중 4번은 따로 논문 리뷰를 해야 할 것 같다. 그 외 1~3번 같은 경우 시간이 나면 따로 정리를 해볼 예정이다. 지금 포스팅은 논문에 관한 리뷰이니 이것들은 넘어가도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우선 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;VGG의 핵심은 convolutional layer에서 사용된 3x3 필터&lt;/span&gt;&lt;/b&gt;인 것 같다. 사실 AlexNet을 만든 사람들도 모델을 더 깊게 만들고 싶었을 것이다.(개인적인 추측이다..) 그러나 현실적으로 너무나도 많은 파라미터와 오랜 학습시간으로 인해 그들이 찾은 절충안이 7-layer일 것이다. 그러나 VGG에서는 이를 뛰어넘어 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;최대 19layer까지 만들어냈다. 이를 가능하게 한 것은 3x3 conv. filter&lt;/span&gt;&lt;/b&gt;이다. 모든 conv. layer에서 3x3 사이즈의 필터를 사용했기에 파라미터수가 지나치게 크지 않았고, 그 때문에 모델을 깊게 구성할 수 있었다. 이와 연관지어 설명한 (3x3 filter x 3 VS 7x7 filter x 1) 부분이 인상깊다. 그들은 3x3 filter를 사용하여 단순히 파라미터의 개수만 줄인 것이 아니라, 비선형성을 증가시킴으로써 전체적인 모델의 성능 향상도 이끌어냈다. 어떻게 이 부분을 고안했는지가 참 궁금하다. 물론 그들이 참고한 문헌 중에 &quot;작은 receptive filed와 작은 stride&quot;를 사용하여 성능을 향상시킨 논문이 있다. 그렇다고는 해도 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 layer에 일정하게 3x3 filter를 적용시킨 점, 그리고 이를 더 큰 필터와 비교하여 장점을 이끌어낸 점이 굉장하다고 생각한다.&lt;/span&gt; &lt;/b&gt;읽으면서, &quot;그러면 1x1 filter를 사용하면 더 좋은 것이 아닌가?&quot; 라는 생각도 들었다. 그러나 논문에서도 나와있듯이, 너무 많은 1x1 filter는 오히려 필요한 만큼의 공간적인 정보를 찾아내는 것에 걸림돌이 될 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또 한 가지 신기했던 것은 이들의 Test 방법이다. Test 시 이들은 scale을 다르게 변환해가며 test를 진행했다. 사실 아직도 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;왜 이렇게 single-scale과 multi-scale을 구분했는지&lt;/b&gt;&lt;/span&gt; 잘 이해가 가지 않는다. 물론 multi-scale이 조금 더 현실에서 쓰이기에 적합한 test 라는 것은 인지했다. 그렇지만 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;애초에 AlexNet과 VGG는 고정된 이미지 크기의 데이터들을 분류하기 위해 고안된 모델이 아닌가?&lt;/span&gt;&lt;/b&gt; 이 부분은 FCN을 공부함으로써 조금 더 해답에 가까워질 수 있을 것 같다. 또 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Train 시 이미지의 전처리 방법에서도 scale에 변화를 준 것이 인상깊다.&lt;/span&gt;&lt;/b&gt; 서로 다르게 잘라가며 어떨 때는 물체의 전체를, 또 어떨 때는 물체의 일부를 주면서 모델을 학습시키는 방법. 이것이 실제로 더 좋은 학습 방법인지는 앞으로 공부를 더 해보면 알 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 정리하자면, 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1. 3x3 사이즈의 conv. filter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; 1-1. 어떻게 3x3 conv. filter를 사용해보자고 생각하게 되었는가?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; 1-2. 3x3 conv. filter의 정당성을 7x7와 비교하면서 얻어낸 과정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2. Single-scale VS Multi-scale&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;2-1. 왜 고정된 크기의 이미지 분류를 위해 고안된 모델에서 multi-scale을 적용하였는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; 2-2. train 시 scale을 다르게 crop해가며 물체의 전체와 물체의 일부분들을 가지고 학습을 한 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/abs/1409.1556&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/1409.1556&lt;/a&gt;&lt;/p&gt;</description>
      <category>논문 리뷰/CV</category>
      <category>deeplearning</category>
      <category>VGG16</category>
      <category>논문</category>
      <category>논문리뷰</category>
      <category>딥러닝</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/37</guid>
      <comments>https://mountain96.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 6 Sep 2021 18:00:01 +0900</pubDate>
    </item>
    <item>
      <title>[CS231n - Lecture 7] Training Neural Networks - Part II</title>
      <link>https://mountain96.tistory.com/35</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;Optimization&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가중치를 최적화하는 방법, 혹은 가중치를 업데이트하는 방법을 말한다. Optimization에도 여러가지가 있다. 각 Optimization은 이전 기법의 단점을 보완하는 형태로 등장했고, 최근에는 어느 한 가지가 좋다!라는 느낌보다는 상황에 따라서 골라서 사용하는 추세이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SGD&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 가장 초기에 사용된 optimizer이다. 기존의 Gradient Descent의 경우 한 번 학습할 때 모든 데이터를 봐야 하는데 이 때문에 속도가 너무 느려서 고안되었다. SGD는 전체 데이터에서 mini-batch라는 소규모 그룹을 뽑아서 이들을 가지고 loss를 계산한 뒤 가중치를 갱신하는 것이다. 그러나 다음과 같은 상황에서 문제가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;658&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brKyRy/btrbPcopoaq/ZRBJNkcGmMmFudx8MS2GLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brKyRy/btrbPcopoaq/ZRBJNkcGmMmFudx8MS2GLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brKyRy/btrbPcopoaq/ZRBJNkcGmMmFudx8MS2GLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrKyRy%2FbtrbPcopoaq%2FZRBJNkcGmMmFudx8MS2GLk%2Fimg.png&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;658&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;&amp;nbsp; 이렇게 최적점을 찾아가는데 진동 현상이 있을 수 있다. 이는 한 번 학습할 때마다 Loss가 계속해서 크게 바뀌는 경우를 나타내는 것 같다. 이 경우 SGD는 최적점에 도달하기까지 굉장히 오랜 시간이 걸리게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;670&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPB6qQ/btrbPKLXXQK/73q1DrYXOmjQpjFpU1Ec2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPB6qQ/btrbPKLXXQK/73q1DrYXOmjQpjFpU1Ec2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPB6qQ/btrbPKLXXQK/73q1DrYXOmjQpjFpU1Ec2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPB6qQ%2FbtrbPKLXXQK%2F73q1DrYXOmjQpjFpU1Ec2k%2Fimg.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;670&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;&amp;nbsp; 또 다른 문제는 local minima에 걸리거나 saddle point에 걸리는 경우다. 만약 loss function이 이런 현상이 닥치면 gradient가 0이 되고, 결국 거기서 더 나아가지 못할 것이다. 그리고 local minima보다는 saddle point가 실제 고차원적인 학습을 진행할 시에 더 빈번하게 발생한다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Momentum&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;662&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRj2mh/btrbQbphA9e/Tcmz2IJioJKOK3OnJAi0j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRj2mh/btrbQbphA9e/Tcmz2IJioJKOK3OnJAi0j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRj2mh/btrbQbphA9e/Tcmz2IJioJKOK3OnJAi0j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRj2mh%2FbtrbQbphA9e%2FTcmz2IJioJKOK3OnJAi0j1%2Fimg.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;662&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;&amp;nbsp; 이러한 SGD의 문제점을 해결하기 위해 나온 것이 Momentum이다. Momentum은 쉽게 말해서 가중치가 업데이트되는 방향에 가속도를 붙이는 것이다. 식을 보면 gradient는 따로 계산해두고, (Momentum Variable) x (이전 momentum) + gradient를 계산하는 것을 볼 수 있다. 그리고 이 결과물로 나온 vx를 x를 갱신할 때 곱해준다. 식은 x += lr* vx로 되어 있지만 이를 풀면 x += lr * (rho * vx) + lr * dx 가 된다. 즉 기존 SGD에서 쓰던 방식인 lr * dx에 lr * (rho * vx)가 더해져 바로 이전 갱신에서 사용된 vx가 현재 갱신에도 영향을 미치는 것이다. 이 때 rho로는 보통 0.9정도를 사용한다고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;663&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmP8Lh/btrbIopRuBt/YWrbzBf6bx3SgaAxKEVrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmP8Lh/btrbIopRuBt/YWrbzBf6bx3SgaAxKEVrf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmP8Lh/btrbIopRuBt/YWrbzBf6bx3SgaAxKEVrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmP8Lh%2FbtrbIopRuBt%2FYWrbzBf6bx3SgaAxKEVrf0%2Fimg.png&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;663&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;&amp;nbsp; 그림을 보면 Momentum을 사용함으로써 local minima와 saddle point에 빠지지 않고 지나갈 수 있음을 알 수 있다. 왜냐하면 기존 갱신이 현재 갱신에 영향을 미치기 때문이다.(관성과 비슷하다고 생각하면 될 것 같다). 또한 진동현상이 나타날 시에도 그림만큼 매끄럽지는 못하겠지만, 진동의 폭이라던가 진동 횟수 등이 현저히 감소할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nesterov Momentum&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;666&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tZIhj/btrbPa5dDV9/0W6idX31QDrBQKjj9mP1Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tZIhj/btrbPa5dDV9/0W6idX31QDrBQKjj9mP1Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tZIhj/btrbPa5dDV9/0W6idX31QDrBQKjj9mP1Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtZIhj%2FbtrbPa5dDV9%2F0W6idX31QDrBQKjj9mP1Tk%2Fimg.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;666&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;&amp;nbsp; 기존 Momentum같은 경우 업데이트를 할 때 velocity(vx)와 gradient(dx)가 한번에 합쳐져서 진행되었다. 그러나 만약 velocity가 안좋은 방향으로 큰 값을 가지는 경우, 이 때문에 오히려 학습이 느려질 수 있다는 문제가 있다. 이를 해결하고자 등장한 것이 Nesterov Momentum이다. Nesterov Momentum은 업데이트 시에 Velocity와 Gradient를 한 번에 계산하지 않고, 먼저 Velocity로 움직인 다음, 그 자리에서 gradient를 계산하여 gradient만큼 다시 움직이는 것이다. 이를 통해 Velocity를 보정하는 역할을 할 수 있다. 이는 보통 Convex Optimization에는 뛰어나지만 Neural Network와 같은 non-convex problem에서는 보장할 수 없다고 하는데, 이 때 Convex 는 Local minimum이 없는 것을 뜻한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;657&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmI2c/btrbLeN3x52/wfhXb4ACt0qi4aj1HtoIP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmI2c/btrbLeN3x52/wfhXb4ACt0qi4aj1HtoIP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmI2c/btrbLeN3x52/wfhXb4ACt0qi4aj1HtoIP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmmI2c%2FbtrbLeN3x52%2FwfhXb4ACt0qi4aj1HtoIP1%2Fimg.png&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;657&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;&amp;nbsp; Nesterov Momentum에 대한 자세한 식이다. 처음 봤을 때 생각보다 이해하기 어려워서 조금 난해했다. 조금씩 풀어서 보자면, 우선 현재 시점에서 구하고자 하는 것(업데이트될 결과물)은 x_t+1이며 x_t에서 x_t+1로 업데이트하기 위해 사용되는 것이 v_t+1이다. v_t+1을 계산하기 위해서 우선 x_t로 갱신될 때 사용되었던 v_t에 Momentum variable인 p를 곱한 값을 구한다. 그리고 x_t에서 이 pv_t만큼 움직인 위치를 구한 뒤, 이 위치에서의 기울기를 구한다. 이 기울기에 Learning rate인 a(알파)를 곱한 뒤 아까 구한 pv_t에서 이 값을 빼주는 것이다. 이렇게 보면 이전에 말했던 &quot;Velocity만큼 움직인 뒤, 움직인 위치에서의 gradient만큼 움직인다&quot;라는 것이랑 동일하다는 것을 알 수 있다.&lt;/p&gt;</description>
      <category>머신러닝&amp;amp;딥러닝/cs231n</category>
      <category>cs231n</category>
      <category>deeplearning</category>
      <category>MachineLearning</category>
      <category>Optimizer</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/35</guid>
      <comments>https://mountain96.tistory.com/35#entry35comment</comments>
      <pubDate>Wed, 11 Aug 2021 16:22:30 +0900</pubDate>
    </item>
    <item>
      <title>[논문 구현] AlexNet(2012) 구현</title>
      <link>https://mountain96.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;논문에 대한 자세한 내용은 여기에 정리해놨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mountain96.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2021.08.05 - [논문 리뷰/CV] - [논문 리뷰] AlexNet(2012) 요약 및 리뷰&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628576047640&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[논문 리뷰] AlexNet(2012) 요약 및 리뷰&quot; data-og-description=&quot;서론 배경 객체탐지를 위해서는 많은 데이터셋, 더 강력한 모델, overfitting을 피하기 위한 발달된 기법이 필요하다. 이 중 데이터셋의 경우 기존에는 적은 양의 데이터셋에만 접근이 가능했지만(2&quot; data-og-host=&quot;mountain96.tistory.com&quot; data-og-source-url=&quot;https://mountain96.tistory.com/33&quot; data-og-url=&quot;https://mountain96.tistory.com/33&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ddbmud/hyLck5oEdg/FJwIBvAyqbvhqrx6SQL9G1/img.png?width=584&amp;amp;height=475&amp;amp;face=0_0_584_475,https://scrap.kakaocdn.net/dn/kzAia/hyLcomqHB7/m2wrzi4k7RTOMxGqB8GcL0/img.png?width=584&amp;amp;height=475&amp;amp;face=0_0_584_475,https://scrap.kakaocdn.net/dn/beXCHR/hyLcpFDAlR/8nkn2KbEVi6lLgRI1GjSf1/img.png?width=1238&amp;amp;height=481&amp;amp;face=0_0_1238_481&quot;&gt;&lt;a href=&quot;https://mountain96.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mountain96.tistory.com/33&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ddbmud/hyLck5oEdg/FJwIBvAyqbvhqrx6SQL9G1/img.png?width=584&amp;amp;height=475&amp;amp;face=0_0_584_475,https://scrap.kakaocdn.net/dn/kzAia/hyLcomqHB7/m2wrzi4k7RTOMxGqB8GcL0/img.png?width=584&amp;amp;height=475&amp;amp;face=0_0_584_475,https://scrap.kakaocdn.net/dn/beXCHR/hyLcpFDAlR/8nkn2KbEVi6lLgRI1GjSf1/img.png?width=1238&amp;amp;height=481&amp;amp;face=0_0_1238_481');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[논문 리뷰] AlexNet(2012) 요약 및 리뷰&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서론 배경 객체탐지를 위해서는 많은 데이터셋, 더 강력한 모델, overfitting을 피하기 위한 발달된 기법이 필요하다. 이 중 데이터셋의 경우 기존에는 적은 양의 데이터셋에만 접근이 가능했지만(2&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mountain96.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Dataset&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Keras를 사용하여 CIFAR-10 데이터셋을 불러온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이후, 이를 validation 과 train set으로 각각 분리해주고, Tensorflow에 사용하기 용이한 tf.dataDataset으로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; =&amp;gt; tf.data.Dataset.from_tensor_slices() 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;540&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LIzk2/btrbGAjG3OK/iImtrG3ZaeNkdonooOMG20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LIzk2/btrbGAjG3OK/iImtrG3ZaeNkdonooOMG20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LIzk2/btrbGAjG3OK/iImtrG3ZaeNkdonooOMG20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLIzk2%2FbtrbGAjG3OK%2FiImtrG3ZaeNkdonooOMG20%2Fimg.png&quot; data-origin-width=&quot;1339&quot; data-origin-height=&quot;540&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;2. Preprocessing(전처리)&lt;/h2&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;1184&quot; data-origin-height=&quot;645&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKU0t4/btrbJInIRhE/8WYlMR99PL4ZEbFY0tXeuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKU0t4/btrbJInIRhE/8WYlMR99PL4ZEbFY0tXeuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKU0t4/btrbJInIRhE/8WYlMR99PL4ZEbFY0tXeuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKU0t4%2FbtrbJInIRhE%2F8WYlMR99PL4ZEbFY0tXeuk%2Fimg.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;645&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;&amp;nbsp; 그리고나서, 이미지를 standardize해주고, 이미지 사이즈를 32x32 에서 AlexNet이 사용하는 227x227로 변경해준다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Data/Input Pipeline&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Pipeline : 처리해야할 일은 순차적으로 명시한 것. 즉 연쇄적인 일들을 정리해놓은 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Input pipeline에는 [데이터 전처리, 셔플, 배치사이즈만큼 뽑기] 의 작업들이 들어간다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;620&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2CmmH/btrbOryRSOL/5VgPNboyfmtEwFpkmAM6pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2CmmH/btrbOryRSOL/5VgPNboyfmtEwFpkmAM6pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2CmmH/btrbOryRSOL/5VgPNboyfmtEwFpkmAM6pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2CmmH%2FbtrbOryRSOL%2F5VgPNboyfmtEwFpkmAM6pK%2Fimg.png&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;620&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;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;180&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVi7n/btrbCssVI6J/k2VykNZYNweZXplyfx2wl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVi7n/btrbCssVI6J/k2VykNZYNweZXplyfx2wl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVi7n/btrbCssVI6J/k2VykNZYNweZXplyfx2wl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVi7n%2FbtrbCssVI6J%2Fk2VykNZYNweZXplyfx2wl1%2Fimg.png&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;180&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;h3 data-ke-size=&quot;size23&quot;&gt;Model 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet에 맞게 모델을 설계한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet을 쌓아 올려보면서 다음과 같은 특징들이 있다는 것을 발견했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;5개의 Conv. layer 사용&lt;/li&gt;
&lt;li&gt;필터의 개수 : 96 -&amp;gt; 256 -&amp;gt; 384 -&amp;gt; 256&lt;/li&gt;
&lt;li&gt;맨 처음 Conv. layer를 제외하고는 모두 padding을 주어 이미지 사이즈가 줄어들지 않는다.&lt;/li&gt;
&lt;li&gt;이미지 사이즈는 오로지 MaxPooling으로만 줄인다.&lt;/li&gt;
&lt;li&gt;MaxPooling 시 OverlapPooling을 사용한다! =&amp;gt; pool_size=(3,3), strides=(2,2)&lt;/li&gt;
&lt;li&gt;항상 Conv. layer 뒤엔 Batch Normalization을 적용해주었다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;552&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEgPoW/btrbLfyQNVM/ZoraAk0Jt68xQI5Srbuyk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEgPoW/btrbLfyQNVM/ZoraAk0Jt68xQI5Srbuyk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEgPoW/btrbLfyQNVM/ZoraAk0Jt68xQI5Srbuyk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEgPoW%2FbtrbLfyQNVM%2FZoraAk0Jt68xQI5Srbuyk0%2Fimg.png&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;552&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;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;879&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jmx5P/btrbN5iptgF/Hxj86vGY19xmX68Gryk150/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jmx5P/btrbN5iptgF/Hxj86vGY19xmX68Gryk150/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jmx5P/btrbN5iptgF/Hxj86vGY19xmX68Gryk150/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJmx5P%2FbtrbN5iptgF%2FHxj86vGY19xmX68Gryk150%2Fimg.png&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;879&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;4. Monitoring&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Tensorboard를 활용하여 훈련이 어떻게 진행되었는지를 확인할 수 있도록 설정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;575&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3fkDz/btrbId9BixD/0mqrZn2ECPLq4roMU5h9c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3fkDz/btrbId9BixD/0mqrZn2ECPLq4roMU5h9c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3fkDz/btrbId9BixD/0mqrZn2ECPLq4roMU5h9c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3fkDz%2FbtrbId9BixD%2F0mqrZn2ECPLq4roMU5h9c1%2Fimg.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;575&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;5. Compile / fit&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Optimizer로는 SGD를 사용하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;386&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7Lmcc/btrbEMEFWto/Qmms0BnJ0EAYnKZlOrGzFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7Lmcc/btrbEMEFWto/Qmms0BnJ0EAYnKZlOrGzFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7Lmcc/btrbEMEFWto/Qmms0BnJ0EAYnKZlOrGzFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7Lmcc%2FbtrbEMEFWto%2FQmms0BnJ0EAYnKZlOrGzFk%2Fimg.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;386&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;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;856&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cketPu/btrbJJAb1sE/vDlhAE2NntcaoYYaCKaUX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cketPu/btrbJJAb1sE/vDlhAE2NntcaoYYaCKaUX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cketPu/btrbJJAb1sE/vDlhAE2NntcaoYYaCKaUX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcketPu%2FbtrbJJAb1sE%2FvDlhAE2NntcaoYYaCKaUX1%2Fimg.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;856&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;6. Evaluation&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Test데이터를 사용하여 모델의 성능을 평가해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;191&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnf8vk/btrbCtZF88K/7lLHlGiozErKkot0Fx6E61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnf8vk/btrbCtZF88K/7lLHlGiozErKkot0Fx6E61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnf8vk/btrbCtZF88K/7lLHlGiozErKkot0Fx6E61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnf8vk%2FbtrbCtZF88K%2F7lLHlGiozErKkot0Fx6E61%2Fimg.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;191&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;7. Tensorboard 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 찍힌 Tensorboard를 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;741&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VLQHU/btrbIegll4G/KlVKD60kKkzmezKm1jq5vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VLQHU/btrbIegll4G/KlVKD60kKkzmezKm1jq5vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VLQHU/btrbIegll4G/KlVKD60kKkzmezKm1jq5vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVLQHU%2FbtrbIegll4G%2FKlVKD60kKkzmezKm1jq5vK%2Fimg.png&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;741&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;도중에 overfit되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 내 모델만 유독 overfit되는지 모르겠는데, data augmentation을 사용하지 않은 점에서 overfitting이 나지 않았나 싶다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf&quot;&gt;https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf&lt;/a&gt;&lt;/p&gt;</description>
      <category>논문 리뷰/CV</category>
      <category>Alexnet</category>
      <category>deeplearning</category>
      <category>MachineLearning</category>
      <category>논문구현</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>알렉스넷</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/34</guid>
      <comments>https://mountain96.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 10 Aug 2021 15:39:22 +0900</pubDate>
    </item>
    <item>
      <title>[논문 리뷰] AlexNet(2012) 요약 및 리뷰</title>
      <link>https://mountain96.tistory.com/33</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;서론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 객체탐지를 위해서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;많은 데이터셋&lt;/span&gt;, 더 &lt;span style=&quot;color: #ee2323;&quot;&gt;강력한 모델&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;overfitting&lt;/span&gt;을 피하기 위한 발달된 기법이 필요하다. 이 중 데이터셋의 경우 기존에는 적은 양의 데이터셋에만 접근이 가능했지만(2012 기준)했다. 그 중에서도 CIFAR, MNIST와 같은 데이터셋은 현재 인간 수준의 정확성을 달성했지만, 이정도의 사이즈는 현실 세계에서 볼 수 있는 변동성 있는 풍경에 적용하기는 힘들다. 그러나 최근에는 LabelMe, ImageNet과 같은 방대한 데이터셋이 제공되었다. 또한, 강력한 GPU가 등장하면서 CNN을 이미지에 사용하는 것이 가능해졌다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CNN의 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그러나 수천 수만 가지의 객체들을 이미지들로부터 배우기 위해서는 객체탐지에서 비롯되는 엄청난 복잡성을 해결해야 하는데, 이를 위해서는 방대한 양의 데이터셋만으로는 부족하다. 이에 더해, 이미 보유하고 있는 데이터 뿐만 아니라 우리에게 없는 데이터에 대해서도 적용하기 위해서는 우리의 모델이 방대한 양의 사전지식도 갖추고 있어야 한다. 이를 해결하기 위한 모델 중 하나가 Convolutional Neural Network(CNNs)이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; CNN은&lt;span style=&quot;color: #ee2323;&quot;&gt; depth(깊이)와 breadth(너비)에 변동을 줌으로써 모델의 크기(capacity)를 조절&lt;/span&gt;할 수 있고, 이미지의 본질(nature of images)에 대해서 강력한 추측을 할 수 있다. (CNN의 두 특징 '&lt;span style=&quot;color: #ee2323;&quot;&gt;Stationarity of Statistics&lt;/span&gt;'과 '&lt;span style=&quot;color: #ee2323;&quot;&gt;Locality of pixel Dependencies&lt;/span&gt;') 이 때문에 일반적인 feedforward neural network보다 CNN이 &lt;span style=&quot;color: #ee2323;&quot;&gt;더 적은 연결과 파라미터&lt;/span&gt;가 있고, 결국 훈련하기 더 쉬운 것이다. 그러면서 이론상 최대 성능은 feedforward neural network보다 아주 약간만 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet은 5개의 Convolutional Layer와 3개의 FC Layer로 구성되었으며, 이 Convolutional Layer 중 하나라도 제거하면 성능이 저하된다고 기술하고 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp; GTX 580 3GB 2개&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터셋&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ImageNet : 22,000 카테고리에 대한 1500만 개의 이미지를 제공함. 여기서 매년 개최되는 ImageNet Large-Scale Visual Recognition Challeng(ILSVRC)에서 사용하는 데이터셋을 사용. 이 대회는 1000개의 카테고리에 대해 각각 약 1000장의 이미지를 제공함. 그래서 총 120만개의 Training set, 50,000개의 Validation set, 150,000개의 Test set이 제공됨.&lt;/li&gt;
&lt;li&gt;ImageNet에서 제공되는 이미지는 크기가 다양한 반면, AlexNet은 256x256으로 고정된 크기의 이미지를 필요로 한다. 그렇기 때문에 이미지들을 &lt;span style=&quot;color: #ee2323;&quot;&gt;downscale&lt;/span&gt;해줬는데, &lt;span style=&quot;color: #ee2323;&quot;&gt;먼저 이미지의 짧은 부분을 기준으로 짧은 부분이 256이 되도록 rescale&lt;/span&gt;해주고, &lt;span style=&quot;color: #ee2323;&quot;&gt;256x256사이즈에 맞게 중앙에서 잘라냈다&lt;/span&gt;. 이후, Training set에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;zero-centered&lt;/span&gt;를 맞춰주기 위해 [각 픽셀]에 [전체 픽셀의 평균] 을 빼주는것 빼고는 별다른 전처리 과정을 거치지 않았다.&lt;/li&gt;
&lt;/ul&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;본론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet에서 기존의 일반적인 구조에는 없었던 특이한 특성들을 나열했는데, 이는 중요도가 높은 순으로 나열되어 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. ReLU Nonlinearity&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 기존에는 일반적인 활성함수(Activation Function)로 tanh와 sigmoid가 주로 사용되었다. 그러나 AlexNet에서는 방대한 데이터와 깊은 네트워크 구조 때문에 빠르게 학습할 수 있는 능력이 요구된다. 이를 해결하기 위해 ReLU를 사용했는데, ReLU는 tanh에 비해 약 6배 정도 더 빠르게 수렴한다는걸 간단한 실험을 통해 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 물론 이런 새로운 활성함수를 고려한게 AlexNet이 처음은 아니다. 기존에도 f(x) = |tanh(x)| 와같은 식이 고안되었으며 이것이 Caltech-101 데이터셋에서 오버피팅을 방지하며 잘 작동한다는 논문이 있었다.(Jarrett et al.) 그러나 AlexNet에서는 오버피팅 방지가 아니라 빠른 학습을 요구하기 때문에 ReLU를 사용하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;475&quot; width=&quot;309&quot; height=&quot;251&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w47kX/btraZL0yNDx/Mgv2aXx63SKc714rOHArO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w47kX/btraZL0yNDx/Mgv2aXx63SKc714rOHArO1/img.png&quot; data-alt=&quot;ReLU : solid line, tanh : dahed line&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w47kX/btraZL0yNDx/Mgv2aXx63SKc714rOHArO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw47kX%2FbtraZL0yNDx%2FMgv2aXx63SKc714rOHArO1%2Fimg.png&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;475&quot; width=&quot;309&quot; height=&quot;251&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;ReLU : solid line, tanh : dahed line&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Training on Multiple GPUs&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; GPU 하나의 메모리가 3GB로 너무 작기 때문에 두 개를 병행하여 사용하였다. 당시 GPU도 서로 다른 GPU의 메모리에 직접 읽고 쓰기가 가능했기 때문에&lt;span style=&quot;color: #ee2323;&quot;&gt; cross-GPU parallelization&lt;/span&gt;에 용이했다. 여기서 적용한 병렬화 전략은 &lt;span style=&quot;color: #ee2323;&quot;&gt;커널(혹은 뉴런)의 절반만큼 각각의 GPU가 담당&lt;/span&gt;하게 하는 것이다. 그리고 &lt;span style=&quot;color: #ee2323;&quot;&gt;특정 layer에서만 GPU가 서로 상호작용&lt;/span&gt;한다. 만약 이 특정 layer가 layer2이라면 이를 input으로 받는 layer3에서의 뉴런들은 layer2의 모든 kernel map(feature map일 것으로 추정)들로부터 입력을 받는다. 그러나 layer4의 뉴런들은 layer3에서 자신의 GPU에 할당된 부분에서만 kernel map을 입력으로 받는다. 이 상호작용의 패턴을 알아내는 것은 문제가 될 수 있지만, 이를 통해 &lt;span style=&quot;color: #ee2323;&quot;&gt;전체 상호작용의 횟수(?)를 설정&lt;/span&gt;할 수 있고, 더 나아가 &lt;span style=&quot;color: #ee2323;&quot;&gt;원하는 연산을 할 때까지 조절&lt;/span&gt;할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 개의 GPU를 사용하는 기법으 error rate를 top-1에서는 1.7%, top-5에서는 1.2가량 줄였으며, 속도도 하나만 사용하는 것보다 조금 더 빨랐다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. Local Response Normlization&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ReLU를 사용하면 별다른 normalization 없이도 saturating을 막을 수 있다. 그러나 ReLU의 특성 상 &lt;span style=&quot;color: #ee2323;&quot;&gt;한 뉴런의 값이 너무 커질 경우 주변의 다른 뉴런들에게 영향&lt;/span&gt;을 끼칠 수 있다.(&lt;span style=&quot;color: #ee2323;&quot;&gt;측면 억제(lateral inhibition)&lt;/span&gt; : 한 영역에 있는 신경세포가 서로 연결되어 있을 때 자신의 축색이나 자신과 이웃한 신경세포를 매개하는 중간신경세포를 통해 이웃에 있는 신경세포를 억제하려는 경향) 이를 완화하고자 LRN이 나온 것이다.(현재는 잘 쓰이지 않고, 대신 Batch Normalization이 주로 쓰인다)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;138&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy53kx/btraXRM1rZL/iHKJGHhrKjM3RPAamhKSBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy53kx/btraXRM1rZL/iHKJGHhrKjM3RPAamhKSBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy53kx/btraXRM1rZL/iHKJGHhrKjM3RPAamhKSBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy53kx%2FbtraXRM1rZL%2FiHKJGHhrKjM3RPAamhKSBk%2Fimg.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;138&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a^i_x, y : (x,y)에 위치한 픽셀(뉴런)에 i번째 kernel을 적용하고 ReLU를 사용했을 때 나온 activation value.&lt;/li&gt;
&lt;li&gt;n : 인접하다고 고려할 뉴런의 개수(하이퍼파라미터). n에 따라 j의 범위가 늘어나고 줄어든다.&lt;/li&gt;
&lt;li&gt;N : 레이어 안에 존재하는 kernel 총 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 식을 통해 activation의 결과값을 어느정도 완화할 수 있다.&amp;nbsp; 쉽게 말하면 &lt;span style=&quot;color: #ee2323;&quot;&gt;인접한 픽셀(뉴런)끼리 정규화&lt;/span&gt;를 해주는 셈이다. AlexNet에서는 k=2, n=5, 알파=1e-4, 베타=0.75를 사용하였다. LRN을 사용하여 top-1의 error rate은 1.4%, top-5의 error-rate은 1.2%만큼 줄었다고 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. Overlapping Pooling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 일반적으로 CNN에서 Pooling이라 하면 필터가 겹치지 않고 적용된다. 다시 말하자면, stride=pool_size가 되는 것이다. 그러나 AlexNet에서는 이 필터가 겹치도록 설계를 했다. &lt;span style=&quot;color: #ee2323;&quot;&gt;stride=2, pool_size=3으로 설정하여 겹치는 뉴런을 발생&lt;/span&gt;시켰고, 그 결과로 top-1 error rate와 top-5 error rate가 각각 0.4%, 0.3% 줄었다고 한다. 저자들은 이 overlapping pooling이 overfit되기 조금 더 어렵게 만든다고 관찰했다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 모델 구성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;409&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xnjht/btraXTqDYXY/UbaIXWghO8ibk9pN9VvqF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xnjht/btraXTqDYXY/UbaIXWghO8ibk9pN9VvqF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xnjht/btraXTqDYXY/UbaIXWghO8ibk9pN9VvqF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXnjht%2FbtraXTqDYXY%2FUbaIXWghO8ibk9pN9VvqF1%2Fimg.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;409&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;&amp;nbsp; 앞서 설명했듯이, 네트워크는 &lt;span style=&quot;color: #ee2323;&quot;&gt;총 8개의 레이어&lt;/span&gt;로 구성되어 있으며, 그 중 &lt;span style=&quot;color: #ee2323;&quot;&gt;5개가 Convolutional Layer&lt;/span&gt;이고 &lt;span style=&quot;color: #ee2323;&quot;&gt;3개가 FC Layer&lt;/span&gt;이다. FC Layer의 마지막 부분은 softmax함수를 사용하여 1000개의 output을 출력한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2, 4, 5번째 Convolutional Layer는 이전 레이어에서 같은 GPU에 존재하는 Kernel map에서만 input을 받아들인다. &lt;span style=&quot;color: #ee2323;&quot;&gt;3 번째 Convolutional Layer에서는 모든 kernel map들로부터 input을 받아들인다&lt;/span&gt;. FC Layer의 각 뉴런들은 이전 레이어의 모든 뉴런들과 연결되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 때, &lt;span style=&quot;color: #ee2323;&quot;&gt;Response-Normlization layer(LRN)이 첫 번째와 두 번째 Layer 다음에 연결&lt;/span&gt;되어 있고, &lt;span style=&quot;color: #ee2323;&quot;&gt;Max Pooling Layer도 이 LRN layer다음에&lt;/span&gt; 붙어 있다. 또한 Max Pooling Layer는 여기에 더해서 &lt;span style=&quot;color: #ee2323;&quot;&gt;5번째 layer&lt;/span&gt;에도 붙어있다. Convolutional Layer와 Fc Layer 모두&lt;span style=&quot;color: #ee2323;&quot;&gt; ReLU 활성화함수&lt;/span&gt;를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 첫 번째 레이어는 224x224x3 이지미를 입력받으며 이를 11x11x3의 96개의 kernel(filter)과 4-stride로 연산한다.&amp;nbsp; 두 번째 레이어는 첫 번째 레이어의 출력결과가 LRN과 MaxPooling을 거쳐 나온 결과물을 입력으로 받으며, 5x5x48 크기의 256개의 필터가 이를 연산한다. 나머지 3, 4, 5번째 Layer들은 서로간에 연결될 때(3-&amp;gt;4, 4-&amp;gt;5) 특별한 pooling이나 normalization이 사용되지 않았다. 3번째 Layer는 이전 레이어의 출력 결과가 LRN과 MaxPooling을 거친 결과물을 입력으로 받고 3x3x256크기의 384개의 필터가 연산한다. 4번째 Layer는 3x3x192크기의 필터 384개가 연산하며, 5번째 Layer는 3x3x192 크기의 필터 256개가 연산한다. 마지막으로 FC Layer들은 모두 4096개의 뉴런으로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 정리하자면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1st layer(Conv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - input : 224x224x3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - filter : 11x11x3. 96개. 4-stride&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU + LRN + MaxPooling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2nd layer(Conv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - filter : 5x5x48. 256개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU + LRN + MaxPooling&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3rd layer(Conv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - filter : 3x3x256. 384개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 유일하게 이전 layer에서 모든 kernel map들과 연결굄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4th layer(Conv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - filter : 3x3x192. 384개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5th layer(Conv)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - filter : 3x3x192. 256개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6th layer(FC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Neurons : 4096&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation: ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7th layer(FC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Neurons : 4096&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : ReLU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8th layer(FC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Neurons : 1000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - activation : Softmax&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Overfitting 관리&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Data Augmentation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Overfitting을 피하기 위한 가장 일반적인 방법 중 하나이다. 이미지를 변형한 뒤 이를 따로 저장하지는 않는다. 이 이미지 변형은 &lt;span style=&quot;color: #ee2323;&quot;&gt;GPU에서 이전 배치에 대한 학습을 진행중일 때, CPU에서 다음 training set 준비를 위해서 진행&lt;/span&gt;한다. 이 때문에 효율적이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 첫 번째 변형은 &quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;이동&lt;/span&gt;&quot;과 &quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;좌우반전&lt;/span&gt;&quot;이다. 이동은 256x256 사이즈의 이미지에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;랜덤으로 224x224 크기의 patch를 잘라낸다.&lt;/span&gt; 이런 증강 기법을 사용하지 않으면 overfit에 시달려서 결국 깊은 네트워크를 사용하지 못했을 것이라고 한다. &lt;span style=&quot;color: #ee2323;&quot;&gt;test시&lt;/span&gt;에는 224 x 224 patch들을 &lt;span style=&quot;color: #ee2323;&quot;&gt;총 5개(좌상단, 우상단, 우하단, 좌하단 꼭지점에 붙인 4개의 patch와 가운데 patch 1개)와 이를 horiozntal flip하여 총 10개의 patch&lt;/span&gt;를 뽑아낸다. 그리고 각 패치들에 대해서 네트워크의 &lt;span style=&quot;color: #ee2323;&quot;&gt;softmax결과를 평균&lt;/span&gt;화하여 prediction을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 번째 방법은 &lt;span style=&quot;color: #ee2323;&quot;&gt;PCA&lt;/span&gt;를 사용한다. 이미지의 각 &lt;span style=&quot;color: #ee2323;&quot;&gt;RGB 픽셀에 PCA를 적용하여 평균=0, 표준편차=0.1을 갖는 랜덤 변수를 곱한 뒤 기존 픽셀에 더해준다&lt;/span&gt;. 사실 이부분은 고유벡터와 고유값에 대한 개념이 나와서 정확히 이해하지 못했다. 선형대수를 조금 더 공부하면서 고유벡터와 고유값을 알아볼 필요가 있을 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. Dropout&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 기존에는 여러 모델을 훈련시킨 뒤 이들을 종합하여 예측하는 앙상블 기법이 널리 사용되었으나, &lt;span style=&quot;color: #ee2323;&quot;&gt;네트워크가 깊고 훈련하는데 몇일이 걸리기 때문에 이 앙상블 기법을 사용하기 어려웠다&lt;/span&gt;. 대신, 당시 최신 테크닉인 &lt;span style=&quot;color: #ee2323;&quot;&gt;Dropout&lt;/span&gt;을 적용하였는데, 이는 각 뉴런들의 출력결과를 0.5의 확률로 0으로 만드는 것이다. 이렇게 할 경우 0이 된 뉴런은 forward pass시나 backpropagation시에 전혀 기여하지 않는다. Dropout은 &lt;span style=&quot;color: #ee2323;&quot;&gt;뉴런간의 상호의존성을 없애&lt;/span&gt;므로 모델이 더 robust해진다. &lt;span style=&quot;color: #ee2323;&quot;&gt;Test시에는 모든 뉴런들을 사용하지만 각각 0.5를 곱해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; AlexNet에서는 처음 두 개의 FC Layer에 적용하였고, Dropout없이는 Overfitting에 시달렸다고 한다. 그러나 Dropout은 수렴하기 위해 필요한 iteration 수를 약 2배 증가시킨다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;학습 세부사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용한 optimizer : Stochastic Gradient Descent(SGD) + momentum(0.9)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치 사이즈 : 128&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weight decay : 0.0005&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;157&quot; width=&quot;481&quot; height=&quot;106&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5QKKK/btrbag6xKEI/X0nfGLkRgOJeV3yBmehF10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5QKKK/btrbag6xKEI/X0nfGLkRgOJeV3yBmehF10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5QKKK/btrbag6xKEI/X0nfGLkRgOJeV3yBmehF10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5QKKK%2Fbtrbag6xKEI%2FX0nfGLkRgOJeV3yBmehF10%2Fimg.png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;157&quot; width=&quot;481&quot; height=&quot;106&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;이 방식으로 W를 업데이트하며, 이 때 i는 iteration, v는 momentum 변수, e는 learning rate이다. 마지막 &amp;lt;dl/dw&amp;gt;식은&lt;span style=&quot;color: #ee2323;&quot;&gt; i번재 batch에서 W_i를 사용하여 구한 gradient들의 평균&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 초기화 방법으로는 표준편차=0.01이 적용된 &lt;span style=&quot;color: #ee2323;&quot;&gt;zero-mean Gaussian distribution&lt;/span&gt;을 각 layer에 적용했다. 2, 4, 5번째 convolutional layer와 앞의 두 FC layer에는&lt;span style=&quot;color: #ee2323;&quot;&gt; neuron bias로 1&lt;/span&gt;을 설정했다. 이렇게 &lt;span style=&quot;color: #ee2323;&quot;&gt;bias를 1로 주면 ReLU에 positive input을 주는 효과가 있기 때문에 초기 학습을 더 가속화시키는 효과&lt;/span&gt;가 있다고 한다. &lt;span style=&quot;color: #ee2323;&quot;&gt;나머지 layer들의 bias는 0으로 설정&lt;/span&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Learning rate은 &lt;span style=&quot;color: #ee2323;&quot;&gt;validation error가 현재의 learning rate에서 더이상 감소하지 않을 경우 1/10만큼 감소&lt;/span&gt;시켰다. 초기 learning rate은 0.01이였으며, 학습이 끝날 때까지 총 3번 감소하여 최종적인 learning rate은 0.00001이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 훈련횟수는 약 90cycle(epochs)였다.&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;결론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실험 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;160&quot; width=&quot;366&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0a6ZQ/btrbgpaYUu0/CYXpGl0IacYvvwK7WMuEQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0a6ZQ/btrbgpaYUu0/CYXpGl0IacYvvwK7WMuEQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0a6ZQ/btrbgpaYUu0/CYXpGl0IacYvvwK7WMuEQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0a6ZQ%2FbtrbgpaYUu0%2FCYXpGl0IacYvvwK7WMuEQ0%2Fimg.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;160&quot; width=&quot;366&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;&amp;nbsp; ILSVRC-2010 대회 때의 모델들과 CNN을 사용한 AlexNet을 비교한 결과이다. sparse coding은 6개의 sparse-coding model들로부터 나온 predict 결과를 평균하여 예측하는 방식이다. SIFT + FVs 는 Fisher Vectors(FVs)로부터 훈련된 두 개의 분류기로 predict한 것들의 평균으로 예측하는 방식이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;231&quot; width=&quot;407&quot; height=&quot;119&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTcNah/btrbdZDwRvT/oqcuahXplm9TQ49tgIVNz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTcNah/btrbdZDwRvT/oqcuahXplm9TQ49tgIVNz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTcNah/btrbdZDwRvT/oqcuahXplm9TQ49tgIVNz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTcNah%2FbtrbdZDwRvT%2FoqcuahXplm9TQ49tgIVNz0%2Fimg.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;231&quot; width=&quot;407&quot; height=&quot;119&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;&amp;nbsp; 이는 ILSVRC-2012 대회 때 AlexNet(CNN)을 적용한 결과인데, Validation set과 Test set을 predict 했을 때 정확도 차이가 0.1%이하로 발생했기 때문에 크게 의미가 없다고 판단하여 두 지표를 같이 사용하고 비교했다고 한다.&amp;nbsp; 1 CNN은 CNN모델을 하나 썼을 경우이고, 5 CNN은 5개의 CNN모델을 사용하고 그 평균을 사용하여 예측했을 때의 결과이다. 그 밑의 1 CNN*은 하나의 CNN모델에 추가로 6개의 convolutional layer를 붙인 모델이다. 이 경우, 바로 ILSVRC-2012를 훈련하지 않고, ImageNet Fall 2011데이터(1500만개의 이미지, 22000개의 카테고리)로 훈련을 한 뒤, ILSVRC-2012로 fine-tuning한 결과이다. 밑의 7 CNNs*는 1 CNN* 7개의 모델을 돌려 그 평균을 사용하여 예측한 결과일 것이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Qualitative Evaluations&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;445&quot; width=&quot;353&quot; height=&quot;306&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G6F4b/btrbe6CM4um/wekLsnTDD8tYBJAYQUJ18K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G6F4b/btrbe6CM4um/wekLsnTDD8tYBJAYQUJ18K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G6F4b/btrbe6CM4um/wekLsnTDD8tYBJAYQUJ18K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG6F4b%2Fbtrbe6CM4um%2FwekLsnTDD8tYBJAYQUJ18K%2Fimg.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;445&quot; width=&quot;353&quot; height=&quot;306&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;이는 첫 번째 레이어에서 나타난 feature map인데, 위 3줄은 첫 번째 GPU에서, 아래 3줄은 두 번째 GPU에서 나타나는 모습이다. &lt;span style=&quot;color: #ee2323;&quot;&gt;첫 번째 GPU에서는 color가 거의 인코딩되어 있지 않지만&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;두 번째 GPU에서는 color가 인코딩되어 있는 모습&lt;/span&gt;을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;481&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd2O66/btrbe6peRv5/QwhBzsOMHoMEItAxTvEae1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd2O66/btrbe6peRv5/QwhBzsOMHoMEItAxTvEae1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd2O66/btrbe6peRv5/QwhBzsOMHoMEItAxTvEae1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd2O66%2Fbtrbe6peRv5%2FQwhBzsOMHoMEItAxTvEae1%2Fimg.png&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;481&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;&amp;nbsp; 좌측 사진은 이미지와 그 밑에 정답 레이블이 표시되어 있고, 그 밑에는 모델이 예측한 top-5 label이 그래프로 주어진다. 그 중 빨간 그래프가 정답 레이블에 해당하는 그래프이다. 이를 보면 물체가 꼭 중앙에 있지 않더라도, 다시 말하면 &lt;span style=&quot;color: #ee2323;&quot;&gt;위치에 상관없이 분류를 잘 해내는 것&lt;/span&gt;을 알 수 있다. 또한, 오분류한 대표적인 예시 중 grille과 cherry는 사람이 보기에도 애매한 구석이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델의 visual knowledge를 보다 더 깊이 관찰하기 위해 마지막 FC layer들의 4096-dimensional layer의 feature activation을 살펴보았다. 좌측 사진은 가장 왼쪽의 column이 test set에서 뽑은 것들이고, 나머지는 train set에서 뽑은 이미지들이다. 여기서 test set에서 뽑은 사진들을 각각 모델에 넣고, 4096-layer에서의 feature activation을 기준으로 가장 근사한 것들을 뽑은 것이다(근사한 기준은 L2 사용). 보면 픽&lt;span style=&quot;color: #ee2323;&quot;&gt;셀 단위로는 test set과 train set이 전혀 다르지만(색이나 포즈라던가), 그럼에도 불구하고 같은 부류라고 판단하는 것&lt;/span&gt;을 볼 수 있다. 이를 통해 단순히 픽셀이 아닌, 더 고차원적인 근거로 분류한다는 것을 알 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Discussion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 저자는 크고 깊은 CNN이 방대한 데이터셋을 분류하는데 있어서 비지도 학습만으로 뛰어난 성과를 보였으며, convolutional layer 중 하나라도 없앨 경우 성능이 크게 떨어진다는 것을 이유로 &lt;span style=&quot;color: #ee2323;&quot;&gt;모델의 깊이가 그만큼 중요하다고 강조&lt;/span&gt;하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한 학습 이전에 비지도학습으로 미리 학습을 했더라면(unsupervised pre-training) 성능이 더 좋았을 것이라고 가정하고 있다. 또한 충분한 컴퓨팅 파워가 있다면 네트워크의 사이즈(깊이)를 더 늘림으로써 더욱 뛰어난 성능을 발휘할 것이라고 한다. 궁극적으로는, 굉장히 크고 깊은 네트워크를 개발하여 이를 영상에 사용함으로써 정적인 이미지에서는 볼 수 없는 다양한 요소들을 분류에 사용할 수 있기를 기대한다고 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리뷰&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 처음으로 논문을 처음부터 끝까지 찬찬히 읽고 요약을 해봤다. AlexNet은 Deep Neural Network를 사용하여 성공한 첫 사례라는 점에서 큰 의미를 지닌다. CNN을 사용했다는 점도 놀랍다. 아마 당시에는 데이터셋이 방대해지면 모델들의 성능이 높아질 것이라고 기다리는 성향이 많았을(?) 것 같다. 그러나 AlexNet의 저자들은 모델을 더 깊게 만들어서 한계를 극복하고자 했다. 모델을 깊게 만드는 것은 일부 사람들도 한 번쯤 생각해 봤을 법하지만, 소모되는 훈련 시간과 Overfit문제 때문에 좌절했을 것 같다. 여기서는 GPU의 한계를 병렬로 처리함으로써 해결했다는 점, 그리고 Overfit 문제도 Dropout, Data Augmentation으로 해결했다는 점이 특별할 것 같다.(물론 지금은 너무나도 일반적인 방법들이다) 또 한편으로는 Dropout이 이 때 고안되지 않았으면 이를 어떻게 해결했을지도 궁금하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 모델 측면에서 보자면 CNN을 사용하면서 LRN을 사용했다는 점이 놀랍다. LRN은 인체학적 지식에서 영감을 얻어 만들었을 것 같은데, 아무래도 AI는 인간을 모방하는 것이다 보니, 인체학적 지식을 접목시킴으로써 큰 발전을 할 수 있지 않을까 싶다. 이 LRN으로 ReLU의 단점을 어느 정도 극복했고, CNN이 하나라도 줄어들면 정확도가 떨어진다는 점에서 모델의 깊이도 중요하다는 점을 증명했다. 하나 궁금한건, 만약 5개가 아니라 6개, 7개의 CNN을 사용했다면 어떤 효과가 있었을지, 성능이 더 좋아졌을지 아니면 지나치게 overfitting됐을지가 궁금하다. Convolutional Layer을 5개 사용했을 때 효과를 봤다면 6, 7개도 사용해봤을 법 한데 왜 이 부분은 기술이 안되어있는지도 조금은 의아하다. 또한, 마지막 결과를 낼 때 앙상블 기법으로 성능을 조금 더 끌어올리는 것도 인상깊었다. 시간이 조금 걸리더라도 보다 나은 성능을 위해 앙상블은 꼭 필요한 기법인 것 같다.(캐글에서도 자주 쓰인다고 하니까..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그리고 마지막으로 궁금한 건 optimizer부분이다. SGD를 썼다고 했으나 momentum을 사용한 것으로 보아 순수한 SGD난 아닐 것이다. Momentum 기법을 쓴 것이 아닌가? 근데 간혹 다른 리뷰들에서 SGD를 사용했다고만 기술한 것을 봤기 때문에 내가 무언갈 놓치고 있거나 이해를 잘못 한건 아닌가 싶다. 또한 CNN의 두 가지 큰 특징 '&lt;span style=&quot;color: #ee2323;&quot;&gt;Stationarity of Statistics&lt;/span&gt;'과 '&lt;span style=&quot;color: #ee2323;&quot;&gt;Locality of pixel Dependencies&lt;/span&gt;'이 궁금한데 이것도 이해해놓으면 좋을 것 같다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf&lt;/a&gt;&lt;/p&gt;</description>
      <category>논문 리뷰/CV</category>
      <category>Alexnet</category>
      <category>deeplearning</category>
      <category>논문</category>
      <category>딥러닝</category>
      <category>리뷰</category>
      <category>알렉스넷</category>
      <category>요약</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/33</guid>
      <comments>https://mountain96.tistory.com/33#entry33comment</comments>
      <pubDate>Thu, 5 Aug 2021 14:56:57 +0900</pubDate>
    </item>
    <item>
      <title>[CS231n - Lecture 6] Training Neural Networks - Part I-2</title>
      <link>https://mountain96.tistory.com/32</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Weight Initialization(가중치 초기화)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 1. 모두 0으로 초기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이 경우 W가 모두 같으므로, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 뉴런이 같은 일만&lt;/span&gt;&lt;/b&gt; 하게 되는 문제점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한 모든 W가 모두 같기 때문에 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;업데이트도 항상 같은 값으로 업데이트&lt;/span&gt;&lt;/b&gt;된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 2. 작은 수로 초기화&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;661&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IpT2a/btra10CAose/dstBRHIs81fOqw1LJhTbck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IpT2a/btra10CAose/dstBRHIs81fOqw1LJhTbck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IpT2a/btra10CAose/dstBRHIs81fOqw1LJhTbck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIpT2a%2Fbtra10CAose%2FdstBRHIs81fOqw1LJhTbck%2Fimg.png&quot; data-origin-width=&quot;1187&quot; data-origin-height=&quot;661&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;&amp;nbsp; 이런 식으로 무작위으 작은 수로 초기화하는 방법도 생각해볼 수 있다. 그러나 이경우 얕은 네트워크에서는 작동하지만, 네트워크가 깊어질수록 작동하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;666&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vcoYy/btraVD2a1sQ/XdzXGydq45PGaFyb46aZK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vcoYy/btraVD2a1sQ/XdzXGydq45PGaFyb46aZK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vcoYy/btraVD2a1sQ/XdzXGydq45PGaFyb46aZK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvcoYy%2FbtraVD2a1sQ%2FXdzXGydq45PGaFyb46aZK1%2Fimg.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;666&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;&amp;nbsp; 정상적으로 작동하지 않는 첫 번째 이유는, 모든 W가 작기 때문에 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;layer가 거듭될수록 출력되는 activation 이 점점 작아지기 때문&lt;/span&gt;&lt;/b&gt;이다. 이는 곧 0으로 수렴하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 두 번째 이유는 역전파에 있다. 역전파 시 계산하는 Gradient는 위에서 내려온 미분값 * 현재 미분 이다. 이 때 현재 식은 W*X인 상태에서 W를 업데이트하기 위해 W에 대한 미분을 하면 X만 남게 된다. 이 때 X는 0에 가까운 값이므로 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Gradient는 계속해서 0에 가까워지기만 하는 것&lt;/span&gt;&lt;/b&gt;이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방법 3. Xavier initialization&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;667&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpf0bF/btraXSkfWD3/cMYwSuk7sLZMuofVUueXD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpf0bF/btraXSkfWD3/cMYwSuk7sLZMuofVUueXD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpf0bF/btraXSkfWD3/cMYwSuk7sLZMuofVUueXD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpf0bF%2FbtraXSkfWD3%2FcMYwSuk7sLZMuofVUueXD1%2Fimg.png&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;667&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;&amp;nbsp; Xaiver Initialization은 식에서 보이는 것처럼, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입력의 개수가 적을수록 더 작은 값으로 가중치를 나누어준다&lt;/span&gt;&lt;/b&gt;. 그렇기 때문에 입력이 적으면 가중치는 반대로 큰 값을 갖게 되는 것이다. 이는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입력 개수가 적으면 가중치 값을 크게 하여 한 가중치 값의 영향력을 늘려주고, 반대로 입력의 개수가 많으면 그 영향력을 분산한다&lt;/span&gt;&lt;/b&gt;고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;663&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCruR/btraVUcj9pd/0dkjUrbJvV8cnjJsHBD3v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCruR/btraVUcj9pd/0dkjUrbJvV8cnjJsHBD3v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCruR/btraVUcj9pd/0dkjUrbJvV8cnjJsHBD3v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCruR%2FbtraVUcj9pd%2F0dkjUrbJvV8cnjJsHBD3v0%2Fimg.png&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;663&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;다만 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ReLU&lt;/span&gt;&lt;/b&gt;의 경우, 이론상 출력의 반이 0으로 죽어버리므로, 이를 보완하기 위하여 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;마지막 나누는 부분에 /2&lt;/span&gt;&lt;/b&gt;를 더해준다.&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;Batch Normalization&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;660&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6kB9A/btraVEUmLkM/Znztw121wFywT5R4W6msMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6kB9A/btraVEUmLkM/Znztw121wFywT5R4W6msMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6kB9A/btraVEUmLkM/Znztw121wFywT5R4W6msMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6kB9A%2FbtraVEUmLkM%2FZnztw121wFywT5R4W6msMk%2Fimg.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;660&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;&amp;nbsp; 출력된 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;결과값 모두가 한 가우시안 분포 안에 존재하도록 값을 조정&lt;/b&gt;&lt;/span&gt;한다. 이는 각 차원별로 평균과 분산을 구한 뒤, 이를 Normalize(Standardization)해줌으로써 가우시안 분포로 만들 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;659&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZTKMo/btra1YY3PnY/Ulvd86sBuYKs8QAknq8pB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZTKMo/btra1YY3PnY/Ulvd86sBuYKs8QAknq8pB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZTKMo/btra1YY3PnY/Ulvd86sBuYKs8QAknq8pB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZTKMo%2Fbtra1YY3PnY%2FUlvd86sBuYKs8QAknq8pB0%2Fimg.png&quot; data-origin-width=&quot;1189&quot; data-origin-height=&quot;659&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;&amp;nbsp; 이러럼 보통 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;FC Layer나 Convolution Layer 다음에 Batch Normalization이 온다.&lt;/span&gt;&lt;/b&gt; 다만, 앞서 언급한 것처럼 Batch Normalization은 일반적으로 Feature 단위로 normalize하지만, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Convlution Layer에 적용할 때는 channel 단위로 normalize&lt;/span&gt;&lt;/b&gt;해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 또한, Batch Normalization은 데이터들을 Linear 안에 분포하게 만는 과정이므로, FC layer 와 Convolution layer 외에도 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;nonlinear 앞&lt;/b&gt;&lt;/span&gt;에서 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 그러나, 이를 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;tanh&lt;/b&gt;&lt;/span&gt;에 쓸 때는 문제가 있다. tanh에 Batch Normalization을 사용함으로써 tanh에서 데이터들이 linear한 부분에만 분포하도록 강제할 수 있다. 그러나 이렇게 되면 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;saturation되는 부분이 완전히 사라지게 되는데&lt;/span&gt;&lt;/b&gt;, 이를 0% Saturation이 아니라 임의의 %만큼 Saturation을 하도록 허용할 수는 없을까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;661&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K5u0I/btra4WfjIfW/0zWeKPO6kgrYwB7mBSogQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K5u0I/btra4WfjIfW/0zWeKPO6kgrYwB7mBSogQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K5u0I/btra4WfjIfW/0zWeKPO6kgrYwB7mBSogQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK5u0I%2Fbtra4WfjIfW%2F0zWeKPO6kgrYwB7mBSogQ1%2Fimg.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;661&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;&amp;nbsp; 일정한 양의 saturation을 허용하기 위해 위와 같은 식이 나왔다. &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;먼저 일반 Batch Normalization을 사용하여 x를 구한다. 그 뒤, x에 r을 곱하고 B를 더해주어 변화를 주는 것&lt;/span&gt;&lt;/b&gt;이다. 이 때, 이 r과 B는 사용자가 임의로 정할 수 있는데, 이를 통해 얼만큼의 saturation을 허용할지를 정할 수 있다. 만약 r=표준편차, B=평균 으로 설정하면 원래의 Batch Normalization 식으로 돌아가므로 Saturation=0%로 허용하겠다는 의미가 된다.&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;Babysitting the Learing Process&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Preprocess Data&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 데이터를 zero-centered, normalize해준다(image의 경우 normalize 필요 x)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Choose the architecture&lt;/h2&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; input image의 사이즈, hidden layer 개수, hidden neuron 개수, output neuron 개수 등등을 설정한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Loss가 합당한지 체크한다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;664&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9eqT/btraTbrlECP/I1kEggkkyKGV7CNYPifJyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9eqT/btraTbrlECP/I1kEggkkyKGV7CNYPifJyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9eqT/btraTbrlECP/I1kEggkkyKGV7CNYPifJyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9eqT%2FbtraTbrlECP%2FI1kEggkkyKGV7CNYPifJyk%2Fimg.png&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;664&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;&amp;nbsp; 앞서 배운 Multiclass SVM Loss, Softmax classifier 등의 디버깅 전략을 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우선 regularization은 해제해주고, 그 상태로 loss를 계산해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;SVM loss의 경우 초기 loss = (class 수) - 1&lt;/b&gt;&lt;/span&gt; 이어야 하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; Softmax의 경우 초기 loss= -log(1/class수)&lt;/b&gt;&lt;/span&gt; 여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이후, regularization을 적용하여 loss가 조금 올라가는지 확인한다. loss가 올라가야 정상이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 본격적인 학습&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;671&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZcfVD/btraRkovKnE/8DdoogL6Vk9drH7pb4Kwb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZcfVD/btraRkovKnE/8DdoogL6Vk9drH7pb4Kwb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZcfVD/btraRkovKnE/8DdoogL6Vk9drH7pb4Kwb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZcfVD%2FbtraRkovKnE%2F8DdoogL6Vk9drH7pb4Kwb1%2Fimg.png&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;671&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;&amp;nbsp; 학습 초반에는 데이터의 일부만 학습을 시켜본다. 이 일부 학습을 통해 모델이 올바른지를 보는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 데이터가 많지 않으므로 loss가 낮고 overfit될 가능성이 높다. 또한 regulaization을 적용하지 않은 상태에서 loss가 내려가는지 확인하는 것도 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;668&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKjbCf/btra8ApyuzR/P1kTdDTexk6DXSdCDyk5NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKjbCf/btra8ApyuzR/P1kTdDTexk6DXSdCDyk5NK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKjbCf/btra8ApyuzR/P1kTdDTexk6DXSdCDyk5NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKjbCf%2Fbtra8ApyuzR%2FP1kTdDTexk6DXSdCDyk5NK%2Fimg.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;668&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;&amp;nbsp; 이후, regularization을 적용한 뒤 계속해서 학습해본다. regularization은 적은 수로 적용하여, 적절한 learing rate를 찾아가는 것이다. 이 때 나타날 수 있는 시나리오는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;loss가 내려가지 않는다 : learning rate가 너무 낮다.&lt;/li&gt;
&lt;li&gt;loss가 엄청 튄다(급증한다. ex NaN) : learning rate가 너무 크다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 보통은 1e-3 ~ 1e-5의 learning rate로 시작하는 것이 바람직하다.&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;Hyperparameter Optimization&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Cross-validation strategy&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 초반에는 적은 epoch(1~5)만큼만 시도해보면서 대략적으로 파라미터가 어떻게 작동하는지를 살펴본다(넓은 범위)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 이후 조금씩 좁게 들어가면서 파라미터를 수정한다(finer search) (좁은 범위)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;660&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKJW2c/btra35cAgMQ/wH8X6ULCzMwdbkzPD3s53K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKJW2c/btra35cAgMQ/wH8X6ULCzMwdbkzPD3s53K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKJW2c/btra35cAgMQ/wH8X6ULCzMwdbkzPD3s53K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKJW2c%2Fbtra35cAgMQ%2FwH8X6ULCzMwdbkzPD3s53K%2Fimg.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;660&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;&amp;nbsp; 예를 들어, 위와 같이 몇 에포크를 돌려보고는, fine search를 할 만한 부분들을 골라낸다. 골라내는 기준은 validation_accuracy의 수치이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;667&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QcGYL/btra6I2t4WZ/QUHaIO4NxaoY9eyiR0s9hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QcGYL/btra6I2t4WZ/QUHaIO4NxaoY9eyiR0s9hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QcGYL/btra6I2t4WZ/QUHaIO4NxaoY9eyiR0s9hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQcGYL%2Fbtra6I2t4WZ%2FQUHaIO4NxaoY9eyiR0s9hK%2Fimg.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;667&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;&amp;nbsp; finer search에서는 조금씩 lr과 reg의 범위를 좁혀가며 epoch을 돌려본다. 그러나 lr(learning rate)이 한 쪽에만 몰리면 그 부분만 집중적으로 탐색하게 되므로 꼭 좋은 결과라고는 할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;670&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTY91/btraZLyVkme/gr7kKn9YX68kDOkcvRKC81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTY91/btraZLyVkme/gr7kKn9YX68kDOkcvRKC81/img.png&quot; data-alt=&quot;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTY91/btraZLyVkme/gr7kKn9YX68kDOkcvRKC81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTY91%2FbtraZLyVkme%2Fgr7kKn9YX68kDOkcvRKC81%2Fimg.png&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;670&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;&amp;nbsp;&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; finer search에는 보통 2가지, Random search와 Grid search가 있는데 일반적으로 Random Search가 더 좋다. 왜냐하면 Random Search는 여러 방면으로 시도해볼 수 있는 기회가 생기는 반면 Grid search는 고정되어 있기 때문에 정답쪽의 방향이 있음에도 적은 횟수만 시도가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;657&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNO4LI/btra8z5gsCj/Y26KgQ5j0aeo1AqnDLKKsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNO4LI/btra8z5gsCj/Y26KgQ5j0aeo1AqnDLKKsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNO4LI/btra8z5gsCj/Y26KgQ5j0aeo1AqnDLKKsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNO4LI%2Fbtra8z5gsCj%2FY26KgQ5j0aeo1AqnDLKKsk%2Fimg.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;657&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;&amp;nbsp; 이 외에도, 설정할 수 있는 하이퍼파라미터에는 네트워크 구조, leraning rate, decay schedule(Learning rate 감소 기법), uddate type, regularization 등이 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.youtube.com/c/stanfordengineering/featured&quot;&gt;https://www.youtube.com/c/stanfordengineering/featured&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1627885247702&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;profile&quot; data-og-title=&quot;Stanford University School of Engineering&quot; data-og-description=&quot;The Stanford School of Engineering has been at the forefront of innovation for nearly a century, creating pivotal technologies that have transformed the worlds of information technology, communications, medicine, energy, business and beyond. The faculty, s&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/c/stanfordengineering/featured&quot; data-og-url=&quot;https://www.youtube.com/channel/UCdKG2JnvPu6mY1NDXYFfN0g&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d2vTc0/hyK6mWvuDi/shWdrn8aocYCq1szTwzCH1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/Wc8Qy/hyK6oz2WAG/NzsZvuwsgMSoBaljdi00v0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900&quot;&gt;&lt;a href=&quot;https://www.youtube.com/c/stanfordengineering/featured&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/c/stanfordengineering/featured&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d2vTc0/hyK6mWvuDi/shWdrn8aocYCq1szTwzCH1/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900,https://scrap.kakaocdn.net/dn/Wc8Qy/hyK6oz2WAG/NzsZvuwsgMSoBaljdi00v0/img.jpg?width=900&amp;amp;height=900&amp;amp;face=0_0_900_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Stanford University School of Engineering&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Stanford School of Engineering has been at the forefront of innovation for nearly a century, creating pivotal technologies that have transformed the worlds of information technology, communications, medicine, energy, business and beyond. The faculty, s&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>머신러닝&amp;amp;딥러닝/cs231n</category>
      <category>cs231n</category>
      <category>deeplearning</category>
      <category>MachineLearning</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <author>Mountain96</author>
      <guid isPermaLink="true">https://mountain96.tistory.com/32</guid>
      <comments>https://mountain96.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 2 Aug 2021 15:21:03 +0900</pubDate>
    </item>
  </channel>
</rss>