<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>this.code();</title>
    <link>https://chan4im.tistory.com/</link>
    <description>컴퓨터과학, 인공지능에 대한 공부를 열심히 하는 공대생</description>
    <language>ko</language>
    <pubDate>Fri, 29 May 2026 06:39:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>V2LLAIN</managingEditor>
    <image>
      <title>this.code();</title>
      <url>https://tistory1.daumcdn.net/tistory/4727122/attach/0ba739eadac84ad2b24aa6a006c2c9cf</url>
      <link>https://chan4im.tistory.com</link>
    </image>
    <item>
      <title>[ML-DL-AISW]</title>
      <link>https://chan4im.tistory.com/294</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Machine Learning&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1v0N3xYD1rF81bfxUPydzOWJZvL8wRRMm/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&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;h2 data-ke-size=&quot;size26&quot;&gt;Deep Learning&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1TPfL9DJx_2IMyoyo8Ysysv3UXsrFjXNm/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&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;h2 data-ke-size=&quot;size26&quot;&gt;AI Software&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1v0N3xYD1rF81bfxUPydzOWJZvL8wRRMm/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>Gain Study/ML-DL-AI</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/294</guid>
      <comments>https://chan4im.tistory.com/294#entry294comment</comments>
      <pubDate>Mon, 16 Dec 2024 15:05:31 +0900</pubDate>
    </item>
    <item>
      <title>Computer Network</title>
      <link>https://chan4im.tistory.com/293</link>
      <description>&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1oMv3QBrwolSsjf-R3AXzrKVGp4lT8euY/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>Gain Study/Computer Network</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/293</guid>
      <comments>https://chan4im.tistory.com/293#entry293comment</comments>
      <pubDate>Mon, 16 Dec 2024 15:00:39 +0900</pubDate>
    </item>
    <item>
      <title>[RL-DQN전까지]</title>
      <link>https://chan4im.tistory.com/292</link>
      <description>&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1JKSwMortkn7qKNonwR-SwfbYOCi0yq1L/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>Gain Study/RL</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/292</guid>
      <comments>https://chan4im.tistory.com/292#entry292comment</comments>
      <pubDate>Mon, 16 Dec 2024 14:59:42 +0900</pubDate>
    </item>
    <item>
      <title>[영상처리과 컴퓨터비전]</title>
      <link>https://chan4im.tistory.com/291</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;영상처리&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/10pJwvtn3K-IeU2mW3ZNzW08MAArummTM/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터 비전&lt;/h2&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1YMQdp2JBcAF_I-gl42qWnFc81AhaelfS/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&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;h4 data-ke-size=&quot;size20&quot;&gt;컴퓨터 비전-참고서-1&lt;/h4&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1KwqXVMz1VEbQ4jbVQv-r3CT-aUJWLM2r/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&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;h4 data-ke-size=&quot;size20&quot;&gt;컴퓨터 비전-참고서-2&lt;/h4&gt;
&lt;p&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1IfaWONEE7Yh4iaMIbKHgFq3_5-31wrWS/preview&quot; width=&quot;1080&quot; height=&quot;1200&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>Deep Learning : Vision System/영상처리 ~ 최신비전</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/291</guid>
      <comments>https://chan4im.tistory.com/291#entry291comment</comments>
      <pubDate>Mon, 16 Dec 2024 14:58:20 +0900</pubDate>
    </item>
    <item>
      <title>HuggingFace( )입문자를 위한 transformers 정리</title>
      <link>https://chan4im.tistory.com/290</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Preview:&lt;/b&gt;&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;Machine Learning vs Deep Learning&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝: 인공지능의 한 분야로 data의 Pattern을 학습. (이때, 비교적 적은 양의 구조화된 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;b&gt;Transformer(Attention is All You Need-2017)&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Transformer 모델의 핵심:&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;∙&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;input sequence 병렬처리&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;∙&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Only Use Attention Mechanism (Self Attention)&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;∙&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;순차적처리, 반복연결, 재귀 모두 사용❌&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Transformer 모델구조:&lt;/b&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;∙&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;Embedding:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;token2dense-vector (이때, 단어간의 의미적 유사성을 보존하는 방향으로 모델이 학습된다.)&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;∙&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;Positional Encoding:&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;input sequence의 token위치정보를 추가로 제공&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;∙&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;Encoder&amp;amp;Decoder&lt;/b&gt;: Embedding+PE라는 학습된 vector를 Input으로 받음(벡터 값은 Pretrained weight or 학습과정중 최적화됨.)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- MHA &amp;amp; FFN:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;token간 관계를 학습, FFN으로 각 단어의 특징벡터 추출 (이때, 각 Head값은 서로 다른 가중치를 가져 input sequence의 다양한 측면 포착가능.)&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- QKV:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;Query(현재위치에서 관심있는부분의 벡터), Key(각 위치에 대한 정보의 벡터), Value(각 위치에 대한 값 벡터)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;ex) The student studies at the home&amp;nbsp;&lt;br /&gt;query:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;student&lt;/span&gt;&lt;br /&gt;&amp;nbsp;--&amp;gt; Q:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;student정보를 얻기 위한&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #000000; text-align: left;&quot;&gt;벡터값&lt;/span&gt;&lt;br /&gt;&amp;nbsp;--&amp;gt; K: The, studies, at, the, home 벡터값&lt;br /&gt;&amp;nbsp;--&amp;gt; V: 문맥, 의미등의 관련정보에 대한 벡터값&lt;br /&gt;&amp;nbsp;--&amp;gt; 3-Head라면: 각 헤드별 역할이 Syntax, Semantics, Pragmatics 등에 집중할 수 있다는 것.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;3451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bv2gg/btsKHWyGYMk/hbfeEA74CK8pzzzlhoblLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bv2gg/btsKHWyGYMk/hbfeEA74CK8pzzzlhoblLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bv2gg/btsKHWyGYMk/hbfeEA74CK8pzzzlhoblLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBv2gg%2FbtsKHWyGYMk%2FhbfeEA74CK8pzzzlhoblLk%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;1652&quot; height=&quot;3451&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;3451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Huggingface Transformers&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Library 소개&lt;/h3&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt; Tokenizer&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통 subword로 token화(token으로 분할)하는 과정을 진행.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttcxU/btsKGSYdmJK/1erFqOAe1Tbt3NocXkwSy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttcxU/btsKGSYdmJK/1erFqOAe1Tbt3NocXkwSy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttcxU/btsKGSYdmJK/1erFqOAe1Tbt3NocXkwSy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttcxU%2FbtsKGSYdmJK%2F1erFqOAe1Tbt3NocXkwSy0%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;396&quot; height=&quot;132&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;부수적으로 &quot;텍스트 정규화, 불용어제거, Padding, Truncation 등&quot; 다양한 전처리 기능도 제공한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Diffusers Library&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;txt-img생성관련 작업을 위한 라이브러리로 Stable Diffusion, DALL-E, LDM 등 다양한 생성모델을 지원.&lt;br /&gt;- DDPM, DDIM, LDM등 다양한 Diffusion기반 알고리즘 제공&lt;br /&gt;- Batch Inference, 병렬, 혼합정밀도학습 등 지원&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Accelerate&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;분산전략을 간단히 추상화해 API로 제공, FP16 및 BF16등의 낮은 혼합정밀도학습을 &quot;자동지원&quot;&lt;br /&gt;- 분산학습 지원: Data Parallel, Model Parallel 등 지원.&lt;br /&gt;- Automatic Mixed Precision지원: FP16, FP32 등 data형식을 자동으로 혼합, 메모리사용량&lt;/span&gt;&lt;/span&gt;&amp;darr;&lt;span style=&quot;color: #000000;&quot;&gt;, 속도&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&amp;uarr;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- Gradient Accumulation: 여러 미니배치의 그래디언트를 누적하여 큰 배치 효과를 내는 기법&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- Gradient Checkpointing: 중간 activation계산을 저장하는 대신, 필요할 때 재계산하는 방법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; Model 설정&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델 설정 클래스는 모델구조와 hyperparameter값을 &quot;딕셔너리&quot;형태로 JSON파일에 저장한다.&lt;br /&gt;따라서 모델을 불러오면 모델가중치와 함께 이 값이 불러와진다. (아래 사진처럼)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1Qsdu/btsKIxd0iQA/YBmG91lmrAPXL1KjGMZknk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1Qsdu/btsKIxd0iQA/YBmG91lmrAPXL1KjGMZknk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1Qsdu/btsKIxd0iQA/YBmG91lmrAPXL1KjGMZknk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1Qsdu%2FbtsKIxd0iQA%2FYBmG91lmrAPXL1KjGMZknk%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;469&quot; height=&quot;329&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt; PretrainedConfig &amp;amp; ModelConfig&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;마찬가지로 모델구조, hyperparameter를 저장하는 딕셔너리를 포함&lt;br /&gt;&lt;/span&gt;&lt;b&gt;[예시인자 설명]:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;vocab_size&lt;/b&gt;: 모델이 인식가능한 고유토큰 수&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;output_hidden_states&lt;/b&gt;: 모델의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;모든&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;hidden_state를 출력할지 여부&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;output_attentions&lt;/b&gt;: 모델의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;모든 attention값을 출력할지 여부&lt;/span&gt;&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;return_dict&lt;/b&gt;: 모델이 일반 튜플대신, ModelOutput객체를 반환할지 결정.&lt;br /&gt;각 모델 구조별 PretrainedConfig를 상속받은 전용 모델 설정 클래스가 제공된다.&lt;br /&gt;(ex. BertConfig, GPT2Config 혹은 아래 사진처럼...)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;1675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Octui/btsKGYYlcho/k676TUukCGjRNQooL8pKAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Octui/btsKGYYlcho/k676TUukCGjRNQooL8pKAk/img.png&quot; data-alt=&quot;InternVisionConfig를 직접 인스턴스화해 설정하는 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Octui/btsKGYYlcho/k676TUukCGjRNQooL8pKAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOctui%2FbtsKGYYlcho%2Fk676TUukCGjRNQooL8pKAk%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;723&quot; height=&quot;1675&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;1675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;InternVisionConfig를 직접 인스턴스화해 설정하는 예시&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때, 설정값이 잘못되면 모델성능이 크게 떨어질 수 있기에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;보통 &quot;from_pretrained&quot;를 이용해 검증된 pretrained학습설정값을 불러온다&lt;/u&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;PreTrainedTokenizer &amp;amp; ModelTokenizer &amp;amp; PretrainedTokenizerFast&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;b&gt;[예시인자 설명]:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;max_model_input_sizes&lt;/b&gt;: 모델의 최대입력길이&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;model_max_length&lt;/b&gt;: tokenizer가 사용하는 모델의 최대입력길이&lt;br /&gt;(&lt;span style=&quot;color: #666666;&quot;&gt;즉, 토크나이저의 model_max_length는 모델의 max_model_input_sizes보다 크지 않도록 설정해야 모델이 정상적으로 입력을 처리할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;)&amp;nbsp;&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;padding_side&lt;/b&gt;/&lt;b&gt;truncation_side&lt;/b&gt;: padding/truncation위치(left/right) 결정&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;model_input_names&lt;/b&gt;: 순전파시 입력되는 tensor목록(ex. input_ids, attention_mask, token_type_ids)&lt;br /&gt;&lt;br /&gt;cf) decode메서드를 사용하면 token_id 문장을 원래 문장으로 복원한다.&lt;br /&gt;cf) PretrainedTokenizerFast는 Rust로 구현된 버전으로 Python Wrapper를 통해 호출되는, 더 빠른 tokenizer다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Datasets&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Dataset Upload 예제:&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258481&quot; class=&quot;xl&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;images 디렉토리 구조:
images
⎿ A.jpg
⎿ B.jpg
  ...

import os
from collections import defaultdict
from datasets import Dataset, Image, DatasetDict

data = defaultdict(list)
folder_name = '../images'

for file_name in os.listdir(folder_name):
    name = os.path.splittext(file_name)[0]
    path = os.path.join(folder_name, file_name)
    data['name'].append(name)
    data['image'].append(path)

dataset = Dataset.from_dict(data).cast_column('image', Image())
# print(data, dataset[0]) # 확인용

dataset_dict = DatasetDict({
    'train': dataset.select(range(5)),
    'valid': dataset.select(range(5, 10)),
    'test': dataset.select(range(10, len(dataset)))
    }
)

hub_name = &quot;&amp;lt;user_name&amp;gt;/&amp;lt;repo_name&amp;gt;&quot; # dataset저장경로
token = &quot;hf_###...&quot; # huggingface token입력
datasetdict.push_to_hub(hub_name, token=token)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Embedding과정 완전정리!!&lt;/h2&gt;
&lt;pre id=&quot;code_1731909258482&quot; class=&quot;makefile&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained(&quot;bert-base-uncased&quot;)

txt = &quot;I am laerning about tokenizers.&quot;
input = tokenizer(txt, return_tensors=&quot;pt&quot;)
output = model(**input)

print('input:', input)
print('last_hidden_state:', output.last_hidden_state.shape)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731909258482&quot; class=&quot;yaml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;input: {'input_ids': tensor([[  101,  1045,  2572,  2474, 11795,  2075,  2055, 19204, 17629,  2015,  1012,   102]]), 
        'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 
        'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
        
last_hidden_state: torch.Size([1, 12, 768])&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;input 딕셔너리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;input_ids&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 단어와 특수 토큰이 BERT의 어휘 사전에 매핑된 고유한 정수 ID로 변환된 결과입니다.&lt;/li&gt;
&lt;li&gt;예시: 101은 [CLS] 토큰, 102는 [SEP] 토큰.&lt;/li&gt;
&lt;li&gt;전체 시퀀스: [CLS] I am laerning about tokenizers. [SEP]&lt;/li&gt;
&lt;li&gt;길이: 12개의 토큰 (문장 전체와 특수 토큰 포함)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;token_type_ids&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장 내의 각 토큰이 어느 segment에 속하는지를 나타냄.&lt;/li&gt;
&lt;li&gt;BERT는 기본적으로 두 개의 세그먼트(예: 문장 A와 문장 B)를 구분가능.&lt;/li&gt;
&lt;li&gt;여기서는 단일 문장이므로 모든 값이 0이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;attention_mask&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델이 각 토큰에 주의를 기울여야 하는지를 나타낸다.&lt;/li&gt;
&lt;li&gt;1은 해당 토큰이 실제 데이터임을 의미하고, 0은 패딩 토큰을 의미.&lt;/li&gt;
&lt;li&gt;여기서는 패딩이 없으므로 모든 값이 1이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;last_hidden_state&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Shape: [1, 12, 768]&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Batch Size (1)&lt;/b&gt;: 한 번에 하나의 입력 문장을 처리.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sequence Length (12)&lt;/b&gt;: 입력 시퀀스의 토큰 수 (특수 토큰 포함).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Hidden Size (768)&lt;/b&gt;: BERT-base 모델의 각 토큰에 대해 768차원의 벡터 표현을 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;last_hidden_state는 모델의 마지막 은닉 계층에서 각 토큰에 대한 벡터 표현을 담고 있다.&lt;/li&gt;
&lt;li&gt;이 벡터들은 문맥 정보를 포함하고 있으며, 다양한 NLP 작업(예: 분류, 개체명 인식 등)에 활용될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2798&quot; data-origin-height=&quot;1802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uWNpo/btsKItW3HmC/PhwN3u0KgprXm3OAkgnzNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uWNpo/btsKItW3HmC/PhwN3u0KgprXm3OAkgnzNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uWNpo/btsKItW3HmC/PhwN3u0KgprXm3OAkgnzNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuWNpo%2FbtsKItW3HmC%2FPhwN3u0KgprXm3OAkgnzNk%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;2798&quot; height=&quot;1802&quot; data-origin-width=&quot;2798&quot; data-origin-height=&quot;1802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;설명)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2202&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjBhve/btsKIbCbRig/5KyhYQcWnOOk6vlNXfilcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjBhve/btsKIbCbRig/5KyhYQcWnOOk6vlNXfilcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjBhve/btsKIbCbRig/5KyhYQcWnOOk6vlNXfilcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjBhve%2FbtsKIbCbRig%2F5KyhYQcWnOOk6vlNXfilcK%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;598&quot; height=&quot;340&quot; data-origin-width=&quot;2202&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diy4sb/btsK577zMKQ/Pq50hhgenlJZLxXYH2wVB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diy4sb/btsK577zMKQ/Pq50hhgenlJZLxXYH2wVB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diy4sb/btsK577zMKQ/Pq50hhgenlJZLxXYH2wVB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdiy4sb%2FbtsK577zMKQ%2FPq50hhgenlJZLxXYH2wVB1%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;466&quot; height=&quot;206&quot; data-origin-width=&quot;466&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;ex-1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Embedding&amp;nbsp; Lookup Table과정 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1733277599261&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_data = 'you need to know how to code'

# 중복을 제거한 단어들의 집합인 단어 집합 생성.
word_set = set(train_data.split())

# 단어 집합의 각 단어에 고유한 정수 맵핑.
vocab = {word: i+2 for i, word in enumerate(word_set)}
vocab['&amp;lt;unk&amp;gt;'] = 0
vocab['&amp;lt;pad&amp;gt;'] = 1
print(vocab) # {'need': 2, 'to': 3, 'code': 4, 'how': 5, 'you': 6, 'know': 7, '&amp;lt;unk&amp;gt;': 0, '&amp;lt;pad&amp;gt;': 1}

# 단어 집합의 크기만큼의 행을 가지는 테이블 생성.
embedding_table = torch.FloatTensor([[ 0.0,  0.0,  0.0],
                                    [ 0.0,  0.0,  0.0],
                                    [ 0.2,  0.9,  0.3],
                                    [ 0.1,  0.5,  0.7],
                                    [ 0.2,  0.1,  0.8],
                                    [ 0.4,  0.1,  0.1],
                                    [ 0.1,  0.8,  0.9],
                                    [ 0.6,  0.1,  0.1]])

sample = 'you need to run'.split()
idxes = []

# 각 단어를 정수로 변환
for word in sample:
  try:
    idxes.append(vocab[word])
  # 단어 집합에 없는 단어일 경우 &amp;lt;unk&amp;gt;로 대체된다.
  except KeyError:
    idxes.append(vocab['&amp;lt;unk&amp;gt;'])
idxes = torch.LongTensor(idxes)

# 각 정수를 인덱스로 임베딩 테이블에서 값을 가져온다.
lookup_result = embedding_table[idxes, :]
print(lookup_result)
print(lookup_result.shape)
# tensor([[0.1000, 0.8000, 0.9000],
#         [0.2000, 0.9000, 0.3000],
#         [0.1000, 0.5000, 0.7000],
#         [0.0000, 0.0000, 0.0000]])
# torch.Size([4, 3])&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;ex-2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Embedding lookup table과정 코드와 nn.Embedding간 비교&lt;/h3&gt;
&lt;pre id=&quot;code_1733277773767&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;train_data = 'you need to know how to code'

# 중복을 제거한 단어들의 집합인 단어 집합 생성.
word_set = set(train_data.split())

# 단어 집합의 각 단어에 고유한 정수 맵핑.
vocab = {tkn: i+2 for i, tkn in enumerate(word_set)}
vocab['&amp;lt;unk&amp;gt;'] = 0
vocab['&amp;lt;pad&amp;gt;'] = 1

embedding_layer = nn.Embedding(num_embeddings=len(vocab), embedding_dim=3, padding_idx=1)
print(embedding_layer.weight)
print(embedding_layer)

# tensor([[ 0.7830,  0.2669,  0.4363],
#         [ 0.0000,  0.0000,  0.0000],
#         [-1.2034, -0.0957, -0.9129],
#         [ 0.7861, -0.0251, -2.2705],
#         [-0.5167, -0.3402,  1.3143],
#         [ 1.7932, -0.6973,  0.5459],
#         [-0.8952, -0.4937,  0.2341],
#         [ 0.3692,  0.0593,  1.0825]], requires_grad=True)
# Embedding(8, 3, padding_idx=1)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;ex-3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Embedding&amp;nbsp; 예시코드&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1731909258484&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class BertEmbeddings(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.config = config
        self.word_embeddings = nn.Embedding(config.vocab_size, config.emb_size, padding_idx=config.pad_token_id)
        self.position_embeddings = nn.Embedding(config.max_seq_length, config.emb_size)
        self.token_type_embeddings = nn.Embedding(2, config.emb_size)
        self.LayerNorm = nn.LayerNorm(config.emb_size, eps=config.layer_norm_eps)
        self.dropout = nn.Dropout(config.dropout)
        
        # position ids (used in the pos_emb lookup table) that we do not want updated through backpropogation
        self.register_buffer(&quot;position_ids&quot;, torch.arange(config.max_seq_length).expand((1, -1)))

    def forward(self, input_ids, token_type_ids):
        word_emb = self.word_embeddings(input_ids)
        pos_emb = self.position_embeddings(self.position_ids)
        type_emb = self.token_type_embeddings(token_type_ids)

        emb = word_emb + pos_emb + type_emb
        emb = self.LayerNorm(emb)
        emb = self.dropout(emb)

        return emb&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;NLP&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;BERT -  Classification&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;NER (Named Entity Recognition)&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Token Classification, 즉 문장을 구성하는 각 token에 label을 할당하는 Task이다.&lt;br /&gt;먼저 예시로 BIO Tagging을 들면 아래와 같다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258484&quot; class=&quot;elixir&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;ex) 인공지능(AI)에서 딥러닝은 머신러닝의 한 분야입니다.
