<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>AIMS Study Blog</title>
    <link>https://aims-lab.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 17:56:08 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hannn</managingEditor>
    <image>
      <title>AIMS Study Blog</title>
      <url>https://tistory1.daumcdn.net/tistory/5908797/attach/8aafff4b26f84dd695bbc5e339d60142</url>
      <link>https://aims-lab.tistory.com</link>
    </image>
    <item>
      <title>[ICLR 2023] Adaptive Budget Allocation For Parameter Efficient Fine-tuning 논문 리뷰</title>
      <link>https://aims-lab.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;이번 ICLR 2023에 있었던&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&amp;lt;Adaptive&amp;nbsp;Budget&amp;nbsp;Allocation&amp;nbsp;For&amp;nbsp;Parameter&amp;nbsp;Efficient&amp;nbsp;Fine-tuning&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;논문에 대해서 리뷰를 진행한다. &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;(&lt;a href=&quot;https://arxiv.org/abs/2303.10512&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/2303.10512&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;이 논문은 최근에 많이 다뤄지는 LLMs(Large Language Models)을 Computational Efficient하게 Fine-tuning하는 방법에 대해서 기존에 있던 LoRA(Low Rank Adaptation)의 기법을 보완한 AdaLoRA를 제안하는 논문이다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;이 포스팅에서는 AdaLoRA에 대해서 살펴본다. &lt;i&gt;(추후, 이것의 Reference가 되는 LoRA에 대해서도 다룰 예정이다.)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 LoRA는 좋은 성능을 보였으나, parameter budget을 incremental update에 균등하게 분배했다. 하지만, 쓸모 없는 것에 incremental matrix를 크게 가져가는 것은 낭비일 뿐만이 아니라, 오히려 모델의 성능을 저해하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AdaLoRA, which adaptively allocates the parameter budget among weight matrices according to their importance score.&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;&lt;b&gt;기본적으로 AdaLoRA는 Singular Value Decomposition의 개념을 활용하고 새로운 importance Score를 제안한다.&lt;/b&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;&lt;b&gt;Introduction&lt;/b&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;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;LLMs(Large Language Models) 혹은 PLMs(Pre-trained Language Models)가 최근 Chat-GPT부터 시작을 해서, 여러 모델들이 등장하고 있다. 그에 따라 이 대규모 모델들을 사용자들의 도메인에 특화되도록 Fine-tuning을 하려는 시도들이 있었다. 하지만, 모델들의 파라미터 수가 70억개(7B), 130억개(13B) 등의 몇십억개를 가지고 있으며, 7월 19일에 Meta에서 발표한 Llama v2 모델은 700억개의 파라미터를 가지고 있는 모델들도 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이런 엄청난 수의 파라미터를 가진 모델들을 기존에 모든 파라미터를 추가적인 데이터 셋을 사용하여 Fine-tuning 하는 방식(Full Fine-tuning)으로는 기업 단위가 아닌 개인 단위에서 거의 불가능하다고 볼 수 있다. 따라서, &lt;b&gt;Full-Fine-tuning을 하지 않고도 Fine-tuning을 할 수 있는 방법&lt;/b&gt;에 대한 연구들이 진행되고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;따라서, Adapter라고 하는 Fully connected Layer 몇 개를 모델 구조 사이(특히, Transformer 기반의 모델의 경우에는 Transformer block 사이에) 추가하고, 이들만을 trainable parameter로 설정하여 Fine-tuning을 하는 데에 computational cost를 줄이려고 하였다.&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;또 다른 방법으로는 LoRA 이전에, 모델 구조를 변경하지 않고, incremental하게 Layer를 추가하여 이들만을 학습시키는 방법이 있었다. 하지만, 이들 또한 문제를 가지고 있었고, 이를 해결하기 위해 LoRA가 제안되었다. 하지만, LoRA 역시도 다음과 같은 Limitation을 가지고 있다.&amp;nbsp;&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;&lt;b&gt;LoRA ignores the fact that the importance of weight matrices varies significantly across modules and layers when fine-tuning pre-trained models.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, LoRA가 Weight matrix들의 중요도를 판단하지 않고, 균등하게 weight update를 진행하므로, 동일한 trainable parameter 개수를 가지고 있다고 할 때 최적이 될 수 없는 것이다(&lt;i&gt;'Suboptimal하다'&lt;/i&gt; 라고 표현한다.).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 본 논문에서 풀고자 하는 문제는&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;How can we allocate the parameter budget adaptively according to importance of modules &lt;br /&gt;to improve the performance of parameter-efficient fine-tuning?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것에 대한 해답으로 본 논문에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;AdaLoRA&lt;/b&gt;&lt;/span&gt;를 제안한다. 이것은 유동적으로 parameter budget을 할당하여 fine-tuning을 할 때에 더 중요한 weight matrices들에 더 많은 파라미터를 분배할 수 있는 알고리즘이다.&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;기존에 LoRA는 사용자가 미리 정한 $ r $차원의 Dense Layer를 사용하였다. 하지만, 최적의 $ r $을 설정하기 위해서는 &lt;b&gt;SVD(Singular Value Decomposition)&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;그럼 AdaLoRA는 SVD를 사용한 것인가? 그렇지 않다. 이 논문의 초점은 &lt;b&gt;모델의 Fine-tuning에 사용할 수 있는 parameter의 개수가 유한하다고 할 때, 최대한 빠르게, 최대한 효율적으로 추가적인 parameter가 어디에 배치되어야 할 지를 결정한다.&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;이 점에서 볼 때 SVD는 목적에 부합한 방법이기는 하지만, &lt;b&gt;계산 과정이 너무 복잡&lt;/b&gt;하다는 단점을 가지고 있다.&amp;nbsp;따라서, 본 논문에서는 SVD와 비슷한 방식을 거치고, addional penalty를 training loss에 더함으로써 SVD의 구성 요소인 P와 Q Matrix의 orthogonality를 규제한다.&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;AdaLoRA는 Incremental matrix (&lt;i&gt;기존 Model Architecture가 아니라 LoRA 혹은 AdaLoRA를 통해서 추가된 Layer들을 의미&lt;/i&gt;)를 세가지 요소 $ (P, \Lambda, Q) $로 나눈다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ i $번째 singular Value&lt;/li&gt;
