<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>on_learning</title>
    <link>https://sanmldl.tistory.com/</link>
    <description>인공지능을 공부해보자</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 12:09:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>알파고라니</managingEditor>
    <image>
      <title>on_learning</title>
      <url>https://tistory1.daumcdn.net/tistory/5780004/attach/e1e88ebeb3684849a64ef53fda91ebf6</url>
      <link>https://sanmldl.tistory.com</link>
    </image>
    <item>
      <title>파이썬 문자열 다루는 방법 1</title>
      <link>https://sanmldl.tistory.com/83</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;개발을 하면 문자열을 다루는 경우가 많습니다. 사용자 입력, 로그 출력, 에러 메세지 출력 등 문자열 처리 코드는 어디에도 빠지지 않는 것 같습니다. 단순히 입출력용이 아니더라도 데이터 처리, 통신, 저장, 분석에 사용되는 핵심 요소로서 사용되기도 합니다. 그래서 이번 포스팅에서는 Pythonic하게 문자열을 다루는 방법에 대해 알아봅시다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;bytes와 str&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3에서는 문자열 데이터와 시퀀스를 표현하는 두 가지 타입이 있습니다. bytes와 str인데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 차이는 아래와 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bytes: 기계가 이해할 수 있도록 부호가 없는 8바이트 데이터(종종 아스키(ASCII) 인코딩을 써서 내부 문자를 표시한다고 합니다.)&lt;/li&gt;