--&amp;gt; &amp;lt;인공지능:B-Tech&amp;gt; &amp;lt;(:I-Tech&amp;gt; &amp;lt;AI:I-Tech&amp;gt; &amp;lt;):I-Tech&amp;gt; &amp;lt;에서:O&amp;gt; &amp;lt;딥러닝:B-Tech&amp;gt; &amp;lt;은:O&amp;gt; &amp;lt;머신러닝:B-Tech&amp;gt; &amp;lt;의:O&amp;gt; &amp;lt;한:O&amp;gt; &amp;lt;분야:O&amp;gt; &amp;lt;입니다:O&amp;gt; &amp;lt;.:O&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때, B는 Begin(개체명의 시작)을, I는 Inside(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;개체명의 연속)&lt;/span&gt;를, O는 Outside(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;개체명이 아닌것)&lt;/span&gt;를 의미한다.&lt;br /&gt;이런 NER에서 자주사용되는 모델이 바로 BERT이다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;BERT - MLM, NSP&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문장간 관계(요약 등)를 이해하기 위해 활용되는 [CLS]토큰이 사용된다.&lt;br /&gt;BERT에서는 총 3가지 Embedding이 Embedding Layer에서 활용된다:&lt;br /&gt;1. Token Embedding:&lt;br /&gt;&amp;nbsp;- 입력문장 embedding&lt;br /&gt;2. Segment Embedding:&lt;br /&gt;&amp;nbsp;- 모델이 인식하도록 각 문장에 고정된 숫자 할당.&lt;br /&gt;3. Position Embedding:&lt;br /&gt;&amp;nbsp;- input을 한번에 모두 밀어넣기에(= 순차적으로 넣지 않음)&lt;br /&gt;&amp;nbsp;- Transformer Encoder는 각 token의 시간적 순서를 알지 못함&lt;br /&gt;&amp;nbsp;- 이를 위해 위치정보를 삽입하기위해 sine, cosine을 사용한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkyW8K/btsKH9FnS4d/3JXZpt0I2Y9lqG0vUCuXI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkyW8K/btsKH9FnS4d/3JXZpt0I2Y9lqG0vUCuXI0/img.png&quot; data-alt=&quot;추천강의) https://www.youtube.com/watch?app=desktop&amp;amp;amp;v=CiOL2h1l-EE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkyW8K/btsKH9FnS4d/3JXZpt0I2Y9lqG0vUCuXI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkyW8K%2FbtsKH9FnS4d%2F3JXZpt0I2Y9lqG0vUCuXI0%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;2200&quot; height=&quot;1150&quot; data-origin-width=&quot;2200&quot; data-origin-height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추천강의) https://www.youtube.com/watch?app=desktop&amp;amp;v=CiOL2h1l-EE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;BART - Summarization&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Abstractive &amp;amp; Extractive&lt;span&gt;&amp;nbsp;&lt;/span&gt;Summarization&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추상요약:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;원문을 완전히 이해 --&amp;gt; 새로운 문장을 생성해 요약하는 방식.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추출요약:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원문에서 가장 중요하고 관련성 높은 문장들만 선택해 그대로 추출.&lt;br /&gt;(요약문이 부자연스러울 수는 있으며, 중복제거능력이 필요함.)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dU2WiQ/btsKH9yJCq2/WzrkvpKO5B99c6w4PbpExK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dU2WiQ/btsKH9yJCq2/WzrkvpKO5B99c6w4PbpExK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dU2WiQ/btsKH9yJCq2/WzrkvpKO5B99c6w4PbpExK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdU2WiQ%2FbtsKH9yJCq2%2FWzrkvpKO5B99c6w4PbpExK%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;302&quot; height=&quot;113&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;BART (Bidirectional &amp;amp; Auto Regressive Transformers)&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Encoder-Decoder 모두 존재하며, 특히나 Embedding층을 공유하는 Shared Embedding을 사용해 둘간의 연결을 강화한다.&lt;br /&gt;Encoder는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199; color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;Bidirectional Encoder&lt;/b&gt;로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;각 단어가 문장 전체의 좌우 context를 모두 참조&lt;/b&gt;가능&lt;/u&gt;&lt;/span&gt;하며,&lt;br /&gt;Decoder에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; background-color: #f6e199;&quot;&gt;&lt;u&gt;&lt;b&gt;Auto-Regressive방식&lt;/b&gt;으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이전에 생성한 단어를 참조해 다음 단어를 예측&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;한다.&lt;br /&gt;또한,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Pre-Train시 Denoising Auto Encoder로 학습&lt;/b&gt;하는데, 임의로 noising후, 복원하게 한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;RoBERTa, T5- TextQA&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Abstractive &amp;amp; Extractive&lt;span&gt;&amp;nbsp;&lt;/span&gt;QA&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추상질의응답:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;주어진 지문 내에서 답변이 되는 문자열 추출 (질문-지문-지문내답변추출)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추출질의응답:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;질문과 지문을 입력받아 새로운 답변 생성 (질문-지문-답변)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;RoBERTa&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;max_len, pretrain-dataset양이 늘어났으며, Dynamic Masking기법 도입이 핵심.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Dynamic Masking:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;각 에폭마다 다른 마스킹패턴 생성. (NSP는 없앰.)&lt;br /&gt;&lt;b&gt;BPE Tokenization 사용:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BERT는 wordpiece tokenize.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDr3tI/btsKJ2Y9pKc/LkT774TmO3DWwyTQEfzgzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDr3tI/btsKJ2Y9pKc/LkT774TmO3DWwyTQEfzgzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDr3tI/btsKJ2Y9pKc/LkT774TmO3DWwyTQEfzgzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDr3tI%2FbtsKJ2Y9pKc%2FLkT774TmO3DWwyTQEfzgzK%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;1392&quot; height=&quot;786&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;T5- Machine Translation&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;SMT &amp;amp; NMT&lt;/h4&gt;
&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdKio0/btsKJkfbqW2/oi2hc8QdTsc8xcENk1vIAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdKio0/btsKJkfbqW2/oi2hc8QdTsc8xcENk1vIAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdKio0/btsKJkfbqW2/oi2hc8QdTsc8xcENk1vIAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdKio0%2FbtsKJkfbqW2%2Foi2hc8QdTsc8xcENk1vIAk%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;369&quot; height=&quot;480&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;통계적 기계번역:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;원문-번역쌍 기반, 단어순서 및 언어패턴을 인식 --&amp;gt; 대규모 data필요&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;신경망 기계번역:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;번역문과 단어시퀀스간 관계를 학습&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;T5 (Text-To-Text Transfer Transformer)&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tast별 특정 Prompt형식을 사용해 적절한 출력을 생성하게 유도가능하다.&lt;br /&gt;즉, 단일 모델로 다양한 NLP Task를 처리가능한 seq2seq구조를 기반으로 한다.&lt;br /&gt;&lt;br /&gt;T5의 독특한점은 모델구조차제가 아닌, &quot;입출력 모두 Txt형태로 취급하는 seq2seq로 접근해 Pretrain과정에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&quot;Unsupervised Learning&quot;을 통해&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;대규모 corpus(약 75GB)를 사용한다는 점이다.&quot; 이를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;언어의 일반적 패턴과 지식을 효과적으로 습득&lt;/u&gt;&lt;/span&gt;한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;LLaMA - Text Generation&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Seq2Seq &amp;amp; CausalLM&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Seq2Seq:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Transformer, BART, T5 등 Encoder-Decoder구조&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;CausalLM:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;단일 Decoder로 구성&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;LLaMA-3 Family&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;2024년 4월, LLaMA-3가 출시되었는데,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;LLaMA-3&lt;/span&gt;에서는 GQA(Grouped Query Attention)이 사용되어 Inference속도를 높였다.&lt;br /&gt;LLaMA-3는 Incontext-Learning, Few-Shot Learning 모두 뛰어난 성능을 보인다.&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;s&gt;Incontext-Learning&lt;/s&gt;&lt;/span&gt;:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;모델이 입력텍스트를 기반으로 새로운 작업을 즉석에서 수행하는 능력&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2386&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyY5h/btsKJmqv7uP/LFNwqM7i069hORZGQRjP31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyY5h/btsKJmqv7uP/LFNwqM7i069hORZGQRjP31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyY5h/btsKJmqv7uP/LFNwqM7i069hORZGQRjP31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyyY5h%2FbtsKJmqv7uP%2FLFNwqM7i069hORZGQRjP31%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;2386&quot; height=&quot;780&quot; data-origin-width=&quot;2386&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;추가적으로 2024년 7월,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;LLaMA-3.1이 공개되었다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;LLaMA-3.1은 AI안정성 및 보안관련 도구가 추가되었는데, Prompt Injection을 방지하는 Prompt Guard를 도입해 유해하거나 부적절한 콘텐츠를 식별하게 하였다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQNFPr/btsKJ6tFXBB/fH49ws6mbKglAtR5Ova5Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQNFPr/btsKJ6tFXBB/fH49ws6mbKglAtR5Ova5Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQNFPr/btsKJ6tFXBB/fH49ws6mbKglAtR5Ova5Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQNFPr%2FbtsKJ6tFXBB%2FfH49ws6mbKglAtR5Ova5Lk%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;692&quot; height=&quot;608&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추가적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;LLaMA-3 시리즈는 다음과 같은 주요 특징이 존재한다:&lt;br /&gt;&lt;b&gt;- RoPE(Rotary Position Embedding):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Q, K에 적용&lt;br /&gt;&lt;b&gt;- GQA(Grouped Query Attention):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;K, V를 여러 그룹으로 묶어 attention연산수행 --&amp;gt; 효율적 추론&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;- RMS Norm:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;안정적 학습 및 계산의 효율성&lt;br /&gt;&lt;b&gt;- KV cache:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;추론시 K,V를 cache에 저장 --&amp;gt; 연산의 효율성&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;LLaMA-3 최적화기법: SFT . RLHF&amp;nbsp; . DPO&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;SFT(Supervised Fine-Tuning):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;사람이 작성한 고품질QA쌍으로 모델을 직접 학습시키는 방법&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;RLHF:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;PPO알고리즘기반, 모델이 생성한 여러 응답에 대해 사람이 순위를 매기고 이를 바탕으로 재학습.&lt;br /&gt;&lt;/span&gt;&lt;/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;DPO(Direct Preference Optimization):&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;RLHF의 복잡성을 줄이면서 효과적 학습을 가능케함.(사람이 매긴 응답순위를 직접학습; 다만 더욱 고품질 선호도 data를 필요로함.)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Computer Vision&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주로 CV(Computer Vision)분야에선 CNN기법이 많이 활용되었다.(VGG, Inception, ResNet, ...)&lt;br /&gt;다만, CNN based model은 주로 국소적(local) pattern을 학습하기에 전역적인 관계(global relation)모델링에 한계가 존재한다.&lt;br /&gt;추가적으로 이미지 크기가 커질수록 계산복잡도 또한 증가한다.&lt;br /&gt;&lt;br /&gt;이를 해결하기 위해 ViT(Vision Transformer)가 제안되었으며, 대규모 dataset으로 효율적으로 학습한다.&lt;br /&gt;ViT의 가장 대표적인 격인 CLIP, OWL-ViT, SAM에 대해 알아보자.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Zero shot classification&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Zero Shot Classification: CLIP, ALIGN, SigLIP&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사실 CLIP은 다양한 Task에서 많이 활용되나 본 글은 Train dataset에 없는 Label에 대해 Image Classification을 수행하는 기술에 활용되는 방법으로 알아보고자 한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;새로운 Label이 추가될 때마다 재학습이 필요한데, 이를 피하려면 Zero shot기법은 반필수적이기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;CLIP (Contrastive Language-Image Pre-training)&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 130px;&quot; border=&quot;1&quot; data-ke-style=&quot;style13&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 30.1895%; height: 26px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Model&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6825%; height: 26px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Architecture&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.128%; height: 26px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Input_Size&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Patch_Size&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#params&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 30.1895%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #000000; text-align: center;&quot;&gt;openai/clip-vit-base-patch32&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6825%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ViT-B/32&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.128%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;224&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;&lt;/span&gt;224&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;32&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;3&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.5B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 30.1895%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;openai/clip-vit-base-patch16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6825%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;ViT-B/16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.128%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;224&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;224&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;16&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;16&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;1.5B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 30.1895%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;openai/clip-vit-large-patch14&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6825%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;ViT-L/14&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.128%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;224&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;224&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;14&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.3B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 30.1895%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;openai/clip-vit-large-patch14-336&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6825%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;ViT-L/14&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 13.128%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;336&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: center;&quot;&gt;336&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;14&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 26px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.3B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;작은 patch_size: 더 세밀한 특징추출, 메모리 사용량 및 계산시간 증가&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;큰 patch_size: 비교적 낮은 성능, 빠른 처리속도&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3414&quot; data-origin-height=&quot;1246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R5t2s/btsKMaX2BB6/ilP4QXVgUHvLkDlYvmLrB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R5t2s/btsKMaX2BB6/ilP4QXVgUHvLkDlYvmLrB0/img.png&quot; data-alt=&quot;파란블록: Positive Sample , 흰블록: Negative Sample&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R5t2s/btsKMaX2BB6/ilP4QXVgUHvLkDlYvmLrB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR5t2s%2FbtsKMaX2BB6%2FilP4QXVgUHvLkDlYvmLrB0%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;3414&quot; height=&quot;1246&quot; data-origin-width=&quot;3414&quot; data-origin-height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파란블록: Positive Sample , 흰블록: Negative Sample&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;기존 Supervised Learning과 달리 2가지 특징이 존재한다:&lt;br /&gt;&lt;b&gt;1.&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;별도의 Label없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;input으로 image-txt쌍만 학습.&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;img, txt를 동일한 embedding공간에 사영(Projection)&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;- 이를 통해 두 Modality간 의미적 유사성을 직접적으로 측정 및 학습가능&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;- 이 때문에 CLIP은 img-encoder, txt-encoder 모두 갖고있음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;2. Contrastive Learning:&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- &quot;&lt;span style=&quot;color: #0593d3;&quot;&gt;&lt;b&gt;Positive Sample&lt;/b&gt;&lt;/span&gt;&quot;: 실제img-txt쌍 --&amp;gt; img-txt간 의미적&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;유사성 최대화&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;- &quot;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Negative Sample&lt;/b&gt;&lt;/span&gt;&quot;: random하게 pair된 불일치img-txt쌍 --&amp;gt; 유사성 최소화&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;nbsp;- 이를 위해 Cosine Similarity기반의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;Contrastive Learning Loss를 사용&lt;/u&gt;&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Zero-Shot Classification 예시&lt;/h4&gt;
&lt;pre id=&quot;code_1731909258497&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from datasets import load_dataset
from transformers import CLIPProcessor, CLIPModel
import torch

model = CLIPModel.from_pretrained(&quot;openai/clip-vit-base-patch32&quot;)
processor = CLIPProcessor.from_pretrained(&quot;openai/clip-vit-base-patch32&quot;)
dataset = load_dataset(&quot;sasha/dog-food&quot;)
images = dataset['test']['image'][:2]
labels = ['dog', 'food']
inputs = processor(images=images, text=labels, return_tensors=&quot;pt&quot;, padding=True)

print('input_ids: ', inputs['input_ids'])
print('attention_mask: ', inputs['attention_mask'])
print('pixel_values: ', inputs['pixel_values'])
print('image_shape: ', inputs['pixel_values'].shape)
# =======================================================
# input_ids:  tensor([[49406,  1929, 49407], [49406,  1559, 49407]])
# attention_mask:  tensor([[1, 1, 1], [1, 1, 1]])
# pixel_values:  tensor([[[[-0.0113, ...,]]]])
# image_shape:  torch.Size([2, 3, 224, 224])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;CLIPProcessor에는 CLIPImageProcessor와 CLIPTokenizer가 내부적으로 포함되어 있다.&lt;br /&gt;input_ids에서 49406과 49407은 각각 startoftext와 endoftext를 나타내는 특별한 값이다.&lt;br /&gt;attention_mask는 변환된 token_types로&lt;br /&gt;값이 1이면 해당위치토큰이 실제데이터값을 나타내고, 0은 [PAD]를 의미한다.&lt;/p&gt;
&lt;pre id=&quot;code_1731909258498&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;with torch.no_grad():
  outputs = model(**inputs)
  logits_per_image = outputs.logits_per_image
  probs = logits_per_image.softmax(dim=1)
  print('outputs:', outputs.keys())
  print('logits_per_image:', logits_per_image)
  print('probs: ', probs)

for idx, prob in enumerate(probs):
  print(f'- Image #{idx}')
  for label, p in zip(labels, prob):
    print(f'{label}: {p.item():.4f}')

# ============================================
# outputs: odict_keys(['logits_per_image', 'logits_per_text', 'text_embeds', 'image_embeds', 'text_model_output', 'vision_model_output'])
# logits_per_image: tensor([[23.3881, 18.8604], [24.8627, 21.5765]])
# probs:  tensor([[0.9893, 0.0107], [0.9640, 0.0360]])
# - Image #0
# dog: 0.9893
# food: 0.0107
# - Image #1
# dog: 0.9640
# food: 0.0360&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Zero shot Detection&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;자연어적 설명에는 이미지 내 객체와 개략적 위치정보를 암시적으로 포함한다.&lt;br /&gt;CLIP에서 img-txt쌍으로 시각적특징과 텍스트간 연관성을 학습가능함을 보였기에,&amp;nbsp;&lt;br /&gt;추론 시, 주어진 txt prompt만 잘 설계한다면 객체의 위치를 예측할 수 있게된다.&lt;br /&gt;따라서 zero-shot object detection에서는 전통적인 annotation정보 없이도 시각과 언어간의 상관관계를 학습하여 새로운 객체클래스를 검출할 수 있게 해준다.&lt;br /&gt;OWL-ViT의 경우, Multi-Modal Backbone모델로 CLIP모델을 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;OWLv2 (OWL-ViT)&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3260&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUoHqj/btsKLc90PDB/6YX49Uf8UjYKnMunGjWk51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUoHqj/btsKLc90PDB/6YX49Uf8UjYKnMunGjWk51/img.png&quot; data-alt=&quot;OWL-ViT구조, OWLv2는 객체검출헤드에 Objectness Classifier추가함.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUoHqj/btsKLc90PDB/6YX49Uf8UjYKnMunGjWk51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUoHqj%2FbtsKLc90PDB%2F6YX49Uf8UjYKnMunGjWk51%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;3260&quot; height=&quot;1036&quot; data-origin-width=&quot;3260&quot; data-origin-height=&quot;1036&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OWL-ViT구조, OWLv2는 객체검출헤드에 Objectness Classifier추가함.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OWL-ViT는 img-txt쌍으로 pretrain하여 Open-Vocabulary객체탐지가 가능하다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;OWLv2는 Self-Training기법으로 성능을 크게 향상시켰다.&lt;br /&gt;즉, 기존 Detector로 Weak Supervision방식으로 가상의 Bbox-Annotation을 자동생성한다.&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ex) input: img-txt pair[강아지가 공을 가지고 노는]&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;기존 detector: [강아지 bbox] [공 bbox] 자동예측, annotation생성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;--&amp;gt; 모델 학습에 이용 (즉, 정확한 위치정보는 없지만 부분적 supervision signal로 weak signal기반, 모델이 객체의 위치 및 클래스를 추론, 학습하게 함)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Zero-Shot Detection 예시&lt;/h4&gt;
&lt;pre id=&quot;code_1731909258500&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import io
from PIL import Image
from datasets import load_dataset
from transformers import Owlv2Processor, Owlv2ForObjectDetection

processor = Owlv2Processor.from_pretrained(&quot;google/owlv2-base-patch16&quot;)
model = Owlv2ForObjectDetection.from_pretrained(&quot;google/owlv2-base-patch16&quot;)
dataset = load_dataset('Francesco/animals-ij5d2')
print(dataset)
print(dataset['test'][0])

# ==========================================================
# DatasetDict({
#     train: Dataset({
#         features: ['image_id', 'image', 'width', 'height', 'objects'],
#         num_rows: 700
#     })
#     validation: Dataset({
#         features: ['image_id', 'image', 'width', 'height', 'objects'],
#         num_rows: 100
#     })
#     test: Dataset({
#         features: ['image_id', 'image', 'width', 'height', 'objects'],
#         num_rows: 200
#     })
# })
# {'image_id': 63, 'image': &amp;lt;PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=640x640 at 0x7A2B0186E4A0&amp;gt;, 'width': 640, 'height': 640, 'objects': {'id': [96, 97, 98, 99], 'area': [138029, 8508, 10150, 20624], 'bbox': [[129.0, 291.0, 395.5, 349.0], [119.0, 266.0, 93.5, 91.0], [296.0, 280.0, 116.0, 87.5], [473.0, 284.0, 167.0, 123.5]], 'category': [3, 3, 3, 3]}}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Label 및 Image 전처리&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258501&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;images = dataset['test']['image'][:2]
categories = dataset['test'].features['objects'].feature['category'].names
labels = [categories] * len(images)
inputs = processor(text=labels, images=images, return_tensors=&quot;pt&quot;, padding=True)

print(images)
print(labels)
print('input_ids:', inputs['input_ids'])
print('attention_mask:', inputs['attention_mask'])
print('pixel_values:', inputs['pixel_values'])
print('image_shape:', inputs['pixel_values'].shape)

# ==========================================================
# [&amp;lt;PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=640x640 at 0x7A2ADF7CF790&amp;gt;, &amp;lt;PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=640x640 at 0x7A2ADF7CCC10&amp;gt;]
# [['animals', 'cat', 'chicken', 'cow', 'dog', 'fox', 'goat', 'horse', 'person', 'racoon', 'skunk'], ['animals', 'cat', 'chicken', 'cow', 'dog', 'fox', 'goat', 'horse', 'person', 'racoon', 'skunk']]
# input_ids: tensor([[49406,  4995, 49407,     0],
#         [49406,  2368, 49407,     0],
#         [49406,  3717, 49407,     0],
#         [49406,  9706, 49407,     0],
#         [49406,  1929, 49407,     0],
#         [49406,  3240, 49407,     0],
#         [49406,  9530, 49407,     0],
#         [49406,  4558, 49407,     0],
#         [49406,  2533, 49407,     0],
#         [49406,  1773,  7100, 49407],
#         [49406, 42194, 49407,     0],
#         [49406,  4995, 49407,     0],
#         [49406,  2368, 49407,     0],
#         [49406,  3717, 49407,     0],
#         [49406,  9706, 49407,     0],
#         [49406,  1929, 49407,     0],
#         [49406,  3240, 49407,     0],
#         [49406,  9530, 49407,     0],
#         [49406,  4558, 49407,     0],
#         [49406,  2533, 49407,     0],
#         [49406,  1773,  7100, 49407],
#         [49406, 42194, 49407,     0]])
# attention_mask: tensor([[1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0],
#         [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 1], [1, 1, 1, 0], 
#          [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0],
#           [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 0], [1, 1, 1, 1], [1, 1, 1, 0]])
# pixel_values: tensor([[[[ 1.5264, ..., ]]]])
# image_shape: torch.Size([2, 3, 960, 960])&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;- Detection &amp;amp; Inference&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258503&quot; class=&quot;autoit&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import torch

model.eval()
with torch.no_grad():
    outputs = model(**inputs)

print(outputs.keys()) # odict_keys(['logits', 'objectness_logits', 'pred_boxes', 'text_embeds', 'image_embeds', 'class_embeds', 'text_model_output', 'vision_model_output'])&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;- Post Processing&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258503&quot; class=&quot;prolog&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
from PIL import ImageDraw, ImageFont

# 예측확률이 높은 객체 추출
shape = [dataset['test'][:2]['width'], dataset['test'][:2]['height']]
target_sizes = list(map(list, zip(*shape))) # [[640, 640], [640, 640]]
results = processor.post_process_object_detection(outputs=outputs, threshold=0.5, target_sizes=target_sizes)
print(results)

# Post Processing
for idx, (image, detect) in enumerate(zip(images, results)):
    image = image.copy()
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype(&quot;arial.ttf&quot;, 18)

    for box, label, score in zip(detect['boxes'], detect['labels'], detect['scores']):
        box = [round(i, 2) for i in box.tolist()]
        draw.rectangle(box, outline='red', width=3)

        label_text = f'{labels[idx][label]}: {round(score.item(), 3)}'
        draw.text((box[0], box[1]), label_text, fill='white', font=font)

    plt.imshow(image)
    plt.axis('off')
    plt.show()
    
# ==============================================
# [{'scores': tensor([0.5499, 0.6243, 0.6733]), 'labels': tensor([3, 3, 3]), 'boxes': tensor([[329.0247, 287.1844, 400.3372, 357.9262],
#         [122.9359, 272.8753, 534.3260, 637.6506],
#         [479.7363, 294.2744, 636.4859, 396.8372]])}, {'scores': tensor([0.7538]), 'labels': tensor([7]), 'boxes': tensor([[ -0.7799, 173.7043, 440.0294, 538.7166]])}]&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caA7eQ/btsKLwAnkHa/2HzcU9hNdmxEbZJGAMtmO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caA7eQ/btsKLwAnkHa/2HzcU9hNdmxEbZJGAMtmO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caA7eQ/btsKLwAnkHa/2HzcU9hNdmxEbZJGAMtmO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaA7eQ%2FbtsKLwAnkHa%2F2HzcU9hNdmxEbZJGAMtmO1%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;1056&quot; height=&quot;530&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Zero shot Semantic segmentation&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Image Segmentation은 보다 정밀한, 픽셀별 분류를 수행하기에 높은 계산비용이 들며, 광범위한 train data와 정교한 알고리즘을 필요로 한다.&lt;br /&gt;전통적 방법으로는 threshold기반 binary classification, Edge Detection등이 있으며&lt;br /&gt;최신 방법으로는 딥러닝모델을 이용해 Image Segmentation을 진행한다.&lt;br /&gt;전통적 방법은 단순하고 빠르지만 복잡하거나 다양한 조명조건 등에서 성능이 크게 저하되는 단점이 존재한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;SAM (Segment Anything Model)&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style13&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Model&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Architecture&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Input_Size&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Patch_Size&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;#params&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #000000; text-align: center;&quot;&gt;facebook/sam-vit-base&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ViT-B/16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1024&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;10&lt;/span&gt;24&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #000000; text-align: center;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0.9B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #000000; text-align: center;&quot;&gt;facebook/sam-vit-large&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;ViT-L/16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;1024&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;10&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;24&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;16&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;16&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;3.1B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #efefef; color: #000000; text-align: center;&quot;&gt;facebook/sam-vit-huge&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;ViT-H/16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;1024&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;10&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: center;&quot;&gt;24&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #000000; text-align: center;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;&amp;times;16&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6.4B&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3JH00/btsKMPFCl2q/aQH3Y8XW5nOQ9owEV0qiDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3JH00/btsKMPFCl2q/aQH3Y8XW5nOQ9owEV0qiDK/img.png&quot; data-alt=&quot;SAM구조: img-encoder, prompt-encoder, mask-decoder&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3JH00/btsKMPFCl2q/aQH3Y8XW5nOQ9owEV0qiDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3JH00%2FbtsKMPFCl2q%2FaQH3Y8XW5nOQ9owEV0qiDK%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;2212&quot; height=&quot;552&quot; data-origin-width=&quot;2212&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SAM구조: img-encoder, prompt-encoder, mask-decoder&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;SAM은 Meta에서 개발한 다양한 도메인에서 수집한 1100만개 이미지를 이용해 학습한 모델이다.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇기에 다양한 환경에서 image segmentation작업을 고수준으로 수행가능하다.&lt;br /&gt;SAM을 이용하면 많은경우, 추가적인 Fine-Tuning없이, 다양한 Domain image에 대한 segmentation이 가능하다.&lt;br /&gt;&lt;br /&gt;SAM은 prompt를 받을수도 있고, 받지 않아도 되는데, prompt는 좌표, bbox, txt 등 다양하게 줄 수 있다.&lt;br /&gt;추가적으로 prompt를 주지 않으면 img 전체에 대한 포괄적인 Segmentation을 진행한다.&lt;br /&gt;다만, Inference결과로 Binary Mask는 제공하지만 pixel에 대한 구체적 class정보는 포함하지 않는다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;SAM 활용 예시&lt;/h4&gt;
&lt;pre id=&quot;code_1731909258507&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import io
from PIL import Image
from datasets import load_dataset
from transformers import SamProcessor, SamModel

def filter_category(data):
    # 16 = dog
    # 23 = giraffe
    return 16 in data[&quot;objects&quot;][&quot;category&quot;] or 23 in data[&quot;objects&quot;][&quot;category&quot;]

def convert_image(data):
    byte = io.BytesIO(data[&quot;image&quot;][&quot;bytes&quot;])
    img = Image.open(byte)
    return {&quot;img&quot;: img}

model_name = &quot;facebook/sam-vit-base&quot;
processor = SamProcessor.from_pretrained(model_name) 
model = SamModel.from_pretrained(model_name)

dataset = load_dataset(&quot;s076923/coco-val&quot;)
filtered_dataset = dataset[&quot;validation&quot;].filter(filter_category)
converted_dataset = filtered_dataset.map(convert_image, remove_columns=[&quot;image&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731909258508&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import numpy as np
from matplotlib import pyplot as plt


def show_point_box(image, input_points, input_labels, input_boxes=None, marker_size=375):
    plt.figure(figsize=(10, 10))
    plt.imshow(image)
    ax = plt.gca()
    
    input_points = np.array(input_points)
    input_labels = np.array(input_labels)

    pos_points = input_points[input_labels[0] == 1]
    neg_points = input_points[input_labels[0] == 0]
    
    ax.scatter(
        pos_points[:, 0],
        pos_points[:, 1],
        color=&quot;green&quot;,
        marker=&quot;*&quot;,
        s=marker_size,
        edgecolor=&quot;white&quot;,
        linewidth=1.25
    )
    ax.scatter(
        neg_points[:, 0],
        neg_points[:, 1],
        color=&quot;red&quot;,
        marker=&quot;*&quot;,
        s=marker_size,
        edgecolor=&quot;white&quot;,
        linewidth=1.25
    )

    if input_boxes is not None:
        for box in input_boxes:
            x0, y0 = box[0], box[1]
            w, h = box[2] - box[0], box[3] - box[1]
            ax.add_patch(
                plt.Rectangle(
                    (x0, y0), w, h, edgecolor=&quot;green&quot;, facecolor=(0, 0, 0, 0), lw=2
                )
            )

    plt.axis(&quot;on&quot;)
    plt.show()


image = converted_dataset[0][&quot;img&quot;]
input_points = [[[250, 200]]]
input_labels = [[[1]]]

show_point_box(image, input_points[0], input_labels[0])
inputs = processor(
    image, input_points=input_points, input_labels=input_labels, return_tensors=&quot;pt&quot;
)

# input_points shape : torch.Size([1, 1, 1, 2])
# input_points : tensor([[[[400.2347, 320.0000]]]], dtype=torch.float64)
# input_labels shape : torch.Size([1, 1, 1])
# input_labels : tensor([[[1]]])
# pixel_values shape : torch.Size([1, 3, 1024, 1024])
# pixel_values : tensor([[[[ 1.4612,  ...]]])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;input_points&lt;/b&gt;: [B, 좌표개수, 좌표] -- 관심갖는 객체나 영역지정 좌표&lt;br /&gt;&lt;b&gt;input_labels&lt;/b&gt;: [B, 좌표B, 좌표개수] -- input_points에 대응되는 label정보&lt;br /&gt;&amp;nbsp;- input_labels종류:&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.4281%;&quot;&gt;번호&lt;/td&gt;
&lt;td style=&quot;width: 27.883%;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 58.6888%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.4281%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 27.883%;&quot;&gt;foreground 클래스&lt;/td&gt;
&lt;td style=&quot;width: 58.6888%;&quot;&gt;검출하고자 하는 관심객체가 포함된 좌표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.4281%;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 27.883%;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;not foreground 클래스&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 58.6888%;&quot;&gt;관심객체가 포함되지 않은 좌표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.4281%;&quot;&gt;-1&lt;/td&gt;
&lt;td style=&quot;width: 27.883%;&quot;&gt;background 클래스&lt;/td&gt;
&lt;td style=&quot;width: 58.6888%;&quot;&gt;배경영역에 해당하는 좌표&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.4281%;&quot;&gt;-10&lt;/td&gt;
&lt;td style=&quot;width: 27.883%;&quot;&gt;padding 클래스&lt;/td&gt;
&lt;td style=&quot;width: 58.6888%;&quot;&gt;batch_size를 맞추기 위한 padding값 (모델이 처리X)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Processor로 처리된 이후 출력결과]&lt;br /&gt;input_points&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;: [B, 좌표B, 분할마스크 당 좌표개수, 좌표위치]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;input_labels&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;: [B, 좌표B, 좌표개수]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;1310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPKQ2/btsKLphf6Lc/ChFyi0vor6jnVogdutNHI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPKQ2/btsKLphf6Lc/ChFyi0vor6jnVogdutNHI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPKQ2/btsKLphf6Lc/ChFyi0vor6jnVogdutNHI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPKQ2%2FbtsKLphf6Lc%2FChFyi0vor6jnVogdutNHI1%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;281&quot; height=&quot;404&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;1310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;pre id=&quot;code_1731909258510&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import torch


def show_mask(mask, ax, random_color=False):
    if random_color:
        color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
    else:
        color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
    h, w = mask.shape[-2:]
    mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
    ax.imshow(mask_image)


def show_masks_on_image(raw_image, masks, scores):
    if len(masks.shape) == 4:
        masks = masks.squeeze()
    if scores.shape[0] == 1:
        scores = scores.squeeze()

    nb_predictions = scores.shape[-1]
    fig, axes = plt.subplots(1, nb_predictions, figsize=(30, 15))

    for i, (mask, score) in enumerate(zip(masks, scores)):
        mask = mask.cpu().detach()
        axes[i].imshow(np.array(raw_image))
        show_mask(mask, axes[i])
        axes[i].title.set_text(f&quot;Mask {i+1}, Score: {score.item():.3f}&quot;)
        axes[i].axis(&quot;off&quot;)
    plt.show()


model.eval()
with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(),
    inputs[&quot;original_sizes&quot;].cpu(),
    inputs[&quot;reshaped_input_sizes&quot;].cpu(),
)

show_masks_on_image(image, masks[0], outputs.iou_scores)
print(&quot;iou_scores shape :&quot;, outputs.iou_scores.shape)
print(&quot;iou_scores :&quot;, outputs.iou_scores)
print(&quot;pred_masks shape :&quot;, outputs.pred_masks.shape)
print(&quot;pred_masks :&quot;, outputs.pred_masks)