&lt;li&gt;이에 해당하는 singular vector 2개&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ i $번째에 해당하는 세가지 요소(triplet)이 얼마나 중요한 지 정량화하기 위해서 본 논문에서는 새로운&lt;b&gt; impoartance metric&lt;/b&gt;을 제시한다. 이&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt; score는 model performance에 대한 triplet의 모든 요소의 기여도를 고려&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;낮은 중요도를 가진 triplet은 singular value가 0이 되고,&amp;nbsp;높은 중요도를 가진 triplet은 fine-tuning에 이용되기 위해서 값이 그대로 유지된다.&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; Global budget schedular&lt;/b&gt;라고 하는 것도 위의 모델에서 사용하는데, 이 Global budget schedular가 training stability와 model performance를 향상시킬 수 있다고 한다. 이 방법은 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;초기 parameter budget은 사용자가 설정한 budget보다 조금 더 많게 설정한다(ex&amp;gt; 1.5배). 이후에, iteration을 돌면서 이 budget을 조금씩 줄여나가고, 최종적으로는 사용자가 설정한 budget에 맞춰지도록 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AdaLoRA Method&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 중요한 2가지 요소들이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;SVD-based adaptation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Importance-aware rank allocation&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SVD-based Adaptation&lt;/b&gt;&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;$$ W = W^{(0)} + \Delta = W^{(0)} + P \Lambda Q $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P와 Q는 (left/right) singular vector를 나타내고, Lamda는 singular value를 가지고 있는 대각행렬을 나타낸다.&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;실제로는, Lambda 행렬이 대각행렬이기 때문에, 이것을 2차원 행렬로 저장을 하는 것이 아니라, 1차원 행렬로 저장할 수 있다. P와 Q는 Gaussian 초기화를 진행하게 되고, Lambda는 0으로 초기화가 진행이 되어 LoRA처럼 초기 값 결과는 0이 될 수 있도록 한다.&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;$$ R(P, Q) = ||P^TP - I||_F^2 + ||Q^TQ - I||_F^2 $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lambda 함수는 각 gradient descent step을 거치면서 점점 pruning 된다. P, Q를 SVD를 통해서 직접적으로도 계산을 해 줄 수 있지만, 이것이 computation cost가 매우 크기 때문에, 이렇게 설정을 한 것이다.&amp;nbsp;다르게 생각을 하면 AdaLoRA를 사용하지 않고, &lt;i&gt;'LoRA에서 그냥 A와 B의 행과 열을 삭제해주면 되는 것 아닌가?'&lt;/i&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;이것은 실수로 인해서, 나중에 다시 복구를 해야하는 경우, 처음부터 다시 돌려야 한다. &lt;br /&gt;&lt;i&gt;(AdaLoRA는 ,Singular Value만 없앤 것이기 때문에, 이것만 다시 설정하거나 학습하면 된다는 의미인 것 같다.)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;또한, A와 B는 서로 Orthogonal한 것이 아니기 때문에, 이것을 삭제하는 것은 다른 행과 열에도 영향을 줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 AdaLoRA에서는 P, Q가 계산이 되는 것이 아니라, trainable한 parameter로 설정하고 규제항을 통해서 두 Matrix가 Orthogonality를 가지도록 만들어준다. .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Importance-Aware Rank Allocation&lt;/b&gt;&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;Budget을 통제하기 위해서 training하는 과정 동안 importance score에 따라서 singular value들을 제거하는 작업을 iteratively하게 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Training objective&lt;/b&gt;&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;$$ L(P, E, Q) = C(P, E, Q) + \gamma \sum^n_{k=1}R(P_k, Q_k) $$&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;t-th step에서 먼저 stochastic gradient step을 거쳐서&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;$$ P_k^{(t)}, \Lambda_k^{(t)}, Q_k^{(t)} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 업데이트 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Lambda의 경우에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \tilde{\Lambda_k^{(t)}} = \Lambda_k^{(t)} - \eta\nabla_{\Lambda_k}L(P^{(t)},E^{(t)}, Q^{(t)}) $$&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;Importance Score인 $ S_k^{(t)} $가 주어지게 되면, singular value들은 다음과 같이 pruning하는 과정을 거치게 된다.&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;2514&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxrG4/btso21HwdZs/B827F3ejOmgB0VPQPdXPt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxrG4/btso21HwdZs/B827F3ejOmgB0VPQPdXPt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxrG4/btso21HwdZs/B827F3ejOmgB0VPQPdXPt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxrG4%2Fbtso21HwdZs%2FB827F3ejOmgB0VPQPdXPt0%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;2514&quot; height=&quot;239&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ S^{(t)} $는 모든 세가지 요소들의 중요도를 포함하고 있다.&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;$ b^{(t)} $는 t-th step에서 남을 수 있는 singular value들의 개수이다.&amp;nbsp;그렇다면, Importance Score는 어떻게 정할 수 있을까?&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Magnitude of singular values&lt;/b&gt;&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;이 방법은 매우 직관적인 방법이지만, model performance에 대한 기여도를 측정하는 데에 있어서는 정확하게 표현하지 못한다는 것을 발견하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Sensitivity-based importance&lt;/b&gt;&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;Training Loss에 대해서 파라미터들의 민감도를 scoring 할 수 있는 방법을 고안하였다. 이 방법은 모든 객체들의 sensivity가 모델 performance에 대한 세가지 요소들의 기여도를 정량화 하는데에 전부 적절하게 융합되어 고려되어야 한다.&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;$$ S_{k, i} = s(\lambda_{k, i} + \frac{1}{d_1} \sum^{d_1}{j=1}s(P{k, ji}) + \frac{1}{d_2} \sum^{d_2}{j=1}s(Q{k, ij}) $$&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;S가 parameter 크기에 영향을 받지 않도록 P와 Q의 평균 중요도를 계산한다. 여기에서 s(.)는 각각의 객체에 대한 특정한 importance function이다.&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;$ s( ) $ 함수는 magnitude of the gradient-weight product라고 정의된 함수를 사용할 수 있다. 그 정의는 다음과 같다.&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;$$ I(w_{ij}) = |w_{ij}\nabla_{w_{ij}}L| $$&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;이것은 parameter가 0으로 되었을 때 Loss의 변화를 근사한다. 만약에, parameter를 제거했을 떄 큰 영향을 가지고 있다면, 모델은 이것에 민감할 것이며, 이것을 유지해야 할 것이다. 하지만, 다른 연구에서는 이것이 충분하게 reliable하지 않다는 것을 밝혔다. Stochastic sampling과 복잡한 training dynamic이 위의 식에서 sensitivity를 측정하는 데에 high variability와 large uncertainty를 가진다고 말한다. 따라서, 이것을 해결하기 위해서 &lt;i&gt;sensitivity smoothing&lt;/i&gt;과 &lt;i&gt;uncertainty quantification&lt;/i&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;2506&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVJ9FJ/btso5sx5KCz/HJKWIgKMPgjyGzWWNz7nt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVJ9FJ/btso5sx5KCz/HJKWIgKMPgjyGzWWNz7nt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVJ9FJ/btso5sx5KCz/HJKWIgKMPgjyGzWWNz7nt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVJ9FJ%2Fbtso5sx5KCz%2FHJKWIgKMPgjyGzWWNz7nt0%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;2506&quot; height=&quot;280&quot; data-origin-width=&quot;2506&quot; data-origin-height=&quot;280&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;각 beta들은 전부 0에서 1 사이의 값을 가지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ \bar{I}^{(t)} $는 exponential moving average에 의해서 smoothed sensitivity를 나타내고, $ \bar{U}^{(t)} $는 $ I^{(t)} $와 $ \bar{I}^{(t)} $ 사이의 local variation을 정량화 한 uncertainty term이라고 볼 수 있다. 따라서 이것을 가지고&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;2494&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu1lzT/btso22TW1jf/Tkbow8m5HmHe6bz5C0kBg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu1lzT/btso22TW1jf/Tkbow8m5HmHe6bz5C0kBg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu1lzT/btso22TW1jf/Tkbow8m5HmHe6bz5C0kBg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu1lzT%2Fbtso22TW1jf%2FTkbow8m5HmHe6bz5C0kBg0%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;2494&quot; height=&quot;141&quot; data-origin-width=&quot;2494&quot; data-origin-height=&quot;141&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;(11)번 식을 가지고 위의 $ S_{k,i} $를 정의하는 식에 적용하였을 때 일반적으로 가장 좋은 성능을 내는 것을 볼 수 있었다.&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;3076&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wdfl1/btso6pt6dzR/IkqZhPjUPAvswQfe3AQwC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wdfl1/btso6pt6dzR/IkqZhPjUPAvswQfe3AQwC1/img.png&quot; data-alt=&quot;AdaLoRA의 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wdfl1/btso6pt6dzR/IkqZhPjUPAvswQfe3AQwC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWdfl1%2Fbtso6pt6dzR%2FIkqZhPjUPAvswQfe3AQwC1%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;3076&quot; height=&quot;1187&quot; data-origin-width=&quot;3076&quot; data-origin-height=&quot;1187&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AdaLoRA의 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Global Budget Scheduler&lt;/b&gt;&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;본 논문에서는 budget이라고 하는 b^(t)를 모든 incremental matrices의 rank를 전부 합한 것(즉, total singular values)라고 볼 수 있다.&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;Training을 용이하게 하기 위해서, global budget scheduler를 사용했다.&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;학습 초기에는 실제 설정한 budgt보다 약간 많은 수의 budget을 가지고 실행한다. 우리는 각각의 incremental matrix의 initial rank를 초기 budget을 n으로 나눈 값으로 설정한다. 그 다음에 cubic schedule을 통해서 budget을 설정한 데까지 줄인다. 이것이 AdaLoRA가 초기에는 parameter space를 먼저 탐색하고, 나중에 important weights에 집중하도록 만든다. Cubic Schedule이라는 것이 정확하게 나와있지는 않지만, 식을 봤을 때는 처음에는 budge을 감량하는 속도를 낮게 하고, 갈수록 많은 budget을 삭감하는 것을 의미하는 것으로 보인다.&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;낮은 중요도를 가진 triplet은 singular value가 0에 가까워지고, (0이 된다고 보면 될 거 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;높은 중요도를 가진 triplet은 fine-tuning에 이용되기 위해서 값이 그대로 유지된다.&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;또한, Global budget schedular라고 하는 것도 위의 모델에서 사용하는데, 초기 parameter budget은 사용자가 설정한 budget보다 조금 더 많게 설정한다.(예를 들어 1.5배 정도?) 이후에, iteration을 돌면서 이 budget을 조금씩 줄여나가고, 최종적으로는 사용자가 설정한 budget에 맞춰지도록 한다.&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;이렇게 하여 Global budge schedular는 training stability와 model performance를 향상시킬 수 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Reference&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot;&gt;Zhang, Qingru, et al. &quot;Adaptive budget allocation for parameter-efficient fine-tuning.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;arXiv preprint arXiv:2303.10512&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2023).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>딥러닝</category>
      <category>AdaLoRA</category>
      <category>Adaptive fine-tuning</category>
      <category>fine-tuning</category>
      <category>Llama</category>
      <category>LLM</category>
      <category>LoRa</category>
      <category>Low Rank Adaptation</category>
      <category>plms</category>
      <category>Singular Vector Decomposition</category>
      <category>SVD</category>
      <author>hannn</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/153</guid>
      <comments>https://aims-lab.tistory.com/153#entry153comment</comments>
      <pubDate>Wed, 26 Jul 2023 14:55:05 +0900</pubDate>
    </item>
    <item>
      <title>[MICCAI 2023] Is a PET all you need? A multi-modal study for Alzheimer&amp;rsquo;s disease using 3D CNNs 논문 리뷰</title>
      <link>https://aims-lab.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;논문 링크 : &lt;a href=&quot;https://link.springer.com/epdf/10.1007/978-3-031-16431-6_7?sharing_token=7cUeevO0wZQdc7MmJTRXEPe4RwlQNchNByi7wbcMAY7ZlzAyNldSVTx86qNGeZBPTXWLvhyBFjUTTTpx_kJHqMahZBjcuY2BcXG1eAdG_UlWzpMLdPr5C8xzl4B2M8Z__2gJXDqqRq0Z6AHINqsO8O5KnWqfLMgdTDuHD-qA9I4%3D&quot;&gt;https://link.springer.com/epdf/10.1007/978-3-031-16431-6_7?sharing_token=7cUeevO0wZQdc7MmJTRXEPe4RwlQNchNByi7wbcMAY7ZlzAyNldSVTx86qNGeZBPTXWLvhyBFjUTTTpx_kJHqMahZBjcuY2BcXG1eAdG_UlWzpMLdPr5C8xzl4B2M8Z__2gJXDqqRq0Z6AHINqsO8O5KnWqfLMgdTDuHD-qA9I4%3D&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id=&quot;abstract-id&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Abstract :&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Alzheimer's Disease (AD)은 가장 흔한 형태의 치매로, 다양한 원인으로 인해 진단에 어려움을 겪고 있는데, 최근 Deep Neural Networks (DNNs)를 활용한 뇌 영상 기반 연구에서 Structural Magnetic Resonance Images (sMRI)와 Fluorodeoxyglucose Positron Emission Tomography (FDG-PET)를 통합하는 것이 H&lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;ealthy Control (HC) &lt;/span&gt;과 AD 환자를 대상으로 높은 정확성을 보인다는 결과가 나왔습니다. 그러나 이 결과는 FDG-PET이 sMRI보다 AD 특이적인 병변을 더 잘 포착한다는 임상적 지식과 충돌합니다. 따라서 우리는 멀티 모달 DNNs의 체계적 평가를 위한 프레임워크를 제안하고, FDG-PET 및 sMRI을 기반으로 한 싱글 및 멀티 모달 DNNs를 건강 대 AD 이진 분류 및 건강/경도인지 장애/AD 삼중 분류에 대해 비판적으로 재평가합니다. 실험 결과, FDG-PET을 사용한 단일 모달 네트워크가 MRI보다 더 우수한 성능을 보이며(정확도 0.91 대 0.87), 두 가지를 결합하더라도 성능의 개선은 없었습니다. 이는 AD 바이오마커에 대한 임상적인 지식과 일치하지만, 멀티 모달 DNNs의 실제 이점에 대해 의문을 제기합니다. 우리는 앞으로 멀티 모달 퓨전에 대한 연구가 우리가 제안한 평가 프레임워크를 따라 개별 모달리티의 기여를 체계적으로 평가해야 한다고 주장합니다. 마지막으로, 우리는 건강 대 AD 분류를 넘어서 치매의 차별적 진단에 초점을 맞추고, 멀티모달 영상 정보를 퓨전하는 것이 임상적 필요에 부합한다고 주장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;논문에서는 멀티모달 결과보다 FDG-PET 단일 모델이 가장 좋다고 나왔는데, 멀티모달을 Fusion하는 다양한 방법을 적용해서 리뷰합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Fusion Strategies&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;멀티모달 데이터를 fusion하기 위해 세 가지 방법을 사용합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Early Fusion.&lt;/b&gt; raw &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: start;&quot;&gt;modality&lt;/span&gt; 데이터를 직접 결합해 사용하는 방식입니다. Voxel-Based Morphometry (VBM)를 통해 gray matter map을 얻고 FDG-PET intensity를 구분하는데에 사용합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Late Fusion.&lt;/b&gt; &lt;b&gt;Late Fusion&lt;/b&gt;은 멀티 모달 데이터를 퓨전하는 가장 직관적인 접근 방식입니다. 이미지를 Fusion하는 대신, 두 개의 독립적인 3D ResNet 브랜치를 훈련시켜서 MRI와 FDG-PET 각각에 대한 잠재적 표현을 Fusion합니다. 각 브랜치에서 &lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;global average pooling &lt;/span&gt; 후 얻은 특징은 이후 Multi-layer Perceptron (MLP) [128, 64, 클래스 개수]을 통해 concatenated되어 얻어진 로그 확률로, 두 가지 정보 소스를 모두 고려합니다.&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;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Middle Fusion.&lt;/b&gt; &lt;b&gt;Early Fusion&lt;/b&gt;과 &lt;b&gt;Late Fusion&lt;/b&gt;은 멀티 모달 분석에서 일반적이지만, 우리는 &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: start;&quot;&gt;modality&lt;/span&gt;별 네트워크의 중간 표현을 Fusion하는 방법도 탐구합니다. 이 접근 방식에서는 modality별 정보를 서로 다른 &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: start;&quot;&gt;modality&lt;/span&gt;의 하위 네트워크 간에 동적으로 교환하여 Fusion합니다. 이러한 양방향 정보 교환은 &lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;BN scaling factor&lt;/span&gt;의 크기에 따라 개별 채널의 중요성을 고려하여 &lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;self-guided&lt;/span&gt;됩니다. 이러한 과정은 모든 채널을 교환하는 것에 불이익을 주는 ℓ1 정규화를 포함합니다. 정보 공유를 더 장려하기 위해 합성곱 필터 가중치가 &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: start;&quot;&gt;modality&lt;/span&gt;&amp;nbsp;간에 공유됩니다. 기억하기를, BN 레이어는 개별 모드별 채널 중요성을 결정하기 위해 공유되지 않습니다. 논문에서는 이전까지 AD 예측을 위한 멀티모달 Fusion전에 채널 교환은 이전에 적용된 적이 없다고 합니다.&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;1111&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvsIH8/btsowleQwnp/fKEG27ln0TacFgMKNb0trK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvsIH8/btsowleQwnp/fKEG27ln0TacFgMKNb0trK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvsIH8/btsowleQwnp/fKEG27ln0TacFgMKNb0trK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvsIH8%2FbtsowleQwnp%2FfKEG27ln0TacFgMKNb0trK%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;1111&quot; height=&quot;472&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;여기서 &lt;b&gt;Middle Fusion에 사용된 방법은 Deep Multimodal Fusion by Channel Exchanging 논문(&lt;b&gt;&amp;nbsp;&lt;a href=&quot;https://proceedings.neurips.cc/paper_files/paper/2020/file/339a18def9898dd60a634b2ad8fbbd58-Paper.pdf&quot;&gt;https://proceedings.neurips.cc/paper_files/paper/2020/file/339a18def9898dd60a634b2ad8fbbd58-Paper.pdf&lt;/a&gt;&lt;/b&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;에 소개된 Fusion 방법을 사용한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J99HF/btsouYyy5aG/aFvMAUGbS5zoHodhwbquJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J99HF/btsouYyy5aG/aFvMAUGbS5zoHodhwbquJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J99HF/btsouYyy5aG/aFvMAUGbS5zoHodhwbquJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ99HF%2FbtsouYyy5aG%2FaFvMAUGbS5zoHodhwbquJ0%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;1143&quot; height=&quot;382&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;382&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;1860&quot; data-origin-height=&quot;1131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jcvmn/btsovayJtqL/Qym7KSQTr08GtUzUtxuYKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jcvmn/btsovayJtqL/Qym7KSQTr08GtUzUtxuYKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jcvmn/btsovayJtqL/Qym7KSQTr08GtUzUtxuYKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJcvmn%2FbtsovayJtqL%2FQym7KSQTr08GtUzUtxuYKk%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;1860&quot; height=&quot;1131&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;1131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TbRAf/btsowPmsAnL/THnrCBKDTA2nFjXEOeMg30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TbRAf/btsowPmsAnL/THnrCBKDTA2nFjXEOeMg30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TbRAf/btsowPmsAnL/THnrCBKDTA2nFjXEOeMg30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTbRAf%2FbtsowPmsAnL%2FTHnrCBKDTA2nFjXEOeMg30%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;1146&quot; height=&quot;499&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>딥러닝</category>
      <author>김랑명</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/152</guid>
      <comments>https://aims-lab.tistory.com/152#entry152comment</comments>
      <pubDate>Fri, 21 Jul 2023 15:38:23 +0900</pubDate>
    </item>
    <item>
      <title>[ICLR 2023] Token Merging : Your ViT But Faster 논문 리뷰</title>
      <link>https://aims-lab.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 ICLR 2023에 있었던 &lt;b&gt;&amp;lt;TOKEN MERGING: YOUR VIT BUT FASTER&amp;gt; &lt;/b&gt;논문에 대해서 리뷰를 진행한다.&amp;nbsp;&lt;br /&gt;(&lt;a href=&quot;https://arxiv.org/abs/2210.09461&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arxiv.org/abs/2210.09461&lt;/a&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 Transformer의 정확도를 유지하면서도, 연산량을 줄여 모델이 한번에 처리할 수 있는 정보의 양을 늘리기 위해서 &lt;b&gt;ToMe(Token Merging)&lt;/b&gt;이라는 기법을 제안한 논문이라고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 포스팅에서는 ToMe라는 기법에 대해서 살펴보고, 주요한 실험 결과를 정리해 볼 예정이다&lt;i&gt;(모든 실험 결과를 다루지는 않는다!)&lt;/i&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Introduction&amp;nbsp;&lt;/b&gt;&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;Transformer가 등장한 이후, NLP, Computer Vision 등 다양한 분야에서 Transformer를 기반으로 한 모델들이 쏟아져 나오고 있다. 특히나, Vision Transformer가 등장한 이후에는 Computer Vision 분야에서도 Transformer가 적극적으로 사용되고 있는데, 요즘엔는 domain-specific transformer들이 많이 나왔다. 이들이 등장하게 된 본질적인 이유는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Efficiency(효율성)&lt;/b&gt;&lt;/span&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;Transformer의 거의 유일한(?) 단점은 &quot;연산량이 많다.&quot;라는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최근에는 ViT의 subfield에서 token이 런타임에서 pruning 되는 기법들을 종종 사용하곤 한다. 하지만, 이런 방법들에는 다음의 단점들이 존재한다.&amp;nbsp;&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;&lt;b&gt;Information Loss&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Require re-training&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;most cannot be applied to speed up training&lt;/b&gt; (대부분은 훈련 속도를 높이기 위해 적용할 수 없다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;serveral prune different numbers of tokens depending on the input content, making batched inference infeasible&lt;/b&gt;&lt;br /&gt;(입력 내용에 따라 여러 토큰을 제거하여 일괄 처리된 inference를 실행할 수 없다.)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Token Merging에 대한 소개&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 기존에 있었던 Token pruning 기법 대신에, &lt;b&gt;token을 merging(병합)하는 방식&lt;/b&gt;을 사용한다. 이 방법은 pruning만큼 빠르면서도 더 정확하다. 추가적으로 이 방법은 pruning에서는 필수적이었던 re-training 없이도 모델을 inference할 수 있다는 장점을 가지고 있다. ToMe는 training speed를 거의 절반까지도 줄일 수 있다. 또한, Image, Video, Audio의 다양한 모달리티에서 데이터에 어떠한 수정도 가하지 않으면서 대부분의 경우에 state-of-the-Art 모델들과 비견할 만한 성능을 내는 것을 발견할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Token Merging&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법의 목표는 ViT에 token merging module을 넣어서 ViT 모델이 한번에 더 많은 처리량을 가질 수 있도록 하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Strategy&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 transformer block에서 layer마다 $ r $개의 token을 줄인다. 여기에서 $ r $은 비율이 아닌 토큰의 개수를 의미한다. $ L $개의 block을 지나게 되면, 점진적으로 $ rL $개의 토큰을 merge하는 것이다. 이 $ r $을 조정함으로써 speed-accuracy trade-off를 조정할 수 있다.&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;이 방법의 주요한 점은 Image의 내용에 상관 없이 $ rL $개의 token을 줄일 수 있다는 것이다.&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;이전의 연구에서는 transformer block의 시작 부분에 reduction method를 적용했었다. 하지만, ToMe는 token merging step을 각 Transformer Block에서 attention module과 MLP 사이에 적용한다. 이렇게 하여 얻을 수 있는 효과는&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;&lt;b&gt;information to be propagated from tokens that would be merged&lt;/b&gt; &lt;br /&gt;병합될 토큰에서 전파될 정보가 반영이 될 수 있도록 하였으며,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;enables us to use features within attention to decide what to merge&lt;/b&gt; &lt;br /&gt;어떤 것을 병합할 지를 결정하기 위해서 attention 내부의 feature들을 사용할 수 있도록 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 두가지 효과는 Accuracy를 증가시키는 데에 중요한 작용을 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Token Similarity&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;similar token을 병합하기 전에, 어떠한 토큰이 유사한 지를 명확하게 하기 위해서&amp;nbsp;&lt;b&gt;&amp;ldquo;Similar&amp;rdquo;를 정의&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;Transformer는 이것을 self-attention의 $ QKV $로 해결할 수 있다. 구체적으로 들어가 보자면, $ keys (K) $가 이미 dot-product similarity에서 사용하기 위해 각 토큰에 포함된 정보를 요약한다. 그러므로 $ key $와 각 $ token $이 얼마나 유사한 정보를 담고 있는지 결정하기 위해서 dot product similarity metric을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Bipartite Soft matching&amp;nbsp;&lt;/b&gt;&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;&lt;b&gt;token similarity가 정의가 되었다면, total number를 $ r $만큼 줄이기 위해서 어떤 token이 matching 되는 지를 빠르게 결정할 수 있는 방법이 필요하다.&lt;/b&gt; 기존에는 크게 2가지 방법을 사용했었다.&amp;nbsp;&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;&lt;b&gt;kmeans clustering&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;graph cuts&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, matching을 $ L $번 해야 되고, 각 matching마다 몇 천개의 토큰을 계산해야 하므로 실행시간은 거의 무시할 수 있을 정도가 되어야 한다. 이로 인해서 기존의 방법들인&amp;nbsp; iterative clustering algorithm은 적용하기에 적합하지 않다고 볼 수 있다. 이 논문에서는 더욱 효율적인 솔루션을 제공하는 데, 이 솔루션의 목표는 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;We want to avoid anything iterative that cannot be parallelized&lt;/b&gt;&lt;br /&gt;(병렬 처리를 할 수 없는 iteration을 피하는 것)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;We want the changes merging masks to be gradual&lt;/b&gt;&lt;br /&gt;(merging mask가 점진적으로 변화하는 것)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 점들이 clustering이 아닌 matching 기법을 적용한 이유라고 볼 수 있다. 왜냐하면, clustering은 한 그룹에 병합할 수 있는 token의 수에 제한이 없어, 비슷하지 않은 것들끼리도 하나로 묶일 수 있지만, matching의 경우에는 이를 피할 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Algorithms&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;A와 B가 거의 동일한 사이즈가 될 수 있도록 token들을 2개로 나눈다.&lt;/li&gt;
&lt;li&gt;A에 있는 각 토큰에 대해서 하나씩 B에서 가장 비슷한 token인 것으로 edge를 생성한다.&lt;/li&gt;
&lt;li&gt;가장 비슷한 것을 나타내는 r개의 edge를 유지한다. (나머지는 지운다.)&lt;/li&gt;
&lt;li&gt;남아있는 edge들에 해당하는 token들을 병합(Merge)한다.&lt;/li&gt;
&lt;li&gt;2개의 set을 다시 하나로 합친다.&lt;/li&gt;
&lt;/ol&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;1010&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk9CnH/btsofrHL3SE/0YV6ZVeAbVzvofwnd7isYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk9CnH/btsofrHL3SE/0YV6ZVeAbVzvofwnd7isYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk9CnH/btsofrHL3SE/0YV6ZVeAbVzvofwnd7isYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk9CnH%2FbtsofrHL3SE%2F0YV6ZVeAbVzvofwnd7isYk%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;1010&quot; height=&quot;419&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A에 있는 token이 오직 하나의 edge씩 만을 가지고, c&lt;b&gt;onnected component&lt;/b&gt;를 찾는 것은 많은 시간이 필요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신중하게 A와 B를 선택한다면, 정확성에 문제가 없는 모든 토큰 쌍 사이의 유사성을 계산할 필요가 없다. 이것을 실제로 적용을 해보았을 때에는 token을 random하게 pruning하는 것만큼이나 빠르다. 실행시키는 코드 또한, 간단하게 구현할 수 있다고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Tracking Token Size&amp;nbsp;&lt;/b&gt;&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;토큰이 일단 합쳐지면, 그들은 더이상 하나의 input patch를 의미하지 않는다. 이 점을 무시하고, 기존의 모델에 적용을 하게 된다면, 제대로 된 결과가 나오지 못할 수 있다. 만약, 같은 키를 가진 2개의 토큰을 병합한다면, 그 키는 softmax에서 더 적은 영향을 미치게 되기 때문이다. 따라서 이것을 해결하기 위해서 &lt;b&gt;proportional attetion&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;$$ A = softmax(\frac{QK^T}{\sqrt{d}} + \log{s}) $$&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;$ s $는 각 토큰이 포함하고 있는 벡터의 개수를 의미한다. 이것은 키가 하나로 합쳐지더라도 키의 복사본을 가지고 있는 것과 동일한 작업을 수행할 수 있다. 또한, 토큰을 함께 병합할 때처럼 토큰이 aggregate 될 때마다 가중치를 부여해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Training with Merging&amp;nbsp;&lt;/b&gt;&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;이전 연구에서는 이미 trained ViT 모델에 token merging을 추가할 수 있도록 설계되었다. ToMe에서 학습이 필수적인 것은 아니지만, &lt;b&gt;accuracy drop&lt;/b&gt;을 줄이거나 &lt;b&gt;speed up training&lt;/b&gt;을 하는 데에 많은 도움을 줄 수 있다. 학습에서, 토큰 병합을 단순히 풀링 작업으로 처리하고 average pooling을 사용하는 것처럼 merged token을 통해 back propagation을 한다. 또한, 기존의 vanilla ViT에서 사용했던 파라미터 세팅이 ToMe에서도 최적이라는 것을 발견했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Image Experiments&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ImageNet-1k와 4가지 다른 방식으로 학습이 진행된 ViT &lt;i&gt;(AugReg, MAE, SWAG, DeiT)&lt;/i&gt;를 가지고 몇 가지 실험을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 실험에서, 모델을 그대로 가져와서 ToMe를 적용하였고, 추가적으로 2개의 모델(MAE &amp;amp; DeiT)는 학습을 하여 ToMe를 적용하였다. 모든 처리량은 V100GPU + optimal batch size인 fp32의 inference 동안에 측정되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Design Choices&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;997&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbtuCK/btsohp3gBW8/HM0Sb8fCQgvp3rwFktpBCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbtuCK/btsohp3gBW8/HM0Sb8fCQgvp3rwFktpBCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbtuCK/btsohp3gBW8/HM0Sb8fCQgvp3rwFktpBCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbtuCK%2Fbtsohp3gBW8%2FHM0Sb8fCQgvp3rwFktpBCk%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;997&quot; height=&quot;490&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험은 보라색으로 표시된 부분이 default로 설정되었다. 별다른 표기가 없다면, 모델은 ViT-L/16 MAE model을 training 없이 그대로 가져와 사용하였고, $ r=8 $로 24개의 layer를 거쳐 최종적으로는 98%의 token을 병합하는 방식으로 진행되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Token Similarity &lt;i&gt;(Table 1.a/b/c)&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로 생각할 수 있는 Token&amp;rsquo;s feature가 가장 좋은 결과를 나타내지는 않았고,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ X $ : Moving the merging operation after attention&lt;/li&gt;
&lt;li&gt;$ K $ : using the attention keys&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 위의 두가지 방법에 대한 정확도를 강조하고자 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Distance function으로는 &lt;b&gt;Cosine similarity&lt;/b&gt;가 token distance를 결정하는 가장 좋은 measure인 것이 실험으로 관측되었다. 또한, Aggreation을 할 때에는 concat 대신에 attention head에 걸쳐서 평균을 계산하는 것이 효율적이었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Algorithmic Choices &lt;i&gt;(Table 1.d/e)&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 토큰을 병합할 지 정한 이후에, token size에 의해서 가중 평균이 되는 방식으로 토큰들을 병합하였다( = 가장 성능이 좋았다.).&amp;nbsp;또한, Partition style에서는 서로 번갈아 나오면서 A,B 두 부분으로 나누는 것이 가장 성능이 좋았다.&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;Proportional Attention &lt;i&gt;&lt;b&gt;(Table 1.f)&lt;/b&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병합한 이후에, token은 하나 이상의 input patch를 표현한다. 논문에서는 proportional attention으로 이 점을 반영하려 하였다. 놀랍게도, supervised model (AugReg, SWAG, DeiT)에서는 proportional attention이 필수적이라는 것을 알 수 있었지만, MAE 모델에서는 별다른 효과가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이는 training 이후 없어지게 되는데, 이것은 MAE가 이미 pre-training에서 token을 제거하였기 때문이다. 그럼에도 불구하고, MAE 모델을 제외한 나머지 모델들에 대해서만 proportional attention을 적용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Comparing Matching Algorithms&lt;/b&gt;&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;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEbzlh/btsofoD8pmb/UwSU8lCPYqDmrHpeoNUZl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEbzlh/btsofoD8pmb/UwSU8lCPYqDmrHpeoNUZl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEbzlh/btsofoD8pmb/UwSU8lCPYqDmrHpeoNUZl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEbzlh%2FbtsofoD8pmb%2FUwSU8lCPYqDmrHpeoNUZl0%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;368&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Table 2에서는 bipartite matching을 다른 token reduction algorithm과 비교하는 실험을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pruning은 빠르지만, 98%의 토큰을 제거하였을 때에는 &lt;i&gt;중요한 정보가 없어지는 현상&lt;/i&gt;이 발생하였다. 이것은 pruning할 것을 랜덤하게 정했을 때와 Attention에서 주목을 받지 못하는 부분을 없앴을 때 모두 공통적으로 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 대조적으로, merging token은 서로 비슷하지 않은 토큰들이 병합이 되었을 경우에만 중요한 정보들을 잃어버리는 모습을 보여준다. 이 결과를 통해서 &lt;b&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;kmeans는 많은 수의 토큰을 동일한 클러스터에 일치시킬 수 있도록 하여 유사하지 않은 토큰들이 병합될 확률을 높이게 된다. 이 점으로 인해서 training 없이는 10% 이상의 정확도 하락을 줄일 수는 없었다.&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;kmeans 기법 대신에, 비슷한 토큰들끼리 병합이 되는 &lt;b&gt;matching algorithm&lt;/b&gt;을 적용하려고 시도하였다. 가장 유사한 토큰 쌍을 병합한 다음 교체 시간 없이 $ r $번 반복하여 탐욕법으로 이것을 할 수 있었다. 이 방법은 정확하지만, sequential하므로, $ r $이 커질수록 느려질 수 있다는 단점을 가지고 있다. &lt;br /&gt;위 논문에서 제안한 &lt;b&gt;bipartite matching이라는 기법을 통해서 greedy approach의 정확성을 가지면서도, pruning의 속도를 가질 수 있도록 하였다.&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;&lt;b&gt;Selecting a Merging Schedule&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본값으로는 토큰을 한 layer에서 일정한 수($ r $) 만큼을 줄이는 schedule 방법을 사용하였다. 이 디자인의 최적화를 평가하기 위해서 15,000개의 merging schedules를 표본 추출(?)하였다. 각 schedule에서 AugReg ViT-B/16 모델을 사용하여 정확도와 fp16 (Imagenet-1k val)을 측정하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caXxwy/btsofnSKCj9/BzHq2RNvakxnwSWBSw2y6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caXxwy/btsofnSKCj9/BzHq2RNvakxnwSWBSw2y6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caXxwy/btsofnSKCj9/BzHq2RNvakxnwSWBSw2y6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaXxwy%2FbtsofnSKCj9%2FBzHq2RNvakxnwSWBSw2y6K%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;491&quot; height=&quot;365&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 보았을 때, &lt;b&gt;constant&lt;/b&gt;($ r $의 값이 중간에 바뀌지 않는 것)가 최적에 가까웠고, 특히 병합된 total token이 클수록 더욱 최적에 가까웠다. 모델이 3배 이상의 처리량을 감당하게 만들기 위해서는 &lt;b&gt;linearly decreasing&lt;/b&gt; 방법이 효과가 좋은 것을 알 수 있었다. 처음에는 $ 2r $ 토큰을 첫번째 layer에서 제거하고, 마지막 layer에서는 0개의 토큰을 제거하는 &lt;b&gt;&amp;ldquo;decreasing&amp;rdquo; schedule&lt;/b&gt;을 정의하였다. 그리고 그 사이에서는 interpolation으로 제거해야 할 토큰의 개수를 정한다. 이것은 동일하게 $ rL $토큰을 제거하지만, 기존보다 더 빠르게 처리할 수 있는 방법이다.&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;880&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6d1DU/btsoeBjKM2s/XABO2rRiBvQTgCS6CZKoUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6d1DU/btsoeBjKM2s/XABO2rRiBvQTgCS6CZKoUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6d1DU/btsoeBjKM2s/XABO2rRiBvQTgCS6CZKoUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6d1DU%2FbtsoeBjKM2s%2FXABO2rRiBvQTgCS6CZKoUk%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;880&quot; height=&quot;72&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Visualizations &lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vc6qv/btsofO3Ch22/QvavrUXea3jCTO2pdY7EG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vc6qv/btsofO3Ch22/QvavrUXea3jCTO2pdY7EG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vc6qv/btsofO3Ch22/QvavrUXea3jCTO2pdY7EG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvc6qv%2FbtsofO3Ch22%2FQvavrUXea3jCTO2pdY7EG0%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;988&quot; height=&quot;388&quot; data-origin-width=&quot;988&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;이 논문에서 가장 흥미로웠던 실험으로, ToMe를 적용하였을 때, 마지막 Layer에서 어떤 image patch들끼리 Token이 병합되었는지를 확인하여 이를 시각화하는 실험이었다. ToMe를 적용했을 때 part segmentation과 유사한 token merging이 발생했다는 것을 발견했다. 이는 &lt;b&gt;사람이 인지하는 것과 비슷하게 유사한 의미를 가진 image patch들 끼리 merging이 된다는 뜻&lt;/b&gt;이다. 따라서 pruning과 달리, ToMe는 정보를 잃지 않고 background와 foreground 모두에서 수많은 토큰을 병합할 수 있다.&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;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 연구에서는 ToMe라는 기법을 제안하여 점진적으로 병합되는 토큰의 방식을 통해 ViT 모델의 처리량을 늘렸다. ToMe는 자연적으로 input의 중복된 정보들을 사용하고, 중복성이 있는 모든 modality에 사용할 수 있다.&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;ToMe는 pure transformer block을 사용하는 &amp;ldquo;Natural&amp;rdquo;한 hierarchical model로 볼 수 있다. 이 연구에서는 분류 (Classification)에 초점을 맞췄지만, Visualization part에서는 ToMe가 분할(Segmentation)과 같은 작업에서 높은 잠재력을 가지고 있음을 보여준다.마지막으로 ToMe는 도메인 전체의 대규모 모델에서 잘 작동하고, training time과 memory usage를 줄이므로, 대규모 모델 training의 핵심 구성 요소가 될 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;Reference.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot;&gt;Bolya, Daniel, et al. &quot;Token merging: Your vit but faster.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;arXiv preprint arXiv:2210.09461&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2022).&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;</description>
      <category>딥러닝</category>
      <category>ICLR</category>
      <category>ICLR 2023</category>
      <category>Throughput</category>
      <category>token</category>
      <category>Token Merging</category>
      <category>tome</category>
      <category>Transformer</category>
      <category>Visual Transformer</category>
      <category>ViT</category>
      <category>처리량</category>
      <author>hannn</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/150</guid>
      <comments>https://aims-lab.tistory.com/150#entry150comment</comments>
      <pubDate>Thu, 20 Jul 2023 11:11:57 +0900</pubDate>
    </item>
    <item>
      <title>Jupyter Kernel이 제대로 동작을 안 하는 경우</title>
      <link>https://aims-lab.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Python 언어를 활용하다 보면 Jupyter Lab 혹은 Jupyter Notebook을 많이 사용한다.&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;하지만, 가끔 아나콘다에서 가상 환경을 생성하여 이를 Kernel로 활용하는 것이 제대로 동작하지 않는 경우가 있다.&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;다시 말해서, 분명히 해당 가상 환경에서 어떤 패키지를 설치했음에도 불구하고, Import Error가 뜨는 경우이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 첫번째로, 아나콘다 프롬프트에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;conda activate [가상환경]&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 사용하고자 하는 가상 환경에 진입한다. 그 이후에, 해당 가상 환경에 설치된 패키지들에 대한 정보를 확인할 수 있는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;conda list&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 통해서 확인해본다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제, Jupyter Lab 혹은 Jupyter Notebook에서 설치하였지만, 제대로 설치가 되어 있지 않은 패키지를 import 해서 버전을 확인하면 분명 conda list에서 볼 수 있었던 패키지 버전 정보와는 다른 패키지 버전이 설치되어 있는 것을 확인했었다.&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;처음에는 conda install 혹은 아나콘다 자체에 문제가 있는 것이라고 생각하여 아나콘다를 최신 버전으로 업데이트 했지만, 문제는 해결되지 않았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론적으로는&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이런 경우에는 기본 환경인 Base의 버전인지 확인해보자!&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마도 Jupyter에서 print() 함수를 통해서 출력하여 볼 수 있는 버전은 Base의 버전과 동일할 것이다. (마찬가지로 Base에 install 되어 있지 않은 경우에는 해당 패키지가 없다는 Import Error가 나타날 것이다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제의 원인은 아마도, Jupyter에 커널을 추가하는 과정에서 문제가 일어났다고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(아직까지 왜 이런 일이 발생하는 지에 대해서는 원인을 알지 못했다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 그럼에도 불구하고, 이를 해결하는 방법은&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;jupyer kernelspec list&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 통해서, 각 가상 환경의 jupyer kernel이 어디에 존재하고 있는지 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 디렉토리에 들어가면 kernel.json 파일이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 &quot;argv&quot;라는 key에 해당하는 value는 List로 되어 있고, 가장 첫번째 원소가 파이썬 실행파일의 위치를 나타내고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것의 디렉토리를 base의 python.exe가 아닌, 실제 가상 환경의 python.exe 파일을 가리키도록 설정해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 윈도우의 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;C:\\Users\\(사용자명)\\anaconda\\python.exe&quot;&amp;nbsp;&lt;/i&gt; 로 되어 있는 부분을,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;C:\\Users\\(사용자명)\\anaconda\\envs\\(가상 환경 이름)\\python.exe&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 변경해준 뒤, 다시 jupyter lab 혹은 jupyter notebook을 켜고, 해당 커널로 설정한 뒤에 버전을 확인해보면,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 원하는 가상 환경의 패키지가 제대로 불러와 지는 것을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>conda error</category>
      <category>jupyter</category>
      <category>jupyter kernel</category>
      <category>kernel.json</category>
      <category>python</category>
      <category>가상환경</category>
      <category>아나콘다</category>
      <category>오류</category>
      <category>파이썬 오류</category>
      <author>hannn</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/149</guid>
      <comments>https://aims-lab.tistory.com/149#entry149comment</comments>
      <pubDate>Sat, 15 Jul 2023 23:13:18 +0900</pubDate>
    </item>
    <item>
      <title>[RNN/LSTM/GRU] 순환 신경망 기반 Network 정리</title>
      <link>https://aims-lab.tistory.com/148</link>
      <description>&lt;p&gt;안녕하세요!&lt;/p&gt;