&lt;li&gt;str: 사람이 읽을 수 있는 텍스트 데이터(유니코드 코드 포인트가 들어 있습니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 각 인스턴스를 출력해보면 다르다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1751208347621&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;text = 'pythonic'  # str 인스턴스 생성
text_to_bytes = text.encode('utf-8)  # bytes 인스턴스 생성을 위한 encoding

print(f'str 인스턴스 출력: {text}, bytes 인스턴스 출력: {text_to_bytes}')&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;str 문자열을 인코딩하여 bytes로 표현하는 이유는 서로 직접 대응하는 이진 또는 텍스트 인코딩이 없기 때문입니다. str의 유니코드 데이터를 이진 데이터(bytes)로 변환하려면 str의 encode 메서드를 위의 예시처럼 호출해야 합니다. (그 반대는 bytes의 decode 메서드를 호출 합니다.) 일반적으로는 UTF-8이 시스템 디폴트 인코딩 방식이라고 합니다.&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;- 유니코드 샌드위치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;effective python 저자는 '파이썬 프로그램을 작성할 때 유니코드 데이터를 인코딩하거나 디코딩하는 부분을 인터페이스의 가장 먼 경계 지점에 위치시켜라'라고 합니다. 이를 유니코드 샌드위치라고 합니다. 조금 쉽게 설명하면 프로그램 핵심 부분은 str을 사용하고 문자 인코딩에 대해 어떠한 가정을 하면 안된다는 것입니다. 즉 입출력에서 bytes를 다루되 프로그램 내부에서는 항상 유니코드의 str로 처리하라는 뜻입니다. 이러한 접근 방식은 다양한 텍스트 인코딩(ex. cp949, euc-kr ..)을 입력 데이터로 받아들이면서 동시에 출력 텍스트는 한가지로 제한할 수 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;텍스트 인코딩이란?&lt;br /&gt;텍스트를 바이트로 바꾸는 인코딩 방식(규칙)입니다. ASCII, UTF-8 등이 있으며 가령 csv 파일 로드했을 때 이상한 문자열( &lt;br /&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;따라서 주로 두 가지를 변환해주는 도우미 코드를 자주 사용합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;byte나 str 인스턴스를 받아서 항상 str 반환하게 하기&lt;/li&gt;
&lt;li&gt;byte나 str 인스턴스를 받아서 항상 bytes 반환하게 하기&lt;/li&gt;
&lt;/ol&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;파이썬 내장 함수인 open을 통해 얻은 파일 핸들과 관련된 연산들이 디폴트로 유니코드 문자열(str)을 요구합니다. 이로 인해 이진 데이터를 파일에 쓰려고 한다면 오류가 납니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751209553160&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 이진 바이트 문자열 파일 핸들 오류

with open('byte_data.bin', 'w') as f:
	f.write(b'\xfq\xf2\xf3\xf4\xf5')
    
# TypeError: write() argument must be str, not bytes&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;다행히 파일을 열 때 이진 쓰기 모드('wb'), 텍스트 쓰기 모드('w' )가 있어 자유롭게 사용할 수 있습니다. 파일을 쓸 때와 마찬가지로 읽을 때도 이진 바이트 데이터인지 유니코드 데이터인지에 따라 모드를 변경하면 됩니다('rb'와 'r'). 각 모드에서 bytes.encode, str.decode가 수행되어 각 문자열을 해석한다고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 파이썬은 친절해서 open함수의 encoding 파라미터로 명시하게 도와줍니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751209920835&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# encoding 파라미터 사용 예시

with open('data.bin', 'r', encoding='cp1252') as f:
	data = f.read()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/effective python</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/83</guid>
      <comments>https://sanmldl.tistory.com/83#entry83comment</comments>
      <pubDate>Mon, 30 Jun 2025 00:13:46 +0900</pubDate>
    </item>
    <item>
      <title>빅오(Big-O)란?</title>
      <link>https://sanmldl.tistory.com/82</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;빅오는 알고리즘 공부를 하면 반드시 다루는 중요한 주제이다. Computer science에서 빅오는 입력값이 커질 때 알고리즘 실행 시간(시간복잡도), 공간 요구사항(공간 복잡도)가 어떻게 증가하는지를 분류하는 데 사용된다. 즉 알고리즘이 얼마나 효율적인지 판단하는 지표라는 것을 의미한다. 이번 포스팅에서 빅오로 알고리즘의 효율성을 어떻게 표현하는 지 알아보자.&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;빅오(Big-O)란 입력이 무한대로 커질때 함수의 상한을 설명하는 수학적 표기 방법을 일컫는다. 실행 시간의 관점에서는 점근적 실행 시간을 표기한다(= 시간 복잡도)라고 하는데 쉽게 설명하면 입력값 n이 커질 때(무한대를 향할때), 함수의 실행 시간의 추이를 의미한다고 보면 된다. 컴퓨터의 연산 능력으로 인해 아무리 복잡한 알고리즘이라도 입력의 크기가 작으면 금방 돌아가기 때문에 빅오에서 관심 있는 것은 &lt;b&gt;입력의 크기&lt;/b&gt;이다.&amp;nbsp; 입력이 큰 경우에는 알고리즘의 효율성에 따라 수행 시간에 큰 차이가 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 빅오로 시간 복잡도를 표현하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도는 앞서 살펴본대로 어떤 알고리즘을 수행하는 데 걸리는 시간을 설명하는 계산 복잡도를 의미한다. 이때 이 계산 복잡도를 빅오로 표현하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 입력값 n에 대하여 $4n^3+3n^2+6$ 번 계산이 실행되는 함수가 있다고 한다면 빅오는 최고차항인 $4n^3$만을 고려하여 O($n^2$)으로 표기한다. 다음과 같은 빅오 표기법이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;O(1)&lt;/li&gt;
&lt;li&gt;O(log n)&lt;/li&gt;
&lt;li&gt;O(n)&lt;/li&gt;
&lt;li&gt;O(n log n)&lt;/li&gt;
&lt;li&gt;O($n^2$)&lt;/li&gt;
&lt;li&gt;O($2^n$)&lt;/li&gt;
&lt;li&gt;O(n!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJStJ/btsOW6QrsIR/vwtJMho3NFpdKAk0KIDbAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJStJ/btsOW6QrsIR/vwtJMho3NFpdKAk0KIDbAk/img.png&quot; data-alt=&quot;출처: https://bblackscene21.tistory.com/7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJStJ/btsOW6QrsIR/vwtJMho3NFpdKAk0KIDbAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJStJ%2FbtsOW6QrsIR%2FvwtJMho3NFpdKAk0KIDbAk%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;706&quot; height=&quot;415&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://bblackscene21.tistory.com/7&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;각 표기법은 순서대로 효율적이라고 볼 수 있다. 단순하게 n, $2^n$에 각각 100을 대입해보면 큰 차이가 나는 것을 알 수 있을 것이다.(클 수록 그 차이는 더 커짐)&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 빅오, 빅오메가, 빅세타란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅오(Big-O), 빅오메가(Big-&amp;Omega;), 빅세타(Big-&amp;Theta;)는 알고리즘의 실행 상한,하한 그리고 평균을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 빨리 실행될 때 하한, 가장 늦게 실행될 때는 상한을 뜻하며 각각 빅오메가, 빅오로 지칭한다. Chatgpt에게 물어보니 요약을 해줘서 표를 가져와봤다.&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;스크린샷 2025-06-27 오후 7.49.24.png&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yQULO/btsOWrAz4zw/lqGOxhZoErhtEJCHnAQJW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yQULO/btsOWrAz4zw/lqGOxhZoErhtEJCHnAQJW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yQULO/btsOWrAz4zw/lqGOxhZoErhtEJCHnAQJW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyQULO%2FbtsOWrAz4zw%2FlqGOxhZoErhtEJCHnAQJW0%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;763&quot; height=&quot;197&quot; data-filename=&quot;스크린샷 2025-06-27 오후 7.49.24.png&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;484&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;b&gt;이러한 표현은 반은 맞고 반은 틀리다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상한을 최악의 경우와 혼동하기 쉽다. 그러나 상한을 나타내는 빅오 표기법은 정확하게 표현하지 못하는 함수(알고리즘)에 대하여 적당히 정확하게 표현하는 방법이지 최악의 시간 복잡도와는 상관이 없는 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퀵 정렬을 예를 들어 설명하면 입력값이 [1, 4, 3, 7, 8, 6, 5] 일 때 퀵정렬 최선의 경우에 해당한다. 퀵정렬을 수행하면 총 18번의 비교, 스왑 연산이 이뤄진다. 반면 입력값이 [1, 2, 3, 4, 5, 6, 7]이면 총 48번의 연산이 이뤄진다. 이 경우가 최악의 시간 복잡도인 경우이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최선의 경우에 대하여 가장 fit하게 상한을 나타냈을 때 O(n log n), 최악의 경우에 대하여 가장 fit하게 상한을 나타내면 O($n^2$)가 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 빅오 표기법은 주어진 경우(최선/최악/평균) 경우의 수행 시간의 &lt;b&gt;'상한'&lt;/b&gt;을 나타내는 것이다. 그래서 정의적으로는 퀵정렬의 예시에서 최선의 경우 O($n^3$)도 맞는 표현이다. 그러나 아무의미가 없기 때문에 fit하게 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;참고자료&lt;br /&gt;[1] 빅오 개념: &lt;a href=&quot;https://developer-cat.tistory.com/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer-cat.tistory.com/3&lt;/a&gt; &amp;nbsp;&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;</description>
      <category>Study/코딩테스트</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/82</guid>
      <comments>https://sanmldl.tistory.com/82#entry82comment</comments>
      <pubDate>Fri, 27 Jun 2025 20:19:49 +0900</pubDate>
    </item>
    <item>
      <title>파이썬스러운 예외 처리 방법</title>
      <link>https://sanmldl.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬에서는 예외를 처리하는 과정에서 특정 동작을 수행하려면 4가지 경우를 고려하여 조합해 사용할 수가 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 구조를 잘 활용하면 예외 처리 로직이 명확해지고, 버그가 줄어들며, 코드 유지보수가 쉬워집니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 네 가지 예외처리 블록&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;파이썬에서는 기본적으로 try, except, else, finally의 네 가지 블록을 조합하여 예외 처리를 할 수 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&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;try&lt;/b&gt;: 예외가 발생할 수 있는 코드를 실행하는 블록입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;except&lt;/b&gt;: 예외가 발생했을 때 실행되는 블록입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;else&lt;/b&gt;: 예외가 발생하지 않았을 때만 실행되는 블록입니다. (try가 성공했을 때 실행)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;finally&lt;/b&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;try, except는 예외 처리시에 자주 사용하는 블록입니다. try 블록 안에 처리 코드를 넣고 except에서 예외 처리를 하는 식입니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;else 블록은 &lt;b&gt;예외가 발생하지 않았을 때만 실행되므로&amp;nbsp; &lt;/b&gt;try 블록 안을 최소한으로 유지하고, &lt;b&gt;정상 실행 로직은 else에&lt;/b&gt; 두면 예외 처리와 정상 흐름이 명확히 분리됩니다. 이는 정상적인 흐름을 분리하여 가독성을 높여줍니다. (except와 분리되어 성공 여부 구분 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한&amp;nbsp;finally는 파일 닫기, 네트워크 연결 종료 등 &lt;b&gt;정리(clean-up)&lt;/b&gt; 작업을 위해 사용됩니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;try가 성공적으로 처리되고 finally 블록이 공통적인 정리 작업을 수행하기 전에 실행할 코드가 있다면 else 블록을 사용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746972354494&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 네 가지 예외처리 예시 코드
UNDEFINED = object()

def divide_json(path):
	print('파일열기')
    handle = open(path, 'r+')
    try:
    	print('* 데이터 읽기')
        data = handle.read()
        print('* json 데이터 읽기')
        op = json.loads(data)
        print('* 나눗셈 계산')
        value = op=['numerator'] / op['denominator']
    except:
    	print('* 0 나눗셈 예외 처리')
        return UNDEFINED
    else:
    	print('* 정상 계산 결과')
        op['result'] = value
        result = json.dumps(op)
        handle.seek(0)
        handle.write(result)
        return value
     finally:
     	print('* clean up 수행')
        handle.close()&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;span style=&quot;color: #000000;&quot;&gt;코드 예시를 실행시키며 예외가 어디서 호출되는 지 그 경우에 어떤 블록까지 실행되는 지 파악해보면 바로 이해가 될 것입니다.&lt;/span&gt;&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;2. contextlib과 with 문을 사용하여 예외처리&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;예외 처리를 하게 되는 것을 알게 되면 이를 반복적으로 사용하고 싶을 때가 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어 파일을 열고 닫을 때, lock을 걸고 반드시 해제할 때 등이 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그럴 때 보통 try 블록에서 특정 기능을 수행하고, finally에서 정리 작업을 반복적으로 사용하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1746973870384&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# lock 설정/해제 예시

from threading import Lock
lock = Lock()
lock.acquire()

try: 
	# 특정 작업 수행
finally:
	# 정리작업
    lock.release()&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;span style=&quot;color: #000000;&quot;&gt;이렇게 반복적으로 사용하다보면 중복 코드도 많아지고, 버그도 찾기 어려워진다는 단점이 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래서 이를 재사용 가능하게 하는 방식이 contextlib과 with문을 사용는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;with를 사용하는 경우&lt;/b&gt;는 위의 코드 예시에서 acquire에 대응하는 release를 실수로 빠뜨리는 경우를 방지하게 해주며, 반복사용에 용이합니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들면 다음과 같습니다.(위의 코드예시와 비교해보세요)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1746973993415&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from threading import Lock

lock = Lock()
with lock:
	# 특정 작업(기능) 수행&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;span style=&quot;color: #000000;&quot;&gt;contextlib 내장 모듈을 사용하는 경우는 우리가 만든 객체나 함수를 with 문에 쉽게 쓰기 위함의 경우입니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;contextmanager 데코레이터를 사용하여 복잡한 try/finally 블록을 함수처럼 포장해서 with 문으로 쓸 수 있게 해주는 것입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746974309319&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시 코드
from contextlib import contextmanager

@contextmanager
def my_context():
    # 진입 시 동작
    print(&quot;자원 준비&quot;)
    try:
        yield &quot;사용할 값&quot;
    finally:
        # 정리(clean-up) 동작
        print(&quot;자원 정리&quot;)
        
 with my_context() as val:
 	print('내부 실행', val)&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;span style=&quot;color: #000000;&quot;&gt;contextmanager가 yield 하는 값은 with 문의 as 부분에 전달되어, 특별한 컨텍스트 내부에서 실행되는 코드 안에서 직접 그 컨텍스트에 접근할 수 있게 합니다. 이를 활용해서 예외 처리 로직을 반복 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/effective python</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/80</guid>
      <comments>https://sanmldl.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 11 May 2025 23:59:58 +0900</pubDate>
    </item>
    <item>
      <title>Pythonic Thinking</title>
      <link>https://sanmldl.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pythonic Thinkning는 파이썬스러운 사고방식을 뜻하는 데, 이는 파이썬으로 코딩할 때 내가 파이썬스러운, 파이썬의 의도에 맞게 생각하고 있는 지 등 문법을 넘어서 그 철학과 문화를 이해하는 것을 의미합니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬은 문법이 쉬운 만큼 누구나 빠르게 시작할 수 있긴 하지만, 시간이 지날수록 협업의 관점에서 &amp;ldquo;파이썬답게&amp;rdquo; 쓰는 것이 얼마나 중요한 지를 깨닫게면서 python thinking의 필요성을 느끼는 것 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬 철학은 import this를 입력하면 볼 수 있는 Zen of python에서 잘 나타납니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순함이 복잡함보다 낫다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가독성은 중요하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특별한 경우는 많지 않지만, 그런 경우조차도 일관성이 중요하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-05 오후 8.44.19.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxrikp/btsNMdDdrsJ/BTDknVP11buSoQxuz8Nmg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxrikp/btsNMdDdrsJ/BTDknVP11buSoQxuz8Nmg1/img.png&quot; data-alt=&quot;zen of python 리스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxrikp/btsNMdDdrsJ/BTDknVP11buSoQxuz8Nmg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxrikp%2FbtsNMdDdrsJ%2FBTDknVP11buSoQxuz8Nmg1%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;653&quot; height=&quot;541&quot; data-filename=&quot;스크린샷 2025-05-05 오후 8.44.19.png&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;zen of python 리스트&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;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 파이썬의 철학은 단지 말에서 그치는 것이 아니라, 실제 파이썬 코드를 작성할 때의 스타일, 구조, 표현 방식에 큰 영향을 주는 것 같습니다. 이를 잘 반영한 대표적인 요소들은 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 코딩 스타일과 컨벤션&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;a style=&quot;color: #000000;&quot; href=&quot;https://peps.python.org/pep-0008/&quot;&gt;PEP8&lt;/a&gt;: 파이썬 공식 스타일 가이드로, 들여쓰기, 공백, 변수명 규칙 등을 정의.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들면 list_of_items와 같이 스네이크 케이스(snake_case)를 사용하고, &lt;b&gt;4칸 들여쓰기&lt;/b&gt;를 지키는 것이 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 간결하지만 명확한 코드&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;의도가 명확히 드러나는 코드&lt;/b&gt;가 좋은 코드입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들면 너무 복잡한 list comprehension은 피하는 것이 Pythonic하다는 것입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 표준 라이브러리 우선 활용&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;파이썬은 &amp;ldquo;배터리가 포함된 언어(batteries included)&amp;rdquo;입니다. 이는 파이썬이 기본 설치만으로도 풍부한 기능을 제공한다는 것을 비유적으로 표현한 것입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;복잡한 기능도 itertools, collections, functools, pathlib 등 표준 라이브러리로 우선 해결할 수 있습니다.&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;파이썬 코딩의 기술 책을 보면 실제로&amp;nbsp;enumerate, zip, collections, itertools 등은 반복문이나 데이터 처리에서 훨씬 더 우아하고 읽기 쉬운 코드를 만들어 준다고 언급하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 95px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 10px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상황&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 10px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Pythonic 방식&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 리스트 순회 중 인덱스가 필요&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; enumerate()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 두 리스트를 함께 반복&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; zip()&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 딕셔너리 누적 카운트&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; defaultdict or Counter&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 조건이 많을 때 가독성 유지&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; match-case (Python 3.10+)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 파일 경로 처리&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자열 직접 조작 대신 pathlib 사용&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 에러를 무조건 막기보다는, 명시적으로 다루기&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;try/except 구조를 사용하되, &lt;b&gt;어떤 예외를 왜 처리하는지&lt;/b&gt; 명확히 해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;ldquo;Easier to ask for forgiveness than permission(EAFP)&amp;rdquo; 패턴을 자주 씁니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이번 포스팅 내용을 정리하자면&amp;nbsp; Pythonic Thinking이란, 파이썬의 철학을 코드에 녹여&amp;nbsp;&lt;b&gt;명확하고, 단순하며, 가독성 높은 코드를 작성하는 습관이며, &lt;/b&gt;그 첫걸음은 문법을 넘어, &lt;b&gt;왜 그렇게 코딩하는지를 이해하는 것&lt;/b&gt;이고, 두 번째는 이를 &lt;b&gt;내장 함수와 구조로 실천하는 것&lt;/b&gt;이라고 할 수 있겠습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추가적으로 파이썬에서 자주 쓰이는 전문 용어나, 약어 등을 알고 싶다면 &lt;a title=&quot;python glossary&quot; href=&quot;https://docs.python.org/3/glossary.html 이 링크는 Python 공식 문서의 용어집(Glossary) 페이지야.&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.python.org/3/glossary.html&amp;nbsp;&lt;/a&gt;를 참고하면 도움이 됩니다!&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;python glossary에는 &lt;br /&gt;&lt;b&gt;1. 언어적 개념(iterable, generator, callable, context manager, coroutine)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. 파이썬의 스타일과 철학 EX. EAFP (Easier to Ask Forgiveness than Permission) LBYL (Look Before You Leap) duck typing (덕 타이핑) GIL (Global Interpreter Lock) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;3. 실행환경 개념 예: CPython, PyPy (파이썬 구현체) bytecode (바이트코드), interpreter &lt;/b&gt;&lt;br /&gt;&lt;b&gt;4.표준 라이브러리 용어 예: name, main, magic method, module, package &lt;/b&gt;&lt;br /&gt;&lt;b&gt;5. 특수 문법 관련 예: comprehension, slice, decorator, f-string&lt;/b&gt;&lt;br /&gt;에 대한 내용이 담겨 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/effective python</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/79</guid>
      <comments>https://sanmldl.tistory.com/79#entry79comment</comments>
      <pubDate>Mon, 5 May 2025 20:58:48 +0900</pubDate>
    </item>
    <item>
      <title>Effective python 소개</title>
      <link>https://sanmldl.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Effective python 카테고리에서는 파이썬 개발자로서 더 나은 코드, 더 안정적인 아키텍처, 더 효율적인 성능을 고민했던 내용들에 대해&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설명하고 공유하고자 합니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;개념이나 실전 예제와 같은 경우는&amp;nbsp;&lt;/span&gt;&lt;i&gt;Brett Slatkin&lt;/i&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;의 『파이썬 코딩의 기술(Effective Python) 2판』을 기반으로 할 예정입니다. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 문법을 아는 것을 넘어, &lt;b&gt;&amp;ldquo;왜 그렇게 코딩해야 하는가?&amp;rdquo;&lt;/b&gt;, &lt;b&gt;&amp;ldquo;어떤 방식이 파이썬스럽고 효율적인가?&amp;rdquo;&lt;/b&gt;를 고민한 내용을 같이 공유하고 살펴보는 시간이 되기를 소망합니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개인적으로는 effective python 카테고리의 글을 쓰면서 이를 실전에서 어떻게 써먹을 지 고민하면서, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬 초급 개발자에서 중급 개발자로 성장하는 계기가 되면 좋겠습니다.&lt;/span&gt;&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;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;개발자의 시각에서 직접 실습하고 정리&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;책에 나오는 내용을 바탕으로, &lt;b&gt;필요한 개념 설명 + 실전 코드 예시 + 실제 개발에서의 활용 방식&lt;/b&gt;을 중심으로 구성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;효율적인 함수/클래스/모듈 구조 설계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;파이썬다운(Pythonic) 코드 작성법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병렬 처리, 제너레이터, 컨텍스트 매니저 등 실무 고급 기술&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&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;위에서 언급한 내용에 대해서 관심이 있는 파이썬 개발자들의 많은 관심 부탁드리며, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관련 질문과 조언은 언제나 환영입니다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming/effective python</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/78</guid>
      <comments>https://sanmldl.tistory.com/78#entry78comment</comments>
      <pubDate>Mon, 5 May 2025 19:41:44 +0900</pubDate>
    </item>
    <item>
      <title>불균형한 데이터 세트에서 모델을 학습하는 방법</title>
      <link>https://sanmldl.tistory.com/77</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&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;letter-spacing: 0px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&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;&lt;span&gt;불균형 데이터는 특정 클래스의 샘플 수가 다른 클래스보다 현저히 적거나 많은 경우를 의미한다.&amp;nbsp; &lt;/span&gt;&lt;span&gt;이로 인해 모델이 다수 클래스를 과도하게 학습하고, 소수 클래스에 대해 제대로 학습하지 못하는 문제가 발생한다. &lt;/span&gt;&lt;span&gt;이 문제를 해결하는 접근법은 크게 두 가지로 나뉜다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;데이터 레벨에서 해결&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 데이터 자체를 조정하여 균형을 맞추는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;알고리즘 레벨에서 해결&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- 학습 과정에서 모델이 불균형을 고려하도록 하는 방법&lt;/span&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;&lt;b&gt;&lt;span&gt;1. 데이터 레벨에서 다루기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 레벨에서 해결한다는 것은 데이터 자체를 변형하거나 증강하여 균형을 맞추는 방법을 의미한다. 주로 지도학습(supervised learning)에서 사용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zayuh/btsMykq2ScR/qUkienu3PRUfaQPE6d7szK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zayuh/btsMykq2ScR/qUkienu3PRUfaQPE6d7szK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zayuh/btsMykq2ScR/qUkienu3PRUfaQPE6d7szK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzayuh%2FbtsMykq2ScR%2FqUkienu3PRUfaQPE6d7szK%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;842&quot; height=&quot;264&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1-1 언더샘플링 (Undersampling)&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다수 클래스를 줄여서 균형을 맞추는 방법으로, 주요 기법은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-pm-slice=&quot;3 1 []&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;랜덤 언더샘플링&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 무작위로 다수 클래스 데이터를 줄이는 방법이지만, 중요한 정보를 잃을 위험이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;NearMiss&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 다수 클래스 데이터 중 소수 클래스와 가장 유사한 샘플만 남기는 기법으로, 데이터 손실을 최소화하면서 불균형을 해결할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;1-2 오버 샘플링 (Oversampling)&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&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&gt;&lt;b&gt;랜덤 오버샘플링&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 단순히 부족한 클래스를 복제하여 개수를 늘리는 방법이다. 이 방법은 부족한 클래스의 데이터 자체를 복사해서 넣는 방식이므로 데이터의 다양성이 부족해진다는 문제가 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SMOTE (Synthetic Minority Over-sampling Technique)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 소수 클래스 샘플들 사이에서 새로운 데이터를 생성하는 방법으로, 데이터의 다양성을 유지하면서 불균형을 완화할 수 있다는 장점이 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;ADASYN (Adaptive Synthetic Sampling)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: SMOTE와 유사하지만, 학습이 어려운 샘플 근처에서 데이터를 더 많이 생성하는 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1-3&amp;nbsp; 데이터 증강 (Data Augmentation)&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이미지나 텍스트 데이터에서는 데이터 증강을 통해 부족한 클래스의 데이터를 보강할 수 있다. 데이터가 어떤 특징을 가지고 있는 지에 따라 다양한 증강 기법이 적용된다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-pm-slice=&quot;3 3 []&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;이미지 데이터&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 회전, 크롭, 밝기 조정, 좌우 반전 등의 기법 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;텍스트 데이터&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 동의어 교체, 문장 구조 변경, 역번역(Back Translation) 등을 활용하여 데이터 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;2. 알고리즘 레벨에서 해결하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;알고리즘 레벨에서 해결한다는 것은 데이터를 변경하지 않고, 모델이 불균형을 고려할 수 있도록 학습 방식을 조정하는 방법을 통칭하는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2-1&amp;nbsp; 가중치 조정 (Class Weighting)&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;손실 함수에서 소수 클래스(라벨링 기준)에 더 높은 가중치를 부여하여 모델이 해당 클래스를 더 중요하게 학습하도록 유도할 수 있다. 이미 구현된 머신러닝, 딥러닝 프레임워크나 라이브러리에서 적용할 수 있다. 예를 들어 &lt;/span&gt;PyTorch나 TensorFlow에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;class_weight&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옵션을 활용하여 가중치를 조정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2-2&amp;nbsp; 특수한 손실 함수 사용&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;불균형 데이터에 적응하여 학습하도록 유도하는 손실함수도 있다. 가령 분류 task에서 크로스 엔트로피 손실 함수 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Focal Loss&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 사용하면 효과적이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Focal Loss&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 학습이 어려운 샘플(소수 클래스)에 더 큰 가중치를 부여하는 손실 함수로, 모델이 해당 클래스를 학습하도록 유도한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2-3&amp;nbsp; 앙상블 학습 (Ensemble Learning)&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여러 개의 모델을 조합하는 앙상블 방법도 효과적이다. 특히&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Bagging&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Boosting&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기법을 활용하면 모델이 불균형한 데이터를 더 잘 다룰 수 있다. 대표적인 알고리즘으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Balanced Random Forest&lt;/b&gt;&lt;/span&gt;&lt;span&gt;나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;XGBoost의 가중치 조정&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&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;style5&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;3. 평가 방법 고려하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&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&gt;예를 들어 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;불균형 데이터 셋에서&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;단순히 정확도(Accuracy)를 평가 지표로 사용하면 정확한 평가 척도로 사용되지 않는다. &lt;/span&gt;&lt;span&gt;가령 전체 데이터 중 99%가 정상 거래이고 1%만이 사기 거래인 데이터 세트에서 모든 데이터를 정상 거래로 예측하면 99%의 정확도를 얻을 수 있지만, 이는 무용지물인 것과 같다. 이러한 점을 고려했을 때 생각해 볼 수 있는 평가 지표는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정밀도(Precision)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 모델이 예측한 긍정 클래스 중 실제로 맞는 비율&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;재현율(Recall)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 실제 긍정 클래스 중 모델이 맞게 예측한 비율&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;F1-score&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 정밀도와 재현율의 조화 평균으로, 불균형 데이터에서 유용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;AUC-ROC Curve&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 모델이 클래스 구분을 얼마나 잘하는지 평가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;4. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이번 포스팅에서는 불균형한 데이터 세트를 다룰 때 어떠한 기법을 적용할 수 있는 지 알아봤다.&amp;nbsp; &lt;/span&gt;&lt;span&gt;보다 자세하게 어떻게 적용하는지는 다른 포스팅에서 따로 언급을 하겠다. &lt;/span&gt;&lt;span&gt;내용을 정리해보면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #000000; text-align: start;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Oversampling, Undersampling, Data Augmentation을 활용하여 데이터 자체를 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;가중치 조정, 특수한 손실 함수, 앙상블 학습&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;등을 적용하여 알고리즘을 조정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정확도 외에 F1-score, AUC-ROC 등의 평가 지표&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 활용하여 모델 검증&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인공지능/ML-DL 기초</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/77</guid>
      <comments>https://sanmldl.tistory.com/77#entry77comment</comments>
      <pubDate>Thu, 27 Feb 2025 21:09:13 +0900</pubDate>
    </item>
    <item>
      <title>Cross-Entropy란?</title>
      <link>https://sanmldl.tistory.com/76</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;딥러닝 모델을 활용하여 다양한 task를 해결하는 데 다양한 loss function이 사용된다. 그중 분류와 같은 task에서 정답과 예측 값의 확률 분포를 차이를 좁히는 방식으로 모델이 학습한다. 이때 사용되는 loss가 cross-entropy loss이다.&amp;nbsp; 이번 포스팅에서 cross entropy에 대해 알아보자!&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;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cross Entropy의 개념을 알기 위해선 먼저 알아야 할 개념이 있다. 바로 &quot;Entropy&quot; 이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Entropy&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entropy(엔트로피)는 정보 이론에서의 정보량에 대한 기댓값을 의미한다. &lt;b&gt;이는 정보의 불확실성을 나타내며 이 값이 높을수록 다양한 정보가 많아 확률이 낮다는 것을 의미한다. &lt;/b&gt;가령 (1) 주머니 속에 빨간 공, 파란 공, 노란 공, 초록공이 있는 경우와 (2) 빨간 공, 파란 공만 들어있는 두 경우에 대해 생각해 보면, 전자의 경우에 엔트로피가 더 높다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수식적으로는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQDOX4/btsJSQzH3bm/TtGpzLo9k1MYr0K2QGuFN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQDOX4/btsJSQzH3bm/TtGpzLo9k1MYr0K2QGuFN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQDOX4/btsJSQzH3bm/TtGpzLo9k1MYr0K2QGuFN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQDOX4%2FbtsJSQzH3bm%2FTtGpzLo9k1MYr0K2QGuFN1%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;294&quot; height=&quot;78&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;78&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;P(xi)는 정보(요소들)에 대한 확률을 의미한다. 동전 던지기에서 앞면이 나올 확률과 뒷면이 나올 확률이 각각 1/2 인 것과 같다. 정량적인 비교를 위해 위의 예시에서 엔트로피를 수식에 대입해 보자. (색깔별로 공은 하나가 있다고 가정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 번 주머니의 경우 = -(1/4 * log 1/4 + 1/4 * log 1/4 + 1/4 * log 1/4 + 1/4 * log 1/4)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 번 주머니의 경우 =&amp;nbsp; -(1/2 * log 1/2 + 1/2 * log 1/2)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 되어 첫 번째 주머니의 경우가 엔트로피 값이 높다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직관적으로 이해하는 데 결정론적인(결과가 거의 확실한) 분포는 엔트로피가 낮고, 고른 분포에 가까울수록 엔트로피가 높다고 생각하는 것이 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Cross Entropy&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 확률 변수에 관한 개별적인 두 확률분포가 있다면 그 분포의 차이를 구하고자 하는 것은 KL divergence measure이다. 크로스 엔트로피는 KL-divergence와 하나의 항이 차이가 나는데 그 항에 대하여 관여하지 않는 항이 생기므로 그 항에 관해 교차 엔트로피를 최소화하는 것은 KL-divergence를 최소화하는 것과 같다. (KL divergence는 다른 포스팅에서 자세히 설명하겠습니다 ..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KL divergence에 대한 수식은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxgQn6/btsJTIul6IQ/OktBNUoml6nEMcWs2tcNk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxgQn6/btsJTIul6IQ/OktBNUoml6nEMcWs2tcNk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxgQn6/btsJTIul6IQ/OktBNUoml6nEMcWs2tcNk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxgQn6%2FbtsJTIul6IQ%2FOktBNUoml6nEMcWs2tcNk0%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;540&quot; height=&quot;66&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hp(q)(크로스엔트로피)와 H(q)의 항 하나가 차이가 나는 걸 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크로스 엔트로피는 수식으로는 다음과 같이 표현된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yAp95/btsJTEFu8Xn/2mah1jiiWBuS9iCO7KvnaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yAp95/btsJTEFu8Xn/2mah1jiiWBuS9iCO7KvnaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yAp95/btsJTEFu8Xn/2mah1jiiWBuS9iCO7KvnaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyAp95%2FbtsJTEFu8Xn%2F2mah1jiiWBuS9iCO7KvnaK%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;310&quot; height=&quot;79&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;79&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;P에 대한 값이 작을수록(log함수 적용하기 때문에), Q에 대한 값이 클수록 해당 크로스 엔트로피 값은 커진다. 여기서 P, Q 확률 분포는 딥러닝 모델의 예측 결과에 대한 확률 분포와 정답에 대한 확률 분포로 매칭할 수 있다. 즉 Cross entropy는 두 분포에 대한 entropy를 계산하는 것과 비슷한 맥락인 것이다. cross entropy를 loss 함수로 사용하게 되면 모델의 예측과 정답에 대한 분포의 차이를 계속해서 줄여나간 다는 뜻이며 이는 두 확률 분포에 대한 엔트로피(불확실성)가 줄어드는 것과 같다고 생각할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 아래의 블로그를 참고하면 전체적인 틀에서 이해하기 좋은 것 같아서 남겨본다! 딥러닝에서 소프트맥수함수와 크로스엔트로피가 어떻게 학습에 사용되는 지 이해하기 쉽게 설명해준다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.philgineer.com/2021/10/31.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.philgineer.com/2021/10/31.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740585505031&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;[비전공자를 위한 딥러닝] 3.1 소프트맥스와 크로스 엔트로피&quot; data-og-description=&quot;비전공자를 위한 딥러닝, 소프트맥스, 크로스 엔트로피, 다항 분류, 지수 함수, deep learning, softmax, cross entropy, mutli-class classification, exponential&quot; data-og-host=&quot;www.philgineer.com&quot; data-og-source-url=&quot;https://www.philgineer.com/2021/10/31.html&quot; data-og-url=&quot;https://www.philgineer.com/2021/10/31.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bB658O/hyYjHuw5As/mFOcjLIKy7yScbeFgeQ4z0/img.jpg?width=1033&amp;amp;height=630&amp;amp;face=0_0_1033_630&quot;&gt;&lt;a href=&quot;https://www.philgineer.com/2021/10/31.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.philgineer.com/2021/10/31.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bB658O/hyYjHuw5As/mFOcjLIKy7yScbeFgeQ4z0/img.jpg?width=1033&amp;amp;height=630&amp;amp;face=0_0_1033_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;[비전공자를 위한 딥러닝] 3.1 소프트맥스와 크로스 엔트로피&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;비전공자를 위한 딥러닝, 소프트맥스, 크로스 엔트로피, 다항 분류, 지수 함수, deep learning, softmax, cross entropy, mutli-class classification, exponential&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.philgineer.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;</description>
      <category>인공지능/ML-DL 기초</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/76</guid>
      <comments>https://sanmldl.tistory.com/76#entry76comment</comments>
      <pubDate>Wed, 2 Oct 2024 18:24:02 +0900</pubDate>
    </item>
    <item>
      <title>[cs231n] 5강. Convolutional Neural Networks</title>
      <link>https://sanmldl.tistory.com/74</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이번 5강에서는 Vision Task를 효율적으로 해결하는 네트워크 구조인 Convolutional neural network의 역사와 작동 원리에 대해 알아본다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.18.36.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BYLIZ/btsH37pRYMV/SwqzI6JAt7Eqiz5WlfTgL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BYLIZ/btsH37pRYMV/SwqzI6JAt7Eqiz5WlfTgL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BYLIZ/btsH37pRYMV/SwqzI6JAt7Eqiz5WlfTgL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYLIZ%2FbtsH37pRYMV%2FSwqzI6JAt7Eqiz5WlfTgL0%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;665&quot; height=&quot;331&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.18.36.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지난 시간에 배운 내용은 위 그림과 같다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2개의 퍼셉트론 층을 쌓았다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 선형 변환식을 겹쳐서 쌓아 최종 스코어를 얻었다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 명확하게 한계가 있다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 이미지의 지역적 정보를 활용하지 못할뿐더러 각 입력이 모든 출력에 개입한다는 점이 그렇다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 한계점을 CNN이 해결해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9Zav/btsH26rqL2M/aB9R00kaFStUavdK6I1Qi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9Zav/btsH26rqL2M/aB9R00kaFStUavdK6I1Qi0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;918&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.23.04.png&quot; width=&quot;643&quot; height=&quot;320&quot; style=&quot;width: 44.5063%; margin-right: 10px;&quot; data-widthpercent=&quot;45.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9Zav/btsH26rqL2M/aB9R00kaFStUavdK6I1Qi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9Zav%2FbtsH26rqL2M%2FaB9R00kaFStUavdK6I1Qi0%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;1844&quot; height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpjdSX/btsH5ARGgiT/AxFv7O0ABFVLJk9fTF0M6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpjdSX/btsH5ARGgiT/AxFv7O0ABFVLJk9fTF0M6K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;752&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.37.07.png&quot; width=&quot;541&quot; height=&quot;221&quot; style=&quot;width: 54.3309%;&quot; data-widthpercent=&quot;54.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpjdSX/btsH5ARGgiT/AxFv7O0ABFVLJk9fTF0M6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpjdSX%2FbtsH5ARGgiT%2FAxFv7O0ABFVLJk9fTF0M6K%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;1844&quot; height=&quot;752&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;span style=&quot;color: #000000;&quot;&gt;CNN의 등장 배경의 역사를 거슬러 올라가면 아주 오래전으로 거슬러 올라간다.(1957년) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그러한 배경은 차치하고 CNN 등장에 가장 직접적인 역할을 한 것은 LeCun의 모델이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 왼쪽 그림이 LeCun의 모델의 구조인데 사실 CNN과 거의 똑같다. 다만 스케일에서 차이가 있다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 모델은 gradient기반의 backpropagation이 가능하면서 이미지의 지역적 특징을 잘 잡아낸다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 모델은 document recognition에 활용되었다고 한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 아이디어를 기반으로 다양한 CNN 기반 모델이 탄생하였고(ex. Alexnet), 많은 Vision task에서 큰 두각을 나타냈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwrzYC/btsH5glFEUc/sDD73yLJU7kdGC76E3vHdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwrzYC/btsH5glFEUc/sDD73yLJU7kdGC76E3vHdK/img.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;928&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.38.36.png&quot; data-widthpercent=&quot;33.63&quot; style=&quot;width: 32.8447%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwrzYC/btsH5glFEUc/sDD73yLJU7kdGC76E3vHdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwrzYC%2FbtsH5glFEUc%2FsDD73yLJU7kdGC76E3vHdK%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;1844&quot; height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byGIRs/btsH5dPYi9V/WKeDRkk5yDKIVLEIptxgzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byGIRs/btsH5dPYi9V/WKeDRkk5yDKIVLEIptxgzK/img.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;976&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.40.11.png&quot; style=&quot;width: 32.4149%; margin-right: 10px;&quot; data-widthpercent=&quot;33.19&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byGIRs/btsH5dPYi9V/WKeDRkk5yDKIVLEIptxgzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyGIRs%2FbtsH5dPYi9V%2FWKeDRkk5yDKIVLEIptxgzK%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;1914&quot; height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQBZL/btsH5Lk83G4/Tf3SjitbLdmYlIXxW3eKi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQBZL/btsH5Lk83G4/Tf3SjitbLdmYlIXxW3eKi1/img.png&quot; data-origin-width=&quot;1914&quot; data-origin-height=&quot;976&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.40.40.png&quot; style=&quot;width: 32.4149%;&quot; data-widthpercent=&quot;33.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQBZL/btsH5Lk83G4/Tf3SjitbLdmYlIXxW3eKi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQBZL%2FbtsH5Lk83G4%2FTf3SjitbLdmYlIXxW3eKi1%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;1914&quot; height=&quot;976&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미지 분류, 이미지 검색, 객체 탐지 등등 매우 다양한 도메인과 task에서 CNN이 사용된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 CNN 모델을 활용하려면 개념과 작동 원리를 알아야 한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5강에서 이를 설명해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.42.52.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PaNUT/btsH4KHvcZ7/GuZ3JHawyRsbZ5qLyp2I50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PaNUT/btsH4KHvcZ7/GuZ3JHawyRsbZ5qLyp2I50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PaNUT/btsH4KHvcZ7/GuZ3JHawyRsbZ5qLyp2I50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPaNUT%2FbtsH4KHvcZ7%2FGuZ3JHawyRsbZ5qLyp2I50%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;622&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2024-06-19 오후 2.42.52.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 우리는 지금까지 선형 결합을 위한 Weights에 대해 공부했다. 위의 그림을 보면 Fully conneted 하게 만들기 위해 input으로 32*32*3 픽셀 크기의 이미지를 3072차원의 벡터로 표현했다. 이에 대한 10 * 3072차원 크기의 weights를 부여하여 dot product(내적) 연산을 하면 10개의 결괏값이 나온다. 즉, Fully conneted layer에서 3072차원의 입력에 대한 각 weight의 dot products의 결과는 하나의 number가 되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 3.55.14.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMDal8/btsH4ZxOq9A/EeOsJjujaujw6EsYbMGQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMDal8/btsH4ZxOq9A/EeOsJjujaujw6EsYbMGQkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMDal8/btsH4ZxOq9A/EeOsJjujaujw6EsYbMGQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMDal8%2FbtsH4ZxOq9A%2FEeOsJjujaujw6EsYbMGQkk%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;695&quot; height=&quot;353&quot; data-filename=&quot;스크린샷 2024-06-19 오후 3.55.14.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;반면에 Convolution layer는 하나의 number를 계산하는 방식이 조금 다르다. &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력 이미지의 크기와 차원을 그대로 둔 상태로 공간적으로 내적 하여 하나의 number를 도출하는 방식을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 예시를 보면 32 * 32 * 3 크기의 이미지 입력이 차원 그대로 들어오면 5 * 5 * 3 크기의 filter를 구성하는 W와 곱해지고 bias를 더하여 하나의 number를 만드는 것을 알 수 있다. (편의를 위해 이를 Conv연산이라고 하겠다.) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이런 식의 계산을 슬라이딩하면서 모든 이미지에 대해 적용하면 전체 이미지에 대한 activation 1개를 구할 수 있게 된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여기서 activation map은 슬라이딩 한번 당 filter가 계산된 값(score 값의 역할)들을 모아놓은 map이라고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcRhY/btsH374Dc8M/s663gecVCn728Kt1dQRA61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcRhY/btsH374Dc8M/s663gecVCn728Kt1dQRA61/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.00.33.png&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/BcRhY/btsH374Dc8M/s663gecVCn728Kt1dQRA61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcRhY%2FbtsH374Dc8M%2Fs663gecVCn728Kt1dQRA61%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;1874&quot; height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8oAO/btsH35y2XRd/NrwvMuDh6C2n0RGaufLvOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8oAO/btsH35y2XRd/NrwvMuDh6C2n0RGaufLvOk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.00.19.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8oAO/btsH35y2XRd/NrwvMuDh6C2n0RGaufLvOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8oAO%2FbtsH35y2XRd%2FNrwvMuDh6C2n0RGaufLvOk%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;1874&quot; height=&quot;952&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;span style=&quot;color: #000000;&quot;&gt;전체 이미지에 또 다른 필터를 (다른 값으로 이뤄진 W의 filter) Conv연산을 하게 되면 또 다른 activation map이 나오게 된다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.03.39.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZgxPq/btsH5K7Kk6l/QbvKtfMC7RzO7kT69qkMF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZgxPq/btsH5K7Kk6l/QbvKtfMC7RzO7kT69qkMF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZgxPq/btsH5K7Kk6l/QbvKtfMC7RzO7kT69qkMF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZgxPq%2FbtsH5K7Kk6l%2FQbvKtfMC7RzO7kT69qkMF1%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;657&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.03.39.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&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;위의 예시를 보면 이와 같은 방법으로 6개의 filter를 사용하여 총 6개의 28 * 28 * 6 크기의 activation map을 만들어 낸 것을 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.05.04.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgHLc/btsH5KNrT0k/yjSUgE9oRXb70BkkgXgrN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgHLc/btsH5KNrT0k/yjSUgE9oRXb70BkkgXgrN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgHLc/btsH5KNrT0k/yjSUgE9oRXb70BkkgXgrN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgHLc%2FbtsH5KNrT0k%2FyjSUgE9oRXb70BkkgXgrN1%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;695&quot; height=&quot;353&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.05.04.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇게 나온 activation map을 입력으로 (하나의 이미지로 간주하듯이) 계속해서 Conv layer를 쌓은 것이 CNN이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(입력 -&amp;gt; conv 연산 -&amp;gt; activation function -&amp;gt; 출력) -&amp;gt; 반복!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 conv layer의 출력이 어떠한 특징들을 뽑아내는지 시각적으로 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.20.05.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/26ePE/btsH5J8SEBM/eWYDLy9JidHxilP5rNPVvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/26ePE/btsH5J8SEBM/eWYDLy9JidHxilP5rNPVvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/26ePE/btsH5J8SEBM/eWYDLy9JidHxilP5rNPVvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F26ePE%2FbtsH5J8SEBM%2FeWYDLy9JidHxilP5rNPVvK%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;577&quot; height=&quot;293&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.20.05.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;VGG라는 Conv 모델에서의 layer 깊이에 따라 activation map을 시각화한 것이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;low level은 입력에서 가까운 conv layer의 출력인데, 세로선, 가로선과 같은 low level의 feature가 추출되는 것을 볼 수 있다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Conv layer를 지날수록 나오는 특징은 mid level과 high level에서 볼 수 있듯이 다소 추상적으로 변한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.45.31.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBzX98/btsH4mNTkPf/u0mdHVDHroZ2v7peFpmmd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBzX98/btsH4mNTkPf/u0mdHVDHroZ2v7peFpmmd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBzX98/btsH4mNTkPf/u0mdHVDHroZ2v7peFpmmd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBzX98%2FbtsH4mNTkPf%2Fu0mdHVDHroZ2v7peFpmmd0%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;700&quot; height=&quot;338&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.45.31.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&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;&lt;span style=&quot;color: #000000;&quot;&gt;image classification task에서 CNN은 전통적으로 위 그림처럼 쌓는다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중간에 나오는 pooling layer는 무슨 역할을 할까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과적으로는 activation map을 대표되는 값으로 &lt;b&gt;downsampling 하는 역할&lt;/b&gt;을 한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉 map의 크기를 줄이는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pooling 말고도 Conv 연산에서도 downsampling이 이뤄진다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7 * 7 input 이미지에 대해 3 * 3 filter를 conv 연산 적용하여 3 * 3의 activation map이 나오게 하려면&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2칸씩 띄어 슬라이딩해야 할 것이다. 이 간격을 stride라고 한다.&lt;/span&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/ZBlzW/btsH4CpDEG2/KcCk2qlCwkOVqCMwpiOsCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZBlzW/btsH4CpDEG2/KcCk2qlCwkOVqCMwpiOsCK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.53.13.png&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/ZBlzW/btsH4CpDEG2/KcCk2qlCwkOVqCMwpiOsCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZBlzW%2FbtsH4CpDEG2%2FKcCk2qlCwkOVqCMwpiOsCK%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;1874&quot; height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmSN9Y/btsH4JaZL3c/FJJUHUZdeH2xjAXCm7TGm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmSN9Y/btsH4JaZL3c/FJJUHUZdeH2xjAXCm7TGm0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.50.18.png&quot; width=&quot;580&quot; height=&quot;280&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmSN9Y/btsH4JaZL3c/FJJUHUZdeH2xjAXCm7TGm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmSN9Y%2FbtsH4JaZL3c%2FFJJUHUZdeH2xjAXCm7TGm0%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;1874&quot; height=&quot;904&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇다면 같은 조건에서 stride를 3으로 하면 어떻게 될까? &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 맞지 않는다.&lt;/span&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/cC03X3/btsH5xHHaYv/EE2G4ytYeT6N9yi8cmWl4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC03X3/btsH5xHHaYv/EE2G4ytYeT6N9yi8cmWl4k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.54.07.png&quot; width=&quot;647&quot; height=&quot;312&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/cC03X3/btsH5xHHaYv/EE2G4ytYeT6N9yi8cmWl4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC03X3%2FbtsH5xHHaYv%2FEE2G4ytYeT6N9yi8cmWl4k%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;1874&quot; height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcLh0q/btsH4JhMTVE/KIcw5j0sILKptDkd3tHI00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcLh0q/btsH4JhMTVE/KIcw5j0sILKptDkd3tHI00/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.54.25.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcLh0q/btsH4JhMTVE/KIcw5j0sILKptDkd3tHI00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcLh0q%2FbtsH4JhMTVE%2FKIcw5j0sILKptDkd3tHI00%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;1874&quot; height=&quot;904&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;span style=&quot;color: #000000;&quot;&gt;output size는 위 오른쪽 그림과 같은 식으로 도출된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 칸 단위로 2.33의 칸을 표현할 수 없기 때문이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Conv layer를 구성할 때 filter size, stride는 하이퍼파라미터가 된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 계속해서 downsampling 했을 때의 단점이 존재한다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원본 이미지에 대하여 가장자리에 있을수록 conv 연산의 결과에 기여하는 횟수가 적어진다는 것이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(모서리쪽 정보를 활용하기 힘들다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 계속해서 줄어드는 size로 층을 깊게 할 수 없다는 점이다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이러한 한계점을 극복하고자 등장한 개념이 padding이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.59.59.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PEggg/btsH4ZSelth/CamIofZAkNdcdllCSuh6fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PEggg/btsH4ZSelth/CamIofZAkNdcdllCSuh6fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PEggg/btsH4ZSelth/CamIofZAkNdcdllCSuh6fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPEggg%2FbtsH4ZSelth%2FCamIofZAkNdcdllCSuh6fK%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;634&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2024-06-19 오후 4.59.59.png&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;padding기법은 가장자리 위에 0과 같은 동일한 숫자로 감싸주는 것을 의미한다. 위의 예시처럼 7 * 7 input에 1 pixel만큼 padding을 해주면 9 * 9 크기가 될 것이다. 이를 stride 1로 3 * 3 filter를 적용하면 output은 7 * 7로 input과 같은 size가 된다. 일반적으로 stride 1을 기준으로 filter 크기가 3이면 1만큼, 5이면 2만큼, 7이면 3만큼 zero-padding 해준다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;뉴런의 관점에서 보면 각 activation map은 뉴런 output의 모임이라는 것을 또다시 강조한다. 이는 input에 대하여 작은 지역만큼(filter size만큼) 연결되어 있다는 의미이고(=filter 크기만큼 연산이 되어 하나의 값이 된다) 같은 filter를 사용하기 때문에 parameter를 share 한다는 것이다.&lt;/span&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/dtq46q/btsH5uEeapk/P1U2zpayHMEyBe6JVDMD80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtq46q/btsH5uEeapk/P1U2zpayHMEyBe6JVDMD80/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 5.06.48.png&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/dtq46q/btsH5uEeapk/P1U2zpayHMEyBe6JVDMD80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtq46q%2FbtsH5uEeapk%2FP1U2zpayHMEyBe6JVDMD80%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;1874&quot; height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QpuJE/btsH41P2VGo/jLTKULx7beelJ6xVfIXfh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QpuJE/btsH41P2VGo/jLTKULx7beelJ6xVfIXfh0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 5.07.46.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QpuJE/btsH41P2VGo/jLTKULx7beelJ6xVfIXfh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQpuJE%2FbtsH41P2VGo%2FjLTKULx7beelJ6xVfIXfh0%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;1874&quot; height=&quot;904&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;또한 오른쪽의 그림처럼 각 다른 filter가 적용되면 같은 위치의 이미지를 다른 filter로 계산하는 것은 보다 풍부하고 유의미한 특징을 추출하는 것임을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mttZl/btsH4eJmG7J/J5JMQ0yGwfnkBPEf9Et9k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mttZl/btsH4eJmG7J/J5JMQ0yGwfnkBPEf9Et9k1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;904&quot; data-filename=&quot;스크린샷 2024-06-19 오후 5.13.42.png&quot; style=&quot;width: 50.4359%; margin-right: 10px;&quot; data-widthpercent=&quot;51.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mttZl/btsH4eJmG7J/J5JMQ0yGwfnkBPEf9Et9k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmttZl%2FbtsH4eJmG7J%2FJ5JMQ0yGwfnkBPEf9Et9k1%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;1874&quot; height=&quot;904&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPQjR0/btsH5vpB6Fv/FwVIYkSWgtRKFX62wroLPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPQjR0/btsH5vpB6Fv/FwVIYkSWgtRKFX62wroLPK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1874&quot; data-origin-height=&quot;942&quot; data-filename=&quot;스크린샷 2024-06-19 오후 5.13.59.png&quot; style=&quot;width: 48.4013%;&quot; data-widthpercent=&quot;48.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPQjR0/btsH5vpB6Fv/FwVIYkSWgtRKFX62wroLPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPQjR0%2FbtsH5vpB6Fv%2FFwVIYkSWgtRKFX62wroLPK%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;1874&quot; height=&quot;942&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;span style=&quot;color: #000000;&quot;&gt;앞서 언급했듯이 downsample의 기능을 수행하는 또 다른 CNN의 구조는 pooling layer이다. 크게 max pooling과 average pooling이 있는데 여기서는 max pooling의 예시를 든다. pooling에서도 이를 적용할 filter size가 필요한데 그 size안에서 가장 큰 값을 대푯값으로 뽑는 것이다. 따라서 이 layer에서는 학습 파라미터는 없다.&lt;/span&gt;&lt;/p&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;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Reference&lt;br /&gt;[1] CNN 연산, &lt;a href=&quot;https://sanmldl.tistory.com/28&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sanmldl.tistory.com/28&lt;/a&gt;&lt;br /&gt;[2] 강의 노트, &lt;a href=&quot;https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture5.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture5.pdf&lt;/a&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;</description>
      <category>인공지능/cs231n</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/74</guid>
      <comments>https://sanmldl.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 19 Jun 2024 17:20:09 +0900</pubDate>
    </item>
    <item>
      <title>[cs231n] 4강. Backpropagation and Neural Networks</title>
      <link>https://sanmldl.tistory.com/73</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이번 4강에서는 backpropagation의 작동 원리와 Neural network의 아키텍처에 대해 간략히 알아본다.&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&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/b50Vll/btsHOiyEKb3/hgPilKwYySBzubYUgRRBik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b50Vll/btsHOiyEKb3/hgPilKwYySBzubYUgRRBik/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;808&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.16.32.png&quot; style=&quot;width: 50.3782%; margin-right: 10px;&quot; data-widthpercent=&quot;50.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b50Vll/btsHOiyEKb3/hgPilKwYySBzubYUgRRBik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb50Vll%2FbtsHOiyEKb3%2FhgPilKwYySBzubYUgRRBik%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;1794&quot; height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9gHbh/btsHPQm8236/2Zzt4y8evizv6Kn74vRRVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9gHbh/btsHPQm8236/2Zzt4y8evizv6Kn74vRRVk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;840&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.16.46.png&quot; style=&quot;width: 48.459%;&quot; data-widthpercent=&quot;49.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9gHbh/btsHPQm8236/2Zzt4y8evizv6Kn74vRRVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9gHbh%2FbtsHPQm8236%2F2Zzt4y8evizv6Kn74vRRVk%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;1794&quot; height=&quot;840&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;지금까지 배운 것은 다음과 같다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이미지에 대한 score를 구하고 이 값을 Loss function에 적용했다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 후에 Data loss를 구하여 w(파라미터)에 대한 data loss의 기울기를 구했다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 gradient descent 방식이 사용되어 최적의 loss를 갖도록 파라미터를 업데이트 했다는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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/5d2KL/btsHPpKhMtZ/rCxjaJ3c4BZ4fXnZUJ0Ws0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5d2KL/btsHPpKhMtZ/rCxjaJ3c4BZ4fXnZUJ0Ws0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;900&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.23.09.png&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/5d2KL/btsHPpKhMtZ/rCxjaJ3c4BZ4fXnZUJ0Ws0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5d2KL%2FbtsHPpKhMtZ%2FrCxjaJ3c4BZ4fXnZUJ0Ws0%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;1794&quot; height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmKFM1/btsHOla4JML/Q8nc2B5UkwXmt5n8YMQho1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmKFM1/btsHOla4JML/Q8nc2B5UkwXmt5n8YMQho1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1794&quot; data-origin-height=&quot;900&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.22.59.png&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmKFM1/btsHOla4JML/Q8nc2B5UkwXmt5n8YMQho1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmKFM1%2FbtsHOla4JML%2FQ8nc2B5UkwXmt5n8YMQho1%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;1794&quot; height=&quot;900&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;위 그림에서 알 수 있듯이 입력 이미지로부터 loss까지 도달하기에 수 많은 weights(model parameter)가 있다. 기울기를 구하는 건 알겠는데, layer를 거치면서 생기는 이 많은 weights의 기울기는 어떻게 한번에 구할 수 있을까? 이 물음에 답변을 해주는 것이 &lt;b&gt;backpropagation&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 간단한 backpropagation의 예시가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.27.37.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1j0fy/btsHPZYEZlB/tZEI3GjoQTnhKrR8Ojxq2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1j0fy/btsHPZYEZlB/tZEI3GjoQTnhKrR8Ojxq2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1j0fy/btsHPZYEZlB/tZEI3GjoQTnhKrR8Ojxq2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1j0fy%2FbtsHPZYEZlB%2FtZEI3GjoQTnhKrR8Ojxq2K%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;1884&quot; height=&quot;470&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.27.37.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x,y,z를 입력으로 하는 함수 f(x,y,z)가 있다고 하자. x,y,z에 대한 값을 대입하면 (x+y)z 식에 의해 값이 도출된다. (여기서 x,y,z는 -2, 5, -4이다.)&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;스크린샷 2024-06-05 오후 2.32.19.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BFA1B/btsHPpp1qsr/TUDo8sjUkkVSj2vjGmbEy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BFA1B/btsHPpp1qsr/TUDo8sjUkkVSj2vjGmbEy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BFA1B/btsHPpp1qsr/TUDo8sjUkkVSj2vjGmbEy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBFA1B%2FbtsHPpp1qsr%2FTUDo8sjUkkVSj2vjGmbEy1%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;1884&quot; height=&quot;890&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.32.19.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&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;&lt;span style=&quot;color: #000000;&quot;&gt;덧셈에 대한 미분은 1이 되고, 곱셈에 대한 미분은 서로의 계수가 된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이것까지 알면 이 예제에서의 backpropagation은 거의 끝났다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 위의 f출력에서부터 거슬러 내려오면 된다. 반대 방향으로 흘러 들어오기 때문에 backpropagation이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.35.15.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvnIg/btsHP04dn9K/ECOKVKkt2ZhCyNBYQ6V6C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvnIg/btsHP04dn9K/ECOKVKkt2ZhCyNBYQ6V6C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvnIg/btsHP04dn9K/ECOKVKkt2ZhCyNBYQ6V6C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyvnIg%2FbtsHP04dn9K%2FECOKVKkt2ZhCyNBYQ6V6C0%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;1884&quot; height=&quot;890&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.35.15.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$\frac{\partial f}{\partial f}$ 는 자기자신에 대한 미분이므로 1이된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 기울기('1')은 위의 q와 아래의 z로 흘러들어간다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr9uCP/btsHP1hJQjt/Klkc3mizL2h7TkaQZZvpc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr9uCP/btsHP1hJQjt/Klkc3mizL2h7TkaQZZvpc1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.38.34.png&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/cr9uCP/btsHP1hJQjt/Klkc3mizL2h7TkaQZZvpc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr9uCP%2FbtsHP1hJQjt%2FKlkc3mizL2h7TkaQZZvpc1%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;1884&quot; height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clSDlQ/btsHOZehawK/bVaMiP5Mz4aNasf13iGjy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clSDlQ/btsHOZehawK/bVaMiP5Mz4aNasf13iGjy0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot; data-filename=&quot;스크린샷 2024-06-05 오후 2.38.51.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clSDlQ/btsHOZehawK/bVaMiP5Mz4aNasf13iGjy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclSDlQ%2FbtsHOZehawK%2FbVaMiP5Mz4aNasf13iGjy0%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;1884&quot; height=&quot;890&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 z로 들어가면 곱의 미분이 적용되므로 계수인 q가 기울기가 된다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때 chain rule이 적용되어 흘러들어온 1과 z에서의 기울기 3을 곱한 3이 최종 기울기가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;chaine rule이란?&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;직역하면 연쇄법칙으로, 합성함수의 미분을 의미한다.&lt;br /&gt;x에 대한 함수가 있고 t에 대한 함수가 x라고 한다면 우리는 합성함수로 이를 표현할 수 있다. y=f(t), t=g(x) -&amp;gt; y=(f(g(x)))&lt;br /&gt;각 함수에 대한 미분계수를 구하면 \(\frac{\partial t}{\partial x}\)와 \(\frac{\partial y}{\partial t}\)를 구할 수 있다.&lt;br /&gt;따라서 다음과 같은 식이 성립한다.&lt;br /&gt;\(\frac{\partial y}{\partial x}\) = \(\frac{\partial y}{\partial t}\) * &amp;nbsp;\(\frac{\partial t}{\partial x}\)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.03.56.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUVVq7/btsHP4lmBEY/3UJ417VsxxfHz2EdSDswFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUVVq7/btsHP4lmBEY/3UJ417VsxxfHz2EdSDswFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUVVq7/btsHP4lmBEY/3UJ417VsxxfHz2EdSDswFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUVVq7%2FbtsHP4lmBEY%2F3UJ417VsxxfHz2EdSDswFK%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;1884&quot; height=&quot;890&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.03.56.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;890&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;위로 흘러들러가는 경우도 똑같다. chain rule에 의해 위에서 흘러들어온 기울기인 1과 계수인 z의 값-4를 곱하여 해당 기울기를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 x,y 방향으로 흘러들어갈때는 덧셈에 대한 미분이므로 -4가 그대로 흘러들어간다. 이렇게 되면 각 x,y,z에 대한 f의 기울기를 구할 수 있게 되는 것이다.&lt;/p&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;스크린샷 2024-06-05 오후 3.06.33.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zYSRG/btsHPGyospE/ko4kxeIC58kKYr5lLOzfA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zYSRG/btsHPGyospE/ko4kxeIC58kKYr5lLOzfA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zYSRG/btsHPGyospE/ko4kxeIC58kKYr5lLOzfA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzYSRG%2FbtsHPGyospE%2Fko4kxeIC58kKYr5lLOzfA0%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;1884&quot; height=&quot;938&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.06.33.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;938&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;위 그림은 backpropagation의 각 연산에 대한 과정을 보여주고 있다. 각 입력으로부터 출력을 계산하고 그 출력으로부터 기울기를 구한다. 위에서 흘러들어온 gradient(global gradient라고도 함)와 해당 연산에 대한 기울기를 구하여 곱한다. 이것을 가능하게 하는 것은 chain rule 덕분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 계산된 기울기는 그 다음 기울기를 구하기 위한 global gradient가 되어 다시 사용되는 것이다. (이후의 4강의 backpropagation의 과정은 이 큰 틀에서만 이뤄지기 때문에 직접 보면서 해결해보는 것을 추천한다. 다만 연산에 따른 미분이 달라진다는 것과 vectorized example에서 행렬에 대한 미분은 형태까지 고려해야한 다는 것만 주의하면 될 것 같다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 내용은 &lt;b&gt;Neural network&lt;/b&gt;에 관한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.19.15.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sXOXG/btsHQl1kGer/KAOOKsbEY3mlc5WFXD8zS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sXOXG/btsHQl1kGer/KAOOKsbEY3mlc5WFXD8zS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sXOXG/btsHQl1kGer/KAOOKsbEY3mlc5WFXD8zS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsXOXG%2FbtsHQl1kGer%2FKAOOKsbEY3mlc5WFXD8zS0%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;657&quot; height=&quot;284&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.19.15.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이전에 우리는 linear regressor를 통해 score function을 구했다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이에 neural network는 이 linear regressor를 2층 3층 쌓아 score function을 구해보자는 아이디어이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&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/seYjQ/btsHQl76xxE/bvOaKT8U26DgrhrE9tMJSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/seYjQ/btsHQl76xxE/bvOaKT8U26DgrhrE9tMJSk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;920&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.20.31.png&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/seYjQ/btsHQl76xxE/bvOaKT8U26DgrhrE9tMJSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FseYjQ%2FbtsHQl76xxE%2FbvOaKT8U26DgrhrE9tMJSk%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;1884&quot; height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YaUpU/btsHP0iVWzs/e33cu6HXL9afPwALllPYf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YaUpU/btsHP0iVWzs/e33cu6HXL9afPwALllPYf1/img.png&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;920&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2024-06-05 오후 3.20.43.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YaUpU/btsHP0iVWzs/e33cu6HXL9afPwALllPYf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYaUpU%2FbtsHP0iVWzs%2Fe33cu6HXL9afPwALllPYf1%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;1884&quot; height=&quot;920&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Neural network의 아키텍처는 각 노드들이 fully-connected 되어있다. 즉 모든 입력이 모든 출력에 영향을 끼치는 것이다. 몇 개의 layer를 쌓았느냐에 따라 2-layer, 3-layer... network라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 우리가 앞에서 score를 구할 때 하나의 linear한 계산식을 사용했다.(w를 곱하고 b를 더한다)&amp;nbsp; &amp;nbsp;층을 더한다는 것은 이것을 합성함수처럼 계속 적용하겠다는 의미이다. 실제로 computation 예제를 보면 각 linear 연산을 반복해주는 것을 알 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;reference&lt;br /&gt;[1] 4강 slide, &lt;a href=&quot;https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf&lt;/a&gt;&lt;/blockquote&gt;</description>
      <category>인공지능/cs231n</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/73</guid>
      <comments>https://sanmldl.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 5 Jun 2024 15:25:49 +0900</pubDate>
    </item>
    <item>
      <title>8장. 확산 모델(diffusion model)</title>
      <link>https://sanmldl.tistory.com/72</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;생성AI.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYQhFJ/btsHMO4m9OH/nDnk4M3LkIvyqmyYay5q90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYQhFJ/btsHMO4m9OH/nDnk4M3LkIvyqmyYay5q90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYQhFJ/btsHMO4m9OH/nDnk4M3LkIvyqmyYay5q90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYQhFJ%2FbtsHMO4m9OH%2FnDnk4M3LkIvyqmyYay5q90%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;492&quot; height=&quot;632&quot; data-filename=&quot;생성AI.jpeg&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2020년에 획기적인 확산 모델 논문이 나왔다. 이름하여 DDPM! (denoising diffusion probablistic model의 줄임말)&lt;br /&gt;최근 생성 모델링에서 핫한(?) diffusion 모델의 주요 논문이다. 이번 포스팅에서 diffision 모델이 무엇이고 그 기본 원리와 이를 작동하게 하기 위한 모델의 구성 요소에 대해 알아보자!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1. Denoising diffusion model&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Denoising diffusion model을 직영하면 잡음 제거 확산 모델이다. 이 모델의 핵심 아이디어는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;연속해서(여러 번의 과정으로) 매우 조금씩 이미지에서 잡음을 제거하도록 모델을 훈련시키는 것이다. 그렇게 되면 이론적으로 완전히 랜덤한 잡음에서 훈련 세트의 이미지와 같은 이미지를 얻을 수 있다. Denoising diffision 모델 학습에는 크게 두 가지의 과정이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;정방향 확산 과정 (diffusion process)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;역방향 확산 과정 (denoising process)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이에 대해 조금 더 자세히 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;2. 정방향 확산 과정 (Forward process)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Forward process라고도 불리는 &lt;b&gt;정방향 확산 과정은 원본 이미지에 noise를 점진적으로 적용하는 과정이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이때의 noise는 가우시안 노이즈로 평균이 0이고 분산이 1인 노이즈이다. 원본 이미지에 가우시안 노이즈를 조금씩 1000번 적용했다고 해보자. 그러면 1000번째로 적용한 이미지는 가우시안 노이즈와 거의 동일할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mActX/btsHLyaqq8U/oDFFmIq1eoa82ctVZRE93k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mActX/btsHLyaqq8U/oDFFmIq1eoa82ctVZRE93k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mActX/btsHLyaqq8U/oDFFmIq1eoa82ctVZRE93k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmActX%2FbtsHLyaqq8U%2FoDFFmIq1eoa82ctVZRE93k%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;572&quot; height=&quot;143&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 식 $q(x_{t} | x_{t-1})$ 로 표현한다. $x_{t-1}$ 에서 가우시안 잡음(소량)을 추가한 $x_{t}$ 의 분포라고 볼 수 있을 것이다. 이를 수학적으로 표현하면 다음과 같이 표현된다. $$ x_{t} = \sqrt{1-\beta} x_{t-1} + \sqrt{\beta} I $$ &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;갑자기 $\beta I$ 가 나와서 헷갈릴 수 있지만 하나하나 보면 이해하기 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;우선 위에서 언급한 것처럼 정방향 패스에서는 원본 이미지에 소량의 가우시안 노이즈를 넣어 완벽한 가우시안 노이즈 분포를 만들어 내고 싶다. 따라서 $x_{t} = a x_{t-1} + b noise$ 가 될 것이다.&amp;nbsp; 여기서 a,b는 스케일 값 (얼만큼의 이전 이미지를 포함할지(a), 가우시안 노이즈를 포함할지(b)) 이다. 따라서 가우시안 노이즈 $I$ 를 소량 적용할 $\sqrt\beta$가 적용되는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;그렇다면 왜 $\sqrt\beta$ 와 $\sqrt{1-\beta}$를 스케일 값으로 만들었을까?&lt;/b&gt; (여기서 $\beta$ 는 상수이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;결론적으로는 이런 식을 통해 T가 클 때, $x_{t}$ 는 표준 가우스 분포에 가깝다는 식이 도출되기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유도하기 위해서는 $var(ax) = a^2var(x)$와 $var(x + y) = var(x) + var(y)$의 성질(공식)을 알아야 한다.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$x_{t-1}$이 평균 0 분산 1을 따르기 때문에 위의 공식에 따라 ${\sqrt{1-\beta}x_{t-1}}$&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;의 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;분산은 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;$1-\beta$ 가 되고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;$\sqrt{\beta} I$&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt; 의 분산은 $\beta$가 된다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이 둘을 더하게 되면 (= $x_{t}$ 분포 유도) 평균이 0이고 분산이 1 $(1-\beta + \beta = 1)$인 또 다른 새로운 분포를 얻게 되는 것이다.&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;b&gt;즉 원본 이미지에 소량의 가우시안 분포를 추가하면서 항상 $x_{t}$가 표준 가우스 분포와 거의 동일하다는 게 만들겠다는 아이디어&lt;/b&gt;이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다행히도 q를 t번 적용하지 않고 원본 이미지에서 $x_{t}$로 한 번에 갈 수 있다. (위의 식에서 대입만 하면 도출되는 있는 식이지만 직접 전개하기에 너무 길고 복잡하기 때문에 생략)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;따라서 정방향 확산 방향의 과정 q는 아래의 식과 같이 표현할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0VBfc/btsHO4FsBCq/zNieog5XUFKk1HrW9azCRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0VBfc/btsHO4FsBCq/zNieog5XUFKk1HrW9azCRk/img.png&quot; data-alt=&quot;라고 가정하면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0VBfc/btsHO4FsBCq/zNieog5XUFKk1HrW9azCRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0VBfc%2FbtsHO4FsBCq%2FzNieog5XUFKk1HrW9azCRk%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;260&quot; height=&quot;35&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라고 가정하면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIV72H/btsHNvEwvXG/FATwgYtjV5jtOdcwB45nG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIV72H/btsHNvEwvXG/FATwgYtjV5jtOdcwB45nG0/img.png&quot; data-alt=&quot;이 식이 만족한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIV72H/btsHNvEwvXG/FATwgYtjV5jtOdcwB45nG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIV72H%2FbtsHNvEwvXG%2FFATwgYtjV5jtOdcwB45nG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;75&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이 식이 만족한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&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: #009a87;&quot;&gt;&lt;b&gt;2-1 diffusion schedule&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: #333333;&quot;&gt;이렇게 되면 $\beta$에 대해서도 궁금할 것이다. 앞서 말한 것처럼 $\beta$는 어떠한 상수인데 이를 어떻게 정해야 하는 것일까? 이를 &lt;b&gt;확산 스케줄 &lt;/b&gt;혹은&lt;b&gt; 베타 스케줄&lt;/b&gt;이라고 부른다. 각 타임 스텝 t에 따라 다른 $\beta$ 값을 선택할 수 있다. &lt;b&gt;$\beta$ 값이 t에 따라 변하는 방식&lt;/b&gt;을 확산 스케줄이라고 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다양한 확산 스케줄이 있다. 아래의 그림에서처럼 linear, sigmoid, quadratic 한 스케줄링뿐만 아니라 cosine(+offset cosine) 스케줄링까지 사용하여 t번의 확산을 하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-04 오후 5.11.59.png&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdV1jV/btsHNFtlOHZ/XJZADWnuXKErSTbkkBKQ1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdV1jV/btsHNFtlOHZ/XJZADWnuXKErSTbkkBKQ1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdV1jV/btsHNFtlOHZ/XJZADWnuXKErSTbkkBKQ1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdV1jV%2FbtsHNFtlOHZ%2FXJZADWnuXKErSTbkkBKQ1K%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;704&quot; height=&quot;293&quot; data-filename=&quot;스크린샷 2024-06-04 오후 5.11.59.png&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위의 그림에서 알 수 있듯이 각 스케줄링에 따라 잡음의 추가 과정에서 얼마나 바뀌는지 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;논문에서는 선형적인 스케줄링 방법을 사용했으나(0.0001 ~ 0.02 범위에서 선형적으로 증가) 시그모이드나 코사인 스케줄링을 사용하면 보다 $\beta$ 값이 느리게 상승하게 되므로 더욱 점진적인 노이즈 추가가 가능해진다. 이는 훈련의 효율성과 생성 품질을 향상하는 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMRaw0/btsHOLzp4ie/Qjlg94ixQwAFtKBznT3tk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMRaw0/btsHOLzp4ie/Qjlg94ixQwAFtKBznT3tk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMRaw0/btsHOLzp4ie/Qjlg94ixQwAFtKBznT3tk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMRaw0%2FbtsHOLzp4ie%2FQjlg94ixQwAFtKBznT3tk1%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;604&quot; height=&quot;195&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;286&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;3. 역방향 확산 과정 (Reverse process)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정방향 확산 과정을 통해 우리는 원본 이미지에 잡음을 점진적으로 추가했다. 정방향 확산 과정에서는 학습할 파라미터가 없다. 실제로 베타 스케줄링은 학습 파라미터가 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;반면 역방향 확산 과정에서는 정방향 확산 과정을 되돌릴 수 있는 신경망을 구축한다. $q(x_{t-1} | x_{t})$의 분포를 근사화하는 신경망을 구축하는 것이다. &lt;b&gt;신경망은 랜덤한 잡음(가우시안 노이즈)을 샘플링하고 역방향 확산 과정을 '여러 번' 적용하여 새로운 이미지를 생성하게 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciKJG9/btsHPbq1I6n/hpEb2tosB4I3y5SimuKtx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciKJG9/btsHPbq1I6n/hpEb2tosB4I3y5SimuKtx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciKJG9/btsHPbq1I6n/hpEb2tosB4I3y5SimuKtx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciKJG9%2FbtsHPbq1I6n%2FhpEb2tosB4I3y5SimuKtx1%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;639&quot; height=&quot;168&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;역방향 확산 신경망은 어떠한 타임 스텝 t에서 원본 이미지 $x_{0}$ 로부터 추가된 잡음 $\epsilon$을 예측한다. (t 시점의 이미지는 원본 이미지에 얼만큼의 잡음이 추가되어 있는 가를 예측)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당 신경망의 학습을 위해서는 원본 이미지에 정방향 확산을 적용시켜 $x_{t}$의 이미지와 잡음 비율 $\beta$를 신경망에 전달하여 $\epsilon$을 예측하게 되는 것이다. &lt;b&gt;따라서 loss는 예측한 $\epsilon$와 실제 $\epsilon$의 오차와 관련된 loss function을 쓰면 된다. &lt;/b&gt;여기서는 제곱 오차를 사용했다. $$ loss = \epsilon^2(실제 노이즈) - \epsilon_{\theta}^2(예측 노이즈) $$&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또한 잡음 제거 모델로 &lt;b&gt;Unet을 사용&lt;/b&gt;했다. Unet의 구조는 다음과 같다. (조금 더 자세한 Unet 구조 설명은 논문 리뷰를 통해 하겠다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV83Uk/btsHPfz5eQP/4A6l5txDcHJP79Wz7hVZm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV83Uk/btsHPfz5eQP/4A6l5txDcHJP79Wz7hVZm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV83Uk/btsHPfz5eQP/4A6l5txDcHJP79Wz7hVZm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV83Uk%2FbtsHPfz5eQP%2F4A6l5txDcHJP79Wz7hVZm1%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;527&quot; data-origin-width=&quot;799&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Unet은 $x_{t}$의 분산과 이미지를 입력으로 받아 같은 해상도의 $\epsilon$을 출력한다.&lt;/span&gt;&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: #009a87;&quot;&gt;&lt;b&gt;3-1 모델에서 샘플링하기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Unet이 학습을 잘해서 입력에 대한 $\epsilon$ 을 잘 예측하면 우리는 비로소 훈련 이미지 세트로부터 이미지를 샘플링할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;먼저 모델이 예측한 $\epsilon$을 사용하여 $x_{0}$ 을 추정한다.&amp;nbsp; 그후 추정한 &lt;span style=&quot;text-align: start;&quot;&gt;$x_{0}$에서&lt;/span&gt; $\epsilon$을 t-1까지만 재적용하여 새로운 $&lt;span style=&quot;text-align: start;&quot;&gt;x_{t-1}$을 추정한다. &lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;이 과정을 반복하면 조금씩 점진적으로 $&lt;span style=&quot;text-align: start;&quot;&gt;x_{0}$에 대한 추정치로 돌아갈 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;아래의 그림을 참고하면 이해하기 쉽다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjiZtZ/btsHNZd5DZJ/lk5mcPWcua9zF8rMuyDmiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjiZtZ/btsHNZd5DZJ/lk5mcPWcua9zF8rMuyDmiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjiZtZ/btsHNZd5DZJ/lk5mcPWcua9zF8rMuyDmiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjiZtZ%2FbtsHNZd5DZJ%2Flk5mcPWcua9zF8rMuyDmiK%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;634&quot; height=&quot;233&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;여기서 재적용할 단계는 타임스텝 t(정방향 확산 단계에서 정함)와 같을 필요가 없다고 한다. &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;다만 알아둬야 하는 것은 단계가 많아질 수록 이미지 생성 품질이 높아진다는 것과 이미지 생성에 대한 시간이 선형적으로 증가한다는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;921&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSjmrC/btsHOeWpUJa/xQMRskkdJPzlEsm8eIN101/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSjmrC/btsHOeWpUJa/xQMRskkdJPzlEsm8eIN101/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSjmrC/btsHOeWpUJa/xQMRskkdJPzlEsm8eIN101/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSjmrC%2FbtsHOeWpUJa%2FxQMRskkdJPzlEsm8eIN101%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;506&quot; height=&quot;305&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실제 훈련과정의 각 에폭에서 샘플링한 이미지를 보면 에폭이 증가할수록 훈련이 잘 되어 잡음(노이즈)을 잘 예측하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이를 denoising 함으로써 보다 그럴싸한 이미지가 샘플링되는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번 장에 대한 실습 코드는 깃허브에 올려 참고하면 좋을 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1717492143516&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;generative_ai/diffusion.ipynb at main &amp;middot; 3n952/generative_ai&quot; data-og-description=&quot;만들면서 배우는 생성 AI . Contribute to 3n952/generative_ai development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&quot; data-og-url=&quot;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bawjSQ/hyWg54cyvI/kHRQkuK2MkxowMubJf7LG1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/3n952/generative_ai/blob/main/diffusion.ipynb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bawjSQ/hyWg54cyvI/kHRQkuK2MkxowMubJf7LG1/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;generative_ai/diffusion.ipynb at main &amp;middot; 3n952/generative_ai&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;만들면서 배우는 생성 AI . Contribute to 3n952/generative_ai development by creating an account on GitHub.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;reference&lt;br /&gt;[1] diffusion 설명 영상, &lt;a href=&quot;http:// https://www.youtube.com/watch?v=jaPPALsUZo8&amp;amp;t=463s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http:// https://www.youtube.com/watch?v=jaPPALsUZo8&amp;amp;t=463s&lt;/a&gt;&lt;/blockquote&gt;</description>
      <category>Study/[만들면서 배우는 생성형 AI] 리뷰</category>
      <author>알파고라니</author>
      <guid isPermaLink="true">https://sanmldl.tistory.com/72</guid>
      <comments>https://sanmldl.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 4 Jun 2024 18:12:07 +0900</pubDate>
    </item>
  </channel>
</rss>