# iou_scores shape : torch.Size([1, 1, 3])
# iou_scores : tensor([[[0.7971, 0.9507, 0.9603]]])
# pred_masks shape : torch.Size([1, 1, 3, 256, 256])
# pred_masks : tensor([[[[[ -3.6988, ..., ]]]]])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;iou_scrores&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;: [B, 좌표개수, IoU점수]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;pred_masks&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;: [B, 좌표B, C, H, W]&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3250&quot; data-origin-height=&quot;1478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRVG0R/btsKMfL1adF/0PuTyfrS6ikNe38kEiccBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRVG0R/btsKMfL1adF/0PuTyfrS6ikNe38kEiccBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRVG0R/btsKMfL1adF/0PuTyfrS6ikNe38kEiccBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRVG0R%2FbtsKMfL1adF%2F0PuTyfrS6ikNe38kEiccBK%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;3250&quot; height=&quot;1478&quot; data-origin-width=&quot;3250&quot; data-origin-height=&quot;1478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;pre id=&quot;code_1731909258511&quot; class=&quot;prolog&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;input_points = [[[250, 200], [15, 50]]]
input_labels = [[[0, 1]]]
input_boxes = [[[100, 100, 400, 600]]]

show_point_box(image, input_points[0], input_labels[0], input_boxes[0])
inputs = processor(
    image,
    input_points=input_points,
    input_labels=input_labels,
    input_boxes=input_boxes,
    return_tensors=&quot;pt&quot;
)

model.eval()
with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(),
    inputs[&quot;original_sizes&quot;].cpu(),
    inputs[&quot;reshaped_input_sizes&quot;].cpu(),
)

show_masks_on_image(image, masks[0], outputs.iou_scores)​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/saZ7o/btsKL5pj6v8/JIlWJhnwRJOnYE4Kq2gjg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/saZ7o/btsKL5pj6v8/JIlWJhnwRJOnYE4Kq2gjg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/saZ7o/btsKL5pj6v8/JIlWJhnwRJOnYE4Kq2gjg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsaZ7o%2FbtsKL5pj6v8%2FJIlWJhnwRJOnYE4Kq2gjg0%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;1658&quot; height=&quot;578&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Zero shot Instance segmentation&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Zero shot Detection + SAM&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAM의 경우, 검출된 객체의 클래스를 분류하는 기능이 없다.&lt;br /&gt;즉, 이미지 내 객체를 픽셀단위로 구분하는 instance segmentation작업에는 어려움이 존재한다.&lt;br /&gt;&lt;br /&gt;이런 한계극복을 위해 zero-shot detection model과 SAM을 함께 활용할 수 있다:&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) zero shot detection모데로 객체 클래스와 bbox영역 검출&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2) bbox영역내 SAM모델로 semantic segmentation 진행.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258512&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import pipeline

generator = pipeline(&quot;mask-generation&quot;, model=model_name)
outputs = generator(image, points_per_batch=32)

plt.imshow(np.array(image))
ax = plt.gca()
for mask in outputs[&quot;masks&quot;]:
    show_mask(mask, ax=ax, random_color=True)
plt.axis(&quot;off&quot;)
plt.show()

print(&quot;outputs mask의 개수 :&quot;, len(outputs[&quot;masks&quot;]))
print(&quot;outputs scores의 개수 :&quot;, len(outputs[&quot;scores&quot;]))

# outputs mask의 개수 : 52
# outputs scores의 개수 : 52&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhxx6/btsKLcP2vOO/PpwobEl3GUlUyf36pz7Zt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhxx6/btsKLcP2vOO/PpwobEl3GUlUyf36pz7Zt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhxx6/btsKLcP2vOO/PpwobEl3GUlUyf36pz7Zt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frhxx6%2FbtsKLcP2vOO%2FPpwobEl3GUlUyf36pz7Zt0%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;261&quot; height=&quot;386&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;
&lt;pre id=&quot;code_1731909258512&quot; class=&quot;prolog&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;detector = pipeline(
    model=&quot;google/owlv2-base-patch16&quot;, task=&quot;zero-shot-object-detection&quot;
)

image = converted_dataset[24][&quot;img&quot;]
labels = [&quot;dog&quot;, &quot;giraffe&quot;]
results = detector(image, candidate_labels=labels, threshold=0.5)

input_boxes = []
for result in results:
    input_boxes.append(
        [
            result[&quot;box&quot;][&quot;xmin&quot;],
            result[&quot;box&quot;][&quot;ymin&quot;],
            result[&quot;box&quot;][&quot;xmax&quot;],
            result[&quot;box&quot;][&quot;ymax&quot;]
        ]
    )
    print(result)

inputs = processor(image, input_boxes=[input_boxes], return_tensors=&quot;pt&quot;)

model.eval()
with torch.no_grad():
    outputs = model(**inputs)

masks = processor.image_processor.post_process_masks(
    outputs.pred_masks.cpu(),
    inputs[&quot;original_sizes&quot;].cpu(),
    inputs[&quot;reshaped_input_sizes&quot;].cpu()
)

plt.imshow(np.array(image))
ax = plt.gca()

for mask, iou in zip(masks[0], outputs.iou_scores[0]):
    max_iou_idx = torch.argmax(iou)
    best_mask = mask[max_iou_idx]
    show_mask(best_mask, ax=ax, random_color=True)

plt.axis(&quot;off&quot;)
plt.show()

#{'score': 0.6905778646469116, 'label': 'giraffe', 'box': {'xmin': 96, 'ymin': 198, 'xmax': 294, 'ymax': 577}}
#{'score': 0.6264181733131409, 'label': 'giraffe', 'box': {'xmin': 228, 'ymin': 199, 'xmax': 394, 'ymax': 413}}&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKVoN/btsKM2SJWWI/k9P4pDvZ33X4uPQfwU6FFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKVoN/btsKM2SJWWI/k9P4pDvZ33X4uPQfwU6FFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKVoN/btsKM2SJWWI/k9P4pDvZ33X4uPQfwU6FFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKVoN%2FbtsKM2SJWWI%2Fk9P4pDvZ33X4uPQfwU6FFK%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;230&quot; height=&quot;340&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Image Matching&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;image matching은 디지털 이미지간 유사성을 정량화, 비교하는 방법이다.&lt;br /&gt;이를 image의 feature vector를 추출하여 각 image vector간 유사도(거리)를 측정하여 계산한다.&lt;br /&gt;그렇기에 이미지 매칭의 핵심은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;&lt;b&gt;&quot;이미지 특징을 효과적으로 포착하는 feature vector의 생성&quot;&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;이다.&lt;br /&gt;(보통 특징벡터가 고차원일수록 더 많은 정보를 포함하며, 이 특징벡터는 classification layer와 같은 층을 통과하기 직전(= Feature Extractor의 결과값 = Classifier 직전값) 벡터를 보통 의미한다.)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;ex) ViT를 이용한 특징벡터 추출 예제&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258514&quot; class=&quot;markdown&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import torch
from datasets import load_dataset
from transformers import ViTImageProcessor, ViTModel

dataset = load_dataset(&quot;huggingface/cats-image&quot;)
image = dataset[&quot;test&quot;][&quot;image&quot;][0]

model_name = &quot;google/vit-base-patch16-224&quot;
processor = ViTImageProcessor.from_pretrained(model_name)
model = ViTModel.from_pretrained(model_name)

inputs = processor(image, return_tensors=&quot;pt&quot;)
with torch.no_grad():
    outputs = model(inputs[&quot;pixel_values&quot;])

print(&quot;마지막 특징 맵의 형태 :&quot;, outputs[&quot;last_hidden_state&quot;].shape)
print(&quot;특징 벡터의 차원 수 :&quot;, outputs[&quot;last_hidden_state&quot;][:, 0, :].shape)
print(&quot;특징 벡터 :&quot;, outputs[&quot;last_hidden_state&quot;][:, 0, :])

# 마지막 특징 맵의 형태 : torch.Size([1, 197, 768])
# 특징 벡터의 차원 수 : torch.Size([1, 768])
# 특징 벡터 : tensor([[ 2.9420e-01,  8.3502e-01,  ..., -8.4114e-01,  1.7990e-01]])&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;ImageNet-21K라는 방대한 사전Dataset으로 학습되어 미세한 차이 및 복잡한 패턴을 인식할 수 있게 된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;ViT에서 feature vector추출 시, 주목할점은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;last_hidden_state 키 값&lt;/b&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;이다:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;출력이 [1, 197, 768]의&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;[B, 출력토큰수, feature차원]&lt;/b&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;을 의미하는데, 197개의 출력토큰은 다음을 의미한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;224&amp;times;224 --&amp;gt; 16&lt;/span&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;times;16(patch_size) --&amp;gt; 196개 patches,&lt;br /&gt;&lt;/span&gt;&lt;b&gt;197 = [CLS] + 196 patches&lt;/b&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;로 이루어진 출력토큰에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; color: #ee2323;&quot;&gt;&lt;b&gt;[CLS]를 특징벡터로 사용&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px;&quot;&gt;한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 20px; letter-spacing: -1px;&quot;&gt;FAISS (Facebook AI Similarity Search)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FAISS는 메타에서 개발한 고성능 벡터유사도검색 라이브러리이다.&lt;br /&gt;이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;u&gt;&quot;대규모 고차원 벡터 데이터베이스에서 유사한 벡터를 검색&quot;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;가능하게 설계되었다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;b&gt;cf) [벡터 저장 및 관리방식]&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로컬 저장 장치: SSD나 NVMe같은 고속저장장치를 사용해 빠른 데이터 접근이 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 시스템: PstgreSQL, pgvector확장이나 MongoDB의 Atlas Vector Search같은 벡터검색기능을 지원하는 데이터베이스를 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라우드 벡터 데이터베이스: Amazon OpenSearch, Ggogle Vetex AI등 클라우드 서비스는 대규모 벡터데이터의 저장 및 검색을 위한 특화된 솔루션을 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 벡터검색엔진: Milvus, Qdrant, Weaviate, FAISS 등의 벡터 데이터 베이스는 대규모 벡터 dataset의 효율적 저장 및 고성능 검색을 위해 최적화되어 ANN(Approximate Nearest Neighbor)알고리즘으로 빠른 유사도검색을 지원, 실시간 검색이 필요한 경우 특히나 적합하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-size: 1.25em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;ex) CLIP을 이용한 이미지 특징벡터 추출 예제&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258516&quot; class=&quot;nix&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: left;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import numpy as np
from datasets import load_dataset
from transformers import CLIPProcessor, CLIPModel

dataset = load_dataset(&quot;sasha/dog-food&quot;)
images = dataset[&quot;test&quot;][&quot;image&quot;][:100]

model_name = &quot;openai/clip-vit-base-patch32&quot;
processor = CLIPProcessor.from_pretrained(model_name)
model = CLIPModel.from_pretrained(model_name)

vectors = []
with torch.no_grad():
    for image in images:
        inputs = processor(images=image, padding=True, return_tensors=&quot;pt&quot;)
        outputs = model.get_image_features(**inputs)
        vectors.append(outputs.cpu().numpy())

vectors = np.vstack(vectors)
print(&quot;이미지 벡터의 shape :&quot;, vectors.shape)

# 이미지 벡터의 shape : (100, 512)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt; dog-food dataset에서 100개 이미지를 선택&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 이미지 벡터를 추출&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;vectors리스트에 저장&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;rarr; ndarray형식으로 변환&lt;br /&gt;&lt;br /&gt;이런 특징벡터를 유사도 검색을 위한 인덱스 생성에 활용가능하다:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;생성된 인덱스에 이미지 벡터를 등록하기 위해 add를 사용하는데, 이때 입력되는 이미지 벡터는 반드시 numpy의 ndarray형식의 [벡터개수, 벡터차원수] 형태로 구성되어야 한다!!&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258516&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import faiss

dimension = vectors.shape[-1]
index = faiss.IndexFlatL2(dimension)
if torch.cuda.is_available():
    res = faiss.StandardGpuResources()
    index = faiss.index_cpu_to_gpu(res, 0, index)

index.add(vectors)


import matplotlib.pyplot as plt

search_vector = vectors[0].reshape(1, -1)
num_neighbors = 5
distances, indices = index.search(x=search_vector, k=num_neighbors)

fig, axes = plt.subplots(1, num_neighbors + 1, figsize=(15, 5))

axes[0].imshow(images[0])
axes[0].set_title(&quot;Input Image&quot;)
axes[0].axis(&quot;off&quot;)

for i, idx in enumerate(indices[0]):
    axes[i + 1].imshow(images[idx])
    axes[i + 1].set_title(f&quot;Match {i + 1}\nIndex: {idx}\nDist: {distances[0][i]:.2f}&quot;)
    axes[i + 1].axis(&quot;off&quot;)

print(&quot;유사한 벡터의 인덱스 번호:&quot;, indices)
print(&quot;유사도 계산 결과:&quot;, distances)

# 유사한 벡터의 인덱스 번호: [[ 0  6 75  1 73]]
# 유사도 계산 결과: [[ 0.       43.922516 44.92473  46.544144 47.058586]]&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xwyaP/btsKMaqN7Kv/67GJUWAfk9XKnSnxMF4SEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xwyaP/btsKMaqN7Kv/67GJUWAfk9XKnSnxMF4SEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xwyaP/btsKMaqN7Kv/67GJUWAfk9XKnSnxMF4SEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxwyaP%2FbtsKMaqN7Kv%2F67GJUWAfk9XKnSnxMF4SEK%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;1522&quot; height=&quot;420&quot; data-origin-width=&quot;1522&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;위 과정을 통해 100개의 벡터를 저장한 FAISS 인덱스가 생성되며, 검색하고자하는 이미지의 특징벡터를 입력으로 인덱스 내에서 가장 유사한 벡터를 효율적으로 추출가능하다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;다만, 인덱스에 저장된 벡터에 대해서만 검색이 가능하기에 검색범위를 확장하고자 한다면 더 많은 벡터를 인덱스에 추가해야한다.&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위 코드를 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;아래와 같은 코드가 있는데, FAISS 라이브러리에서는 다양한 인덱스유형들을 제공한다:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258518&quot; class=&quot;fortran&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;index = faiss.IndexFlatL2(dimension)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style13&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이름&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정확도&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;속도&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #6ed3d8; color: #ffffff; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특징&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IndexFlatL2&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 느림&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;모든 벡터에 대한 완전탐색을 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IndexHNSW&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;높음&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9;&quot;&gt;그래프 구조를 사용해 효율적 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IndexIVFlat&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;보통&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 빠름&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;벡터간 clustering으로 탐색범위를 줄여 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Multi-Modal&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Image Captioning (img2txt)&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;BLIP&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;BLIP의 핵심아이디어는 &quot;img와 Txt의 상호작용을 모델링하는 것&quot;이다.&lt;br /&gt;이를 위해 img-encoder, txt-encoder로 각각의 feature vector를 연결해 통합 표현을 생성한다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6GZO/btsKMcB5Vno/qNhhZl7MiFTp14GKKAHH20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6GZO/btsKMcB5Vno/qNhhZl7MiFTp14GKKAHH20/img.png&quot; data-alt=&quot;BLIP-2 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6GZO/btsKMcB5Vno/qNhhZl7MiFTp14GKKAHH20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6GZO%2FbtsKMcB5Vno%2FqNhhZl7MiFTp14GKKAHH20%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;1518&quot; height=&quot;874&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BLIP-2 구조&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;BLIP2는 Q-Former를 도입해 img-txt간 상호작용과 정보교환을 향상시켰다:&lt;br /&gt;[img-txt대조학습, ITM, img기반 txt생성] --&amp;gt; 동시에 하나의 Encode-Decoder구조로 수행&lt;br /&gt;Q-Former는 입력으로 고정된 이미지 feature embedding을 받은 후&lt;br /&gt;img-txt관계가 잘 표현된 Soft visual prompt Embedding을 출력한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;DocumentQA&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DQA(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;DocumentQA&lt;/span&gt;)는 자연어처리 + 정보검색기술을 융합해 QA를 진행하는 것이다.&lt;br /&gt;DQA는 시각적 구조와 Layout을 고려해야하는데, 이 중 가장 주목받는 모델 중 하나가 바로 LayoutLM이다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt; LayoutLM (Layout-aware Language Model)&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;LayoutLM은 Microsoft에서 문서 이미지의 txt뿐만아니라 Layout정보까지 함께 Pre-Train된 모델이다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&lt;br /&gt;[&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://arxiv.org/pdf/1912.13318&quot;&gt;LayoutLMv1&lt;/a&gt;]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z5oVX/btsKObBxdga/kq838NpUnXW3kWgZh7JQGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z5oVX/btsKObBxdga/kq838NpUnXW3kWgZh7JQGk/img.png&quot; data-alt=&quot;LayoutLM-v1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z5oVX/btsKObBxdga/kq838NpUnXW3kWgZh7JQGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz5oVX%2FbtsKObBxdga%2Fkq838NpUnXW3kWgZh7JQGk%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;1118&quot; height=&quot;501&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LayoutLM-v1&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;BERT를 기반으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;txt와 함께 txt의 위치정보를 입력으로 사용&lt;/u&gt;&lt;/span&gt;한다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Faster R-CNN같은 OCR모델로 txt와 bbox경계를 추출, position embedding으로 추가하며 단어의 image patch(feature)도 model에 입력한다. 다만, LayoutLMv1은 image feature가 맨 마지막에 추가되어 Pretrain시 실제로 활용할 수 없다는 단점이 존재한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;br /&gt;&lt;b&gt;[&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://arxiv.org/pdf/2012.14740&quot;&gt;LayoutLMv2&lt;/a&gt;]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;1085&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IGd2e/btsKMZvgghS/FYnM9AtQFDKL9YrESad2k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IGd2e/btsKMZvgghS/FYnM9AtQFDKL9YrESad2k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IGd2e/btsKMZvgghS/FYnM9AtQFDKL9YrESad2k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIGd2e%2FbtsKMZvgghS%2FFYnM9AtQFDKL9YrESad2k0%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;1208&quot; height=&quot;1085&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;1085&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;LayoutLMv2는 image embedding을 추가로 도입해 문서의 시각적 정보를 효과적으로 반영한다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;LayoutLMv2에서&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;visual embedding이 ResNeXT-FPN으로 추출된다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;즉, txt, img-patch, layout정보를 동시에 입력으로 받아 Self-Attention을 수행한다.&lt;br /&gt;&lt;b&gt;- 학습 주요 목표:&lt;/b&gt;&lt;br /&gt;i) Masked Visual-Language Modeling: 문장의 빈칸 예측&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i) ITM: 특정 텍스트와 해당 이미지간의 연관성 학습&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i)Text-Image Alignment: 이미지에서 특정 단어가 가려졌을 때, 그 위치를 식별하는 능력&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://arxiv.org/pdf/2204.08387&quot;&gt;LayoutLMv3&lt;/a&gt;]&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FjDIO/btsKNTOOPvy/q3sFwo14ARYV9k4gJmmie0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FjDIO/btsKNTOOPvy/q3sFwo14ARYV9k4gJmmie0/img.png&quot; data-alt=&quot;좌)DocFormer , 우)LayoutLMv3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FjDIO/btsKNTOOPvy/q3sFwo14ARYV9k4gJmmie0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFjDIO%2FbtsKNTOOPvy%2Fq3sFwo14ARYV9k4gJmmie0%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;1852&quot; height=&quot;804&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;좌)DocFormer , 우)LayoutLMv3&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;LayoutLMv3는 Faster R-CNN, CNN등의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;Pre-Trained Backbone에 의존하지 않는 최초의 통합 MLLMs&lt;/u&gt;&lt;/span&gt;이다.&lt;br /&gt;이를 위해 전과 달리 새로운 사전학습전략 및 과제를 도입하였다:&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i) Masked Language Modeling(&lt;b&gt;MLM&lt;/b&gt;): 일부 단어 token 마스킹&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Masked Image Modeling(&lt;b&gt;MIM&lt;/b&gt;)&lt;/span&gt;: 마스킹된 token에 해당하는 이미지 부분을 마스킹&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;i) Word Patch&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Alignment(&lt;b&gt;WPA&lt;/b&gt;): img token과 대응되는 Txt token의 마스킹여부를 이진분류, 두 모달리티간 정렬을 학습&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&amp;lt;LayoutLMv3 구조&amp;gt;&lt;/b&gt;: embedding계층, patch_embedding모듈, encoder&lt;br /&gt;1) embedding층은 다양한 유형의 Embedding을 통합:&lt;br /&gt;&amp;nbsp;- word_embed + token_type_emb + pos_emb + (x_pos_emb , y_pos_emb, h_pos_emb, w_pos_emb)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;patch_embedding모듈은 이미지를 처리&lt;/span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;patch로 분할하고 각 patch를 embedding으로 변환하는 ViT역할&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;3)&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;encoder&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;여러 Transformer층으로 구성.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;VQA&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VQA process: 시각적 특징 추출 &amp;rarr; Q의미파악&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;rarr;시각적특징과 Q의 txt정보를 통합해 의미있는 표현(A)생성&lt;/span&gt;&lt;br /&gt;이를 위해 등장한 것이 바로 ViLT이다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ViLT (Vision-and-Language Transformer)&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3408&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ODf5H/btsKM083Lq8/5FU2TwCwurofSPKqndilyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ODf5H/btsKM083Lq8/5FU2TwCwurofSPKqndilyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ODf5H/btsKM083Lq8/5FU2TwCwurofSPKqndilyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FODf5H%2FbtsKM083Lq8%2F5FU2TwCwurofSPKqndilyK%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;3408&quot; height=&quot;1230&quot; data-origin-width=&quot;3408&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;시각적 입력을 txt입력과 동일한 방식으로 처리하는 단일모델구조로 구성되어 있다.&lt;br /&gt;이때, 두 모달리티 구분을 위해 모달타입 embedding이 추가되며,&lt;br /&gt;학습과정에서 3가지 손실함수를 통해 이뤄진다:&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ITM&lt;/b&gt;: 주어진 Image와 Text가 서로 연관되어있는지 판단.&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;MLM&lt;/b&gt;: 단어단위의 Masking으로 전체 단어맥락 파악&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;WPA&lt;/b&gt;: img-txt간 벡터 유사도 최대화&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결과적으로 img+txt를 효과적으로 결합해, 단일 embedding공간에 표현한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;cf)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;collate_fn&lt;/b&gt;은 pytorch의 dataloader로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;batch를 구성할 때, 각 sample을 어떻게 결합할 것인지 정의&lt;/u&gt;&lt;/span&gt;하는 함수다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Image Generation&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미지 생성은 prompt를 기반으로 이해하여 GAN이나 Diffusion Model을 이용해 prompt의 세부적 특징을 잘 잡아내 새로운 img를 생성하는 기술을 의미한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Diffusion Model&lt;/h4&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJCpv/btsKOcAAHfj/6ZMti7JZk8vACRWW7bkXY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJCpv/btsKOcAAHfj/6ZMti7JZk8vACRWW7bkXY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJCpv/btsKOcAAHfj/6ZMti7JZk8vACRWW7bkXY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJCpv%2FbtsKOcAAHfj%2F6ZMti7JZk8vACRWW7bkXY1%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;510&quot; height=&quot;215&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;[Forward process]: src_img에 점진적&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;정규분포 N&lt;/span&gt;oise 추가&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;[Reverse process]: pure_noise에서 원본으로 복원(by 평균과 표준편차 갱신)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;b&gt;[Stable-Diffusion 1]&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 512&amp;times;512 img 생성&lt;br /&gt;- txt2img, img2img, inpainting 등의 기능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[Stable-Diffusion 2]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;- 768&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;times;768 img 생성&lt;br /&gt;&lt;/span&gt;- OpenCLIP으로 더 나은 WPA 제공, 세부적 묘사 개선&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;[Stable-Diffusion 3]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;- 더욱 고해상도 이미지 생성&lt;br /&gt;- Rectified flow기반의 새로운 모델구조&lt;br /&gt;- txt와 img token간 양방향 정보흐름을 가능하게하는 새로운 모델구조&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; etc&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Hyperparameter Tuning - ray tune&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;raytune은 분산 hypereparameter 최적화 framework이다.&lt;br /&gt;대규모 분산컴퓨팅 환경에서 다양한 hyperparameter 탐색 알고리즘(random, greedy 등)을 지원하며, Early Stopping 또한 제공한다.&lt;br /&gt;추가적으로 실험결과 추적 및 시각화 도구 또한 제공하며, 최적의 hyperparameter 조합 또한 효과적으로 식별할 수 있게 도와준다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1731909258521&quot; class=&quot;cmake&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;!pip3 install ray[tune] optuna&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;ex) NER RayTune 예제&lt;/h4&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;i) 학습 준비&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258521&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from datasets import load_dataset
from transformers import AutoModelForTokenClassification, AutoTokenizer

def preprocess_data(example, tokenizer):
    sentence = &quot;&quot;.join(example[&quot;tokens&quot;]).replace(&quot;\xa0&quot;, &quot; &quot;)
    encoded = tokenizer(
        sentence,
        return_offsets_mapping=True,
        add_special_tokens=False,
        padding=False,
        truncation=False
    )

    labels = []
    for offset in encoded.offset_mapping:
        if offset[0] == offset[1]:
            labels.append(-100)
        else:
            labels.append(example[&quot;ner_tags&quot;][offset[0]])
    encoded[&quot;labels&quot;] = labels
    return encoded

dataset = load_dataset(&quot;klue&quot;, &quot;ner&quot;)
labels = dataset[&quot;train&quot;].features[&quot;ner_tags&quot;].feature.names

model_name = &quot;Leo97/KoELECTRA-small-v3-modu-ner&quot;
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(
    model_name,
    num_labels=len(labels),
    ignore_mismatched_sizes=True
)

processed_dataset = dataset.map(
    lambda example: preprocess_data(example, tokenizer),
    batched=False,
    remove_columns=dataset[&quot;train&quot;].column_names
)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;br /&gt;ii) hyperparameter 탐색&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258522&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from ray import tune
from functools import partial
from transformers import Trainer, TrainingArguments
from transformers.data.data_collator import DataCollatorForTokenClassification

def model_init(model_name, labels):
    return AutoModelForTokenClassification.from_pretrained(
        model_name, num_labels=len(labels), ignore_mismatched_sizes=True
    )

def hp_space(trial):
    return {
        &quot;learning_rate&quot;: tune.loguniform(1e-5, 1e-4),
        &quot;weight_decay&quot;: tune.loguniform(1e-5, 1e-1),
        &quot;num_train_epochs&quot;: tune.choice([1, 2, 3])
    }

def compute_objective(metrics):
    return metrics[&quot;eval_loss&quot;]

training_args = TrainingArguments(
    output_dir=&quot;token-classification-hyperparameter-search&quot;,
    evaluation_strategy=&quot;epoch&quot;,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=32,
    # learning_rate=1e-4,
    # weight_decay=0.01,
    # num_train_epochs=5,
    seed=42
)

trainer = Trainer(
    model_init=partial(model_init, model_name=model_name, labels=labels),
    args=training_args,
    train_dataset=processed_dataset[&quot;train&quot;],
    eval_dataset=processed_dataset[&quot;validation&quot;],
    data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer, padding=True)
)

best_run = trainer.hyperparameter_search(
    backend=&quot;ray&quot;,
    n_trials=5,
    direction=&quot;minimize&quot;,
    hp_space=hp_space,
    compute_objective=compute_objective,
    resources_per_trial={&quot;cpu&quot;: 2, &quot;gpu&quot;: 1},
    trial_dirname_creator=lambda trial: str(trial)
)
print(best_run.hyperparameters)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;br /&gt;&lt;b&gt;model_init 함수:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델 인스턴스 생성 (여러 실험을 통해 최적의 hyperparameter 탐색하게 할당됨.)&lt;br /&gt;즉, 각 실험마다 일관된 초기상태를 보장함.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;hp_space 함수:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;최적화 과정에서 탐색할 hyperparameter 종류와 값의 범위 지정.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;compute_objective 함수:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;최적화 과정에서 사용할 &quot;평가지표&quot;로 보통 eval_loss나 eval_acc를 기준으로 설정.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TrainingArguments 함수:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;lr, weight_decay, train_epochs가 hp_space에서 탐색되기에 따로 할당X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Trainer 함수:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;고정된 모델인스턴스가 아닌, model_init을 사용.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;출력 예시)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731909258524&quot; class=&quot;asciidoc&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;+-------------------------------------------------------------------+
| Configuration for experiment     _objective_2024-11-18_05-44-18   |
+-------------------------------------------------------------------+
| Search algorithm                 BasicVariantGenerator            |
| Scheduler                        FIFOScheduler                    |
| Number of trials                 5                                |
+-------------------------------------------------------------------+