&lt;p&gt;자연어 처리에서 핵심 역할을 했었던, RNN과 이후 RNN을 기반으로 파생된 모델인 LSTM과 GRU에 대해 포스팅해보겠습니다.&lt;/p&gt;
&lt;h2&gt;Recurrent Neural Network (RNN)&lt;/h2&gt;
&lt;h4&gt;RNN: Background&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;시계열&lt;/strong&gt; 데이터를 처리하기에 좋은 네트워크&lt;/li&gt;
&lt;li&gt;RNN의 기본 전제는 sequence data의 각 요소가 서로 연관성을 가진 다는 것,&lt;/li&gt;
&lt;li&gt;CNN 이 이미지 구역별로 같은 weight를 공유한다면, &lt;strong&gt;시간 별로 같은 weight를 공유&lt;/strong&gt;한다.&lt;/li&gt;
&lt;li&gt;기존의 신경망들 (DNN) 은 은닉층에서 activation function을 지나 출력됨 =&amp;gt; Feed Forward Neural Network&lt;/li&gt;
&lt;li&gt;But 시계열 데이터는 과거의 상태가 현재 상태에 영향을 미치며, 최종적으로는 Output에 영향을 미침.&lt;/li&gt;
&lt;li&gt;따라서 시계열 데이터를 처리하기 위해, RNN에서는 현재 시간의 상태 ($ x_t $) 가 이전 시간의 상태($ x_{t-1}$ 와, 현재의 입력 ($ u_{t}$) 에 관련이 있다고 가정함.&lt;/li&gt;
&lt;li&gt;그럼 다음과 같은 수식을 정의할 수 있음.&lt;/li&gt;
&lt;li&gt;$x_t = f(x_{t-1}, u_t)$&lt;br&gt;$y_t = h(x_t)$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neural Network setting으로 함수 근사&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x_t = \sigma (W_{xx}x_{t-1} + W_{xu}u_t + b_x)$&lt;br&gt;$y_t = \sigma (W_{yx}x_t + b_y)$&lt;/li&gt;
&lt;li&gt;RNN (Recurrent Neural Network) 는 은닉층의 노드에서 activation function을 통해 나온 결과값을 출력층 방향으로 보내면서, 은닉층 노드의 다음 계산의 입력으로 보냄.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이러한 RNN은 대표적으로 두 가지 그림을 통해 표현할 수 있음. (bias는 생략)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfdtH/btsnhs07NeS/I4bgdxDh8a8iCXkmCKSoP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfdtH/btsnhs07NeS/I4bgdxDh8a8iCXkmCKSoP1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfdtH/btsnhs07NeS/I4bgdxDh8a8iCXkmCKSoP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfdtH%2Fbtsnhs07NeS%2FI4bgdxDh8a8iCXkmCKSoP1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1936&quot; height=&quot;1000&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;각각의 노드는 벡터 형태임.&lt;/li&gt;
&lt;li&gt;1번과 2번의 그림을 보면 알 수 있듯이, self feedback loop가 존재하는 것을 볼 수 있음. 그리고 $x_t$ 이전 까지의 상태와, 이전까지의 입력을 대표할 수 있는 압축본이라고 할 수 있다. 이러한 hidden state $x$를 셀(cell)이라고 하며, 이전의 값을 기억하는 메모리 역할을 수행하여 &lt;strong&gt;메모리 셀 or RNN 셀&lt;/strong&gt; 이라고 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;우리가 알기 익숙한 형태로 시각화를 해보자면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVYdY/btsnimM7AcM/i7GQgTbmdSTGJUkT8x16e1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVYdY/btsnimM7AcM/i7GQgTbmdSTGJUkT8x16e1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVYdY/btsnimM7AcM/i7GQgTbmdSTGJUkT8x16e1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVYdY%2FbtsnimM7AcM%2Fi7GQgTbmdSTGJUkT8x16e1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1544&quot; height=&quot;1000&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4&gt;RNN: Problem Types&lt;/h4&gt;
&lt;p&gt;RNN은 입력과 출력의 길이를 다르게 설계할 수 있어 아래와 같은 3가지 task 로 나눌 수 있음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many-to-many (번역)&lt;/li&gt;
&lt;li&gt;Many-to-one (예측): sentiment classification (입력 문서가 긍정 or 부정), spam detection&lt;/li&gt;
&lt;li&gt;One-to-many (생성): Image captioning (사진의 제목 생성하기)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2720&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2eA98/btsng98z3dm/TgRGlBTKGcVlFAFRBPCmi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2eA98/btsng98z3dm/TgRGlBTKGcVlFAFRBPCmi1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2eA98/btsng98z3dm/TgRGlBTKGcVlFAFRBPCmi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2eA98%2Fbtsng98z3dm%2FTgRGlBTKGcVlFAFRBPCmi1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2720&quot; height=&quot;1000&quot; data-origin-width=&quot;2720&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;RNN: Training&lt;/h3&gt;
&lt;p&gt;RNN의 학습은 backpropagation의 확장형인 &lt;strong&gt;BPTT(Back Propagation Through Time)&lt;/strong&gt;를 사용함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcaRqz/btsnfFNbyH1/WhHApQivTLeNtzyD6KmgW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcaRqz/btsnfFNbyH1/WhHApQivTLeNtzyD6KmgW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcaRqz/btsnfFNbyH1/WhHApQivTLeNtzyD6KmgW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcaRqz%2FbtsnfFNbyH1%2FWhHApQivTLeNtzyD6KmgW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1650&quot; height=&quot;1000&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가중치 W가 모든 시점에서 메모리 셀의 출력($y$)를 구할 때 사용되었기 때문에 0에서 k까지 계산하여 합하는 것임.&lt;/li&gt;
&lt;li&gt;이러한 Training 때문에, 전파가 길어질 수록 &lt;strong&gt;Gradient Exploding or Gradient Vanishing&lt;/strong&gt; 현상이 발생함. (정보량의 손실)&lt;/li&gt;
&lt;li&gt;Gradient Exploding =&amp;gt; Gradient clipping (gradient가 일정 threshold가 넘어가면, clipping 해줌)을 해 줄 수 있음.&lt;/li&gt;
&lt;li&gt;Gradient Vanishing =&amp;gt; &lt;strong&gt;학습 도중 파악하기 어려움.&lt;/strong&gt; 만약 loss값이 0 이라면 학습이 종료된 것인지, 아니면 Vanishing gradient 인지 모름. 따라서 다른 네트워크 구조를 사용하는 것이 편함&lt;/li&gt;
&lt;li&gt;따라서 RNN은 긴 의존기간의 문제를 어려워함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ex, The clouds are in the sky =&amp;gt; sky를 맞추기 위해서는 이 문장만 봐도 해결 가능함. I grew up in France ... I speak fluent French =&amp;gt; French 를 맞추고 싶다면 앞의 문맥부터 참고 해야함.&lt;br&gt;아래의 경우는 필요한 정보를 얻기 위해 시간 격차가 굉장히 커지기 때문에, 학습하는 정보를 계속 이어나가기 힘들다.&lt;br&gt;==&amp;gt; 이를 해결하는 네트워크 구조 **Gated RNNs: LSTM/GRU**&lt;/p&gt;
&lt;h2&gt;Long short-term memory: LSTM&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z0RHN/btsnocSb5jM/kv67TVmFHnrPc8cDwSpdZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z0RHN/btsnocSb5jM/kv67TVmFHnrPc8cDwSpdZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z0RHN/btsnocSb5jM/kv67TVmFHnrPc8cDwSpdZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ0RHN%2FbtsnocSb5jM%2Fkv67TVmFHnrPc8cDwSpdZK%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;749&quot; height=&quot;597&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;출처:&lt;a href=&quot;http://colah.github.io/posts/2015-08-Understanding-LSTMs/&quot;&gt;http://colah.github.io/posts/2015-08-Understanding-LSTMs/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;앞서 제시된 RNN의 긴 의존 기간의 문제를 피하기 위해 설계되었음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hidden state 만이 아니라 &lt;strong&gt;cell state&lt;/strong&gt; 라는 역할이 있으며 &lt;strong&gt;Forget gate, Input gate, Output gate&lt;/strong&gt;를 통해 계산이 이루어짐.&lt;/li&gt;
&lt;li&gt;Gradient flow를 제어할 수 있는 &amp;quot;밸브&amp;quot; 역할을 수행함.&lt;/li&gt;
&lt;li&gt;State space의 입력($x$), 상태($h$), 출력($y$) 구조는 동일함.&lt;/li&gt;
&lt;li&gt;4개의 Unit을 가지고 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1) Forget gate&lt;br&gt;2) Input gate&lt;br&gt;3) Output gate&lt;br&gt;4) Cell&lt;/p&gt;
&lt;p&gt;Gate의 이름에서 알 수 있듯이 어떤 정보를 잊을지 기억할지를 선택해 long term과 short term에 대한 정보를 고려함.&lt;/p&gt;
&lt;h4&gt;Cell state&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R2p6G/btsnohLNgWo/nk2TSHJvWNtXLKkwro5lik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R2p6G/btsnohLNgWo/nk2TSHJvWNtXLKkwro5lik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R2p6G/btsnohLNgWo/nk2TSHJvWNtXLKkwro5lik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR2p6G%2FbtsnohLNgWo%2Fnk2TSHJvWNtXLKkwro5lik%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;636&quot; height=&quot;309&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hidden state와 마찬가지로 이전 시점의 cell state를 다음 시점으로 넘겨줌.&lt;/li&gt;
&lt;li&gt;Cell state의 주 역할은 gate들과 함께 작용해 정보를 선택적으로 활용&lt;/li&gt;
&lt;li&gt;Cell state의 업데이트는 각 gate의 결과를 더함으로서 진행됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Gate&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;1), 3), 4)이 gate라고 할 수 있음.&lt;/li&gt;
&lt;li&gt;세 개의 gate 모두 활성화 함수로 시그모이드 적용 =&amp;gt; $\sigma$&lt;/li&gt;
&lt;li&gt;gate는 cell state와 함께 정보를 선택적으로 활용할 수 있도록 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1) Forget gate layer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ICKsP/btsnoDPdk81/MGTzF6qYmOnErwCP62km10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ICKsP/btsnoDPdk81/MGTzF6qYmOnErwCP62km10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ICKsP/btsnoDPdk81/MGTzF6qYmOnErwCP62km10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FICKsP%2FbtsnoDPdk81%2FMGTzF6qYmOnErwCP62km10%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;741&quot; height=&quot;243&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;과거 정보를 얼마나 잊을 것인지/기억할 것인지 결정하는 단계&lt;/li&gt;
&lt;li&gt;전 시점의 hidden state $h$와 현재 입력 $x$에 대해 연산을 진행하고, $\sigma$함수 사용 함.&lt;/li&gt;
&lt;li&gt;이 값이 0에 가까울 수록 정보를 잊은 것이며, 1에 가까울 수록 정보를 기억하는 것임.&lt;/li&gt;
&lt;li&gt;연산의 결과인 $f_t$는 &lt;strong&gt;과거 정보&lt;/strong&gt;에 관해 얼마나 잊었는지, 기억하는지를 가지고 있는 값임.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2) Input gate layer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7DcIk/btsnoH42Kec/r44U5ORR2xnUY65mko57x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7DcIk/btsnoH42Kec/r44U5ORR2xnUY65mko57x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7DcIk/btsnoH42Kec/r44U5ORR2xnUY65mko57x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7DcIk%2FbtsnoH42Kec%2Fr44U5ORR2xnUY65mko57x0%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;773&quot; height=&quot;263&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;새로운 정보 중 어떤것을 cell state에 저장할 것인지?&lt;/li&gt;
&lt;li&gt;forget gate 와 동일한 기능으로 $i_t$는 현재의 정보를 기억할 것인지/기억하지 않을 것인지를 결정함.&lt;/li&gt;
&lt;li&gt;이후 $h_{t-1}$ $x_t$는 tanh 함수에 들어가 출력값으로 반환되어 hadamarad product()가 되고, 새로운 후보 값인 $C_t$를 만들어 cell state에 더해짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3) Cell state update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnnf0s/btsnkL8scG2/rJzOunuYm7ZkHEk285kHMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnnf0s/btsnkL8scG2/rJzOunuYm7ZkHEk285kHMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnnf0s/btsnkL8scG2/rJzOunuYm7ZkHEk285kHMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnnf0s%2FbtsnkL8scG2%2FrJzOunuYm7ZkHEk285kHMK%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;686&quot; height=&quot;256&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;과거 state인 $C_{t-1}$을 업데이트 해서 새로운 cell state인 $C_t$를 만듦. 이때 forget gate에서 잊어야 하는 이전 상태의 정보를 잊어버리고, 현재의 input값의 반영 값을 포함해서 업데이트 해줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4) Output gate layer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dibQ8T/btsnnTyAPwF/bM2qkyxxBKnWbq1XNWqbeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dibQ8T/btsnnTyAPwF/bM2qkyxxBKnWbq1XNWqbeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dibQ8T/btsnnTyAPwF/bM2qkyxxBKnWbq1XNWqbeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdibQ8T%2FbtsnnTyAPwF%2FbM2qkyxxBKnWbq1XNWqbeK%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;762&quot; height=&quot;256&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;시그모이드 레이어에 $x_{t}$와 $h_{t-1}$이 들어가 0~1사이의 값을 출력하고, 이 값은 cell state의 어느 부분을 output으로 내보낼 지 결정함. 이후 cell state가 tanh에 들어가 나온 출력값과 output gate에서 나온 값이 곱해져 $h_t$가 출력됨. 이 $h_t$는 출력값으로 나가가기도 하며, 다음 state의 input으로 들어감.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Gated Recurrent Unit: GRU&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cstvl1/btsnoEgk2lX/NHFosOzUQeK7KIRbSQZUIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cstvl1/btsnoEgk2lX/NHFosOzUQeK7KIRbSQZUIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cstvl1/btsnoEgk2lX/NHFosOzUQeK7KIRbSQZUIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcstvl1%2FbtsnoEgk2lX%2FNHFosOzUQeK7KIRbSQZUIK%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;668&quot; height=&quot;233&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GRU는 기존 LSTM의 구조를 조금 더 간단하게 개선한 모델임.&lt;/li&gt;
&lt;li&gt;LSTM보다 학습 속도가 빠르지만, 여러 평가에서 LSTM과 비슷한 성능을 보인다고 알려져 있음.&lt;/li&gt;
&lt;li&gt;데이터 양이 적을 때는 매개변수의 양이 적은 GRU가 더 좋으며, 데이터 양이 많다면 LSTM이 더 좋다고 알려져 있음.&lt;/li&gt;
&lt;li&gt;LSTM의 forget gate, input gate, output gate 를 reset gate, update gate 2개의 gate만을 사용함. 그리고 cell state, hidden state를 하나의 hidden state로 표현함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1) Reset gate ($r(t)$)&lt;/strong&gt; : 이전 상태를 얼마나 반영할 지&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이전 시점의 hidden state, 현 시점의 입력값을 sigmoid에 통과해 &lt;strong&gt;이전 hidden state값을 얼마나 활용할 것인지&lt;/strong&gt; 결정 식(2).&lt;/li&gt;
&lt;li&gt;(3)식에 다시 활용하여 이전 time point의 hidden state에 reset gate를 곱하여 사용함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2) Update gate ($z(t)$) : 과거와 현재의 정보를 각각 얼마나 반영할 지에 대한 비율 ==&amp;gt; 삭제 게이트와 입력 게이트의 역할을 수행함.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;과거와 현재의 정보를 각각 얼마나 반영할 지에 대한 비율&lt;/strong&gt;을 구함.&lt;/li&gt;
&lt;li&gt;식 (1)을 통한 결과인 $z$는 현재 정보를 얼마나 사용할 지를 반영, $1-z$는 과거 정보를 얼마나 사용할 지에 대해 반영함. 전자는 LSTM의 Input gate, 이후를 forget gate라고 생각할 수 있음.&lt;/li&gt;
&lt;li&gt;최종적으로는 (4) 식을 통해 현 시점의 hidden state 값을 구할 수 있음.&lt;/li&gt;
&lt;li&gt;GRU 셀은 output gate가 없어 hidden vector $h_t$가 타임 스텝마다 출력되고, 이전 상태의 $h_{t-1}$의 어느 부분이 출력될 지 제어하는 gate controller인 $r_t$가 있는 것임&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>딥러닝</category>
      <category>GRU</category>
      <category>LSTM</category>
      <category>rnn</category>
      <author>호Tuck</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/148</guid>
      <comments>https://aims-lab.tistory.com/148#entry148comment</comments>
      <pubDate>Wed, 12 Jul 2023 20:57:25 +0900</pubDate>
    </item>
    <item>
      <title>Cross Validation</title>
      <link>https://aims-lab.tistory.com/146</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q. Cross Validation은 무엇이고 어떻게 해야하나요?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Cross Validation&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 Train set과 Test set으로만 나누어 학습 및 평가를 할 경우 내가 만든 모델이 Test set에 대해서만 잘 작동할 수 있다.&lt;/li&gt;
