<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>leejeong6 님의 블로그</title>
    <link>https://leejeong6.tistory.com/</link>
    <description>leejeong6 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 22 May 2026 13:11:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>leejeong6</managingEditor>
    <item>
      <title>AI models collapse when trained onrecursively generated data 논문리뷰</title>
      <link>https://leejeong6.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2024.7.24일 Nature에 실린 논문입니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.nature.com/articles/s41586-024-07566-y&quot;&gt;AI models collapse when trained on recursively generated data | Nature&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT2, GPT3, GPT4 등 다양한 LLM모델이 출시되고, 이러한 LLM모델이 생성하는 데이터가 온라인에서 퍼지고, 이 데이터로 다시 학습하게 되는 반복을 통해 원래 데이터의 꼬리가 없어지는 현상을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 이를 &quot;model collapse&quot;라고 하며 LLM뿐만 아니라 VAE, GMM 같은 모델에서도 발생할 수 있다고 말합니다&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;model collapse는 한 세대의 모델이 생성한 데이터가 다음 세대 모델의 데이터셋을 오염시키고, 이 오염된 데이터로 학습된 모델은 mis-perceive reality(현실을 잘못인식)합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model collapse에는 early model collapse와 late model collapse가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;early는 모델이 데이터 분포의 꼬리를 잃기 시작하는 것이며 late는 원래 분포와는 거의 닮지 않은 수렴된 분포를 따르게 되며 이 경우, 분산이 크게 줄지 않는다고 합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/du4wNf/btsN2n0wwuf/CieltkKH5c799uWInGLVz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/du4wNf/btsN2n0wwuf/CieltkKH5c799uWInGLVz0/img.png&quot; data-alt=&quot;model collapse&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/du4wNf/btsN2n0wwuf/CieltkKH5c799uWInGLVz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdu4wNf%2FbtsN2n0wwuf%2FCieltkKH5c799uWInGLVz0%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;679&quot; height=&quot;168&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;model collapse&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 붕괴 과정은 아래 세 가지 요소가 누적되기 때문이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Statistical approximation error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Functional expressovity error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Functional approximation error&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;Statistical approximation error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-샘플수가 유한하기 때문에 발생하는 오류입니다. 만약 샘플이 무한하다면 오류가 없습니다.매 단계에서 리샘플링을 해서 정보가 손실될 확률이 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;Functional expressovity error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-모델이 가지는 함수 능력의 한계입니다.신경망은 이론적으로 universal approximator(이게 머임)이지만, 그 성질은 데이터가 무한할 때 발휘한다고 합니다. 그 결과, 원래 분포에 0을 할당하거나 분포밖에 0이 아닌 값을 할당하는 문제가 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 예시로 두 개의 가우시안 분포를 하나의 가우시안 분포로 근사하려 한다면, 데이터를 완벽히 가지고 있더라도 모델의 표현한계 때문에 오류가 불가피합니다. 이 오류는 다른 두 오류가 없다면 오직 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;Functional approximation error&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-learning procedure의 한계 때문에 발생하는 오류입니다. gradient descent, objective 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;표현력이 강한 모델은 양날의 검입니다. 통계적 노이즈를 줄여서 실제 분포에 근사하는 좋은 결과를 낼 수도 있고, 노이즈를 증폭할 수도 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;more often than not(자주), 연쇄효과가 발생하는데, 개개의 부정확함들이 모여 오류를 키우는 것입니다. 예를들어 오버피팅된 density 모델은 부정확하게 추론하게 하고, 그 결과 훈련 데이터에서 거의 나타나지 않은 영역에 높은 확률이 부여되어, 이후 샘플링에서 많이 뽑히게 됩니다.&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;이러한 오류들이 어떻게 실제로 model collapse를 유도하는지 수학적으로 설명합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세대i에서의 데이터셋은 Di로 표시되며 이는 i.i.d. 랜덤 변수 X의 집합입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변수들은 분포 pi를 따르며 세대 i에서 i+1로 넘어갈 때, Di의 샘플분포를 근사적으로 추정합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 근사 분포를 p세타 i+1로 나타내며 이 과정을 함수 근사라고 부릅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세대 i+1의 데이터셋 Di+1은 p = &amp;alpha; p + &amp;beta;p + &amp;gamma;p를 통해 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알파는 새로운 모델, 베타는 이전 세대, 감마는 원래 분포로부터 온 데이터의 비율인데 이론 모델에서는 간단화를 위해 베타, 감마를 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;함수 근사 오류 및 표현력 오류가 전혀 없는 경우, model collapse는 오직 샘플링 단계에서 발생하는 통계적 오류로 인해 발생합니다. 처음에는 분포의 꼬리-즉, 확률이 낮은 사건들이 사라지기 시작합니다.(샘플링될 확률이 낮으므로) 그리고 시간이 지남에 따라 분포가 축소됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플 크기를 M이라 하고, 어떤 상태 i가 발생할 확률을 q&amp;lt;=1/M이라고 가정하면 해당 상태 i의 샘플링 기댓값이 1보다 작게 되기 때문에 시간이 충분히 지나면 모델이 하나의 상태에 집중된 delta function으로 수렴하게 됨을 의미합니다.&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;&lt;span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;F&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;1 과정은 마르코프 연쇄과정입니다. Xi+1은 오직 Xi에만 의존합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;마르코프 체인에 의해 이전 세대 모델이 만든 데이터를 기반으로 학습되고 이를 반복하면 특정 상태에 갇히는 상황이 생길 수 있고, 이를 흡수상태라고 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흡수상태에 도달하면 영원히 거기 머물게 되는데, 모델이 &quot;A만 생성하겠다&quot;라고 하면 그다음 세대도 A만 보고 A만 배우고, 점점 A만 생성하게 되어 절대 벗어나지 않게 됩니다.&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;어떤 초기 데이터 D0에서 출발해서, 매 세대마다 이전 세대 데이터의 평균,분산을 추정해 새 모델을 만든다면 세대가 거듭될수록 분산은 0이 되고 Wasserstein-2 거리는 무한대가 됩니다. 그리고 이 모든 건 1의 확률로 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 매번 평균과 분산으로 모델을 만들게 되므로, 시간이 지날수록 분산이 줄어들고 결국에는 확신이 지나치게 강해져서 분산이 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;지금까지 정리하자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세가지 주요 오차 이론과 수학적 모델링 방법을 제시하며 model collapse를 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오차 이론에는 statistical approximation error, functional expressivity error, functional approximation error가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플수가 유한하기 때문에 낮은 확률 데이터는 샘플링에서 누락될 수 있고, 신경망이 완벽히 표현하지 못하며, 경사하강법과 같은 학습 방법에서 오차가 발생한다는 이론이었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적 모델링 방법에는 각 세대 i에서의 데이터셋을 Di라 하고, 이 데이터셋은 분포 pi를 따른다고 할 때 모델의 학습과정을 마르코프 체인으로 간주할 수 있고, 이 체인은 결국 델타함수 상태로 수렴하게 됩니다. 델타 함수는 이 체인의 흡수상태이며, 한번 들어가면 빠져나오지 못합니다. 이것은 이미 증명이 되어있는 것이라고 하며 가우시안 분포로 D0에서 wasserstein거리가 커지고 분산이 줄어드는 것도 설명합니다.&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;다음은 Fine-tuning을 통해 저자가 실험을 한 내용입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fine-tuning모델은 Meta의 opt-125m이고 데이터셋은 wikitext2 dataset입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;five-way beam search를 사용했고 64토큰을 잘라서 넣으면 64 토큰을 예측하게끔 하는 모델로 huggingface를 이용했다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;perplexity는 기존에 115였는데 34까지 줄어들어 성공적으로 fine-tuning했다고 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 이제 두 가지 방법으로 실험합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번짼는 5 에폭, original train data 없이 진행합니다. 즉 이전 세대 모델의 출력으로 다음 세대가 받고 다시 출력하고,,,를 반복하는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째는 10 에폭, original train data를 10% 보존합니다. 나머지는 위의 방식과 동일합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tnbq1/btsN28oR0bK/dyh0XsLEDVjKAXNvhpQ2s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tnbq1/btsN28oR0bK/dyh0XsLEDVjKAXNvhpQ2s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tnbq1/btsN28oR0bK/dyh0XsLEDVjKAXNvhpQ2s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftnbq1%2FbtsN28oR0bK%2Fdyh0XsLEDVjKAXNvhpQ2s0%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;755&quot; height=&quot;551&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 그래프를 보면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위가 5에폭, 아래가 10 에폭입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 generation9까지 세대를 늘렸고 perplexity를 평가했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세대를 거듭할수록 꼬리가 길어진 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 기존 모델에서 만들어질 수 없는 분포의 값을 가지게 되며 기존에 많이 보이던 곳에서 빠져나오는 것을 볼 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 generation0과 generation9만 있었다면 두 분포가 겹치는 곳은 정말 작을 것입니다.&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;모델이 스스로 기존에 없던 , 즉 제로샷 성능이 저 분포에서 나와서 제대로 나올 수도 있기 때문입니다&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;자 그러면 정량평가 예시를 보겠습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3ZvTF/btsN3g1wwcL/L2ldHk2EqA0sxb5TIHLlZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3ZvTF/btsN3g1wwcL/L2ldHk2EqA0sxb5TIHLlZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3ZvTF/btsN3g1wwcL/L2ldHk2EqA0sxb5TIHLlZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3ZvTF%2FbtsN3g1wwcL%2FL2ldHk2EqA0sxb5TIHLlZ0%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;539&quot; height=&quot;592&quot; data-origin-width=&quot;539&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input으로는 1360년대의 건축에 대해서 말합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0세대(기존모델)는 깔끔하고 정확하게 얘기한다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 세대를 거듭하면 할수록 점점 이상해집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5세대까지 됐을 때는 input의 본질을 잃었고 9세대에서는 그냥 취해있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 기존에 학습시킨 객관적이고 정확한 데이터뿐만 아니라 AI가 생성한 2차, 3차,,, N차 데이터까지 같이 AI가 다시 학습할 경우 본질을 잃어버리는 문제가 발생한다는 게 하고 싶은 말입니다. 논문에서 설명하기 위해 극단적으로 베타, 감마를 0으로 했지만 이는 마르코프체인이 뒷받침해 줍니다. 그리고 만약 그 가중치들이 다 섞여있다고 하더라도 무한하게 세대가 거듭한다면 이 결과가 바뀌지는 않을 것입니다. 이렇게 생성한 데이터가 다시 웹에 떠돌고 사람들이 본다면 LLM의 표현력은 다양하고 많아질지라도 이게 환각을 불러오고 사회적으로 문제가 될 가능성이 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VAE, GMM도 증명하던데 그건 여기에 있습니다.&amp;nbsp;&amp;nbsp; &lt;a href=&quot;https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-024-07566-y/MediaObjects/41586_2024_7566_MOESM1_ESM.pdf&quot;&gt;AI models collapse when trained on recursively generated data&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문리뷰</category>
      <category>ai</category>
      <category>LLM</category>
      <category>model collapse</category>
      <category>nature</category>
      <category>safety</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/12</guid>
      <comments>https://leejeong6.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 19 May 2025 15:17:28 +0900</pubDate>
    </item>
    <item>
      <title>허깅페이스 LLM fine-tuning하기 (1)</title>
      <link>https://leejeong6.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;hugging face 로그인 후 원하는 LLM 찾아서 불러오는 과정은 생략&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;저는 SKT에서 만든 KoGPT2를 가져다가 safety에 대한 데이터로 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;a href=&quot;https://huggingface.co/skt/kogpt2-base-v2&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/skt/kogpt2-base-v2에서&lt;/a&gt; 코드를 불러옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746766291624&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Load model directly
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained(&quot;skt/kogpt2-base-v2&quot;)
model = AutoModelForCausalLM.from_pretrained(&quot;skt/kogpt2-base-v2&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 이제 kogpt2 tokenizer와 model을 쓸 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이 코드를 실행 전에 &lt;i&gt;pip install transformers, datasets는&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;AutoTokenizer, AutoModelForCausalLM과 같이 앞에 Auto가 붙은 라이브러리는 자동으로 불러온 모델에 맞는 구성으로 로드해 주는 역할입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 GPT2 LMHeadModel이라는 클래스도 있는데, 이는 AutoModelForCausalLM과 달리 GPT2모델에 딱 맞는 정해진 클래스로 kogpt의 경우 GPT2를 기반으로 만들어졌기 때문에 이 클래스도 사용가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746769386800&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenizer)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tokenizer는 어떻게 구성되어 있나 확인해 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 토크나이저는 사람이 학습한 게 아니라 kogpt에 맞게 불러와진 tokenizer입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래와 같이 나왔습니다&lt;/p&gt;
&lt;pre id=&quot;code_1746769505286&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GPT2TokenizerFast(name_or_path='skt/kogpt2-base-v2', vocab_size=51200, model_max_length=1000000000000000019884624838656, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '&amp;lt;|endoftext|&amp;gt;', 'eos_token': '&amp;lt;|endoftext|&amp;gt;', 'unk_token': '&amp;lt;|endoftext|&amp;gt;'}, clean_up_tokenization_spaces=False, added_tokens_decoder={
	0: AddedToken(&quot;&amp;lt;s&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	1: AddedToken(&quot;&amp;lt;/s&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	2: AddedToken(&quot;&amp;lt;usr&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	3: AddedToken(&quot;&amp;lt;pad&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	4: AddedToken(&quot;&amp;lt;sys&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
	5: AddedToken(&quot;&amp;lt;unk&amp;gt;&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name_or_path:모델 경로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vocab_size:토크나이저가 인식할 수 있는 전체 토큰 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model_max_length:허용가능한 토큰 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;padding_side='right' : 시퀀스가 짧으면 오른쪽에 padding을 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;truncation_side='right' : 시퀀스가 길면 오른쪽을 자름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;specail_tokens : bos, eos, unk모두 &amp;lt;|endoftext|&amp;gt;를 사용&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -GPT는 기본적으로 &lt;b&gt;|&lt;i&gt;endoftext&lt;/i&gt;| (end-of-sequence, EOS)&lt;/b&gt;만을 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -GPT decoder 기반인 BERT는 아래와 같은 여러 토큰을 추가해서 더 좋은 성능을 나타낼 수 있다고 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;PAD&amp;gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;시퀀스의 길이를 맞추기 위한 패딩 토큰. 시퀀스들의 길이를 동일하게 맞춰주기 위해 추가되는 토큰이다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;UNK&amp;gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;모르는 단어를 나타내는 토큰. 어휘에 없는 단어나 희귀한 단어 등을 대체하는 용도로 사용된다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;SOS&amp;gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;문장의 시작을 나타내는 토큰. 번역이나 생성 모델에서 사용되어 문장 생성의 시작을 표시한다.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;EOS&amp;gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;문장의 끝을 나타내는 토큰. 번역이나 생성 모델에서 사용되어 문장 생성의 종료를 표시한다&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;clean_up_tokenization_spaces:토크나이징 후 불필요한 공백을 자동제거&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;added_tokens_decoder={&amp;nbsp; }: 사용자가 추가로 정의한 토큰 ex) 이모티콘&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 Demilight', 'Noto Sans KR';&quot;&gt;다음은 padding token입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아무것도 모르고 할 때 여기서 오류가 가장 많이 발생했는데 GPT2계열의 모델은 원래 pad_token이 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 이유는 이전 문장을 기반으로 다음 문장을 예측하기 때문입니다. 근데 batch를 처리할 때 입력 길이가 서로 다르면, 짧은 문장은 반드시 padding으로 맞춰야 하며 CrossEntropyLoss에서 ignore_index를 처리하려면 pad_token_idx가 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 generation시 padding은 무시해야 하니까 아래와 같은 코드를 넣습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1746771258599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenizer.pad_token = tokenizer.eos_token
model.config.pad_token_id = tokenizer.eos_token_id&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래와 같이 pad_token을 직접 설정할 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1746771322478&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenizer = PreTrainedTokenizerFast.from_pretrained(&quot;skt/kogpt2-base-v2&quot;,
  bos_token='&amp;lt;/s&amp;gt;', eos_token='&amp;lt;/s&amp;gt;', unk_token='&amp;lt;unk&amp;gt;',
  pad_token='&amp;lt;pad&amp;gt;', mask_token='&amp;lt;mask&amp;gt;')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 text를 생성해서 아래와 같이 비교 실험해 봤습니다&lt;/p&gt;
&lt;pre id=&quot;code_1746772017030&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;&quot;&quot;1번&quot;&quot;&quot;

tokenizer = AutoTokenizer.from_pretrained(&quot;skt/kogpt2-base-v2&quot;)
model = AutoModelForCausalLM.from_pretrained(&quot;skt/kogpt2-base-v2&quot;)
tokenizer.pad_token = tokenizer.eos_token
model.config.pad_token_id = tokenizer.eos_token_id
text = '근육이 커지기 위해서는'
input_ids = tokenizer.encode(text, return_tensors='pt')
gen_ids = model.generate(input_ids,
                           max_length=128,
                           repetition_penalty=2.0,
                           pad_token_id=tokenizer.pad_token_id,
                           eos_token_id=tokenizer.eos_token_id,
                           bos_token_id=tokenizer.bos_token_id,
                           use_cache=True)
generated = tokenizer.decode(gen_ids[0])
print(generated)


&quot;&quot;&quot;2번&quot;&quot;&quot;

tokenizer = PreTrainedTokenizerFast.from_pretrained(&quot;skt/kogpt2-base-v2&quot;,
  bos_token='&amp;lt;/s&amp;gt;', eos_token='&amp;lt;/s&amp;gt;', unk_token='&amp;lt;unk&amp;gt;',
  pad_token='&amp;lt;pad&amp;gt;', mask_token='&amp;lt;mask&amp;gt;')
model = GPT2LMHeadModel.from_pretrained('skt/kogpt2-base-v2')
text = '근육이 커지기 위해서는'
input_ids = tokenizer.encode(text, return_tensors='pt')
gen_ids = model.generate(input_ids,
                           max_length=128,
                           repetition_penalty=2.0,
                           pad_token_id=tokenizer.pad_token_id,
                           eos_token_id=tokenizer.eos_token_id,
                           bos_token_id=tokenizer.bos_token_id,
                           use_cache=True)
generated = tokenizer.decode(gen_ids[0])
print(generated)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 당연히 &lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;근육이 커지기 위해서는 무엇보다 규칙적인 생활습관이 중요하다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;특히, 아침식사는 단백질과 비타민이 풍부한 과일과 채소를 많이 섭취하는 것이 좋다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;또한 하루 30분 이상 충분한 수면을 취하는 것도 도움이 된다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;아침 식사를 거르지 않고 규칙적으로 운동을 하면 혈액순환에 도움을 줄 뿐만 아니라 신진대사를 촉진해 체내 노폐물을 배출하고 혈압을 낮춰준다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;운동은 하루에 10분 정도만 하는 게 좋으며 운동 후에는 반드시 스트레칭을 통해 근육량을 늘리고 유연성을 높여야 한다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;운동 후 바로 잠자리에 드는 것은 피해야 하며 특히 아침에 일어나면 몸이 피곤해지기 때문에 무리하게 움직이면 오히려 역효과가 날 수도 있다. &lt;/span&gt;&lt;span style=&quot;color: #cccccc; text-align: start;&quot;&gt;운동을&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 똑같이 나왔습니다. 그저 tokenizer를 어떻게 하냐 차이니까 하나의 text만 이렇게 비교하면 당연한 결과입니다.&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;</description>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/11</guid>
      <comments>https://leejeong6.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 9 May 2025 15:28:56 +0900</pubDate>
    </item>
    <item>
      <title>Karpathy - Let's build GPT 실습하기 (2)</title>
      <link>https://leejeong6.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Class로 만들어서 loss까지 구현합니다&lt;/p&gt;
&lt;pre id=&quot;code_1745556514221&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn
from torch.nn import functional as F
torch.manual_seed(1337)

class BigramLanguageModel(nn.Module):
    def __init__(self,vocab_size):
        super().__init__()
        self.token_embedding_table = nn.Embedding(vocab_size,vocab_size)

    def forward(self,idx,targets=None):
        logits = self.token_embedding_table(idx) # B,T,C = 32,8,65
        if targets is None:
            loss = None 
        else:    
            B,T,C = logits.shape
            
            logits = logits.view(B*T,C)
            
            
            targets = targets.view(B*T)
            
            loss = F.cross_entropy(logits,targets)
            
        return logits,loss

    def generate(self,idx,max_new_tokens):
        for _ in range(max_new_tokens):
            logits,loss = self(idx)
            logits = logits[:,-1,:]
            probs = F.softmax(logits,dim=-1)
            idx_next = torch.multinomial(probs,num_samples=1)
            idx = torch.cat((idx,idx_next),dim=1)
        return idx
    

m = BigramLanguageModel(vocab_size)
logits,loss = m(xb,yb)

print(loss.shape)

print(decode(m.generate(idx = torch.zeros((1, 1), dtype=torch.long), max_new_tokens=100)[0].tolist()))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nn.Embedding은 (x,y)크기의 테이블을 만들어둬서 input이 들어오면 테이블에 맞는 임베딩값을 뽑아주는 함수라고 생각하면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding(65,65)로 만들었다는건 임베딩 65*65행렬로 만들어져있다는거고, idx만큼 뽑아서 logits에 할당하면 logits은 원래 가지고 있던 행렬에 한 차원 더 생겨서 임베딩 값이 생기게 됩니다. &lt;b&gt;32*8 -&amp;gt; 32*8*65&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 cross_Entropy입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1745557111535&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CrossEntropyLoss &amp;mdash; PyTorch 2.7 documentation&quot; data-og-description=&quot;Shortcuts&quot; data-og-host=&quot;pytorch.org&quot; data-og-source-url=&quot;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&quot; data-og-url=&quot;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html#torch.nn.CrossEntropyLoss&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CrossEntropyLoss &amp;mdash; PyTorch 2.7 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Shortcuts&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pytorch.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bxlxq/btsNyB0oFT8/txdlM2f4MfenvHpaxsI84K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bxlxq/btsNyB0oFT8/txdlM2f4MfenvHpaxsI84K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bxlxq/btsNyB0oFT8/txdlM2f4MfenvHpaxsI84K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBxlxq%2FbtsNyB0oFT8%2FtxdlM2f4MfenvHpaxsI84K%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;866&quot; height=&quot;347&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;347&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;읽어보면 C에 대해 Cross Entropy를 아래 식처럼 계산한다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;minibatch,C 형태로 입력되어야 한다 하므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;32*8*65가 아니라 256*65로 만들어서 입력합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;target도 마찬가지로 이와 같은 과정을 하면 loss는 스칼라 값으로 나오게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 함수의 return인 logits는 256*65 loss는 스칼라가 되겠네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 generate함수입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 forward식을 통해 나온 logits,loss를 이용하는데 logits를 [:,-1,:]으로 splicing합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 logits는 현재 B*T,C인데 Text의 마지막 글자만 뽑아서 B,C형태로 만든다는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 뒤에 Softmax를 취하는데, softmax에 dim이-1인것은 마지막 차원을 따라 softmax하겠다는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 C를 따라 softmax하니까 B,C가 모두 확률로 나와있겠고 그 중에서 multinomial함수를 통해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 확률이 큰 num_samples 수만큼 뽑아줍니다. 그러면 idx_next도 B,1만큼 나올 것이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;torch.cat으로 idx와 합쳐주면 B,T+1차원으로 idx가 업데이트 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 max_new_tokens수만큼 반복되므로 결국 최종 idx는 B,T+100이 decode에 들어가게 되고 32개의 문장이 100개의 길이를 가진 채로 나오게 되겠네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1745558726924&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# create a PyTorch optimizer
optimizer = torch.optim.AdamW(m.parameters(), lr=1e-3)

batch_size = 32
for steps in range(100): # increase number of steps for good results...

    # sample a batch of data
    xb, yb = get_batch('train')

    # evaluate the loss
    logits, loss = m(xb, yb)
    optimizer.zero_grad(set_to_none=True)
    loss.backward()
    optimizer.step()

print(loss.item())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 optimizer까지 정의해서 코드를 얼추 완성할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 제가 헷갈렸던 부분은 forward와 generate함수에서의 차원 계산인데요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디폴트로 targets가 None이기 때문에 generate함수를 실행했을 때는 if문만 실행돼서 logits는 항상 B,T,C차원이고 loss는 None이라는 점을 잊으면 안됩니다.&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;pre id=&quot;code_1745558902707&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;oTo.JUZ!!zqe!
xBP qbs$Gy'AcOmrLwwt
p$x;Seh-onQbfM?OjKbn'NwUAW -Np3fkz$FVwAUEa-wzWC -wQo-R!v -Mj?,SPiTyZ;o-opr$mOiPJEYD-CfigkzD3p3?zvS;ADz;.y?o,ivCuC'zqHxcVT cHA
rT'Fd,SBMZyOslg!NXeF$sBe,juUzLq?w-wzP-h
ERjjxlgJzPbHxf$ q,q,KCDCU fqBOQT
SV&amp;amp;CW:xSVwZv'DG'NSPypDhKStKzC -$hslxIVzoivnp ,ethA:NCCGoi
tN!ljjP3fwJMwNelgUzzPGJlgihJ!d?q.d
pSPYgCuCJrIFtb
jQXg
pA.P LP,SPJi
DBcuBM:CixjJ$Jzkq,OLf3KLQLMGph$O 3DfiPHnXKuHMlyjxEiyZib3FaHV-oJa!zoc'XSP :CKGUhd?lgCOF$;;DTHZMlvvcmZAm;:iv'MMgO&amp;amp;Ywbc;BLCUd&amp;amp;vZINLIzkuTGZa
D.?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 개판입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 아직 아무것도 학습이 되지 않았기 때문이죠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리해보자면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞장에서는 인코딩 된 문장이 다음으로 나올 단어를 예측하는 것을 간단하게 실습해봤습니다&lt;/p&gt;
&lt;pre id=&quot;code_1745559968994&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[11] -&amp;gt; 311
[11, 311] -&amp;gt; 10477
[11, 311, 10477] -&amp;gt; 1077
[11, 311, 10477, 1077] -&amp;gt; 3663
[11, 311, 10477, 1077, 3663] -&amp;gt; 26
[11, 311, 10477, 1077, 3663, 26] -&amp;gt; 369
[11, 311, 10477, 1077, 3663, 26, 369] -&amp;gt; 1077
[11, 311, 10477, 1077, 3663, 26, 369, 1077] -&amp;gt; 8571&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 말이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 배치 단위로, 그리고 정답값에 가까워지게, 그리고 임베딩으로 표현하자는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 embedding table을 통해서 각 단어가 65크기의 임베딩 값을 가지게 합니다. 그런 뒤에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;generate함수를 통해 위와 같이 max_new_tokens수만큼의 문장을 뽑게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx가 어떻게 변하는지를 보면 아래와 같이 계속 생성되며 max_new_tokens까지 가게됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1745560085830&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[[0, 31]]
[[0, 31, 23]]
[[0, 31, 23, 21]]
[[0, 31, 23, 21, 41]]
[[0, 31, 23, 21, 41, 24]]
[[0, 31, 23, 21, 41, 24, 32]]
[[0, 31, 23, 21, 41, 24, 32, 11]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15, 12]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15, 12, 52]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15, 12, 52, 55]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15, 12, 52, 55, 7]]
[[0, 31, 23, 21, 41, 24, 32, 11, 13, 41, 17, 24, 25, 53, 32, 40, 60, 38, 60, 1, 15, 12, 52, 55, 7, 29]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Karpathy-GPT만들기</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/10</guid>
      <comments>https://leejeong6.tistory.com/10#entry10comment</comments>
      <pubDate>Fri, 25 Apr 2025 15:19:36 +0900</pubDate>
    </item>
    <item>
      <title>Karpathy - Let's build GPT 실습하기 (1)</title>
      <link>https://leejeong6.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kCc8FmEb1nY&amp;amp;t=5065s&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=kCc8FmEb1nY&amp;amp;t=5065s&amp;nbsp;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=kCc8FmEb1nY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bz4jaj/hyYIg3JJXD/zvf6vYnlbHfsgXwkK01sNk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=1008_150_1172_330,https://scrap.kakaocdn.net/dn/V5i66/hyYL3PRZEO/vIuk9RtKM5C3tOK4Cyl0jK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=1008_150_1172_330&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Let&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/kCc8FmEb1nY&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Karpathy-BUILD GPT&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글은 이 영상을 따라하는 글이며, 제 생각과 추가 실습 가능한 부분을 같이 써보는 식으로 진행해보려합니다&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 tokenizer를 만드는 걸 소개하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셰익스피어 글을 다운받아서 커스텀 tokenizer를 만듭니다&lt;/p&gt;
&lt;pre id=&quot;code_1745468638692&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chars = sorted(list(set(text)))
vocab_size = len(chars)
string_to_idx = {ch:i for i,ch in enumerate(chars)}
idx_to_string = {i:ch for i,ch in enumerate(chars)}

sti = string_to_idx
its = idx_to_string

encode = lambda s:[sti[c] for c in s]
decode = lambda l: [its[i] for i in l]

print(encode(&quot;hii there&quot;)) # text -&amp;gt; integer
print(decode(encode(&quot;hii there&quot;))) # integer -&amp;gt; text 
print(&quot;&quot;.join(decode(encode(&quot;hii there&quot;))))

____결과____
[46, 47, 47, 1, 58, 46, 43, 56, 43]
['h', 'i', 'i', ' ', 't', 'h', 'e', 'r', 'e']
hii there&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 단어마다 하나씩 integer가 부여되니까 &quot;hii there&quot;이라는 9글자 단어가 9개의 integer로 표현된 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시중에 있는 BERT와 OPENAI의 tiktoken과 비교해보면&lt;/p&gt;
&lt;pre id=&quot;code_1745468848110&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)
encoded = tokenizer.encode(&quot;hii there&quot;)
decoded = tokenizer.decode(encoded)

print(encoded)  
print(decoded)

____결과___
[101, 7632, 2072, 2045, 102]
[CLS] hii there [SEP]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1745468865519&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import tiktoken

model = &quot;gpt-3.5-turbo&quot;
text = &quot;hii there&quot;
encoding = tiktoken.encoding_for_model(model)
tokens = encoding.encode(text)
print(f&quot;Tokens: {tokens}&quot;)
num_tokens = len(tokens)
print(f&quot;Number of tokens: {num_tokens}&quot;)
decoded_text = encoding.decode(tokens)
print(f&quot;Decoded text: {decoded_text}&quot;)

___결과___
Tokens: [71, 3893, 1070]
Number of tokens: 3
Decoded text: hii there&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT는 cls와 sep을 제외하면 3개,tiktoken도 3개로 커스텀 tokenizer보다 훨씬 시퀀스 길이가 짧은 것을 알 수 있습니다.&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;이제 이 3가지 방법으로 처음에 불러온 글을 전부 바꿔보겠습니다&lt;/p&gt;
&lt;pre id=&quot;code_1745469691802&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
&quot;&quot;&quot;Custom Tokenizer&quot;&quot;&quot;
data = torch.tensor(encode(text),dtype = torch.long)
print(&quot;&quot;&quot;Custom Tokenizer&quot;&quot;&quot;)
print(data.shape,data.dtype)


&quot;&quot;&quot;BERT&quot;&quot;&quot;
tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)
bert_encoded = tokenizer.encode(text)
bert_data = torch.tensor(bert_encoded,dtype = torch.long)
print(&quot;&quot;&quot;BERT&quot;&quot;&quot;)
print(data.shape,data.dtype)


&quot;&quot;&quot;TIKTOKEN&quot;&quot;&quot;
model = &quot;gpt-3.5-turbo&quot;
encoding = tiktoken.encoding_for_model(model)
tiktokens_encoded = encoding.encode(text)
tiktoken_data = torch.tensor(tiktokens_encoded,dtype = torch.long)
print(&quot;&quot;&quot;TIKTOKEN&quot;&quot;&quot;)
print(data.shape,data.dtype)

___결과___
Custom Tokenizer
torch.Size([1115394]) torch.int64
Token indices sequence length is longer than the specified maximum sequence length for this model (288721 &amp;gt; 512). Running this sequence through the model will result in indexing errors
BERT
torch.Size([288721]) torch.int64
TIKTOKEN
torch.Size([301829]) torch.int64&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 Custom Tokenizer는 크기가 1115394입니다.&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;BERT는 경고가 출력되고,288721크기로 출력된 것을 확인할 수 있는데, 이는 BERT가 512개의 input제한이 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT는 원래 짧은 문장을 위한 모델이므로 앞으로는 TIKTOKEN과 custom만 비교하도록 하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 TIKTOKEN을 보면 가장 사이즈가 작은 것을 볼 수 있습니다.&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;다음은 데이터를 split하고 chunking하는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chunking은 긴 시퀀스를 잘게 나누는 것인데 먼저 데이터를 9:1로 train,validation으로 나누겠습니다&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;n = int(0.9*len(text))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;train_data = data[:n]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;val_data = data[n:]&lt;/p&gt;
&lt;pre id=&quot;code_1745477471179&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(0.9*len(text))
train_data = data[:n]
val_data = data[n:]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AutoRegressive한 작동의 코드를 작성해보겠습니다&lt;/p&gt;
&lt;pre id=&quot;code_1745478521172&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;torch.manual_seed(1337)
batch_size=4
block_size=8

def get_batch(split):
    data = train_data if split==&quot;train&quot; else val_data
    xi = torch.randint(0,len(data)-block_size,(batch_size,))
    xb = torch.stack([data[x:x+block_size] for x in xi])
    yb = torch.stack([data[x+1:x+block_size+1] for x in xi])
    return xb,yb


xb,yb = get_batch(&quot;train&quot;)
for b in range(batch_size):
    for t in range(block_size):
        context = xb[b,:t+1]
        target = yb[b,t]
        print(context.tolist(),&quot;-&amp;gt;&quot;,target.tolist())

_____________________________________________________________________

[24] -&amp;gt; 43
[24, 43] -&amp;gt; 58
[24, 43, 58] -&amp;gt; 5
[24, 43, 58, 5] -&amp;gt; 57
[24, 43, 58, 5, 57] -&amp;gt; 1
[24, 43, 58, 5, 57, 1] -&amp;gt; 46
[24, 43, 58, 5, 57, 1, 46] -&amp;gt; 43
[24, 43, 58, 5, 57, 1, 46, 43] -&amp;gt; 39
[44] -&amp;gt; 53
[44, 53] -&amp;gt; 56
[44, 53, 56] -&amp;gt; 1
[44, 53, 56, 1] -&amp;gt; 58
[44, 53, 56, 1, 58] -&amp;gt; 46
[44, 53, 56, 1, 58, 46] -&amp;gt; 39
[44, 53, 56, 1, 58, 46, 39] -&amp;gt; 58
[44, 53, 56, 1, 58, 46, 39, 58] -&amp;gt; 1
[52] -&amp;gt; 58
[52, 58] -&amp;gt; 1
[52, 58, 1] -&amp;gt; 58
[52, 58, 1, 58] -&amp;gt; 46
[52, 58, 1, 58, 46] -&amp;gt; 39
[52, 58, 1, 58, 46, 39] -&amp;gt; 58
[52, 58, 1, 58, 46, 39, 58] -&amp;gt; 1
[52, 58, 1, 58, 46, 39, 58, 1] -&amp;gt; 46
[25] -&amp;gt; 17
[25, 17] -&amp;gt; 27
[25, 17, 27] -&amp;gt; 10
[25, 17, 27, 10] -&amp;gt; 0
[25, 17, 27, 10, 0] -&amp;gt; 21
[25, 17, 27, 10, 0, 21] -&amp;gt; 1
[25, 17, 27, 10, 0, 21, 1] -&amp;gt; 54
[25, 17, 27, 10, 0, 21, 1, 54] -&amp;gt; 39&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 배치 단위로 input,target에 대한 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 chunking을 8개로 하고, batch는 4로 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 시퀀스가 [1,2,3,4,5,6,7,8]이라면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x가 [1]이면 예측값은 [2] 여야하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x가 [1,2]이면 예측값은[3]이어야합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 흐름을 Autoregressive 하다고 하는 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 tiktokenizer로 똑같은 코드를 실행해본 결과&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 출력되었습니다&lt;/p&gt;
&lt;pre id=&quot;code_1745478915052&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[74665] -&amp;gt; 374
[74665, 374] -&amp;gt; 45314
[74665, 374, 45314] -&amp;gt; 198
[74665, 374, 45314, 198] -&amp;gt; 791
[74665, 374, 45314, 198, 791] -&amp;gt; 2132
[74665, 374, 45314, 198, 791, 2132] -&amp;gt; 323
[74665, 374, 45314, 198, 791, 2132, 323] -&amp;gt; 279
[74665, 374, 45314, 198, 791, 2132, 323, 279] -&amp;gt; 4948
[11] -&amp;gt; 311
[11, 311] -&amp;gt; 10477
[11, 311, 10477] -&amp;gt; 1077
[11, 311, 10477, 1077] -&amp;gt; 3663
[11, 311, 10477, 1077, 3663] -&amp;gt; 26
[11, 311, 10477, 1077, 3663, 26] -&amp;gt; 369
[11, 311, 10477, 1077, 3663, 26, 369] -&amp;gt; 1077
[11, 311, 10477, 1077, 3663, 26, 369, 1077] -&amp;gt; 8571
[1884] -&amp;gt; 430
[1884, 430] -&amp;gt; 4985
[1884, 430, 4985] -&amp;gt; 198
[1884, 430, 4985, 198] -&amp;gt; 46864
[1884, 430, 4985, 198, 46864] -&amp;gt; 379
[1884, 430, 4985, 198, 46864, 379] -&amp;gt; 12791
[1884, 430, 4985, 198, 46864, 379, 12791] -&amp;gt; 311
[1884, 430, 4985, 198, 46864, 379, 12791, 311] -&amp;gt; 26236
[1440] -&amp;gt; 701
[1440, 701] -&amp;gt; 7438
[1440, 701, 7438] -&amp;gt; 11
[1440, 701, 7438, 11] -&amp;gt; 10868
[1440, 701, 7438, 11, 10868] -&amp;gt; 198
[1440, 701, 7438, 11, 10868, 198] -&amp;gt; 32641
[1440, 701, 7438, 11, 10868, 198, 32641] -&amp;gt; 70879
[1440, 701, 7438, 11, 10868, 198, 32641, 70879] -&amp;gt; 3751&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;</description>
      <category>Karpathy-GPT만들기</category>
      <category>Bert</category>
      <category>Embedding</category>
      <category>GPT</category>
      <category>scratch</category>
      <category>tiktokenizer</category>
      <category>tokenizer</category>
      <category>Transformer</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/9</guid>
      <comments>https://leejeong6.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 24 Apr 2025 16:51:50 +0900</pubDate>
    </item>
    <item>
      <title>TEPS vocabulary공부</title>
      <link>https://leejeong6.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1.if we have any_____&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;possible : 가능한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;available : 이용 가능한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reachable : 접근 가능한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;disposable : 일회용의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.i need to______ some stress&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hang out:놀다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;loosen : 늦추다,완화하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;excuse : n.변명,핑계 v.용서하다,실례하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;release : 풀다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deliver : 배달하다&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;3.i was ____by the lovely scenery here in jeju&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;landscape:풍경,경관&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.inspired:영감을 받아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.activated:활성화된&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.connected:이어진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.approached:접근한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.please _____them.i'm working on an updated list&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;imitate:모방하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;suspend:중단하다,정지하다 suspect:의심하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eliminate:제거하다,없애다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;disregard:무시하다,관심을 주지 않다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;discard:버리다&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;5.it looks like it could be quite_____&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prevalent:널리퍼진,유행하는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lucrative:수익성이 좋은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tentative:잠정적인,주저하는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;affluent:부유한,풍족한&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;6.people often say i _____ him&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stick to : 고수하다,지키다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conflict:갈등하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;turn on : 키다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;look over : 검토하다,훑어보다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;take after: 닮다,특징을 물려받다&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;7.it only seems ____ if you don't get the complexities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conspicuous:눈에 띄는 뚜렷한&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;monotonous:단조로운&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;synonymous:동의어의,같은 뜻을 가지는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;contemptous:경멸하는&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;8.it's tought to _____a whole study into a few words&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tought to:~하기 어렵다(=hard to,difficult to)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enclose:둘러싸다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get close,approach : 가까워지다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;immerse:몰입하다,담그다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;condense:압축하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;minimize:최소화하다&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;9.I was absolutely ____&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;defunt: 기능하지 않는 (=function이 죽은,컴퓨터에서 쓰이는듯?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;feckless:무기력한,무책임한(feckless behavior 무책임한 행동)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thwarted:좌절한&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mortified:수치스러운,창피한&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;10.I can't stand being _____&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stand:견디다,참다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jostled : 떠밀리다,밀쳐지다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netstled : 포근히 자리잡다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smeared : 얼룩지다,명예 훼손당하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mustered : 모으다,소집되다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bump into : ~를 마주치다,부딪히다&lt;/p&gt;</description>
      <category>TEPS공부-서울대 공식 기출문제집/TEST1</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/8</guid>
      <comments>https://leejeong6.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 24 Apr 2025 12:42:58 +0900</pubDate>
    </item>
    <item>
      <title>Mixture-Of-Expert 논문리뷰</title>
      <link>https://leejeong6.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;논문 원본입니다 &lt;a href=&quot;https://arxiv.org/pdf/1701.06538&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/pdf/1701.06538&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ABSRTACT&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딥러닝에서 모델이 가지는 capacity는 그 파라미터 수에 의해 제한됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 큰 모델을 만들면 그만큼 계산량도 기하급수적으로 늘어납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 Conditional Computation이 있는데, 이 방법은 계산량은 적게 유지하면서도 모델 용량은 크게 늘릴 수 있다고 알려져 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 방법은 구현이 까다롭고 성능이 불안정하며 GPU로 돌릴 수 없다는 이유로 실제 적용이 어려웠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 이런 어려움을 해결하고, conditional computation의 잠재력을 현실화시킨 방법을 제안하는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 &quot;&lt;b&gt;Sparsely-Gated Mixture-of-Experts layer&lt;/b&gt;&quot;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;capacity를 1000배 이상 확장하며 계산량은 거의 늘리지 않는 이 방법은 각 입력마다 활성화할 expert(sub-network)를 선택적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성화되도록 하는 아이디어 입니다. 이 원리로 SOTA를 달성했다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1 INTRODUCTION AND RELATED WORK&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.1 CONDITIONAL COMPUTATION&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;텍스트,이미지,오디오 등 거의 모든 분야에서 모델의 파라미터 수를 늘리면 정확도가 좋아진다는 것이 입증되었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 대부분의 기존 모델은 모든 입력에 대해 전체 모델을 항상 활성화하기 때문에 데이터 크기와 모델 크기가 모두 증가하면 학습 비용이 거의 제곱 수준으로 증가하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 언급된 Conditional computation은 번역하자면 조건부 연산입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름으로 예측 가능한 게 조건문을 사용한다는 것인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.GPU는 branching에 약합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-조건문이 많아지면 연산 속도가 저하됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.조건부 계산은 batch size를 줄여버립니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-큰 batch는 파라미터 이동/업데이트를 효율적으로 만들지만, 조건부 활성화 구조는 작은 sub-network만 써서 효율이 떨어집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.네트워크 대역폭 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-여러 GPU를 쓸 때, 연산 속도보다도 GPU간 데이터 전송 속도가 병목현상을 일으킵니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.희소성 조절을 위한 loss항 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-sparsity를 위해 추가적인 loss항을 넣어야 하며 이는 훈련을 어렵게 만듭니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.조건부 계산을 실험한 기존 연구들은 작은 데이터셋 위주입니다&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 1.2 OUR APPROACH: THE SPARSELY-GATED MIXTURE-OF-EXPERTS LAYER&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sparsely-Gated Mixture-of-Experts layer&lt;/b&gt;는 여러개의 Expert가 존재하는데,각각은 단순한 FFN입니다&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 gating network가 학습을 통해 각 입력에 대해 소수의 expert만 선택해서 활성화 하는 이 방법은 backpropagation을 통해 함께 학습됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zpRjs/btsNt2cKYiY/pEaihu5SKqU2KKHlbDLwdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zpRjs/btsNt2cKYiY/pEaihu5SKqU2KKHlbDLwdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zpRjs/btsNt2cKYiY/pEaihu5SKqU2KKHlbDLwdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzpRjs%2FbtsNt2cKYiY%2FpEaihu5SKqU2KKHlbDLwdk%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;1003&quot; height=&quot;557&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;557&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;LSTM층 사이에 MOE를 끼워넣는 위 그림과 같은 구조입니다&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;1.3 RELATED WORK ON MIXTURES OF EXPERTS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MOE는 처음 제안된 이후로 많은 연구들이 진행됐습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVM,Gaussian process,DNN 등의 expert구조들과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hierachical MOE,infinite Exper 등의 방식들이 있었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 모델 전체를 하나의 MOE로 구성하거나 제한된 gating방식만 사용했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 MOE를 딥러닝 구조 내부에 모듈형으로 삽입하고, 각 입력 위치마다 동적인 sparse gating을 적용함으로써 모델 용량 확장과 계산 효율을 달성했다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2 THE STRUCTURE OF THE MIXTURE-OF-EXPERTS LAYER&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MOE레이어는 두 부분으로 구성됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.n개의 expert network &lt;i&gt;E1,E2,E3,,,En&lt;/i&gt; 각각의 expert는 독립된 feed-forward신경망으로,구조는 동일하지만 파라미터는 다름.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.Gating network : &lt;b&gt;&quot;G&quot; &lt;/b&gt;입력 X에 대한 sparse한 n차원 벡터 G(X) 출력, 이 벡터의 각 원소 G(Xi)는 expert에 얼마나 기여할지를 나타냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 MOE출력 Y는 &lt;span&gt;&lt;span&gt;&amp;sum;i=1nG(x)i&amp;sdot;Ei(x)y&amp;nbsp; 으로 계산됩니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;하지만 G(X)가 sparse하므로 G(X)=0인 경우는 해당 E를 계산조차 하지 않아서 소수의 expert만 활성화하는 원리입니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Dropout은 모델을 작게 만들어 regularization하려는 방법이고, MOE는 엄청나게 큰 모델을 만들어서 그중 일부만 똑똑하게 활성화하는 방식이라고 이해됩니다. 또, Hierachical MOE는 expert수가 크게 늘어날 때 1차 gating이 상위 그룹(secondary MOE)선택 후 각 그룹 안에 다시 expert와 gating으로 선택하는 방법입니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;논문에서 block-wise dropout과 비슷한 구조로 작동한다는 데 block-wise dropout은 여러 개의 hidden layer 중 일부를 꺼버리는 방법으로 꺼진 블록은 forward/backward를 계산안하는데 MOE는 여러개의 expert 중 일부만 선택적으로 실행하는 것으로 선택되지 않은 expert는 아예 계산을 안하는 방식으로 같은 메커니즘입니다&lt;/span&gt;&lt;/span&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 data-end=&quot;1202&quot; data-start=&quot;1165&quot;&gt;&lt;b&gt;Dropout = 모델 축소 + 랜덤 꺼짐 (정규화)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1202&quot; data-start=&quot;1165&quot;&gt;&lt;b&gt;MoE = 모델 확장 + 선택적 활성화 (표현력 증가)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 2.1 GATING NETWORK&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력x를 weight matrix wg에 곱한 후 softmax적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;sigma;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Softmax&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 각 expert에 대해 확률 분포를 만들어주는 방식인데, 모든 expert에 대해 값이 0이 아니므로 sparse하지 않습니다&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;그래서 Noisy TOP-K-Gating이 등장합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Top-k:가장 상위 k개의 expert만 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Noise:expert간에 균형을 위해 랜덤성 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 입력x를 gating weight wg에 곱한 후 가우시안 노이즈를 더합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 노이즈의 스케일은 또 다른 학습 가능한 가중치 Wnosie를 통해 조정됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Softplus&lt;/span&gt;&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;noise&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H(x)벡터에서 가장 큰 j개만 선택하고 나머지는 -&amp;infin;로 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;KeepTopK&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;{ &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;if&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;is&amp;nbsp;in&amp;nbsp;top&amp;nbsp;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;minus;&lt;/span&gt;&lt;span&gt;&amp;infin;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;​ otherwise&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과를 softmax에 넣어 확률벡터 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Softmax&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;KeepTopK&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 expert 중 일부만 켜지는 방법으로 GPU자원 절약 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Noise를 통해 특정 expert만 자꾸 선택되는 현상을 막음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;softplus로 크기가 너무 작거나 커지지 않도록 양의 값을 언정적으로 제어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K&amp;gt;1이면 선택된 top-k expert들에 대해서는 미분 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 선택되지 않은 expert는 gradient가 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;예를 들어보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;W&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;minus;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방식:Softmax Gating&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Softmax([2.0,&amp;nbsp;1.0,&amp;nbsp;0.5,&amp;nbsp;-1.0])&amp;nbsp;=&amp;nbsp;[0.61,&amp;nbsp;0.23,&amp;nbsp;0.14,&amp;nbsp;0.02]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 방식: Noisy Top-K Gating (k=2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노이즈 더함 &lt;span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2.1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;1.3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;minus;&lt;/span&gt;&lt;span&gt;0.8&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;724&quot; data-start=&quot;694&quot;&gt;Top-2는 [2.1, 1.3] &amp;rarr; E₁, E₂&lt;/li&gt;
&lt;li data-end=&quot;766&quot; data-start=&quot;725&quot;&gt;나머지 E₃, E₄는 &lt;b&gt;무시&lt;/b&gt; (KeepTopK에서 -&amp;infin; 처리)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Softmax([2.1,&amp;nbsp;1.3,&amp;nbsp;-&amp;infin;,&amp;nbsp;-&amp;infin;])&amp;nbsp;&amp;asymp;&amp;nbsp;[0.69,&amp;nbsp;0.31,&amp;nbsp;0.0,&amp;nbsp;0.0]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;3 ADDRESSING PERFORMANCE CHALLENGES&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;3.1 THE SHRINKING BATCH PROBLEM&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 MOE에서 발생하는 성능 저하 문제 중 하나입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배치크기가 32라면 하나의 GPU는 32개의 데이터를 한번에 받는다는 뜻입니다. 각 데이터는 k개의 expert를 선택하면 종합 32*k가 선택됩니다. 전체 expert를 n이라하면 한expert 당 처리하는 데이터 수는 k*b/n (b는 배치크기)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 n을 늘리면 각 expert가 받는 data가 점점 작아지는 문제가 발생하며 이를 shrinking batch problem이라합니다.&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;&lt;b&gt; Mixing Data Parallelism and Model Parallelism&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data parallelism이란 데이터를 여러 GPU에 나누자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model parallelism이란 모델을 여러 GPU에 나누자 라는 의미입니다&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;두 병렬화 방법을 MoE에서 mixing해서 사용하자는건데 gating network가 판단해서 선택받은 k개의 expert만 활성화될텐데 이렇게 하지말고 k개의 선택받은 expert가 전체데이터를 처리하자는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 만약 GPU가 4개가 있다면 (전체데이터/4)만큼 각 GPU에 들어가게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하지말고 GPU에 분산됐던 데이터를 다시 하나로 합쳐서 처리한다는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 k*b/n이던 처리량을 k*b*GPU수/n으로 늘릴 수 있습니다.&lt;/p&gt;
&lt;p 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;통상 여러 GPU를 병렬적으로 이용하는 연산은 일반적으로 효율적입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 수많은 MoE모델을 각 GPU에 복사된다면 GPU수*expert수 만큼 자리를 차지합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;논문에서 말하고자 하는 Model Parallelism은 Model전체를 GPU마다 복사하지 말고&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Expert를 여러 GPU에 나눠서 저장을 해놓는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 GPU1에는 expert:1,2,3,4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU2에는 expert 5,6,7,8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU3에는 expert 9,10,11,12 ,,,etc&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&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;추가로 data parallelism은 synchronization이라는 문제가 있습니다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매 Weight parameter를 업데이트 할때마다 여러 GPU가 학습한 결과를 종합한 후 다시 나누는 문제인데&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GPU가 연산하는 속도보다 GPU간 데이터 전송 속도가 더 느리기 때문에 부가적인 시간이 드는 문제인 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 NV Link와 같은 고속인터커넥트를 사용하면 Synchronization 시간과 전체 학습시간을 줄일 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce8BoL/btsNzOjeEGL/qb6Yzv07gaCnE4MxwNuBj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce8BoL/btsNzOjeEGL/qb6Yzv07gaCnE4MxwNuBj1/img.png&quot; data-alt=&quot;NV Link&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce8BoL/btsNzOjeEGL/qb6Yzv07gaCnE4MxwNuBj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce8BoL%2FbtsNzOjeEGL%2Fqb6Yzv07gaCnE4MxwNuBj1%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;214&quot; height=&quot;203&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;NV Link&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;3.2 NETWORK BANDWIDTH&lt;/blockquote&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU 간 데이터 전송이 성능에 큰 영향을 미치는데,이를 네트워크 bandwidth문제라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MOE에서 expert는 GPU위에 고정된 위치에 있고, gating network의 파라미터는 적어서 데이터 전송량이 많지 않습니다. 따라서 네트워크를 통해 전송되는 데이터는 주로 expert의 input과 output입니다. 즉 network bandwidth가 작으면 expert에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기껏 열심히 만들어봤자 효율이 떨어질 것입니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;network bandwidth의 정의는 네트워크에서 특정 시간 내에 전송될 수 있는 데이터의 최대 용량으로 높을수록, 한번에 더 많은 데이터가 전송될 수 있습니다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계산 효율성을 유지하려면, expert가 하는 행렬연산과 input/output의 비율이 GPU의 계산능력과 네트워크 전송 능력의 비율보다 커야합니다 GPU는 계산 능력이 매우 강하지만, 네트워크 전송속도는 상대적으로 느립니다. 예를 들어 GPU 계산속도가 네트워크 속도보다 천 배 빠를 수 있다고 합니다.&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;논문에서 말하기를, expert가 하나의 은닉층을 가진 FFN으로 설계하며, 이 은닉층은 수천 개의 뉴런을 포함한다고 합니다. expert의 가중치 행렬은 두 개로 input*hidden*output으로 구성된다고 합니다. expert가 하는 계산량은 hidden_size에 비례하며 input,output의 데이터 크기는 input_size와 output_size에 비례하므로, 계산량과 데이터 크기의 비율은 은닉층 크기와 같습니다&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;따라서 expert의 효율성을 높이는 간단한 방법은 hidden layer를 키우거나, 추가하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 더 많은 일을 expert가 하게 되므로, 네트워크로 전송되는 데이터 크기에 비해 GPU계산 활용도가 높아집니다. 결과적으로 network bandwidth문제를 완화하고 학습이 빨라집니다.&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;3.2를 정리하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MoE모델을 여러 GPU에서 학습할 때, GPU 간 데이터 전송(network bandwidth)이 문제가 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결책으로는 입력/출력 보다 계산을 더 많이 하도록 설계합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPU는 계산이 빠르므로, expert의 은닉층 크기를 키우거나 층을 추가해서 계산량을 늘리는 방식을 택했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 은닉층 크기를 키우면 GPU메모리 사용량이 늘어날 수 있는데, MoE는 특정 expert만 활성화되므로, 전체적인 메모리 부담은 관리가 가능하며 메모리가 충분하다면 계산 효율성 향상이 더 큰 이점이라고 생각됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 현대 GPU(NVIDIA A100)은 초당 수십 테라플롭스의 계산능력을 제공하지만,네트워크(NVLink)는 초당 수백 GB수준이라고 합니다.&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;blockquote data-ke-style=&quot;style2&quot;&gt;4 BALANCING EXPERT UTILIZATION&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 가능했던 문제에 대해 언급합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MoE모델에서 gating network는 입력 데이터를 보고 어떤 expert를 사용할지 결정하는데, 이를 위해 각 expert에게 weights를 부여하는데, 문제는 소수의 experts에게만 높은 weights를 주고, 나머지 expert는 거의 사용하지 않는다는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 imbalance(불균형)은 sefl-reinforcing을 초래합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 선택된 expert는 더 많은 data를 처리하며 학습이 빨리 진행되며 성능이 점점 더 좋아지고, gating network는 이 expert를 더 자주 선택하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;self-reinforcing은 자신이 통제할 수 있는 보상을 자기 자신에게 줌으로써 자기 행동을 개선 또는 유지하는 과정이라고 합니다.&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;이 문제는 예전부터 존재했는데 Eigen et al.(2013)은 학습 초기에 hard constraint(강한 제약)을 사용해 gating network가 특정 expert만 선택하지 않도록 했습니다. Bengio et al.(2015)는 각 배치마다 gating network의 가중치 평균에 soft constraint(부드러운 제약)을 추가하여 균형을 맞추도록 유도했었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Eigen의 방식&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 식당 매니저가 &quot;모든 요리사가 하루에 최소 5번은 요리를 해야 한다&quot;고 엄격한 규칙을 세워 인기 요리사만 바빠지는 걸 막습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bengio의 방식&lt;/b&gt;: 매니저가 &quot;모든 요리사가 비슷한 횟수로 요리하도록&quot; 부드럽게 유도하며, 특정 요리사가 너무 바빠지면 약간의 페널티를 줍니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 Bengio방식과 같이 soft constraint(부드러운 제약)을 사용하는 것을 택했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 expert에게 importance를 정의하는 방법을 소개합니다. gating network는 입력 데이터 배치에 대해 각 expert에게 가중치를 부여합니다. 이 가중치는 해당 전문가가 얼마나 사용되는지를 나타내며 특정 expert의 importance는 그 배치에서 해당 전문가의 게이트 값들의 합으로 계산됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 손실함수 L은 expert들이 고르게 사용되지 않으면 손실 값을 증가시켜, 모델이 모든 expert가 균등히 활용하도록 학습하도록 만듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loss는 각 expert의 importance합을 구한뒤 이 값들의 Coefficient of Variation을 계산합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CV는 importance의 표준편차를 평균으로 나눈 값으로, 얼마나 불균등한지를 측정하는 것입니다. CV가 크면 일부 expert만 사용되고 CV가 작으면 고르게 사용된 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CV를 제곱한 값을 손실로 사용하며 이 값에 scaling factor W를 곱합니다. 이 factor는 hand-tuned(사람이 직접 조정)하며,추가 손실의 중요도를 조절합니다.&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;745&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXgps/btsNsE3Qeho/o1NAaqm5HYxnqd9JqgLFGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXgps/btsNsE3Qeho/o1NAaqm5HYxnqd9JqgLFGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXgps/btsNsE3Qeho/o1NAaqm5HYxnqd9JqgLFGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXgps%2FbtsNsE3Qeho%2Fo1NAaqm5HYxnqd9JqgLFGk%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;745&quot; height=&quot;188&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이 방법은 G의 sum을 계산하므로, 한 expert가 크고 다른 게 작다면 importance가 비슷할 수 있는 문제가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 불균형은 distributed hardward에서 문제를 일으키는데, 적은 수를 처리하던 GPU는 그만큼 놀고, 바쁜 GPU는 계산이 길어지므로 비효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문에서는 이를 해결하기 위해 새로운 Loss인 L_load를 추가합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Loss는 각 expert가 받는 example의 수가 균형 잡히도록 만듭니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n7bnR/btsNwMzhK9x/wvJSgCD56KPlgo4JkWdgIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n7bnR/btsNwMzhK9x/wvJSgCD56KPlgo4JkWdgIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n7bnR/btsNwMzhK9x/wvJSgCD56KPlgo4JkWdgIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn7bnR%2FbtsNwMzhK9x%2FwvJSgCD56KPlgo4JkWdgIk%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;1064&quot; height=&quot;650&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L_load가 어떻게 정의됐는지 한줄한줄 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 expert가 받는 example의 수는 discrete합니다. 이는 backprop을 할 수 없기 때문에 각 expert가 배치 X에서 받는 example수를 smooth estimator Load(X)로 정의합니다. -왜 안되지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gating netwokr의 출력 G(x)i는 입력 x에 대해 expert i가 선택될 확률인데, 여기에 노이즈 항을 추가해 선택이 discrete하지 않게 합니다. P(x,i)는 expert i가 선택될 확률입니다. 이는 선택이 단정적이지 않게 만들어 부드럽게 확률을 계산하게 합니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P(x,i)는 H(x)i가 H(x)의 k번째로 큰 값보다 커야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H(x)는 gating network가 입력x에 대해 각 expert에게 부여한 점수 벡터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, 각 expert에 대한 선호도입니다. 이 점수가 상위 k에 들면 해당 expert가 선택됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H(x)i는 H(x)에서 자신을 뺀 나머지 점수들 중 k번째로 큰 값과 비교하게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[H(x)는 x*Wg로 계산되며 여기에 노이즈가 추가되어 최종 선택 G(x)가 됩니다]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이를 CDF로 만드는데 CDF란 Cumulative Distribution Function으로 확률 분포의 누적 확률을 나타내는 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준 정규 분포의 CDF &lt;span&gt;&amp;Phi;(z)&amp;nbsp; 는 값 z이하일 확률을 계산합니다&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;예: &lt;span&gt;&lt;span&gt;&amp;Phi;(0)=0.5 \Phi(0) = 0.5 &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;Phi;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 50% 확률, &lt;span&gt;&lt;span&gt;&amp;Phi;(1)&amp;asymp;0.84 \Phi(1) \approx 0.84 &lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;Phi;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&amp;asymp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0.84&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 84% 확률을 의미&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Load(X)i = sumP(x,i)로 expert i가 배치에서 받는 기댓값으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 32명의 손님 중 요리사 i에게 갈 확률이 평균 0.3이라면 약 9.6명을 상대할 것으로 예상됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Load(X)i를 통해 연속적인 값으로 역전파에 사용가능하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L_load는 Load(X)의 CV를 제곱한 값에 factor w_load를 곱해 계산합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 초기에는 gating network의 가중치 행렬 Wg와 W_noise를 모두 0으로 초기화했다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wg가 0이면 gating network가 특정 expert를 선호하지 않게 되는 것입니다&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;정리하자면 기존의 L_importance는 특정 expert가 self-reinforcing으로 악순환되는 것을 막고자 추가한 Loss인데, 이는 expert의 합을 비교하는 조건입니다. 이는 배치 내의 특정 expert가 다른 expert보다 커서 합이 일정해지는 문제를 초래했고 이를 해결하는 방법이 L_load입니다. L_load는 gating network가 선택한 expert가 discrete하지 않게 G를 P(x,i)로 바꿨고, Load(X)를 계산합니다. 이는 각 expert마다 선택될 수 있는 기댓값을 의미하며 이 Load의 CV값을 제곱한 후 W_load와 곱한 값을 L_load로 정의했습니다. 이를 통해 GPU를 통한 분산 학습에서 메모리/성능 문제를 해결하며 최적화합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KMWAm/btsNwQ2szVX/Hp4rHXyuXO4IrGyYCJ5An0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KMWAm/btsNwQ2szVX/Hp4rHXyuXO4IrGyYCJ5An0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KMWAm/btsNwQ2szVX/Hp4rHXyuXO4IrGyYCJ5An0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKMWAm%2FbtsNwQ2szVX%2FHp4rHXyuXO4IrGyYCJ5An0%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;806&quot; height=&quot;178&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;w 값에 대한 CV와 Test Perplexity값입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;w가 0~1사이 값을 조정했더니 max(Load(X))는 모든 expert중 가장 많은 example을 받은 Load값이고 mean은 평균이므로 가장 과부화된 expert의 Load가 평균보다 몇 배인지 나타내는 정도입니다&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;w_importance와 w_load가 둘 다 0이면CV가 둘 다 매우 크고 max/mean도 큽니다. 이는 소수의 expert만 선택되는 것으로 불균형을 일으킨 다는 것을 의미합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 둘 다 1이면 CV도 둘 다 작고 max/mean도 작은 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Perplexity는 예측 성능으로 낮을수록 모델이 더 잘 예측하는 것인데 둘 다 0이 아닐때 결과는 비슷합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;5 EXPERIENCE&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.1 1 BILLION WORD LANGUAGE MODELING BENCHMARK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chelba et al.에 의해 소개된 데이터셋으로 MoE의 성능 평가를 시작했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 발표된 최고의 성능은 Jozefowicz et al.에 의해 보고된 모델로 LSTM을 겹겹이 쌓아 200만개에서 1억 5100만개 까지 다양한 파라미터를 가집니다.논문에서는 MoE층을 두 개의 LSTM층 사이에 삽입했다고 합니다&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;465&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYLz0/btsNxSMKNtm/PAAZflbCksW5QX2wLkOKq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYLz0/btsNxSMKNtm/PAAZflbCksW5QX2wLkOKq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYLz0/btsNxSMKNtm/PAAZflbCksW5QX2wLkOKq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYLz0%2FbtsNxSMKNtm%2FPAAZflbCksW5QX2wLkOKq0%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;465&quot; height=&quot;352&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 LSTM모델보다 Test Perplexity가 훨씬 더 줄어든 좋은 결과를 보여줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MoE모델을 평가할때, 항상 4명의 expert만 활성화되게끔 했고, 전체 MoE expert를 늘려 더 많은 계산을 허용할 경우, 성능은 더욱 향상되며, 기존 성능 모델 보다 훨씬 적은 계산량으로도 더 나은 결과 달성이 가능함을 보였습니다&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;Tensorflow로 모델의 Computational Efficiency를 비교해본 결과 기존 모델의 계산 효율은 1.07~1.29 TFLOPS/GPU인데 MoE도입 후 계산효율은 0,74~0.90TFLOPS/GPU였습니다.&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;5.2 100 BILLION WORD GOOGLE NEWS CORPUS&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PGRaU/btsNxjYlEmA/AUbp1BujkOT4MYmnIGoDS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PGRaU/btsNxjYlEmA/AUbp1BujkOT4MYmnIGoDS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PGRaU/btsNxjYlEmA/AUbp1BujkOT4MYmnIGoDS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPGRaU%2FbtsNxjYlEmA%2FAUbp1BujkOT4MYmnIGoDS0%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;479&quot; height=&quot;364&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1000억 단어로 학습한 결과, expert수는 기존보다 훨씬 perplexity가 줄어든 모습을 보였고, 두 그래프 간의 차이가 점점 커지는 것은 모델 용량 증가가 데이터가 클수록 더 효과적임을 보여줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 expert가 131072일때는 성능이 하락했습니다. 이는 과도한 sparsity로 인한 부작용일 가능성이 큽니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 모델이 클수록 좋다라는 말은 데이터가 충분히 클 때에만 성립하며 희소성이 높을수록 무조건 좋은건 아니다. 즉 적절한 expert의 수를 찾아내는 것이 MoE설계에서 핵심이 되는 셈이다. 라고 이해할 수 있습니다&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;5.3 MACHINE TRANSLATION (SINGLE LANGUAGE PAIR)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GNMT(Google Neural Machine Translation)모델에 MoE레이어를 인코더,디코더에 삽입했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 MoE레이어는 최대 2048expert를 포함하며 각 expert는 약 200만 개의 파라미터를 가집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로 인해 약 8억 개의 파라미터가 추가됐습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어-&amp;gt;프랑스어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어-&amp;gt;독일어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지 데이터 셋으로 실험해봤을 때 BLEU결과는 기존 대비 1.34, 1.12점이 올랐습니다. 훈련시간 1/6만 사용했음에도 불구하고 우수한 성능을 보였고, 기존 GNMT보다 LSTM수를 일부러 감소했음에도 BLEU의 점수가 상승했고, 강화학습 기반 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;5.4 MULTILINGUAL MACHINE TRANSLATION&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MoE의 장점이 가장 잘 나타난 실험결과입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12개의 언어에 대해 기존 GNMT와 MoE가 추가된 모델로 수행을 했습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P1ARG/btsNw8CQRGU/QvsIKE9gl670XoSkdDhGn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P1ARG/btsNw8CQRGU/QvsIKE9gl670XoSkdDhGn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P1ARG/btsNw8CQRGU/QvsIKE9gl670XoSkdDhGn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP1ARG%2FbtsNw8CQRGU%2FQvsIKE9gl670XoSkdDhGn0%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;893&quot; height=&quot;466&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 압도적인 MoE의 승리였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어에서만 성능이 좀 안좋았는데, 이는 데이터셋이 적어서 그래을 것이라는 분석이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 training time도 21일에서 12일로 줄어든 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 결과는 MoE의 멀티태스킹 능력을 잘 보여주는 결과로 기존 GNMT는 여러 언어쌍을 한 모델에 집어넣을 경우, 파라미터가 공유되어 손해를 봤는데, MoE는 입력마다 다른 expert를 골라 쓰기 때문에 이 문제를 효과적으로 해결한 것 같습니다&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;6 CONCLUSION&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;MoE는 원래 Adadtive Mixtures of Local Experts라고 1991년에 나온 논문입니다. 이는 GPU가 없던 시절과 데이터셋 문제, 오버피팅 문제가 계속 발생해서 실용화되지 못했습니다. 이 논문은 25년이 지난 후에 등장한 논문으로 MoE를 실제 환경에서도 사용할 수 있도록 현실적인 형태로 진화시킨 것으로 의미가 큽니다.&lt;/p&gt;
&lt;p 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;현재는 이 이론을 기반으로 Switch Transformer, Gshard,, Pathways, PaLM, MT-NLG 등에서 사용됩니다&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;Gshard는 Transformer Encoder의 FFN layer를 MoE로 대체했고,&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;770&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sK63e/btsNwOYUnLu/vzpei9g5ukdHOueVdiLGK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sK63e/btsNwOYUnLu/vzpei9g5ukdHOueVdiLGK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sK63e/btsNwOYUnLu/vzpei9g5ukdHOueVdiLGK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsK63e%2FbtsNwOYUnLu%2Fvzpei9g5ukdHOueVdiLGK1%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;770&quot; height=&quot;520&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;520&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;Switch Transformer는 Gshard가 Top-k의 expert를 뽑는 것을 top-1만 뽑는 것으로 바꿨습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 MoD라 해서 Transformer에서 입력 토큰에 대해 특정 토큰은 덜 중요할 수도 있는데 이를 MoE방법을 사용해서 self-attention을 할지 안할지 결정하는 방법이라고 합니다.&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;1009&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oy4x3/btsNvd6aQCb/QRuf125bmH9eJj8jsBpP30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oy4x3/btsNvd6aQCb/QRuf125bmH9eJj8jsBpP30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oy4x3/btsNvd6aQCb/QRuf125bmH9eJj8jsBpP30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOy4x3%2FbtsNvd6aQCb%2FQRuf125bmH9eJj8jsBpP30%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;1009&quot; height=&quot;599&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;599&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>논문리뷰</category>
      <category>efficient transformer</category>
      <category>Expert</category>
      <category>gating network</category>
      <category>MOE</category>
      <category>Transformer</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/7</guid>
      <comments>https://leejeong6.tistory.com/7#entry7comment</comments>
      <pubDate>Tue, 22 Apr 2025 18:20:06 +0900</pubDate>
    </item>
    <item>
      <title>TEPS 리스닝공부</title>
      <link>https://leejeong6.tistory.com/6</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;11번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:congratulations on taking the job offer on london&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:thanks,it's stressful planing a move abroad though&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:I bet. i hope your company's helping with the process&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:_________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.okay,i'll do what i can for them&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.yeah,they've been very supportive&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.well, i might take their job offer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.no,they only help employees relocate&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;though : 그렇긴해도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i bet: 그럴 것 같아&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;relocate:이주하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;12번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W:Let's see a movie this weekend&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:okay,how about latest defender movies&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W:i'm tired of super hero movies all the time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:_____________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.okay,then let's watch a comedy or something&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.yeah,i hear it's getting a great reviews&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.i know,i can't wait to see it, either&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.me too,they're my favorites&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;13번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:I bumped into Alice today&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W:i heard she has a new boyfriend&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:yeah,and she wants us to meet him this saturday&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;W:_______&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.i have other plans that day, though&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.it's time they got back together&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.i didn't know she was dating&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.it was nice talking to him&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;dating:연애중,사귀는 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;got back: 다시 사귀다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seeing someone:썸타다,사귀는 초반&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;14번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:Can i borrow your notes from history class?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:What happend to yours?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G: I can't find them anywhere,i must've lost them&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.okay, i'll take notes for you&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.dont worry,i'll return them safely&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.I didn't know,you are taking the course&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.let me photocopy mine for you, then&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;note:필기하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;15번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:oh no, my library book is due today&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:you'd better return it this afternoon, then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:but isn't the library closed on public holidays?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:__________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.you can't borrow it ,anyway&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.i'd take it back before the holiday, then&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.i'm not sure what time it closes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.you can leave it in the dropbox anyday&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;'d는 would의 줄임말&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;16번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G: I heard you got into a car accident&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:Yeah,someone crashed into me last night&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:Wow,i hope you weren't hurt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:__________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.i'm fine, just little shaken up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.thanks,i will visit you in the hospital&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.true, but my insurance will cover the repairs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.actually,it was the other driver's fault&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;got into:사고를 당하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shaken up:놀란&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;17번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:Could you help me prepare dinner?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:Sure,just tell me what to do&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:you can start by washing the vegetables&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.thanks for doing that&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.that will be save some time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.consider it done&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.please get right on it&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;could는 공손한 can이라 생각하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;consider it done:맡겨만 줘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;get right on it : 지금 바로 하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;18번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:Did you tell Lucy that she was being late off?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:I did,she didn't seem upset at all&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:Really? that's a strange reaction&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:_________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.she didn't want to break the news&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.i know,i hate seeing upset&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.i guess she thought coming&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.yeah she hasn't been told yet&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;19번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:Merry? Is that you?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:john!I thought you moved to harrisville&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:i did.i'm just visiting family,are you still living here in Mapleton?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:_______&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.i'm just in harisville for business&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.actually,i moved here too&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.i've never been there before&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.yeah,i've never left&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;20번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:I've been following election day coverage all evening&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:oh,the senate race. So who's ahead in the polls?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G:the Liberals.but it's quite close&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;M:________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.I had a feeling it'd be a contest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.sounds exciting,i'll keep you posted&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.they need to work harder to catch up&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.it was close right up until election daty&lt;/p&gt;</description>
      <category>TEPS공부-서울대 공식 기출문제집/TEST1</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/6</guid>
      <comments>https://leejeong6.tistory.com/6#entry6comment</comments>
      <pubDate>Tue, 22 Apr 2025 10:04:16 +0900</pubDate>
    </item>
    <item>
      <title>probabilistic machine learning-Transformer이후</title>
      <link>https://leejeong6.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15.5.6 Transformers for images&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CNN은 이미지 데이터를 처리하는 데 가장 널리 사용되는 모델입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 내재된 inductive bias를 가지고 있기 때문입니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;inductive bias : 귀납적 편향&lt;br /&gt;&quot;이 모델은 세상을 이렇게 바라보는 경향이 있어&quot;라는 선천적인 추론 방식이나 가정&lt;br /&gt;머신러닝 모델은 데이터를 보고 규칙을 학습하는데, 이때 데이터만 보고는 해결할 수 없는 부분을 메꾸기 위해 모델이 세상에 대래 미리 갖고 있는 가정이 필요하며 그게 바로 inductive bias이다&lt;br /&gt;CNN에서는 &lt;br /&gt;Locality:근처 픽셀끼리 관련 있다는 가정&lt;br /&gt;Translation equivariance:어떤 패턴이 사진의 어디에 있든 같이 처리하겠다는 성질&lt;br /&gt;Weight sharing:같은 필터를 전체 이미지에 적용&amp;nbsp;&lt;br /&gt;Pooling:일부 위치 변화에 대해 invariance&lt;br /&gt;Transformer는 이미지에 대한 어떠한 indeuctive bias도 없다.&amp;nbsp;&lt;br /&gt;커널이나 pooling weight sharing도 없기 때문에 데이터를 엄청 많이 줘야만 이미지를 이해하는 것&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;Transformer도 이미지 분류 작업에서 좋은 성능을 낼 수 있음이 밝혀졌는데, 충분한 양의 데이터로 학습시킬 수 있다면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(transformer는 이미지에 특화된 inductive bias가 부족하므로, 이를 극복하려면 데이터가 많이 필요하다)&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;이 방법으로 ViT라는 모델이 나왔습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ViT는 입력 이미지를 16X16 패치 단위로 나눈 후 각 패치를 임베딩 하고 Transformer에 입력합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 앞에는 특별한 [CLASS]임베딩 x0가 추가되고 지도 학습 방식으로 훈련된다고 합니다&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;작은 데이터셋에서 학습했을 경우 ViT는 미리 학습된 CNN기반 모델인 BiT보다 성능이 낮았다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 ImageNet-21k(1400만장 이미지)또는 JFT와 같은(3억 300만 장) 데이터로 학습시켰을 때 ViT가 BiT보다 더 나은 성능을 보인다는 걸 알게 되었습니다&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;15.5.7 Other transformer variants&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer에서 유래된 모델들이 존재합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gshard논문은 일부 FeedForward레이어를 &quot;Mixture of Experts&quot;회귀 모듈로 교체함으로써 Transformer를 더 큰 규모로 확장했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 &quot;sparse conditional computation&quot;을 가능하게 합니다. 즉 입력마다 모델의 전체가 아니라 일부만 사용되는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 예로는 Conformer논문은 Transformer 구조 안에 Convolutional layer를 추가해서 음성 인식 작업에서 효과적임을 보여줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Conformer는 CNN의 로컬특징, self-attention의 글로벌 특징을 병렬로 음성-&amp;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;15.6&amp;nbsp;Efficient&amp;nbsp;transformers&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer의 연산량은 N제곱입니다. 그래서 긴 시퀀스에는 적용하기 어렵다는 단점이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.6에서는 Transformer를 어떻게 효율적으로 변형했냐에 대한 섹션입니다&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;15.6.1&amp;nbsp;Fixed&amp;nbsp;non-learnable&amp;nbsp;localized&amp;nbsp;attention&amp;nbsp;patterns&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention메커니즘을 단순하게 수정하는 방법 중 하나는 각 토큰이 정해진 고정된 지역범위 내의 토큰들만 참조하도록 제한하는 것입니다. 예를 들어, 입력 시퀀스를 k개의 블록으로 나누고 attention을 블록 내부에서만 수행한다면 N제곱에서 N제곱/k로 줄어들 것입니다. k가 클수록, 계산 효율성은 크게 향상되며 꼭 블록 형태일 필요도 없다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 방법으로는 strided/dilated windows/hybrid patterns/fixed attention pattern이 있다고 합니다&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;일단 Transformer의 attention은 N개의 토큰이 N개를 다 비교하니까 N제곱의 연산량입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 시퀀스가 N=12라면 k=3개의 블록으로 나누어 각 블록의 길이가 N/k=4로 나눈다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 [x1 x2 x3 x4] [x5 x6 x7 x8] [x9 x10 x11 x12]로 나뉘니까 x1은 x2,3,4만 볼 수 있고 블록 사이에서는 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;firxed는 attention패턴이 고정되어 있음, non-learnable은 학습을 통해 바뀌는 게 아님 localized는 주변 토큰만 참조(global x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 fixed(이 방식은 어떤 토큰이 누구를 바라볼지 미리 정해져 있고) non-learnable(학습을 통해 바뀌지 않고) localized(멀리 있는 토큰을 무시하고 가까운 것들만 본다)는 의미입니다 따라서 15.6.1의 이름이 이랬던 것 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15.6.2 Learnable&amp;nbsp;sparse&amp;nbsp;attention&amp;nbsp;patterns&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;learnable:학습 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sparse:모든 토큰이 다른 토큰을 바라보지 않고 일부 토큰만을 참조한다는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.6.1처럼 패턴을 미리 정의했는데, 15.6.2는 이 패턴이 학습 가능하게 정의하겠다는 뜻입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hashing-based접근 방법은 모든 토큰에 hash함수를 적용하여 각 토큰을 특정 hashing-bucket에 배정하는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Reformer아키텍처에서는 Locality Sensitive Hashing을 사용해서, 각 토큰을 hash 하고 그 결과에 따라 각각의 토큰이 특정한 hashing bucket에 속하게 됩니다. 이 방법의 연산은 NM^2 logM이며 여기서 M은 토큰 임베딩 차원을 의미합니다&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;Clustering-based접근 방법은 k-means클러스터링 같은 표준 클러스터링 알고리즘을 이용합니다. 이 방법을 사용한 모델은 Clustering Transformer라고 불리며 만약 k개의 크기가 동일한 클러스터를 사용한다면, attention모듈의 복잡도는 N^2/k로 줄어듭니다.&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;p data-ke-size=&quot;size16&quot;&gt;Hashing이라는 것은 데이터를 일정한 규칙에 따라 특정 위치에 매핑하는 방법입니다. 즉 어떤 데이터를 고정된 길이의 Key로 변환하는 과정을 말합니다. 예를 들어 apple이라는 단어를 해싱한다고 하면 해시 함수는 이 단어를 숫자로 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;5&quot;라고 됐다면 apple은 숫자 5위 치에 저장되거나 참조되는 것이라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h(&quot;apple&quot;)=5 이런 식이라고 합니다. 해싱을 사용하면 데이터를 빠르게 찾을 수 있고, 같은 해시 값을 가진 데이터는 같은 bucket에 들어가기 때문에 apple과 banna라는 두 단어가 있다면 h(&quot;apple&quot;)=5, h(&quot;banana&quot;)=7로 매핑하여 둘을 다른 위치에 저장할 수 있고 나중에 apple을 찾고 싶을 때는 5번 위치만 확인하면 되므로 매우 빠르다고 합니다&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;Reformer와 같은 모델에서 해싱을 사용해서 각 토큰을 해싱하여 특정 버킷에 학당하고 그 버킷 내에서만 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;클러스터링은 attention전에 각 클라스터 내에서만 attention을 적용하니까 다른 클러스터는 무시하면 되는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 앞의 15.6.1과 같이 N^2/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;근데 이 부분이 왜 learnable인지 GPT에게 물어보니 버킷에 배분하는 방법은 학습이 가능하며 k-means는 어떻게 분배해야 가장 효율적 일지 조정할 수 있기 때문에 learnable 하다고 하는 것 같습니다&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;lt;15.6.1&amp;gt; &amp;lt;15.6.2&amp;gt;는 다른 차이점이 어떻게 self-attention의 N^2 연산량을 줄일 거냐 인데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.6.1은 k로 하이퍼 파라미터로 고정하여 연산량을 줄이는 것이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.6.2는 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;&lt;b&gt;15.6.3&amp;nbsp;Memory&amp;nbsp;and&amp;nbsp;recurrence&amp;nbsp;methods&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Memory module은 외부 메모리 공간을 활용하여 여러 토큰에 동시에 접근할 수 있도록 하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 global memoty algorithm의 형태로 구현될 수 있고, 이 방법은 각 토큰이 메모리 공간에 저장된 다른 정보를 참고할 수 있는 방식이라고 합니다. 예를 들어 Transformer모델에서 각 입력이 다른 입력들에 대한 정보를 기억하면서, 그 정보를 활용해 계싼을 진행할 수 있게 하는 방식이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 접근으로는 recurrence with local block입니다. recurrence는 local block들을 연결하여 장기적인 의존성을 학습하는 방식으로 Transformer-XL이 대표적인 예시라고 합니다. Transformer는 각 입력이 독립적으로 처리되지만, Transformer-XL은 이전 입력들의 정보를 메모리에 저장하고, 새로운 입력을 처리할 때 이 정보를 참고할 수 있도록 만들어졌다고 합니다&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;두 방식 모두 장기 의존성 문제를 더 잘 도와주게끔 하는 것 같습니다&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;15.6.4 Low-rank&amp;nbsp;and&amp;nbsp;kernel&amp;nbsp;methods&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;self attention의 attention matrix는&amp;nbsp; softmax(QK^T) V입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q : N x D&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K : N x D&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V : N x D입니다 따라서 Attention Matrix는 N x N입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linformer&amp;nbsp;&lt;/b&gt;모델은 여기서 D차원의 Key, Valu를 M차원으로 축소해서 연산량을 줄이자는 제안을 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤 가우시안 프로젝션을 통해 D차원에서 M차원으로 투영되어 Output차원이 N x M이 됩니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이는 Johnson-Lindenstrauss Lemma의 이론이 보장해 주는데, Johnson-Lindenstrauss Lemma란 고차원에서 벡터 간의 거리나 각도를 거의 그대로 유지하면서, 더 낮은 차원으로 투영할 수 있다는 이론입니다&lt;br /&gt;X가 10*1000차원일 때(10개의 벡터가 각각 1000차원) 64차원 가우시안 분포를 기반으로 한 랜덤 행렬을 만들고, 그 축들에 투영을 하면 X가 10*64차원으로 됨&amp;nbsp;&lt;br /&gt;아래는 예시로 3D에서 2D로 가우시안 랜덤 분포를 통해 투영한 결과입니다
&lt;pre id=&quot;code_1744941924633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt

# 원래 데이터: 3D 공간에 있는 100개의 점
np.random.seed(42)
num_points = 100
X_3D = np.random.randn(num_points, 3)

# 3D -&amp;gt; 2D로 투영할 가우시안 랜덤 행렬 생성 (3x2)
P = np.random.normal(loc=0, scale=1/np.sqrt(2), size=(3, 2))

# 차원 축소: [100 x 3] @ [3 x 2] = [100 x 2]
X_2D = X_3D @ P

# 시각화
fig = plt.figure(figsize=(12, 5))

# 원래 3D 데이터
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
ax1.scatter(X_3D[:, 0], X_3D[:, 1], X_3D[:, 2], c='blue', alpha=0.6)
ax1.set_title(&quot;Original 3D Data&quot;)
ax1.set_xlabel(&quot;X&quot;)
ax1.set_ylabel(&quot;Y&quot;)
ax1.set_zlabel(&quot;Z&quot;)

# 투영된 2D 데이터
ax2 = fig.add_subplot(1, 2, 2)
ax2.scatter(X_2D[:, 0], X_2D[:, 1], c='red', alpha=0.6)
ax2.set_title(&quot;Projected 2D Data (via Random Gaussian Projection)&quot;)
ax2.set_xlabel(&quot;Proj Axis 1&quot;)
ax2.set_ylabel(&quot;Proj Axis 2&quot;)
ax2.grid(True)

plt.tight_layout()
plt.show()​&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b78KgH/btsNorJp3tA/ZGfFKbObWYqzNQEQ6IHuPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b78KgH/btsNorJp3tA/ZGfFKbObWYqzNQEQ6IHuPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b78KgH/btsNorJp3tA/ZGfFKbObWYqzNQEQ6IHuPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb78KgH%2FbtsNorJp3tA%2FZGfFKbObWYqzNQEQ6IHuPK%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;1114&quot; height=&quot;490&quot; data-origin-width=&quot;1114&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Performer입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention(Q, K, V)&amp;asymp;ϕ(Q)&amp;sdot;(ϕ(K) TV)으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;이렇게 하면 O(N) 연산만으로 계산할 수 있다고 합니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;kernel Trick + Random Fourier Feature를 사용하는 데, softmax커널을 근사할 수 있는 양수 random feature함수 &lt;span&gt;&lt;span&gt;ϕ를 사용하는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1ogW/btsNpy3vi44/kuUeiy9fttQJkLQaRNoXqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1ogW/btsNpy3vi44/kuUeiy9fttQJkLQaRNoXqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1ogW/btsNpy3vi44/kuUeiy9fttQJkLQaRNoXqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1ogW%2FbtsNpy3vi44%2FkuUeiy9fttQJkLQaRNoXqk%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;461&quot; height=&quot;139&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;dot-product가 시퀀스 길이가 길어질수록 계산 비용이 많이 들기 때문에, dot-product연산을 softmax kernel로 근사합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;즉 어텐션의 softmax연산을 커널 형태로 변환해 계산합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;이때 사용되는 softmax kernel은 가우시안 커널과 random feature map으로 근사합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;결과적으로 , 계산비용을 줄이면서도 트랜스포머의 성능을 유지할 수 있다고 합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c53DsS/btsNpZ67IFu/HA8wnD2loF2x3jgEdEwfPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c53DsS/btsNpZ67IFu/HA8wnD2loF2x3jgEdEwfPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c53DsS/btsNpZ67IFu/HA8wnD2loF2x3jgEdEwfPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc53DsS%2FbtsNpZ67IFu%2FHA8wnD2loF2x3jgEdEwfPK%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;1048&quot; height=&quot;353&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;왼쪽은 기존의 Transformer이고 오른쪽은 Performer입니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A X V를 직접 계산하지 않고 Q와 K를 각각 random feature map을 통해 변환합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변환은 Q'와 K'라는 새로운 행렬을 만듭니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 M은 random feature의 차원으로 Q와 K를 N X M으로 변환합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환된 Q'와 K'를 사용해 어텐션을 근사합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 일반적인 트랜스포머와 같이 Q X&amp;nbsp; KT를 하는 게 아니라 연산 순서를 바꿔 효율성을 높입니다 - 파란색 네모&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 시간 복잡도는 O(NMD)로 표준 어텐션의 O(N^2D) 보다 효율적입니다&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;15.7&amp;nbsp;Language&amp;nbsp;models&amp;nbsp;and&amp;nbsp;unsupervised&amp;nbsp;representation&amp;nbsp;learning&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN과 autoregressive transformer는 언어 모델입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 언어모델은 시퀀스 데이터를 생성하는 모델로, 확률 분포를 학습합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBNtwY/btsNpEW3bIA/vR0rfGHAMEKxG5deQpY8Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBNtwY/btsNpEW3bIA/vR0rfGHAMEKxG5deQpY8Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBNtwY/btsNpEW3bIA/vR0rfGHAMEKxG5deQpY8Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBNtwY%2FbtsNpEW3bIA%2FvR0rfGHAMEKxG5deQpY8Jk%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;417&quot; height=&quot;46&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;46&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;여기서 x는 단어 또는 이산토큰(discrete token)입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p는 이전 토큰들을 조건으로 다음 토큰의 확률을 예측합니다&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;text의 continuous vector representation으로는 ht가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 녀석은 문장의 앞에 등장한 단어들에 의존하므로, 문맥 정보를 포함하며 이 벡터는 contextual word embedding으로 사용되며 텍스트 분류나 seq2 seq작업에 활용됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 unsupervised 방식으로 대규모 텍스트 코퍼스에서 pre-train 할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 지도학습 방식으로 소규모 라벨링 된 작업별 데이터셋에서 fine tuning을 하는 과정을 transfer learning이라 합니다&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;만약 언어 모델의 주 목표가 텍스트 생성이 아니라 transfer learning을 위한 표현계산이라면, non-causal 모델로 대체할 수 있습니다. 이 모델은 문장을 생성하지 않고, representation을 계산하는 데 초점을 맞추며 ht는 과거, 현재, 미래의 정보를 모두 반영해 더 많은 문맥을 고려하므로 더 나은 표현을 만들 수 있습니다&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;이런 non-casual model로는 BERT가 있습니다&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;15.7.1&amp;nbsp;ELMo&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문맥 정보를 포함하기 위해서는 기존에 Bidirectional RNN이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 Forward RNN과 Backward RNN을 concatenation 하여 만들어진 ht가 과거와 미래의 문맥을 모두 반영한다는 의미를 가지는 모델입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ELMo는 양방향 LSTM이 기반이며 핵심은 모든 LSTM층의 출력을 weighted sum 하여 단어 임베딩을 만듭니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 동일한 단어라도 문맥에 따라 다른 임베딩을 생성하게 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 문장 x1, x2,,, xT의 negative log likelihood를 최소화하도록 학습됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T6ENY/btsNqHLT8Dc/w9PxUK8mcUhe45zIuxg1G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T6ENY/btsNqHLT8Dc/w9PxUK8mcUhe45zIuxg1G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T6ENY/btsNqHLT8Dc/w9PxUK8mcUhe45zIuxg1G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT6ENY%2FbtsNqHLT8Dc%2Fw9PxUK8mcUhe45zIuxg1G0%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;748&quot; height=&quot;118&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측값은 왼쪽에서 오른쪽 모델이 이전 단어들을 보고 다음 단어를 예측할 확률&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측값은 오른쪽에서 왼쪽 모델이 이후 단어들을 보고 현재 단어를 예측할 확률입니다&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;세타 e는 임베딩 레이어의 공유 파라미터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세타 s는 소프트맥스 출력 레이어의 공유 파라미터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세타-&amp;gt;, &amp;lt;-는 각각 방향을 나타내는 파라미터입니다&lt;/p&gt;
&lt;div&gt;이 과정은 비지도 학습으로,대규모 텍스트 코퍼스(위키피디아)에서 수행됩니다&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 &lt;a href=&quot;https://wikidocs.net/33930&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/33930에서&lt;/a&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;453&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtnJlD/btsNqfo4hVT/dldgP09oOjTAeH7uA5wlj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtnJlD/btsNqfo4hVT/dldgP09oOjTAeH7uA5wlj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtnJlD/btsNqfo4hVT/dldgP09oOjTAeH7uA5wlj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtnJlD%2FbtsNqfo4hVT%2FdldgP09oOjTAeH7uA5wlj0%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;453&quot; height=&quot;252&quot; data-origin-width=&quot;453&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 그림에서 play라는 단어가 임베딩이 되고 있다는 가정입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순방향 언어 모델의 출력, 역방향 언어 모델의 출력을 concatenate 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 층의 출력값 별로 가중치를 주어 더한 뒤 스칼라 매개변수를 곱한다고 합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLe4Rr/btsNpEb0p5P/xejqK2RuGd8QvZmndfSC40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLe4Rr/btsNpEb0p5P/xejqK2RuGd8QvZmndfSC40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLe4Rr/btsNpEb0p5P/xejqK2RuGd8QvZmndfSC40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLe4Rr%2FbtsNpEb0p5P%2FxejqK2RuGd8QvZmndfSC40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;710&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 완성된 벡터를 ELMo representation이라고 합니다. ELMo representation을 기존의 임베딩 벡터와 함께 사용할 수 있다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 방법론을 사용한 임베딩 벡터를 준비했다면 ELMo표현을 임베딩벡터와 concatenate 해서 입력으로 사용하여 NLP task에 입력되는 원리입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxprTG/btsNrf87Hcw/IHblInAJWlEyZni0w6Ym40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxprTG/btsNrf87Hcw/IHblInAJWlEyZni0w6Ym40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxprTG/btsNrf87Hcw/IHblInAJWlEyZni0w6Ym40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxprTG%2FbtsNrf87Hcw%2FIHblInAJWlEyZni0w6Ym40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;370&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;370&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;정리하자면 ELMo는 양방향 LSTM을 사용해 문장을 두 방향으로 처리하며 결과적으로 각 단어를 문맥에 따라 동적으로 벡터로 표현합니다.(임베딩) 이를 contextualized embedding이라고 부르며 위에서 언급했던 non-causal model로 대규모 텍스트로 학습되며 fine-tuning으로 다양한 NLP작업에 활용됩니다&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;15.7.2&amp;nbsp;BERT&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT 떴냐...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT는 너무 중요한 만큼 책에서도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.7.2.1 Masked&amp;nbsp;language&amp;nbsp;model&amp;nbsp;task&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.7.2.2 Next sentence prediction task&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15.7.2.3 Fine-tuning BERT for NLP applications&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 3개의 목차로 나뉘어 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 BERT는 ELMo와 같은 non-causal model로 text생성이 아닌 representation을 생성하는 모델입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ELMo는 양방향 LSTM을 사용하지만, BERT는 트랜스포머 인코더를 사용해 더 강력한 문맥 학습이 가능합니다&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;BERT의 학습방식은 fill-in-the-blank (=cloze task)입니다. 입력 시퀀스의 일부단어를 마스크로 대체하거나 생략합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델은 마스크 된 위치의 원래 단어를 예측하는 작업을 수행합니다&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15.7.2.1 Masked language model task&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BERT의 학습은 negative log pseudo-likelihood를 최소화하도록 학습됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDik5/btsNrs1wyJp/Rt89s2TAqXrsLmUiNLl8z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDik5/btsNrs1wyJp/Rt89s2TAqXrsLmUiNLl8z1/img.png&quot; data-alt=&quot;negative log pseudo-likelihood&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDik5/btsNrs1wyJp/Rt89s2TAqXrsLmUiNLl8z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDik5%2FbtsNrs1wyJp%2FRt89s2TAqXrsLmUiNLl8z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;85&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;negative log pseudo-likelihood&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x:입력문장 데이터 분포 D에서 샘플링됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m:문장의 일부 토큰을 마스크 처리하기 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x_m:마스크 된 입력 문장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p(xi|x_m):마스크 된 문맥 x_m을 보고 원래 토큰 xi를 예측할 확률&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;교재의 예시에는 &quot;Let's make some chicken! It takes great with orange sauce!&quot;라는 원문이 있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마스크 된 입력은 &quot;Let's make [MASK] chiken! [SEP] It [MASK] great with orange sauce&quot;입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 [MASK]는 원래 단어를 가린 토큰 [SEP]은 두 문장을 구분하는 특수 토큰입니다&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에서 원래 토큰 xi를 예측할 확률은 소프트맥스를 사용해 계산됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CnL50/btsNmFhLKnj/HVJid7XZmoswG414M1TYY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CnL50/btsNmFhLKnj/HVJid7XZmoswG414M1TYY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CnL50/btsNmFhLKnj/HVJid7XZmoswG414M1TYY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCnL50%2FbtsNmFhLKnj%2FHVJid7XZmoswG414M1TYY0%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;411&quot; height=&quot;103&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h(x)는 트랜스포머의 마지막 레이어에서 위치 i의 숨겨진 벡터입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작은 트랜스포머가 마스크 된 문장 xhat을 입력받아 각 위치의 숨겨진 벡터 h(x)를 생성하면 이 벡터를 단어 사전의 임베딩 e(x)와 내적하여 단어 xi의 점수를 계산합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마스크된 위치에서 원래 단어의 확률을 최대화하도록 학습됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 학습 방식을 Masked Language Model(MLM)이라고 불립니다&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;15.7.2.2&amp;nbsp;Next&amp;nbsp;sentence&amp;nbsp;prediction&amp;nbsp;task&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델의 pre-training과정에서 사용되는 두 가지 목표 중 두 번째인 Next Sentence Prediction(NSP) 작업에 대한 내용입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NSP 두 문장이 주어졌을 때, 두 번째 문장이 첫 번째 문장을 실제로 이어지는 문장인지 랜덤한 문장인지 분류하는 작업입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력형식은 &lt;span&gt;&lt;span&gt;[CLS]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;[SEP]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&amp;hellip;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; [SEP] 으로 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;CLS는 분류 작업을 위한 토큰 -&amp;gt; 이 위치의 출력이 NSP분류에 사용&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;SEP은 두 문장을 구분하는 특수 토큰&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;만약 문장 B가 실제로 이어지는 경우 y=1,아니라면 y=0 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdTrJP/btsNrkQwu55/Vmu5aAkkEj4ciNkYfCUnKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdTrJP/btsNrkQwu55/Vmu5aAkkEj4ciNkYfCUnKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdTrJP/btsNrkQwu55/Vmu5aAkkEj4ciNkYfCUnKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdTrJP%2FbtsNrkQwu55%2FVmu5aAkkEj4ciNkYfCUnKK%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;1043&quot; height=&quot;334&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;NSP는 BERT가 문장 간의 관계를 이해하도록 돕습니다. 이는 문장 쌍 분류 작업에 유용하며 NSP를 수행할때 입력을 3가지 임베딩으로 표현합니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;1.Token embedding -&amp;gt;단어 사전에서 각 토큰에 해당하는 고차원 벡터&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;2.segment embedding -&amp;gt;문장 A와 B를 구분하기 위한 임베딩&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;3.positional embedding -&amp;gt;각 단어들의 순서&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;이 3가지 임베딩이 더해져 최종 입력 임베딩을 형성합니다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15.7.2.3&amp;nbsp;Fine-tuning&amp;nbsp;BERT&amp;nbsp;for&amp;nbsp;NLP&amp;nbsp;applications&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 사전학습된 후 supervised fine-tuning을 통해 다양하게 조정됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 transfer learning의 일종으로,사전 학습된 지식을 특정 작업에 적용합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehXwrE/btsNqFgUXtM/KwnuUK9frNI6AF4w16ksjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehXwrE/btsNqFgUXtM/KwnuUK9frNI6AF4w16ksjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehXwrE/btsNqFgUXtM/KwnuUK9frNI6AF4w16ksjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehXwrE%2FbtsNqFgUXtM%2FKwnuUK9frNI6AF4w16ksjk%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;1020&quot; height=&quot;759&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a : 단일 문장 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-CLS 벡터를 MLP에 입력해 원하는 레이블 공간으로 매핑 ex)CLS벡터-&amp;gt;MLP-&amp;gt;&quot;긍정&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b : 문장 쌍 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-textual entailment(문장 A가 B를 암시하는지 판단) 또는 텍스트 유사성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;[CLS] 문장 A [SEP] 문장 B [SEP]&quot; 을 입력으로 함 ex)CLS 벡터 &amp;rarr; MLP &amp;rarr;&amp;nbsp; &quot;암시&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c : 단일 문장 태깅&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;ex)품사 태깅&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;d : 질의 응답&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-질문과 배경 텍스트를 받아 답변의 시작과 끝 위치를 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문(문장 A) + 배경 텍스트(문장 B) -&amp;gt; 두 개의 MLP -&amp;gt;시작위치 s + 끝 위치 e를 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://colab.research.google.com/github/probml/pyprobml/blob/master/notebooks/book1/15/bert_torch.ipynb#scrollTo=rR_b5f2Em4Mh&quot;&gt;bert-torch.ipynb - Colab&lt;/a&gt; 에서 실습을 할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15.7.3 GPT&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT는 &quot;Generative Pre-training Transformer&quot; 의 약자로 transformer의 decode를 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT는 causal모델로 미래의 토큰은 참고하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 BERT와 다른 방식으로 그림을 보면 이런 차이가 있습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmz9q/btsNspkX4K0/8fJoay7xgD6fK1NecEHq3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmz9q/btsNspkX4K0/8fJoay7xgD6fK1NecEHq3k/img.png&quot; data-alt=&quot;BERT:non-causal GPT:causal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmz9q/btsNspkX4K0/8fJoay7xgD6fK1NecEHq3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpmz9q%2FbtsNspkX4K0%2F8fJoay7xgD6fK1NecEHq3k%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;954&quot; height=&quot;330&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BERT:non-causal GPT:causal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Loss함수는 L&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;cls&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lambda;&lt;/span&gt;&lt;span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;LM&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​ 으로 정의되었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Lcls는 입력x에 대해 정답y를 예측&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lambda;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;L&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;LM는 다음 토큰을 예측할 loss인데 &amp;lambda;를 곱해서 중요도를 조절한다고 합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;GPT를 기반으로 GPT-2, GPT-3,CPT-4.0 이 등장했고 CHATGPT에서는 RLHF를 도입했습니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;15.7.3.1&amp;nbsp;Applications&amp;nbsp;of&amp;nbsp;GPT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;GPT는 사용자가 프롬프트에 질문을 입력하면 zero-shot task transfer을 통해 질문에 답을 합니다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 GPT가 학습하지 못한 것에 대해서도 답을 하는데, 이를 zero-shot task transfer이라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 zero-shot learning을 통해 가능한 것인데 &lt;a href=&quot;https://youtu.be/OTwS7UaoGdg?si=As2eaUAH_-HHuKNu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/OTwS7UaoGdg?si=As2eaUAH_-HHuKNu&lt;/a&gt;를 참고했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zero shot learning은 seen data와 unseen data를 모두 올바르게 예측하는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 고양이,고래,사자가 학습된 모델에게 호랑이 이미지를 주었을 때 어떻게 분류할 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 classification 모델 : 고양이 or 사자 (seen data로 분류)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zero-shot learning : 호랑이 (보지 못한건데 정확히 분류)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open set recognition : unseen (보지 못한건 unseen으로 분류)&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;Zero-shot learning의 구성요소는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image,class label,side-information입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;side-information의 종류는 다양한데 예시로는 먼저 attributes가 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼룩말 이미지라면 attributes는 black-stripe, tall,등이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 사람이 직접 입력하거나 위키피디아와 같은 코퍼스에서 추출도 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째로 hierachy similarity measures으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 클래스와 얼마나 정보가 유사한지를 나타내는 것으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말이랑 1, 악어랑 4 이런식으로 가능합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째로 huma gaze로 사람의 눈이 어디에 얼마나 많이 가는지를 격자로 나타내어 표현할 수 있습니다&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;이외에도 다양한 side-information이 있는데, 이미지와 레이블 간 연결고리 역할을 하게됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;attributes를 side-information으로 사용하여 학습하는 approach인 embedding-based approach를 설명하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 이미지에 대한 속성은 고차원의 벡터로 표현이 되는 방식입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 속성 덕분에 이미지가 없는 상황에서도 클래스에 대한 정보를 담는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://papers.nips.cc/paper_files/paper/2013/file/7cce53cf90577442771720a370c3c723-Paper.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://papers.nips.cc/paper_files/paper/2013/file/7cce53cf90577442771720a370c3c723-Paper.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 구글이 발표한 embedding-based approach에 대한 논문입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문이 제안하는 모델은 이미지 모델과 텍스트 모델이 합쳐지는 형태로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AlexNet과 Skip-gram으로 pre-training하여 결합된 모델은 AlexNet의 n차원 feature vector를 Skip-gram 고유의 m차원으로 선형변환하여 같은 공간 상에 매핑합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 4096차원의 이미지 feature vector를&amp;nbsp; 500/1000차원으로 선형변환하였습니다&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;&lt;b&gt;15.7.4 T5&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T5모델은 인코더-디코더,seq2seq모델로 마스크된 토큰을 예측합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;denoising을 목표로 하는 모델은 T5는 입력 텍스트 x에 마스크를 적용해 x'를 만들고, 누락된 부분 x''를 예측하도록 만듭니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;non-causal모델과는 다르게 입력 전체를 보고 출력 시퀀스를 생성합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/5</guid>
      <comments>https://leejeong6.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 17 Apr 2025 10:35:44 +0900</pubDate>
    </item>
    <item>
      <title>MMED-RAG논문 리뷰</title>
      <link>https://leejeong6.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MMED-RAG논문 리뷰입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arxiv.org/pdf/2410.13085&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arxiv.org/pdf/2410.13085&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ABSTRACT&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;Medical Large Vision-Language Model(Med-LVLMs)는 종종 hallucination문제를 겪는데, 이는 잘못된 진단으로 이어져서 치명적일 수 있습니다. RAG가 이를 해결하는 하나의 방법이지만 기존 RAG기반 접근법은 다양한 의료 도메인에 일반화되지 않았습니다. 이 논문에서는 멀티모달 RAG시스템으로 Med-LVLMs의 정확성을 높이는 접근법을 연구했다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 MMed-RAG가 Med-LVLMs의 정확성을 평균 43.9%향상시킬 수 있었고 데이터와 코드는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/richard-peng-xia/MMed-RAG.&quot;&gt;https://github.com/richard-peng-xia/MMed-RAG&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서 확인할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;INTRODUCTION&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI의 발전은 혁신적이며 큰 잠재력을 보여주었습니다. 하지만 현재 Med-LVLMs는 여전히 신뢰성 문제, 특히 사실이 아닌 의료 응답을 생성하는 심각한 문제를 직면하는데, 작은 진단 오류조차도 환자 치료에는 심각한 결과를 초래할 수 있는 게 현실입니다.&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;최근 연구자들은 fine-tuning,RAG를 개선하려고 노력했지만 몇 가지 한계에 직면했다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의료 도메인에서 fine-tuning에 필요한 충분한 고품질 라벨링 데이터가 부족하다고 합니다. 또한 훈련 데이터와 실제 데이터 사이에 distribution gap이 존재하여 배포 시 모델 성능을 크게 저하시킨다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더군다나 현재 Med-LVLMs에서의 RAG구현은 한계가 있고 데이터셋에 특화된 경향이 있어 다양한 의료 도메인에 걸쳐 일반화 가능성이 떨어집니다. misalignment 문제도 존재하는데 &lt;i&gt;cross-modality alignment&lt;/i&gt; 와&lt;i&gt; overall alignment&lt;/i&gt; 가 오류를 일으킨다고 합니다. 여기까지 읽어봤을 때는 MMed-RAG가 이 문제들을 어떻게 해결할 지 정말 궁금해집니다.&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;이러한 문제를 해결하기 위해, versatile factual Multimodal Medical RAG system (MMed-RAG)를 제안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구체적으로, MMed-RAG는 다양한 의료 이미지 도메인을 효과적으로 처리하도록 설계된 &lt;b&gt;domain-aware retrieval mechanism&lt;/b&gt; 을 도입합니다. 입력된 의료 이미지를 기반으로 검색 모델을 adaptively하게 선택하는 &lt;b&gt;domain identification module&lt;/b&gt;도 디자인했습니다. 검색된 컨텍스트의 수를 선택하기 위해 &lt;b&gt;adaptive calibration approach&lt;/b&gt;를 포함하며, 마지막으로 RAG-based preference fine-tuning를 통합하여 alignment를 강화한다고 합니다 preference pairs는 두 가지 목표를 달성하도록 설계되었는데, 첫째, 모델이 입력된 의료 이미지를 활용하지 않고 응답을 생성하지 않도록 하여 모달리티 간 alignment를 개선합니다. 둘째, 모델이 불확실할 때 검색된 컨텍스트를 이해하도록 하여 관련 없는 검색 정보로 인한 간섭을 피함으로써 overall alignment를 개선합니다.&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;Introduction의 마지막 문단에서 MMed-RAG를 처음으로 소개하며 문제를 어떻게 극복했는지에 대해 간략히 설명했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간략히 정리하자면 MMed-RAG는 문제를 극복하기 위해&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;도메인 인식 검색 메커니즘을 도입 -&amp;gt; ex)방사선 이미지와 안과 이미지는 완전히 다르니까, 도메인별로 적합한 RAG를 선택&lt;/li&gt;
&lt;li&gt;적응형 컨텍스트 선택 -&amp;gt; 너무 많은 컨텍스트 참조하면 혼란스럽고 너무 적으면 부족하니 상황에 맞게 조절&lt;/li&gt;
&lt;li&gt;RAG기반 선호도 미세 조정 -&amp;gt; &lt;b&gt;모달리티 간 정합성&lt;/b&gt;:이미지 입력을 반드시 활용하도록 유도, &lt;b&gt;전체 정합성&lt;/b&gt;:불확실할 때 검색 컨텍스트 활용하고,관련없는 정보는 배제&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 문단까지 정리해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMed-RAG는 이러한 방법으로 의료 VQA작업에서 18.5%,보고서 생성 작업에서 69.1%의 성능 향상을 달성했음을 보여주며, 이 실험은 다섯 개의 의료 데이터셋(방사선,병리학,안과학)에서 평가했다고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;보고서 생성에서 매우 큰 성능 향상을 볼 수 있는데 이는 앞에서 MMed-RAG가 컨텍스트를 잘 선택하는 그 능력을 뒷받침하는 결과라고 생각이 됩니다. 그런데 다섯 개의 의료 데이터셋이 얼마나 다양한 케이스를 포함하는지,특히 드물거나 복잡한 질병 사례에서도 잘 적용이 되는지, 이 향상이 실제 임상에서도 유의미 한지 궁금해집니다. 왜냐하면 앞에서 훈련데이터와 실제 데이터 간의 차이와 그로 인한 결과가 큰 영향을 미친다고 했기 때문입니다. 논문의 뒷부분은 이러한 궁금증을 안고 차근차근 읽어보겠습니다&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;PRELIMINARIES&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;preference optimization에 대한 간략한 개요입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Med-LVLMs는 LLM에 의료 비전 모듈을 결합한 모델로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력: 의료 이미지 xv + 임상 질의 xt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력: 다음 토큰의 확률 분포를 예측하여 텍스트 y생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력은 autogressive 방식으로 예측할 수 있다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;autogressive방식은 텍스트 생성과정이 단계적으로 이루어진다는 걸 의미하는데, 이는 굉장히 중요하다고 생각하는 게 잘못된 초기 토큰 예측이 이후 전체 출력에 영향을 미칠 수 있기 때문입니다.&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;Preference Optimization은 LLM의 alignment에서 놀라운 결과를 달성했다고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 인기를 얻은 DPO는 선호도 데이터를 활용하여 LLM의 목표 정합성을 달성합니다.&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;1180&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck42DP/btsNiZlqv6h/hVlZXMV2rpmLjKeZdDD7q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck42DP/btsNiZlqv6h/hVlZXMV2rpmLjKeZdDD7q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck42DP/btsNiZlqv6h/hVlZXMV2rpmLjKeZdDD7q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck42DP%2FbtsNiZlqv6h%2FhVlZXMV2rpmLjKeZdDD7q1%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;1180&quot; height=&quot;91&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPO에서 최적화는 선호도에 대한 classification loss로 위와 같이 표현된다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선호도 데이터 D = {(x,yw,yl)}을 사용하며 yw는 선호되는 응답 yl은 비선호 응답이라고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Loss는 모델이 선호되는 응답을 생성하도록 학습된다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그모이드 함수를 사용해 선호도 쌍의 상대적 우위를 계산하고, 이를 손실함수로 변환해 모델을 최적화 하는 방식은 모델이 &quot;좋은 응답&quot;과 &quot;나쁜 응답&quot;을 명확히 구분하도록 도와주는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPO도 잘 몰랐고 수식이 너무 어려워서 저는 &lt;a href=&quot;https://dalpo0814.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dalpo0814.tistory.com/62&lt;/a&gt; 이곳에서 따로 공부를 했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DPO는 reward model없이, RL없이 LLM policy model만을 학습하여 사람의 선호도를 반영한 문장을 생성하도록 LLM을 직접적을 최적화하는 알고리즘이라고 합니다.&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;DPO손실 함수를 조금 더 뜯어보겠습니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델에게 입력 x(예: 의료 이미지와 질문)이 주어졌을 때, 두가지 응답이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yw : &quot;좋은&quot;응답(사실적,적절함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yl : &quot;나쁜&quot;응답(부정확,덜 적절)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 : yw를 생성할 확률을 높이고 yl을 생성할 확률을 낮추는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 (yw,yl)이라는 선호도 쌍을 데이터로 사용해서 모델을 학습시킨다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;theta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;):현재 학습 중인 모델이 입력x에 대해 출력 y를 생성할 확률&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 기준 모델(참조 모델)의 확률. 이건 이미 감독 학습으로 미세 조정된 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 이제 조합해서 보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj6zwi/btsNjFUXwdQ/VmQPQpuGtAFImCavRgA5Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj6zwi/btsNjFUXwdQ/VmQPQpuGtAFImCavRgA5Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj6zwi/btsNjFUXwdQ/VmQPQpuGtAFImCavRgA5Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj6zwi%2FbtsNjFUXwdQ%2FVmQPQpuGtAFImCavRgA5Z0%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;555&quot; height=&quot;114&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;86&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 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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 모델이 yw를 60%확률로 낸다면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;theta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(yw∣x): 0.6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yl은 0.3이라면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;theta;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;(yl∣x): 0.3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준 모델은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;yw&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;:0.5, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;yl&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;: 0.4라고 해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 기준 모델은 이미 어느정도 학습된 모델이지만, 우리가 원하는 만큼 정확하지 않기 때문에 현재 모델 ㅠ를 개선하려고 하는 것을 인지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 항은 log(1.2) 대충 0.2입니다. 이 값은 현재 모델이 기준 모델보다 yw를 더 잘 생성하고 있는 정도겠네요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 항은 log(0.75) 대충 -0.2입니다. 알파는 1이라고 가정하고 계산하면 0.4입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값은 모델이 yw를 yl보다 얼마나 더 선호하는지를 나타내며 양수니까 모델이 이미 올바른 방향으로 가고 있긴 하지만 개선 여지가 있다는 뜻이겠네요, 왜냐하면 가장 완벽한 모델은 yw가 1 yl이 0에 가까울테니까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이 시그모이드에 넣어 확률로 변환되면 0.5보다 큰 값을 가질테고 다시 log에 들어가면 1보다 반드시 작으므로(시그모이드의 출력은 0~1) 음수 값을 가집니다. 그런데 앞에 또 -가 붙으니까 결국 L_DPO = 0.45 이런식으로 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값은 역전파 과정을 통해 policy를 업데이트 하게 될테고, 이는 yw가 커지도록,yl이 작아지도록 학습될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;MMed-RAG&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMed-RAG는 Med-VLMs의 사실성을 높이기 위한 시스템으로, 3가지 모듈로 구성됩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;MMED-RAG: A VERSATILE MEDICAL RAG SYSTEM&lt;/li&gt;
&lt;li&gt;ADAPTIVE RETRIEVED CONTEXT SELECTION&lt;/li&gt;
&lt;li&gt;RAG-BASED PREFERENCE FINE-TUNING&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 세 가지 상호보완적인 모듈로 구성되는 MMed-RAG를 자세하게 설명하는 부분입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;3.1 MMED-RAG: A VERSATILE MEDICAL RAG SYSTEM&lt;/blockquote&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;1161&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NsmFu/btsNkWPqFuI/efUuHzzTiAQ6LmLnUK00s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NsmFu/btsNkWPqFuI/efUuHzzTiAQ6LmLnUK00s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NsmFu/btsNkWPqFuI/efUuHzzTiAQ6LmLnUK00s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNsmFu%2FbtsNkWPqFuI%2FefUuHzzTiAQ6LmLnUK00s0%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;1161&quot; height=&quot;507&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 의료 이미지를 도메인 label을 지정하는 domain identification module을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의료 이미지를 입력으로, 해당 도메인 레이블을 출력으로 하는 소규모 데이터세을 만들어 BiomedCLIP모델을 fine-tuning하여 도메인 인식 능력을 향상시킵니다. BiomedCLIP모델은 주어진 입력이미지 Xv에 대해 도메인d=F(Xv)를 예측합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 도메인별 검색기 Rd는 대조학습으로 학습되며 Ximg,Xtxt는 각각의 인코더 Eimg,Etxt에 의해 처리되어 텍스트 임베딩 Vtxt = Etxt(Xtxt)와 시각 임베딩 Vimg = Eimg(Ximg)를 생성합니다. 이후 이미지 Xv에 대해 상위 k개의 유사한 보고서 xr을 검색하여 검색된 보고서는 Med-LVLM의 생성과정에 참조로 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 말하는 바를 요약하자면 여러 의료 이미지를 먼저 Domain identification을 이용해서 domain을 예측하였고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용된 모델은 BiomedCLIP입니다. 이 모델은 직접 데이터셋으로 fine-tuning하였고 예측한 domain은 대조학습으로 훈련되었고 최종적으로 입력이미지 x를 학습된 Rd에 입력하면 이미지와 가장 유사한 보고서 몇개를 Med-LVLM에 제공됩니다.&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;blockquote data-ke-style=&quot;style2&quot;&gt;3.2&amp;nbsp;ADAPTIVE RETRIEVED CONTEXT SELECTION&lt;/blockquote&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;978&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PGxX1/btsNjDDxZly/0qBQy5DiGMBrYsFHRq3Xc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PGxX1/btsNjDDxZly/0qBQy5DiGMBrYsFHRq3Xc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PGxX1/btsNjDDxZly/0qBQy5DiGMBrYsFHRq3Xc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPGxX1%2FbtsNjDDxZly%2F0qBQy5DiGMBrYsFHRq3Xc0%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;978&quot; height=&quot;505&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;그림을 보면 3.1절에서 하는 말이 잘 그려져있는 것을 볼 수 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;도메인 검색 메커니즘에 이어, 컨텍스트의 최적량을 결정하는 것이 다음 문제입니다. hallucination문제가 발생할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이 저자는 검색된 컨텍스트의 유사도 점수를 기반으로 k를 동적으로 선택하는 adaptive method를 제안합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;기존에 fixed-k method는 검색 과정에서 생성된 유사도 점수를 무시하기 때문에 최적의 성능을 보장하지 못하기 때문이라고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baXKi1/btsNi0zdq6X/zDgOKYvKlS4aqldwDdxHZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baXKi1/btsNi0zdq6X/zDgOKYvKlS4aqldwDdxHZk/img.png&quot; data-alt=&quot;fixed-k report&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baXKi1/btsNi0zdq6X/zDgOKYvKlS4aqldwDdxHZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaXKi1%2FbtsNi0zdq6X%2FzDgOKYvKlS4aqldwDdxHZk%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;275&quot; height=&quot;180&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fixed-k report&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;검색된 컨텍스트 간의 유사도 점수는 특정 결과 수 이후에 급격히 하락하는 경향이 있습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이는 fixed-k를 사용할때, 특히 k값이 너무 클 때, 상위 k개의 컨텍스트에 저품질 정보가 포함될 수 있음을 시사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이 문제를 완화하기 위해, Gap통계 방법에서 영감을 받아 상위 k개의 컨텍스트를 검색한 후, 연속적인 검색 결과 간의 similarity ratio을 분석하여 k최적화를 추가로 수행합니다. 유사도 비율 u = log(Si / Si+1)로 정의되며 여기서 Si는 i번째 검색 컨텍스트의 유사도 점수이고&amp;nbsp; 0&amp;lt;i&amp;lt;=k입니다. u가 미리 정의된 임계값을 초과하면 관련성이 크게 떨어졌음을 나타내며, 이후의 검색 결과는 모델 출력에 기여할 가능성이 낮습니다. 이 시점에서 k를 잘라내어 덜 관련성 있는 후속 검색 결과를 효과적으로 제외한다고 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;이 방법은 가장 관련성 높은 컨텍스트만을 유지하여 최종 응답 생성에 사용함으로써 환각 위험을 줄이고 출력의 사실적 정확도를 개선한다고 합니다. 임계값은 고정되어있지만 검색된 컨텍스트의 편향과 분산을 균형 있게 조절하는 방법으로 전반적인 성능을 향상시킨다고 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;요약하자면 fixed -k method는 유사도 점수 분포를 무시해 저품질 컨텍스트를 포함할 수 있기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;검색된 컨텍스트와 유사도 점수S를 분석해서 관련성이 하락하는 지점을 임계값을 통해 알아낸 뒤 저품질 컨텍스트를 제외하는 방법을 도입하였습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;임계값이 데이터셋마다 다를수도있고 특정 돔인에서 다를 수도 있는데 어떻게 정했는지 궁금합니다. 그리고 이 방법이 메모리나 cost면에서 어떤 효율이 있을지도 궁금하네요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;3.3 RAG-BASED PREFERENCE FINE-TUNING&lt;/blockquote&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;955&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg9gg1/btsNk3nhWsa/jrNAcDBJ0434wOG2Ldkih1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg9gg1/btsNk3nhWsa/jrNAcDBJ0434wOG2Ldkih1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg9gg1/btsNk3nhWsa/jrNAcDBJ0434wOG2Ldkih1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg9gg1%2FbtsNk3nhWsa%2FjrNAcDBJ0434wOG2Ldkih1%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;955&quot; height=&quot;323&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;MMed-RAG는 Med-LVLM에 신뢰할 수 있는 검색된 정보를 제공합니다. 그러나 이렇게 검색된 정보를 통합하는 과정은 alignment를 방해할 수 있다고 합니다 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;LLaVa-Med-1.5모델을 사용해 &lt;/span&gt;Harvard-FairVLMed 데이터셋에 두 가지 테스트를 수행했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.Modality alignment test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 원본 이미지를 노이즈가 심한 이미지로 대체 -&amp;gt; 원래 모델은 잘못된 답변&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- RAG적용 후 : 55.08%가 원본 이미지 기반 답변 -&amp;gt; 모델이 이미지를 무시하고 검색 컨텍스트에 의존&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.Overall alignment test&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- RAG적용 후 원래 맞던 답변의 43.31%가 틀림 -&amp;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;이런 alignment문제는 RAG기반 선호도 미세조정(RAG-PT)를 통해 해결한다고 합니다&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;사실 여기서 말하는 두 가지 문제는 저도 RAG기법을 처음 들어봤을때부터 예상핶던 문제였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 이 실험결과인 43.31%가 원래 맞는데 틀리게 되었다는 게 가장 충격적입니다. 오히려 검색된 정보가 모델을 혼란스럽게 하다니,, 사실 RAG는 LLM의 환각 문제를 해결하는 대안 중 하나인데 결과로만 보면 오히려 환각을 만들고 있었을수도 있겠네요&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;Preference pairs for Cross-Modality Alignment&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;방금 위에서 말한 alignment 중 Cross-Modality문제를 어떻게 조정하냐에 대한 부분입니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;선호되는 응답(Pi)와 비선호되는 응답(Ni)를 통해 선호도 쌍 Dcm으로 모델이 이미지 입력을 우선시하도록 학습됩니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;선호되는 응답 Pi는 모델이 이미지 Xv와 검색 정보 x를 사용해 올바른 답변 y를 생성&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;비선호 응답Ni는 관련없는 이미지 X'v로 올바른 답변을 내는 경우&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;만약 모델이 방사선 이미지를 보고 폐렴을 정확히 진단하면 Pi입니다. 하지만 노이즈로 뒤덮인 엉뚱한 이미지에서도 검색된 보고서만 믿고 폐렴이라고 말하면 Ni로 간주합니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;unrelated images X'v는 두 개의 과정을 통해 만들어집니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1.retreiver을 사용하여 대상 이미지와 유사도가 가장 낮은 이미지 X'v를 선택합니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2.선택된 관련 없는 이미지에 diffusion noise를 추가합니다&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;420&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZK6cr/btsNjh1TAvd/3u9bnjWHzK6ec85esl07i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZK6cr/btsNjh1TAvd/3u9bnjWHzK6ec85esl07i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZK6cr/btsNjh1TAvd/3u9bnjWHzK6ec85esl07i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZK6cr%2FbtsNjh1TAvd%2F3u9bnjWHzK6ec85esl07i1%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;420&quot; height=&quot;97&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이 식은 확산 모델에서 쓰이는 방식이라고 합니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;X*v :&amp;nbsp; 최종적으로 생성된 이미지&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;X'v : retreiver로 선택한,원본 이미지와 유사도가 가장 낮은 이미지&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;epislon : 무작위 노이즈&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Es : 노이즈 스케일링 파라미터,0~1사이 값으로 노이즈를 얼마나 많이 추가할지를 나타내는 단계&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;논문에서는 retreiver를 사용해 원본이미지 Xv와 유사도가 가장 낮은 이미지 X'v를 찾습니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;예를 들어 Retriever가 데이터베이스에서 발목 X-ray이미지를 x'v로 선택했다고 하면&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;폐렴과 관련이 매우 적으니 유사도가 낮겠습니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이제 발목 X-ray사진인 x'v에 노이즈를 추가해서 더 관련없고 혼란스러운 이미지 x*v를 만듭니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이게 저 식이 하는 방법입니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;E값이 1에 가까우면 좌변만 남으므로 원래 이미지가 많이남고, 0에 가까우면 노이즈가 많이 들어갑니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이렇게 하는 이유는 직관적인 것 같습니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;모델이 이미지 입력을 무시하고 검색된 정보에만 의존하는지 테스트하기 위함입니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;앞에서 실험결과가 보여주듯이 원래 맞던 결과가 RAG로 인해 43.31%나 틀린다는 것은&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;반드시 고쳐야 하는 과제였을 것입니다. 따라서 관련성 없는 이미지에 노이즈까지 추가하여 검색 정보에 의존하는 문제를 줄여나가려는 저자의 의도가 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; Preference Pairs for Overall Alignment &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 두 가지 subset으로 overall alignment를 개선한다고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 서브셋은 D1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D1의 목표는 검색된 지식에 대한 모델의 이해와 추론 능력을 강화하는 것으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선호되는 응답과 비선호되는 응답을 비교함으로써 모델이 검색된 정보를 더 잘 이해하고 RAG의 효과를 개선합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선호되는 응답은 모델이 원본 이미지와 Retrieval정볼르 모두 사용해 올바르게 답한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비선호 응답은 모델이 Retrieval 정보를 사용하지 않고 이미지에만 기반하여 잘못된 답을 하는 경우&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;두 번째 서브세은 D2입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D2의 목표는 검색된 지식으로 인한 간섭을 완화하는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선호되는 응답은 모델이 검색 정보 없이 원본 이미지에만 기반하여 올바르게 답한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비선호 응답은 모델이 이미지,검색 정보 모두 사용했음에도 잘못 답변한 경우&lt;/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;Preference pairs인 Doa = D1과 D2의 합집합입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 구성된 선호도 데이터를 기반으로, DPO를 사용하여 Med-LVLM을 미세 조정하여,초반에 언급됐던 그 손실함수를 적용하는 것입니다&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;정리하자면 D1은 검색 정보가 유용할 때 이를 더 잘 활용하도록 돕고, D2는 검색 정보가 잘못된 경우, 모델이 내부 지식을 믿도록 유도합니다. 이 두가지가 균형을 이루면서 모델이 더 신뢰할 수 있게 되는 것 같습니다&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;예를 들어 폐렴 X-ray이미지에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D1:검색된 보고서가 &quot;페렴&quot;에 대해 정확히 설명하면, 모델이 이를 활용해 올바른 진단을 내도록 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D2:검색된 보고서가 엉뚱하게 &quot;결핵&quot;을 언급하면 , 모델이 이미지를 보고 자체적으로 올바른 진단을 유지하도록 학습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;다음으로 넘어가기 전에 지금까지 논문에서 나온 아이디어와 정보를 정리해보겠습니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;논문의 주제는 의료 비전-언어모델(Med-LVLMs)의 hallucination문제를 해결하기 위한 MMed-RAG를 제안했습닌다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Med-LVLM은 의료 이미지와 텍스트 질의를 처리해 진단이나 보고서를 생성하는 모델인데 몇가지 문제점이 있었습니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;여기서는 두 가지 문제로 정리할 수 있겠는데요, 1.Modlity alignment Problem 2.Overall alignment problem입니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Modality문제는 모델이 이미지 입력을 무시하고 Retrieval에만 의존하는 경우이고&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Overall문제는 검색된 정보가 잘못되거나 간섭을 일으켜 부정확한 응답을 생성하는 것입니다&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;또한 generalize문제도 있었습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;저자는 이런 문제점들을 해결하기 위해 &lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Domain Aware Retrieval Mechanism&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Adaptive Retrieved Context Selection&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;RAG-based preference fine-tuning&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;으로 총 3가지 모듈로 구성된 MMed-RAG를 제안합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Domain Aware Retrieval Mechanism은 BiomedCLIP 모델을 미세 조정해 의료 이미지를 도메인으로 분류하고, 각 도메인별로 특화된 다중모달 검색기 Rd를 사용합니다. contrastive learning으로 이미지-텍스트 임베딩 간 유사성을 최적화하고 상위k개의 보고서를 검색해 Med-LVLM에 제공합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Adaptive Retrieved Context Selection은 fixed-k를 사용했을 때의 문제를 언급하면서 이를 해결하는 방법을 제안합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;유사도 점수의 비율을 분석해 관련성 하락 지점을 찾아 k를 동적으로 자릅니다. 이 방법은 Gap통계 방법에서 차용하였으며 고품질 컨텍스트만 유지해 사실적 정확도를 향상하였습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;RAG-based preference fine-tuning은 두 가지 선호도 쌍 데이터셋을 구성하는 방법입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;modality alignment는 모델이 이미지를 우선시하도록 학습하는 방법으로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;선호응답:이미지+검색 정보로 올바른 답변&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;비선호응답:노이즈 이미지로 올바른 답변&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Overall alignment는 검색 정보 활용과 간섭 완화로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;D1:검색 정보로 올바른 답변vs 검색없이 잘못된 답변&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;D2:이미지만으로 올바른 답변vs검색정보로 잘못된 답변&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Doa = D1 U D2이며&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;통합 데이터셋 Dpt = Dcm U Doa로 DPO를 적용합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;이런 방법으로 MMed-RAG가 alignment 문제를 완화하낟고 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;의료VQA,보고서,정확도 면에서 각각 18.5%,69.1%,43.8%향상되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;모델의 작동순서는 입력으로 의료이미지 &lt;b&gt;Xv(폐렴이미지)&lt;/b&gt;와 임상 질의 &lt;b&gt;Xt(&quot;이 이미지에 폐렴이 있나요?&quot;)&lt;/b&gt;를 받습니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;미세 조정된 BiomedCLIP모델로 이미지 Xv의 도메인을 예측합니다(d=방사선학)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Rd로 데이터베이스에서 이미지와 유사한 상위k개의 보고서(Xr)을 검색합니다(폐렴 관련 보고서)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;검색된 보고서의 유사도 점수 Si를 분석하여 유사도 비율 Ui를 계산합니다. 임계값을 통해 k를 잘라내어 저품질 보고서는 제외시키고, 결과로 고품질 컨텍스트 Xr만 유지됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;Med-LVLM에 Xv, Xt, Xr 을 입력합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;모델은 텍스트 응답 y를 생성하고(&quot;폐렴 징후가 있습니다&quot;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; 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;blockquote data-ke-style=&quot;style2&quot;&gt;Experient&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMed-RAG라는 모델에 대한 질문을 던집니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.기존의 모델보다 사실성을 더 잘 개선하는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.Mmed-RAG의 각 구성요소가 모델 성능에 얼마나 기여하는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.preference data가 모델 성능에 어떤 영향을 미치는가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.MMed-RAG가 실제로 cross-modality,overall alignment을 개선하는가&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;MMed-RAG 모델의 실험 설정은 다음과 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Backbone:LLaVa-Med-1.5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fine-Tuning:LoRA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Retriever:ResNet-50으로 이미지 처리,BioClinicalBERT로 텍스트 인코더&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;optimizer : AdamW&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;learning rate:0.001&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weight decay:0.01&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Batch_size:32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;epochs : 360&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;greedy decoding,beam search,DolLa,OPERA,VCD,MedDr,FactMM-RAG,RULE와 같은 모델들과 비교했고 그 결과는 이러합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPQL82/btsNlxKHU5m/Wab7c7YiHOJn66ALTkoK2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPQL82/btsNlxKHU5m/Wab7c7YiHOJn66ALTkoK2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPQL82/btsNlxKHU5m/Wab7c7YiHOJn66ALTkoK2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPQL82%2FbtsNlxKHU5m%2FWab7c7YiHOJn66ALTkoK2K%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;1171&quot; height=&quot;440&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1117&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blEkaU/btsNlKbVWCm/zNec40E38W3K0NABFRXRLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blEkaU/btsNlKbVWCm/zNec40E38W3K0NABFRXRLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blEkaU/btsNlKbVWCm/zNec40E38W3K0NABFRXRLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblEkaU%2FbtsNlKbVWCm%2FzNec40E38W3K0NABFRXRLK%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;1117&quot; height=&quot;458&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 결과를 보면 MMed-RAG의 성능이 매우 뛰어나다는 것을 볼 수 있습니다&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;다음으로는 Ablation Sudies로 모델에서 특정 부분을 빼거나 추가해서 어떤게 중요한지 테스트 해봤습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Domain-aware Retrieval&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의료 도메인에 맞는 정보를 정확히 검색해서 모델에 제공하였더니 IU-XRAY:17.9%향상,Harvard~~:16.1%향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Adaptive Retrieval Context Selection&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 정보 중에서 신뢰할 수 없는 것을 걸러내고,유용한 정보만 선택했더니 IU-XRAY:19.3%향상,Harvard~6.3%향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;RAG-based Preference Fine-Tuning&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색된 정보를 모델이 더 잘 이해하고 활용하도록 학습을 미세조정:IU-XRAY37.1%향상,Harvard~~:16.9%향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMed-RAG 덕분에 모델이 더 정확한 답변과 리포트를 만들어냈다는 결과가 계속 나옵니다&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;이렇게 MMed-RAG에 대한 논문 리뷰는 마치겠습니다&lt;/p&gt;</description>
      <category>논문리뷰</category>
      <category>med-rag</category>
      <category>MEDICAL</category>
      <category>mmed</category>
      <category>mmed-</category>
      <category>RAG</category>
      <category>검색증강기법</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/4</guid>
      <comments>https://leejeong6.tistory.com/4#entry4comment</comments>
      <pubDate>Tue, 15 Apr 2025 10:30:12 +0900</pubDate>
    </item>
    <item>
      <title>TEPS 리딩공부</title>
      <link>https://leejeong6.tistory.com/3</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1번&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;Hi keran&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;I just wanted to apologize for _________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It wasn't until i got a message from Julia asking what time I'd be arriving that i remembered it was last night.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sorry it slipped my mind.Unfortunately, I was at a client dinner and couldn't come.I wanted to stop by later,but the dinner went on too long.In any case,I hope the party went well.&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;Martin&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.missing your party&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.leaving your party early&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.coming to the party uninvited&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.forgetting to invite you to the party&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;This Letter mainly talk about Martin missing the party becuase of a client dinner that went on too long&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;So,the right answer is (a).&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;slipped my mind : 까먹다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;went on : 일어나다,계속하다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Although Venus is relatively close to Earth,space agencies have not directed many missions there.Their reason for focusing on other planet is mainly pragmatic.Venus has an atmosphere of sulfuric acid,surface temperatures hot enough to melt lead,and high surface pressures.Under these conditions,rovers sent to the planet's surface would break down with hours.Because of this issue,space agencies have largely chosen to devote funding to exploring other planets.After all,it makes little sense to send expensive rovers to Venus if these devices cannot ____________________.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.descend to the planet's surface&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.enter into orbit around the planet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.withstand the harsh conditions there&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.take accurate measurements of its climate&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;1.directed가 &quot;바로 가다&quot;라는 뜻이 맞나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.pragmatic뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.rovers가 뭔지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.break down가 부서지다가 맞나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.devote funding은 뭐지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.makes little sense가 공감인가?&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;다른 행성들에 더 집중하는 이유는 바로 실용적인 이유 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;금성의 대기는 황산으로 이루어져있고,납이 녹을정도로 뜨거운 표면온도,높은 표면 압력을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 조건에서는, 행성의 표면으로 보내진 로버들은 몇 시간 이내로 고장날 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제 때문에,우주기관들은 대부분 자금을 다른 행성을 탐사하는 데 쓰기로 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국,이런 장비들이 _______할 수 없다면 비싼 로버들을 금성으로 보내는건 의미가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.direct는 동사로 쓰이면 어디로 향하게 하다,어떤 곳에 보낸다는 뜻이 있음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.pragmatic은 실용적,현실적이라는 뜻이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.rovers는 탐사로봇&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.break down은 고장나다,작동을 멈추다 라는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.devote funding은 자금을 투자하다라는 뜻. devote는 동사로 바치다,쏟다,투자하다 funding은 자금이라는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fund가 동사로 쓰이면 자금을 제공하다 라는뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.make little sense는 말이 안돼/논리에 맞지 않아 라는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.agencies는 기관들이라는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8.rovers sent to the planet's would break down에서 &quot;rovers인데 planet으로 send된&quot; 으로 해섣돼야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9.will은 would보다 좀 더 현실적임. 즉 would가 가능성이 더 낮은 상황을 말하기 때문에 planet's surface would~~로 쓰임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.After all 은 결국,아무튼 이라는 뜻&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;The correct answer is (c), as it fits the blank best.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the previous sentence,It's already mentioned that Venus has extremely harsh conditions,so space agencies have avoided sending missions there and instead focuse on other planets.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if rovers cannot withstand there conditions,there is no reason to send expensive equipment to Venus&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;3번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ultra Cinemas is pleased to announce that,starting from next month,we'll _________.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;we're proud to bring high-quality entertainment to locals and tourists alike.Now, to enable visitors to better enjoy our filmmakers' work,we'll be offering special subtitled screenings of the best domestic films. The screenings will take place regularly at several locations,with subtitles in one of the three languages most commonly used by foreign visitors.For more information,check the Ultabox website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.begin hosting special international movie nights&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.provide subtitiles in a wider variety of languages&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.offer domestic films with foreign-language subtitles&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.start showing popular movies from various countries&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;우리는 높은 품질의 오락을 지역과 관강객들에게 주게 되어 자랑스럽다. 방문객들이 더 나은 우리의 작품을 즐길 수 있게, 우리는 최고의 국내 영화를 자막과 함께 특별 상영할 예정이다. 영화는 정기적으로 몇몇 곳에서 할거고,외국인 관광객들에게 가장 흔하게 사용되는 3개의 언어로 자막을 달아 상영한다.자세한 내용은 울트라박스 웹사이트를 확인하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.특별한 국제영화의 밤을 개최하기 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.더 넓어진 다양한 언어로 자막을 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.국내 영화를 외국어 자막로 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.다양한 나라의 유명한 영화를 보여줄것을 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.subtitle은 뭐지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.pleased to는 감사하다가 맞나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.to enable은 ~~가 가능하게가 맞나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.proud to는 감사하다가 맞나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subtitle:자막&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pleased to:~~하게 되어 기쁘다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;to enable : ~~할 수 있게 하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;proud to:~~하게 되어 자랑스럽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;domestic : 국내의&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filmmaker:영화 제작에 관여하는 사람들 전체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;4번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Molecular gastronomy,a cooking style that use chemistry and physics to alter the flavor and appearance of food,has become a fad among restaurants striving to be cutting edge. The foods made using its techniques,such as transparent ravioli and spherically shaped frozen juices,can seem magical at first.But some restaurants repeat the same tricks so often that the novelty fades.Thus,although few can deny the &quot;wow&quot; factor of their first encounter with molecular gastronomy,the style unfortunately tends to _________________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.have a negative effect on food quality&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.be inaccessible to ordinary diners&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.lose its impact through overuse&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.be misused by unoriginal chefs&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;음식의 맛과 모양을 화학,물리학적으로 바꾸는 Molecular gastronomy라는 요리 방법은 cutting edge(최첨단)이 되려고 striving(애쓰는)레스토랑 사이에서 fad(유행)가 됨 . 이 기술로 만든 음식은, 라비올리를 transparent(투명)하고 쥬스를 spherically(구)모양으로 하여 처음엔 마법처럼 보이게한다. 하지만 몇몇 레스토랑이 이 트릭을 너무 자주 반복하여 novelty(새로움) 은 fades(사자리다)된다. 따라서 Molecular gastronomy기술을 처음 만난 사람들의 깜짝 놀라게 하는 요소를 부인할 수 있는 사람은 거의 없지만 , 불행하게도 이런 스타일은 ________하는 경향이 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;5번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dawn Kelly's novel &lt;i&gt;Frail Memories&amp;nbsp;&lt;/i&gt;has won the Waston Literature Prize Foundation's inaugural Public Choice Award.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The winner was chosen from among previous Waston Prize winners through online public voting.Kelly was gracious in accepting the honor,crediting her win to director Liam Stone. Stone brought the brilliant but obscure novel to public attention through his critically acclaimed cinematic adaptation. There is little doubt that Kelly is partly correct in her assessment,but she is also being overly modest.Although Stone deserves some credit,Kelly's success is largely a testament to __________________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.her previous bestselling novels&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.her truly impressive literary abilities&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.the shift in public taste away from novels&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.the foundation's preference for honoring films&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;켈리의 소설 Frail Memoried는 ~~에서 우승하였다. 우승자는 이전의 Waston Prize의 우승자 중 온라인 투표로 선정되었다. 캘리는 honor(영광)을 gracious(정중한)하게 받아들이고,감독인 리암 스톤에게 공로를 돌렸다. 스톤은 obscure(잘 알려지지 않은) 한 소설을 critically acclaimed(비평가에게 극찬을 받은) cinematic adaptation(영화적 각색) 을 통해 사람들에게 주목을 받게했다. There is little doubt(의심할 여지가 없다)캘리가 그녀의 판단에 부분적으로는 옳지만,그녀는 지나치게 겸손했다. 비록 스톤이 공로를 인정받을 자격이 있지만,캘리의 성공은 _______________a testament to(~에 대한 증거)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;6번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the US alone,patients spend $100billion per year on back pain treatments.Back surgeries account for as much as 40% of the fifgure.However, these surgeries have a sucess rate of only 35%,lead to frequent complications,and increase the chances of dependency on painkillers.Moreover,research suggests that noninvasive treatments-such as resistance exercise done under the guidance of a qualified pysiotherapist - are more effective.With these facts in mind, many people suffering from back pain would do well to ___________.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.weight the costs of various surical treatments&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.undertake rigorous physiotherpy after surgery&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.avoid surgery through moderate use of painkillers&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.consider other treatments before turning to surgery&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;US에서만,요통 치료로 1년에 100billion을 사용한다. 허리 수술이 이 중 40%를 차지한다. 하지만 이 수술의 성공률은 고작 35%밖에 안되고, 빈번한 합병증을 초래하고, 진통제의 의존 가능성을 증가시킨다. 게다가 연구자들은 noninvasive치료-자격이 있는 물리치료사의 지도 하에 진행하는 저항 운동-이 더 효과적이라고 제안한다. 이런 사실을 염두에 두고, 요통으로 고통받는 많은 사람들은 ______하는 것이 좋을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.다양한 외과 수술비용에 가중치를 두다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.수술 이후 엄격한 물리치료를 받다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.적당한 진통제를 통해 수술을 피한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.수술에 의지하기 전에 다른 치료를 고려한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alone : ~에서만 ,단독으로&amp;nbsp; &amp;nbsp;as much as&amp;nbsp; : ~만큼이나 많은&amp;nbsp; &amp;nbsp;lead to : ~~을 초래하다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; do well to ~ : ~하는 것이 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;back pain : 허리 통증&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; complication : 합병증&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;qualified : 자격이 있는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rigorous : 엄격한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;account for : 차지하다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;painkiller : 진통제&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pyhsiotherapist : 물리치료사&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; moderate : 적당한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;figure : 수치,숫자&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dependency : 의존&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;with ~~ in mind : ~을 염두에 두고&amp;nbsp; &amp;nbsp;turn to&amp;nbsp; : ~에 의지하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;7번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;People often complain that politicians live their lives separated from common citizens,surrounded by other political elites.While this complaint is not necessarily inaccurate,it implies a false dichotomy between politicians and people as a whole. The truth is that almost all people live within social bubbles,having been conditioned since early childhood to associate with certain groups of people.In other words,complaints about politicians being detached from thier constituents overlook the fact that______________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.distinct social groups will become the norm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.politicians have an obligation to serve all people&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.people in general have fairy limited social spheres&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.political affilation in influenced by social conventions&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;이 불평이 꼭 틀린말은 아니지만, 정치인과 국민 전체 사이에 잘못된 이분법을 암시한다&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;a. 뚜렷한 사회집단들이 표준이 될 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.정치인들은 모든 사람을 섬길 의무가 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.일반 사람들 역시 꽤 제한된 사회적 범위 안에서 산다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.정치 성향은 사회적 관습에 의해 영향을 받는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;politician : 정치인&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; detach:단절된,떨어진&amp;nbsp; &amp;nbsp;affiliation : 성향&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;implie : 암시하다,시사하다&amp;nbsp; &amp;nbsp;constituent : 유권자&amp;nbsp; &amp;nbsp; &amp;nbsp;convention : 관습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dichotomy : 이분법&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; norm : 표준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conditioned : 길들이다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;distinct : 뚜렷한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;associate : 어울리다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fairly : 꽤&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;blockquote data-ke-style=&quot;style2&quot;&gt;8번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The poet Allen Ginsberg was a leading figure of the Beat Generation, a literary movement that emerged after World War II. Ginsberg and others in the movement disdained the literary and academic establishment, which they felt pressured artists to conform to outdated norms of artistic expression. Ginsberg denounced this system in &quot;Howl,&quot; the poem that catapulted him to international fame. After making his name,however,Ginsberg mellowed considerably in his outlook&amp;nbsp; and accepted a string of prestigious academic positions. The rebellious young poet,it turned out,was to __________________&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.become increasingly hardened against the establishment&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.abandon his literary ideals to achieve fame and fortune&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.embrace the very institutions derided in his early work&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.adapt his poetic style to the shifting literary landscape&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시인 알렌진스버그는 비트제너레이션 - 세계2차대전 이후 문학적 움직임의- figure를 이끌었다. 진스버그와 나머지의 움직임은 그들이 예술가의 표현에 대한 표준의 압박을 느끼는 문학적,교육적인 설립을 disdain했다. 진스버그는 그에 대한 국제 명성을 의미하는 Howl이란 시를 썻다. 그가 이름을 떨친 후 , 그러나, 진스버그 포지션. 이 rebellious 어린 시, 이것은 ____로 변화햇다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a. 기관에 대항하는 게 커지도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b. 명성과 운명을 달성할 그의 풍부한 문학적 이상&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.그의 초기 작품이 매우 institutions embrace하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.그의 시적 스타일을 문학적 풍경으로 옮기는걸 적용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;leading figure : 선도 인물&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;disdain : 경멸하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Beat generation : 비트 세대(1950년대 미국의 문학운동)&amp;nbsp; &amp;nbsp; &amp;nbsp;establishment : 제도&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;movement : 운동&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; conform to : ~에 따르다, 순응하다&amp;nbsp; outdated:낡은&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;emerge : 나타나다,등장하다&amp;nbsp; &amp;nbsp; &amp;nbsp; denounce : 비난하다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catapult ~~to frame : ~를 단숨에 유명하게 만들다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;making his name : 유명해지다,명성을 얻다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mellow:부드러워지다,너그러워지다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;considerably : 상당히&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outlook : 관점,시각&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a string of : 연속된,일련의&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;prestigious : 명성 있는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; embrace :수용하다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; institutions:제도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deride : 조롱하다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hardened : 강해진&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;abandon : 버리다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rebellious: 반항적인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;the very : 바로 그~&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shifting : 변화하는&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;landscape:풍경,환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시인 알렌 진스버그는 비트 세대(세계 2차 대전 이후 나타난 문학운동)의 선도주자였다. 그와 운동의 다른 사람들은 낡은 예술적 표현을 따르라고 압박하는 문학과 학문 제도에 대해 경멸했다. 진스버그는 이런 시스템을 그를 국제적으로 단숨에 유명하게 만든 시 &quot;Howl&quot;에서 비난했다. 그가 명성을 얻었지만 진스버그는 그의 관점은 상당히 부드러워지고, 일련의 명성있는 학문 직책을 수락하게 되었다. 이 반항적인 젊은 시인은 _______하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.제도에 점점 더 강경해지다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.명성과 부를 위해 그의 문학적 이상을 버리다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.초기 작품에서 조롱하던 바로 그 제도를 받아들였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.그의 시적 스타일을 문확적 환경에 맞게 변화하는 것을 조정하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;9번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;National Health Services director Walter Easton is in trouble over his travel arrangements. A Daily Enquier investigation revealed that Easton billed taxpayers for over $200,000 on private jet travel last year. Easton took there flights despite many low-cost commercial options being available for the same routs. _______,he charted a flight from the capital to Bridgemont for $12000 instead of opting for a business class flight available for $880. Mr.Easton has defended the expenditures as necessary due to his busy schedule.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.To be sure&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.For instance&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.in conclusion&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.at the same time&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;국립 보건 국장 왈터는 그의 이동방식에 곤경에 처해있다. Daily~조사는 그가 작년에 개인 제트기 이동으로 납세자들에게 20만 달러 이상으로 지불했다는것이 밝혀졌다. 그는 같은 노선에 대해 상업적으로 많은 저가 선택지가 있었음에도 불구하고 이런 비행기를 선택했다. ____, 그가 수도에서 브릿지몬트로 갈때 비즈니스 클래스를 880달러로 선택하는 대신에 항공편을 전세 냈다. 그는 그 지출이 자신의 바쁜 스케줄 때문에 필요한 것이라고 변호했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;opt : 고르다,선택하다&amp;nbsp; &amp;nbsp; &amp;nbsp; arrangement :방식&amp;nbsp; &amp;nbsp; reveal : 밝히다,드러내다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;chart:전세 내다&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expenditure : 지출&amp;nbsp; &amp;nbsp; &amp;nbsp;defend:변호하다&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;blockquote data-ke-style=&quot;style2&quot;&gt;10번&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In 1925,Italian prime minister Benito Mussolini declared himself leader for life. Despite Mussolini's anti-democratic agenda,many in the US media refused to condemn his regime.______,many of the articles published about Mussolini in the American press were downright positive.Some historians speculate that journalists ignored Mussolini's autocractic tendencies because of his staunch opposition to communism,which many Americans saw as an even greater than facism&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.in fact&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b.even so&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c.in short&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d.to begin&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;1925년,이탈리아 총리 베니토 무솔리니는 자신을 종신 지도자로 선언했다. 무솔리니의 반 민주적 정책에도 불구하고, 미국 언론의 많은 이들은 그의 정권을 비난하기를 거부했다. _____,미국에 실린 무솔리니 관련 기사 중 많은 수는 노골적으로 긍정적이었다. 일부 역사학자는 언론인들이 무솔리니의 독재적 성향을 무시했던 이유가 그가 공산주의에 강하게 반대했기 때문이라고 추착한다. 많은 미국인들이 파시즘보다 더 큰 위협으로 여겼기 때문이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TEPS공부-서울대 공식 기출문제집/TEST1</category>
      <author>leejeong6</author>
      <guid isPermaLink="true">https://leejeong6.tistory.com/3</guid>
      <comments>https://leejeong6.tistory.com/3#entry3comment</comments>
      <pubDate>Mon, 14 Apr 2025 18:24:57 +0900</pubDate>
    </item>
  </channel>
</rss>