View detailed results here: /root/ray_results/_objective_2024-11-18_05-44-18
To visualize your results with TensorBoard, run: `tensorboard --logdir /tmp/ray/session_2024-11-18_05-44-11_866890_872/artifacts/2024-11-18_05-44-18/_objective_2024-11-18_05-44-18/driver_artifacts`

Trial status: 5 PENDING
Current time: 2024-11-18 05:44:18. Total running time: 0s
Logical resource usage: 0/2 CPUs, 0/1 GPUs (0.0/1.0 accelerator_type:T4)
+-------------------------------------------------------------------------------------------+
| Trial name               status       learning_rate     weight_decay     num_train_epochs |
+-------------------------------------------------------------------------------------------+
| _objective_27024_00000   PENDING        2.36886e-05       0.0635122                     3 |
| _objective_27024_00001   PENDING        6.02131e-05       0.00244006                    2 |
| _objective_27024_00002   PENDING        1.43217e-05       1.7074e-05                    1 |
| _objective_27024_00003   PENDING        3.99131e-05       0.00679658                    2 |
| _objective_27024_00004   PENDING        1.13871e-05       0.00772672                    2 |
+-------------------------------------------------------------------------------------------+

Trial _objective_27024_00000 started with configuration:
+-------------------------------------------------+
| Trial _objective_27024_00000 config             |
+-------------------------------------------------+
| learning_rate                             2e-05 |
| num_train_epochs                              3 |
| weight_decay                            0.06351 |
+-------------------------------------------------+

...&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;GPTQ (Generative Pre-trained Transformer Quantization)&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GPTQ는 모델 최적화방식으로 LLM의 효율성을 크게 향상가능하다.&lt;br /&gt;모델의 가중치를 낮은 bit정밀도로 양자화해 모델크기를 줄이고 추론속도를 높인다.&lt;br /&gt;아래 예제의 출력결과를 보면 알 수 있듯, 모델 크기를 상당히 큰 폭으로 줄일 수 있는데,&amp;nbsp;&lt;br /&gt;GPTQ방법은 GPT계열뿐만 아니라 다른 Transformer 기반 모델들 모두 적용 가능하다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;GPTQ를 이용한 모델 양자화 예제&lt;span style=&quot;font-size: 1em; letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1731909258525&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import GPTQConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = &quot;facebook/opt-125m&quot;
tokenizer = AutoTokenizer.from_pretrained(model_name)

quantization_config = GPTQConfig(
    bits=4,
    dataset=&quot;c4&quot;,
    tokenizer=tokenizer
)

quantized_model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map=&quot;auto&quot;,
    quantization_config=quantization_config
)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731909258526&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import pipeline

origin_generator = pipeline(&quot;text-generation&quot;, model=&quot;facebook/opt-125m&quot;)
quantized_generator = pipeline(&quot;text-generation&quot;, model=quantized_model, tokenizer=tokenizer)

input_text_list = [
    &quot;In the future, technology wil&quot;,
    &quot;What are we having for dinner?&quot;,
    &quot;What day comes after Monday?&quot;
]

print(&quot;원본 모델의 출력 결과:&quot;)
for input_text in input_text_list:
    print(origin_generator(input_text))
print(&quot;양자화 모델의 출력 결과:&quot;)
for input_text in input_text_list:
    print(quantized_generator(input_text))
    
# 원본 모델의 출력 결과:
# [{'generated_text': 'In the future, technology wil be used to make the world a better place.\nI think'}]
# [{'generated_text': 'What are we having for dinner?\n\nWe have a great dinner tonight. We have a'}]
# [{'generated_text': &quot;What day comes after Monday?\nI'm guessing Monday.&quot;}]
# 양자화 모델의 출력 결과:
# [{'generated_text': 'In the future, technology wil be able to make it possible to make a phone that can be'}]
# [{'generated_text': &quot;What are we having for dinner?\n\nI'm not sure what to do with all this&quot;}]
# [{'generated_text': &quot;What day comes after Monday?\nI'm not sure, but I'll be sure to check&quot;}]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력결과, 정확도가 다소 떨어지긴 하나 원본모델과 큰 차이가 없음을 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1731909258526&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import time
import numpy as np

def measure_inference_time(generator, input_text, iterations=10):
    times = []
    for _ in range(iterations):
        start_time = time.time()
        generator(input_text)
        end_time = time.time()
        times.append(end_time - start_time)
    avg_time = np.mean(times)
    return avg_time

def calculate_model_size(model):
    total_params = sum(p.numel() for p in model.parameters())
    total_memory = sum(p.numel() * p.element_size() for p in model.parameters())
    total_memory_mb = total_memory / (1024 ** 2)
    return total_memory_mb, total_params

test_input = &quot;Once upon a time in a land far, far away, there was a small village.&quot;

size_original, total_params_original = calculate_model_size(origin_generator.model)
avg_inference_time_original = measure_inference_time(origin_generator, test_input)

size_quantized, total_params_quantized = calculate_model_size(quantized_generator.model)
avg_inference_time_quantized = measure_inference_time(quantized_generator, test_input)

print(&quot;원본 모델:&quot;)
print(f&quot;- 매개변수 개수: {total_params_original:,}&quot;)
print(f&quot;- 모델 크기: {size_original:.2f} MB&quot;)
print(f&quot;- 평균 추론 시간: {avg_inference_time_original:.4f} sec&quot;)

print(&quot;양자화 모델:&quot;)
print(f&quot;- 매개변수 개수: {total_params_quantized:,}&quot;)
print(f&quot;- 모델 크기: {size_quantized:.2f} MB&quot;)
print(f&quot;- 평균 추론 시간: {avg_inference_time_quantized:.4f} sec&quot;)

# 원본 모델:
# - 매개변수 개수: 125,239,296
# - 모델 크기: 477.75 MB
# - 평균 추론 시간: 0.1399 sec
# 양자화 모델:
# - 매개변수 개수: 40,221,696
# - 모델 크기: 76.72 MB
# - 평균 추론 시간: 0.0289 sec&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추론 과정에 대한 출력결과를 보면, 원본에 비해 모델에 비해 크기가 크게 줄며 더 빠른 처리를 통해 실시간 응답에 대해 매우 효율적일 수 있음을 확인가능하다.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>HuggingFace </category>
      <category>AI</category>
      <category>CV</category>
      <category>deep learning</category>
      <category>Huggingface</category>
      <category>mllm</category>
      <category>Multimodal</category>
      <category>nlp</category>
      <category>딥러닝</category>
      <category>멀티모달</category>
      <category>인공지능</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/290</guid>
      <comments>https://chan4im.tistory.com/290#entry290comment</comments>
      <pubDate>Mon, 18 Nov 2024 14:54:30 +0900</pubDate>
    </item>
    <item>
      <title>HuggingFace( )-Tutorials</title>
      <link>https://chan4im.tistory.com/289</link>
      <description>&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Transformers&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;pipeline()&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델 inference를 위해 사용&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721038928506&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import pipeline
pipe = pipeline(&quot;text-classification&quot;)
pipe(&quot;This restaurant is awesome&quot;)
# [{'label': 'POSITIVE', 'score': 0.9998743534088135}]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;from transformers로 &lt;a href=&quot;https://github.com/huggingface/transformers/tree/main&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Github( &amp;zwj;⬛) transformer&lt;/a&gt;에서 함수를 불러올 수 있다:&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IFYuk/btsIBKeTrOO/2hs1lBpqkx4PVbGcDqg130/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IFYuk/btsIBKeTrOO/2hs1lBpqkx4PVbGcDqg130/img.png&quot; data-alt=&quot;transformers의 함수를 import하는 경우, 위 사진의 src/transformers에 모두 구현이 되어있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IFYuk/btsIBKeTrOO/2hs1lBpqkx4PVbGcDqg130/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIFYuk%2FbtsIBKeTrOO%2F2hs1lBpqkx4PVbGcDqg130%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;1630&quot; height=&quot;1618&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;transformers의 함수를 import하는 경우, 위 사진의 src/transformers에 모두 구현이 되어있다.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;불러오는 함수의 경우, __init__.py를 확인하면 알 수 있는데, 아래 사진처럼 pipeline이 from .pipelines import pipeline이라 적혀있음을 확인가능하다.&lt;/p&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rzTn1/btsIAsM2CXw/ENoIRkixSqfVweUMw67fTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rzTn1/btsIAsM2CXw/ENoIRkixSqfVweUMw67fTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rzTn1/btsIAsM2CXw/ENoIRkixSqfVweUMw67fTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrzTn1%2FbtsIAsM2CXw%2FENoIRkixSqfVweUMw67fTk%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;739&quot; height=&quot;454&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 좌측사진에서 확인할 수 있듯, pipelines폴더에 pipeline함수를 불러오는것을 확인할 수 있으며, &lt;br /&gt;실제로 해당 폴더에 들어가보면 우측처럼 pipeline함수가 정의되고, 이 형태는 transformers.pipeline docs내용과 일치함을 확인가능하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Auto Classes&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;from_pretrained() Method로 추론이 가능하며, AutoClasses는 이런 작업을 수행, 사전훈련된 &lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://huggingface.co/docs/transformers/v4.42.0/en/model_doc/auto#transformers.AutoConfig&quot;&gt;AutoConfig&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://huggingface.co/docs/transformers/v4.42.0/en/model_doc/auto#transformers.AutoModel&quot;&gt;AutoModel&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #4b5563; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; href=&quot;https://huggingface.co/docs/transformers/v4.42.0/en/model_doc/auto#transformers.AutoTokenizer&quot;&gt;AutoTokenizer&lt;/a&gt;중 하나를 자동으로 생성가능하다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;ex)&lt;/p&gt;
&lt;pre id=&quot;code_1721129605883&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoConfig, AutoModel