&lt;li&gt;이렇듯 모델 과적합이 일어나면 다른 데이터를 사용했을 때 예측을 잘 수행할 수 없게 된다.&lt;/li&gt;
&lt;li&gt;고정된 Train 및 Test set으로부터 발생할 수 있는 문제를 해결하고자 하는 것이 바로 교차검증 (cross validation)이다.&lt;/li&gt;
&lt;li&gt;아래 그림처럼 전체 데이터를 k개의 subset으로 나누고 Test set을 중복없이 바꾸어가면서 k번의 평가를 진행할 수 있다. 이를 K-fold cross validation이라 한다.&lt;/li&gt;
&lt;li&gt;k개의 평가 값에 대해 평균을 내어서 최종적인 모델의 성능으로 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;grid_search_cross_validation.png&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhEspl/btsi2dVHeYj/gnTKYXjYXCU6QqbBiNt2jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhEspl/btsi2dVHeYj/gnTKYXjYXCU6QqbBiNt2jK/img.png&quot; data-alt=&quot;출처: scikt-learn&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhEspl/btsi2dVHeYj/gnTKYXjYXCU6QqbBiNt2jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhEspl%2Fbtsi2dVHeYj%2FgnTKYXjYXCU6QqbBiNt2jK%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;610&quot; height=&quot;423&quot; data-filename=&quot;grid_search_cross_validation.png&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: scikt-learn&lt;/figcaption&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;Cross validation의 장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 데이터셋을 평가에 사용할 수 있다. 이를 통해 데이터 편향 및 과적합을 방지할 수 있다.&lt;/li&gt;
&lt;li&gt;K개의 성능 결과를 통합하여 하나의 결과를 도출하기 때문에 보다 일반화된 모델 성능 평가가 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cross validation의 단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반복 횟수가 많아서 모델 학습 및 평가 시간이 길어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 클래스가 불균형한 경우에는 Stratified k-fold cross validation을 사용하여 데이터 클래스별 분포를 고려하여 폴드 세트를 만들어야 한다.&lt;/li&gt;
&lt;li&gt;전체 데이터 중 p개의 샘플을 선택하여 그것을 모델 검증에 사용하는 Leave-p-out cross validation 방법도 존재한다. 이 방법은 데이터 폴드 세트의 경우의 수가 매우 커서 계산 시간에 대한 부담이 크다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/ckdgus1433/221599517834&quot;&gt;https://m.blog.naver.com/ckdgus1433/221599517834&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://huidea.tistory.com/30&quot;&gt;https://huidea.tistory.com/30&lt;/a&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <author>hyenzzang</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/146</guid>
      <comments>https://aims-lab.tistory.com/146#entry146comment</comments>
      <pubDate>Thu, 8 Jun 2023 11:11:10 +0900</pubDate>
    </item>
    <item>
      <title>로그함수 (log)</title>
      <link>https://aims-lab.tistory.com/145</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Q. 로그함수는 어떤 경우 유용합니까? &lt;br /&gt;사례를 들어 설명해주세요.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; 로그(log)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 분석 시 로그 함수를 취하는 이유는 정규성을 높이고 회귀 분석에서의 정확한 값을 얻기 위함이다.&lt;/li&gt;
