<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>지축을 뒤흔드는 우렁찬 아기 울음</title>
        <link>https://velog.io/</link>
        <description>저는 AI / ML / DL 에 흥미가 있는 학부생입니다. 데이터 사이언티스트가 되고 싶습니다.</description>
        <lastBuildDate>Tue, 30 Jul 2024 08:49:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>지축을 뒤흔드는 우렁찬 아기 울음</title>
            <url>https://velog.velcdn.com/images/robert_1106/profile/2c88be8f-81b1-4b95-b5e7-cbc0e325d51f/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 지축을 뒤흔드는 우렁찬 아기 울음. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/robert_1106" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[ 논문 리뷰 ] Training Compute-Optimal Large Language Models]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Training-Compute-Optimal-Large-Language-Models</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Training-Compute-Optimal-Large-Language-Models</guid>
            <pubDate>Tue, 30 Jul 2024 08:49:42 GMT</pubDate>
            <description><![CDATA[<p>제목에서도 알 수 있듯이 Compute-Optimal 하게 LM 을 Training 시키는 것이 목표.</p>
<p>쉽게 말해서, 한정된 자원에서 LM 을 어떻게 Training 시킬 것인가?</p>
<blockquote>
<p>여기서 집중해야 할 것은 어떤 <strong>자원</strong> ? </p>
</blockquote>
<blockquote>
<p>또 어떤 <strong>수준</strong> 까지 Training? </p>
</blockquote>
<ul>
<li>GPT와 같은 다른 자원을 아끼지 않는 LLM 들에 비하여 Optimal 하게 training 된 모델은 어떤 수준의 task 처리 능력을 가지고 있는가</li>
</ul>
<blockquote>
<p>마지막으로 어떤 <strong>방법론</strong>을 사용했을까? </p>
</blockquote>
<p>정도로 파악된다. 한번 읽어보자. </p>
<h3 id="intro--abstract">INTRO &amp; Abstract</h3>
<p>읽어보니, </p>
<ol>
<li>자원의 경우에는 Budget 이라고 표현하는 흔히 우리가 예상할 수 있는 Computing Resource 를 얘기하는 것. GPU FLOPS     ... </li>
<li>우리가 알고 있는 GPT-3 , Gopher , Jurassic 등 보다 downstream task 에서 더 높은 성능을 기록. </li>
<li>이건 아직 정확히 모르지만, <blockquote>
<p>Training Token 의 수와 Model parameter size 의 크기는 동일한 비율로 키워야 한다는 것이 저자들의 의견 </p>
</blockquote>
</li>
</ol>
<p>-&gt; 이를 수많은 실험을 통해서 증명함. 
-&gt; 실제로, 같은 예산 안에서 Gopher 에 비해서 더 낮은 수의 paramet 사용 및 training token 의 증가를 통해서 비율을 맞췄더니, 훨씬 높은 성능을 기록했다. </p>
<p>한정된 자원 속에서 최고의 성능을 뽑아내기 위한 Target Function 은 다음과 같다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/42f9d67b-d7a1-47a5-a984-e1011dc464ba/image.png" alt=""></p>
<blockquote>
<p>N : Parameter 수 
D : Training Token 의 수 
FLOPs(N,D) : N,D에 따른 예산 ( == C 로 , 고정된 상수임)
L(N,D) : parameter 수가 N이고, Training Token 의 수가 D일떄의 Loss </p>
</blockquote>
<ul>
<li>한마디로, 주어진 예산 C에서 할당할 수 있는 최적의 N과 D를 찾는것이 이들의 목적이라고 할 수 있다. </li>
</ul>
<p>*<em>They estimated these functions based on the losses of over 400 models, ranging from under 70M to over 16B parameters, and trained on 5B to over 400B tokens 
*</em></p>
<p>Target Function의 N과 D 최적화를 위하여 어떤 방법론들을 사용했는지 살펴보자 </p>
<h2 id="related-works">Related Works</h2>
<blockquote>
<h4 id="power-law-relationship">Power-law Relationship</h4>
</blockquote>
<ul>
<li>파라미터 수와 성능 사이의 수학적 연관관계, 비례관계 </li>
<li>해당 논문 이전에는 
<img src="https://velog.velcdn.com/images/robert_1106/post/df5472e6-b09f-496f-a843-a9534fedbe9f/image.png" alt=""></li>
<li>위와 같은 형태로 구성된다고 말함. </li>
<li>여기서 N은 파라미터 수, $$\alpha$$ 는 거듭제곱 지수</li>
<li>본 논문은 해당 관계에, 주어진 예산 (한정된 예산) <strong>C</strong> 를 추가하는 것이 목표</li>
<li>이 식이 해당 논문에서 어떤 실험 과정을 통해 어떻게 바뀌고 증명되는지 집중해보자. </li>
</ul>
<h2 id="estimating-the-optimal-parametertraining-tokens-allocation">Estimating the optimal parameter/training tokens allocation</h2>
<p>최적의 parameter 와 training token 할당량을 어떻게 정할지를 구상해보는 파트이다. </p>
<p>실험은 </p>
<ul>
<li>parameter 수 조정 </li>
<li>training token 수 조정 </li>
<li>그에 따른 성능 곡선 확인 및 분석하여 경험적으로 최적화</li>
</ul>
<p>의 흐름으로 진행 </p>
<h3 id="approach-1-fix-model-sizes-and-vary-number-of-training-tokens">Approach 1: Fix model sizes and vary number of training tokens</h3>
<p>가장 먼저, model size 를 고정 ( 즉, 파라미터 수의 차이 없이 ) 후 training token 의 수를 조정해봄. </p>
<blockquote>
<ul>
<li>model 들은 70M ~ 10B param 까지 준비. </li>
</ul>
</blockquote>
<ul>
<li>각각의 model 에 대해서 4개의 서로 다른 training sequence 준비. <blockquote>
<blockquote>
<p>여기서 training sequence 는  </p>
<ul>
<li>Learning rate 실험 ( 10배씩 감소 ) </li>
<li>training tokens 실험 ( 16배 범위까지 ) </li>
</ul>
</blockquote>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/5268a66c-db4d-4efa-a0d8-3b989538a97c/image.png" alt="">실험 결과, 각기 다른 parameter 수를 가진 model 들! 
해당 모델이 가질 수 있는 최고 성능을 파악하여 curve 를 그릴 수 있었음
(정의역에서 FLOPS 가 비는 부분은 선형 보간법을 활용하여 치역값을 채워넣음) </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/d691db03-a9c7-4f84-abe7-6e504f976d49/image.png" alt=""> 위의 curve 를 형성하여 만든 값들을 활용해서, 위의 두 그래프를 만들 수 있었음! 
어디서 가장 Minimal 한 loss 가 등장했는지를 표현한 회귀식 </p>
<ul>
<li>여기서 저 초록색 라인은 Gopher 가 실제로 사용했던 FLOPS에 기반한 최적의 parameter 수와 token 수 </li>
<li>회색 점이 각 flops 에서 최적의 loss 를 낸 points  </li>
</ul>
<blockquote>
<p>결론적으로 아래와 같은 power-law relationship 을 도출함. 
<img src="https://velog.velcdn.com/images/robert_1106/post/a2dc8ac1-0509-4f79-afdf-4c6f09ca034f/image.png" alt=""><strong>* $$a ≈ 0.5 , b ≈0.5$$ *</strong></p>
</blockquote>
<ul>
<li>parameter 수 N과 training token 의 수 D는 모두 계산예산 C (FLOPs) 와 power-law relationship 에서 0.5 정도의 최적값을 냄</li>
<li>이 말은 즉슨, parameter 수와 training token 의 수가 같은 비율로 증가해야 한다는 뜻. </li>
</ul>
<h3 id="approach-2-isoflop-profiles">Approach 2: IsoFLOP profiles</h3>
<p>두번째로, 9개의 서로다른 training tokens 를 두고, model size 를 변경해가며 실험. </p>
<p>주어진 훈련 예산 C에서, 최적의 parameter 수를 직접적으로 찾을 수 있도록 진행하는 실험. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/7e4528f9-8140-4d41-87a6-193cef8a3944/image.png" alt=""> 똑같이 진행했고, 이를 통해서 도출된 $$a$$ 값과 $$b$$ 값은 각각 0.49, 0.51 </p>
<p>첫번째 접근과 동일한 결론이 도출 가능. </p>
<h3 id="approach-3-fitting-a-parametric-loss-function">Approach 3: Fitting a parametric loss function</h3>
<p>1,2번의 결과를 가지고 활용하여 parametric loss function (우리가 잘 알고있는, 파라미터가 포함된 최종 손실함수)을 정의한다
. 
<img src="https://velog.velcdn.com/images/robert_1106/post/83a9d5c7-10be-4440-9f4e-b6c751ab2c4e/image.png" alt=""><strong>* 여기서 등호 위에 세모 표시는 &#39;수학적으로 정의된다&#39; 라는 뜻이란다...왜 쓰는지 참*</strong></p>
<blockquote>
<p><strong>손실함수 설명</strong></p>
</blockquote>
<ul>
<li>L(N,D) 즉 N개의 학습가능한 파라미터와 D개의 training tokens 으로 학습된 LM의 loss 는 다음의 3개 항으로 나누어 표현할 수 있다. </li>
</ul>
<blockquote>
<blockquote>
<ul>
<li>$E$ : 기본적인 loss . 생성 과정에서 생기는 오차항</li>
</ul>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<ul>
<li>$A/N^\alpha$ : (위의 실험들을 통해 얻은 최적치가 아닌 경우) 모델 파라미터가 부족해서 생기는 오차항 </li>
<li>α는 모델 크기에 따른 손실 감소 속도 지수 </li>
</ul>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<ul>
<li>$B/D^\beta$ : (위의 실험들을 통해 얻은 최적치가 아닌 경우) training token 수가 부족해서 생긴는 오차항 </li>
<li>β는 데이터 양에 따른 손실 감소 속도 지수</li>
</ul>
</blockquote>
</blockquote>
<blockquote>
<ul>
<li>위의 $A, \alpha, B, \beta$ 는 모두 학습을 통해서 경험적으로 추정해 나가는 파라미터임. </li>
</ul>
</blockquote>
<p>이후, </p>
<p>모델 피팅을 통해서, 최적의 $A, \alpha, B, \beta$ 값을 추정 </p>
<p>이후,</p>
<p>추정된 값들을 활용하여 위에서 얻고자 했던 $a,b$ 값을 찾아야 함.</p>
<p>여기서는 선행연구에 의해서, 주어진 진행예산 C를 6N*D로 가정하고 들어감.
<img src="https://velog.velcdn.com/images/robert_1106/post/455351a7-cade-4300-b100-37384a6ee048/image.png" alt="">fitting 된 값을 활용하여 G를 구하게 되면, G는 <img src="https://velog.velcdn.com/images/robert_1106/post/3aa8683f-1d01-4481-a24f-54392d75fef7/image.png" alt="">다음과 같게 형성되어, 우리가 실험적으로 구할 수 있는 G를 활용해 a,b 를 정의할 수 있다. </p>
<p>이들의 실험에 따르면 3번째 접근 방식으로 얻게된 a = 0.46, b=0.54 로 위 두가지 접근 방식과 동일한 결론을 도출할 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/b2371dae-e74d-4331-a290-b4e8ec8eaed4/image.png" alt="">결과적으로, 이 부분에서 논문의 저자들은 기존 연구들이 주장하는 optimize 된 param 수와 training tokens 수의 비율과 달리 3가지 방법을 통하여 해당 두 인수가 비슷한 비율로 증가해야한다는 것을 증명했다. </p>
<h2 id="model-chinchilla">Model: Chinchilla</h2>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/fbbc414f-e7ba-4aff-9567-83a8cff7d6e1/image.png" alt="">위의 결과를 활용하여 모델(Chinchilla)을 재구성.</p>
<p>특히, Gopher 라는 모델과 FLOPs 즉 가용한 컴퓨팅 자원 크기를 동일하게 설정하여 학습 가능한 파라미터 수와 training token 의 수를 비슷한 비율로 상승시켜 구성함. </p>
<p>다른 LLM 들과의 성능 비교를 실시함. </p>
<blockquote>
<p><strong>training details</strong> </p>
</blockquote>
<ul>
<li>모델 파라미터 수: 70억 (7B)</li>
<li>훈련 데이터: 1.4조 토큰</li>
<li>학습률을 10배씩 감소시키며, 학습 토큰 수를 16배씩 변화시켜 최적화</li>
</ul>
<blockquote>
<p><strong>architecture details</strong></p>
</blockquote>
<ul>
<li>transformer based</li>
<li>80 layers </li>
<li>5120 hidden dims </li>
<li>40 attention heads </li>
<li>20480 dim of FC </li>
<li>No dropout</li>
</ul>
<h2 id="results-on-downstream-tasks">Results on downstream tasks</h2>
<h4 id="language-modeling">Language Modeling</h4>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/c62aa751-e0db-47b2-b035-b231fe86c3c3/image.png" alt=""></p>
<ul>
<li>The Pile subset 전 범위에서 Gopher 를 넘어서는 성능을 보여줌 </li>
</ul>
<h4 id="mmlumassive-multitask-language-understanding-benchmark">MMLU(Massive Multitask Language Understanding) benchmark</h4>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/739880f6-1b47-4f4c-9929-2f5500f6fadd/image.png" alt=""></p>
<ul>
<li>chinchilla 5-shot 이 가장 뛰어난 성능을 보여줌. </li>
</ul>
<p>이 밖에도, reading comprehension, Common Sense Reasoning ,Closed-book question answering 등의 LLM benchmark 들에서 타의 추종을 불허하는 성능을 보여줌. </p>
<h2 id="discussion--conclusion">Discussion &amp; Conclusion</h2>
<p>Conclusion은 우리가 너무 쉽게 얘기할 수 있는 뭐 ~ 실험을 통해서 효율적인 파라미터 수와 training token 의 수를 발견할 수 있었다는 뻔한 이야기. </p>
<p>주어진 C 에 대하여 비슷한 비율로 구성하여 상승시켜야 한다는 일반화 가능한 Logic 을 학계에 가져옴으로써 전반적인 LLM 발전에 도움이 될 수 있을 것이라는 이야기. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[StarGAN : Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation]]></title>
            <link>https://velog.io/@robert_1106/StarGAN-Unified-Generative-Adversarial-Networks-for-Multi-Domain-Image-to-Image-Translation</link>
            <guid>https://velog.io/@robert_1106/StarGAN-Unified-Generative-Adversarial-Networks-for-Multi-Domain-Image-to-Image-Translation</guid>
            <pubDate>Fri, 17 May 2024 10:38:19 GMT</pubDate>
            <description><![CDATA[<p>이전에 GAN 을 살펴보았다.
오늘은 그 구조를 기반으로 발전시킨 StarGAN 을 살펴보겠다. </p>
<h2 id="intro--abstract">Intro &amp; Abstract</h2>
<p>StarGAN 은 제목에서 알 수 있듯, img to img translation 을 수행하는 모델이다. </p>
<blockquote>
<h4 id="what-is-img-to-img-translation">What is IMG to IMG translation?</h4>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/1ca060a1-c3c9-4526-8a76-33e13bb36b4a/image.png" alt="">GPT의 답변을 참고하자 </p>
</blockquote>
<ul>
<li>이전의 모델들은 two domain 에 대해서 밖에 다루지 못하는 단점 존재 </li>
<li>multi domain 을 대할 때 잘 대하지 못함 <blockquote>
<p>왜 ? 
: 어떤 하나의 도메인을 대하기 위해서 하나의 새로운 모델이 있어야 하기 때문 </p>
</blockquote>
</li>
</ul>
<p>StarGAN 은 그런 단점에 대응하여, multiple 한 도메인에 대처할 수 있는 새로운 모델 이다. </p>
<blockquote>
<ul>
<li>multiple domain 의 face expression dataset 이 있음에도 불구하고, 기존의 모델들은 mutiple domain task 를 수행하는게 쉽지 않았음 </li>
</ul>
</blockquote>
<ul>
<li>K 개의 domain 에 대응하기 위해서는 K(K-1)개의 generator 가 필요했기 때문 <ul>
<li>StarGAN은 하나의 genenrator 로 k개의 domain 에 모두 대응 
<img src="https://velog.velcdn.com/images/robert_1106/post/063caae7-337e-4891-b707-ce3e89b7518e/image.png" alt="">** Domain이 5개일때 아주 아름다운 Star shape 이다! ** </li>
</ul>
</li>
</ul>
<h2 id="related-works">Related Works</h2>
<blockquote>
<blockquote>
<h3 id="gan">GAN</h3>
</blockquote>
</blockquote>
<ul>
<li>저번에 했으니 넘어가자 </li>
</ul>
<blockquote>
<blockquote>
<h3 id="conditional-gans">Conditional GANs</h3>
</blockquote>
</blockquote>
<ul>
<li>말 그대로, 어떤 특정 condition 에 해당하는 img 를 생성해내는 GAN 들을 일컫는다. </li>
<li>given text 로 부터 condition 을 파악해 GAN 의 Generator 와 Discriminator 가 모두 각자의 과정에서 condition 을 더해 일을 수행한다. </li>
</ul>
<blockquote>
<blockquote>
<h3 id="img-to-img-translation">Img to Img translation</h3>
</blockquote>
</blockquote>
<ul>
<li>위에서 언급했으니 넘어가자 </li>
</ul>
<h2 id="star-generative-adversarial-networks">Star Generative Adversarial Networks</h2>
<p>어떻게 본 논문의 제자들이 single dataset에 대한 single network 로 multiple domain 을 대응했는지 살펴보자.</p>
<h4 id="multi-domain-image-to-image-translation">Multi-Domain Image-to-Image Translation</h4>
<p>single generator G 가 multiple Domain 을 학습하는 것이 목적. </p>
<blockquote>
<p><strong>G</strong> : generator
<strong>x</strong> : input IMG 
<strong>c</strong> : target Domain label </p>
<blockquote>
<p><strong>G(x,c) -&gt; y</strong> 에서 C는 랜덤하게 생성되고, 그를 통해 Generator G 는 input img 의 random translation 을 학습할 수 있게 됨 </p>
</blockquote>
</blockquote>
<blockquote>
<p><strong>D</strong> : Discriminator </p>
<blockquote>
<p>Generator 가 저렇게 생겼으니, Discriminator 는 두개를 판별해야함</p>
</blockquote>
</blockquote>
<ol>
<li>이놈의 &#39;C&#39; , 즉 domain label 이 무엇인지</li>
<li>이놈이 진짜인지 가짜인지 , 즉 GAN Discriminator 의 원래 목적 
그래서 , 결국 Discriminator Term 은 다음과 같음 
<img src="https://velog.velcdn.com/images/robert_1106/post/a0fbef14-a6e1-47e8-98bf-ea9e37c378f1/image.png" alt=""></li>
</ol>
<p>그렇다면 Loss Function 은 어떻게 될까? 가 다음 질문이다. </p>
<p>Loss 는 총 3개가 있다 .</p>
<blockquote>
<h4 id="adversarial-loss">Adversarial Loss</h4>
</blockquote>
<ul>
<li>Adv Loss 는 Generator 의 생성을 Discriminator 가 판별하지 못하도록 하는게 목적이 되는 Loss 이다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/136cad48-49c2-4b03-98b3-c6a26c591f69/image.png" alt="">
자세히 보면, GAN 에서의 Loss Fucntion 과 똑같다! 
위에서 설명했듯이, D_src 는 원래 GAN 의 목적과 같은 Discriminator Term 이기 때문에 뭐 GAN 의 Loss 를 이해했다면 이쯤은 그냥 넘어가도 될 것 같다. </li>
</ul>
<blockquote>
<h4 id="domain-classification-loss">Domain Classification Loss</h4>
</blockquote>
<ul>
<li>매우 중요!! </li>
<li>input img x 와 target Domain Label C 를 받았을 때, input img x 를 추후, &#39;c&#39; 로 분류될 만한 y 로 &quot;translate&quot; 하는게 목적이 되는 Loss <blockquote>
<ul>
<li>여기서는 두개의 Loss Function 이 존재한다. </li>
</ul>
<p>먼저, Discriminator </p>
<blockquote>
<p>1) <strong>Discriminator</strong>
Discriminator 는 어떻게 학습해야할까? </p>
<ul>
<li>Discriminator 는 Generator 를 죽이는 녀석</li>
<li>이 Loss 에서 Generator 는 target Domain Label C 에 맞춰 input img 를 변형하여 생성한다.</li>
<li>그렇다면 Discriminator 는 Generator 와 반대로, input img 를 target Domain label C 가 아니라, 원래 label 인 C_prime 으로 분류하도록 train 되어야 한다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/360228e4-9931-43e1-902f-ae707ed44231/image.png" alt=""></li>
</ul>
</blockquote>
</blockquote>
다음은 Generator 다 <blockquote>
<blockquote>
<p>2) <strong>Generator</strong>
Generator 는 방금 설명했듯, 부여받은 target Domain C 로 input x 를 변형시켜 생성하고 그걸 Discriminator 가 잘 구분하지 못하게 해야한다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/a43258b2-4c0a-4cf3-9990-0fb5e7e081a9/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
</ul>
<p>이때, 의문점이 생기는데!
그럼 얘네는 동시에 이 Loss 두개를 어떻게 학습할까? 
Discriminator 가 Train 되려면 Real img 가 필요하고, Generator 가 train 되려면 Faek img 가 필요한데, 같은 단계에서 진행할 수 있나? </p>
<p>그래서 논문의 저자들은 다른 곳에서도 많이 본 <strong>Auxiliary Classifier</strong> 를 사용해 Discriminator 의 앞단에 넣어준다. </p>
<blockquote>
<h4 id="reconstruction-loss">Reconstruction Loss</h4>
</blockquote>
<ul>
<li>cycle consistency Loss </li>
<li>위의 generator 오차만으로는 부족 </li>
<li>입력의 도메인 관련 부분만(C or C_prime) 변경하면서 입력 imgs의 콘텐츠를 유지한다고 보장할 수 없음 </li>
<li>생성 자체에 집중하는 Loss 가 필요하다.
<img src="https://velog.velcdn.com/images/robert_1106/post/7a01f707-6974-407a-be10-1175cfb8ef8e/image.png" alt=""></li>
<li>Using L1 norm </li>
<li>input img 와 given domain C 를 기반으로 생성한 G(x,c) 를 real domain c_prime 을 주어 reconstruct 했을 때의 차이</li>
<li>즉 generator 만의 성능으로 input img x 와의 비교를 수행 </li>
</ul>
<p>그래서, 최종 Loss function 은 다음과 같다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/601ad593-858f-4109-bb91-528efdf1507d/image.png" alt=""></p>
<h2 id="training-with-multiple-datasets">Training with Multiple Datasets</h2>
<p>StarGAN 의 training 은 그냥 multiple 한 dataset으로 진행할 수 있어야 하는데, 문제가 존재함.</p>
<ul>
<li>Domain label &#39;C&#39; 는 랜덤으로 정해지는데, dataset 별로 label 값, 즉 c_prime 값이 다르다.</li>
<li>예를 들어 첫번째 데이터셋은 머리색, 눈 색 같은 multiple domain 이 있는 반면, 두번째 데이터셋은 표정에 따른 기분에 대한 label 이 있을수도 있다. </li>
</ul>
<p>이걸 해결하기 위해서, StarGAN 은 두가지를 사용한다. </p>
<blockquote>
<h4 id="mask-vector">Mask Vector</h4>
<p>모델이, 어떤 데이터셋을 받았을 때, 다른 데이터셋의 label 을 c 로 선택하지 않게 하는 방법</p>
</blockquote>
<ul>
<li><blockquote>
<p>데이터셋이 n 개 있는 상황 (그에 따른 라벨 벡터 c_n ) 
<img src="blob:https://velog.io/17481f55-0c8b-42fb-913b-eb16b0fa5392" alt="업로드중.."></p>
</blockquote>
</li>
<li>여기서 masking 된 label 들은 0 이 됨 </li>
</ul>
<p>Mask vector 에서 언급한 label vector 를 제외하면 training process 는 single domain 과 정확히 똑같다. 
( 위에서 말헀던 Auxiliary classifier 를 넣어주는 부분도 추가..ㅎㅎ) </p>
<ul>
<li>그 과정에서, Known label (Unknown label 은 masking!) 에 대해서만 loss function 을 통한 D&amp;G optimizing 을 수행 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 프로젝트 ] 온라인 진로상담 텍스트 데이터를 활용한 진로 추천 - 1 ]]></title>
            <link>https://velog.io/@robert_1106/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A7%84%EB%A1%9C%EC%83%81%EB%8B%B4-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%A7%84%EB%A1%9C-%EC%B6%94%EC%B2%9C-1</link>
            <guid>https://velog.io/@robert_1106/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A7%84%EB%A1%9C%EC%83%81%EB%8B%B4-%ED%85%8D%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%A7%84%EB%A1%9C-%EC%B6%94%EC%B2%9C-1</guid>
            <pubDate>Sun, 17 Mar 2024 15:42:33 GMT</pubDate>
            <description><![CDATA[<p>학과 수업 &#39;빅데이터최신기술&#39; 에서 진행하는 프로젝트에 대한 정리이다. </p>
<p>발표 영상 : <a href="https://youtu.be/dvEL1lQ61sA">https://youtu.be/dvEL1lQ61sA</a> </p>
<h3 id="사용-데이터">사용 데이터</h3>
<p>사용 예정 데이터는 , AIHUB의 텍스트 데이터인 &#39;인공지능기반 학생 진로탐색을 위한 상담 데이터 구축&#39; 를 사용하고자 한다. </p>
<p>사용 데이터 링크 : <a href="https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&amp;topMenu=100&amp;dataSetSn=71618">https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&amp;topMenu=100&amp;dataSetSn=71618</a> </p>
<h4 id="사용-데이터-소개">사용 데이터 소개</h4>
<p>이 데이터는, 전국 약 6500명의 초,중,고등학생을 대상으로 실시한 온라인 상담 텍스트 데이터이다. 상담 전문가에 의해 실시되었으며, 상담 전문이 기록되어 있고 발화기준으로 약 826,160건의 데이터가 존재한다. </p>
<p>상담내용의 어절 수 분포는 다음과 같다 </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/76b7f73f-5e9c-471f-a71e-c25ebfb18085/image.png" alt="">: AI Hub 제공 </p>
</blockquote>
<p>데이터는 크게 3가지 이다. </p>
<p>상담 내용 기록 , 학생 정보 데이터, 전문가 상담 리뷰 데이터이다. </p>
<blockquote>
<p><strong>상담 내용 기록</strong> </p>
</blockquote>
<ul>
<li>학생별로 
상담 일시 , 상담 만족도 , 발화 내용 , 발화대기시간 등이 작성된 데이터
<img src="https://velog.velcdn.com/images/robert_1106/post/73b84946-91a3-4198-9d5d-245e78565630/image.png" alt=""></li>
</ul>
<blockquote>
<p><strong>학생 정보 데이터</strong> </p>
</blockquote>
<ul>
<li>학생별로 학생 개인 정보가 담긴 데이터
<img src="https://velog.velcdn.com/images/robert_1106/post/a857a8e9-2128-4a80-981f-48d81ef69f13/image.png" alt=""></li>
</ul>
<blockquote>
<p><strong>전문가 상담 리뷰 데이터</strong> </p>
</blockquote>
<ul>
<li>상담별로 상담 결과가 정리된 데이터이다. </li>
<li>상담에 대한 전문가의 요약 및 서술과 추천 직업 계열이 담겨있다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/50b8bbcb-43ee-4f9a-9d4d-b817d51098c5/image.png" alt=""></li>
</ul>
<p>진행해보는 첫번째 개인 NLP 프로젝트이기 때문에, 여러가지 정보를 다양하게 활용해보고 싶지만 기술적으로 구현을 하는데에 약간의 무리가 존재할 것 같아 상담내용과 전문가의 추천 직업 계열을 사용하고자 한다. </p>
<h4 id="데이터-추가-소개">데이터 추가 소개</h4>
<p>상담 내용 텍스트만을 뽑아, 데이터 양을 측정해보았다. </p>
<p>텍스트를 뽑는 과정은 다음의 과정을 따랐다. </p>
<blockquote>
<ol>
<li>초,중,고가 분리되어 있는 상담내용 데이터셋의 &#39;상담내용&#39; 만을 뽑아온다. </li>
<li>해당 내용들을 모두 합쳐 &#39;엔터&#39; 로 구분되어 있는 텍스트파일로 저장</li>
<li>해당 텍스트 파일을 대상으로 측정 
<img src="https://velog.velcdn.com/images/robert_1106/post/9e84473e-6b2c-41fd-a26f-2b2357326d4a/image.png" alt="">
<img src="https://velog.velcdn.com/images/robert_1106/post/4e101390-a93c-4a5b-a476-ec270545d9d5/image.png" alt="">
<img src="https://velog.velcdn.com/images/robert_1106/post/73b7c2c6-cd0d-49e0-ad9f-e8921744da94/image.png" alt="">
<img src="https://velog.velcdn.com/images/robert_1106/post/5cbf3e58-6dfa-4dd8-8160-a8c76187bb62/image.png" alt="">
<img src="https://velog.velcdn.com/images/robert_1106/post/11d2d18a-4b5d-4ec3-85b4-65aaa9c6b7c6/image.png" alt=""></li>
</ol>
</blockquote>
<p>이 결과 학습 데이터로 사용할 데이터는 총 38,442,890바이트 (38.4MB) 로 측정되었다. </p>
<h3 id="project-flow">Project Flow</h3>
<p>NLP task 를 진행해보지 않아, 전반적인 프로세스는 GPT를 빌려 세워보았다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/0c0a8ecc-236a-4ae8-b1b6-ee9179add141/image.png" alt=""></p>
<h3 id="데이터-전처리">데이터 전처리</h3>
<p>데이터를 조금 살펴본 결과, 온라인 채팅이다 보니 오탈자도 존재하고, 서로 나눈 대화 중에 웹페이지 링크를 전송하는 경우도 존재했다. </p>
<p>100% 한국 학생들을 대상으로 진행했던 상담이기 때문에 전체 데이터에서 영어를 제외해도 괜찮겠다고 판단하였다. </p>
<p>전처리는 다음의 과정을 거칠 것으로 계획한다. </p>
<blockquote>
<ul>
<li>특수 문자 제거 </li>
</ul>
</blockquote>
<ul>
<li>영어 제거 </li>
</ul>
<h3 id="형태소-분석--토큰화--단어-임베딩">형태소 분석 / 토큰화 + 단어 임베딩</h3>
<p>한국어 문장을 토큰화 할 수 있는 모듈인 <strong>KoNLPy</strong>를 사용하고자 한다. 
현재 VsCODE 에서 python 을 사용하여 프로그래밍 하고 있기 떄문에, 한국어 자연어 처리가 가능한 파이썬 라이브러리 중 가장 널리 사용되는 KoNLP의 MeCab 을 사용하고자 한다. </p>
<p>문장을 형태소 단위로 분리하여 토큰화 하고자 한다. </p>
<p>( kkma는 돌려보았을 때 시간이 너무 오래걸려서 pass...) </p>
<p>그 이후 토큰화된 문장을 <strong>word2vec</strong> 을 사용하여 임베딩할 예정이다. </p>
<h3 id="모델-구축">모델 구축</h3>
<p>일단 현재 가장 NLP task 에서 효과적으로 알려져있는 Transformer 기반의 모델을 구축하고자 한다. </p>
<p>상담 내용의 문맥을 잘 해석해서, 해당 학생이 어떤 직무가 어울리는지를 잘 분류해야 하기 때문에, pre-train 된 LLM 기반의 <strong>BERT</strong> 나 <strong>RoBERTa</strong> 를 사용한 딥러닝 기반 분류모델을 구축하고자 한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 논문 리뷰 ] Generative Adversarial Nets]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Generative-Adversarial-Nets</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Generative-Adversarial-Nets</guid>
            <pubDate>Thu, 22 Feb 2024 16:42:37 GMT</pubDate>
            <description><![CDATA[<p>본 리뷰는 GAN에 대해서 공부하는 과정입니다.</p>
<h3 id="abstract--introduction">Abstract &amp; Introduction</h3>
<p>GAN은 생성자 VS 판별자 형식의 매우 특이한 알고리즘으로 고성능을 기록한 생성형 모델로 알고있는데, GAN은 아무것도 없는 노이즈 상태에서 무언가를 생성하려는 시도로 또한 볼 수 있다. (비모수적 추정) </p>
<p>생성자 G 와 판별자 D 의 동시학습(Simultaneously Train)이 GAN의 핵심 아이디어
<img src="https://velog.velcdn.com/images/robert_1106/post/67569396-0e92-4d8f-91c5-0138070494cd/image.png" alt=""></p>
<blockquote>
<p><strong>생성자 G</strong> 
원본 데이터의 분포를 모방함</p>
</blockquote>
<blockquote>
<p><strong>판별자 D</strong> 
생성자 G가 생성한 데이터에 대한 진위 판별</p>
</blockquote>
<p>G의 목표는 , 원본 데이터의 분포를 매우 잘 학습하여 D의 판별능력이 50%가 되도록 (찍어서 맞추는 것과 동일하게) 하는 것! </p>
<p>GAN 이전의 딥러닝 기반 생성 모델은, 최대우도추정법(Maximum Likelihood Estimation)과 같은 방식으로 계산하기 어려운 확률적인 문제들 때문에 당시에 복잡한 문제들을 쉽게 대응할 수 있게 만들어준 piecewise linear unit 들을 사용하기 어려웠다. </p>
<blockquote>
<p><strong>Piecewise linear unit</strong> 
-&gt; Activation function의 일종으로, 일반적인 ReLu와 같은 Function들 처럼 하나의 지점을 기준으로 가르는게 아니라, 여러 구간에서 복합적인 함수를 적용하게 함으로써 네트워크가 복잡한 함수를 모델링하고 더 복잡한 데이터 패턴을 학습할 수 있게 하는 것. 
<img src="https://velog.velcdn.com/images/robert_1106/post/0e10ced7-ef48-49b7-b14b-0db1c9427e9f/image.png" alt=""></p>
</blockquote>
<p>이전의 VAE만 봐도, 상당히 어려운 방식과 말도 안되는 계산적 트릭을 활용해서 억지로 원본 데이터 분포를 추정하는 것을 알 수 있다 .</p>
<p>본 논문의 저자들은 <strong>Adversarial net(적대적 학습 네트워크)</strong> 이라는 프레임워크를 제안한다.</p>
<p>이 Adversarial net 은 모두 다중 퍼셉트론 구조로 되어있기 때문에, back prop 과 optimization, dropout 또한 쉽게 적용할 수 있다.</p>
<h3 id="adversarial-nets">Adversarial Nets</h3>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/96068b9b-8bc5-4872-8fd3-a5434df2a4a7/image.png" alt=""></p>
<p>적대적 네트워크의 구조는 위와 같다.
<img src="https://velog.velcdn.com/images/robert_1106/post/d34da0af-aced-4247-a091-fffcc1a49a2f/image.png" alt=""></p>
<p>Generator 로는 랜덤한 노이즈(p_z)가 인풋으로 들어간다. 그리고 MLP 구조인 Generator 는 해당 노이즈를 G(for Generator) 라는 공간으로 맵핑시킨다. (이때 이 공간은 학습가능한 파라미터를 가지고 있다.) </p>
<p>또한 Descriminator 를 학습시키는데, discriminator 는 G에서 나오는 
데이터를 인풋으로 받아 어떤 스칼라 값을 뱉는다. </p>
<p>해당 스칼라 값은 그 데이터가 실제 원본 데이터에서 왔는지, Generator 로부터 왔는지를 판단하는 수치이다. (1~0) </p>
<p>Generator 는 log(1-D(G(z)) 를 <strong>최소화 하는 방향</strong> 으로 학습된다.</p>
<blockquote>
<p><strong>To Minimize</strong> <strong>*&quot; log(1-D(G(Z)) &quot;*</strong>
-&gt; 1-D(G(z)) 가 0 에 가깝도록 == D의 output scalar 가 1에 가깝도록 
==&gt;&gt; 즉, <strong>D가 생성한 데이터를 진짜 데이터처럼 생각할 수 있도록</strong></p>
</blockquote>
<p>그래서, GAN의 목적함수는 다음과 같다.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/6d462fc7-6208-4f2c-9a22-13520c839317/image.png" alt="">V stands for value</p>
</blockquote>
<p>G의 최소화, D의 최대화를 동시에 이룬다. </p>
<blockquote>
<p><strong>앞 항</strong>
x 를 원본 데이터에서 뽑는다고 했을 때, Descriminator 의 scalar값의 기댓값 </p>
</blockquote>
<blockquote>
<p><strong>뒤 항</strong>
노이즈로부터 샘플링하여 얻은 Generator 가 얼마나 잘 속였는지에 대한 기댓값 </p>
</blockquote>
<p>여기에서, 저자들은 D를 완전히 최적화 시키는 것은 오버피팅의 문제가 있고 계산적으로 비효율적이기 때문에 D와 G를 순차적으로 최적화 시키는 과정을 밟아 D는 최대치에 근사하게 유지되게 하고 G가 천천히 나아질 수 있도록 한다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/b593be40-7e1a-4242-9cd1-7cfadeeb9de6/image.png" alt="">검은 점선은 데이터, 파란 선은 D, 초록색 선은 G</p>
</blockquote>
<p>그래서 결과론적으로 위와 같은 과정을 밟게된다. 
z라는 노이즈에서 주는 값들을 기반으로 Generator 는 분포를 형성하고 초반에는 discriminator 가 잘 판별을 하지만, 점점 갈수록 1/2에 값이 근사하며 판별하지 못하는 것을 볼 수 있다. </p>
<h3 id="theoretical-results">Theoretical Results</h3>
<p>GAN은 비모수적인 방법으로, 원본 데이터의 분포를 모델링 할 수 있다. 이 말은 즉슨, 원본 데이터에 대한 통계적인 가정을 하지 않고, 분포를 찾아간다는 말이다. </p>
<blockquote>
<p><strong>비모수적 방법</strong>을 사용하면 파라미터의 수를 고정해놓지 않고 학습을 진행하기 때문에, 계산 효율성이 데이터에 따라 많이 떨어질수도 있지만, 복잡한 데이터의 분포를 모델링하기에 보다 적합하다.</p>
</blockquote>
<p>GAN 논문의 저자들은, 위에서 보인 목적함수와 함께 GAN이 이론적으로 어떻게 Generator 의 생성이 원본 데이터와의 분포차이를 줄일 수 있는지를 보여준다. </p>
<p>1 -&gt; 최적화 과정을 통해 generator 분포의 전역 최소값이 data 실제 분포의 전역 최소값에 근사하게 됨 </p>
<p>2 -&gt; GAN에서 제시하는 알고리즘으로 최소값에 다다를 수 있는지 (효과적인지에 대한 증명)</p>
<h4 id="41-global-optimum-of-p_g--p_data">4.1 Global Optimum of p_g == p_data</h4>
<p>G가 고정된 상태를 가정하고, 아래의 목적함수를 보자. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/6d462fc7-6208-4f2c-9a22-13520c839317/image.png" alt="">여기에서 기댓값을 적분으로 표현하면 다음과 같다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/156f52d4-13bc-427b-9905-34206bfff164/image.png" alt="">이때, 이 <strong>Z</strong> 도메인에서 샘플링된 노이즈 벡터 z를 Generator에 넣어서 데이터 x를 만들어낼 수 있기 때문에 위와 같이 표현된다. </p>
</blockquote>
<p>이때 위의 식은 아래의 법칙을 따르기 때문에, 
<img src="https://velog.velcdn.com/images/robert_1106/post/788d3b64-e3ce-4530-b2e9-79a76cbbe017/image.png" alt=""></p>
<p>value가 최대가 되는 값은 아래의 값이 된다.
<img src="https://velog.velcdn.com/images/robert_1106/post/adaa1836-3551-4cef-9f26-76514eac7afe/image.png" alt=""></p>
<p>그 다음, 저 V의 값을 최대로 만드는 D에 대한 V의 함수를 가정한다. 특정하게 고정된 (위에서 가정) G에 대해서 global optimal을 가지고 있는 D에 대한 V이다. <img src="https://velog.velcdn.com/images/robert_1106/post/47c76a67-cb70-4102-aa34-d58e188b31c3/image.png" alt=""></p>
<p>해당 함수를 풀어서 위에서 말한 D의 최댓값을 대입하여 정리하면, 
<img src="https://velog.velcdn.com/images/robert_1106/post/b5278e23-5676-47c4-b7a0-65a907fdd394/image.png" alt="">
KLdivergence 의 식으로 정리되어 분포의 차이로 정의될 수 있다. 
(JSD는 두 분포의 차이를 거리로 표현하는 식이다 - distance metric이기 때문에 최솟값이 0)</p>
<p>global optimal은 즉 p_data == p_g 일때로 정의된다. (두 분포의 JSD값이 0일때) </p>
<h4 id="42-convergence-of-algorithm-1">4.2 Convergence of Algorithm 1</h4>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/7b7e10e3-dbfd-4fe9-80f8-c7cdaeaf5669/image.png" alt=""></p>
<ul>
<li>하나하나 차근차근 가보겠습니다. </li>
</ul>
<blockquote>
<p>V(G,D) = U(P_g,D) 
: 목적함수를 G를 거친 데이터들의 집합(분포)에 대한 목적함수로 새롭게 정의
: 수학적으로는 동일함 
: 목적함수 U는 p_g에 대해 convex 하므로, p_g의 정의역에서 전역 최솟값을 가짐 
: 고차원 데이터를 다루고 있기 때문에, 상한 부도함수(subderivatives, 해당 함수 모든 점에서의 최대 기울기 집합, 볼록함수는 모든 점에서 증가하기 때문에 상한 부도함수중 하나가 볼록함수의 도함수가 될 수 있음)를 사용</p>
</blockquote>
<p>-&gt; 이는 결국, p를 최적화 하는 과정이 목적함수 U(p_g,D)를 최적화 하는 것과 같은 과정임을 알 수 있음</p>
<h4 id="references">References</h4>
<p><a href="https://jamjamzo.tistory.com/77">https://jamjamzo.tistory.com/77</a> </p>
<p><a href="https://www.youtube.com/watch?v=AVvlDmhHgC4&amp;t=190s">https://www.youtube.com/watch?v=AVvlDmhHgC4&amp;t=190s</a> </p>
<p><a href="https://velog.io/@jiyeong3141592/GAN-%EA%B8%B0%EC%B4%88">https://velog.io/@jiyeong3141592/GAN-%EA%B8%B0%EC%B4%88</a></p>
<p><a href="https://tobigs.gitbook.io/tobigs/deep-learning/computer-vision/gan-generative-adversarial-network">https://tobigs.gitbook.io/tobigs/deep-learning/computer-vision/gan-generative-adversarial-network</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 논문 리뷰 ] Improving Language Understanding
by Generative Pre-Training (GPT1) ]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Improving-Language-Understandingby-Generative-Pre-Training-GPT1</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Improving-Language-Understandingby-Generative-Pre-Training-GPT1</guid>
            <pubDate>Sat, 03 Feb 2024 21:06:04 GMT</pubDate>
            <description><![CDATA[<p>최근 세간을 뜨겁게 달군 chat-GPT 
그것의 전신이라고 볼 수 있는 GPT 1을 함께 공부해봅시다!</p>
<p>main idea라고 생각되는 <strong><em>semi-supervised Learning</em></strong> 을 예시를 통해서 설명하자면 다음과 같은 느낌입니다. </p>
<blockquote>
<p>내가 아들을 하나 낳아서 그 아들을 성직자로 키우고 싶다.
인륜적인 생각을 벗어나서, 거의 100프로의 확률로 아들을 성직자로 키우는 방법은 무엇일까? </p>
</blockquote>
<blockquote>
<p>바로 교회에서 가둬 키우는 것이다. </p>
</blockquote>
<blockquote>
<p>그러나 교회에 가두면, 좋은 성직자가 될 수 없다. 세상을 모르기 때문이다. 
그렇기 때문에 성직자뿐만 아니라 많은 사람들이 있는 <strong>세상</strong>에서 아이를 어느정도 키우고, 그 다음 쥐도새도 모르게 납치를 해서 교회에서 감금을 시켜 아이를 키우면, 그 아이는 성직자가 될 확률이 높다. </p>
</blockquote>
<p>좀 무섭고 섬뜩한 예시이지만 GPT를 이해하는데에 도움이 될 것 같은 예시입니다. </p>
<hr>
<h3 id="abstract">Abstract</h3>
<p>NLP 는 다양한 Task 존재, 그에 반해 Labeled data 는 별로 없음.
Unlabeled data 는 진짜 엄청나게 많고 지금도 생성되고 있음. </p>
<blockquote>
<p><strong>Simple Examples of Labeled VS. Unlabeled in NLP</strong></p>
</blockquote>
<p><strong>Labeled Data 예시:*</strong>
-&gt;각 이메일이 &quot;스팸&quot; 또는 &quot;비스팸&quot;으로 레이블링된 데이터</p>
<blockquote>
</blockquote>
<p><strong><em>Unlabeled Data 예시:</em></strong>
-&gt;대량의 웹 기사 텍스트 데이터, 그러나 어떤 기사가 어떤 주제에 속하는지에 대한 레이블이 없는 데이터</p>
<p>=&gt; 다양한 Task 에 공통적으로 필요한 &quot;understanding&quot; 은 해결가능
=&gt; 특정 task 에 대한 것은..? </p>
<blockquote>
<ul>
<li>Unlabeled data Corpus들을 활용한 <strong><em>Generative Pre-Training</em></strong></li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><strong><em>discriminative Fine-Tuning</em></strong> 을 통해 다양한 task를 대할 때 큰 구조의 변화가 없도록 함  </li>
</ul>
</blockquote>
<hr>
<h3 id="introduction">Introduction</h3>
<p>일단, NLP task 에서는 전반적으로, 수많은 labeled data 들이 필요함.
unlabeled data 에서 언어적인 정보들을 활용해서 학습하는 모델이 있다면 참 좋을텐데.. (굳이 data 를 라벨링 해주지 않아도 되니까) </p>
<p>예를 들어, Pre-trained 된 word - embedding 값을 가지고 NLP task 에 적용시켜 성능향상을 이끌어 낸 연구가 존재. </p>
<p>-&gt; 근데 지금의 걸로는 문제가 있음</p>
<blockquote>
<h3 id="1">1.</h3>
<p>it is <strong>unclear</strong> what <strong><em>type of optimization objectives</em></strong> are most effective at learning text representations that are useful for <strong>transfer</strong></p>
</blockquote>
<p>단순히 unlabeled data 만을 사용하면 어떠한 목적함수가 transfer task에 효과적인지 잘 모른다 </p>
<blockquote>
<h3 id="2">2.</h3>
<p>there is <strong>no consensus</strong> on the most <strong><em>effective way to transfer these learned representations</em></strong> to the <strong>target task</strong></p>
</blockquote>
<p>target task 가 주어졌을 때, 각각의 task 에 대해서 어떻게 transfer 해야 효과적일지도 잘 모른다. 
(여기서 transfer 는 전이학습을 의미) </p>
<p>다시 말해, 어떤 목표를 향해 모델을 학습시켜야 텍스트 표현이 특정 작업에서 효과적으로 전이될 수 있는지에 대한 이해가 부족하다는 것</p>
<p>이러한 모호함이 현 연구의 문제점 </p>
<p>그래서 본 저자는 Semi-supervised Learning 을 제안함. </p>
<blockquote>
<p><strong>Semi-Supervised Learning</strong>
=&gt; Unsupervised <strong><em>Pre-training</em></strong> + Supervised <strong><em>Fine-Tuning</em></strong> 
=&gt; 그래서, 막대한 양의 Unlabeled data 를 활용해서 pre-trained model을 만들고, </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/e108699d-cb2a-42cd-95a9-74adbd356992/image.png" alt=""></p>
<blockquote>
<p>비지도 학습을 통해 PT 하고, 지도 학습으로 Fine Tuning을 하는 방법론
-&gt; DownStream Task </p>
</blockquote>
<hr>
<h3 id="framework">Framework</h3>
<h4 id="unsupervised-pre-training">Unsupervised Pre-Training</h4>
<p>일단은 전이학습을 위해 Pre-training 을 하는 부분을 알아보자.</p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/931adfa4-cb17-4f3c-9400-77d0b0da22e6/image.png" alt="">
학습은 여타 Language Model 들 처럼 위 Likelihood function 의 값을 최대화 하는 방향으로 진행. 
-&gt; 현재 i 번째 sequence 전의 값들이 모두 주어졌을 때, 현재 i 번째 값이 나올 값의 확률 최대화 
<img src="https://velog.velcdn.com/images/robert_1106/post/be38a217-b71c-4bf3-b321-7f0269c38897/image.png" alt="">
-구조는 간단하다! </p>
<blockquote>
<ol>
<li>input sequence 를 받아 word embedding , Positional embedding 수행 </li>
</ol>
</blockquote>
<ul>
<li>이때 h_0 가 위와 같이 표현됨 </li>
</ul>
<ol start="2">
<li>그 다음부터 hidden state 를 decoder 블락에 계속 넣어 학습시킴 </li>
</ol>
<ul>
<li>논문에서는 decoder block 이 12개 </li>
</ul>
<ol start="3">
<li>마지막에 최종 hidden state 값을 활용하여 확률값 출력 
<img src="https://velog.velcdn.com/images/robert_1106/post/359bcd45-3584-4143-892c-02311416a1f3/image.png" alt=""></li>
</ol>
<p>여기서 transformer 구조의 decoder 를 사용한 이유는 무엇일까? </p>
<p>현 논문의 저자들은 위에서 언급했듯, Pre-training 을 통해 &#39;understanding&#39;의 개념을 달성하고자 했다. </p>
<p>GPT 의 model 이 NLG(자연어 생성) 이나 NLM(자연어 모델링) 에 초점 맞춰져 있기 때문에 seq2seq 의 encoder-decoder 구조에서, 문맥벡터를 활용해 다른 시퀀스를 생성하는 decoder 구조만을 사용한 것이다. </p>
<p>(사실상 문맥벡터를 활용하는 encoder 값을 활용한 multi-head attention 부분도 없다.) </p>
<h4 id="supervised-fine-tuning">Supervised Fine-tuning</h4>
<p>이 부분은 이제 labeled data 를 사용하여 target task 에 맞게 model 을 fine tuning 시키는 과정이다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/91657b16-256e-4f8f-ac6d-3cd8066c1c72/image.png" alt=""></p>
<p>기본적으로, pretrain된 hidden state 값에 y를 예측하기 위한 가중치 W_y 가 곱해져 Linear layer로 들어가게 된다. </p>
<p>이제 데이터 셋에 label 값 y 가 존재하기 때문에, Likelihood function 은 y 값에 대한 확률을 사용한다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/f8e962fb-067a-4cde-9773-b9ac490a1607/image.png" alt="">
추가적으로 논문의 저자들은, L2 function 에 L1 function을 더하여 보조적인 역할로 사용했을 때, 모델의 일반화와 학습 속도 향상에 도움이 되었다고 한다. </p>
<blockquote>
<p>여기서 L1은 <strong><em>Unsupervised pre-training</em></strong> 부분에서 사용한 function으로, 위에서는 input 으로 U (즉, unlabeled dataset) 이 들어가있지만, 이 새로운 L3를 정의할 때는 fine-tuning 에 쓰이는 C (즉, labeled dataset) 이 들어가 있는 것을 확인할 수 있다. </p>
</blockquote>
<p>( 아마도 기존의 pretrained weight 들을 고정하지 않고 갱신시키면서 더 빠르고 정확한 최적화를 이룰 수 있지 않았을까.. 싶습니다. ELMO의 경우엔 기존 weight를 고정한다고 하네요.. ) </p>
<p>이제 구조를 살펴보자.</p>
<p>이 부분의 가장 중요한 부분은, 교회에 가두는 것. 즉, Task Specific 하게 Fine-tuning 시키는 것임! 그렇기에 <strong>TASK별로 input 구조를 다르게 하여</strong> 학습을 진행 </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/0070d756-d5aa-4bd7-bf33-fd9079435e3d/image.png" alt=""></p>
<blockquote>
<p>Input transformations for fine-tuning on different tasks </p>
</blockquote>
<blockquote>
<p><strong>Classification</strong></p>
</blockquote>
<ul>
<li>Text 만을 집어넣고, transformer hidden state 업데이트, 그 후 선형결합 </li>
</ul>
<blockquote>
<p><strong>Entailment</strong> </p>
</blockquote>
<ul>
<li>한 문장이 한 문장을 의미적으로 &#39;함의&#39; 하는가의 task <blockquote>
<p>-&gt; 전제(premise)와 가설(hypothesis)
-&gt; 두 문장 중 하나를 p, 하나를 h , p가 h를 함의하고 있는가를 검증 (Y or N)</p>
<ul>
<li>input data는 다음의 형태</li>
</ul>
<p><strong><em>[premise]  - &lt;&#39;delim&#39;&gt; - [hypothesis]</em></strong></p>
</blockquote>
ex) 동물이 밖에서 에너지를 소모한다 <strong>*&lt;&#39;delim&#39;&gt;*</strong> 개가 밖에서 산책한다 -&gt; 1 (0 or 1)</li>
<li>Precise 와 Hypothesis 문장 (데이터에서 라벨링 되어 있음) </li>
<li>이를 deliminator 를 이용해 구분하고 처리 </li>
</ul>
<blockquote>
<p><strong>Similarity</strong> </p>
</blockquote>
<ul>
<li>한 문장이 한 문장과 의미적으로 비슷한가의 task <blockquote>
<ul>
<li>input data는 다음의 형태</li>
</ul>
<p><strong><em>[sen1]  - &lt;&#39;delim&#39;&gt; - [sen2]</em></strong></p>
</blockquote>
ex) 나는 사과를 먹는다 <strong>*&lt;&#39;delim&#39;&gt;*</strong> 나는 참외를 먹는다 -&gt; 0.7 (0~1사이 실수값 , 유사도)</li>
<li>이를 deliminator 를 이용해 구분하고 처리 </li>
<li>sen1 과 sen2 를 순서를 바꾸어 처리하고 concat 하여 최종 결과값 냄</li>
</ul>
<blockquote>
<p><strong>Multiple Choice</strong></p>
</blockquote>
<ul>
<li>어떤 문맥에서 어떤 답변이 좋은가를 구분하는 task</li>
<li>동일한 context 에 대해 여러 답변들이 준비된 데이터 <blockquote>
<ul>
<li>input data는 다음의 형태</li>
</ul>
</blockquote>
</li>
<li><strong>[문맥] [선택지 1] [선택지 2] ... [선택지 N]*</strong></li>
<li>이를 구분하고, transformer 에 각각 넣어 처리한 뒤 각 선택지에 대한 linear - softmax 값으로, 확률이 출력된다. </li>
</ul>
<h4 id="conclusion">Conclusion</h4>
<ul>
<li>결국 GPT 는 semi-supervised learning 을 사용하여 task specific 한 LM을 구축한 것. </li>
<li>언어모델을 구성할 때 unlabeled data 를 활용하여 unsupervised pre-training </li>
<li>그 다음 특정 task 에 맞게 labeled data 의 input 을 transform 해서,task 별 label값 y를 맞추기 위한 supervised fine-tuning 을 실시해 기존의 weight 들을 조정해 나감 </li>
</ul>
<hr>
<p>화제가 되는 GPT가 어떤 식으로 구성되어 있는지 파헤쳐볼 수 있어서 즐거운 시간이었음! 
--딱히 즐겁지는 않았다-- </p>
<h4 id="references">References</h4>
<p><a href="https://ffighting.net/deep-learning-paper-review/language-model/gpt-1/">https://ffighting.net/deep-learning-paper-review/language-model/gpt-1/</a></p>
<p><a href="https://lcyking.tistory.com/127">https://lcyking.tistory.com/127</a></p>
<p><a href="https://www.youtube.com/watch?v=o_Wl29aW5XM">https://www.youtube.com/watch?v=o_Wl29aW5XM</a></p>
<p><a href="https://www.youtube.com/watch?v=4qv_ofZN5_U&amp;t=655s">https://www.youtube.com/watch?v=4qv_ofZN5_U&amp;t=655s</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[ 논문 리뷰 ] U-Net: Convolutional Networks for Biomedical Image Segmentation]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-U-Net-Convolutional-Networks-for-Biomedical-Image-Segmentation</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-U-Net-Convolutional-Networks-for-Biomedical-Image-Segmentation</guid>
            <pubDate>Sat, 27 Jan 2024 20:19:34 GMT</pubDate>
            <description><![CDATA[<h3 id="abstract">Abstract</h3>
<p>U-net 은 CV 중에서도 Biomedical segmentation 을 위해 나온 합성곱 신경망이다. 
기존 FCN(Fully Convolutional Network) 을 수정하고 확장시키면서 적은 데이터로 빠르게 효과적인 성능을 뽑아낼 수 있었다고 한다.<br>어떻게 그렇게 할 수 있었는지, 함께 공부해보자. </p>
<p>본 논문에서 집중해야 할 U-net의 main topics 들은 다음과 같다.  </p>
<blockquote>
<h4 id="data-augmentation">Data Augmentation</h4>
</blockquote>
<ul>
<li>DNN 기반의 CV 모델이 막대한 양의 데이터를 가지고 학습했을 때에만 성공적이었다. </li>
<li>U-net 은 강한 Augmentation 기법을 가지고 데이터를 효율적으로 사용할 수 있도록 했다.</li>
</ul>
<blockquote>
<h4 id="architecture">Architecture</h4>
</blockquote>
<ul>
<li><strong>End to end</strong> 방식을 활용하여 간단하고 빠른 구조를 가져감</li>
<li>대칭적인 수축 - 팽창 구조를 사용 </li>
<li><blockquote>
<p>수축 : context capture - 전체적인 맥락. <strong><em>숲!</em></strong> </p>
</blockquote>
</li>
<li><blockquote>
<p>팽창 : localization - 지협적인 정보. <strong><em>나무!</em></strong></p>
</blockquote>
</li>
</ul>
<h3 id="introduction">Introduction</h3>
<p>FCN 이 무엇인지 부터 봐보자. </p>
<p>FCN 은 기존의 Visual Recognition task 의 Single Class Label.
즉 하나의 이미지가 결국 무엇인지를 판단하는 것에서, 각 픽셀이 무엇인지를 판단하는 단계로 넘어가 Segmentation 을 하는 목적으로 나온 녀석. </p>
<blockquote>
<p>Segmentation Task 에서는 <strong>이미지의 위치정보</strong> 가 정말 중요한데, FC layer 를 거치려고 하는 순간 벡터화 되고, 그렇게 되면 위치정보는 사라짐! </p>
</blockquote>
<ul>
<li>그래서, Fully - Convolutional 한 네트워크를 고안해냈으니, 그것이 <strong><em>FCN</em></strong> 이다! </li>
<li>높이와 너비 (즉 이미지의 위치정보) 로는 정보축약을 하지 않고, 채널에 대해서만 축약을 하여 위치정보를 유지할 수 있도록 함. </li>
</ul>
<p>FCN 은 <strong>downsampling - upsampling</strong> 이라는 것을 하는데, </p>
<blockquote>
<p><strong>Down Sampling</strong></p>
</blockquote>
<ul>
<li>우리가 아는 CNN의 구조와 유사한데, FC layer 만 없는 구조다</li>
<li>FC layer 를 1 x 1 conv 로 대체해서, 채널 정보 축약 - 피쳐맵 형성 </li>
</ul>
<blockquote>
<p><strong>Up Sampling</strong></p>
</blockquote>
<ul>
<li>Feature map 을 다시 input img 사이즈로 키워주는 역할</li>
<li>정보가 축약된 녀석을 다시 부풀리는 과정, Convolution의 반대 개념인 Transposed Convolution을 이용 (여기서도 Parameter 학습 일어남) </li>
<li>영역의 대푯값을 가져다가 축약하는 Conv &lt;-&gt; 해당 영역의 대표값으로 나머지 값들을 추론하는 Up Sampling </li>
<li>부풀려서 값을 채워넣고, 남은 값들에  bilinear interpolation 방식으로 내분값들을 넣음. </li>
</ul>
<p>근데 이 저자들이 보기에 FCN 도 조금의 단점이 존재했다! </p>
<blockquote>
<p><strong>기존 Sliding Window 방식</strong></p>
</blockquote>
<ul>
<li>Sliding Window 방식을 사용해서 input img 를 싹 돌면, 겹치는 부분도 너무 많고, 하나하나 다 conv 연산을 거쳐야 하기 때문에 너무 느림 </li>
</ul>
<blockquote>
<p><strong>Localization Vs Context</strong></p>
</blockquote>
<ul>
<li>지협적인 정보의 정확도를 높이기 위해서 필터를 작게하면, 전체 input 의 맥락을 잘 모름</li>
<li>전체 input 의 맥락을 잘 보기 위해서 필터를 키우면, 또 지협적인 정확도가 떨어짐 </li>
<li>이러한 Trade off 가 존재</li>
</ul>
<p>저자들은 이 FCN을 발전시켰는데, 한번 아키텍쳐와 함께 봐보자. </p>
<h3 id="network-architecture">Network Architecture</h3>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/fb54c445-da48-4583-a591-978926b42798/image.png" alt=""></p>
<p>기존 FCN 의 또 다른 특징 중 하나는 Skip Connection 인데, 이는 Upsampling 시의 정확도를 높여주기 위해, 이전 Layer 의 Feature map을 넘겨받아 더해주는 것이다. </p>
<p>위 아키텍쳐가 바로 U-net 이다. 
U-net 은 좌측의 input 부근의 Contraction Path 와 우측 output 부근의 Expansive Path , 그리고 그 둘을 이어주는 Bottle neck 부분으로 이루어져 있다. </p>
<blockquote>
<h4 id="contraction-path-수축-경로">Contraction Path (수축 경로)</h4>
</blockquote>
<ul>
<li>이 부분은 흔히 아는 convolution 연산을 하는 부분이다. </li>
<li>2번의 3 x 3 convolution 연산 이후 ReLU activation Func 을 사용한다. 패딩은 따로 하지 않는다. </li>
<li>2 x 2 , stride = 2 로 max pooling 을 진행</li>
<li>이때 각 단계에서 나온 Feature Map 을 crop 하여 저장해 놓는다. </li>
<li><strong>(Crop 을 하는 이유는, Padding 이 없기 때문에 input path 와 output path 의 사이즈 차이가 나기 때문이다.)*</strong> </li>
</ul>
<blockquote>
<h4 id="bottle-neck">Bottle Neck</h4>
</blockquote>
<ul>
<li>3 x 3 conv , ReLU * 2 </li>
<li>Drop Out </li>
</ul>
<blockquote>
<h4 id="expansive-path-확장-경로">Expansive Path (확장 경로)</h4>
</blockquote>
<ul>
<li>up sampling 을 하는 구간이다. 똑같이 3 x 3 convolution 연산을 두번 한다.  </li>
<li>그 후 2 x 2 max pooling 대신에, 같은 scale 의 up convolution 연산을 한다. </li>
<li>이때, 각 단계에서 대응되는 Contraction Path 의 Feature map 을 부착한다! (Conv 연산 전에) =&gt; <strong>*Skip Connection 효과 *</strong></li>
</ul>
<p>U-net 의 구조는 확장과 팽창 구조가 알파벳 U 처럼, symmetric 하다는 특징이 있다. </p>
<p>구조를 배웠으니 이제 U-net 만의 특별한 방법들을 알아보자. </p>
<h3 id="specific-strategies">Specific Strategies</h3>
<blockquote>
<p><strong><em>U-net의 Patch 탐색 방식</em></strong>
<img src="https://velog.velcdn.com/images/robert_1106/post/1fbf367a-a718-4ada-8100-c0af0795514b/image.png" alt=""></p>
</blockquote>
<ul>
<li>U-net 은 sliding window 방식 대신, 중복되지 않은 patch 로 데이터를 구성함.</li>
<li>중복되는 부분을 제거하여 필요 이상의 검증을 제거. </li>
<li>시간과 연산 측면에서 많은 낭비를 줄임.</li>
</ul>
<blockquote>
<p><strong><em>Mirroring Extrapolate &amp; Overlap-Tile Method</em></strong></p>
</blockquote>
<ul>
<li>U-net 은 padding 을 사용하지 않고, conv 연산을 수행 
(항상 출력&lt;입력) </li>
<li>그래서, 특정 부분에 대한 segmentation 을 하려면 그것보다 큰 게 들어가야 함. 
<img src="https://velog.velcdn.com/images/robert_1106/post/9ae933ad-a068-416e-a073-5ead420eba1c/image.png" alt=""></li>
<li>그런데 끄트머리에 있는 애들은 어떻게 해야할까? </li>
<li>추가적으로 필요한 부분에 대하여 mirroring 을 하여 채워넣음</li>
<li>그리고,  contraction 에서는 겹치지만 expansive 에선 겹치지 않도록 진행. 
<img src="https://velog.velcdn.com/images/robert_1106/post/69ddf5fb-2cc1-4f7a-8301-ec16d60223c2/image.png" alt=""></li>
</ul>
<blockquote>
<p><strong><em>Data Augmentation- Elastic Deformation</em></strong> 
<img src="https://velog.velcdn.com/images/robert_1106/post/31c4a78d-2074-4b36-963a-1275e50ff676/image.png" alt=""></p>
</blockquote>
<ul>
<li>저자들은 적은양의 데이터로 좋은 효과를 내기를 바라며 해당 모델을 구성했음.</li>
<li>Data Augmentation 기법에 큰 관심을 기울임</li>
<li>일반적인 증강 방식 말고도, 특히 Biomedical task 에 어울리는 <strong><em>Elastic Deformation</em></strong> 기법을 사용함</li>
<li>이는 data metric위 임의의(Gaussian Dist) 벡터를 조정하여 굴곡을 줌으로써 생물학적인 특성에 더 강건하도록 만들어줌 </li>
</ul>
<h3 id="training">Training</h3>
<p>U-net 을 training 한 방법에는 biomedical data 에서 Augmentation 을 잘 수행하기 위한 노력들이 드러나 있다! 한번 봐보자</p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/e087fa2e-85f9-4e24-85b9-a7d43c8c42c4/image.png" alt="">
이게 바로 U-net의 Loss Func 이다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/bc901198-48c8-47ca-9877-dd83ad6199eb/image.png" alt="">
여기서 W(x) 는 학습되는 가중치이고, 뒤에 달려있는 P_k(x) 는 추론 값이다. <img src="https://velog.velcdn.com/images/robert_1106/post/56b91d68-2b83-44bf-9f51-eb3177841f9c/image.png" alt="">
여기서 k 는 해당 클래스 , K는 전체 클래스의 수를 의미한다.
ak(x)는 x 라는 pixel 에서 작용하는 activation function을 의미한다.
그렇기 때문에 고로 전체 클래스들에서 해당 클래스에 해당 픽셀이 포함되어 있을 확률, 즉 추론 값을 의미한다. </p>
<p>W(x)가 이제 좀 재미있는데, 
<img src="https://velog.velcdn.com/images/robert_1106/post/677ac211-2517-4696-a0ad-30a025a9cfdb/image.png" alt="">
W(x) 는 x 라는 픽셀에 얼마나 큰 가중치를 부여할지를 나타내는 부분이다.
Wc(x) 는 x가 속한 class 의 빈도수를 말한다. 
그리고 그 뒤에 붙은 항이 이제 좀 특별하다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/1428b944-8e07-4905-a831-955fd1f711a4/image.png" alt="">
세포들은 위와 같이 아주 딱 달라붙어 있는 경우가 많아서, 그 경계를 잘 학습해야 보다 정확한 segmentation 이 가능하다고 한다. </p>
<p>그래서 이들은 &#39;경계&#39;의 부분에 따로 더 큰 가중치를 주어, 결과적으로 Loss 값을 늘리므로써 &#39;경계&#39;를 더 잘 분류하겠다는 목표를 가지고 해당 term을 만들었다. </p>
<p>위 식에서 d1 은 해당 픽셀로부터 가장 가까운 세포 경계 와의 거리이고 d2 는 그 다음으로 가까운 세포 경계와의 거리이다. </p>
<h4 id="conclusion">Conclusion</h4>
<p>구조도 구조인데 Augmentation 이나 Loss function 부분을 자신들의 목적에 맞게 만진 부분이 아주 재밌었던 것 같다. 사실 막 재밌진 않았다. </p>
<h4 id="references">References</h4>
<p><a href="https://velog.io/@jeewoo1025/What-is-end-to-end-deep-learning">https://velog.io/@jeewoo1025/What-is-end-to-end-deep-learning</a></p>
<p><a href="https://www.youtube.com/watch?v=O_7mR4H9WLk">https://www.youtube.com/watch?v=O_7mR4H9WLk</a></p>
<p>국민대학교 박종혁 교수님 ; 231024-비전AI와비즈니스-세분화</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Attention is all you need ]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Attention-is-all-you-need</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Attention-is-all-you-need</guid>
            <pubDate>Fri, 26 Jan 2024 07:10:21 GMT</pubDate>
            <description><![CDATA[<p>현재 AI 업계를 가장 큰 화두에 올린 장본인인 openAI의 chatGPT의 핵심적인 뇌 구조! 그 구조의 핵심이 되는 기본, Attention 과 Transformer 구조를 함께 공부해보자! </p>
<p>피드백은 언제나 환영입니다 :) 제가 잘못 안 게 있다면 언제든 알려주세요 ! </p>
<h3 id="introduction--abstract">Introduction &amp; Abstract</h3>
<p>저번에 공부했던 Seq2Seq 를 발전시킨 Attention 이라는 구조를 기본적으로 이해하고 들어가야 한다. </p>
<h4 id="about-attention">About &#39;Attention&#39;</h4>
<ul>
<li>Seq2Seq 은 단어의 사이즈가 클 때 문제가 생겼음!</li>
<li>Seq 가 길어지면, 모든 정보를 함축하기에, context vector 가 부족하다는 것.</li>
<li>Encoder 단에서의 충분한 정보가 없기 때문에, 기계번역이 어려워지는 경향</li>
</ul>
<blockquote>
<h4 id="이전-encoder-단에서-활용한-context-vector-v는-마지막-lstm-의-hidden-state-값이었음">이전 Encoder 단에서 활용한 Context vector <strong><em>V</em></strong>는 마지막 LSTM 의 hidden state 값이었음!</h4>
<p>--&gt; 수학적으로는 모든 문맥 정보를 조금씩 함축하고 있어야 하기는 하나, 저번 seq2seq 리뷰 마지막에서 볼 수 있듯 실질적으로는 그렇지 못했음 </p>
</blockquote>
<p>: 그렇다면 모든 RNN cell 각각의 state들을 모두 활용하여, context vector 를 만들면 좋지 않을까? </p>
<blockquote>
<p>고정된 사이즈의 문맥벡터 탈출 ! </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/6b2309b8-835b-4291-8f76-c30e2667e9c3/image.png" alt="">
위 구조를 집중해서 봐보자! 
Seq2Seq + Attention 구조를 활용해서 
<strong><em>I love you -&gt; 난 널 사랑해</em></strong> 로 기계번역 하는 과정이다.</p>
<p>이 구조를 어렵게 보지말고, 크게 두 가지에 집중해보자.</p>
<ol>
<li>Encoder 에서 hidden state 가 얼마나, 어떻게 넘어가고 있는지</li>
<li>못보던 층 구조는 무엇인지</li>
</ol>
<blockquote>
<p><strong>1. Encoder 의 hidden states</strong></p>
</blockquote>
<ul>
<li>일단 딱 봐도 원래 seq2seq 처럼 하나의 context vector 가 아니다!</li>
<li>각 RNN cell 에서 나오는 hidden state 값이 모두 FC layer 에 들어간다. </li>
<li>sequence 전체의 state 값을 사용하여 task에 활용한다고 보면 되겠다. </li>
</ul>
<blockquote>
<p><strong>2. FC + Softmax와 Attention weight</strong></p>
</blockquote>
<blockquote>
<ul>
<li>FC layer 는 모든 seq 의 hidden state 값 + Decoder의 전 state 값을 받아 seq 별 score 를 계산한다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/b7769441-1a7c-4c13-a733-f389a8b1e3ec/image.png" alt=""></li>
</ul>
</blockquote>
<ul>
<li>이때 이 score 는 지금 문맥상으로, 어떤 seq의 hidden state에 보다 더 <strong>집중</strong>을 해야 하는지를 알 수 있게 해준다. </li>
</ul>
<blockquote>
<ul>
<li>Softmax 는 FC layer 의 값(score) 을 확률화 시켜주는 부분이다. 
그리고 softmax 를 거져 나온 score 값이 바로, Attention weight이다! </li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/58591cd7-e664-4aeb-9248-a2c802e649a1/image.png" alt="">
이를 통해 기존의 RNNenc (Seq2Seq 구조) 에서, RNNSearch (seq2seq + attn ) 으로의 비약적인 성능 향상을 이루어 냄 </p>
<p>그런데, 아직도 RNN 을 순차적으로 돌아서 계산을 해나가야 하는 단점과 성능향상에서의 잠재력이 보였던 구조. </p>
<p><strong><em>순환 신경망을 없애버리면 어떨까?</em></strong></p>
<h3 id="about-transformer">About Transformer</h3>
<p>Transformer 는 sequencial data 를 다룰 때, Encoder - Decoder 구조를 그대로 가져가되 RNN 을 사용하지 않는다.</p>
<p>seq의 token 하나 당 하나의 셀에 들어가 계산을 하고 그 다음 token이 그 다음 계산을 하고 하는 과정을 획기적으로 간파한다.</p>
<p>지금부터 그 과정을 살펴보자.</p>
<h4 id="positional-embedding">Positional Embedding</h4>
<p>RNN 을 사용했던 이유는 Sequencial 한 data 를 다룰 때 , 그 순서가 정말 중요하기 때문인데, RNN 을 사용하지 않고 그걸 어떻게 할까? </p>
<p>바로 positional embedding 이다.</p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/345fa92c-1238-4e5b-84ee-f19c17737b2e/image.png" alt=""></p>
<blockquote>
<p>인코더 및 디코더의 입력값 마다 해당 값의 sequence 내 상대적인 위치를 인코딩해주는 것!
: 위 식을 보면 알 수 있듯이, t번째 값에 t번째 요소를 곱해주는 벡터의 형태
: 각 요소들은 w_k 값에 의해 각 좌표계 정의역에 linespace 하게 됨</p>
</blockquote>
<p>이를 활용해 transformer 는 RNN 없이도, 해당 값의 문맥 내 위치정보를 더해줄 수 있다. </p>
<h4 id="self-attention">Self Attention</h4>
<p>Transformer 에서 일어나는 Attention 연산은 바로 이 Self - Attention 이다. 한번 공부해보자. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/b9350545-a2b8-4019-8a1b-7a681aa1f0a1/image.png" alt=""></p>
<blockquote>
<p>Self attention 은 위와 같이 Wq ,Wk , Wv 라는 weight matrix 를 학습하고 갱신하는 과정으로 Query,Key,Value(Q,K,V) 를 개선시키는 방식으로 진행된다.</p>
</blockquote>
<ul>
<li>각 값들에 대한 Q,K,V 가 벡터로 생성된다. </li>
<li>이 Q,K,V 는 Attention Score 를 구하는데 사용된다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/ca8f9c92-d8a2-4187-81b4-edffaafb822c/image.png" alt=""></p>
<blockquote>
<ul>
<li>Attention Score 란 해당 부분을 해석할 때, 얼마나 집중을 해야하는지를 보여주는 값! (잘 모르겠다면 위에 다시 ! ) </li>
<li>Query 와 Key 의 벡터곱으로 Attn score 산출하고 확률화 시킴
그리고 value 와 attn score 를 합성곱하여 최종 결과를 산출! </li>
</ul>
</blockquote>
<p>-&gt; 위 계산 과정이 복잡해 보이지만, 행렬의 연산으로 생각하면, 정말 빠르다. </p>
<p>일어나는 연산은 </p>
<blockquote>
<p><strong><em>DATA x Weight Matrix (Q,K,V)</em></strong>  </p>
</blockquote>
<blockquote>
<p><strong>* Softmax( Query Mat x Key Mat ^ T ) x Value 의 SUM *</strong></p>
</blockquote>
<p>그렇게 간단하게 표현하지도 않았는데 이게 끝이다.
RNN의 순차적이고 귀찮은 동적인 Attention 구조를 다음과 같이 병렬적인 연산으로 처리한 것이다. </p>
<h4 id="multi-head-attention">Multi-head Attention</h4>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/879631d7-e551-4e1e-a57c-97b636e3deef/image.png" alt="">
Multi-head Attention 은 transformer 내의 여러 self-attention 을 병렬적으로 활용함으로써, (논문에서는 8개를 활용) 문장의 모호함에 강건하게 대비할 수 있도록 함. 
-&gt; 여러가지 의견을 제시받는 것과 비슷한 느낌 </p>
<h3 id="architecture---encoder">Architecture - Encoder</h3>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/c236d49b-6f62-4531-9abc-90fd1069534d/image.png" alt="">
위 그림이 Transformer 의 Encoder - Decoder 구조이다! </p>
<p>일단 Encoder 부분만 보면 거의 다 우리가 배운 것들이다. </p>
<p>중간중간 Add 하고 정규화 하는 부분으로 넘어가는 화살표는, 아래와 같이 학습 시 역전파 과정에서 seq 내의 위치정보가 흐려지기 때문에 그걸 방지해주고자 Residual Connection 으로 Positional Embedding 값을 더해주는 부분이다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/f031ef66-654c-4e51-9c3b-6635c22a251c/image.png" alt=""></p>
<blockquote>
<p>Transformer 의 Encoder 는 생각해보면 입출력 차원이 똑같다! 
이 말은 무슨 말이냐하면,
Encoder 뒤에 바로 Encoder 를 붙여서 더 깊은 layer 를 쌓을수도 있다는 의미이다! </p>
</blockquote>
<ul>
<li>실제로 논문의 저자들은 Encoder Layer를 여섯층 쌓아서 나온 출력값을 Decoder 부분으로 넘겼다. </li>
<li>이때의 layer 들은 가중치를 공유하지 않고 따로 학습한다 (당연히!) </li>
</ul>
<h3 id="architecture---decoder">Architecture - Decoder</h3>
<p>기본적인 Encoder Decoder 구조를 알고, self - Attn 메카니즘을 정확히 이해했다면 , Transformer 의 Decoder구조는 어렵지 않다.
<img src="https://velog.velcdn.com/images/robert_1106/post/cd20fd12-36b8-45df-8d25-e4c963be579d/image.png" alt=""></p>
<blockquote>
<p>위 구조에서 보아야 할 것은 두개! 
*<em>1. Masked Multi-Head Attention 이 무엇인가? *</em>
*<em>2. Decoder 부분의 Multi-head Attention 의 Q,k,v는 어디서 흘러들어오는가? *</em></p>
</blockquote>
<blockquote>
<p><strong>Masked Multi-Head Attention</strong></p>
</blockquote>
<ul>
<li>디코더 부분에서 지금까지 출력된 값들에 대해서만 Attention 을 적용하기 위해 단어를 가려주는 Attention 방식 </li>
<li>아직 출력되지 않은 미래의 값에 적용하지 않도록 함</li>
</ul>
<blockquote>
<p>*<em>2. Decoder 부분의 Multi-head Attention 의 Q,k,v는 어디서 흘러들어오는가? *</em></p>
</blockquote>
<ul>
<li>Query 로는 Decoder 의 입력값을 사용하나, <strong>Encoder의 최종 출력값을 Key 와 Value 로</strong> 받는다! </li>
<li>이 부분이 Seq2Seq의 Context Vector 의 역할을 톡톡히 해준다!</li>
<li>Input 문장의 중요한 정보를 6 layered Attention Encoder 를 통해 key 와 value 의 형태로 넘어오게 된다. </li>
<li>Sequence 전체의 흐름뿐만 아니라 부분마다 smoothing 되어 나타나는 해석 중요도 의미값들을 사용할 수 있다는 것 (덧셈으로 최종 결과값들이 추출되기 때문!) </li>
</ul>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/f9cd35f9-b4ee-448a-8620-a60f6dc8afbe/image.png" alt="">
-&gt; 디코더의 경우에도 입출력 차원이 같아 논문의 저자들은 6개를 쌓았다.</p>
<p>추가적으로 저자들은 <strong><em>Label Smoothing</em></strong> 이라는 기법을 활용하는데, 그것은 바로 Target 값이 Softmax 이후에 0,1 의 one-hot 이 아니라 0.1 , 0.8 , ... 등의 0과 1에 가까운 값으로 표현되게 하는 것이다. </p>
<p>이건 답이 명확한 데이터일때는 오히려 성능 감소를 불러올 수 있지만, 더럽고 불명확한 데이터 일 때에는 outlier 나 어려운 문제에 대응할 때 애매한 대답을 내놓음으로써 성능 향상을 크게 일으킨다고 한다. </p>
<h3 id="outro">outro</h3>
<p>개어려웠다. </p>
<h4 id="references">References</h4>
<p><a href="https://blog.floydhub.com/attention-mechanism/">https://blog.floydhub.com/attention-mechanism/</a></p>
<p><a href="https://ratsgo.github.io/nlpbook/docs/language_model/tr_self_attention/">https://ratsgo.github.io/nlpbook/docs/language_model/tr_self_attention/</a></p>
<p><a href="https://www.youtube.com/watch?v=WsQLdu2JMgI">https://www.youtube.com/watch?v=WsQLdu2JMgI</a> </p>
<p><a href="https://www.youtube.com/watch?v=mxGCEWOxfe8&amp;t=6s">https://www.youtube.com/watch?v=mxGCEWOxfe8&amp;t=6s</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Sequence to Sequence Learning with Neural Networks]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Sequence-to-Sequence-Learning-with-Neural-Networks</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Sequence-to-Sequence-Learning-with-Neural-Networks</guid>
            <pubDate>Fri, 26 Jan 2024 05:27:13 GMT</pubDate>
            <description><![CDATA[<p>seq 2 seq 는 2014년 등장해 비약적인 성능 향상을 보여주어 큰 관심을 끌었고, 핵심적인 LSTM Encoder - Decoder 구조가 Transformer 와 같은 아키텍쳐에도 활용되고 있는 획기적인 아이디어 입니다! </p>
<p>함께 공부해 보아용! </p>
<h3 id="introduction--abstract">Introduction &amp; Abstract</h3>
<p>seq 2 seq 는 기본적으로 <strong>문장</strong>과 같은 연속형 데이터(sequencial data) 를 효과적으로 처리하기 위해 등장한 녀석임.</p>
<p>입력 데이터를 sequence의 형태로 받고, sequence의 형태로 내뱉는.</p>
<p>가장 간단하고 직관적인 예시로, 기계번역이 있음</p>
<blockquote>
<p>🔺 <strong><em>나는 너를 사랑해 -&gt; I Love You</em></strong>
이처럼 문장을 넣어, 문장이 나오는 형태의 Task 를 대표적인 예시로 들 수 있음</p>
</blockquote>
<p>Seq2Seq 는 딥러닝 기반의 접근인데, 그 이전의 <strong><em>전통적 모델들</em></strong> 그리고 <strong><em>Seq2seq 이전의 딥러닝 기반 모델들</em></strong> 은 어떻게 이런 문제들을 다뤘을까? 그걸 먼저 살펴보자</p>
<blockquote>
<h4 id="전통적-언어모델">전통적 언어모델</h4>
<ul>
<li>방대한 양의 언어 데이터베이스가 기반</li>
<li>어떤 문장이 input 으로 들어왔을 때, 그 문장을 tokenize 함 
ex) 나는 사과를 먹었다 --&gt; 나는 , 사과를 , 먹었다</li>
</ul>
</blockquote>
<ul>
<li>데이터 베이스를 기반으로, <strong>확률이 높은</strong> 다음 token 을 선별
<img src="https://velog.velcdn.com/images/robert_1106/post/b20fff25-32de-4947-ba43-0d2bb09768ab/image.png" alt=""></li>
<li>연쇄법칙이 활용됨 : 데이터베이스에 없는 문장이 엄청나게 많았을 것..! -&gt; <strong>N-gram</strong> 으로 어느정도 해결했었음 (근처에 있는 토큰만 생각하여 확률 추출)</li>
<li><strong>연쇄법칙*</strong> :
<img src="https://velog.velcdn.com/images/robert_1106/post/d9ee2d40-2c80-4bbc-b8e8-d40205926f3d/image.png" alt="">
ex) P(나는 사과를 먹었다) = P(나는) x P(사과를|나는) x P(먹었다|나는,사과를) </li>
</ul>
<blockquote>
<h4 id="rnn-기반-언어모델-seq2seq-이전">RNN 기반 언어모델 (Seq2seq 이전)</h4>
<p>ex) 논문에서 말하는 DNN 등 (speech recognition 등의 task에서 효과적) 
<img src="https://velog.velcdn.com/images/robert_1106/post/8ee5107b-c657-443f-916f-62bb845515fd/image.png" alt=""></p>
</blockquote>
<ul>
<li>Recurrent Network 를 활용하여, 이전 input 으로부터 문맥벡터를 추출하고, 그걸 다음 네트워크에 전달하는 방식 </li>
<li>가중치는 전단계 (t 일때, t-1 번째) 의 것에 영향을 받으므로, 마지막 문맥벡터는 수학적으로 모든 sequence 의 정보를 함축하고 있음. </li>
<li>입출력의 사이즈가 동일하다는 가정하에 진행</li>
<li>매번 Input이 들어갈 때마다 번역 결과가 나오게 되면, 정확한 번역이 진행되지 않을 수 있다는 문제 존재 
(<strong><em>저자들의 main task가 기계번역이었으므로 위와 같이 말합니다!</em></strong>) </li>
</ul>
<h3 id="about-model">About Model</h3>
<p>그렇다면, Seq2seq Learning 은 무엇이 다를까? </p>
<p>현재까지 RNN 기반 모델의 단점은, 
** 1. 입출력 사이즈가 동일하다는 가정 **
** 2. Token별로 나오는 output 의 정확도에 대한 의문 **
위 두가지 이다. </p>
<p>저자들은 해당 문제를 Encoder - Decoder 구조를 활용하여 해결한다. </p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/106f8277-1b55-45f6-9b41-8d38909e3ca5/image.png" alt=""></p>
<blockquote>
<p>** Encoder ** </p>
</blockquote>
<ul>
<li>Token 별로 나오는 output 은 해당 output 이 문맥벡터를 정확히 내포하고 있는지 등에 대한 의문으로 정확성의 문제가 있어보임.</li>
<li>그 Encoder는 input 으로부터 고정된 크기의 문맥벡터를 하나 가져옴</li>
<li>위에서 설명했던 RNN 구조의 <strong><em>마지막 문맥벡터</em></strong> 는 수학적으로 전체 sequence 의 정보를 함축하고 있어야 한다고 했다! </li>
<li>이때의 고정된 크기의 context vector <strong><em>V</em></strong> 는 그것을 말한다. </li>
</ul>
<blockquote>
<p>** Decoder ** </p>
</blockquote>
<ul>
<li>Decoder 는 해당 V 를 기반으로 번역 결과를 추론함.</li>
<li>이때 Decoder 와 Encoder의 parameter 는 서로 다르게 학습된다.
( 서로 다른 모델이기 때문에 Encoder는 입력 sequence와 관련된 도메인을 학습하고 Decoder는 출력 sequence와 관련된 도메인을 따로 학습 ) </li>
</ul>
<h3 id="more-about-model">More about Model</h3>
<p>기본적인 구조를 알았으니, 조금 더 들어가보자.</p>
<p>추가로 핵심적으로 이해할 것 한 가지는 LSTM 이다. </p>
<hr>
<p><strong><em>About LSTM</em></strong> (추가예정) </p>
<hr>
<p>본 논문의 저자는, LSTM 을 활용하여 Seq2Seq 구조를 구성했다. 
<img src="https://velog.velcdn.com/images/robert_1106/post/38eb8870-51cc-4672-ae08-1e83347a8cfa/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/46527204-1c12-4c7a-974b-59d0cc63fb20/image.png" alt="">
위 두 사진을 보면, 구조를 어느정도 심층적으로 알 수 있다. </p>
<p>Encoder 와 Decoder 에서 서로 다른 심층 LSTM 을 사용하여 <strong><em>서로 다른</em></strong> 가중치를 학습시킨다 </p>
<ul>
<li>여기서 Embedding 은 입출력 차원의 크기가 너무 큰 것을 대비하여 시켜주는 것이라고 보면 된다. (그냥 one - hot 으로 하면 차원이 너무 커질 경우가 존재하기 때문) </li>
</ul>
<blockquote>
<p>또 하나 신기한 점은, 수학적으로는 연계법칙에 의해 큰 차이가 없어야 하지만, input seq의 순서를 거꾸로 하여 학습시켰더니 성능 향상이 일어났다는 것이다! </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/61f5df85-4226-49b1-b259-70dc42781e25/image.png" alt=""></p>
<ul>
<li>아무래도, Encoder 의 context vector 가 전체 seq 를 골고루 함축하기 보다는 output (vector) 에서 가까운 token 의 가중을 크게 한 것 같다.</li>
<li>그 말은 즉슨, </li>
</ul>
<ol>
<li>적어도 기계번역 task 에서는 앞 token 의 중요도가 높다는 것</li>
<li>아직은 Long - term dependency (장기의존성) 문제가 존재한다는 것</li>
</ol>
<p>이후 Attention is all you need 에서 더 발전된 내용을 함께 살펴보자! </p>
<h4 id="references">References</h4>
<p><a href="https://www.youtube.com/watch?v=4DzKM0vgG1Y&amp;t=45s">https://www.youtube.com/watch?v=4DzKM0vgG1Y&amp;t=45s</a> </p>
<p><a href="https://velog.io/@nkw011/seq-to-seq">https://velog.io/@nkw011/seq-to-seq</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 2014 ]]></title>
            <link>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Spatial-Pyramid-Pooling-in-Deep-Convolutional-Networks-for-Visual-Recognition-2014</link>
            <guid>https://velog.io/@robert_1106/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Spatial-Pyramid-Pooling-in-Deep-Convolutional-Networks-for-Visual-Recognition-2014</guid>
            <pubDate>Thu, 25 Jan 2024 12:19:06 GMT</pubDate>
            <description><![CDATA[<p>본문에서는 SPPnet 논문과 관련 지식들을 다룹니다.
오류가 있다면 언제든 지적해주세요!  </p>
<h3 id="introduction--abstract">Introduction &amp; Abstract</h3>
<ul>
<li>현존 CNN모델들은 <strong><em>input size가 고정</em></strong> 되어야 하는 <strong>문제</strong>를 가지고 있음</li>
</ul>
<blockquote>
<p><strong><em>왜 고정되어야 하는가?</em></strong>
CNN 모델은 크게 convolution layer 와 fully-connected layer 로 구성되어있는데, Conv layer 는 어떤 이미지를 넣어도 sliding window 를 통해 해당 input 의 feature map 을 만들어주지만, Fully-connected layer 가 고정된 인풋을 받아야 하기 때문이다. (고정된 사이즈의 아웃풋 벡터와 연결을 해주는 놈이기 때문에)</p>
</blockquote>
<blockquote>
<p>: <strong><em>왜 문제인가?</em></strong></p>
</blockquote>
<ol>
<li>인풋 데이터의 scale 과 aspect ratio 를 제한함</li>
<li>cropping 된 데이터에 object 의 전체 모습이 들어가지 않게 될 수 있음</li>
<li>scale 을 맞추기 위해 warp 되면 뜻하지 않은 왜곡이 생길 수 있음
<img src="https://velog.velcdn.com/images/robert_1106/post/fa98b4e9-88f2-4ea8-ad32-f6400467c6f5/image.png" alt=""><blockquote>
<p><strong>* -&gt; 학습 정확도가 낮아질 충분한 위험! *</strong></p>
</blockquote>
</li>
</ol>
<ul>
<li><p>SPP net 은 인풋 사이즈가 ** 고정되지 않아도 됨 **</p>
</li>
<li><p>image 를 crop,warp 시키고 conv 통하면 문제가 발생. </p>
</li>
<li><p>SPPnet 은 그런 단점을 최소화 하고자, <strong><em>원본 이미지를 먼저 conv 통하게 하고</em></strong> , SPP layer (Spatial Pyramid Pooling layer) 를 통해 fc 들어가기 앞서 인풋 벡터 사이즈를 조정해줌 
<img src="https://velog.velcdn.com/images/robert_1106/post/7eecc2bd-1bb3-45d2-b50f-c7cb2994e56a/image.png" alt=""></p>
</li>
</ul>
<blockquote>
<p>이를 통해, </p>
</blockquote>
<ol>
<li>원본 이미지의 특징을 그대로 가져온 피쳐맵을 추출가능! </li>
<li>목표 사물의 다양한 scale 에도 대응가능!</li>
<li>Image classification , Object detection 등에도 활용가능! </li>
</ol>
<p>R-CNN에 비해서는 어떨까? </p>
<blockquote>
<p><strong><em>정확도는 비슷하나, 속도가 엄청 빠르다!</em></strong>
HOW? </p>
</blockquote>
<ul>
<li>R-CNN과 정확도는 비슷한 반면 속도가 약 20~100배 빠름</li>
<li>그 이유는 업무의 효율성에 있음</li>
</ul>
<p> <strong>* CNN은 아래와 같이, Selective Search를 통해, 수 많은 ROI(Region of Interest)들을 뽑아내고, 각각을 convolution layer 에 통과시키는 계산을 함*</strong>
<img src="https://velog.velcdn.com/images/robert_1106/post/68e75888-79ef-4d29-a5f4-02991cae5ad8/image.png" alt=""></p>
<p><strong><em>SPPnet은 원본 이미지를 먼저 Convolution layer에 넣고 ROI 대상에 한정된 feature map을 SPP layer 를 통해서 고정된 크기의 벡터를 출력한 다음, FC layer 에 보내준다는 차이가 있다 !</em></strong></p>
<p><img src="https://velog.velcdn.com/images/robert_1106/post/70ed84a0-edcd-496b-b3f6-5127eb8576cb/image.png" alt=""></p>
<ul>
<li>위의 RCNN은 2000개의 인풋 이미지 내의 ROI들에 대해서 <strong><em>모두 conv 연산</em></strong> 을 수행</li>
<li>그에 반해 SPP net 은 인풋 이미지 전체에 대해서 <strong><em>1회 conv 연산</em></strong> 을 수행</li>
</ul>
<p>-&gt; convolution 연산량이 엄청나게 줄어들게 됨!(2k -&gt; 1)</p>
<h3 id="deep-networks-with-spatial-pyramid-pooling-">DEEP NETWORKS WITH SPATIAL PYRAMID POOLING :</h3>
<h4 id="about-spatial-pyramid-pooling-layer">about Spatial Pyramid Pooling layer</h4>
<blockquote>
<p>위에서 설명한 것과 같이, SPPnet 은 다음의 구조로 이루어져 있음
** INPUT ➡️ CONV ➡️ SPP ➡️ FC ➡️ Classify or Regress **</p>
</blockquote>
<p>그래서 SPP layer 가 무엇인가? 
<img src="https://velog.velcdn.com/images/robert_1106/post/dbe6df5f-905e-4be0-85ba-d3445f283bd1/image.png" alt=""></p>
<p>논문에 들어있는 SPP layer 에 대한 자료이다. 
SPP는 spatial pyramid pooling 으로 직역하자면 공간 피라미드 풀링 !</p>
<p>이름과 연관지어 SPP layer를 보자면 다음과 같다. </p>
<blockquote>
<p>** Spatial ** : feature map의 공간적 정보 유지
** Pyramid ** : n x n 부터 1 x 1 까지 다양한 scale 의 bin 들을 활용 
** Pooling ** : layer의 역할 </p>
</blockquote>
<p>인풋 바로 뒷단에 붙는 convolution layer는 sliding window를 통해 어떤 input size 이건 간에 feature map을 만들어줄 수 있지만,</p>
<p>** input size 가 다양한만큼, feature map 의 size 도 다양할 것.. **</p>
<blockquote>
<h4 id="what-to-do-">what to do ?</h4>
<p>❗️ 다양한 feature map size 를 일괄적으로 만들어 줘야함
❗️ 이 과정에서 다양한 scale 의 spatial bins 를 활용
** Feature map 을 미리 정해져 있는 영역들로 나누어 준다! **
<img src="https://velog.velcdn.com/images/robert_1106/post/162d3130-9aba-4362-bc16-d87b64391e1f/image.png" alt="">
위의 경우, 미리 4x4, 2x2, 1x1 세 가지 영역</p>
</blockquote>
<ul>
<li>각각을 하나의 피라미드라고 부름. </li>
<li>3개의 피라미드를 설정, 피라미드의 한 칸을 <strong><em>bin</em></strong> 이라고 함</li>
</ul>
<blockquote>
<h4 id="and-then">And then</h4>
<p>❗️ 그 다음 bin 별로 Max Pooling 을 수행 후 값들을 이어붙여 나열
<img src="https://velog.velcdn.com/images/robert_1106/post/0bd563c3-37a9-410d-ab27-88442b52c42a/image.png" alt="">
❗️ 그 값들을 붙여 벡터화 하고, FC layer에 전달! </p>
</blockquote>
<ul>
<li><p>다양한 피쳐 (bin) 가 즉 해당 이미지의 공간 </p>
</li>
<li><p>그 때 그 공간은 여러 scale 로 잘림 (개인이 설정가능), 다양한 특징들을 만들어내지만, 고정된 크기의 representation 을 만들 수 있다. (multi view test)</p>
</li>
<li><p>다양한 scale의 특징을 추출할 수 있는 장점이 존재.</p>
</li>
<li><p>특정 scale 에 대해서 오버피팅 되는 문제 또한 완화.</p>
</li>
</ul>
<h5 id="-spatial-pyramid-pooling-layer-추가">+ Spatial Pyramid Pooling layer 추가</h5>
<ul>
<li><p>어떤 이미지의 특정적인 window 가 정해졌으면, 해당 window 가 여러 scale 의 bin 을 지나게 됨</p>
</li>
<li><p>Bin 수는 일정한 수로 고정 : multi view 이므로, 뭐 nxn, mxm, pxp 뭐 이렇게 있다고 하면, bin수는 총 n^2 + m^2 + p^2 이렇게 될 것</p>
</li>
<li><p>필터는 conv layer 에서 사용되는 필터 개수  </p>
</li>
<li><p>고정된 길이의 벡터가 만들어짐. bin수 * filter수</p>
</li>
<li><p>bin 수를 늘리면 늘릴수록, 강건하고 다양한 특징이 나올 수 있겠지만, 복잡도가 올라갈 것. </p>
</li>
<li><p>여기서, 같은 윈도우 대상에 대해서, 어떻게 서로 다른 scale의 bin들이 나올 수 있느냐? : stride와 filter size 를 조정해서 끼워맞춤. </p>
</li>
</ul>
<h3 id="how-to-train-the-network">How to train the Network</h3>
<blockquote>
<p><strong>입력 이미지 크기에 관계없이</strong> 역전파 방법을 사용해 model train
그러나 GPU 구현시에는 (논문상에서는 cuda-convnet, Caffe를 언급) <strong>고정 이미지 크기를 선호</strong>함</p>
</blockquote>
<p>❗️ SPP 를 유지하면서 이러한 GPU 구현의 이점을 살리기 위한 Train 방식! 
❗️ 오로지 모델 훈련만을 위한 방법! </p>
<h4 id="1-single-size-training">1. single size training</h4>
<blockquote>
<p>고정된 input size 의 데이터만을 활용! 
cropping,warping 은  data augmentation 으로 인식. 
고정된 input에 대하여, 여러개의 filter,stride 사용 -&gt; multi scale pooling 구현 </p>
</blockquote>
<blockquote>
<p>ex) 
224 x 224 
-&gt; (after conv5) 13 x 13 
-&gt; pooling with ** Various Stride and Window sizes ** 
-&gt; multi - Leveled Vectors </p>
</blockquote>
<h4 id="2-multi-size-training">2. multi size training</h4>
<blockquote>
<p>다양한 input size 의 데이터들을 활용! 
서로 다른 input size 를 가진 데이터들을 crop 하고 조정하여 size를 맞춤</p>
</blockquote>
<blockquote>
<p>여러 scale 의 데이터 별로 모델을 학습시키고, 해당 과정을 반복함. </p>
</blockquote>
<h3 id="references">References</h3>
<p><a href="https://velog.io/@twinjuy/SPPNet-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0Spatial-Pyramid-Pooling-Network">https://velog.io/@twinjuy/SPPNet-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0Spatial-Pyramid-Pooling-Network</a></p>
<p><a href="https://herbwood.tistory.com/5">https://herbwood.tistory.com/5</a></p>
<p><a href="https://www.youtube.com/watch?v=i0lkmULXwe0&amp;t=460s">https://www.youtube.com/watch?v=i0lkmULXwe0&amp;t=460s</a></p>
<p><a href="https://festive-impatiens-b9a.notion.site/SPPNET-1717396cd0564e24b4824f24e2c2baba">https://festive-impatiens-b9a.notion.site/SPPNET-1717396cd0564e24b4824f24e2c2baba</a></p>
]]></description>
        </item>
    </channel>
</rss>