model = AutoModel.from_pretrained(&quot;google-bert/bert-base-cased&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;AutoConfig&lt;/h4&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;generic Cofiguration클래스로 from_pretrained()라는 클래스메서드 라이브러리 설정클래스 중 하나로 인스턴스화된다.&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 클래스는 '__init__()'을 사용해 직접 인스턴스할 수 없다!!&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VKiAn/btsIASskghB/RGzUjFBj4qBkDh8uyvQxqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VKiAn/btsIASskghB/RGzUjFBj4qBkDh8uyvQxqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VKiAn/btsIASskghB/RGzUjFBj4qBkDh8uyvQxqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVKiAn%2FbtsIASskghB%2FRGzUjFBj4qBkDh8uyvQxqK%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;1244&quot; height=&quot;447&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진을 보면, transformers/src파일을 따고 들어간 결과, 최종적으로 from_pretrained()함수를 찾을 수 있었다.&lt;br /&gt;해당 깃헙코드(가장 우측사진)를 보면, __init__()함수에 대해 raise EnvironmentError가 걸려있음이 확인가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1721133479499&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;config = AutoConfig.from_pretrained(&quot;bert-base-uncased&quot;)
print(config)


# BertConfig {
#   &quot;_name_or_path&quot;: &quot;bert-base-uncased&quot;,
#   &quot;architectures&quot;: [
#     &quot;BertForMaskedLM&quot;
#   ],
#   &quot;attention_probs_dropout_prob&quot;: 0.1,
#   &quot;classifier_dropout&quot;: null,
#   &quot;gradient_checkpointing&quot;: false,
#   &quot;hidden_act&quot;: &quot;gelu&quot;,
#   &quot;hidden_dropout_prob&quot;: 0.1,
#   &quot;hidden_size&quot;: 768,
#   &quot;initializer_range&quot;: 0.02,
#   &quot;intermediate_size&quot;: 3072,
#   &quot;layer_norm_eps&quot;: 1e-12,
#   &quot;max_position_embeddings&quot;: 512,
#   &quot;model_type&quot;: &quot;bert&quot;,
#   &quot;num_attention_heads&quot;: 12,
#   &quot;num_hidden_layers&quot;: 12,
#   &quot;pad_token_id&quot;: 0,
#   &quot;position_embedding_type&quot;: &quot;absolute&quot;,
#   &quot;transformers_version&quot;: &quot;4.41.2&quot;,
#   &quot;type_vocab_size&quot;: 2,
#   &quot;use_cache&quot;: true,
#   &quot;vocab_size&quot;: 30522
# }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보면, Config는 &lt;span style=&quot;color: #009a87; background-color: #dddddd;&quot;&gt;&lt;b&gt;모델 학습을 위한 json파일&lt;/b&gt;&lt;/span&gt;로 되어있음을 확인가능하다.&lt;br /&gt;batch_size, learning_rate, weight_decay 등 train에 필요한 것들과&lt;br /&gt;tokenizer의 특수토큰들을 미리 설정하는 등 설정관련 내용이 들어있다.&lt;br /&gt;또한, &lt;span style=&quot;color: #ee2323; background-color: #f6e199;&quot;&gt;&lt;b&gt;&lt;u&gt;save_pretrained()를 이용하면 모델의 checkpoint화 함께 저장&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;된다!&lt;br /&gt;그렇기에, 만약 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;설정을 변경하고 싶거나 Model Proposal등의 상황에서는 config파일을 직접 불러&lt;/u&gt;&lt;/span&gt;와야한다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;AutoTokenizer, (blobs, refs, snapshots)&lt;/h4&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;generic Tokenizer클래스로 AutoTokenizer.from_pretrained()라는 클래스메서드.&lt;br /&gt;생성 시, 라이브러리 토크나이저클래스 중 하나로 인스턴스화된다.&lt;br /&gt;&lt;/span&gt;참고)&lt;a href=&quot;https://chan4im.tistory.com/#%E2%88%99input-ids&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://chan4im.tistory.com/#%E2%88%99input-ids&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 클래스는 '__init__()'을 사용해 직접 인스턴스할 수 없다!!&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brdTgf/btsIBC3sSP9/rR2kpkX0rwLKKIwMQ9NEwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brdTgf/btsIBC3sSP9/rR2kpkX0rwLKKIwMQ9NEwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brdTgf/btsIBC3sSP9/rR2kpkX0rwLKKIwMQ9NEwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrdTgf%2FbtsIBC3sSP9%2FrR2kpkX0rwLKKIwMQ9NEwk%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;960&quot; height=&quot;805&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;위 사진을 보면, transformers/src파일을 따고 들어간 결과, 최종적으로 from_pretrained()함수를 찾을 수 있었다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;해당 깃헙코드(가장 우측사진)를 보면, __init__()함수에 대해 raise EnvironmentError가 걸려있음이 확인가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721134620243&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

# Download vocabulary from huggingface.co and cache.
tokenizer = AutoTokenizer.from_pretrained(&quot;google-bert/bert-base-uncased&quot;)

# If vocabulary files are in a directory 
# (e.g. tokenizer was saved using *save_pretrained('./test/saved_model/')*)
tokenizer = AutoTokenizer.from_pretrained(&quot;./test/bert_saved_model/&quot;)

# Download vocabulary from huggingface.co and define model-specific arguments
tokenizer = AutoTokenizer.from_pretrained(&quot;FacebookAI/roberta-base&quot;, add_prefix_space=True)

tokenizer
# BertTokenizerFast(name_or_path='google-bert/bert-base-uncased', vocab_size=30522, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True),  added_tokens_decoder={
# 	0: AddedToken(&quot;[PAD]&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
# 	100: AddedToken(&quot;[UNK]&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
# 	101: AddedToken(&quot;[CLS]&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
# 	102: AddedToken(&quot;[SEP]&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
# 	103: AddedToken(&quot;[MASK]&quot;, rstrip=False, lstrip=False, single_word=False, normalized=False, special=True),
# }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런데 한가지 궁금하지 않은가?&lt;/p&gt;
&lt;pre id=&quot;code_1721135278299&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenizer = AutoTokenizer.from_pretrained(&quot;google-bert/bert-base-uncased&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 작성후 실행하면 콘솔창에 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;왜 &lt;/span&gt;아래와 같은 화면이 나오는 것일까?????&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ObnOJ/btsIBDBiCll/UEHenuLClAXA4k3rGrVVy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ObnOJ/btsIBDBiCll/UEHenuLClAXA4k3rGrVVy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ObnOJ/btsIBDBiCll/UEHenuLClAXA4k3rGrVVy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FObnOJ%2FbtsIBDBiCll%2FUEHenuLClAXA4k3rGrVVy0%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;129&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #777777; text-align: center;&quot;&gt;미리 설명:&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;tokenizer_config.json&lt;/b&gt;&lt;/span&gt;에는 token에 대한 설정들이, &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;config.json&lt;/b&gt;&lt;/span&gt;에는 모델관련 설정이, &lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;vocab.txt&lt;/b&gt;&lt;/span&gt;는 subword들이 들어있고,&lt;br /&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;tokenizer.json&lt;/b&gt;&lt;/span&gt;은 config된 값들에 대해 나열한 것이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;본인의 경우, 아래와 같이 cache_dir에 지정을 하면, 해당 디렉토리에 hub라는 파일이 생기며, 그안에 모델관련 파일이 생긴다.&lt;/p&gt;
&lt;pre id=&quot;code_1721192263726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;parser.add_argument('--cache_dir', default=&quot;/data/huggingface_models&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Hcix/btsIBAymSTJ/3lMRrKoF2kKRTMQYpKr441/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Hcix/btsIBAymSTJ/3lMRrKoF2kKRTMQYpKr441/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Hcix/btsIBAymSTJ/3lMRrKoF2kKRTMQYpKr441/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Hcix%2FbtsIBAymSTJ%2F3lMRrKoF2kKRTMQYpKr441%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;647&quot; height=&quot;99&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;타고 들어가다 보면 총 3가지 폴더가 나온다: &lt;b&gt;blobs, refs, snapshots&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;blobs&lt;/span&gt;: 해시값으로 나타나져 있음을 확인가능하다. 해당파일에는 아래와 같은 파일이 존재한다:&lt;/b&gt;&lt;br /&gt;Config클래스관련파일, Model관련 클래스파일들, tokenizer설정관련 json파일, weight관련 파일들 등등 아래 사진과 같이 많은 파일들이 코드화되어 들어있다:&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;1372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBsZtk/btsIBIQI0JQ/dGckWn5VsOLI1IOwOfofyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBsZtk/btsIBIQI0JQ/dGckWn5VsOLI1IOwOfofyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBsZtk/btsIBIQI0JQ/dGckWn5VsOLI1IOwOfofyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBsZtk%2FbtsIBIQI0JQ%2FdGckWn5VsOLI1IOwOfofyk%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;1716&quot; height=&quot;1372&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;refs&lt;/span&gt;: 단순히 main이라는 파일만 존재한다:&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IoITn/btsICCWuzQl/0s1wb93yy5E6oeIlxRkLl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IoITn/btsICCWuzQl/0s1wb93yy5E6oeIlxRkLl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IoITn/btsICCWuzQl/0s1wb93yy5E6oeIlxRkLl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIoITn%2FbtsICCWuzQl%2F0s1wb93yy5E6oeIlxRkLl0%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;292&quot; height=&quot;33&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;해당 파일에는 snapshots안에 있는 디렉토리의 이름과 동일한 이름이 적혀있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;snapshots&lt;/span&gt;: 바로 이곳에!! &lt;span style=&quot;color: #009a87;&quot;&gt;tokenizer_config.json, config.json, vocab.txt, tokenizer.json&lt;/span&gt;파일이 있음을 확인할 수 있다!!!&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XArNI/btsICC3jiG9/3uoOP0gwx2WuRO2FfbE1N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XArNI/btsICC3jiG9/3uoOP0gwx2WuRO2FfbE1N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XArNI/btsICC3jiG9/3uoOP0gwx2WuRO2FfbE1N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXArNI%2FbtsICC3jiG9%2F3uoOP0gwx2WuRO2FfbE1N0%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;909&quot; height=&quot;382&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그런데 뭔가 이상하지 않은가??&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;위의 blobs에 나와있는 사진의 코드와 snapshots의 코드가 모두 일치한다는 사실!!&lt;/p&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcmx5F/btsICVhd7HK/2mIMS3aJN5Ik9N6ZCbNEUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcmx5F/btsICVhd7HK/2mIMS3aJN5Ik9N6ZCbNEUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcmx5F/btsICVhd7HK/2mIMS3aJN5Ik9N6ZCbNEUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdcmx5F%2FbtsICVhd7HK%2F2mIMS3aJN5Ik9N6ZCbNEUK%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;579&quot; height=&quot;240&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다! 즉, blobs는 snapshots 내용을 해시값형태로 저장한 것이었다!!!&lt;br /&gt;사실 이짓한다음에 구글에 치니까 바로 있긴했었다..(&lt;a href=&quot;https://huggingface.co/docs/huggingface_hub/v0.16.3/en/guides/manage-cache&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/docs/huggingface_hub/v0.16.3/en/guides/manage-cache&lt;/a&gt;)&lt;br /&gt;허깅페이스 설명 요약:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Refs&lt;/b&gt; refs 폴더는 주어진 참조의 최신 리비전을 나타내는 파일을 포함합니다. 예를 들어, 이전에 리포지토리의 메인 브랜치에서 파일을 가져온 경우, refs 폴더에는 main이라는 파일이 있으며, 현재 헤드의 커밋 식별자를 포함합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 최신 커밋이 aaaaaa라는 식별자를 가지고 있다면, 해당 파일은 aaaaaa를 포함할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 브랜치가 새로운 커밋 bbbbbb로 업데이트된 경우, 해당 참조에서 파일을 다시 다운로드하면 refs/main 파일이 bbbbbb로 업데이트됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Blobs&lt;/b&gt; blobs 폴더는 실제로 다운로드된 파일을 포함합니다. 각 파일의 이름은 해당 파일의 해시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Snapshots&lt;/b&gt; snapshots 폴더는 위의 blobs에서 언급한 파일에 대한 심볼릭 링크를 포함합니다. 자체적으로 알려진 각 리비전에 대해 여러 폴더로 구성됩니다.&lt;br /&gt;&lt;br /&gt;cf) 또한 cache는 아래와 같은 tree구조를 가짐:&lt;/p&gt;
&lt;pre id=&quot;code_1721196896243&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    [  96]  .
    └── [ 160]  models--julien-c--EsperBERTo-small
        ├── [ 160]  blobs
        │   ├── [321M]  403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd
        │   ├── [ 398]  7cb18dc9bafbfcf74629a4b760af1b160957a83e
        │   └── [1.4K]  d7edf6bd2a681fb0175f7735299831ee1b22b812
        ├── [  96]  refs
        │   └── [  40]  main
        └── [ 128]  snapshots
            ├── [ 128]  2439f60ef33a0d46d85da5001d52aeda5b00ce9f
            │   ├── [  52]  README.md -&amp;gt; ../../blobs/d7edf6bd2a681fb0175f7735299831ee1b22b812
            │   └── [  76]  pytorch_model.bin -&amp;gt; ../../blobs/403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd
            └── [ 128]  bbc77c8132af1cc5cf678da3f1ddf2de43606d48
                ├── [  52]  README.md -&amp;gt; ../../blobs/7cb18dc9bafbfcf74629a4b760af1b160957a83e
                └── [  76]  pytorch_model.bin -&amp;gt; ../../blobs/403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙ &lt;/b&gt;AutoModel&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 위와 같이, 아래사진처럼 찾아갈 수 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1C6C/btsICjoB9qV/k2VZ1kvk8EHKxLrEXzGtNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1C6C/btsICjoB9qV/k2VZ1kvk8EHKxLrEXzGtNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1C6C/btsICjoB9qV/k2VZ1kvk8EHKxLrEXzGtNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1C6C%2FbtsICjoB9qV%2Fk2VZ1kvk8EHKxLrEXzGtNk%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;1251&quot; height=&quot;542&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 AutoModel.from_config함수를 살펴보자.&lt;/p&gt;
&lt;pre id=&quot;code_1721203575883&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import AutoConfig, AutoModel

# Download configuration from huggingface.co and cache.
config = AutoConfig.from_pretrained(&quot;google-bert/bert-base-cased&quot;)
model = AutoModel.from_config(config)


@classmethod
def from_config(cls, config, **kwargs):
    trust_remote_code = kwargs.pop(&quot;trust_remote_code&quot;, None)
    has_remote_code = hasattr(config, &quot;auto_map&quot;) and cls.__name__ in config.auto_map
    has_local_code = type(config) in cls._model_mapping.keys()
    trust_remote_code = resolve_trust_remote_code(
        trust_remote_code, config._name_or_path, has_local_code, has_remote_code
    )

    if has_remote_code and trust_remote_code:
        class_ref = config.auto_map[cls.__name__]
        if &quot;--&quot; in class_ref:
            repo_id, class_ref = class_ref.split(&quot;--&quot;)
        else:
            repo_id = config.name_or_path
        model_class = get_class_from_dynamic_module(class_ref, repo_id, **kwargs)
        if os.path.isdir(config._name_or_path):
            model_class.register_for_auto_class(cls.__name__)
        else:
            cls.register(config.__class__, model_class, exist_ok=True)
        _ = kwargs.pop(&quot;code_revision&quot;, None)
        return model_class._from_config(config, **kwargs)
    elif type(config) in cls._model_mapping.keys():
        model_class = _get_model_class(config, cls._model_mapping)
        return model_class._from_config(config, **kwargs)

    raise ValueError(
        f&quot;Unrecognized configuration class {config.__class__} for this kind of AutoModel: {cls.__name__}.\n&quot;
        f&quot;Model type should be one of {', '.join(c.__name__ for c in cls._model_mapping.keys())}.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Data Collator&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Data Collator&lt;/h3&gt;
&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;일련의 sample list를 &quot;single training mini-batch&quot;의 Tensor형태로 묶어줌&lt;/u&gt;&lt;/span&gt;.&amp;nbsp;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EI0zF/btsIJAykxTA/ZNj3clk5RkedmrH8VXXxGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EI0zF/btsIJAykxTA/ZNj3clk5RkedmrH8VXXxGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EI0zF/btsIJAykxTA/ZNj3clk5RkedmrH8VXXxGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEI0zF%2FbtsIJAykxTA%2FZNj3clk5RkedmrH8VXXxGK%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;1280&quot; height=&quot;437&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
Default Data Collator이는 아래처럼 train_dataset이 data_collator를 이용해 mini-batch로 묶여 모델로 들어가 학습하는데 도움이 된다.&lt;br /&gt;
&lt;pre id=&quot;code_1721735300238&quot; class=&quot;routeros&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;trainer = Trainer(
    model=model,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    data_collator=data_collator,​&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;batch[&quot;input_ids&quot;] , batch[&quot;labels&quot;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;?&lt;/span&gt;&lt;/h3&gt;
다만, 위와 달리 대부분의 Data Collator함수를 보면 아래와 같은 코드의 형태를 띠는데, 여기서 input_ids와 label이라는 조금 생소한 단어가 있다:&lt;br /&gt;
&lt;pre id=&quot;code_1721735300238&quot; class=&quot;ruby&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;class MyDataCollator:
    def __init__(self, processor):
        self.processor = processor

    def __call__(self, examples): 
        texts = []
        images = []
        for example in examples:
            image, question, answer = example 
            messages = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: question},
                        {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: answer}] # &amp;lt;-- 여기까지 잘 들어가는것 확인완료.
            text = self.processor.tokenizer.apply_chat_template(messages, add_generation_prompt=False)
            texts.append(text)
            images.append(image)

        batch = self.processor(text=text, images=image, return_tensors=&quot;pt&quot;, padding=True)
        labels = batch[&quot;input_ids&quot;].clone()
        if self.processor.tokenizer.pad_token_id is not None:
            labels[labels == self.processor.tokenizer.pad_token_id] = -100
        batch[&quot;labels&quot;] = labels
        return batch

data_collator = MyDataCollator(processor)​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;과연 batch[&quot;input_ids&quot;]와 batch[&quot;labels&quot;]가 뭘까?&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;전술했던 data_collator는 아래와 같은 형식을 띠는데, 여기서도 보면 inputs와 labels가 있는 것을 볼 수 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJuXu/btsIJVhwXKI/fZV1j6RHfqh5E86JVY6GTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJuXu/btsIJVhwXKI/fZV1j6RHfqh5E86JVY6GTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJuXu/btsIJVhwXKI/fZV1j6RHfqh5E86JVY6GTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJuXu%2FbtsIJVhwXKI%2FfZV1j6RHfqh5E86JVY6GTK%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;1280&quot; height=&quot;404&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;모든 모델은 다르지만, 다른모델과 유사한점을 공유한다&lt;br /&gt;= 대부분의 모델은 동일한 입력을 사용한다!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 id=&quot;∙input-ids&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Input IDs&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Input ID는 모델에 입력으로 전달되는&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&quot;유일한 필수 매개변수&quot;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인 경우가 많다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Input ID는&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;token_index&lt;/span&gt;로, 사용할 sequence(문장)를 구성하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;token의 숫자표현&lt;/span&gt;이다.&lt;br /&gt;각 tokenizer는 다르게 작동하지만 &quot;기본 메커니즘은 동일&quot;하다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721735300240&quot; class=&quot;makefile&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)

sequence = &quot;A Titan RTX has 24GB of VRAM&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;tokenizer는 sequence(문장)를 tokenizer vocab에 있는 Token으로 분할한다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721735300241&quot; class=&quot;ini&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;tokenized_sequence = tokenizer.tokenize(sequence)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;token은 word나 subword 둘중 하나이다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721735300241&quot; class=&quot;clean&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;print(tokenized_sequence)
# 출력: ['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']
# 예를 들어, &quot;VRAM&quot;은 모델 어휘에 없어서 &quot;V&quot;, &quot;RA&quot; 및 &quot;M&quot;으로 분할됨.
# 이러한 토큰이 별도의 단어가 아니라 동일한 단어의 일부임을 나타내기 위해서는?
# --&amp;gt; &quot;RA&quot;와 &quot;M&quot; 앞에 이중해시(##) 접두사가 추가됩


inputs = tokenizer(sequence)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;이를 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;token은 모델이 이해가능한 ID로 변환&lt;/u&gt;&lt;/span&gt;될 수 있다.&lt;br /&gt;이때, 모델내부에서 작동하기 위해서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;input_ids를 key로, ID값을 value로 하는 &quot;딕셔너리&quot;형태로 반환&lt;/u&gt;&lt;/span&gt;해야한다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721735300241&quot; class=&quot;angelscript&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;encoded_sequence = inputs[&quot;input_ids&quot;]
print(encoded_sequence)
# 출력: [101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;또한, 모델에 따라서 자동으로 &quot;special token&quot;을 추가하는데,&amp;nbsp;&lt;br /&gt;여기에는 모델이 가끔 사용하는 &quot;special IDs&quot;가 추가된다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721735300242&quot; class=&quot;routeros&quot; style=&quot;color: #666666;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;decoded_sequence = tokenizer.decode(encoded_sequence)
print(decoded_sequence)
# 출력: [CLS] A Titan RTX has 24GB of VRAM [SEP]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 id=&quot;∙attention-mask&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Attention Mask&lt;/b&gt;&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Attention Mask는 Sequence를 batch로 묶을 때 사용하는 Optional한 인수로&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;모델이 어떤 token을 주목하고 하지 말아야 하는지&quot;&lt;/span&gt;를 나타낸다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735300242&quot; class=&quot;makefile&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)

sequence_a = &quot;This is a short sequence.&quot;
sequence_b = &quot;This is a rather long sequence. It is at least longer than the sequence A.&quot;

encoded_sequence_a = tokenizer(sequence_a)[&quot;input_ids&quot;]
encoded_sequence_b = tokenizer(sequence_b)[&quot;input_ids&quot;]

len(encoded_sequence_a), len(encoded_sequence_b)
# 출력: (8, 19)&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위를 보면, encoding된 길이가 다르기 때문에 &quot;동일한 Tensor로 묶을 수가 없다.&quot;&lt;br /&gt;--&amp;gt; padding이나 truncation이 필요함.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735300242&quot; class=&quot;angelscript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;padded_sequences = tokenizer([sequence_a, sequence_b], padding=True)

padded_sequences[&quot;input_ids&quot;]
# 출력: [[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]]

padded_sequences[&quot;attention_mask&quot;]
# 출력: [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;attention_mask는 tokenizer가 반환하는 dictionary의 &quot;attention_mask&quot; key에 존재한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 id=&quot;∙token-types-ids&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Token Types IDs&lt;/b&gt;&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 모델의 목적은 classification이나 QA이다.&lt;br /&gt;이런 모델은 2개의 &quot;다른 목적을 단일 input_ids&quot;항목으로 결합해야한다.&lt;br /&gt;= [CLS], [SEP] 등의 특수토큰을 이용해 수행됨.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735300243&quot; class=&quot;makefile&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: left;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP]

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)
sequence_a = &quot;HuggingFace is based in NYC&quot;
sequence_b = &quot;Where is HuggingFace based?&quot;

encoded_dict = tokenizer(sequence_a, sequence_b)
decoded = tokenizer.decode(encoded_dict[&quot;input_ids&quot;])

print(decoded)
# 출력: [CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 예제에서 tokenizer를 이용해 2개의 sequence가 2개의 인수로 전달되어 자동으로 위와같은 문장을 생성하는 것을 볼 수 있다.&lt;br /&gt;이는 seq이후에 나오는 seq의 시작위치를 알기에는 좋다.&lt;br /&gt;&lt;br /&gt;다만, 다른 모델은 token_types_ids도 사용하며, token_type_ids로 이 MASK를 반환한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735300243&quot; class=&quot;angelscript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;encoded_dict['token_type_ids']
# 출력: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;질문에 사용되는 context는 모두 0으로,&amp;nbsp;&lt;br /&gt;질문에 해당되는 sequence는 모두 1로 설정된 것을 확인할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 id=&quot;∙position-ids&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Position IDs&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RNN: 각&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;토큰의 위치가 내장.&lt;/u&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Transformer: 각 토큰의 위치를 인식 ❌&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;there4; position_ids는 모델이 각 토큰의 위치를 list에서 식별하는 데 사용되는 optional 매개변수.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델에 position_ids가 전달되지 않으면, ID는 자동으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;Absolute positional embeddings&lt;/span&gt;으로 생성:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;Absolute positional embeddings&lt;/span&gt;은 [0, config.max_position_embeddings - 1] 범위에서 선택.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일부 모델은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;sinusoidal position embeddings&lt;/span&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;relative position embeddings&lt;/span&gt;과 같은 다른 유형의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;positional embedding&lt;/span&gt;을 사용.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 id=&quot;∙labels&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Labels&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Labels는 모델이 자체적으로 손실을 계산하도록 전달될 수 있는 Optional인수이다.&lt;br /&gt;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Labels는&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델의 예상 예측값&lt;/b&gt;&lt;/span&gt;이어야 한다:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;표준 손실을 사용&lt;/u&gt;하여 예측값과 예상값(레이블) 간의 손실을 계산.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;이때,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Labels는 Model Head&lt;/span&gt;에 따라 다르다&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AutoModelForSequenceClassification:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델은 (batch_size)차원텐서를 기대하며, batch의 각 값은 전체 시퀀스의 예상 label에 해당.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;TokenClassification:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델은 (batch_size, seq_length)차원텐서를 기대하며, 각 값은 개별 토큰의 예상&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;label에&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;MaskedLM:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델은 (batch_size, seq_length)차원텐서를 기대하며, 각 값은 개별 토큰의 예상 레이블에 해당:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;label은&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;마스킹된 token_ids이며, 나머지는 무시할 값(보통 -100).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;ConditionalGeneration:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;모델은 (batch_size, tgt_seq_length)차원텐서를 기대하며, 각 값은 각 입력 시퀀스와 연관된 목표 시퀀스를 나타냅니다. 훈련 중에는 BART와 T5가 적절한 디코더 입력 ID와 디코더 어텐션 마스크를 내부적으로 만들기에 보통 제공할 필요X. 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;Encoder-Decoder 프레임워크를 사용하는 모델에는 적용되지 않음&lt;/u&gt;. 각 모델의 문서를 참조하여 각 특정 모델의 레이블에 대한 자세한 정보를 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 모델(BertModel 등)은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Labels를&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;받아들이지 못하는데, 이러한 모델은 기본 트랜스포머 모델로서 단순히 특징들만 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 id=&quot;∙-decoder-input-ids&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙ Decoder input IDs&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 입력은 인코더-디코더 모델에 특화되어 있으며, 디코더에 입력될 입력 ID를 포함합니다.&lt;br /&gt;이러한 입력은 번역 또는 요약과 같은 시퀀스-투-시퀀스 작업에 사용되며, 보통 각 모델에 특정한 방식으로 구성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분의 인코더-디코더 모델(BART, T5)은 레이블에서 디코더 입력 ID를 자체적으로 생성합니다.&lt;br /&gt;이러한 모델에서는 레이블을 전달하는 것이 훈련을 처리하는 선호 방법입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시퀀스-투-시퀀스 훈련을 위한 이러한 입력 ID를 처리하는 방법을 확인하려면 각 모델의 문서를 참조하세요.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 id=&quot;∙feed-forward-chunking&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Feed Forward Chunking&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;트랜스포머의 각 잔차 어텐션 블록에서 셀프 어텐션 레이어는 보통 2개의 피드 포워드 레이어 다음에 위치합니다.&lt;br /&gt;피드 포워드 레이어의 중간 임베딩 크기는 종종 모델의 숨겨진 크기보다 큽니다(예: bert-base-uncased).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크기 [batch_size, sequence_length]의 입력에 대해 중간 피드 포워드 임베딩을 저장하는 데 필요한 메모리 [batch_size, sequence_length, config.intermediate_size]는 메모리 사용량의 큰 부분을 차지할 수 있습니다.&lt;br /&gt;&lt;br /&gt;Reformer: The Efficient Transformer의 저자들은 계산이 sequence_length 차원과 독립적이므로 두 피드 포워드 레이어의 출력 임베딩 [batch_size, config.hidden_size]_0, ..., [batch_size, config.hidden_size]_n을 개별적으로 계산하고 n = sequence_length와 함께 [batch_size, sequence_length, config.hidden_size]로 결합하는 것이 수학적으로 동일하다는 것을 발견했습니다.&lt;br /&gt;&lt;br /&gt;이는 메모리 사용량을 줄이는 대신 계산 시간을 증가시키는 거래를 하지만, 수학적으로 동일한 결과를 얻을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;apply_chunking_to_forward() 함수를 사용하는 모델의 경우, chunk_size는 병렬로 계산되는 출력 임베딩의 수를 정의하며, 메모리와 시간 복잡성 간의 거래를 정의합니다. chunk_size가 0으로 설정되면 피드 포워드 청킹은 수행되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Optimization&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;AdamW&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;흔히들 아묻따 Adam만 사용해라! 라는 격언이 있을정도로 만능 optimizer같지만,&amp;nbsp;&lt;br /&gt;CV일부 Task에서는 SGD가 더 나은 성능을 보이는 경우가 상당히 존재한다.&lt;br /&gt;AdamW논문에서는 L2 Regularization과 Weight Decay관점에서 SGD에 비해 Adam이 일반화 능력이 떨어지는 이유를 설명한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IMtO0/btsIJ1hSk95/01wHt3RhPEckUsX2xOSa81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IMtO0/btsIJ1hSk95/01wHt3RhPEckUsX2xOSa81/img.png&quot; data-alt=&quot;서로다른 초기 decay rate와 lr에 따른 Test Error&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IMtO0/btsIJ1hSk95/01wHt3RhPEckUsX2xOSa81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIMtO0%2FbtsIJ1hSk95%2F01wHt3RhPEckUsX2xOSa81%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;789&quot; height=&quot;535&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서로다른 초기 decay rate와 lr에 따른 Test Error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;L2 Regularization:&lt;/b&gt; weight가 비정상적으로 커짐을 방지. (weight값이 커지면 손실함수도 커지게 됨.)&lt;br /&gt;= weight가 너무 커지지 않는 선에서 기존 손실함수를 최소로 만들어주는 weight를 모델이 학습.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;weight decay:&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;weight update 시, 이전 weight크기를 일정비율 감소시켜 overfitting방지.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;b&gt;SGD:&lt;/b&gt; L2 = weight_decay&lt;br /&gt;&lt;b&gt;Adam:&lt;/b&gt; L2 &amp;ne; weight_decay (&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;adaptive learning rate를 사용하기 때문에 SGD와는 다른 weight update식을 사용함.&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&amp;there4; 즉, L2 Regularization이 포함된 손실함수로 Adam최적화 시, 일반화 효과를 덜 보게 된다. (decay rate가 더 작아지게됨.)&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qTNGw/btsIK72vDLz/EAVdKKkXxPu7JyycSdkHX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qTNGw/btsIK72vDLz/EAVdKKkXxPu7JyycSdkHX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qTNGw/btsIK72vDLz/EAVdKKkXxPu7JyycSdkHX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTNGw%2FbtsIK72vDLz%2FEAVdKKkXxPu7JyycSdkHX1%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;925&quot; height=&quot;874&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;저자는 L2 regularzation에 의한 weight decay 효과 뿐만 아니라 weight 업데이트 식에 직접적으로 weight decay 텀을 추가하여 이 문제를 해결한다. &lt;u&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;L2 regularization과 분리된 weight decay&lt;/span&gt;&lt;/u&gt;라고 하여 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;decoupled weight decay&lt;/b&gt;&lt;/span&gt;라고 말하는 것이다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;SGDW와 AdamW의 알고리즘:&lt;br /&gt;지금까지 설명하지 않았던&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: left;&quot; data-mathml=&quot;&amp;lt;math xmlns=&amp;quot;http://www.w3.org/1998/Math/MathML&amp;quot;&amp;gt;&amp;lt;mi&amp;gt;&amp;amp;#x03B7;&amp;lt;/mi&amp;gt;&amp;lt;/math&amp;gt;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;가 있는데, 이는 매 weight 업데이트마다 learning rate를 일정 비율 감소시켜주는 learning rate schedule 상수를 의미한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;초록색&lt;/b&gt;&lt;/span&gt;으로 표시된 부분이 없다면 L2 regularization을 포함한 손실함수에 SGD와 Adam을 적용한 것과 똑같다. &lt;br /&gt;하지만 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;초록색 부분을 직접적으로 weight 업데이트 식에 추가시켜 weight decay 효과&lt;/u&gt;&lt;/span&gt;&lt;/b&gt;를 볼 수 있게 만들었다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721739131897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;optimizer = AdamW(model.parameters(),lr=1e-3, eps=(1e-30, 1e-3),weight_decay=0.0,)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cf) model.parameters()는 weight와 bias를 돌려줌.&lt;br /&gt;이제 github 코드를 통해 위의 수식에 대해 살펴보도록 하자:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721743393100&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class AdamW(Optimizer):
    &quot;&quot;&quot;
    Implements Adam algorithm with weight decay fix as introduced in [Decoupled Weight Decay
    Regularization](https://arxiv.org/abs/1711.05101).

    Parameters:
        params (`Iterable[nn.parameter.Parameter]`):
            Iterable of parameters to optimize or dictionaries defining parameter groups.
        lr (`float`, *optional*, defaults to 0.001):
            The learning rate to use.
        betas (`Tuple[float,float]`, *optional*, defaults to `(0.9, 0.999)`):
            Adam's betas parameters (b1, b2).
        eps (`float`, *optional*, defaults to 1e-06):
            Adam's epsilon for numerical stability.
        weight_decay (`float`, *optional*, defaults to 0.0):
            Decoupled weight decay to apply.
        correct_bias (`bool`, *optional*, defaults to `True`):
            Whether or not to correct bias in Adam (for instance, in Bert TF repository they use `False`).
        no_deprecation_warning (`bool`, *optional*, defaults to `False`):
            A flag used to disable the deprecation warning (set to `True` to disable the warning).
    &quot;&quot;&quot;

    def __init__(
        self,
        params: Iterable[nn.parameter.Parameter],
        lr: float = 1e-3,
        betas: Tuple[float, float] = (0.9, 0.999),
        eps: float = 1e-6,
        weight_decay: float = 0.0,
        correct_bias: bool = True,
        no_deprecation_warning: bool = False,
    ):
        if not no_deprecation_warning:
            warnings.warn(
                &quot;This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch&quot;
                &quot; implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this&quot;
                &quot; warning&quot;,
                FutureWarning,
            )
        require_version(&quot;torch&amp;gt;=1.5.0&quot;)  # add_ with alpha
        if lr &amp;lt; 0.0:
            raise ValueError(f&quot;Invalid learning rate: {lr} - should be &amp;gt;= 0.0&quot;)
        if not 0.0 &amp;lt;= betas[0] &amp;lt; 1.0:
            raise ValueError(f&quot;Invalid beta parameter: {betas[0]} - should be in [0.0, 1.0)&quot;)
        if not 0.0 &amp;lt;= betas[1] &amp;lt; 1.0:
            raise ValueError(f&quot;Invalid beta parameter: {betas[1]} - should be in [0.0, 1.0)&quot;)
        if not 0.0 &amp;lt;= eps:
            raise ValueError(f&quot;Invalid epsilon value: {eps} - should be &amp;gt;= 0.0&quot;)
        defaults = {&quot;lr&quot;: lr, &quot;betas&quot;: betas, &quot;eps&quot;: eps, &quot;weight_decay&quot;: weight_decay, &quot;correct_bias&quot;: correct_bias}
        super().__init__(params, defaults)

    @torch.no_grad()
    def step(self, closure: Callable = None):
        &quot;&quot;&quot;
        Performs a single optimization step.

        Arguments:
            closure (`Callable`, *optional*): A closure that reevaluates the model and returns the loss.
        &quot;&quot;&quot;
        loss = None
        if closure is not None:
            loss = closure()

        for group in self.param_groups:
            for p in group[&quot;params&quot;]:
                if p.grad is None:
                    continue
                grad = p.grad
                if grad.is_sparse:
                    raise RuntimeError(&quot;Adam does not support sparse gradients, please consider SparseAdam instead&quot;)

                state = self.state[p]

                # State initialization
                if len(state) == 0:
                    state[&quot;step&quot;] = 0
                    # Exponential moving average of gradient values
                    state[&quot;exp_avg&quot;] = torch.zeros_like(p)
                    # Exponential moving average of squared gradient values
                    state[&quot;exp_avg_sq&quot;] = torch.zeros_like(p)

                exp_avg, exp_avg_sq = state[&quot;exp_avg&quot;], state[&quot;exp_avg_sq&quot;]
                beta1, beta2 = group[&quot;betas&quot;]

                state[&quot;step&quot;] += 1

                # Decay the first and second moment running average coefficient
                # In-place operations to update the averages at the same time
                exp_avg.mul_(beta1).add_(grad, alpha=(1.0 - beta1))
                exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
                denom = exp_avg_sq.sqrt().add_(group[&quot;eps&quot;])

                step_size = group[&quot;lr&quot;]
                if group[&quot;correct_bias&quot;]:  # No bias correction for Bert
                    bias_correction1 = 1.0 - beta1 ** state[&quot;step&quot;]
                    bias_correction2 = 1.0 - beta2 ** state[&quot;step&quot;]
                    step_size = step_size * math.sqrt(bias_correction2) / bias_correction1

                p.addcdiv_(exp_avg, denom, value=-step_size)

                # Just adding the square of the weights to the loss function is *not*
                # the correct way of using L2 regularization/weight decay with Adam,
                # since that will interact with the m and v parameters in strange ways.
                #
                # Instead we want to decay the weights in a manner that doesn't interact
                # with the m/v parameters. This is equivalent to adding the square
                # of the weights to the loss with plain (non-momentum) SGD.
                # Add weight decay at the end (fixed version)
                if group[&quot;weight_decay&quot;] &amp;gt; 0.0:
                    p.add_(p, alpha=(-group[&quot;lr&quot;] * group[&quot;weight_decay&quot;]))

        return loss&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cf) optimizer의 state_dict()의 형태는 아래와 같다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721743507162&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
                'state': {
                    0: {'momentum_buffer': tensor(...), ...},
                    1: {'momentum_buffer': tensor(...), ...},
                    2: {'momentum_buffer': tensor(...), ...},
                    3: {'momentum_buffer': tensor(...), ...}
                },
                'param_groups': [
                    {
                        'lr': 0.01,
                        'weight_decay': 0,
                        ...
                        'params': [0]
                    },
                    {
                        'lr': 0.001,
                        'weight_decay': 0.5,
                        ...
                        'params': [1, 2, 3]
                    }
                ]
            }&lt;/code&gt;&lt;/pre&gt;
이를 통해 살펴보면, Optimizer라는 클래스로부터 AdamW는 상속을 받은 이후,&amp;nbsp;&lt;br /&gt;위의 state_dict형태를 보면 알 수 있듯, if len(state) == 0이라는 뜻은 state가 시작을 하나도 하지 않았음을 의미한다.&lt;br /&gt;exp_avg는 m을, exp_avg_sq는 vt를 의미하며 p.addcdiv_와 if group[&quot;weight_decay&quot;]쪽에서 최종 parameter에 대한 update가 됨을 확인할 수 있다.&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;LR-Schedules &amp;amp;. Learning rate Annealing&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; LR Schedule:&lt;/b&gt; 미리 정해진 스케줄대로 lr을 바꿔가며 사용.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Co2pN/btsIKUWEbOf/JfV05Jly0qAVdlxo6WZ4kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Co2pN/btsIKUWEbOf/JfV05Jly0qAVdlxo6WZ4kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Co2pN/btsIKUWEbOf/JfV05Jly0qAVdlxo6WZ4kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCo2pN%2FbtsIKUWEbOf%2FJfV05Jly0qAVdlxo6WZ4kK%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;311&quot; height=&quot;199&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;훈련 도중 learning rate를 증가시켜주는게 차이점!&lt;br /&gt;&lt;/span&gt;warmup restart로 그림처럼 local minimum에서 빠져나올 기회를 제공한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LR Annealing: &lt;/b&gt;lr schedule과 혼용되어 사용되나 iteration에 따라 monotonic하게 감소하는것을 의미.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #202121; text-align: justify;&quot;&gt;직관적으로는 처음에는 높은 learning rate로 좋은 수렴 지점을 빡세게 찾고, &lt;br /&gt;마지막에는 낮은 learning rate로 수렴 지점에 정밀하게 안착할 수 있게 만들어주는 역할을 한다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style4&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Model Outputs&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;ModelOutput&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모든 모델은 ModelOutput의 subclass의 instance출력을 갖는다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735478424&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import BertTokenizer, BertForSequenceClassification
import torch

tokenizer = BertTokenizer.from_pretrained(&quot;google-bert/bert-base-uncased&quot;)
model = BertForSequenceClassification.from_pretrained(&quot;google-bert/bert-base-uncased&quot;)

inputs = tokenizer(&quot;Hello, my dog is cute&quot;, return_tensors=&quot;pt&quot;)
labels = torch.tensor([1]).unsqueeze(0)  # 배치 크기 1
outputs = model(**inputs, labels=labels)

# SequenceClassifierOutput(loss=tensor(0.4267, grad_fn=&amp;lt;NllLossBackward0&amp;gt;), 
#                           logits=tensor([[-0.0658,  0.5650]], grad_fn=&amp;lt;AddmmBackward0&amp;gt;), 
#                           hidden_states=None, attentions=None)&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;outputs객체는 필히 loss와 logits를 갖기에 (outputs.loss, outputs.logits) 튜플을 반환한다.&lt;br /&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Cf)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; text-align: left;&quot;&gt;CuasalLM의 경우:&lt;br /&gt;&lt;b&gt;loss:&lt;/b&gt; Language modeling loss (for next-token prediction).&lt;/span&gt;&lt;br /&gt;&lt;b&gt;logits:&lt;/b&gt; &lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: left;&quot;&gt;Prediction scores of the LM_Head (scores for each vocabulary token before SoftMax)&lt;br /&gt;= r&lt;span style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot;&gt;aw prediction values and are not bounded to a specific range&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;transformers output word를 위해선 : project linearly-&amp;gt;apply softmax 단계를 거침.&lt;br /&gt;이때, LM_Head는 pre-training이 아닌, Fine-Tuning에서 사용됨.&lt;br /&gt;LM_Head란, 모델의 출력 hidden_state를 받아 prediction을 수행하는 것을 의미.&lt;br /&gt;&lt;/span&gt;ex) BERT&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721793348850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import BertModel, BertTokenizer, BertForMaskedLM
import torch

tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)
model = BertForMaskedLM.from_pretrained(&quot;bert-base-uncased&quot;)

inputs = tokenizer(&quot;The capital of France is [MASK].&quot;, return_tensors=&quot;pt&quot;)
outputs = model(**inputs)
logits = outputs.logits
print(f'logits: {logits}') # `torch.FloatTensor` of shape `(batch_size, sequence_length, vocab_size)

# [MASK] 토큰에 대한 예측 결과를 확인합니다.
masked_index = (inputs.input_ids == tokenizer.mask_token_id).nonzero(as_tuple=True)[1]
print(f'masked_index: {masked_index}') # `torch.LongTensor` of shape `(1,)

MASK_token = logits[0, masked_index] # batch의 첫문장에서 MASK token을 가져옴.
print(f'MASK_Token: {MASK_token}')

predicted_token_id = MASK_token.argmax(axis=-1) # 주어진 차원에서 가장 큰 값의 index를 반환. = 모델이 해당위치에서 얘측한 단어의 token_id
print(f'predicted_token_id: {predicted_token_id}')


predicted_token = tokenizer.decode(predicted_token_id)
print(predicted_token)  # paris 출력


# logits: tensor([[[ -6.4346,  -6.4063,  -6.4097,  ...,  -5.7691,  -5.6326,  -3.7883],
#          [-14.0119, -14.7240, -14.2120,  ..., -11.6976, -10.7304, -12.7618],
#          [ -9.6561, -10.3125,  -9.7459,  ...,  -8.7782,  -6.6036, -12.6596],
#          ...,
#          [ -3.7861,  -3.8572,  -3.5644,  ...,  -2.5593,  -3.1093,  -4.3820],
#          [-11.6598, -11.4274, -11.9267,  ...,  -9.8772, -10.2103,  -4.7594],
#          [-11.7267, -11.7509, -11.8040,  ..., -10.5943, -10.9407,  -7.5151]]],
#        grad_fn=&amp;lt;ViewBackward0&amp;gt;)
# masked_index: tensor([6])
# MASK_Token: tensor([[-3.7861, -3.8572, -3.5644,  ..., -2.5593, -3.1093, -4.3820]],
#        grad_fn=&amp;lt;IndexBackward0&amp;gt;)
# predicted_token_id: tensor([3000])
# paris&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;cf) 참고로 argmax가 반환한 index는 vocabulary의 Index임을 아래를 통해 확인할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1721795128552&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for word, idx in list(vocab.items())[:5]:  # 어휘의 처음 10개 항목 출력
    print(f&quot;{word}: {idx}&quot;)
for word, idx in list(vocab.items())[2990:3010]:  # 어휘의 처음 10개 항목 출력
    print(f&quot;{word}: {idx}&quot;)
    