&lt;li&gt;데이터 간의 편차를 줄여 왜도 (skewness, 데이터가 한 쪽으로 치우친 정도)와 첨도 (Kurtosis, 분포의 뾰족한 정도)를 줄일 수 있기 때문에 정규성을 높일 수 있다.&lt;/li&gt;
&lt;li&gt;예를 들어 연령은 숫자의 범위가 0세~120세처럼 특정한 범위 내에 있지만 재산 보유액 같은 경우는 0원에서 몇 조의 단위까지 올라갈 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 log를 통해 큰 수를 작게 만들고 복잡한 계산을 간편하게 만듦과 동시에 왜도와 첨도를 줄여 데이터 분석 시 의미 있는 결과를 도출할 수 있다.&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 함수를 취하는 이유는 다음과 같다. 1) 단위수가 너무 큰 값을 회귀분석 시 바로 사용할 경우, 결과를 왜곡할 수 있는데, 의미 있는 결과를 도출하기 위해 log를 취해준다. 2) 독립 변수와 종속 변수의 변화관계에서 절대량이 아닌 비율값을 사용하기 위해 log값을 취해줄 수 있다. 3) 비선형관계를 선형관계로 만들기 위해 log를 취해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leebaro.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%8B%9C-%EC%8B%9D%EC%97%90-%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%B7%A8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leebaro.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%8B%9C-%EC%8B%9D%EC%97%90-%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%B7%A8%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dangdo.tistory.com/44&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dangdo.tistory.com/44&lt;/a&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <author>hyenzzang</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/145</guid>
      <comments>https://aims-lab.tistory.com/145#entry145comment</comments>
      <pubDate>Sun, 4 Jun 2023 21:28:21 +0900</pubDate>
    </item>
    <item>
      <title>Log 함수를 사용하는 이유</title>
      <link>https://aims-lab.tistory.com/144</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;로그함수는 어떤 경우에 유용하게 사용할 수 있을까?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;로그 함수(Log)&lt;/b&gt;&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;로그는 지수(Exponential)의 역함수 개념으로, 기본적으로 큰 수를 쉽게 다루기 위해서 사용되는 개념이다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;언제 사용되는가? &lt;/b&gt;&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;&lt;b&gt;숫자의 범위가 큰 경우&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 우리의 일상생활에서 다른 수들보다 범위가 큰 수를 가진 항목들이 존재한다. 예를 들어 가격 혹은 재산 보유액 등과 같은 항목들은 사람이 단번에 숫자를 파악하기 어려운 경우가 많다. 이런 경우에 각 값들에 Log를 취한 값을 사용하여 데이터를 파악하면, 조금 더 쉽게 파악하는 것이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터가 편향되어 있는 경우&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;데이터 분석을 배우다보면, 대부분 로그함수를 취하는 경우에는 왼쪽이든 오른쪽이든 데이터의 분포가 편향(Skewed)되어 있는 경우에 사용한다고 설명이 되어 있다. 하지만, 값이 상대적으로 큰 데이터들이 데이터의 분포에서 집중되어 있고, 값이 작은 샘플 수는 별로 없는 경우에는, 로그를 취했을 때, 데이터들의 편향성이 더욱 증가한다고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 로그 함수는 대부분 작은 값을 가진 샘플들이 집중되어 있고, 몇몇 샘플들이 이상치라고 생각할 만큼 큰 값을 가지고 있는 경우에 사용하면 우리가 평소에 자주 접하는 정규 분포의 형태와 비슷해진다고 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되는 이유는 로그 값이 동일한 정도로 커지기 위해서는 값이 큰 경우에 더 많이 증가를 해야하기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, log(x) 값이 1에서 2로 가기 위해서는 실질적으로 x가 90만큼 커져야 하지만, log(x)값이 2&amp;rarr; 3이 되기 위해선 x가 900만큼 커져야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;독립 변수와 종속 변수가 비선형성을 띄는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;독립 변수가 증가할 때, 종속 변수가 지수적으로 증가하는 관계를 가지고 있는 경우에는 로그를 취하게 되면, 선형적인 관계로 해석할 수 있다. 이 점은 특히 회귀 분석을 하는 경우에, 대부분의 모델이 독립 변수와 종속 변수의 선형적 관계를 파악하기 때문에, 아주 유용하게 사용된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;Ref.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://dangdo.tistory.com/44&quot;&gt;https://dangdo.tistory.com/44&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://velog.io/@zxxzx1515/로그-함수는-어떤-경우-유용합니까-사례를-들어-설명해주세요&quot;&gt;https://velog.io/@zxxzx1515/로그-함수는-어떤-경우-유용합니까-사례를-들어-설명해주세요&lt;/a&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>Skewed data</category>
      <category>로그 함수</category>
      <category>선형 관계</category>
      <category>지수</category>
      <category>통계</category>
      <author>hannn</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/144</guid>
      <comments>https://aims-lab.tistory.com/144#entry144comment</comments>
      <pubDate>Sun, 4 Jun 2023 10:00:51 +0900</pubDate>
    </item>
    <item>
      <title>Bias를 통제하는 방법</title>
      <link>https://aims-lab.tistory.com/143</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bias란&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;모델이 정답값을 예측함에 있어서 발생하는 편향으로, 데이터의 분포를 정확하게 학습하지 못하여, 잘못된 분포를 보이고 있는 것을 의미한다. Bias가 존재한다면, 예측값과 실제값이 일정한 차이를 보이게 된다.&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;h3 data-ke-size=&quot;size23&quot;&gt;Bias를 통제하는 방법&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;Bias가 발생하는 원인은 결국 모델이 데이터의 분포를 정확하게 학습하지 못하기 때문이다. 그렇다면, Bias를 통제하기 위해서는 모델이 데이터의 분포를 정확하게 학습을 시키면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직까지 모델이 데이터의 분포를 정확하게 학습을 하지 못했다는 것은, 다음의 원인 중 하나이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델의 구조가 너무 간단하여 모델이 데이터의 분포를 표현하기에 부족하다.&lt;/li&gt;
