<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>생각하는 아져씨</title>
    <link>https://azeomi.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 2 Aug 2026 15:45:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>azeomi</managingEditor>
    <image>
      <title>생각하는 아져씨</title>
      <url>https://tistory1.daumcdn.net/tistory/3825584/attach/0c5f817348604d5dab0b59445d27705b</url>
      <link>https://azeomi.tistory.com</link>
    </image>
    <item>
      <title>[Programmers] 단어 변환</title>
      <link>https://azeomi.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/43163&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698205881633&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cURbe5/hyUkgfDJKg/QORx032XPP0NKRXtMcquW1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cQaZyH/hyUkehN25P/A6lGWASMgQnMWe0lsN2E31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cURbe5/hyUkgfDJKg/QORx032XPP0NKRXtMcquW1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cQaZyH/hyUkehN25P/A6lGWASMgQnMWe0lsN2E31/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 읽다보면, 구현 같지만 구현과 BFS/DFS 알고리즘이 혼합된 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 속에서 '최소 몇 단계' 라는 말이 있었기 때문에 BFS로 접근하면 되겠구나 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS는 최단거리가 보장되는 경로를 탐색할 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 코드 작성하기 전 과정을 적어보면 다음과 같이 풀 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1698206023287&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  '''
    최소 단계를 거쳐 begin -&amp;gt; target으로 변환
    변환할 때 마다 count + 1
    hit -&amp;gt; cog 로 갈 수 있는 최소 변경 횟수
    graph : hot -&amp;gt; dot 으로 1개씩 변경된다면, 인접리스트로 추가
    hit에서 h가 바뀔때, _it가 words에 있는지 확인 =&amp;gt; 없으면, 패스
    hit에서 i가 바뀔때, h_t가 wrords에 있는지 확인, hot, -&amp;gt;있으면 queue에 추가, visited[hot] = True
    hit에서 t가 바뀔때, hi_가 words에 있는지 확인, -&amp;gt; 없으면, 패스
    
    queue .popleft()
    
    hot에서 h가 바뀔때, _ot 있는지 확인, dot, lot -&amp;gt; queue에 추가 (dot, lot) , visited = ture
    hot에서 o가 바뀔때, h_t가 있는지 확인, 업승면 패스
    hot에서 t가 바뀔때, ho가 있는지 확인, (+not visited  여야함) 없으면 패스
    
    queue = (dot, lot)
    queue.popleft
    ... 반복
    -&amp;gt; target 찾으면 종료., 못찾으면 0 리턴
    '''&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 그대로 코드로 구현하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1698206053528&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
def solution(begin, target, words):
  
    visited = {}
    answer = {}
    for w in words:
        visited[w] = False
        answer[w] = 1
    queue = deque()
    queue.append(begin)
    answer[begin] = 0
    
    while queue:
        begin_w = queue.popleft()  
        if begin_w == target:
            return answer[target]
        for i in range(len(begin_w)):
            tmp = begin_w[:i] + begin_w[i+1:]
            for w in words:
                if (w[:i] + w[i+1:]) == tmp and not visited[w]:    # 1개 알파벳 변경할 수 있다면, queue에 추가
                    queue.append(w)
                    answer[w] += answer[begin_w]
                    visited[w] = True
    
    return 0&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Study/Algorithm</category>
      <category>단어변환</category>
      <category>알고리즘</category>
      <category>코딩테스트</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/162</guid>
      <comments>https://azeomi.tistory.com/162#entry162comment</comments>
      <pubDate>Wed, 25 Oct 2023 12:54:38 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 이진 변환 반복하기</title>
      <link>https://azeomi.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/70129&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/70129&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698205670236&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/70129&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m4b5J/hyUgVc8Ond/aJfOdq2hzrX6Z1gsEgmKb1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sROp4/hyUkgNtWwV/dLJromKUcDraPmzkBN9qh0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/70129&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/70129&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m4b5J/hyUgVc8Ond/aJfOdq2hzrX6Z1gsEgmKb1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sROp4/hyUkgNtWwV/dLJromKUcDraPmzkBN9qh0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 프로그래머스 풀어보기 ✌️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 알고리즘만 풀었더니 구현 문제를 잘 못푸는 것 같아서 연습 겸 풀어본다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접근 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현이니까 문제에서 하라는 대로 코드를 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진변환 반복하라고 하니까..반복해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진변환 함수 생각안나서 직접 함수로 구현했다. 다 풀고 찾아보니 아주 간단한 함수였던 것..!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bin()으로 해결하면 된다.&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;pre id=&quot;code_1698205835588&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    '''
    1. x에서 0 제거
    2. (제거된 s의 길이) -&amp;gt; num, num에 이진변환 -&amp;gt; 문자열
    3. 이진변환이 &quot;1&quot;(문자열) 인지 확인 -&amp;gt; &quot;1&quot;이라면, [제거된 0 개수, 이진변환 횟수] 출력
    '''
    
    bin_cnt = 0 # 이진변환 횟수
    zero_cnt = 0
    
    def to_binary(num):
        s = ''
        while num != 0:
            n = num % 2
            s += str(n)
            num = num // 2
        return s  
    
    while s != '1':
        zero_cnt += len(s) - len(s.replace('0', '')) # 제거된 0 개수
        s = s.replace('0', '')
        bin_num = to_binary(len(s))[::-1]    # 이진 변환, str 타입
        s = bin_num
        bin_cnt += 1
        
    return [bin_cnt, zero_cnt]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study/Algorithm</category>
      <category>알고리즘</category>
      <category>이진변환반복하기</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/161</guid>
      <comments>https://azeomi.tistory.com/161#entry161comment</comments>
      <pubDate>Wed, 25 Oct 2023 12:51:01 +0900</pubDate>
    </item>
    <item>
      <title>LLM의 효율적인 파인튜닝, PEFT 연구는 어떻게 흘러왔을까? </title>
      <link>https://azeomi.tistory.com/157</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;PEFT.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pui4E/btsyMxreKOm/iHFykKcGOw0WYlTDyjzRGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pui4E/btsyMxreKOm/iHFykKcGOw0WYlTDyjzRGk/img.jpg&quot; data-alt=&quot;&amp;quot;A golden retriever dog is sitting with a keyboard in one hand and a mouse in the other. The background has neon signs like the future smart city. Write the word 'Parameter Efficient Fine Tuning' at the top.&amp;quot;
Bing Image Creator 사용하여 만들었습니다. DALL-E에서 제공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pui4E/btsyMxreKOm/iHFykKcGOw0WYlTDyjzRGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpui4E%2FbtsyMxreKOm%2FiHFykKcGOw0WYlTDyjzRGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-filename=&quot;PEFT.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;A golden retriever dog is sitting with a keyboard in one hand and a mouse in the other. The background has neon signs like the future smart city. Write the word 'Parameter Efficient Fine Tuning' at the top.&quot;
Bing Image Creator 사용하여 만들었습니다. DALL-E에서 제공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LLM의 효율적인 파인튜닝인 PEFT 연구의 중요성과 현재까지의 흐름을 정리해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 공부할 땐 노션에 정리한 후 다듬어 블로그에 올리는데, 이번 포스팅은 양이 많아서 노션 링크를 공유한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEFT의 최신 연구 동향에 대해 대략적으로 파악할 수 있도록 요약해봤다. PEFT를 공부하는 분들께 조금이라도 도움이 되었으면 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족한 부분은 계속해서 보완할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.notion.so/azeomi/LLM-PEFT-182685e9cfc447f7bbb651e7c80eef7d?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.notion.so/azeomi/LLM-PEFT-182685e9cfc447f7bbb651e7c80eef7d?pvs=4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697774908697&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;LLM의 효율적인 파인튜닝, PEFT 연구는 어떻게 흘러왔을까? &quot; data-og-description=&quot;Why is the Fine-Tuning LLMs important?&quot; data-og-host=&quot;www.notion.so&quot; data-og-source-url=&quot;https://www.notion.so/azeomi/LLM-PEFT-182685e9cfc447f7bbb651e7c80eef7d?pvs=4&quot; data-og-url=&quot;https://www.notion.so/182685e9cfc447f7bbb651e7c80eef7d&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cev253/hyUgTygBLy/rwBLQZokvhlwJZUBrkZdIk/img.png?width=2000&amp;amp;height=684&amp;amp;face=0_0_2000_684,https://scrap.kakaocdn.net/dn/woKvh/hyUgLfU769/lKcPmxwXdbqNp8giZmj4j0/img.png?width=2000&amp;amp;height=684&amp;amp;face=0_0_2000_684&quot;&gt;&lt;a href=&quot;https://www.notion.so/azeomi/LLM-PEFT-182685e9cfc447f7bbb651e7c80eef7d?pvs=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.notion.so/azeomi/LLM-PEFT-182685e9cfc447f7bbb651e7c80eef7d?pvs=4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cev253/hyUgTygBLy/rwBLQZokvhlwJZUBrkZdIk/img.png?width=2000&amp;amp;height=684&amp;amp;face=0_0_2000_684,https://scrap.kakaocdn.net/dn/woKvh/hyUgLfU769/lKcPmxwXdbqNp8giZmj4j0/img.png?width=2000&amp;amp;height=684&amp;amp;face=0_0_2000_684');&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;LLM의 효율적인 파인튜닝, PEFT 연구는 어떻게 흘러왔을까? &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Why is the Fine-Tuning LLMs important?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine &amp;amp; Deep Learning/Generative AI</category>
      <category>ADAPTER</category>
      <category>fine tuning</category>
      <category>Large Language Model</category>
      <category>LLM</category>
      <category>Lora</category>
      <category>peft</category>
      <category>Soft Prompts</category>
      <category>최신연구동향</category>
      <category>파인튜닝</category>
      <category>효율적인 파인튜닝</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/157</guid>
      <comments>https://azeomi.tistory.com/157#entry157comment</comments>
      <pubDate>Fri, 20 Oct 2023 13:30:59 +0900</pubDate>
    </item>
    <item>
      <title>PEFT, LoRA 입문하기✌️</title>
      <link>https://azeomi.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앤드류 응 교수님의 강의를 듣고 정리 및 공부한 글임을 알려드립니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Generative AI with LLMs In Generative AI with Large Language Models (LLMs), created in partnership with AWS, you&amp;rsquo;ll learn the fundamentals of how generative AI works, and how to deploy it in real-world applications.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;LoRA(Low Rank Adaptation)&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzKflO/btsyQOdIFM5/8Q2vI24IYKfYfGHcdRcGf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzKflO/btsyQOdIFM5/8Q2vI24IYKfYfGHcdRcGf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzKflO/btsyQOdIFM5/8Q2vI24IYKfYfGHcdRcGf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzKflO%2FbtsyQOdIFM5%2F8Q2vI24IYKfYfGHcdRcGf0%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;295&quot; height=&quot;335&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;2269&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;PEFT 중 Reparameterization 테크닉에 속하는 기법으로, 사전학습 모델에 학습이 가능한 Rank decomposition 행렬을 삽입한 것으로 파인튜닝 동안 학습되는 파라미터를 줄이는 전략&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오리지널 모델의 파라미터를 freezing 하고&lt;/li&gt;
&lt;li&gt;&amp;lsquo;A Pair of Rank Decomposition Matrices&amp;rsquo;를 오리지널 weights에 주입합니다.&lt;/li&gt;
&lt;li&gt;그리고 smaller matrices의 weights를 학습합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Rank Decomposition&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬의 차원을 r 만큼 줄이는 행렬과 다시 원래 크기로 키워주는 행렬의 곱으로 나타내는 것을 의미합니다.&lt;/li&gt;
&lt;li&gt;레이어 중간마다 존재하는 hidden states h에 값을 더해줄 수 있는 파라미터를 추가해 줘서 모델의 출력 값을 원하는 타깃 레이블에 맞게 튜닝하는 것이 LoRA 테크닉입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;핵심 포인트는,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오리지널 모델의 weights는 Freeze!&lt;/li&gt;
&lt;li&gt;한 쌍의 rank decomposition matrices를 오리지널 모델의 weights에 주입!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;LoRA Example 살펴보기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머 아키텍처를 활용해 살펴보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTusw/btsyMLvXHpK/qrOWH7bDBk4ZPXQiPnI1jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTusw/btsyMLvXHpK/qrOWH7bDBk4ZPXQiPnI1jk/img.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1538&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTusw/btsyMLvXHpK/qrOWH7bDBk4ZPXQiPnI1jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTusw%2FbtsyMLvXHpK%2FqrOWH7bDBk4ZPXQiPnI1jk%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;2000&quot; height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkD8Bz/btsyPRBVaNf/XUcgBFLzkHYfzRlYQgil8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkD8Bz/btsyPRBVaNf/XUcgBFLzkHYfzRlYQgil8K/img.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1538&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkD8Bz/btsyPRBVaNf/XUcgBFLzkHYfzRlYQgil8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkD8Bz%2FbtsyPRBVaNf%2FXUcgBFLzkHYfzRlYQgil8K%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;2000&quot; height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜스포머에는 2 종류의 NN이 학습 &amp;rarr; Self Attention &amp;amp; Feed forward Network&lt;/li&gt;
&lt;li&gt;원래 이 2 파트는 pre-training 시 학습되는 parameter 들로, Full fine-tuning 진행 시 이 부분이 모두 update 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;u&gt;하지만! LoRA를 사용하면 모두 update 하지 않아도 됩니다.&lt;/u&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Original weights freeze : 먼저 오리지널 weights는 고정!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;5642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRACmc/btsyPxRjn1t/ROnuw7YO9jkPkgams4kaTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRACmc/btsyPxRjn1t/ROnuw7YO9jkPkgams4kaTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRACmc/btsyPxRjn1t/ROnuw7YO9jkPkgams4kaTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRACmc%2FbtsyPxRjn1t%2FROnuw7YO9jkPkgams4kaTk%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;187&quot; height=&quot;528&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;5642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Matrix Multiply the low rank matrices : Low Rank Matrices의 행렬곱을 진행&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyL4Hm/btsyQf3FAAg/LcQEZ8j3GJkjVtk7XFyrF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyL4Hm/btsyQf3FAAg/LcQEZ8j3GJkjVtk7XFyrF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyL4Hm/btsyQf3FAAg/LcQEZ8j3GJkjVtk7XFyrF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyL4Hm%2FbtsyQf3FAAg%2FLcQEZ8j3GJkjVtk7XFyrF0%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;559&quot; height=&quot;152&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Add to original weights : 오리지널 weights에 LoRA Matrices를 더함&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b011gR/btsyQpSKOON/7UBDqIhzsud9pPiCxaqqD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b011gR/btsyQpSKOON/7UBDqIhzsud9pPiCxaqqD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b011gR/btsyQpSKOON/7UBDqIhzsud9pPiCxaqqD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb011gR%2FbtsyQpSKOON%2F7UBDqIhzsud9pPiCxaqqD0%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;450&quot; height=&quot;188&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Update weights : small matrices만 업데이트&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;4840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CnWTW/btsyPRvdyPo/WaVFDfkSTp0Pa4UAgfBeP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CnWTW/btsyPRvdyPo/WaVFDfkSTp0Pa4UAgfBeP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CnWTW/btsyPRvdyPo/WaVFDfkSTp0Pa4UAgfBeP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCnWTW%2FbtsyPRvdyPo%2FWaVFDfkSTp0Pa4UAgfBeP0%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;251&quot; height=&quot;607&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;4840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;LoRA의 장점&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LoRA significantly reduces parameters
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜스포머 논문에 따르면, weights 차수가 512 * 64로 총 32,768개의 학습 파라미터 존재합니다.&lt;/li&gt;
&lt;li&gt;rank = 8 인 LoRa를 이용하면, 32,768개의 파라미터를 풀로 업데이트하지 않고, 작은 rank decomposition matrices를 대신 학습할 수 있습니다.&lt;/li&gt;
&lt;li&gt;즉, B는 5128 = 4,096개, A는 864 = 512개로 총 4,608개 파라미터만 업데이트하면 되는 것이죠.&lt;/li&gt;
&lt;li&gt;기존보다 86% 감소하게 되고,&lt;/li&gt;
&lt;li&gt;&lt;u&gt;그렇기 때문에 single gpu에서도 PEFT 가능하다는 장점이 있습니다.&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LoRA is flexible
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rank decomposition matrices가 아주 작기 때문 &amp;rarr; 각 Task에 대해 fine-tune 할 수 있고, inference 시 weights를 업데이트할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Full fine tuning 시, Task 마다 오리지널 LLM과 동일한 사이즈의 모델이 만들어지면서 &amp;rarr; 모델을 저장하고 처리하는데 storage 문제가 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;하지만, LoRA로 공간도 절약하고 flexible 하게 적용이 가능하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Machine &amp;amp; Deep Learning/Generative AI</category>
      <category>Coursera</category>
      <category>Lora</category>
      <category>Low Rank Adaptation</category>
      <category>peft</category>
      <category>코세라</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/156</guid>
      <comments>https://azeomi.tistory.com/156#entry156comment</comments>
      <pubDate>Fri, 20 Oct 2023 12:21:09 +0900</pubDate>
    </item>
    <item>
      <title>파라미터를 효율적으로 파인튜닝한다?!  </title>
      <link>https://azeomi.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앤드류 응 교수님의 강의를 듣고 정리 및 공부한 글임을 알려드립니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #333333; text-align: center;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Generative AI with LLMs In Generative AI with Large Language Models (LLMs), created in partnership with AWS, you&amp;rsquo;ll learn the fundamentals of how generative AI works, and how to deploy it in real-world applications.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;LLM의 Full Fine-Tuning은 너무 많은 계산과 메모리가 소요됩니다. 학습 weights와 Optimizer States, Gradients, Forward Activations, Temp memory 등을 계산하고 저장하는데 많은 비용이 필요하기 때문에 일반 소비자의 하드웨어 다루기는 조금 크다는 점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 달리, &lt;u&gt;PEFT(Parameter Efficient Fine-Tuning)은 전체를 업데이트하는 것이 아닌, 파라미터의 일부만 업데이트하는 방식&lt;/u&gt;으로, 위 문제를 조금 해결할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;PEFT는 크게 2가지 방법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEFT에는 여러 가지 방법이 존재하고 현재까지 많은 갈래로 연구되고 있습니다. 이들을 크게 2가지로 구별해 볼 수 있는데,&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모델의 &lt;u&gt;대부분 weights는 고정하고, 극 일부만 Fine-Tuning&lt;/u&gt; 하는 방법 &amp;rarr; 특정 Layer 또는 Component가 될 수 있습니다.&lt;/li&gt;
&lt;li&gt;원래 &lt;u&gt;LLM의 weights는 전혀 건들지 않고&lt;/u&gt;, 새로운 Layer 또는 Component를 일부 추가하는 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2가지 방법의 공통점이 무엇일까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW7yT5/btsyQsookBL/v5nlnqTY6lJDxAZD1P2Opk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW7yT5/btsyQsookBL/v5nlnqTY6lJDxAZD1P2Opk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW7yT5/btsyQsookBL/v5nlnqTY6lJDxAZD1P2Opk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW7yT5%2FbtsyQsookBL%2Fv5nlnqTY6lJDxAZD1P2Opk%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;2000&quot; height=&quot;753&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 모델의 &lt;u&gt;대부분의 weight가 고정&lt;/u&gt;되어 있다는 점입니다. 그래서 학습할 수 있는 weights는 오리지널 LLM의 약 15~20% 정도가 되면서 학습에 필요한 메모리 관리가 쉬워지고, Single GPU에서도 동작이 가능하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Original LLM이 &amp;lsquo;아주 조금&amp;rsquo; 수정되기 때문에 Full Fine-Tuning에서 일어나는 &lt;u&gt;Catastrophic Forgetting이 일어날 가능성이 적어집니다.&lt;/u&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;어떤 Task에 적용할 때, Full Fine Tuning vs PEFT 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Full Fine-Tuning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Task에 맞게 파인 튜닝하고 싶다고 가정해 봅니다. LLM을 Task마다 Full Fine-Tuning 하게 되면 오리지널 LLM과 동일 사이즈의 파인튜닝 LLM이 만들어지게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c64nCU/btsyRS1cUhI/xlTC4S7ez0PzcBOPh7maH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c64nCU/btsyRS1cUhI/xlTC4S7ez0PzcBOPh7maH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c64nCU/btsyRS1cUhI/xlTC4S7ez0PzcBOPh7maH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc64nCU%2FbtsyRS1cUhI%2FxlTC4S7ez0PzcBOPh7maH0%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;2000&quot; height=&quot;425&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 오리지널 LLM과 동일한 사이즈(그림상 GBs)라서 multiple-task에 대해 파인 튜닝한다면 &lt;u&gt;메모리 저장 문제&lt;/u&gt;가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 PEFT는 공간도 절약하고 좀 더 Flexible 하다는 장점이 있죠&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) PEFT&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;PEFT을 통해서 공간을 절약하고 Flexible 하게 multiple-task에 대해 파인튜닝을 적용할 수 있습니다.&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/begNlG/btsyQeKsa5U/KjgesiqaACKxNTFa5D4E1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/begNlG/btsyQeKsa5U/KjgesiqaACKxNTFa5D4E1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/begNlG/btsyQeKsa5U/KjgesiqaACKxNTFa5D4E1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbegNlG%2FbtsyQeKsa5U%2FKjgesiqaACKxNTFa5D4E1k%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;2000&quot; height=&quot;401&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 Task에 대해 PEFT 하면 적은 수의 파라미터만 학습하게 되면서 전체적으로 차지하는 공간이 GBs &amp;rarr; MBs로 줄어들게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 새로운 파라미터를 원래 LLM에 weights와 결합해서 사용하면, Task마다 full fine tuning 할 필요 없이 쉽게 교체 가능해 매우 효율적인 장점도 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEFT는 굉장히 다양한 방법이 존재하는데, 각 방법마다 Trade-Off가 존재합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &amp;lsquo;어떤 PEFT가 최고의 방법이다&amp;rsquo;라고 아직까지 얘기할 순 없는 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvTQtY/btsyR7jKGuy/vfXpIlZtHTrZaUdTJAEbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvTQtY/btsyR7jKGuy/vfXpIlZtHTrZaUdTJAEbY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvTQtY/btsyR7jKGuy/vfXpIlZtHTrZaUdTJAEbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvTQtY%2FbtsyR7jKGuy%2FvfXpIlZtHTrZaUdTJAEbY0%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;2000&quot; height=&quot;544&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;PEFT의 3가지 주요 클래스&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 3가지 방법론으로 구분됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) Selective Methods&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오리지널 LLM 파라미터의 일부만 파인튜닝 하는 방법입니다. &lt;u&gt;업데이트하려는 파라미터를 선택&lt;/u&gt;하는 방법이죠. 모델의 특정 Component 또는 Layer 또는 개별 파라미터 등을 선택해서 파인튜닝을 진행하게 됩니다. 각 방법마다 성능이 다르고 컴퓨팅 위에 언급된 Trade-Off가 존재합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) Reparameterization Methods&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오리지널 네트워크 weights의 새로운 Low-Rank Transformations를 생성해서 학습할 파라미터의 수를 줄이는 방법입니다. 대표적으로 유명한 방법으로 &lt;u&gt;LoRA&lt;/u&gt;가 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) Additive Methods&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오리지널 LLM의 모든 weights는 freeze로 유지한 채, 새로운 학습가능한 Components를 도입해 파인튜닝하는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법에는&lt;u&gt; Adpater&lt;/u&gt;와 &lt;u&gt;Soft Prompts&lt;/u&gt; 방식이 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adapter는 모델 구조에 새로운 레이어를 추가하는 방법이고, Soft prompts는 모델 구조는 고정한 채 더 나은 성능을 내기 위해 Input을 조정하는 방법입니다. 보통 Prompt embedding에 파라미터를 추가하거나, Input은 고정하고 embedding weights를 학습하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine &amp;amp; Deep Learning/Generative AI</category>
      <category>Coursera</category>
      <category>LLM</category>
      <category>Lora</category>
      <category>peft</category>
      <category>코세라</category>
      <category>파인튜닝</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/155</guid>
      <comments>https://azeomi.tistory.com/155#entry155comment</comments>
      <pubDate>Fri, 20 Oct 2023 11:47:46 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 복습, 데이터 스케일링이 뭐냐 </title>
      <link>https://azeomi.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Data Scaling?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 스케일링은 데이터의 범위와 분포를 조정하는 작업을 의미한다. 이를 통해 모든 특성이 동일한 스케일을 갖게 되며, 모델 학습 과정을 안정화시키고 수렴 속도를 높이며, 이상치의 영향을 줄여 모델의 성능을 개선하는데 도움을 주는 전처리 방법 중 하나이다.&lt;br /&gt;&lt;br /&gt;데이터를 분석하다 보면 feature들마다 데이터 값의 범위가 다 제각각임을 볼 수 있다. 만약 범위 차이가 크다면 모델을 학습할 때 0으로 수렴하거나 무한으로 발산할 수 있다는 문제점이 있으므로 데이터 스케일링을 해주는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://dacon.io/codeshare/4526&quot;&gt;여기&lt;/a&gt;를 참고해 총 5가지 데이터 스케일링 방법에 대해 연습했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;StandardScaler&lt;/li&gt;
&lt;li&gt;MinMaxScaler&lt;/li&gt;
&lt;li&gt;MaxAbsScaler&lt;/li&gt;
&lt;li&gt;RobustScaler&lt;/li&gt;
&lt;li&gt;Normalizer&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x1ib3/btsyNvTLmYh/14o8KXkjTgar2jAt7bKjQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x1ib3/btsyNvTLmYh/14o8KXkjTgar2jAt7bKjQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x1ib3/btsyNvTLmYh/14o8KXkjTgar2jAt7bKjQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx1ib3%2FbtsyNvTLmYh%2F14o8KXkjTgar2jAt7bKjQk%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;1476&quot; height=&quot;912&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;912&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;1465&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCzHgy/btsyQPwEtOu/rLvzivhvKgC3mIEGKsoaV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCzHgy/btsyQPwEtOu/rLvzivhvKgC3mIEGKsoaV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCzHgy/btsyQPwEtOu/rLvzivhvKgC3mIEGKsoaV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCzHgy%2FbtsyQPwEtOu%2FrLvzivhvKgC3mIEGKsoaV1%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;1465&quot; height=&quot;601&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;601&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;1207&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3nTbE/btsyOYg2rLq/kpfsNWCEk0p5zkdTdjjRa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3nTbE/btsyOYg2rLq/kpfsNWCEk0p5zkdTdjjRa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3nTbE/btsyOYg2rLq/kpfsNWCEk0p5zkdTdjjRa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3nTbE%2FbtsyOYg2rLq%2FkpfsNWCEk0p5zkdTdjjRa1%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;1207&quot; height=&quot;876&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;876&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;1234&quot; data-origin-height=&quot;699&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dnb6w/btsyNnBn2a2/nSTgOYXFkijSKZv1T1UF4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dnb6w/btsyNnBn2a2/nSTgOYXFkijSKZv1T1UF4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dnb6w/btsyNnBn2a2/nSTgOYXFkijSKZv1T1UF4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDnb6w%2FbtsyNnBn2a2%2FnSTgOYXFkijSKZv1T1UF4k%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;1234&quot; height=&quot;699&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;699&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 스케일링을 했을 때 분포가 다름을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZuo0/btsyLNnhUsq/bqUrwn5CyFbeHrpF98vPYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZuo0/btsyLNnhUsq/bqUrwn5CyFbeHrpF98vPYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZuo0/btsyLNnhUsq/bqUrwn5CyFbeHrpF98vPYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZuo0%2FbtsyLNnhUsq%2FbqUrwn5CyFbeHrpF98vPYK%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;1456&quot; height=&quot;485&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;485&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;1446&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1r2pN/btsyQLHOO9C/JONAuzg8yfWxRR4wF09DF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1r2pN/btsyQLHOO9C/JONAuzg8yfWxRR4wF09DF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1r2pN/btsyQLHOO9C/JONAuzg8yfWxRR4wF09DF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1r2pN%2FbtsyQLHOO9C%2FJONAuzg8yfWxRR4wF09DF1%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;1446&quot; height=&quot;717&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;717&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;1478&quot; data-origin-height=&quot;1139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yIywi/btsyLNU5C0w/xss8BWkYDRLEGqg6MKvNy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yIywi/btsyLNU5C0w/xss8BWkYDRLEGqg6MKvNy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yIywi/btsyLNU5C0w/xss8BWkYDRLEGqg6MKvNy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyIywi%2FbtsyLNU5C0w%2Fxss8BWkYDRLEGqg6MKvNy1%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;1478&quot; height=&quot;1139&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;1139&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;1446&quot; data-origin-height=&quot;1145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBMYrE/btsyPwq3qcO/ABJPYCAkqBjBCGghpAXsC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBMYrE/btsyPwq3qcO/ABJPYCAkqBjBCGghpAXsC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBMYrE/btsyPwq3qcO/ABJPYCAkqBjBCGghpAXsC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBMYrE%2FbtsyPwq3qcO%2FABJPYCAkqBjBCGghpAXsC1%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;1446&quot; height=&quot;1145&quot; data-origin-width=&quot;1446&quot; data-origin-height=&quot;1145&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;1455&quot; data-origin-height=&quot;1115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2YmMF/btsyMdeYUn9/EUmXGZkHacs5ImPU50O5Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2YmMF/btsyMdeYUn9/EUmXGZkHacs5ImPU50O5Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2YmMF/btsyMdeYUn9/EUmXGZkHacs5ImPU50O5Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2YmMF%2FbtsyMdeYUn9%2FEUmXGZkHacs5ImPU50O5Z0%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;1455&quot; height=&quot;1115&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;1115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 가지 데이터 스케일링을 해보면서 모델의 성능을 살펴봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터셋과 알고리즘에 따라 가장 적절한 스케일링 방법이 달라서 그런가 모델의 성능이 달라짐을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이점에 유의해서 데이터 스케일링 방법을 선택하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Machine &amp;amp; Deep Learning/ML &amp;amp; DL</category>
      <category>데이터분석</category>
      <category>데이터스케일링</category>
      <category>머신러닝</category>
      <category>판다스</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/154</guid>
      <comments>https://azeomi.tistory.com/154#entry154comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:05:03 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 복습, 범주형 변수를 인코딩해보자  </title>
      <link>https://azeomi.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에서 범주형 변수를 인코딩해야 하는 이유는 정말 중요하다. 왜냐하면,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;머신러닝 모델은 숫자 데이터만 이해할 수 있어서, 범주형 변수를 숫자로 변환해야 한다. 모델에게 맞게 언어를 해석하도록 하는 것이다.&lt;/li&gt;
&lt;li&gt;범주형 변수를 인코딩하면 모델이 범주 간의 관계를 파악하고 예측에 활용할 수 있다.&lt;/li&gt;
&lt;li&gt;인코딩을 통해, 범주형 변수의 유용한 정보를 보존할 수도 있다. 때론 모델의 성능을 향상해 준다.&lt;/li&gt;
&lt;li&gt;원-핫 인코딩과 같은 효과적인 방법을 사용하면, 범주형 변수의 다양한 범주를 이진 형태로 표현할 수 있 고 모델이 이해하기 쉽게 만들어준다.&lt;/li&gt;
&lt;li&gt;모델의 예측 정확도를 향상시키고, 데이터 분석 및 예측 프로세스를 더 효과적으로 수행하는 핵심 도구로 범주형 변수의 인코딩은 반드시 고려해야 한다. 말그대로 머신러닝의 비결이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 오늘은 범주형 데이터를 인코딩하는 다양한 방법을 연습해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범주형 인코딩 방법은 총&amp;nbsp; 6가지로 &lt;a href=&quot;https://conanmoon.medium.com/%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B3%BC%ED%95%99-%EC%9C%A0%EB%A7%9D%EC%A3%BC%EC%9D%98-%EB%A7%A4%EC%9D%BC-%EA%B8%80%EC%93%B0%EA%B8%B0-%EC%9D%BC%EA%B3%B1%EB%B2%88%EC%A7%B8-%EC%9D%BC%EC%9A%94%EC%9D%BC-7a40e7de39d4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;One-Hot Encoding&lt;/li&gt;
&lt;li&gt;Label Encoding&lt;/li&gt;
&lt;li&gt;Ordinal Encoding&lt;/li&gt;
&lt;li&gt;Binary Encoding&lt;/li&gt;
&lt;li&gt;Frequency Encoding&lt;/li&gt;
&lt;li&gt;Mean Encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 데이콘 블로그를 참고해 만들어 준비했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5USO1/btsyLJkRNIZ/MILD7RqWUH0vTJKjHFpi20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5USO1/btsyLJkRNIZ/MILD7RqWUH0vTJKjHFpi20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5USO1/btsyLJkRNIZ/MILD7RqWUH0vTJKjHFpi20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5USO1%2FbtsyLJkRNIZ%2FMILD7RqWUH0vTJKjHFpi20%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;1147&quot; height=&quot;652&quot; data-origin-width=&quot;1438&quot; data-origin-height=&quot;817&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;1452&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eDIP4m/btsyNrw0zZI/gKYdKTA173kxQbktgo5z1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eDIP4m/btsyNrw0zZI/gKYdKTA173kxQbktgo5z1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eDIP4m/btsyNrw0zZI/gKYdKTA173kxQbktgo5z1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeDIP4m%2FbtsyNrw0zZI%2FgKYdKTA173kxQbktgo5z1k%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;1452&quot; height=&quot;857&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;857&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;1427&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q7Uxn/btsyNwd2EtL/1vMB0W4Rdlae1gf9OKWdXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q7Uxn/btsyNwd2EtL/1vMB0W4Rdlae1gf9OKWdXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q7Uxn/btsyNwd2EtL/1vMB0W4Rdlae1gf9OKWdXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq7Uxn%2FbtsyNwd2EtL%2F1vMB0W4Rdlae1gf9OKWdXK%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;1427&quot; height=&quot;1016&quot; data-origin-width=&quot;1427&quot; data-origin-height=&quot;1016&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;1472&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzaVXB/btsyQTlvVgf/K3Ktsuky1bAZTdANrAWNS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzaVXB/btsyQTlvVgf/K3Ktsuky1bAZTdANrAWNS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzaVXB/btsyQTlvVgf/K3Ktsuky1bAZTdANrAWNS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzaVXB%2FbtsyQTlvVgf%2FK3Ktsuky1bAZTdANrAWNS0%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;1472&quot; height=&quot;809&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;809&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;1451&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cosviR/btsyPBTq4qV/PANKu6U0SoAwou10r3hxu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cosviR/btsyPBTq4qV/PANKu6U0SoAwou10r3hxu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cosviR/btsyPBTq4qV/PANKu6U0SoAwou10r3hxu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcosviR%2FbtsyPBTq4qV%2FPANKu6U0SoAwou10r3hxu0%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;1451&quot; height=&quot;599&quot; data-origin-width=&quot;1451&quot; data-origin-height=&quot;599&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;1452&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b55Xcb/btsyPuUjRAU/RK82dSZkJ5g30dHPa03Ezk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b55Xcb/btsyPuUjRAU/RK82dSZkJ5g30dHPa03Ezk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b55Xcb/btsyPuUjRAU/RK82dSZkJ5g30dHPa03Ezk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb55Xcb%2FbtsyPuUjRAU%2FRK82dSZkJ5g30dHPa03Ezk%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;1452&quot; height=&quot;820&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;820&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;1442&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRmKuM/btsyMscb0bd/f1f1gjT5zVpxVdHzYibmiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRmKuM/btsyMscb0bd/f1f1gjT5zVpxVdHzYibmiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRmKuM/btsyMscb0bd/f1f1gjT5zVpxVdHzYibmiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRmKuM%2FbtsyMscb0bd%2Ff1f1gjT5zVpxVdHzYibmiK%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;1442&quot; height=&quot;729&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;729&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;1448&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byBJQn/btsyPXvaorF/fXcGKQxIhfqaTQtkCfjHkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byBJQn/btsyPXvaorF/fXcGKQxIhfqaTQtkCfjHkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byBJQn/btsyPXvaorF/fXcGKQxIhfqaTQtkCfjHkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyBJQn%2FbtsyPXvaorF%2FfXcGKQxIhfqaTQtkCfjHkk%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;1448&quot; height=&quot;579&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;579&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;1437&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUjUB/btsyNrDL1xo/jwy1HwsLvM2xp0Sluh9kTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUjUB/btsyNrDL1xo/jwy1HwsLvM2xp0Sluh9kTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUjUB/btsyNrDL1xo/jwy1HwsLvM2xp0Sluh9kTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUjUB%2FbtsyNrDL1xo%2Fjwy1HwsLvM2xp0Sluh9kTK%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;1437&quot; height=&quot;828&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;828&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;1465&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sdJ3D/btsyMN8chWP/JXJAdHC64RIGkkdPx4VKTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sdJ3D/btsyMN8chWP/JXJAdHC64RIGkkdPx4VKTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sdJ3D/btsyMN8chWP/JXJAdHC64RIGkkdPx4VKTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsdJ3D%2FbtsyMN8chWP%2FJXJAdHC64RIGkkdPx4VKTK%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;1465&quot; height=&quot;874&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;874&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;1465&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2L6bc/btsyOZfZCRg/zMQ0hMZ6BP6gNhrLY4mmaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2L6bc/btsyOZfZCRg/zMQ0hMZ6BP6gNhrLY4mmaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2L6bc/btsyOZfZCRg/zMQ0hMZ6BP6gNhrLY4mmaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2L6bc%2FbtsyOZfZCRg%2FzMQ0hMZ6BP6gNhrLY4mmaK%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;1465&quot; height=&quot;954&quot; data-origin-width=&quot;1465&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Machine &amp;amp; Deep Learning/ML &amp;amp; DL</category>
      <category>데이터분석</category>
      <category>데이터프레임</category>
      <category>머신러닝</category>
      <category>범주형데이터</category>
      <category>범주형데이터 인코딩</category>
      <category>판다스</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/153</guid>
      <comments>https://azeomi.tistory.com/153#entry153comment</comments>
      <pubDate>Thu, 19 Oct 2023 21:55:59 +0900</pubDate>
    </item>
    <item>
      <title>머신러닝 복습, 컬럼을 기준으로 그룹화/집계하기  </title>
      <link>https://azeomi.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;머신러닝에서 모델의 성능을 높이는데 정제된 데이터, 좋은 알고리즘을 사용하는 것도 있지만 무엇보다도 데이터를 목적에 맞게 추출하고 가공하는 것도 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 데이터를 분석할 때 빈번하게 등장하는 groupby, merge, agg를 사용해서 간단한 문제를 연습해봤다.&lt;/p&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;u&gt;Problem. &lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;2개의 데이터 프레임이 있다. '년도' 컬럼을 기준으로 그룹화하여 나라명 개수, 행복기대치의 평균/표준편차/중간값을 구해보자.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;정답은 다음의 형태를 띄도록 출력해보자.&lt;/u&gt;&lt;/p&gt;
&lt;pre class=&quot;gherkin&quot; style=&quot;background-color: #000000; color: #d5d5d5; text-align: start;&quot;&gt;&lt;code&gt;정답은&amp;nbsp;다음의&amp;nbsp;형태를&amp;nbsp;띄도록&amp;nbsp;하시오.
|년도|나라명&amp;nbsp;개수|mean|std|median|
|---|---|---|---|---|
|내용&amp;nbsp;1|내용&amp;nbsp;2|내용&amp;nbsp;3|내용&amp;nbsp;4|내용&amp;nbsp;5|
|내용&amp;nbsp;5|내용&amp;nbsp;6|내용&amp;nbsp;7|내용&amp;nbsp;8|내용&amp;nbsp;9|
|내용&amp;nbsp;9|내용&amp;nbsp;10|내용&amp;nbsp;11|내용&amp;nbsp;12|내용13|&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 &lt;a href=&quot;https://www.datamanim.com/dataset/03_dataq/pandas_practice.html#id6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그&lt;/a&gt;를 참고해 활용했다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #383838; color: #d5d5d5; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오리지널 데이터프레임 : 나라명, 점수, 상대GDP, 사회적지원, 행복기대치, 선택의 자유도, 관대함, 부패에 대한인식, 년도&lt;/li&gt;
&lt;li&gt;데이터프레임 1 : 나라명, 행복기대치&lt;/li&gt;
&lt;li&gt;데이터프레임 2 : 나라명, 점수, 상대GDP, 사회적지원, 선택의 자유도, 관대함, 부패에 대한인식, 년도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;문제를 풀기 전, 일단 오리지널 데이터프레임에서 데이터프레임1과 2로 나눴다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;cell-squd6s3EW_Hi&quot; style=&quot;color: #d5d5d5; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JMYxo/btsyNpTwVR4/J6fd1aNPLOsTerEOuA7bO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JMYxo/btsyNpTwVR4/J6fd1aNPLOsTerEOuA7bO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JMYxo/btsyNpTwVR4/J6fd1aNPLOsTerEOuA7bO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJMYxo%2FbtsyNpTwVR4%2FJ6fd1aNPLOsTerEOuA7bO1%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;1406&quot; height=&quot;408&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p1YGa/btsyMqk3bu8/wsdnVvtfnVUgpKxa99RCqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p1YGa/btsyMqk3bu8/wsdnVvtfnVUgpKxa99RCqk/img.png&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;612&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;35.51&quot; style=&quot;width: 35.0947%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p1YGa/btsyMqk3bu8/wsdnVvtfnVUgpKxa99RCqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp1YGa%2FbtsyMqk3bu8%2FwsdnVvtfnVUgpKxa99RCqk%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;628&quot; height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFxURj/btsyMMOXlls/glbE4NyjDKwoa9urOzTpQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFxURj/btsyMMOXlls/glbE4NyjDKwoa9urOzTpQ1/img.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;602&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.7425%;&quot; data-widthpercent=&quot;64.49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFxURj/btsyMMOXlls/glbE4NyjDKwoa9urOzTpQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFxURj%2FbtsyMMOXlls%2FglbE4NyjDKwoa9urOzTpQ1%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;1122&quot; height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이순서는 이렇게 정했다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #383838; color: #d5d5d5; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;df1과 df2를 '나라명' 컬럼 기준으로 병합한다.&lt;/li&gt;
&lt;li&gt;완성된 데이터프레임을 '년도' 컬럼 기준으로 그룹화한다. -&amp;gt; 나라명 개수, 행복기대치의 평균, 표준편차, 중간값을 구한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6sYa7/btsyOW4BSBj/wGzUO3z8wk9Sfuy5KWEKmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6sYa7/btsyOW4BSBj/wGzUO3z8wk9Sfuy5KWEKmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6sYa7/btsyOW4BSBj/wGzUO3z8wk9Sfuy5KWEKmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6sYa7%2FbtsyOW4BSBj%2FwGzUO3z8wk9Sfuy5KWEKmk%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;1291&quot; height=&quot;844&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;844&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그룹화하고 나서 각 컬럼에 대해 어떤 집계를 하고 싶을 때 유용한 함수가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 agg이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리 형태로 컬럼에 대해 집계하고 싶은 함수를 매핑해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qi7ul/btsyQrisJ7m/iJ9x1qszIpfc2z7kukt8l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qi7ul/btsyQrisJ7m/iJ9x1qszIpfc2z7kukt8l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qi7ul/btsyQrisJ7m/iJ9x1qszIpfc2z7kukt8l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqi7ul%2FbtsyQrisJ7m%2FiJ9x1qszIpfc2z7kukt8l1%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;1425&quot; height=&quot;504&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#aggregation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;공식 문서&lt;/a&gt;를 보면 많은 함수들이 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;1003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ5Aj1/btsyQdR5CQj/09TpEkLWSsMG08loKluKrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ5Aj1/btsyQdR5CQj/09TpEkLWSsMG08loKluKrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ5Aj1/btsyQdR5CQj/09TpEkLWSsMG08loKluKrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ5Aj1%2FbtsyQdR5CQj%2F09TpEkLWSsMG08loKluKrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;1003&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;1003&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;858&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czujbw/btsyMcUD3i4/eoYvlKo5I6Rbay8LDRtV3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czujbw/btsyMcUD3i4/eoYvlKo5I6Rbay8LDRtV3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czujbw/btsyMcUD3i4/eoYvlKo5I6Rbay8LDRtV3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fczujbw%2FbtsyMcUD3i4%2FeoYvlKo5I6Rbay8LDRtV3k%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;858&quot; height=&quot;222&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;222&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;grouby를 활용하는 방법은 &lt;a href=&quot;https://zephyrus1111.tistory.com/70&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고했다.&lt;/p&gt;</description>
      <category>Machine &amp;amp; Deep Learning/ML &amp;amp; DL</category>
      <category>agg</category>
      <category>groupby</category>
      <category>pd.merge</category>
      <category>데이터분석</category>
      <category>머신러닝</category>
      <category>판다스</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/152</guid>
      <comments>https://azeomi.tistory.com/152#entry152comment</comments>
      <pubDate>Thu, 19 Oct 2023 21:45:05 +0900</pubDate>
    </item>
    <item>
      <title>BFS/DFS 는 어떤 상황에 적합한거지?!  </title>
      <link>https://azeomi.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그래프와 BFS/DFS 코딩 테스트를 풀다 보면 어떤 문제는 BFS가 적절하고, 어떤 문제는 DFS 이고 어쩔 땐 둘 다 가능한 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우를 헷갈리지 않기 위해 상황 별 정리를 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kasterra/%ED%95%B5%EC%8B%AC-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%9E%98%ED%94%84-%EC%B5%9C%EB%8B%A8-%EA%B2%BD%EB%A1%9C-%ED%83%90%EC%83%89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이  글&lt;/a&gt; 에서 그래프의 최단경로를 구하는 방법이 잘 정리되어 있어서 참고했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. BFS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너비 우선 탐색으로, 그래프에서 쓰일 수 있는 탐색 알고리즘이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS는&lt;u&gt; '가중치가 없는 그래프의 최단경로를 찾는 경우'&lt;/u&gt;에 사용될 수 있다. 그래서 최단거리의 합(또는 길이)를 출력하거나 최단 거리의 경로가 무엇인지 출력하는 문제에 적합하다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;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;새로운 노드를 탐색할 때, 그 전 단계의 거리에 +1 을 해주면 된다.&lt;/li&gt;
&lt;li&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djSxJw/btsysqLhEyM/u3oQjKeqqNr4Tnh6PCZhYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djSxJw/btsysqLhEyM/u3oQjKeqqNr4Tnh6PCZhYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djSxJw/btsysqLhEyM/u3oQjKeqqNr4Tnh6PCZhYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjSxJw%2FbtsysqLhEyM%2Fu3oQjKeqqNr4Tnh6PCZhYK%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;532&quot; height=&quot;375&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;직접 풀어보고 적기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;2. DFS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;3. 구현 시 도움되는 것들&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대 거리 또는 최소 거리 출력할 때 count 비교하면서 리스트에 저장하기 (다 저장하지말고)&lt;/li&gt;
&lt;li&gt;경로 리스트 출력할 때 print(*list) 하면 값만 출력됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study/Algorithm</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/151</guid>
      <comments>https://azeomi.tistory.com/151#entry151comment</comments>
      <pubDate>Fri, 13 Oct 2023 12:05:50 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리 챌린지] DFS / 두 방향 탈출 가능 여부 판별하기</title>
      <link>https://azeomi.tistory.com/149</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2042&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beMNxY/btsuCHdx4do/KBQJaecKIa0qycans8TPz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beMNxY/btsuCHdx4do/KBQJaecKIa0qycans8TPz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beMNxY/btsuCHdx4do/KBQJaecKIa0qycans8TPz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeMNxY%2FbtsuCHdx4do%2FKBQJaecKIa0qycans8TPz1%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;2042&quot; height=&quot;1244&quot; data-origin-width=&quot;2042&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZMhIv/btsuQRMfMn3/Lak3S7Or2wKVKkcWPTUQO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZMhIv/btsuQRMfMn3/Lak3S7Or2wKVKkcWPTUQO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZMhIv/btsuQRMfMn3/Lak3S7Or2wKVKkcWPTUQO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZMhIv%2FbtsuQRMfMn3%2FLak3S7Or2wKVKkcWPTUQO0%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;1342&quot; height=&quot;1304&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;1304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&quot;&gt;https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1695141070543&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&quot; data-og-description=&quot;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&quot; data-og-host=&quot;www.codetree.ai&quot; data-og-source-url=&quot;https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&quot; data-og-url=&quot;https://codetree.ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wIaDY/hyTZb6FdHX/tiJBKeArC4j6aK1DmGXlqK/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.codetree.ai/missions/2/problems/determine-escapableness-with-2-ways?&amp;amp;utm_source=clipboard&amp;amp;utm_medium=text&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wIaDY/hyTZb6FdHX/tiJBKeArC4j6aK1DmGXlqK/img.png?width=3508&amp;amp;height=3508&amp;amp;face=0_0_3508_3508');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코드트리 | 코딩테스트 준비를 위한 알고리즘 정석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.codetree.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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 기초를 확인할 수 있는 쉬운 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 탈출 격자까지 도달했는지 유무를 더 쉽게 확인할 수 있는 방법을 기억하기 위해 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 짠 방법 : global result 변수를 사용해 매번 만나는 (x, y) 좌표가 탈출 좌표 이면 result를 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 쉬운 방법 : visited[n-1][m-1]이 '1' 인지 '0' 인지 출력하면 됨. 1이면 그 격자까지 도달한 것이기 때문에.&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;pre id=&quot;code_1695141155012&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
visited = [[False]*(m) for _ in range(n)]

dx = [1, 0] # 아래, 오른쪽
dy = [0, 1]
result = 0

def dfs(x, y, visited):
    global result
    visited[x][y] = True    # 방문표시
    if (x, y) == (n-1, m-1):
         result += 1
    for d in range(2):
        nx = x + dx[d]
        ny = y + dy[d]
        
        if nx &amp;lt; 0 or nx &amp;gt;= n or ny &amp;lt; 0 or ny &amp;gt;= m: # 격자를 벗어나면 패스
            continue
        if graph[nx][ny] == 0:  # 뱀이 있는 경우, 패스
            continue
        if not visited[nx][ny]: # 방문하지 않았으면,
            visited[nx][ny] = True 
            dfs(nx, ny, visited)
dfs(0, 0, visited)
print(result)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Study/Algorithm</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코딩테스트실력진단</category>
      <author>azeomi</author>
      <guid isPermaLink="true">https://azeomi.tistory.com/149</guid>
      <comments>https://azeomi.tistory.com/149#entry149comment</comments>
      <pubDate>Wed, 20 Sep 2023 01:36:17 +0900</pubDate>
    </item>
  </channel>
</rss>