# [PAD]: 0
# [unused0]: 1
# [unused1]: 2
# [unused2]: 3
# [unused3]: 4
# jack: 2990
# fall: 2991
# raised: 2992
# itself: 2993
# stay: 2994
# true: 2995
# studio: 2996
# 1988: 2997
# sports: 2998
# replaced: 2999
# paris: 3000
# systems: 3001
# saint: 3002
# leader: 3003
# theatre: 3004
# whose: 3005
# market: 3006
# capital: 3007
# parents: 3008
# spanish: 3009&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style4&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Trainer&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Trainer&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Trainer클래스는   Transformers 모델에 최적화되어 있다&lt;br /&gt;= 모델이 항상 tuple(= 첫요소로 loss반환) , ModelOutput의 subclass를 반환해야함을 의미&lt;br /&gt;= labels인자가 제공되면 Loss를 계산할 수 있음.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Trainer는 TrainingArguments로 필요인자를 전달해주면, 사용자가 직접 train_loop작성할 필요없이 학습을 시작할 수 있다.&lt;br /&gt;또한, TRL 라이브러리의 SFTTrainer의 경우, 이 Trainer클래스를 감싸고 있으며, LoRA, Quantizing과 DeepSpeed 등의 기능을 통해 어떤 모델 크기에도 효율적인 확장이 가능하다.&lt;br /&gt;&lt;br /&gt;먼저, 시작에 앞서 분산환경을 위해서는 Accelerate라이브러리를 설치해야한다!&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735494398&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install accelerate
pip install accelerate --upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Basic Usage&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;hugㅇㅇㄹㄴ&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt; Checkpoints&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;hugㅇㅇㄹㄴ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Customizing&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;hugㅇㅇㄹㄴ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Callbacks &amp;amp; Logging&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;hugㅇㅇㄹㄴ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Accelerate &amp;amp; Trainer&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;hugㅇㅇㄹㄴ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;TrainingArguments&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721801836393&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output_dir (str): 모델 예측과 체크포인트가 작성될 출력 디렉토리입니다.
eval_strategy (str 또는 [~trainer_utils.IntervalStrategy], optional, 기본값은 &quot;no&quot;): 훈련 중 채택할 평가 전략을 나타냅니다. 가능한 값은 다음과 같습니다:
&amp;bull;	&quot;no&quot;: 훈련 중 평가를 하지 않습니다.
&amp;bull;	&quot;steps&quot;: eval_steps마다 평가를 수행하고 기록합니다.
&amp;bull;	&quot;epoch&quot;: 각 에포크가 끝날 때마다 평가를 수행합니다.
per_device_train_batch_size (int, optional, 기본값은 8): 훈련 시 GPU/XPU/TPU/MPS/NPU 코어/CPU당 배치 크기입니다.
per_device_eval_batch_size (int, optional, 기본값은 8): 평가 시 GPU/XPU/TPU/MPS/NPU 코어/CPU당 배치 크기입니다.
gradient_accumulation_steps (int, optional, 기본값은 1): 역전파/업데이트를 수행하기 전에 그래디언트를 누적할 업데이트 단계 수입니다.
eval_accumulation_steps (int, optional): 결과를 CPU로 이동시키기 전에 출력 텐서를 누적할 예측 단계 수입니다. 설정하지 않으면 전체 예측이 GPU/NPU/TPU에서 누적된 후 CPU로 이동됩니다(더 빠르지만 더 많은 메모리가 필요합니다).
learning_rate (float, optional, 기본값은 5e-5): [AdamW] 옵티마이저의 초기 학습률입니다.
weight_decay (float, optional, 기본값은 0): [AdamW] 옵티마이저에서 모든 레이어에(바이어스 및 LayerNorm 가중치는 제외) 적용할 가중치 감쇠입니다.
max_grad_norm (float, optional, 기본값은 1.0): 최대 그래디언트 노름(그래디언트 클리핑을 위한)입니다.
num_train_epochs(float, optional, 기본값은 3.0): 수행할 총 훈련 에포크 수입니다(정수가 아닌 경우 마지막 에포크의 백분율을 수행한 후 훈련을 중지합니다).
max_steps (int, optional, 기본값은 -1): 양의 정수로 설정된 경우, 수행할 총 훈련 단계 수입니다. num_train_epochs를 무시합니다. 유한한 데이터 세트의 경우, max_steps에 도달할 때까지 데이터 세트를 반복합니다.
eval_steps (int 또는 float, optional): eval_strategy=&quot;steps&quot;인 경우 두 평가 사이의 업데이트 단계 수입니다. 설정되지 않은 경우, logging_steps와 동일한 값으로 기본 설정됩니다. 정수 또는 [0,1) 범위의 부동 소수점 수여야 합니다. 1보다 작으면 전체 훈련 단계의 비율로 해석됩니다.
lr_scheduler_type (str 또는 [SchedulerType], optional, 기본값은 &quot;linear&quot;): 사용할 스케줄러 유형입니다. 모든 가능한 값은 [SchedulerType]의 문서를 참조하세요.
lr_scheduler_kwargs ('dict', optional, 기본값은 {}): lr_scheduler에 대한 추가 인수입니다. 각 스케줄러의 문서를 참조하여 가능한 값을 확인하세요.
warmup_ratio (float, optional, 기본값은 0.0): 0에서 learning_rate로의 선형 웜업에 사용되는 총 훈련 단계의 비율입니다.
warmup_steps (int, optional, 기본값은 0): 0에서 learning_rate로의 선형 웜업에 사용되는 단계 수입니다. warmup_ratio의 영향을 무시합니다.
logging_dir (str, optional): TensorBoard 로그 디렉토리입니다. 기본값은 output_dir/runs/CURRENT_DATETIME_HOSTNAME입니다.
logging_strategy (str 또는 [~trainer_utils.IntervalStrategy], optional, 기본값은 &quot;steps&quot;): 훈련 중 채택할 로깅 전략을 나타냅니다. 가능한 값은 다음과 같습니다:
&amp;bull;	&quot;no&quot;: 훈련 중 로깅을 하지 않습니다.
&amp;bull;	&quot;epoch&quot;: 각 에포크가 끝날 때마다 로깅을 합니다.
&amp;bull;	&quot;steps&quot;: logging_steps마다 로깅을 합니다.
logging_first_step (bool, optional, 기본값은 False): 첫 번째 global_step을 로깅할지 여부를 나타냅니다.
logging_steps (int 또는 float, optional, 기본값은 500): logging_strategy=&quot;steps&quot;인 경우 두 로그 사이의 업데이트 단계 수입니다. 정수 또는 [0,1) 범위의 부동 소수점 수여야 합니다. 1보다 작으면 전체 훈련 단계의 비율로 해석됩니다.
run_name (str, optional, 기본값은 output_dir): 실행에 대한 설명자입니다. 일반적으로 wandb 및 mlflow 로깅에 사용됩니다. 지정되지 않은 경우 output_dir과 동일합니다.
save_strategy (str 또는 [~trainer_utils.IntervalStrategy], optional, 기본값은 &quot;steps&quot;): 훈련 중 체크포인트를 저장할 전략을 나타냅니다. 가능한 값은 다음과 같습니다:
&amp;bull;	&quot;no&quot;: 훈련 중 저장하지 않습니다.
&amp;bull;	&quot;epoch&quot;: 각 에포크가 끝날 때마다 저장합니다.
&amp;bull;	&quot;steps&quot;: save_steps마다 저장합니다. &quot;epoch&quot; 또는 &quot;steps&quot;가 선택된 경우, 항상 훈련이 끝날 때 저장이 수행됩니다.
save_total_limit (int, optional): 값이 전달되면 체크포인트의 총 수를 제한합니다. output_dir에 있는 오래된 체크포인트를 삭제합니다. load_best_model_at_end가 활성화되면 metric_for_best_model에 따라 &quot;최고&quot; 체크포인트는 항상 가장 최근의 체크포인트와 함께 유지됩니다.
예를 들어, save_total_limit=5 및 load_best_model_at_end인 경우, 마지막 네 개의 체크포인트는 항상 최고 모델과 함께 유지됩니다. save_total_limit=1 및 load_best_model_at_end인 경우, 마지막 체크포인트와 최고 체크포인트가 서로 다르면 두 개의 체크포인트가 저장될 수 있습니다.
save_safetensors (bool, optional, 기본값은 True): state_dict를 저장하고 로드할 때 기본 torch.load 및 torch.save 대신 safetensors를 사용합니다.
save_on_each_node (bool, optional, 기본값은 False): 멀티노드 분산 훈련을 수행할 때, 모델과 체크포인트를 각 노드에 저장할지 여부를 나타냅니다. 기본적으로 메인 노드에만 저장됩니다.
seed (int, optional, 기본값은 42): 훈련 시작 시 설정될 랜덤 시드입니다. 실행 간 일관성을 보장하려면 모델에 무작위로 초기화된 매개변수가 있는 경우 [~Trainer.model_init] 함수를 사용하여 모델을 인스턴스화하세요.
data_seed (int, optional): 데이터 샘플러에 사용할 랜덤 시드입니다. 설정되지 않은 경우 데이터 샘플링을 위한 Random sampler는 seed와 동일한 시드를 사용합니다. 이 값을 사용하면 모델 시드와는 독립적으로 데이터 샘플링의 일관성을 보장할 수 있습니다.
bf16 (bool, optional, 기본값은 False): 32비트 훈련 대신 bf16 16비트(혼합) 정밀도 훈련을 사용할지 여부를 나타냅니다. Ampere 이상 NVIDIA 아키텍처 또는 CPU(사용_cpu) 또는 Ascend NPU를 사용해야 합니다. 이는 실험적 API이며 변경될 수 있습니다.
fp16 (bool, optional, 기본값은 False): 32비트 훈련 대신 fp16 16비트(혼합) 정밀도 훈련을 사용할지 여부를 나타냅니다.
half_precision_backend (str, optional, 기본값은 &quot;auto&quot;): 혼합 정밀도 훈련을 위한 백엔드입니다. &quot;auto&quot;, &quot;apex&quot;, &quot;cpu_amp&quot; 중 하나여야 합니다. &quot;auto&quot;는 감지된 PyTorch 버전에 따라 CPU/CUDA AMP 또는 APEX를 사용하며, 다른 선택지는 요청된 백엔드를 강제로 사용합니다.
bf16_full_eval (bool, optional, 기본값은 False): 32비트 대신 전체 bfloat16 평가를 사용할지 여부를 나타냅니다. 이는 더 빠르고 메모리를 절약하지만 메트릭 값에 악영향을 줄 수 있습니다. 이는 실험적 API이며 변경될 수 있습니다.
fp16_full_eval (bool, optional, 기본값은 False): 32비트 대신 전체 float16 평가를 사용할지 여부를 나타냅니다. 이는 더 빠르고 메모리를 절약하지만 메트릭 값에 악영향을 줄 수 있습니다.
tf32 (bool, optional): Ampere 및 최신 GPU 아키텍처에서 사용할 TF32 모드를 활성화할지 여부를 나타냅니다. 기본값은 torch.backends.cuda.matmul.allow_tf32의 기본값에 따릅니다. 자세한 내용은 TF32 문서를 참조하세요. 이는 실험적 API이며 변경될 수 있습니다.
local_rank (int, optional, 기본값은 -1): 분산 훈련 중 프로세스의 순위를 나타냅니다.
ddp_backend (str, optional): 분산 훈련에 사용할 백엔드를 나타냅니다. &quot;nccl&quot;, &quot;mpi&quot;, &quot;ccl&quot;, &quot;gloo&quot;, &quot;hccl&quot; 중 하나여야 합니다.
dataloader_drop_last (bool, optional, 기본값은 False): 데이터 세트의 길이가 배치 크기로 나누어떨어지지 않는 경우 마지막 불완전한 배치를 삭제할지 여부를 나타냅니다.
dataloader_num_workers (int, optional, 기본값은 0): 데이터 로딩에 사용할 하위 프로세스 수입니다(PyTorch 전용). 0은 데이터가 메인 프로세스에서 로드됨을 의미합니다.
remove_unused_columns (bool, optional, 기본값은 True): 모델의 forward 메서드에서 사용되지 않는 열을 자동으로 제거할지 여부를 나타냅니다.
label_names (List[str], optional): input dictionary에서 label에 해당하는 키의 목록입니다. 기본값은 모델이 사용하는 레이블 인수의 목록입니다.
load_best_model_at_end (bool, optional, 기본값은 False): 훈련이 끝날 때 최상의 모델을 로드할지 여부를 나타냅니다. 이 옵션이 활성화되면, 최상의 체크포인트가 항상 저장됩니다. 자세한 내용은 save_total_limit를 참조하세요.
&amp;lt;Tip&amp;gt;
            When set to `True`, the parameters `save_strategy` needs to be the same as `eval_strategy`, and in
            the case it is &quot;steps&quot;, `save_steps` must be a round multiple of `eval_steps`.
&amp;lt;/Tip&amp;gt;
metric_for_best_model (str, optional): load_best_model_at_end와 함께 사용하여 두 모델을 비교할 메트릭을 지정합니다. 평가에서 반환된 메트릭 이름이어야 합니다. 지정되지 않은 경우 기본값은 &quot;loss&quot;이며, load_best_model_at_end=True인 경우 eval_loss를 사용합니다. 이 값을 설정하면 greater_is_better의 기본값은 True가 됩니다. 메트릭이 낮을수록 좋다면 False로 설정하세요.
greater_is_better (bool, optional): load_best_model_at_end 및 metric_for_best_model과 함께 사용하여 더 나은 모델이 더 높은 메트릭을 가져야 하는지 여부를 지정합니다. 기본값은 다음과 같습니다:
&amp;bull;	metric_for_best_model이 &quot;loss&quot;로 끝나지 않는 값으로 설정된 경우 True입니다.
&amp;bull;	metric_for_best_model이 설정되지 않았거나 &quot;loss&quot;로 끝나는 값으로 설정된 경우 False입니다.

fsdp (bool, str 또는 [~trainer_utils.FSDPOption]의 목록, optional, 기본값은 ''): PyTorch 분산 병렬 훈련을 사용합니다(분산 훈련 전용).
fsdp_config (str 또는 dict, optional): fsdp(Pytorch 분산 병렬 훈련)와 함께 사용할 설정입니다. 값은 fsdp json 구성 파일의 위치(e.g., fsdp_config.json) 또는 이미 로드된 json 파일(dict)일 수 있습니다.
deepspeed (str 또는 dict, optional): Deepspeed를 사용합니다. 이는 실험적 기능이며 API가 변경될 수 있습니다. 값은 DeepSpeed json 구성 파일의 위치(e.g., ds_config.json) 또는 이미 로드된 json 파일(dict)일 수 있습니다.
accelerator_config (str, dict, 또는 AcceleratorConfig, optional): 내부 Accelerator 구현과 함께 사용할 설정입니다. 값은 accelerator json 구성 파일의 위치(e.g., accelerator_config.json), 이미 로드된 json 파일(dict), 또는 [~trainer_pt_utils.AcceleratorConfig]의 인스턴스일 수 있습니다.
label_smoothing_factor (float, optional, 기본값은 0.0): 사용할 레이블 스무딩 팩터입니다. 0은 label_smoothing을 사용하지 않음을 의미, 다른 값은 원핫 인코딩된 레이블을 변경합니다.
optim (str 또는 [training_args.OptimizerNames], optional, 기본값은 &quot;adamw_torch&quot;): 사용할 옵티마이저를 나타냅니다. adamw_hf, adamw_torch, adamw_torch_fused, adamw_apex_fused, adamw_anyprecision, adafactor 중에서 선택할 수 있습니다.
optim_args (str, optional): AnyPrecisionAdamW에 제공되는 선택적 인수입니다.
group_by_length (bool, optional, 기본값은 False): 훈련 데이터 세트에서 대략 같은 길이의 샘플을 그룹화할지 여부를 나타냅니다(패딩을 최소화하고 효율성을 높이기 위해). 동적 패딩을 적용할 때만 유용합니다.
report_to (str 또는 List[str], optional, 기본값은 &quot;all&quot;): 결과와 로그를 보고할 통합 목록입니다. 지원되는 플랫폼은 &quot;azure_ml&quot;, &quot;clearml&quot;, &quot;codecarbon&quot;, &quot;comet_ml&quot;, &quot;dagshub&quot;, &quot;dvclive&quot;, &quot;flyte&quot;, &quot;mlflow&quot;, &quot;neptune&quot;, &quot;tensorboard&quot;, &quot;wandb&quot;입니다. &quot;all&quot;은 설치된 모든 통합에 보고하며, &quot;none&quot;은 통합에 보고하지 않습니다.
ddp_find_unused_parameters (bool, optional): 분산 훈련을 사용할 때, DistributedDataParallel에 전달되는 find_unused_parameters 플래그의 값을 나타냅니다. 기본값은 그래디언트 체크포인팅을 사용하는 경우 False, 그렇지 않은 경우 True입니다.
ddp_bucket_cap_mb (int, optional): 분산 훈련을 사용할 때, DistributedDataParallel에 전달되는 bucket_cap_mb 플래그의 값을 나타냅니다.
ddp_broadcast_buffers (bool, optional): 분산 훈련을 사용할 때, DistributedDataParallel에 전달되는 broadcast_buffers 플래그의 값을 나타냅니다. 기본값은 그래디언트 체크포인팅을 사용하는 경우 False, 그렇지 않은 경우 True입니다.
dataloader_persistent_workers (bool, optional, 기본값은 False): True로 설정하면 데이터 로더는 데이터 세트가 한 번 소비된 후에도 작업자 프로세스를 종료하지 않습니다. 이는 작업자 데이터 세트 인스턴스를 유지할 수 있습니다. 훈련 속도를 높일 수 있지만 RAM 사용량이 증가합니다. 기본값은 False입니다.
push_to_hub (bool, optional, 기본값은 False): 모델이 저장될 때마다 모델을 허브로 푸시할지 여부를 나타냅니다. 이 옵션이 활성화되면 output_dir은 git 디렉토리가 되어 저장이 트리거될 때마다 콘텐츠가 푸시됩니다(save_strategy에 따라 다름). [~Trainer.save_model]을 호출하면 푸시가 트리거됩니다.
resume_from_checkpoint (str, optional): 모델에 유효한 체크포인트가 있는 폴더의 경로입니다. 이 인수는 직접적으로 [Trainer]에서 사용되지 않으며, 대신 훈련/평가 스크립트에서 사용됩니다. 자세한 내용은 예제 스크립트를 참조하세요.
hub_model_id (str, optional): 로컬 output_dir과 동기화할 저장소의 이름입니다. 단순한 모델 ID일 수 있으며, 이 경우 모델은 네임스페이스에 푸시됩니다. 그렇지 않으면 전체 저장소 이름이어야 합니다(e.g., &quot;user_name/model&quot;). 기본값은 user_name/output_dir_name입니다. 기본값은 output_dir의 이름입니다.
hub_strategy (str 또는 [~trainer_utils.HubStrategy], optional, 기본값은 &quot;every_save&quot;): 허브로 푸시할 범위와 시점을 정의합니다. 가능한 값은 다음과 같습니다:
&amp;bull;	&quot;end&quot;: 모델, 구성, 토크나이저(전달된 경우), 모델 카드 초안을 푸시합니다.
&amp;bull;	&quot;every_save&quot;: 모델, 구성, 토크나이저(전달된 경우), 모델 카드 초안을 저장할 때마다 푸시합니다. 푸시는 비동기적으로 수행되며, 저장이 매우 빈번한 경우 이전 푸시가 완료되면 새로운 푸시가 시도됩니다. 훈련이 끝날 때 최종 모델로 마지막 푸시가 수행됩니다.
&amp;bull;	&quot;checkpoint&quot;: &quot;every_save&quot;와 유사하지만 최신 체크포인트도 last-checkpoint라는 하위 폴더에 푸시하여 trainer.train(resume_from_checkpoint=&quot;last-checkpoint&quot;)으로 훈련을 쉽게 재개할 수 있습니다.
&amp;bull;	&quot;all_checkpoints&quot;: &quot;checkpoint&quot;와 유사하지만 최종 저장소에서 나타나는 대로 모든 체크포인트를 푸시합니다(따라서 최종 저장소에는 폴더마다 하나의 체크포인트 폴더가 있습니다).
hub_token (str, optional): 모델을 허브로 푸시할 때 사용할 토큰입니다. 기본값은 huggingface-cli login으로 얻은 캐시 폴더의 토큰입니다.
hub_private_repo (bool, optional, 기본값은 False): True로 설정하면 허브 저장소가 비공개로 설정됩니다.
hub_always_push (bool, optional, 기본값은 False): True가 아닌 경우, 이전 푸시가 완료되지 않으면 체크포인트 푸시를 건너뜁니다.
gradient_checkpointing (bool, optional, 기본값은 False): 메모리를 절약하기 위해 그래디언트 체크포인팅을 사용할지 여부를 나타냅니다. 역전파 속도가 느려집니다.
auto_find_batch_size (bool, optional, 기본값은 False): 메모리에 맞는 배치 크기를 자동으로 찾아 CUDA 메모리 부족 오류를 피할지 여부를 나타냅니다. accelerate가 설치되어 있어야 합니다(pip install accelerate).
ray_scope (str, optional, 기본값은 &quot;last&quot;): Ray를 사용한 하이퍼파라미터 검색 시 사용할 범위입니다. 기본값은 &quot;last&quot;입니다. Ray는 모든 시도의 마지막 체크포인트를 사용하여 비교하고 최상의 체크포인트를 선택합니다. 다른 옵션도 있습니다. 자세한 내용은 Ray 문서를 참조하세요.
ddp_timeout (int, optional, 기본값은 1800): torch.distributed.init_process_group 호출의 타임아웃입니다. 분산 실행 시 GPU 소켓 타임아웃을 피하기 위해 사용됩니다. 자세한 내용은 PyTorch 문서를 참조하세요.
torch_compile (bool, optional, 기본값은 False): PyTorch 2.0 torch.compile을 사용하여 모델을 컴파일할지 여부를 나타냅니다. 이는 torch.compile API에 대한 기본값을 사용합니다. torch_compile_backend 및 torch_compile_mode 인수를 사용하여 기본값을 사용자 지정할 수 있지만, 모든 값이 작동할 것이라고 보장하지 않습니다. 이 플래그와 전체 컴파일 API는 실험적이며 향후 릴리스에서 변경될 수 있습니다.
torch_compile_backend (str, optional): torch.compile에서 사용할 백엔드입니다. 값을 설정하면 torch_compile이 True로 설정됩니다. 가능한 값은 PyTorch 문서를 참조하세요. 이는 실험적이며 향후 릴리스에서 변경될 수 있습니다.
torch_compile_mode (str, optional): torch.compile에서 사용할 모드입니다. 값을 설정하면 torch_compile이 True로 설정됩니다. 가능한 값은 PyTorch 문서를 참조하세요. 이는 실험적이며 향후 릴리스에서 변경될 수 있습니다.
split_batches (bool, optional): 분산 훈련 중 데이터 로더가 생성하는 배치를 장치에 분할할지 여부를 나타냅니다. True로 설정하면 사용된 실제 배치 크기는 모든 종류의 분산 프로세스에서 동일하지만, 사용 중인 프로세스 수의 정수 배여야 합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style4&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DeepSpeed&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;trust_remote_code=True&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중국모델에서 흔히보이는 trust_remote_code=True 설정, 과연 이건 뭘까?&lt;br /&gt;이는 &quot;huggingface/transformers&quot;에 Model Architecture가 아직 추가되지 않은경우:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1721735501019&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import AutoTokenizer, AutoModel
model = AutoModel.from_pretrained(&quot;internlm/internlm-chat-7b&quot;, trust_remote_code=True, device='cuda')&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&quot;huggingface repo 'internlm/internlm-chat-7b'에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;모델 코드를 다운로드하고, 가중치와 함께 실행&lt;/b&gt;&lt;/span&gt;한다&quot;는 의미이다.&lt;br /&gt;만약 이 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;False&lt;/b&gt;라면, 라이브러리는 huggingface/transformers에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;내장된 모델 아키텍처를 사용하고 가중치만 다운로드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;하는것을 의미한다.&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;rue&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중국모델에서 흔히&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ollator함수를 보면 아래와 같은 코드의 형태를 띠는데, 여기서 input_ids와 label이라는 조금 생소한 단&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>HuggingFace </category>
      <category>adam</category>
      <category>AUTO</category>
      <category>automodel</category>
      <category>autoprocessor</category>
      <category>autotokenizer</category>
      <category>deepspeed</category>
      <category>Huggingface</category>
      <category>Optimizer</category>
      <category>Trainer</category>
      <category>Tutorials</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/289</guid>
      <comments>https://chan4im.tistory.com/289#entry289comment</comments>
      <pubDate>Wed, 31 Jul 2024 14:37:18 +0900</pubDate>
    </item>
    <item>
      <title>[Data Preprocessing] - Data Collator</title>
      <link>https://chan4im.tistory.com/288</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Collate&lt;/b&gt;: 함께 합치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에서 유추가능하듯, Data Collator는 다음과 같은 역할을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Data Collator&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Data Collator&lt;/h3&gt;
&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;일련의 sample list를 &quot;single training mini-batch&quot;의 Tensor형태로 묶어줌&lt;/u&gt;&lt;/span&gt;.&amp;nbsp;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbn55y/btsIybZnqeW/JJFZeZuxJYjYtSDMiHgKKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbn55y/btsIybZnqeW/JJFZeZuxJYjYtSDMiHgKKK/img.png&quot; data-alt=&quot;Default Data Collator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbn55y/btsIybZnqeW/JJFZeZuxJYjYtSDMiHgKKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbn55y%2FbtsIybZnqeW%2FJJFZeZuxJYjYtSDMiHgKKK%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;1978&quot; height=&quot;676&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default Data Collator&lt;/figcaption&gt;
&lt;/figure&gt;
이는 아래처럼 train_dataset이 data_collator를 이용해 mini-batch로 묶여 모델로 들어가 학습하는데 도움이 된다.&lt;br /&gt;
&lt;pre id=&quot;code_1720942462608&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;trainer = Trainer(
    model=model,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    data_collator=data_collator,​&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;batch[&quot;input_ids&quot;] , batch[&quot;labels&quot;] &lt;/span&gt;?&lt;/span&gt;&lt;/h3&gt;
다만, 위와 달리 대부분의 Data Collator함수를 보면 아래와 같은 코드의 형태를 띠는데, 여기서 input_ids와 label이라는 조금 생소한 단어가 있다:&lt;br /&gt;
&lt;pre id=&quot;code_1720942667375&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyDataCollator:
    def __init__(self, processor):
        self.processor = processor

    def __call__(self, examples): 
        texts = []
        images = []
        for example in examples:
            image, question, answer = example 
            messages = [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: question},
                        {&quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: answer}] # &amp;lt;-- 여기까지 잘 들어가는것 확인완료.
            text = self.processor.tokenizer.apply_chat_template(messages, add_generation_prompt=False)
            texts.append(text)
            images.append(image)

        batch = self.processor(text=text, images=image, return_tensors=&quot;pt&quot;, padding=True)
        labels = batch[&quot;input_ids&quot;].clone()
        if self.processor.tokenizer.pad_token_id is not None:
            labels[labels == self.processor.tokenizer.pad_token_id] = -100
        batch[&quot;labels&quot;] = labels
        return batch

data_collator = MyDataCollator(processor)​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;과연 batch[&quot;input_ids&quot;]와 batch[&quot;labels&quot;]가 뭘까?&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;전술했던 data_collator는 아래와 같은 형식을 띠는데, 여기서도 보면 inputs와 labels가 있는 것을 볼 수 있다.&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhaTlo/btsIzqOMzgS/CZAUN4WjOt1BKuw8Ar5odk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhaTlo/btsIzqOMzgS/CZAUN4WjOt1BKuw8Ar5odk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhaTlo/btsIzqOMzgS/CZAUN4WjOt1BKuw8Ar5odk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhaTlo%2FbtsIzqOMzgS%2FCZAUN4WjOt1BKuw8Ar5odk%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;2044&quot; height=&quot;646&quot; data-origin-width=&quot;2044&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;모든 모델은 다르지만, 다른모델과 유사한점을 공유한다&lt;br /&gt;= 대부분의 모델은 동일한 입력을 사용한다!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Input IDs&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Input ID는 모델에 입력으로 전달되는&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&quot;유일한 필수 매개변수&quot;&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인 경우가 많다.&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Input ID는&lt;span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; token_index&lt;/span&gt;로, 사용할 sequence(문장)를 구성하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;token의 숫자표현&lt;/span&gt;이다.&lt;br /&gt;각 tokenizer는 다르게 작동하지만 &quot;기본 메커니즘은 동일&quot;하다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720943186192&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)