&lt;li&gt;모델이 아직까지 학습이 덜 되었다. (특히 Deep Learning Model의 경우)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위한 방법으로는 아래의 방법들이 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델의 구조를 조금 더 복잡하게 만들 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순한 Feature들을 결합하여, 해당 Feature들의 상관관계도 학습하도록 만든다.&lt;/li&gt;
&lt;li&gt;Regularization Term이 존재한다면 (ex&amp;gt; Lasso, Ridge, Elastic Net 등) Regularization Term의 계수의 크기를 줄여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deep Learning Model의 경우, Epoch의 수를 조금 더 늘린다. (모델이 조금 더 여러번 학습하여 가중치 Update의 횟수를 늘린다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 무조건적으로 모델의 복잡도를 높일수는 없다. 그 이유는 Bias와 Variance는 Trade-off 관계이기 때문이다. 따라서 기본적으로 모델을 학습시킴에 있어서 Bias와 Variance를 동시에 고려한다. 즉, Model이 정확한 예측을 하기 위해서는 Bias를 최소화하는 동시에 Variance를 최소화해야 하는데, 일반적으로 Bias를 줄일 경우에 Variance가 증가하는 경향이 존재하며, Variance를 줄일 경우에는 Bias가 증가하는 경향이 존재하기 때문이다.&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;Variance는 Bias와는 반대로, Training dataset의 분포를 학습하는 데에 있어서, 유용하지 않은 부분까지 학습을 하게 되는 것을 의미한다. 따라서, 외부의 데이터 셋을 해당 모델에 적용하였을 때, 정답값을 이상하게 예측하는 Overfitting 현상이 발생하게 된다.&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;Variance는 일반적으로 Bias를 줄이려고 사용하는 방법과 반대를 생각하면 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델의 구조를 조금 더 단순하게 만든다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;너무 복잡한 Feature들을 삭제하거나, Feature의 개수를 줄인다.&lt;/li&gt;
&lt;li&gt;Regularization Term이 존재한다면 Regularization Term의 계수의 크기를 증가시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deep Learning의 경우, Ealry stopping 등의 장치를 통해서 너무 많이 가중치가 Update 되는 것을 방지한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://gaussian37.github.io/machine-learning-concept-bias_and_variance/&quot;&gt;https://gaussian37.github.io/machine-learning-concept-bias_and_variance/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://yuldangs-sosolife.tistory.com/70&quot;&gt;https://yuldangs-sosolife.tistory.com/70&lt;/a&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>Bias</category>
      <category>Bias 통제</category>
      <category>Ealry stop</category>
      <category>Feature</category>
      <category>Overfitting</category>
      <category>regularization</category>
      <category>Trade-off</category>
      <category>Underfitting</category>
      <category>variance</category>
      <author>hannn</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/143</guid>
      <comments>https://aims-lab.tistory.com/143#entry143comment</comments>
      <pubDate>Sat, 27 May 2023 16:50:24 +0900</pubDate>
    </item>
    <item>
      <title>Bias 통제 방법</title>
      <link>https://aims-lab.tistory.com/142</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;Q. Bias를 통제하는 방법은 무엇입니까?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bias&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bias는 모델을 통해 얻은 예측값과 실제 정답값의 차이의 평균을 뜻한다.&lt;/li&gt;
&lt;li&gt;Bias가 높다는 것은 예측값과 정답값 사이의 차이가 크다는 것을 의미한다.&lt;/li&gt;
&lt;li&gt;Bias 문제는 기본적으로 모델이 매우 간단할 때, 즉, underfitting이 발생한 경우에 일어난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Variance&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적으로 Variance는 다양한 데이터셋에 대해 예측값이 얼마나 변화할 수 있는지를 뜻한다.&lt;/li&gt;
&lt;li&gt;즉, 모델이 얼만큼의 Flexibility를 가지는 지에 대한 의미로 사용된다.&lt;/li&gt;
&lt;li&gt;Variance 문제는 데이터 분포에 비해 모델의 복잡도가 커서 overfitting이 발생한 경우에 일어난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bias 통제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bias를 통제하는 방법으로는 아래의 방법을 사용할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Feature 개수를 증가시킨다.&lt;/li&gt;
&lt;li&gt;Polynomial feature 를 추가하여 복잡한 모델을 사용한다.&lt;/li&gt;
&lt;li&gt;Regularization parameter \(\lambda\)의 크기를 줄인다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Regularization은 weight가 너무 큰 값을 가지지 않도록 하여 모델의 복잡도를 낮추는 방법이다.&lt;/li&gt;
&lt;li&gt;\(\lambda\) 가 매우 큰 값을 가지게 되면, 수평선 그래프가 그려지게 된다.&lt;/li&gt;
&lt;li&gt;반대로, \(\lambda\) 가 0이 되면, Overfitting 문제가 일어난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Nueral Network 에서는 layer 개수가 parameter 개수에 비례하므로, layer 개수가 작으면 layer를 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만, 모델이 복잡해질 수록 Bias는 작아지고 Variance는 반대로 커지기 때문에, 둘을 같이 줄일 수는 없다.&lt;/li&gt;
&lt;li&gt;오류를 최소화하기 위해 Bias와 Variance의 합이 최소가 되는 적절한 값을 찾아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gaussian37.github.io/machine-learning-concept-bias_and_variance/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gaussian37.github.io/machine-learning-concept-bias_and_variance/&lt;/a&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>Bias</category>
      <author>hyenzzang</author>
      <guid isPermaLink="true">https://aims-lab.tistory.com/142</guid>
      <comments>https://aims-lab.tistory.com/142#entry142comment</comments>
      <pubDate>Thu, 25 May 2023 17:02:39 +0900</pubDate>
    </item>
  </channel>
</rss>