sequence = &quot;A Titan RTX has 24GB of VRAM&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;tokenizer는 sequence(문장)를 tokenizer vocab에 있는 Token으로 분할한다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720943271467&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokenized_sequence = tokenizer.tokenize(sequence)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;token은 word나 subword 둘중 하나이다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720943381864&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print(tokenized_sequence)
# 출력: ['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']
# 예를 들어, &quot;VRAM&quot;은 모델 어휘에 없어서 &quot;V&quot;, &quot;RA&quot; 및 &quot;M&quot;으로 분할됨.
# 이러한 토큰이 별도의 단어가 아니라 동일한 단어의 일부임을 나타내기 위해서는?
# --&amp;gt; &quot;RA&quot;와 &quot;M&quot; 앞에 이중해시(##) 접두사가 추가됩


inputs = tokenizer(sequence)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;이를 통해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;token은 모델이 이해가능한 ID로 변환&lt;/u&gt;&lt;/span&gt;될 수 있다.&lt;br /&gt;이때, 모델내부에서 작동하기 위해서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;input_ids를 key로, ID값을 value로 하는 &quot;딕셔너리&quot;형태로 반환&lt;/u&gt;&lt;/span&gt;해야한다:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720943616214&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;encoded_sequence = inputs[&quot;input_ids&quot;]
print(encoded_sequence)
# 출력: [101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;또한, 모델에 따라서 자동으로 &quot;special token&quot;을 추가하는데,&amp;nbsp;&lt;br /&gt;여기에는 모델이 가끔 사용하는 &quot;special IDs&quot;가 추가된다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720943709340&quot; class=&quot;python&quot; style=&quot;color: #666666;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;decoded_sequence = tokenizer.decode(encoded_sequence)
print(decoded_sequence)
# 출력: [CLS] A Titan RTX has 24GB of VRAM [SEP]&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Attention Mask&lt;/b&gt;&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Attention Mask는 Sequence를 batch로 묶을 때 사용하는 Optional한 인수로&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&quot;모델이 어떤 token을 주목하고 하지 말아야 하는지&quot;&lt;/span&gt;를 나타낸다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1720943829359&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)

sequence_a = &quot;This is a short sequence.&quot;
sequence_b = &quot;This is a rather long sequence. It is at least longer than the sequence A.&quot;

encoded_sequence_a = tokenizer(sequence_a)[&quot;input_ids&quot;]
encoded_sequence_b = tokenizer(sequence_b)[&quot;input_ids&quot;]

len(encoded_sequence_a), len(encoded_sequence_b)
# 출력: (8, 19)&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위를 보면, encoding된 길이가 다르기 때문에 &quot;동일한 Tensor로 묶을 수가 없다.&quot;&lt;br /&gt;--&amp;gt; padding이나 truncation이 필요함.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1720943915487&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;padded_sequences = tokenizer([sequence_a, sequence_b], padding=True)

padded_sequences[&quot;input_ids&quot;]
# 출력: [[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]]

padded_sequences[&quot;attention_mask&quot;]
# 출력: [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;attention_mask는 tokenizer가 반환하는 dictionary의 &quot;attention_mask&quot; key에 존재한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;∙Token Types IDs&lt;/b&gt;&lt;/h3&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;어떤 모델의 목적은 classification이나 QA이다.&lt;br /&gt;이런 모델은 2개의 &quot;다른 목적을 단일 input_ids&quot;항목으로 결합해야한다.&lt;br /&gt;= [CLS], [SEP] 등의 특수토큰을 이용해 수행됨.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;ex)&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1720945966747&quot; class=&quot;python&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP]

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-cased&quot;)
sequence_a = &quot;HuggingFace is based in NYC&quot;
sequence_b = &quot;Where is HuggingFace based?&quot;

encoded_dict = tokenizer(sequence_a, sequence_b)
decoded = tokenizer.decode(encoded_dict[&quot;input_ids&quot;])

print(decoded)
# 출력: [CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 예제에서 tokenizer를 이용해 2개의 sequence가 2개의 인수로 전달되어 자동으로 위와같은 문장을 생성하는 것을 볼 수 있다.&lt;br /&gt;이는 seq이후에 나오는 seq의 시작위치를 알기에는 좋다.&lt;br /&gt;&lt;br /&gt;다만, 다른 모델은 token_types_ids도 사용하며, token_type_ids로 이 MASK를 반환한다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1720948812385&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;encoded_dict['token_type_ids']
# 출력: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;질문에 사용되는 context는 모두 0으로,&amp;nbsp;&lt;br /&gt;질문에 해당되는 sequence는 모두 1로 설정된 것을 확인할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Position IDs&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RNN: 각 &lt;u&gt;토큰의 위치가 내장.&lt;/u&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Transformer: 각 토큰의 위치를 인식 ❌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;there4; position_ids는 모델이 각 토큰의 위치를 list에서 식별하는 데 사용되는 optional 매개변수.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모델에 position_ids가 전달되지 않으면, ID는 자동으로 &lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;Absolute positional embeddings&lt;/span&gt;으로 생성:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;Absolute positional embeddings&lt;/span&gt;은 [0, config.max_position_embeddings - 1] 범위에서 선택.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일부 모델은 &lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;sinusoidal position embeddings&lt;/span&gt;이나 &lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;relative position embeddings&lt;/span&gt;과 같은 다른 유형의 &lt;span style=&quot;background-color: #fcfcfc; color: #404040; text-align: start;&quot;&gt;positional embedding&lt;/span&gt;을 사용.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Labels&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Labels는 모델이 자체적으로 손실을 계산하도록 전달될 수 있는 Optional인수이다.&lt;br /&gt;즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;Labels는&lt;/span&gt; 모델의 예상 예측값&lt;/b&gt;&lt;/span&gt;이어야 한다: &lt;u&gt;표준 손실을 사용&lt;/u&gt;하여 예측값과 예상값(레이블) 간의 손실을 계산.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;이때, &lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Labels는 Model Head&lt;/span&gt;에 따라 다르다&lt;/b&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;AutoModelForSequenceClassification:&lt;/b&gt; 모델은 (batch_size)차원텐서를 기대하며, batch의 각 값은 전체 시퀀스의 예상 label에 해당.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;TokenClassification:&lt;/b&gt; 모델은 (batch_size, seq_length)차원텐서를 기대하며, 각 값은 개별 토큰의 예상 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;label에&lt;/span&gt; 해당&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;MaskedLM:&lt;/b&gt; 모델은 (batch_size, seq_length)차원텐서를 기대하며, 각 값은 개별 토큰의 예상 레이블에 해당: &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;label은&lt;/span&gt; 마스킹된 token_ids이며, 나머지는 무시할 값(보통 -100).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;AutoModelFor&lt;/span&gt;ConditionalGeneration: &lt;/b&gt;모델은 (batch_size, tgt_seq_length)차원텐서를 기대하며, 각 값은 각 입력 시퀀스와 연관된 목표 시퀀스를 나타냅니다. 훈련 중에는 BART와 T5가 적절한 디코더 입력 ID와 디코더 어텐션 마스크를 내부적으로 만들기에 보통 제공할 필요X. 이는 &lt;u&gt;Encoder-Decoder 프레임워크를 사용하는 모델에는 적용되지 않음&lt;/u&gt;. 각 모델의 문서를 참조하여 각 특정 모델의 레이블에 대한 자세한 정보를 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본 모델(BertModel 등)은 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Labels를&lt;/span&gt; 받아들이지 못하는데, 이러한 모델은 기본 트랜스포머 모델로서 단순히 특징들만 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙ Decoder input IDs&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 입력은 인코더-디코더 모델에 특화되어 있으며, 디코더에 입력될 입력 ID를 포함합니다. &lt;br /&gt;이러한 입력은 번역 또는 요약과 같은 시퀀스-투-시퀀스 작업에 사용되며, 보통 각 모델에 특정한 방식으로 구성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대부분의 인코더-디코더 모델(BART, T5)은 레이블에서 디코더 입력 ID를 자체적으로 생성합니다. &lt;br /&gt;이러한 모델에서는 레이블을 전달하는 것이 훈련을 처리하는 선호 방법입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시퀀스-투-시퀀스 훈련을 위한 이러한 입력 ID를 처리하는 방법을 확인하려면 각 모델의 문서를 참조하세요.&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙Feed Forward Chunking&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;트랜스포머의 각 잔차 어텐션 블록에서 셀프 어텐션 레이어는 보통 2개의 피드 포워드 레이어 다음에 위치합니다. &lt;br /&gt;피드 포워드 레이어의 중간 임베딩 크기는 종종 모델의 숨겨진 크기보다 큽니다(예: bert-base-uncased).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크기 [batch_size, sequence_length]의 입력에 대해 중간 피드 포워드 임베딩을 저장하는 데 필요한 메모리 [batch_size, sequence_length, config.intermediate_size]는 메모리 사용량의 큰 부분을 차지할 수 있습니다. &lt;br /&gt;&lt;br /&gt;Reformer: The Efficient Transformer의 저자들은 계산이 sequence_length 차원과 독립적이므로 두 피드 포워드 레이어의 출력 임베딩 [batch_size, config.hidden_size]_0, ..., [batch_size, config.hidden_size]_n을 개별적으로 계산하고 n = sequence_length와 함께 [batch_size, sequence_length, config.hidden_size]로 결합하는 것이 수학적으로 동일하다는 것을 발견했습니다. &lt;br /&gt;&lt;br /&gt;이는 메모리 사용량을 줄이는 대신 계산 시간을 증가시키는 거래를 하지만, 수학적으로 동일한 결과를 얻을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;apply_chunking_to_forward() 함수를 사용하는 모델의 경우, chunk_size는 병렬로 계산되는 출력 임베딩의 수를 정의하며, 메모리와 시간 복잡성 간의 거래를 정의합니다. chunk_size가 0으로 설정되면 피드 포워드 청킹은 수행되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&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;&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;&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;&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;&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;&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;&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>HuggingFace </category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/288</guid>
      <comments>https://chan4im.tistory.com/288#entry288comment</comments>
      <pubDate>Sun, 14 Jul 2024 18:39:04 +0900</pubDate>
    </item>
    <item>
      <title>QLoRA 실습 &amp;amp; Trainer vs SFTTrainer</title>
      <link>https://chan4im.tistory.com/287</link>
      <description>&lt;h2 id=&quot;[peft]-parameter-efficient-fine-tuning&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;QLoRA 실습 with MLLMs(InternVL)&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Step 1. 필요 Library import:&lt;/h4&gt;
&lt;pre id=&quot;code_1720759029079&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import os

import torch
import torch.nn as nn
import bitsandbytes as bnb
import transformers

from peft import (
    LoraConfig,
    PeftConfig,
    PeftModel, 
    get_peft_model,
)
from transformers import (
    AutoConfig,
    AutoModel,
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    set_seed,
    pipeline,
    TrainingArguments,
)​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h4 id=&quot;catastrophic-forgetting이란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Step 2. 모델 불러온 후 prepare_model_for_kbit_training(model) 진행&lt;/h4&gt;
&lt;pre id=&quot;code_1720759121389&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;devices = [0]#[0, 3]
max_memory = {i: '49140MiB' for i in devices}

model_name = 'OpenGVLab/InternVL2-8B'


model = AutoModelForCausalLM.from_pretrained(
    model_name, 
    cache_dir='/data/huggingface_models',
    trust_remote_code=True,
    device_map=&quot;auto&quot;,
    max_memory=max_memory,
    quantization_config=BitsAndBytesConfig(
            load_in_4bit=True,
            bnb_4bit_compute_dtype=torch.bfloat16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type='nf4'
        ),
)

# 모델 구조 출력
print(model)

# get_input_embeddings 메서드를 모델에 추가
def get_input_embeddings(self):
    if hasattr(self, 'embed_tokens'):
        return self.embed_tokens
    elif hasattr(self, 'language_model') and hasattr(self.language_model.model, 'tok_embeddings'):
        return self.language_model.model.tok_embeddings
    else:
        raise NotImplementedError(&quot;The model does not have an attribute 'embed_tokens' or 'language_model.model.tok_embeddings'.&quot;)

model.get_input_embeddings = get_input_embeddings.__get__(model, type(model))

# prepare_model_for_kbit_training 함수를 직접 구현
def prepare_model_for_kbit_training(model):
    for param in model.parameters():
        param.requires_grad = False  # 모든 파라미터의 기울기 계산을 비활성화

    if hasattr(model, 'model') and hasattr(model.model, 'tok_embeddings'):
        for param in model.model.tok_embeddings.parameters():
            param.requires_grad = True  # 임베딩 레이어만 기울기 계산 활성화
    elif hasattr(model, 'embed_tokens'):
        for param in model.embed_tokens.parameters():
            param.requires_grad = True  # 임베딩 레이어만 기울기 계산 활성화
    
    # 필요한 경우 다른 특정 레이어들도 기울기 계산을 활성화할 수 있음
    # 예시: 
    # if hasattr(model, 'some_other_layer'):
    #     for param in model.some_other_layer.parameters():
    #         param.requires_grad = True

    return model

model = prepare_model_for_kbit_training(model)​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h4 id=&quot;peft란?&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Step 3. QLoRA를 붙일 layer 선택:&lt;/h4&gt;
&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1720759193619&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def find_all_linear_names(model, train_mode):
    assert train_mode in ['lora', 'qlora']
    cls = bnb.nn.Linear4bit if train_mode == 'qlora' else nn.Linear
    lora_module_names = set()
    for name, module in model.named_modules():
        if isinstance(module, cls):
            names = name.split('.')
            lora_module_names.add(names[0] if len(names) == 1 else names[-1])

    if 'lm_head' in lora_module_names:  # LLM의 Head부분에 속하는 애들 pass
        lora_module_names.remove('lm_head')
    
    return list(lora_module_names)


print(sorted(config.target_modules)) # ['1','output', 'w1', 'w2', 'w3', 'wo', 'wqkv']
config.target_modules.remove('1') # LLM의 Head부분에 속하는 애들 제거


config = LoraConfig(
    r=16,
    lora_alpha=16,
    target_modules=find_all_linear_names(model, 'qlora'),
    lora_dropout=0.05,
    bias=&quot;none&quot;,
    task_type=&quot;QUESTION_ANS&quot; #CAUSAL_LM, FEATURE_EXTRACTION, QUESTION_ANS, SEQ_2_SEQ_LM, SEQ_CLS, TOKEN_CLS.
)

model = get_peft_model(model, config)&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;이후 trainer로 train진행.&lt;br /&gt;&lt;br /&gt;
&lt;h4 id=&quot;main-concept&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;QLoRA 붙인 결과:&lt;/h4&gt;
&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;2690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ZlJA/btsIwWnepgh/oEKFELFX4g2Sl7lyI4qaGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ZlJA/btsIwWnepgh/oEKFELFX4g2Sl7lyI4qaGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ZlJA/btsIwWnepgh/oEKFELFX4g2Sl7lyI4qaGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ZlJA%2FbtsIwWnepgh%2FoEKFELFX4g2Sl7lyI4qaGK%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;986&quot; height=&quot;2690&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;2690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;[q-lora]-quantized-lora&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;trainer 종류? Trainer vs SFTTrainer&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Trainer&amp;nbsp; v.s. SFTTrainer&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙ &lt;/b&gt;Trainer&amp;nbsp; v.s. SFTTrainer&lt;/h4&gt;
&lt;b&gt;&amp;nbsp;- 일반 목적의 훈련:&lt;/b&gt; 텍스트 분류, 질의응답, 요약 등의 지도 학습 작업에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;모델을 처음부터 훈련시키는 데 사용&lt;/u&gt;&lt;/span&gt;됩니다. &lt;br /&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;높은 커스터마이징 가능성:&lt;/b&gt; hyperparameter, optimizer, scheduler, logging, metric 등을 미세 조정할 수 있는 다양한 구성 옵션을 제공합니다. &lt;br /&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;복잡한 훈련 워크플로우 처리:&lt;/b&gt; 그래디언트 축적, 조기 종료, 체크포인트 저장, 분산 훈련 등의 기능을 지원합니다. &lt;br /&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;더 많은 데이터 요구:&lt;/b&gt; 효과적인 훈련을 위해 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;일반적으로 더 큰 데이터셋이 필요&lt;/u&gt;&lt;/span&gt;합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt; SFTTrainer&lt;/h4&gt;
&lt;b&gt;&amp;nbsp;-&amp;nbsp;지도 학습 미세 조정 (SFT):&lt;/b&gt; &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;작은 데이터셋&lt;/u&gt;&lt;/span&gt;으로  &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;&lt;b&gt;PLMs Fine-Tuning에 최적화&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;. &lt;br /&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;간단한 인터페이스:&lt;/b&gt; 더 적은 configuration으로 간소화된 workflow를 제공. &lt;br /&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;효율적인 메모리 사용:&lt;/b&gt; PEFT와 패킹 최적화와 같은 기술을 사용하여 훈련 중 메모리 소비를 줄입니다. &lt;br /&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;빠른 훈련:&lt;/b&gt; 작은 데이터셋과 짧은 훈련 시간으로도 유사하거나 더 나은 정확도를 달성합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;∙ &lt;/b&gt;Trainer와 SFTTrainer 선택 기준:&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;Trainer 사용:&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;u&gt;큰 데이터셋&lt;/u&gt;이 있고, 훈련 루프 또는 복잡한 훈련 워크플로우에 대한 &lt;u&gt;광범위한 커스터마이징&lt;/u&gt;이 필요한 경우.&lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;Data preprocessing, Datacollator는 사용자가 직접 설정&lt;/u&gt;&lt;/span&gt;해야 하며, 일반적인 데이터 전처리 방법을 사용&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;-&amp;nbsp;SFTTrainer 사용:&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;PLMS와 상대적으로 작은 데이터셋을 가지고 있으며, 효율적인 메모리 사용과 함께 더 간단하고 빠른 미세 조정 경험을 원할 경우. &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;u&gt;PEFT를 기본적으로 지원&lt;/u&gt;&lt;/span&gt;, &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;u&gt;`peft_config`와 같은 설정을 통해 효율적인 파인 튜닝을 쉽게 설정&lt;/u&gt;&lt;/span&gt;할 수 있다.&lt;br /&gt;Data preprocessing, Datacollator도 효율적인 FT를 위해 최적화되어 있음.&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;u&gt;`dataset_text_field`와 같은 필드를 통해 텍스트 데이터를 쉽게 처리할 수 있음&lt;/u&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 182px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;Feature&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Trainer&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;SFTTrainer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Gerneral Purpose training&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Supervised Fine-Tuning of PLMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;커스텀 용도&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Highly Customizable&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Simpler interface with fewer options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;Training workflow&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Handles complex workflows&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Streamlined workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;필요 Data&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Large Datsets&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Smaller Datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;Memory 사용량&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Higher&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Lower with PEFT &amp;amp; packing optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;width: 22.5513%; text-align: center; height: 26px;&quot;&gt;Training speed&lt;/td&gt;
&lt;td style=&quot;width: 36.7693%; text-align: center; height: 26px;&quot;&gt;Slower&lt;/td&gt;
&lt;td style=&quot;width: 40.6793%; text-align: center; height: 26px;&quot;&gt;Faster with smaller datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;</description>
      <category>HuggingFace </category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/287</guid>
      <comments>https://chan4im.tistory.com/287#entry287comment</comments>
      <pubDate>Fri, 12 Jul 2024 14:43:33 +0900</pubDate>
    </item>
    <item>
      <title>[QLoRA] &amp;amp; [PEFT] &amp;amp; deepspeed, DDP</title>
      <link>https://chan4im.tistory.com/286</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[PEFT]: Parameter Efficient Fine-Tuning&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPnEWt/btsItQ7vgfz/4W55oLy32v3JyOESpbxITK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPnEWt/btsItQ7vgfz/4W55oLy32v3JyOESpbxITK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPnEWt/btsItQ7vgfz/4W55oLy32v3JyOESpbxITK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPnEWt%2FbtsItQ7vgfz%2F4W55oLy32v3JyOESpbxITK%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;673&quot; height=&quot;306&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;PEFT란?&lt;/h4&gt;
PLMs를 specific task에 적용할 때, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;u&gt;대부분의 Parameter를 freeze❄️&lt;/u&gt;&lt;/span&gt;, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;u&gt;소수의 parameter만 FT&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;하는 기법.&lt;br /&gt;PEFT는 모델 성능을 유지 + #parameter&amp;darr;가 가능함.&lt;br /&gt;또한, &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;catastrophic forgetting문제 위험도 또한 낮음&lt;/u&gt;&lt;/span&gt;.&lt;br /&gt; Huggingface에서 소개한 혁신적 방법으로 downstream task에서 FT를 위해 사용됨.&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Catastrophic Forgetting이란?&lt;/h4&gt;
새로운 정보를 학습하게 될때, &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;기존에 학습한 일부의 지식에 대해서는 망각&lt;/u&gt;&lt;/span&gt;을 하게 되는 현상&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Main Concept&lt;/h4&gt;
&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;c1d5&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;Reduced Parameter Fine-tuning(축소된 파라미터 파인튜닝)&lt;/b&gt;&lt;br /&gt;사전 학습된 LLM 모델에서 대다수의 파라미터를 고정해 소수의 추가적인 파라미터만 파인튜닝하는 것이 중점&lt;br /&gt;선택적 파인튜닝으로 계산적 요구가 급격하게 감소하는 효과&lt;/li&gt;
&lt;li id=&quot;44c9&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;Overcoming Catastrophic Forgetting(치명적 망각 문제 극복)&lt;br /&gt;&lt;/b&gt;Catastrophic Forgetting 문제는 LLM 모델 전체를 파인 튜닝하는 과정에서 발생하는 현상인데, PEFT를 활용하여 치명적 망각 문제를 완화할 수 있음&lt;br /&gt;PEFT를 활용하면 사전 훈련된 상태의 지식을 보존하며 새로운 downstream task에 대해 학습할 수 있음&lt;/li&gt;
&lt;li id=&quot;5680&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;Application Across Modalities(여러 모달리티 적용 가능)&lt;/b&gt;&lt;br /&gt;PEFT는 기존 자연어처리(Natural Language Process: NLP) 영역을 넘어서 다양한 영역으로 확장 가능함&lt;br /&gt;스테이블 디퓨전(stable diffusion) 혹은 Layout LM 등의 포함된 컴퓨터 비전(Computer Vision: CV) 영역, &lt;br /&gt;Whisper나 XLS-R이 포함된 오디오 등의 다양한 마달리티에 성공적으로 적용됨&lt;/li&gt;
&lt;li id=&quot;62e6&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;Supported PEFT Methods(사용 가능한 PEFT)&lt;/b&gt;&lt;br /&gt;라이브러리에서 다양한 PEFT 방법을 지원함&lt;br /&gt;LoRA(Low-Rank Adaption), Prefix Tuning, 프롬프트 튜닝 등 각각의 방법은 특정한 미세 조정 요구 사항과 시나리오에 맞게 사용할 수 있도록 설계됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pkwQs/btsItQGrcHq/7KMPWnqfZYbeOLzB2WKDFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pkwQs/btsItQGrcHq/7KMPWnqfZYbeOLzB2WKDFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pkwQs/btsItQGrcHq/7KMPWnqfZYbeOLzB2WKDFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpkwQs%2FbtsItQGrcHq%2F7KMPWnqfZYbeOLzB2WKDFK%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;671&quot; height=&quot;394&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;394&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;lora-animated.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6jpa/btsIs2HW1qc/h7P37LOKNoNIkvYBg5T2p1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6jpa/btsIs2HW1qc/h7P37LOKNoNIkvYBg5T2p1/img.gif&quot; data-alt=&quot;The output activations original (frozen) pretrained weights (left) are augmented by a low rank adapter comprised of weight matrics A and B (right).&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6jpa/btsIs2HW1qc/h7P37LOKNoNIkvYBg5T2p1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/l6jpa/btsIs2HW1qc/h7P37LOKNoNIkvYBg5T2p1/img.gif&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;600&quot; height=&quot;439&quot; data-filename=&quot;lora-animated.gif&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;The output activations original (frozen) pretrained weights (left) are augmented by a low rank adapter comprised of weight matrics A and B (right).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사전학습가중치(❄️)의 output activation은&amp;nbsp;weight matrix인 A, B로 구성된 LoRA에 의해 증가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Q-LoRA]: Quantized-LoRA&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Q-LoRA란?&lt;/h4&gt;
2023년 5월 NeurIPS에서 양자화와 LoRA를 합쳐 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;&quot;A6000 단일 GPU로 65B모델 튜닝이 가능&quot;&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;한 방법론을 발표함.&lt;br /&gt;QLoRA는 결국 기존의 LoRA에 새로운 quantization을 더한 형태이다.&lt;br /&gt;베이스 모델인 PLM의 가중치를 얼리고(frozen), LoRA 어댑터의 가중치만 학습 가능하게(trainable)하는 것은 LoRA와 동일하며, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;frozen PLM의 가중치가 '4비트로 양자화'되었다는 정도가 다른 점&lt;/u&gt;&lt;/span&gt;이다. &lt;br /&gt;때문에, QLoRA에서 주요히 새로 소개되는 기술&lt;b&gt;&lt;u&gt;(Main Contribution)은 양자화 방법론&lt;/u&gt;&lt;/b&gt;이 주가 된다는 사실이다.&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;양자화란?&lt;/h4&gt;
&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;weight와 activation output을 더 작은 bit단위로 표현하도록 변환&lt;/u&gt;&lt;/span&gt;하는 것.&lt;br /&gt;즉, data정보를 약간줄이고, 정밀도는 낮추지만&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&quot;저장 및 연산에 필요한 연산을 감소시켜 효율성을 확보&quot;&lt;/u&gt;&lt;/span&gt;하는 경량화 방법론이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;How to Use in MLLMs...?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;그렇다면 어떻게 MLLMs에 적용할 수 있을까? MLLMs는 매우 종류가 많지만, 가장 쉬운 예제로 VLMs를 들어보자면, &lt;br /&gt;Q-LoRA 및 LoRA는 PEFT방법론이기에 이는 LLMs, MLLMs모두 통용되는 방법이다.&lt;br /&gt;그렇기에 VLMs(Vision Encoder + LLM Decoder)를 기준으로 설명해보자면:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;c1d5&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;언어적 능력을 강화&lt;/b&gt;시키고 싶다면, &lt;b&gt;LLM만&lt;/b&gt; PEFT를 진행.&lt;/li&gt;
&lt;li id=&quot;44c9&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;시각적 능력을 강화&lt;/b&gt;시키고 싶다면, &lt;b&gt;Vision Encoder만&lt;/b&gt; PEFT를 진행.&lt;/li&gt;
&lt;li id=&quot;5680&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;두 능력 모두 강화&lt;/b&gt;시키고 싶다면, &lt;b&gt;Encoder, Decoder 모두&lt;/b&gt; PEFT를 진행하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Reference Code:&lt;/h4&gt;
&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1720506090595&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;A Definitive Guide to QLoRA: Fine-tuning Falcon-7b with PEFT&quot; data-og-description=&quot;Unveiling the Power of QLoRA: Comprehensive Explanation and Practical Coding with   PEFT&quot; data-og-host=&quot;medium.com&quot; data-og-source-url=&quot;https://medium.com/@amodwrites/a-definitive-guide-to-qlora-fine-tuning-falcon-7b-with-peft-78f500a1f337&quot; data-og-url=&quot;https://medium.com/@amodwrites/a-definitive-guide-to-qlora-fine-tuning-falcon-7b-with-peft-78f500a1f337&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mNCcI/hyWzuI5Wa9/kAvuRsxluCaK4zxQTuFgu1/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/bfpMQA/hyWzpA1mPk/W1bQxmhj7MHswbM3sZa2y0/img.jpg?width=1358&amp;amp;height=903&amp;amp;face=0_0_1358_903&quot;&gt;&lt;a href=&quot;https://medium.com/@amodwrites/a-definitive-guide-to-qlora-fine-tuning-falcon-7b-with-peft-78f500a1f337&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://medium.com/@amodwrites/a-definitive-guide-to-qlora-fine-tuning-falcon-7b-with-peft-78f500a1f337&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mNCcI/hyWzuI5Wa9/kAvuRsxluCaK4zxQTuFgu1/img.jpg?width=1200&amp;amp;height=800&amp;amp;face=0_0_1200_800,https://scrap.kakaocdn.net/dn/bfpMQA/hyWzpA1mPk/W1bQxmhj7MHswbM3sZa2y0/img.jpg?width=1358&amp;amp;height=903&amp;amp;face=0_0_1358_903');&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;A Definitive Guide to QLoRA: Fine-tuning Falcon-7b with PEFT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Unveiling the Power of QLoRA: Comprehensive Explanation and Practical Coding with   PEFT&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;medium.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1720506066015&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;Finetuning Llama2 with QLoRA &amp;mdash; TorchTune  documentation&quot; data-og-description=&quot;Finetuning Llama2 with QLoRA In this tutorial, we&amp;rsquo;ll learn about QLoRA, an enhancement on top of LoRA that maintains frozen model parameters in 4-bit quantized precision, thereby reducing memory usage. We&amp;rsquo;ll walk through how QLoRA can be utilized withi&quot; data-og-host=&quot;pytorch.org&quot; data-og-source-url=&quot;https://pytorch.org/torchtune/stable/tutorials/qlora_finetune.html&quot; data-og-url=&quot;https://pytorch.org/torchtune/stable/tutorials/qlora_finetune.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cb03bj/hyWzrZUgEb/75e2dGSy4sEc9Zy4FIsoI0/img.png?width=1099&amp;amp;height=635&amp;amp;face=0_0_1099_635&quot;&gt;&lt;a href=&quot;https://pytorch.org/torchtune/stable/tutorials/qlora_finetune.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pytorch.org/torchtune/stable/tutorials/qlora_finetune.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cb03bj/hyWzrZUgEb/75e2dGSy4sEc9Zy4FIsoI0/img.png?width=1099&amp;amp;height=635&amp;amp;face=0_0_1099_635');&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;Finetuning Llama2 with QLoRA &amp;mdash; TorchTune documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Finetuning Llama2 with QLoRA In this tutorial, we&amp;rsquo;ll learn about QLoRA, an enhancement on top of LoRA that maintains frozen model parameters in 4-bit quantized precision, thereby reducing memory usage. We&amp;rsquo;ll walk through how QLoRA can be utilized withi&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 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;a href=&quot;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1720519222299&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Transformers-Tutorials/qlora_baseline.ipynb at master &amp;middot; V2LLAIN/Transformers-Tutorials&quot; data-og-description=&quot;This repository contains demos I made with the Transformers library by HuggingFace. - V2LLAIN/Transformers-Tutorials&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&quot; data-og-url=&quot;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kHTUC/hyWzyksxvY/jfYV7K97UkD4VoN3QsKQf0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/V2LLAIN/Transformers-Tutorials/blob/master/qlora_baseline.ipynb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kHTUC/hyWzyksxvY/jfYV7K97UkD4VoN3QsKQf0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Transformers-Tutorials/qlora_baseline.ipynb at master &amp;middot; V2LLAIN/Transformers-Tutorials&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This repository contains demos I made with the Transformers library by HuggingFace. - V2LLAIN/Transformers-Tutorials&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Deepspeed란?&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;pre id=&quot;code_1720578812938&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# finetune_qlora.sh

deepspeed ovis/train/train.py \
        --deepspeed scripts/zero2.json \
        ...​&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;물론 나만의 방법을 고수하는것도 좋지만, 대부분의 user들이 이 방법을 사용하는걸 봐서는 일단 알아놓는게 좋을 것 같기에 알아보고자한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;deepspeed...?&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;모델의 training, inference속도를 빠르고 효율적으로 처리하게 도와주는 Microsoft사의 딥러닝 최적화 라이브러리이다.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;학습 device 종류:&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU&lt;br /&gt;Single&amp;nbsp;GPU&lt;br /&gt;1&amp;nbsp;Node,&amp;nbsp;Multi&amp;nbsp;GPU&lt;br /&gt;Multi Node, Multi GPU --&amp;gt; 매우 큰 GPT4 등의 학습을 위해 사용됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;b&gt;분산학습 방식:&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Data Parallel:&lt;/b&gt;&lt;/span&gt; 하나의 device가 data를 나누고, 각 device에서 처리결과를 모아 계산&lt;br /&gt;--&amp;gt; 하나의 device가 다른 device에 비해 메모리 사용량이 많아지는, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;메모리 불균형 문제&lt;/b&gt;&lt;/span&gt;가 발생한다!&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C1dT0/btsIsAL4OUG/dP74IbM38TuMKDg4vzPHT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C1dT0/btsIsAL4OUG/dP74IbM38TuMKDg4vzPHT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C1dT0/btsIsAL4OUG/dP74IbM38TuMKDg4vzPHT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC1dT0%2FbtsIsAL4OUG%2FdP74IbM38TuMKDg4vzPHT0%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;562&quot; height=&quot;880&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Distributed Data Parallel:&lt;/b&gt;&lt;/span&gt; 각각의 device를 하나의 Process로 보고, 각 process에서 모델을 띄워서 사용.&lt;br /&gt;&lt;/span&gt;이때, 역전파에서만 내부적으로 gradient를 동기화 --&amp;gt; 메모리 불균형문제❌&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3424&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvqlyw/btsIsCwlQl8/gcnYFlEphY3MVXbWbN2e4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvqlyw/btsIsCwlQl8/gcnYFlEphY3MVXbWbN2e4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvqlyw/btsIsCwlQl8/gcnYFlEphY3MVXbWbN2e4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdvqlyw%2FbtsIsCwlQl8%2FgcnYFlEphY3MVXbWbN2e4K%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;3424&quot; height=&quot;1050&quot; data-origin-width=&quot;3424&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;cf) Requirements:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720578970747&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- PyTorch must be installed before installing DeepSpeed.
- For full feature support we recommend a version of PyTorch that is &amp;gt;= 1.9 and ideally the latest PyTorch stable release.
- A CUDA or ROCm compiler such as nvcc or hipcc used to compile C++/CUDA/HIP extensions.
- Specific GPUs we develop and test against are listed below, this doesn't mean your GPU will not work if it doesn't fall into this category it's just DeepSpeed is most well tested on the following:
        NVIDIA: Pascal, Volta, Ampere, and Hopper architectures
        AMD: MI100 and MI200&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720578996367&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install deepspeed&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;로 설치가 가능하며, 사용방법은 아래와 같다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용방법: &lt;br /&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;i&gt;Step1)&lt;/i&gt;&lt;/span&gt;&lt;/b&gt; deepspeed사용을 위한 Config.json파일 작성&lt;/h4&gt;
&lt;pre id=&quot;code_1720579161754&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;train_micro_batch_size_per_gpu&quot;: 160,
    &quot;gradient_accumulation_steps&quot;: 1,
    &quot;optimizer&quot;:
    {
    	&quot;type&quot;: &quot;Adam&quot;,
        &quot;params&quot;:
        {
        	&quot;lr&quot;: 0.001
        }
    },
    &quot;zero_optimization&quot;:
    {
        &quot;stage&quot;: 1,
        &quot;offload_optimizer&quot;:
        {
            &quot;device&quot;: &quot;cpu&quot;,
            &quot;pin_memory&quot;:true
        },
        &quot;overlap_comm&quot;: false,
        &quot;contiguous_gradients&quot;: false
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;config Args:&lt;a href=&quot;https://www.deepspeed.ai/docs/config-json/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.deepspeed.ai/docs/config-json/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;i&gt;Step2)&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;import &amp;amp; read json&lt;/h4&gt;
&lt;pre id=&quot;code_1720579363266&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import deepspeed
from deepspeed.ops.adam import DeepSpeedCPUAdam

with open('config.json', 'r') as f:
	deepspeed_config = json.load(f)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;b&gt;&lt;i&gt;Step3)&lt;/i&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;optimizer 설정 &amp;amp; model,optimizer 초기화&lt;/h4&gt;
&lt;pre id=&quot;code_1720579502850&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;optimizer = DeepSpeedCPUAdam(model.parameters(), lr=lr)

model, optimizer, _, _ = deepspeed.initialize(model=model,
                                            model_parameters=model.parameters(),
                                            optimizer=optimizer,
                                            config_params=deepspeed_config)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;cf) ArgumentParser에 추가하는것도 가능함!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720581339556&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', type=int, default=-1)

parser = deepspeed.add_config_arguments(parser)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #a6bc00;&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;&lt;i&gt;Step4)&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;Train!&lt;/h4&gt;
&lt;pre id=&quot;code_1720579616106&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# &amp;gt;&amp;gt; train.py
deepspeed --num_gpus={gpu 개수} train_deepspeed.py&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1720579619539&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;# train.sh
deepspeed --num_gpus={gpu 개수} train_deepspeed.py

# &amp;gt;&amp;gt; bash train.sh&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #666666;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;주의 !)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;DeepSpeed는 &lt;/span&gt;CUDA_VISIBLE_DEVICES&lt;span style=&quot;text-align: start;&quot;&gt;로 특정 GPU를 제어할 수 없다!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아래와 같이&amp;nbsp;&lt;/span&gt;--include&lt;span style=&quot;text-align: start;&quot;&gt;로만 특정 GPU를 사용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720581523224&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deepspeed &amp;mdash;inlcude localhost:&amp;lt;GPU_NUM1&amp;gt;, &amp;lt;GPU_NUM2&amp;gt; &amp;lt;python_file.py&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #121212; color: #ececec; text-align: start;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li id=&quot;c1d5&quot; style=&quot;list-style-type: disc; color: #242424;&quot; data-selectable-paragraph=&quot;&quot;&gt;&lt;b&gt;gpu node의 개수가 많아질수록 deepspeed의 장점인 학습 속도가 빨라진다!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;figure id=&quot;og_1720579309697&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;DeepSpeed Configuration JSON&quot; data-og-description=&quot;DeepSpeed is a deep learning optimization library that makes distributed training easy, efficient, and effective.&quot; data-og-host=&quot;www.deepspeed.ai&quot; data-og-source-url=&quot;https://www.deepspeed.ai/docs/config-json/&quot; data-og-url=&quot;https://www.deepspeed.ai/docs/config-json/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.deepspeed.ai/docs/config-json/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.deepspeed.ai/docs/config-json/&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;DeepSpeed Configuration JSON&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DeepSpeed is a deep learning optimization library that makes distributed training easy, efficient, and effective.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.deepspeed.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;&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;&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;&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;&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>HuggingFace </category>
      <category>lora</category>
      <category>low rank adaptation</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/286</guid>
      <comments>https://chan4im.tistory.com/286#entry286comment</comments>
      <pubDate>Tue, 9 Jul 2024 18:58:49 +0900</pubDate>
    </item>
    <item>
      <title>[Gain Study_RL]: Reinforcement Learning(1)</title>
      <link>https://chan4im.tistory.com/285</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj; 강화학습[Reinforcement Learning]&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAr7fN/btsHmAziY1l/MAM2WQ6gYdMhv6o97Ibkh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAr7fN/btsHmAziY1l/MAM2WQ6gYdMhv6o97Ibkh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAr7fN/btsHmAziY1l/MAM2WQ6gYdMhv6o97Ibkh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAr7fN%2FbtsHmAziY1l%2FMAM2WQ6gYdMhv6o97Ibkh1%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;682&quot; height=&quot;361&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  강화학습이란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Agent가 &lt;span style=&quot;color: #009a87;&quot;&gt;환경&lt;/span&gt;에서 &lt;span style=&quot;color: #f89009;&quot;&gt;누적보상 &lt;/span&gt;을 최대화하는&amp;nbsp;&lt;span style=&quot;color: #ef5369;&quot;&gt;Action&lt;/span&gt;을 취하는 &quot;&lt;b&gt;순차적 의사결정&lt;/b&gt;&quot;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;∙ Sequential Decision Process&lt;/b&gt;: 몇단계를 가봐야 reward를 얻음 = cumulated rewards&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk4QVe/btsHl5zqG2k/K24dd2yddhZbOij1WsCbTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk4QVe/btsHl5zqG2k/K24dd2yddhZbOij1WsCbTK/img.png&quot; data-alt=&quot;state &amp;amp;rarr; action &amp;amp;amp; reward&amp;amp;nbsp; &amp;amp;rarr; &amp;amp;nbsp;state&amp;amp;nbsp; &amp;amp;rarr; &amp;amp;nbsp;...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk4QVe/btsHl5zqG2k/K24dd2yddhZbOij1WsCbTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk4QVe%2FbtsHl5zqG2k%2FK24dd2yddhZbOij1WsCbTK%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;675&quot; height=&quot;268&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;state &amp;rarr; action &amp;amp; reward&amp;nbsp; &amp;rarr; &amp;nbsp;state&amp;nbsp; &amp;rarr; &amp;nbsp;...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Exploitation &amp;amp; Exploration&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;Exploitation: 경험기반 최선행동 (short term benefit)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Exploration: 안알려진행동을 시도, 새로운정보를 획득 (long term benefit)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ex) Exploitation: 늘 가던 단골식당에 간다. / Exploration: 안 가본 식당에 가본다&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Reward Hypothesis: 강화학습이론의 기반.&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Agent가 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;어떤 Action을 취했을 때&lt;/u&gt;&lt;/span&gt;, 해당 Action이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;얼마나 좋은 Action인지&lt;/u&gt;&lt;/span&gt; 알려주는 &quot;feedback signal&quot;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13bE7/btsHmR8C7it/cAlGKm4Z2QQsHJgA6edJPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13bE7/btsHmR8C7it/cAlGKm4Z2QQsHJgA6edJPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13bE7/btsHmR8C7it/cAlGKm4Z2QQsHJgA6edJPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13bE7%2FbtsHmR8C7it%2FcAlGKm4Z2QQsHJgA6edJPK%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;615&quot; height=&quot;75&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;적절한 보상함수로 &quot;Agent는 누적보상 기댓값 최대화(Cumulated Rewards Maximization)&quot;의 목표를 달성한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  RL의 궁극적인 목표는?&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Model&lt;/b&gt;: Markov Decision Process&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;궁극적인 목표&lt;/b&gt;: 해당 목표(= max cum_Reward)를 위한 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;Optimal Policy를 찾는 것&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;이 목표임.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cf) 강화학습의 supervision은 사람이 reward를 주는것.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmp7fN/btsHnKUY3cL/w0L2IX3XZjyYc7Es87Nor1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmp7fN/btsHnKUY3cL/w0L2IX3XZjyYc7Es87Nor1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmp7fN/btsHnKUY3cL/w0L2IX3XZjyYc7Es87Nor1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmp7fN%2FbtsHnKUY3cL%2Fw0L2IX3XZjyYc7Es87Nor1%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;1542&quot; height=&quot;670&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Markov Property&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  MDP (Markov Decision Process)&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Markov&amp;nbsp;Property:&amp;nbsp;&lt;/b&gt;현재&amp;nbsp;state만으로&amp;nbsp;미래를&amp;nbsp;예측&amp;nbsp;(&lt;span style=&quot;color: #ee2323;&quot;&gt;과거&amp;nbsp;state에&amp;nbsp;영향X&lt;/span&gt;)&amp;nbsp; &lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ex) 오늘의 날씨 -&amp;gt; 내일의 날씨&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HPN2C/btsHmCYcQQf/8MzLEltNkah2WG8eHfKBXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HPN2C/btsHmCYcQQf/8MzLEltNkah2WG8eHfKBXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HPN2C/btsHmCYcQQf/8MzLEltNkah2WG8eHfKBXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHPN2C%2FbtsHmCYcQQf%2F8MzLEltNkah2WG8eHfKBXk%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;418&quot; height=&quot;98&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;b&gt;RL&lt;/b&gt;은 Markov Property를 전제로 하는데, 특히 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;Discrete time를 따를 때 &quot;Markov Chain&quot;을 전제&lt;/u&gt;&lt;/span&gt;로 함!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;즉, markov process는 markov property를 따르는 discrete time을 전제로 하며, 이런 markov process를 markov chain이라함.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ5wzs/btsHntzbr9g/evROXUcc3CKsp9C6kkp5g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ5wzs/btsHntzbr9g/evROXUcc3CKsp9C6kkp5g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ5wzs/btsHntzbr9g/evROXUcc3CKsp9C6kkp5g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ5wzs%2FbtsHntzbr9g%2FevROXUcc3CKsp9C6kkp5g1%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;436&quot; height=&quot;117&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;cf) Discrete time: 시간이 이산적으로 변함&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cf)&amp;nbsp;Stochastic&amp;nbsp;time:&amp;nbsp;시간에&amp;nbsp;따라&amp;nbsp;어떤&amp;nbsp;사건이&amp;nbsp;발생할&amp;nbsp;확률이&amp;nbsp;변화하는&amp;nbsp;과정.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;MDP&lt;/b&gt;(Markov&amp;nbsp;Decision&amp;nbsp;Process)는&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;lt;S,A,P,R,&amp;gamma;&amp;gt;&lt;/b&gt;&lt;/span&gt;라는&amp;nbsp;Tuple&lt;u&gt;로&amp;nbsp;정의&lt;/u&gt;됨.&lt;/span&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b51is1/btsHobSebw1/u0Ji5Ls68yaLZvxmha7qh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b51is1/btsHobSebw1/u0Ji5Ls68yaLZvxmha7qh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b51is1/btsHobSebw1/u0Ji5Ls68yaLZvxmha7qh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb51is1%2FbtsHobSebw1%2Fu0Ji5Ls68yaLZvxmha7qh0%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;2216&quot; height=&quot;612&quot; data-origin-width=&quot;2216&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDZy2r/btsHlt1P9qX/DqHkfTB9fZX9kHDdpIkjV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDZy2r/btsHlt1P9qX/DqHkfTB9fZX9kHDdpIkjV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDZy2r/btsHlt1P9qX/DqHkfTB9fZX9kHDdpIkjV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDZy2r%2FbtsHlt1P9qX%2FDqHkfTB9fZX9kHDdpIkjV0%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;675&quot; height=&quot;295&quot; data-origin-width=&quot;2830&quot; data-origin-height=&quot;1236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Episode와 Return&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Episode&lt;/b&gt;: Start State ~ Terminal State&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzbPF/btsHn55F2Ne/EtVDP7mU7oI7A0tnPVSiCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzbPF/btsHn55F2Ne/EtVDP7mU7oI7A0tnPVSiCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzbPF/btsHn55F2Ne/EtVDP7mU7oI7A0tnPVSiCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzbPF%2FbtsHn55F2Ne%2FEtVDP7mU7oI7A0tnPVSiCk%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;329&quot; height=&quot;73&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Return&lt;/b&gt;: &lt;span style=&quot;color: #ee2323;&quot;&gt;Episode 종료시 받는 모든 Reward&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;there4;&amp;nbsp;Maximize Return = Agent의 Goal&lt;br /&gt;&amp;there4; Maximize Cumulated Reward Optimal Policy = RL의 Goal&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Continuing Task의 Return...?&lt;/span&gt;&lt;/h4&gt;
&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmyFqo/btsHngNCg05/kYTn5tUKDN1Izdhs6MpEk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmyFqo/btsHngNCg05/kYTn5tUKDN1Izdhs6MpEk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmyFqo/btsHngNCg05/kYTn5tUKDN1Izdhs6MpEk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmyFqo%2FbtsHngNCg05%2FkYTn5tUKDN1Izdhs6MpEk1%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;266&quot; height=&quot;78&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;무한급수&lt;/b&gt;와 &lt;b&gt;Discounting Factor(&lt;i&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;gamma;&lt;/span&gt;&lt;/i&gt;)&lt;/b&gt;를 이용.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;--&amp;gt;&amp;nbsp;&amp;gamma;=0:&amp;nbsp;단기보상관심&amp;nbsp;Agent&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;--&amp;gt;&amp;nbsp;&amp;gamma;=1:&amp;nbsp;장기보상관심&amp;nbsp;Agent&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DpP8C/btsHmQBPFjc/xvdncrBIsAv9KO4hfKXYEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DpP8C/btsHmQBPFjc/xvdncrBIsAv9KO4hfKXYEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DpP8C/btsHmQBPFjc/xvdncrBIsAv9KO4hfKXYEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpP8C%2FbtsHmQBPFjc%2FxvdncrBIsAv9KO4hfKXYEK%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;1792&quot; height=&quot;372&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Discounted Return  &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;현재 받은 reward와 미래에 받을 reward에 차이를 두기 위해 &lt;span style=&quot;color: #ee2323;&quot;&gt;discount factor &lt;/span&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;gamma;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&amp;isin;[0,1]&lt;/span&gt;를 고려한 이득(Return)&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGsEBX/btsHmC4XLdv/Dga0KcLhDaA0aH5O9VXdLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGsEBX/btsHmC4XLdv/Dga0KcLhDaA0aH5O9VXdLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGsEBX/btsHmC4XLdv/Dga0KcLhDaA0aH5O9VXdLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGsEBX%2FbtsHmC4XLdv%2FDga0KcLhDaA0aH5O9VXdLk%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;598&quot; height=&quot;168&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;  Policy와 Value&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Policy &amp;amp; Value Function&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Policy&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;어떤&amp;nbsp;state에서&amp;nbsp;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;u&gt;어떤&amp;nbsp;action을&amp;nbsp;취할지&lt;/u&gt;&lt;/span&gt;&amp;nbsp;결정하는&amp;nbsp;함수&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Value&amp;nbsp;Function&lt;/b&gt;&lt;/span&gt;: Return을 기준, &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;u&gt;각 state나 action이 얼마나 &quot;좋은지&quot;&lt;/u&gt;&lt;/span&gt; 알려주는 함수 (즉, reward &amp;rarr; return &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;&amp;rarr;&lt;/span&gt; value)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Deterministic&amp;nbsp;Policy&lt;/b&gt;&lt;/span&gt;: one state - one action (학습이 끝났을때 도달하는 상태.)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Stochastic&amp;nbsp;Policy&lt;/b&gt;&lt;/span&gt;: one state &amp;rarr; &lt;span style=&quot;color: #009a87;&quot;&gt;어떤 action?&lt;/span&gt; 취할지 &lt;span style=&quot;color: #009a87;&quot;&gt;확률을 이용&lt;/span&gt;. (학습에 적절.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;State-Value&amp;nbsp;Function&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;정책이&amp;nbsp;주어질때,&amp;nbsp;임의의&amp;nbsp;s에서&amp;nbsp;시작,&amp;nbsp;끝날때까지&amp;nbsp;받은&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;return&amp;nbsp;G의&amp;nbsp;기댓값&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Action-Value&amp;nbsp;Function&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;state에서&amp;nbsp;어떤&amp;nbsp;action이&amp;nbsp;제일&amp;nbsp;좋은가를&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;action에&amp;nbsp;대한&amp;nbsp;value를&amp;nbsp;구하는&amp;nbsp;것&lt;/span&gt;으로&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Q-Value&lt;/b&gt;&lt;/span&gt;라고도&amp;nbsp;함.&lt;/span&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxWmi/btsHnsUAPI1/R2E1Bz65q92zeGjkXLonrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxWmi/btsHnsUAPI1/R2E1Bz65q92zeGjkXLonrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxWmi/btsHnsUAPI1/R2E1Bz65q92zeGjkXLonrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxWmi%2FbtsHnsUAPI1%2FR2E1Bz65q92zeGjkXLonrk%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;1602&quot; height=&quot;454&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Bellman Equation&lt;/span&gt;&lt;/h4&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Bellman&amp;nbsp;Equation&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;&lt;u&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;episode를&amp;nbsp;다&amp;nbsp;완료안하고&lt;/span&gt;&amp;nbsp;state가&amp;nbsp;좋은지&amp;nbsp;예측할&amp;nbsp;수&amp;nbsp;없을까?&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;State-value&amp;nbsp;Bellman&amp;nbsp;Equation&lt;/b&gt;:&amp;nbsp;즉각적인&amp;nbsp;reward와&amp;nbsp;discount&amp;nbsp;factor를&amp;nbsp;고려한&amp;nbsp;미래&amp;nbsp;state&amp;nbsp;values를&amp;nbsp;합한&amp;nbsp;식&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Action-value&amp;nbsp;Bellman&amp;nbsp;Equation&lt;/b&gt;:&amp;nbsp;즉각적인&amp;nbsp;reward와&amp;nbsp;discount&amp;nbsp;factor를&amp;nbsp;고려한&amp;nbsp;미래&amp;nbsp;action&amp;nbsp;values를&amp;nbsp;합한&amp;nbsp;식&lt;/span&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6SteL/btsHn4yULYN/A4c67gkYtm9MKnhulruFs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6SteL/btsHn4yULYN/A4c67gkYtm9MKnhulruFs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6SteL/btsHn4yULYN/A4c67gkYtm9MKnhulruFs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6SteL%2FbtsHn4yULYN%2FA4c67gkYtm9MKnhulruFs1%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;2070&quot; height=&quot;930&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Bellman&amp;nbsp;Expectation&amp;nbsp;Equation&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;policy가&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;u&gt;특정&amp;nbsp;state와&amp;nbsp;value를&amp;nbsp;구하는&amp;nbsp;식&lt;/u&gt;&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyhnK/btsHl9IzO9o/RNpaWLVA11zRvUBtIdFaIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyhnK/btsHl9IzO9o/RNpaWLVA11zRvUBtIdFaIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyhnK/btsHl9IzO9o/RNpaWLVA11zRvUBtIdFaIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkyhnK%2FbtsHl9IzO9o%2FRNpaWLVA11zRvUBtIdFaIk%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;1970&quot; height=&quot;518&quot; data-origin-width=&quot;1970&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Bellman&amp;nbsp;Optimality&amp;nbsp;Equation&lt;/b&gt;&lt;/span&gt;:&amp;nbsp;RL의&amp;nbsp;goal은&amp;nbsp;최대&amp;nbsp;reward의&amp;nbsp;optimal&amp;nbsp;policy를&amp;nbsp;찾는게&amp;nbsp;목표.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Optimal Policy &lt;br /&gt;= Agent가 Goal을 달성했을 때의 policy &lt;br /&gt;= 각 state에서 가장 좋은 policy를 구해서 얻어진 policy&lt;/span&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3338&quot; data-origin-height=&quot;1160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhRHr3/btsHnidz1VJ/z1nK7crvMhXgcbSL1lIa60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhRHr3/btsHnidz1VJ/z1nK7crvMhXgcbSL1lIa60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhRHr3/btsHnidz1VJ/z1nK7crvMhXgcbSL1lIa60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhRHr3%2FbtsHnidz1VJ%2Fz1nK7crvMhXgcbSL1lIa60%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;3338&quot; height=&quot;1160&quot; data-origin-width=&quot;3338&quot; data-origin-height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  Value Function Estimation (Planning과 Learning)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Planning&lt;/b&gt;:&amp;nbsp;모델을&amp;nbsp;알고&amp;nbsp;이를&amp;nbsp;이용해&amp;nbsp;최적의&amp;nbsp;action을&amp;nbsp;찾는것&amp;nbsp;-&amp;nbsp;ex)&amp;nbsp;Dynamic&amp;nbsp;Programming&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Learning&lt;/b&gt;:&amp;nbsp;Sample&amp;nbsp;base로&amp;nbsp;(=&amp;nbsp;모델을&amp;nbsp;모르고)&amp;nbsp;학습하는&amp;nbsp;것&amp;nbsp;-ex)&amp;nbsp;MC,&amp;nbsp;TD&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2848&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxzsQ/btsHmSl9HWS/tMRy3Gp7Q6lUbFdqYlODsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxzsQ/btsHmSl9HWS/tMRy3Gp7Q6lUbFdqYlODsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxzsQ/btsHmSl9HWS/tMRy3Gp7Q6lUbFdqYlODsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmxzsQ%2FbtsHmSl9HWS%2FtMRy3Gp7Q6lUbFdqYlODsK%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;2848&quot; height=&quot;692&quot; data-origin-width=&quot;2848&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Gain Study/RL</category>
      <category>dp</category>
      <category>MDP</category>
      <category>Monte Carlo</category>
      <category>q-value</category>
      <category>Reinforcement Learning</category>
      <category>강화학습</category>
      <author>V2LLAIN</author>
      <guid isPermaLink="true">https://chan4im.tistory.com/285</guid>
      <comments>https://chan4im.tistory.com/285#entry285comment</comments>
      <pubDate>Sun, 2 Jun 2024 20:34:36 +0900</pubDate>
    </item>
  </channel>
</rss>