<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dev-self 님의 블로그</title>
    <link>https://dev-self.tistory.com/</link>
    <description>dev-self 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 05:00:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev-self</managingEditor>
    <item>
      <title>패스트캠퍼스 환급챌린지 56일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;n-step TD 알고리즘 디버깅 분석&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 핵심 수식과 실제 데이터 연관성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;n-step 리턴 수식&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNaFpL/btsNDrWFAUZ/Cbhkey1jkjurhxWwhXYjbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNaFpL/btsNDrWFAUZ/Cbhkey1jkjurhxWwhXYjbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNaFpL/btsNDrWFAUZ/Cbhkey1jkjurhxWwhXYjbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNaFpL%2FbtsNDrWFAUZ%2FCbhkey1jkjurhxWwhXYjbk%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;928&quot; height=&quot;87&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅 결과에서 이 수식이 실제로 어떻게 작용하는지 확인할 수 있다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;n=1 (TD(0))&lt;/b&gt;: 초기 상태의 최종 가치 = 0.473&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n=3&lt;/b&gt;: 초기 상태의 최종 가치 = 0.704&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n=5&lt;/b&gt;: 초기 상태의 최종 가치 = 0.750&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n이 클수록 가치 함수 값이 높게 나타나는 것은 더 멀리 있는 보상 신호를 직접 고려하기 때문이다. 특히 그래프에서 n=5(파란색)와 n=3(초록색)의 학습 곡선이 n=1(빨간색)보다 훨씬 빠르게 상승하는 현상을 통해 이를 확인할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가치 함수 업데이트 수식&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0aqRX/btsNDY7wqyV/VN85pk5Eto4aAhh8yljraK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0aqRX/btsNDY7wqyV/VN85pk5Eto4aAhh8yljraK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0aqRX/btsNDY7wqyV/VN85pk5Eto4aAhh8yljraK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0aqRX%2FbtsNDY7wqyV%2FVN85pk5Eto4aAhh8yljraK%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;518&quot; height=&quot;89&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;89&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;alpha;)이 점진적으로 감소하는 것을 볼 수 있다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;alpha: 0.0020
alpha: 0.0016
alpha: 0.0013
alpha: 0.0011
alpha: 0.0010
alpha: 0.0009
alpha: 0.0008&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 학습률 감소 수식이 작동한 결과이다. 학습률 감소로 인해 그래프에서 모든 n값의 경우 후반부에 학습 곡선이 안정화되는 현상을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbMJJf/btsNC8QyFj1/q30Ju9qi7DfJJQzwwQxzG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbMJJf/btsNC8QyFj1/q30Ju9qi7DfJJQzwwQxzG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbMJJf/btsNC8QyFj1/q30Ju9qi7DfJJQzwwQxzG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbMJJf%2FbtsNC8QyFj1%2Fq30Ju9qi7DfJJQzwwQxzG0%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;267&quot; height=&quot;52&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. n값에 따른 학습 특성 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;학습 속도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅 결과에서 각 n값에 따른 동일 반복 횟수에서의 가치 함수를 비교해보면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=1의 경우 1000번 반복 후에도 가치가 0.473에 그치지만, n=5는 약 50번 반복만에 0.7 이상에 도달한다. 이는 n-step 리턴 수식에서 n이 클수록 더 많은 미래 보상을 직접 고려하기 때문이다. 그래프에서도 초기 상승 속도가 n=5 &amp;gt; n=3 &amp;gt; n=1 순서로 명확하게 나타난다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안정성과 변동성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프에서 n=5(파란색)는 초기에 큰 변동성을 보이며, 심지어 0.8 이상까지 급상승했다가 다시 하락하는 패턴을 보인다. 반면 n=1(빨간색)은 매우 안정적인 곡선을 그린다. 이는 n-step 리턴 수식에서 n이 클수록 더 많은 실제 보상 항 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;R&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;을 포함하고 부트스트래핑 항 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;gamma;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 비중이 줄어들기 때문이다. 실제 보상은 에피소드마다 달라질 수 있어 변동성이 크다. 디버깅 출력의 value_vector 값들도 반복에 따라 n=5가 n=1보다 더 큰 변화를 보인다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 수렴 값&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅 결과에서 4x4 그리드의 각 위치별 최종 가치 함수 값을 볼 수 있다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=1의 value_table:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[ 0.032  0.061  0.123  0.197]
[ 0.067  0.161  0.396  0.720]
[ 0.151  0.446  1.319  2.894]
[ 0.270  0.932  3.355  0.000]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=5의 value_table:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[ 0.546  0.677  0.929  1.134]
[ 0.673  0.919  1.438  1.975]
[ 0.866  1.337  2.523  4.247]
[ 1.066  1.849  4.153  0.000]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=5의 경우가 전반적으로 더 높은 가치 함수 값을 보여주며, 특히 목표에서 멀리 떨어진 초기 상태에서 큰 차이가 난다. 이는 n이 클수록 먼 미래의 보상이 현재 상태 가치에 더 직접적으로 반영되기 때문이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. k_min을 통한 에피소드 끝 처리의 영향&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에피소드 끝 처리를 위한 k_min 수식:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9k3wv/btsNCvrJEe1/psXLqVol7Vbw5PiDqrO841/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9k3wv/btsNCvrJEe1/psXLqVol7Vbw5PiDqrO841/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9k3wv/btsNCvrJEe1/psXLqVol7Vbw5PiDqrO841/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9k3wv%2FbtsNCvrJEe1%2FpsXLqVol7Vbw5PiDqrO841%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;339&quot; height=&quot;73&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;73&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;디버깅 결과에서는 직접적으로 보이지 않지만, n=5의 경우 에피소드 끝에 가까운 상태들은 실제로 5스텝보다 적은 스텝으로 업데이트된다. 이로 인해 목표에 가까운 상태들의 가치가 더 정확하게 계산되며, 그래프에서 n=5가 초기 변동 후 안정적으로 수렴하는 데 기여한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 편향-분산 트레이드오프&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n값이 학습에 미치는 영향은 편향(bias)과 분산(variance)의 트레이드오프로 설명된다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;n=1&lt;/b&gt;: 낮은 분산(안정적 학습)이지만 높은 편향(느린 수렴)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n=5&lt;/b&gt;: 낮은 편향(빠른 정보 전파)이지만 높은 분산(불안정한 학습)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프에서 n=1은 변동 없이 천천히 상승하는 반면, n=5는 큰 변동성과 함께 빠르게 상승한다. 이는 수식에서 예측한 특성과 정확히 일치한다. 또한 디버깅 결과의 value_vector 값들을 보면, n=1은 점진적으로 변화하지만 n=5는 더 급격한 변화를 보이는 것을 확인할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-step TD 알고리즘의 수식과 디버깅 결과를 종합적으로 분석한 결과, n값 선택이 학습 특성에 미치는 영향을 명확히 확인할 수 있다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;n이 클수록&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습 속도가 빨라짐 (그래프의 초기 급상승)&lt;/li&gt;
&lt;li&gt;변동성이 커짐 (그래프의 불규칙한 패턴)&lt;/li&gt;
&lt;li&gt;최종 가치 함수 값이 높아짐 (디버깅 출력의 value_table)&lt;/li&gt;
&lt;li&gt;편향은 감소하지만 분산이 증가 (그래프의 학습 패턴)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습률 감소 전략&lt;/b&gt;은 모든 n값에서 후반부 안정적 수렴에 기여 (디버깅 출력의 alpha 감소)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;k_min을 통한 에피소드 끝 처리&lt;/b&gt;는 n이 클수록 더 많은 상태에 영향을 미침&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 분석은 실제 강화학습 시스템 설계 시 문제의 특성과 요구사항에 맞는 최적의 n값을 선택하는 데 도움이 된다. 빠른 학습이 중요하다면 큰 n값을, 안정적인 학습이 중요하다면 작은 n값을 선택하는 것이 적절할 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3115&quot; data-origin-height=&quot;2019&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lv5B7/btsNCmvdFhd/yPNBUG1U9HmGDck2auizbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lv5B7/btsNCmvdFhd/yPNBUG1U9HmGDck2auizbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lv5B7/btsNCmvdFhd/yPNBUG1U9HmGDck2auizbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLv5B7%2FbtsNCmvdFhd%2FyPNBUG1U9HmGDck2auizbk%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;3115&quot; height=&quot;2019&quot; data-origin-width=&quot;3115&quot; data-origin-height=&quot;2019&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-step TD 알고리즘에서 n값에 따른 특성을 비교한 시각적 다이어그램을 만들었다. 이 다이어그램은 n=1, n=3, n=5 각각의 특성을 명확하게 보여준다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n값에 따른 특성 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;n=1 (TD(0))&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수식&lt;/b&gt;: G_t^(1) = R_{t+1} + &amp;gamma;V(S_{t+1})&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 속도&lt;/b&gt;: 느림 (V(0,0) = 0.473, 1000회 반복 후)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: 매우 안정적, 부드러운 학습 곡선&lt;/li&gt;
&lt;li&gt;&lt;b&gt;편향-분산&lt;/b&gt;: 높은 편향, 낮은 분산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 부트스트래핑 의존도가 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;n=3 (중간값)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수식&lt;/b&gt;: G_t^(3) = R_{t+1} + &amp;gamma;R_{t+2} + &amp;gamma;&amp;sup2;R_{t+3} + &amp;gamma;&amp;sup3;V(S_{t+3})&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 속도&lt;/b&gt;: 중간 (V(0,0) = 0.704)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: 적당히 안정적, 약간의 변동성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;편향-분산&lt;/b&gt;: 균형된 편향과 분산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: TD(0)와 몬테카를로 방식의 좋은 절충점&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;n=5 (몬테카를로에 가까움)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수식&lt;/b&gt;: G_t^(5) = R_{t+1} + ... + &amp;gamma;^4R_{t+5} + &amp;gamma;^5V(S_{t+5})&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 속도&lt;/b&gt;: 빠름 (V(0,0) = 0.750)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정성&lt;/b&gt;: 초기 불안정, 큰 변동성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;편향-분산&lt;/b&gt;: 낮은 편향, 높은 분산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: 더 많은 실제 보상을 고려하여 정보 전파가 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 곡선 특성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다이어그램 하단의 그래프는 각 n값에 따른 학습 곡선의 특성을 보여준다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;n=1 (빨간색)&lt;/b&gt;: 부드럽게 천천히 상승하는 곡선&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n=3 (초록색)&lt;/b&gt;: 빠르게 상승 후 안정적으로 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n=5 (파란색)&lt;/b&gt;: 매우 빠르게 상승하나 큰 변동성을 보임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시각화를 통해 n값에 따른 학습 특성의 차이를 한눈에 볼 수 있다. n값 선택은 빠른 학습과 안정성 사이의 트레이드오프를 고려해야 하며, 문제의 특성에 맞게 적절한 n값을 선택하는 것이 중요하다.&lt;/p&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8jaQ7/btsNDZrOC2P/T16dI4Vj7zXSGf2Py6STI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8jaQ7/btsNDZrOC2P/T16dI4Vj7zXSGf2Py6STI0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;1695&quot; data-filename=&quot;Screenshot from 2025-04-29 01-05-54.png&quot; style=&quot;width: 29.5009%; margin-right: 10px;&quot; data-widthpercent=&quot;30.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8jaQ7/btsNDZrOC2P/T16dI4Vj7zXSGf2Py6STI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8jaQ7%2FbtsNDZrOC2P%2FT16dI4Vj7zXSGf2Py6STI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;1695&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVxyNy/btsNCe4NXKw/7JPdNKgUs76HmNnfOCIPt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVxyNy/btsNCe4NXKw/7JPdNKgUs76HmNnfOCIPt0/img.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1438&quot; data-is-animation=&quot;false&quot; style=&quot;width: 34.2033%; margin-right: 10px;&quot; data-widthpercent=&quot;35.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVxyNy/btsNCe4NXKw/7JPdNKgUs76HmNnfOCIPt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVxyNy%2FbtsNCe4NXKw%2F7JPdNKgUs76HmNnfOCIPt0%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;600&quot; height=&quot;1438&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsicor/btsNCAfJrxZ/bCrk09DuOFHZxTi47xRvTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsicor/btsNCAfJrxZ/bCrk09DuOFHZxTi47xRvTK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;1472&quot; data-filename=&quot;Screenshot from 2025-04-29 01-06-01.png&quot; style=&quot;width: 33.9702%;&quot; data-widthpercent=&quot;34.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsicor/btsNCAfJrxZ/bCrk09DuOFHZxTi47xRvTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsicor%2FbtsNCAfJrxZ%2FbCrk09DuOFHZxTi47xRvTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;1472&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&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/bB4YB6/btsND5S5YPw/QPwlJ2hDTnqhZzE9MjS2XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB4YB6/btsND5S5YPw/QPwlJ2hDTnqhZzE9MjS2XK/img.png&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1570&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Screenshot from 2025-04-29 01-28-06.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/bB4YB6/btsND5S5YPw/QPwlJ2hDTnqhZzE9MjS2XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB4YB6%2FbtsND5S5YPw%2FQPwlJ2hDTnqhZzE9MjS2XK%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;2256&quot; height=&quot;1570&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QCSYr/btsNCZGk8hn/oHkAMKEwYtgvzR3GxI1gl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QCSYr/btsNCZGk8hn/oHkAMKEwYtgvzR3GxI1gl1/img.png&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1570&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Screenshot from 2025-04-29 01-27-59.png&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QCSYr/btsNCZGk8hn/oHkAMKEwYtgvzR3GxI1gl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQCSYr%2FbtsNCZGk8hn%2FoHkAMKEwYtgvzR3GxI1gl1%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;2256&quot; height=&quot;1570&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/63</guid>
      <comments>https://dev-self.tistory.com/63#entry63comment</comments>
      <pubDate>Tue, 29 Apr 2025 01:28:54 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 55일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;n-step TD 강화학습 알고리즘 코드 구조 및 실행 흐름&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3786&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqdsJ/btsNDEH2S9u/KNikPVeTGwneoS69nkk8Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqdsJ/btsNDEH2S9u/KNikPVeTGwneoS69nkk8Mk/img.png&quot; data-alt=&quot;코드구조도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqdsJ/btsNDEH2S9u/KNikPVeTGwneoS69nkk8Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqdsJ%2FbtsNDEH2S9u%2FKNikPVeTGwneoS69nkk8Mk%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;3786&quot; height=&quot;1488&quot; data-origin-width=&quot;3786&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드구조도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환경(Environment) 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 environment.py는 4x4 그리드 환경을 정의한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트는 (0,0)에서 시작하여 (3,3)의 목표 위치에 도달해야 한다.&lt;/li&gt;
&lt;li&gt;상태 공간은 4x4 그리드로 표현된다.&lt;/li&gt;
&lt;li&gt;행동 공간은 {0: 위, 1: 오른쪽, 2: 아래, 3: 왼쪽}이다.&lt;/li&gt;
&lt;li&gt;목표에 도달하면 보상 10을 받는다.&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;2148&quot; data-origin-height=&quot;2122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wpbQ9/btsNBzHYVlV/kIiOFBY14CnB404akHCulk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wpbQ9/btsNBzHYVlV/kIiOFBY14CnB404akHCulk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wpbQ9/btsNBzHYVlV/kIiOFBY14CnB404akHCulk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwpbQ9%2FbtsNBzHYVlV%2FkIiOFBY14CnB404akHCulk%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;2148&quot; height=&quot;2122&quot; data-origin-width=&quot;2148&quot; data-origin-height=&quot;2122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n-step TD 학습 알고리즘 핵심 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 두 가지 버전의 n-step TD가 구현되어 있다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;n_step_td_prediction.py: 일반적인 n-step TD 예측&lt;/li&gt;
&lt;li&gt;episodic_n_step_td_prediction.py: 에피소드 기반 n-step TD 예측&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 알고리즘 부분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Return 계산 함수&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;maxima&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def calc_return(gamma, rewards):
    n = len(rewards)
    rewards = np.array(rewards)
    gammas = gamma * np.ones([n])
    powers = np.arange(n)
    
    power_of_gammas = np.power(gammas, powers)
    discounted_rewards = rewards * power_of_gammas  # [r, gamma * r, gamma^2 * r, ... ]
    g = np.sum(discounted_rewards)

    return g&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 n-step 리턴(G_t^(n))을 계산한다. 수식으로 표현하면:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCnIN/btsNC0rk6oB/YLrAiks3mZP037HzUa4kuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCnIN/btsNC0rk6oB/YLrAiks3mZP037HzUa4kuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCnIN/btsNC0rk6oB/YLrAiks3mZP037HzUa4kuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCnIN%2FbtsNC0rk6oB%2FYLrAiks3mZP037HzUa4kuK%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;1022&quot; height=&quot;72&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;n-step TD 업데이트 핵심 부분&lt;/b&gt;&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;discounted_rewards = calc_return(gamma, trajectory['rewards'])
td = discounted_rewards + (gamma ** n) * value_vector[i_s_t] - value_vector[i_s_t_sub_n]
value_vector[i_s_t_sub_n] = value_vector[i_s_t_sub_n] + alpha * td&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 n-step TD 업데이트 규칙을 구현한다. 수식으로 표현하면:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rR5bn/btsNC9O6t6p/BYaYOa4bCb3i6rBJcMdYBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rR5bn/btsNC9O6t6p/BYaYOa4bCb3i6rBJcMdYBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rR5bn/btsNC9O6t6p/BYaYOa4bCb3i6rBJcMdYBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrR5bn%2FbtsNC9O6t6p%2FBYaYOa4bCb3i6rBJcMdYBK%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;581&quot; height=&quot;65&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 상태 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 현재 가치 추정값&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 학습률&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;은 n-step 리턴(아래수식):&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;1022&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DtXwI/btsNBd6eWdO/dziHZ9YTi61Nn8KhAG8dkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DtXwI/btsNBd6eWdO/dziHZ9YTi61Nn8KhAG8dkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DtXwI/btsNBd6eWdO/dziHZ9YTi61Nn8KhAG8dkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDtXwI%2FbtsNBd6eWdO%2FdziHZ9YTi61Nn8KhAG8dkK%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;1022&quot; height=&quot;76&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;2115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B5drK/btsND5rCPfk/W4KNGUykBiXoP6NU13WWF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B5drK/btsND5rCPfk/W4KNGUykBiXoP6NU13WWF0/img.png&quot; data-alt=&quot;알고리즘 실행 흐름도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B5drK/btsND5rCPfk/W4KNGUykBiXoP6NU13WWF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5drK%2FbtsND5rCPfk%2FW4KNGUykBiXoP6NU13WWF0%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;1096&quot; height=&quot;2115&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;2115&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 실행 흐름도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일반 n-step TD와 에피소드 n-step TD의 차이점&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYzVQF/btsNBbgiKsx/CBYqVDK0xnANeu4Lk6P2Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYzVQF/btsNBbgiKsx/CBYqVDK0xnANeu4Lk6P2Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYzVQF/btsNBbgiKsx/CBYqVDK0xnANeu4Lk6P2Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYzVQF%2FbtsNBbgiKsx%2FCBYqVDK0xnANeu4Lk6P2Xk%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;1050&quot; height=&quot;655&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;일반 n-step TD&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경로(trajectory)를 따라가며 n-step 단위로 업데이트&lt;/li&gt;
&lt;li&gt;종료 상태에서는 추가 처리를 통해 남은 상태들을 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에피소드 n-step TD&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 에피소드를 생성한 후에 각 상태를 업데이트&lt;/li&gt;
&lt;li&gt;아래 코드가 핵심:&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;for t in range(step_count):
    alpha = alpha_init / (1 + k_alpha * loop_count)
    k_min = min(n, step_count - t)

    s_t = episode['states'][t]
    i_s_t = get_state_index(env.state_space, s_t)
    s_t_k = episode['states'][t + k_min]
    i_s_t_k = get_state_index(env.state_space, s_t_k)
    discounted_rewards = calc_return(gamma, episode['rewards'][t:t + k_min])
    td = discounted_rewards + (gamma ** k_min) * value_vector[i_s_t_k] - value_vector[i_s_t]
    value_vector[i_s_t] = value_vector[i_s_t] + alpha * td&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에피소드 끝에 가까울 때는 남은 스텝 수만큼만 고려&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byBLj7/btsNDEuxWNl/7a6OfEngRKlHNqEgk2uQRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byBLj7/btsNDEuxWNl/7a6OfEngRKlHNqEgk2uQRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byBLj7/btsNDEuxWNl/7a6OfEngRKlHNqEgk2uQRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyBLj7%2FbtsNDEuxWNl%2F7a6OfEngRKlHNqEgk2uQRk%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;370&quot; height=&quot;51&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;51&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습률 감소 전략&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서는 학습률을 점진적으로 감소시키는 방식을 사용한다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 n-step TD&lt;/b&gt; (n_step_td_prediction.py):&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 루프 내에서 학습률 감소
alpha = alpha_init / (1 + k_alpha * loop_count)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;에피소드 n-step TD&lt;/b&gt; (episodic_n_step_td_prediction.py):&lt;/p&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;for t in range(step_count):
    alpha = alpha_init / (1 + k_alpha * loop_count)
    # ... 나머지 코드&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;이 코드는 학습률을 반복 횟수(loop_count)에 따라 점진적으로 감소시키는 전략을 구현한다. 수식으로 표현하면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kS1dW/btsNCyhjph9/NNN1k7lBduLBJVbcKmQi71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kS1dW/btsNCyhjph9/NNN1k7lBduLBJVbcKmQi71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kS1dW/btsNCyhjph9/NNN1k7lBduLBJVbcKmQi71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkS1dW%2FbtsNCyhjph9%2FNNN1k7lBduLBJVbcKmQi71%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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;alpha;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;ini&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = 0.2 (초기 학습률)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;alpha;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; = 0.25 (학습률 감소 계수)&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;oo&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;co&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 반복 횟수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 초기에는 큰 학습률로 빠르게 학습하다가, 반복 횟수가 증가함에 따라 학습률을 점진적으로 줄여 안정적인 수렴을 돕는 전략이다. 이렇게 학습률을 감소시키는 것은 강화학습에서 흔히 사용되는 기법으로, 초기에는 큰 변화를 허용하고 후반부에는 미세 조정을 가능하게 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 변수 할당을 통한 코드 실행 과정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1036&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PO0t7/btsNEfVbHai/76EC6gqpgVLUQ8wf55XKpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PO0t7/btsNEfVbHai/76EC6gqpgVLUQ8wf55XKpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PO0t7/btsNEfVbHai/76EC6gqpgVLUQ8wf55XKpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPO0t7%2FbtsNEfVbHai%2F76EC6gqpgVLUQ8wf55XKpk%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;1096&quot; height=&quot;1036&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;1036&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 data-ke-size=&quot;size26&quot;&gt;환경 설정 및 경로&lt;/h2&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;시작 상태: (0,0)&lt;/li&gt;
&lt;li&gt;행동 순서: 오른쪽 &amp;rarr; 오른쪽 &amp;rarr; 아래 &amp;rarr; 아래 &amp;rarr; 오른쪽 &amp;rarr; 아래&lt;/li&gt;
&lt;li&gt;목표 도달: (3,3)&lt;/li&gt;
&lt;li&gt;최종 경로: (0,0) &amp;rarr; (0,1) &amp;rarr; (0,2) &amp;rarr; (1,2) &amp;rarr; (2,2) &amp;rarr; (2,3) &amp;rarr; (3,3)&lt;/li&gt;
&lt;li&gt;보상: 목표 도달 시 +10, 나머지는 0&lt;/li&gt;
&lt;li&gt;감가율(&amp;gamma;): 0.9&lt;/li&gt;
&lt;li&gt;학습률(&amp;alpha;): 0.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n=1 TD (일반 TD) 수행 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD(0)라고도 하는 n=1 TD는 각 상태에서 한 스텝 앞만 보고 업데이트한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;초기 상태 (t=0): 모든 상태의 가치 함수 V(s) = 0으로 초기화&lt;/li&gt;
&lt;li&gt;각 스텝별 업데이트:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스텝 1 (0,0) &amp;rarr; (0,1): 보상 0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(0,0) = 0 + 0.2 &amp;times; (0 + 0.9&amp;times;0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 2 (0,1) &amp;rarr; (0,2): 보상 0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(0,1) = 0 + 0.2 &amp;times; (0 + 0.9&amp;times;0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 3 (0,2) &amp;rarr; (1,2): 보상 0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(0,2) = 0 + 0.2 &amp;times; (0 + 0.9&amp;times;0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 4 (1,2) &amp;rarr; (2,2): 보상 0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(1,2) = 0 + 0.2 &amp;times; (0 + 0.9&amp;times;0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 5 (2,2) &amp;rarr; (2,3): 보상 0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(2,2) = 0 + 0.2 &amp;times; (0 + 0.9&amp;times;0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 6 (2,3) &amp;rarr; (3,3): 보상 10
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 업데이트: V(2,3) = 0 + 0.2 &amp;times; (10 + 0.9&amp;times;0 - 0) = 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종 가치 함수:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V(2,3) = 2.0 (목표 직전 상태만 가치가 갱신됨)&lt;/li&gt;
&lt;li&gt;다른 모든 상태 = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=1 TD의 특징은 한 번의 에피소드에서 목표에 인접한 상태의 가치만 갱신되었다는 점이다. 정보가 한 스텝씩만 거슬러 올라가 전파되므로, 여러 에피소드를 통해 점진적으로 먼 상태들의 가치가 갱신된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n=3 TD 수행 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=3 TD는 각 상태에서 세 스텝 앞까지 보고 업데이트한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;초기 상태 (t=0): 모든 상태의 가치 함수 V(s) = 0으로 초기화&lt;/li&gt;
&lt;li&gt;각 스텝별 업데이트:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스텝 1~3 (0,0 &amp;rarr; 0,1 &amp;rarr; 0,2 &amp;rarr; 1,2):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 시점에서 첫 n=3 업데이트 수행&lt;/li&gt;
&lt;li&gt;3단계 리턴 계산: G = 0 + 0.9&amp;times;0 + 0.9&amp;sup2;&amp;times;0 = 0&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(0,0) = 0 + 0.2 &amp;times; (0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 2~4 (0,1 &amp;rarr; 0,2 &amp;rarr; 1,2 &amp;rarr; 2,2):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3단계 리턴 계산: G = 0 + 0.9&amp;times;0 + 0.9&amp;sup2;&amp;times;0 = 0&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(0,1) = 0 + 0.2 &amp;times; (0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 3~5 (0,2 &amp;rarr; 1,2 &amp;rarr; 2,2 &amp;rarr; 2,3):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3단계 리턴 계산: G = 0 + 0.9&amp;times;0 + 0.9&amp;sup2;&amp;times;0 = 0&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(0,2) = 0 + 0.2 &amp;times; (0 - 0) = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;스텝 4~6 (1,2 &amp;rarr; 2,2 &amp;rarr; 2,3 &amp;rarr; 3,3):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3단계 리턴 계산: G = 0 + 0.9&amp;times;0 + 0.9&amp;sup2;&amp;times;10 = 8.1&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(1,2) = 0 + 0.2 &amp;times; (8.1 - 0) = 1.62&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;에피소드 종료 후 남은 상태 업데이트 (에피소드 끝 처리):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k_min = min(3, 6-5) = 1 (상태 2,2의 경우)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1단계 리턴 계산: G = 0 + 0.9&amp;times;10 = 9.0&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(2,2) = 0 + 0.2 &amp;times; (9.0 - 0) = 1.8&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;k_min = min(3, 6-6) = 0 (상태 2,3의 경우)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0단계 리턴 계산: G = 10&lt;/li&gt;
&lt;li&gt;TD 업데이트: V(2,3) = 0 + 0.2 &amp;times; (10 - 0) = 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종 가치 함수:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V(1,2) = 1.62&lt;/li&gt;
&lt;li&gt;V(2,2) = 1.8&lt;/li&gt;
&lt;li&gt;V(2,3) = 2.0&lt;/li&gt;
&lt;li&gt;다른 상태 = 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=3 TD의 특징은 한 번의 에피소드에서도 목표에서 더 멀리 떨어진 상태들의 가치가 갱신된다는 점이다. 이는 더 긴 시퀀스의 보상을 고려하기 때문이다.&lt;/p&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;&lt;b&gt;가치 전파 범위&lt;/b&gt;: n=1에서는 목표와 인접한 상태만 가치가 업데이트되었지만, n=3에서는 목표에서 최대 3단계 떨어진 상태까지 가치가 전파됩니다. V(1,2)까지 값이 갱신된 것을 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에피소드 끝 처리&lt;/b&gt;: n=3 방식에서는 에피소드 끝에 가까워지면 k_min = min(n, T-t) 방식으로 남은 단계만큼만 고려한다. 이로 인해 상태 (2,2)는 2단계 리턴으로, 상태 (2,3)은 1단계 리턴으로 업데이트되었다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;감가율 효과&lt;/b&gt;: 상태에서 목표까지 거리가 멀수록 감가율(&amp;gamma;)로 인해 가치가 낮아진다. 예를 들어:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V(2,3) = 2.0 (목표에서 1단계 거리)&lt;/li&gt;
&lt;li&gt;V(2,2) = 1.8 (목표에서 2단계 거리)&lt;/li&gt;
&lt;li&gt;V(1,2) = 1.62 (목표에서 3단계 거리)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n값에 따른 비교 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=1(TD(0))과 n=3의 비교를 통해 다음과 같은 차이점을 관찰할 수 있다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;정보 전파 속도&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n=1: 한 번의 에피소드에서는 목표와 직접 연결된 상태만 업데이트&lt;/li&gt;
&lt;li&gt;n=3: 한 번의 에피소드로 목표에서 최대 3단계 떨어진 상태까지 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가치 추정 정확도&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n=1: 더 작은 시야로 인해 먼 상태의 가치 추정이 부정확할 수 있음&lt;/li&gt;
&lt;li&gt;n=3: 더 긴 시퀀스를 보기 때문에 먼 상태의 가치를 더 정확하게 추정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 특성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n=1: 편향(bias)은 크지만 분산(variance)은 작음&lt;/li&gt;
&lt;li&gt;n=3: n=1보다 편향은 작지만 분산은 큼&lt;/li&gt;
&lt;li&gt;n이 클수록 몬테카를로 방식에 가까워짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;계산 복잡성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n=1: 간단한 계산 (다음 상태와 보상만 고려)&lt;/li&gt;
&lt;li&gt;n=3: 더 복잡한 계산 (여러 단계의 보상을 누적해서 계산)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 구현에서의 고려사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 n-step TD 알고리즘 구현 시 다음 사항들을 고려해야 한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 사용&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 클수록 더 많은 전이(상태, 행동, 보상)를 메모리에 저장해야 함&lt;/li&gt;
&lt;li&gt;에피소드 방식은 전체 에피소드를 메모리에 저장해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습률 감소 전략&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드에서는 alpha = alpha_init / (1 + k_alpha * loop_count) 방식으로 학습률을 감소&lt;/li&gt;
&lt;li&gt;이를 통해 초기에는 빠르게 학습하고 후반에는 안정적으로 수렴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에피소드 끝 처리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에피소드가 끝날 때는 남은 상태들에 대해 k_min = min(n, T-t) 방식으로 업데이트&lt;/li&gt;
&lt;li&gt;이를 통해 에피소드 끝에 가까운 상태들도 적절하게 업데이트됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n값 선택&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제의 특성에 따라 적절한 n값 선택이 중요&lt;/li&gt;
&lt;li&gt;n이 작을수록 편향이 크고, n이 클수록 분산이 커짐&lt;/li&gt;
&lt;li&gt;실전에서는 여러 n값으로 실험하여 최적의 값 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-step TD 알고리즘은 n값을 조절함으로써 TD(0)와 몬테카를로 방법 사이의 균형점을 찾을 수 있는 유연한 방법이다. 시뮬레이션 결과를 통해 n=3이 n=1보다 한 번의 에피소드에서 더 많은 정보를 전파하고, 더 멀리 있는 상태의 가치를 더 정확하게 추정할 수 있음을 확인했다. 실제 강화학습 시스템을 구현할 때는 편향-분산 트레이드오프, 계산 복잡성, 메모리 요구사항 등을 고려하여 적절한 n값을 선택하는 것이 중요하다.&lt;/p&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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0Wfd/btsNDQO3I4W/tlWpCNIkvwwkS1uyacKdp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0Wfd/btsNDQO3I4W/tlWpCNIkvwwkS1uyacKdp0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;1716&quot; data-filename=&quot;Screenshot from 2025-04-28 16-01-38.png&quot; style=&quot;width: 30.1845%; margin-right: 10px;&quot; data-widthpercent=&quot;30.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0Wfd/btsNDQO3I4W/tlWpCNIkvwwkS1uyacKdp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0Wfd%2FbtsNDQO3I4W%2FtlWpCNIkvwwkS1uyacKdp0%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;575&quot; height=&quot;1716&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b57sue/btsND56iw5i/WdB01EvCApS7HbPvGtQD71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b57sue/btsND56iw5i/WdB01EvCApS7HbPvGtQD71/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;1681&quot; data-filename=&quot;Screenshot from 2025-04-28 16-28-29.png&quot; style=&quot;width: 32.2062%; margin-right: 10px;&quot; data-widthpercent=&quot;32.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b57sue/btsND56iw5i/WdB01EvCApS7HbPvGtQD71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb57sue%2FbtsND56iw5i%2FWdB01EvCApS7HbPvGtQD71%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;601&quot; height=&quot;1681&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5mXHT/btsNDsA0yt9/7w0tIXBKILzyxVt0Xey32K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5mXHT/btsNDsA0yt9/7w0tIXBKILzyxVt0Xey32K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;1468&quot; data-filename=&quot;Screenshot from 2025-04-28 16-01-52.png&quot; style=&quot;width: 35.2837%;&quot; data-widthpercent=&quot;36.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5mXHT/btsNDsA0yt9/7w0tIXBKILzyxVt0Xey32K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5mXHT%2FbtsNDsA0yt9%2F7w0tIXBKILzyxVt0Xey32K%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;575&quot; height=&quot;1468&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;1366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRnfri/btsNCxbNoj9/RAJJDteXTwecUWAAjX8Kdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRnfri/btsNCxbNoj9/RAJJDteXTwecUWAAjX8Kdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRnfri/btsNCxbNoj9/RAJJDteXTwecUWAAjX8Kdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRnfri%2FbtsNCxbNoj9%2FRAJJDteXTwecUWAAjX8Kdk%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;1067&quot; height=&quot;1366&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;1366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/62</guid>
      <comments>https://dev-self.tistory.com/62#entry62comment</comments>
      <pubDate>Mon, 28 Apr 2025 16:10:30 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 54일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;다단계 가치 함수(Multi-step Value Function)와 축약 연산자(Contraction Operator)의 핵심 개념&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 가치 함수의 정의&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caW5Ur/btsNz6Gbyc8/LUUzJECnn5fXrcYKNk8mj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caW5Ur/btsNz6Gbyc8/LUUzJECnn5fXrcYKNk8mj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caW5Ur/btsNz6Gbyc8/LUUzJECnn5fXrcYKNk8mj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaW5Ur%2FbtsNz6Gbyc8%2FLUUzJECnn5fXrcYKNk8mj1%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;772&quot; height=&quot;137&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;137&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;이 수식은 n-step TD 업데이트 식과 직접적인 연관이 있다. 특히:&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;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;E&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)이 충분한 샘플 조건에서 실제 기대값(&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)으로 표현된 것이다.&lt;/li&gt;
&lt;li&gt;이것은 정책 &amp;pi;를 따랐을 때 상태 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 실제 가치를 n-step 반환값의 기대값으로 정의하고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;연산자 적용&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FSpHq/btsNBcSP0yW/ZwwmLpTWEk1R54BNhYXkUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FSpHq/btsNBcSP0yW/ZwwmLpTWEk1R54BNhYXkUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FSpHq/btsNBcSP0yW/ZwwmLpTWEk1R54BNhYXkUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFSpHq%2FbtsNBcSP0yW%2FZwwmLpTWEk1R54BNhYXkUk%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;425&quot; height=&quot;67&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 표현은 연산자 개념을 직접 나타낸다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연산자 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;가 어떤 가치 함수(&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)에 적용되어 새로운 가치 함수로 변환되는 과정을 보여준다.&lt;/li&gt;
&lt;li&gt;아래의 식과 연관된다.&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;226&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dccRyb/btsNCvDWblJ/2FpzUKcmkZODDqe8MWHlGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dccRyb/btsNCvDWblJ/2FpzUKcmkZODDqe8MWHlGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dccRyb/btsNCvDWblJ/2FpzUKcmkZODDqe8MWHlGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdccRyb%2FbtsNCvDWblJ%2F2FpzUKcmkZODDqe8MWHlGK%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;226&quot; height=&quot;62&quot; data-origin-width=&quot;226&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;연산자 차이의 절댓값&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Blc6/btsNz846peT/Pv03tfBIFMHhiDRn678nRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Blc6/btsNz846peT/Pv03tfBIFMHhiDRn678nRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Blc6/btsNz846peT/Pv03tfBIFMHhiDRn678nRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Blc6%2FbtsNz846peT%2FPv03tfBIFMHhiDRn678nRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;988&quot; height=&quot;69&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 가치 함수 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;과 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에 n-step 연산자 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 적용했을 때, 특정 상태 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에서의 결과 차이를 절댓값으로 표현한다.&lt;/li&gt;
&lt;li&gt;이 차이는 n 스텝 후의 상태에서 두 가치 함수의 차이에 대한 기대값에 비례한다(비례 상수 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;).&lt;/li&gt;
&lt;li&gt;중요한 점은 이 차이가 원래 가치 함수의 직접적인 차이가 아니라, n 스텝 후 도달하는 상태에서의 가치 차이에 의존한다는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;b&gt;수정된 연산자 차이 표현&lt;/b&gt;:&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Group 35383 (1).png&quot; data-origin-width=&quot;1337&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bo2ho/btsNA3vdnXT/aQGlgjilcdxGLBZvvQurX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bo2ho/btsNA3vdnXT/aQGlgjilcdxGLBZvvQurX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bo2ho/btsNA3vdnXT/aQGlgjilcdxGLBZvvQurX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBo2ho%2FbtsNA3vdnXT%2FaQGlgjilcdxGLBZvvQurX1%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;1337&quot; height=&quot;68&quot; data-filename=&quot;Group 35383 (1).png&quot; data-origin-width=&quot;1337&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ayi0g/btsNCxBK707/nxEBwtlLEkcX6l4a7pX7l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ayi0g/btsNCxBK707/nxEBwtlLEkcX6l4a7pX7l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ayi0g/btsNCxBK707/nxEBwtlLEkcX6l4a7pX7l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAyi0g%2FbtsNCxBK707%2FnxEBwtlLEkcX6l4a7pX7l1%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;1286&quot; height=&quot;66&quot; data-origin-width=&quot;1286&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3번 수식을 더 발전시켜, 연산자 차이를 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;에 비례하는 형태로 표현한다.&lt;/li&gt;
&lt;li&gt;여기서 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;은 할인 인자(보통 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;gamma;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;라고 표기)로, 1보다 작은 값이다.&lt;/li&gt;
&lt;li&gt;오른쪽 부등식은 기대값이 최대값보다 항상 작거나 같다는 성질을 이용한 것이다.&lt;/li&gt;
&lt;li&gt;이 수식은 연산자 적용 후의 차이가 원래 가치 함수 차이의 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;배 이하로 줄어든다는 것을 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. &lt;b&gt;무한대 노름을 이용한 바운드&lt;/b&gt;:&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5quvL/btsNBKV7koy/2MAOqQTtF6DM4ZmADDW16K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5quvL/btsNBKV7koy/2MAOqQTtF6DM4ZmADDW16K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5quvL/btsNBKV7koy/2MAOqQTtF6DM4ZmADDW16K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5quvL%2FbtsNBKV7koy%2F2MAOqQTtF6DM4ZmADDW16K%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;776&quot; height=&quot;68&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 가치 함수에 연산자를 적용한 결과의 차이를 모든 상태에 대한 최대값(무한대 노름)으로 측정한다.&lt;/li&gt;
&lt;li&gt;이 최대 차이는 원래 가치 함수들의 최대 차이의 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;배 이하이다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;∥&lt;/span&gt;&lt;span&gt;&amp;sdot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∥&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;infin;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 &quot;모든 상태 중 최대 차이&quot;를 의미하는 무한대 노름이다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이므로, 연산자를 반복 적용할수록 가치 함수 간의 차이가 계속 줄어들게 된다.&lt;/li&gt;
&lt;li&gt;이 성질이 바로 수축 매핑(contraction mapping)의 핵심 특성이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. &lt;b&gt;축약 연산자의 성질&lt;/b&gt;:&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cicKWN/btsNB8JdweV/8KDn3XwJX6JjQm06eGBSNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cicKWN/btsNB8JdweV/8KDn3XwJX6JjQm06eGBSNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cicKWN/btsNB8JdweV/8KDn3XwJX6JjQm06eGBSNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcicKWN%2FbtsNB8JdweV%2F8KDn3XwJX6JjQm06eGBSNk%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;776&quot; height=&quot;68&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5번 수식과 본질적으로 동일하지만, 다른 표기법(&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 등)을 사용하여 더 일반적인 맥락에서 축약 연산자의 성질을 표현한다.&lt;/li&gt;
&lt;li&gt;이는 n-step TD 연산자가 갖는 수축 성질이 더 일반적인 수학적 개념임을 강조한다.&lt;/li&gt;
&lt;li&gt;이 성질은 반복 적용 시 항상 고정점으로 수렴함을 보장한다(수학적 고정점 정리의 기반)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. &lt;b&gt;모순 발생&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsAxp2/btsNAM1wOda/YAMmNoFyuXpYHVKeITlvJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsAxp2/btsNAM1wOda/YAMmNoFyuXpYHVKeITlvJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsAxp2/btsNAM1wOda/YAMmNoFyuXpYHVKeITlvJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsAxp2%2FbtsNAM1wOda%2FYAMmNoFyuXpYHVKeITlvJ1%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;735&quot; height=&quot;75&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분은 n이 무한대로 갈 때 발생할 수 있는 모순을 지적한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 3에서 논의된 &quot;n이 클수록 분산이 커진다&quot;는 문제와 연관된다.&lt;/li&gt;
&lt;li&gt;n이 무한대로 가면 수축 인자 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이 0에 가까워져 이론적으로는 즉시 수렴해야 하지만, 실제로는 높은 분산으로 인해 안정적인 학습이 어려워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식들은 강화 학습에서의 가치 함수, 연산자, 그리고 그들의 수렴 성질을 다루고 있다. 특히, 축약 연산자(contraction operator)의 개념과 무한대 노름(infinity norm)을 사용한 분석이 포함되어 있다. 마지막 부분에서는 &lt;span&gt;&lt;span&gt;n&amp;rarr;&amp;infin;&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&amp;rarr;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;infin;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;일 때 모순이 발생함을 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 개념 설명&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다단계 가치 함수(Multi-step Value Function)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다단계 가치 함수는 현재 상태에서 n 스텝 미래까지의 보상과 그 이후 상태의 가치를 고려한 확장된 가치 함수이다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1-step: 한 단계 미래만 고려&lt;/li&gt;
&lt;li&gt;n-step: n 단계 미래까지 고려&lt;/li&gt;
&lt;li&gt;&amp;infin;-step: 모든 미래를 고려(몬테카를로 방법)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다단계 가치 함수는 서로 다른 시간 규모의 보상 신호를 효과적으로 통합할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;축약 연산자(Contraction Operator)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;축약 연산자는 반복 적용 시 거리가 줄어드는 특성을 가진 연산자이다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;는 이러한 축약 연산자의 한 예이다.&lt;/li&gt;
&lt;li&gt;이 연산자의 축약 속도는 &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;으로, n이 클수록 더 빠르게 수축한다.&lt;/li&gt;
&lt;li&gt;축약 연산자의 핵심 특성은 반복 적용 시 유일한 고정점으로 수렴한다는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론: 이론과 실제의 균형&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 수식과 개념은 n-step TD 학습의 이론적 토대를 제공한다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다단계 가치 함수는 단일 단계보다 풍부한 정보를 포함하여 학습 효율성을 높일 수 있다.&lt;/li&gt;
&lt;li&gt;축약 연산자 특성은 n-step TD 학습이 이론적으로 정책의 실제 가치 함수로 수렴함을 보장한다.&lt;/li&gt;
&lt;li&gt;n이 클수록 이론적 수렴 속도는 빨라지지만(&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이 작아짐), 실제로는 분산 증가로 인한 한계가 있다.&lt;/li&gt;
&lt;li&gt;그래서 여러 n 값을 혼합하는 방법이 효과적인 해결책이 될 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 이론적 분석은 실제 n-step TD 알고리즘의 성능과 행동을 이해하고 최적화하는 데 중요한 통찰을 제공한다.&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;1683&quot; data-origin-height=&quot;1301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OhGeq/btsNARV26PW/8LPQBWikph9Xa91Z66jqjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OhGeq/btsNARV26PW/8LPQBWikph9Xa91Z66jqjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OhGeq/btsNARV26PW/8LPQBWikph9Xa91Z66jqjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOhGeq%2FbtsNARV26PW%2F8LPQBWikph9Xa91Z66jqjK%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;1683&quot; height=&quot;1301&quot; data-origin-width=&quot;1683&quot; data-origin-height=&quot;1301&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;/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/duXIeB/btsNCodZdjY/2PpPAFryN5gcc5WMQ2rtHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duXIeB/btsNCodZdjY/2PpPAFryN5gcc5WMQ2rtHK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1678&quot; data-filename=&quot;Screenshot from 2025-04-27 00-05-30.png&quot; style=&quot;width: 31.5723%; margin-right: 10px;&quot; data-widthpercent=&quot;32.32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duXIeB/btsNCodZdjY/2PpPAFryN5gcc5WMQ2rtHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduXIeB%2FbtsNCodZdjY%2F2PpPAFryN5gcc5WMQ2rtHK%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;1678&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OV7e9/btsNBGlWQhz/MsQtswSIddjVIJgkkEH6l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OV7e9/btsNBGlWQhz/MsQtswSIddjVIJgkkEH6l1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;1742&quot; data-filename=&quot;Screenshot from 2025-04-27 00-23-29.png&quot; style=&quot;width: 29.7408%; margin-right: 10px;&quot; data-widthpercent=&quot;30.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OV7e9/btsNBGlWQhz/MsQtswSIddjVIJgkkEH6l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOV7e9%2FbtsNBGlWQhz%2FMsQtswSIddjVIJgkkEH6l1%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;620&quot; height=&quot;1742&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYzlY0/btsNCmgb1yY/hoJG1QvR2OHylSM4DSEao0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYzlY0/btsNCmgb1yY/hoJG1QvR2OHylSM4DSEao0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1457&quot; data-filename=&quot;Screenshot from 2025-04-27 00-05-42.png&quot; style=&quot;width: 36.3613%;&quot; data-widthpercent=&quot;37.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYzlY0/btsNCmgb1yY/hoJG1QvR2OHylSM4DSEao0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYzlY0%2FbtsNCmgb1yY%2FhoJG1QvR2OHylSM4DSEao0%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;1457&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;1055&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdYldF/btsNARPiSBo/NZHVrkTZGOQa8dE97FJfck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdYldF/btsNARPiSBo/NZHVrkTZGOQa8dE97FJfck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdYldF/btsNARPiSBo/NZHVrkTZGOQa8dE97FJfck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdYldF%2FbtsNARPiSBo%2FNZHVrkTZGOQa8dE97FJfck%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;827&quot; height=&quot;1055&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/61</guid>
      <comments>https://dev-self.tistory.com/61#entry61comment</comments>
      <pubDate>Sun, 27 Apr 2025 01:10:36 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 53일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;n-step TD 학습 알고리즘 2&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; n-step TD 업데이트 공식&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 기본 업데이트 (t &amp;ge; n일 때)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;V(s_{t-n}) = V(s_{t-n}) + &amp;alpha;[&amp;sum;_{k=1}^{n} &amp;gamma;^{k-1}r_{t-n+k} + &amp;gamma;^n V(s_t) - V(s_{t-n})]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;V(s_{t-n}): n 스텝 이전 상태의 가치 함수를 업데이트&lt;/li&gt;
&lt;li&gt;&amp;alpha;: 학습률(learning rate)&lt;/li&gt;
&lt;li&gt;대괄호 안의 표현식: TD 오차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;sum;_{k=1}^{n} &amp;gamma;^{k-1}r_{t-n+k}: n개의 할인된 보상 합계&lt;/li&gt;
&lt;li&gt;&amp;gamma;^n V(s_t): 현재 상태의 할인된 가치 추정값&lt;/li&gt;
&lt;li&gt;-V(s_{t-n}): 이전 상태의 가치 추정값&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 에피소드 종료 시 처리 (done일 때)&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;k_{min} = min(t, n-1)
for i &amp;isin; 1 : k_{min}
    V(s_{t-i}) = V(s_{t-i}) + &amp;alpha;[&amp;sum;_{k=1}^{i} &amp;gamma;^{k-1}r_{t-i+k} + &amp;gamma;^n V(s_t) - V(s_{t-i})]
V(s_t) = 0  (종료 상태의 가치는 0)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;k_{min}: 업데이트할 수 있는 최대 스텝 수 결정 (t와 n-1 중 작은 값)&lt;/li&gt;
&lt;li&gt;순환문을 통해 최근 k_{min}개의 상태 가치를 업데이트&lt;/li&gt;
&lt;li&gt;마지막으로 종료 상태의 가치를 0으로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;에피소드 기반 n-step TD 알고리즘&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 완전한 에피소드(episode) 기반 n-step TD 알고리즘이다&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Input a policy to be evaluated, &amp;pi;
Initialize &amp;alpha; &amp;gt; 0 and V(s) for all s &amp;isin; S
While True
    Generate an episode e = (s_0, a_0, r_1, s_1, ..., s_{T-1}, a_{T-1}, r_T, s_T) using &amp;pi;
    For t &amp;isin; 0 : T-1
        k_{min} = min(n, T-t)
        &amp;delta;_t^{k_{min}} = &amp;sum;_{k=1}^{k_{min}} &amp;gamma;^{k-1}r_{t+k} + &amp;gamma;^{k_{min}}V(s_{t+k_{min}}) - V(s_t)
        V(s_t) = V(s_t) + &amp;alpha;&amp;delta;_t^{k_{min}}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;정책 &amp;pi;를 사용하여 완전한 에피소드를 생성&lt;/li&gt;
&lt;li&gt;에피소드의 각 타임스텝 t에 대해:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k_{min}: 현재 위치에서 가능한 최대 스텝 수 계산 (n과 남은 에피소드 길이 중 작은 값)&lt;/li&gt;
&lt;li&gt;&amp;delta;_t^{k_{min}}: n-step TD 오차 계산&lt;/li&gt;
&lt;li&gt;현재 상태의 가치 함수 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서의 접근 방식은 에피소드 전체를 생성한 후 처음부터 끝까지 한 번에 업데이트한다는 점이 이전 알고리즘과 다르다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이미지 3: n-step TD의 확장 및 이점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 이미지는 n-step TD 학습의 확장과 이점에 대해 설명한다:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;n-step TD에서 n이 크면 수렴 속도가 빠르다는 주장과 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;있음, 학습동안 value 값이 더 많이 됨 (variance가 큼)&lt;/li&gt;
&lt;li&gt;Sample이 많다면 이 문제가 완화됨 (큰 수의 법칙)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다양한 n을 함께 사용하는 방법&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;dust&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;G_t^{(n)} = &amp;sum;_{k=1}^{n} &amp;gamma;^{k-1}r_{t+k} + &amp;gamma;^n V(s_{t+n})&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라 할 때, 예를 들면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;V(s_t) = &amp;Ecirc;[0.3G_t^{(3)} + 0.3G_t^{(5)} + 0.4G_t^{(8)}]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 서로 다른 n 값(3, 5, 8)의 반환값을 가중 평균하는 방식을 보여준다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3-step TD의 반환값에 0.3 가중치&lt;/li&gt;
&lt;li&gt;5-step TD의 반환값에 0.3 가중치&lt;/li&gt;
&lt;li&gt;8-step TD의 반환값에 0.4 가중치&lt;/li&gt;
&lt;/ul&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;가능! 다음 chapter에서 일반적으로 많이 쓰는 방법을 배움&lt;/li&gt;
&lt;li&gt;단, 섞어서 쓸 때 각 step에 대한 weight는 양수이며, 합이 1이 되어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n-step TD 학습의 주요 특징 및 고려사항&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;n 값의 선택과 트레이드오프&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 작을수록: 낮은 분산(variance)이지만 높은 편향(bias)&lt;/li&gt;
&lt;li&gt;n이 클수록: 낮은 편향이지만 높은 분산&lt;/li&gt;
&lt;li&gt;n=1: 일반적인 TD(0) 학습 (낮은 분산, 높은 편향)&lt;/li&gt;
&lt;li&gt;n=&amp;infin;: 몬테카를로 방법 (높은 분산, 낮은 편향)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 n 사용의 이점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 n 값의 추정치를 혼합하면 편향과 분산 사이의 더 나은 균형을 이룰 수 있음&lt;/li&gt;
&lt;li&gt;예제에서 본 것처럼 3-step, 5-step, 8-step의 가중 평균을 사용&lt;/li&gt;
&lt;li&gt;가중치의 합은 1이어야 하고, 모든 가중치는 양수여야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실용적 고려사항&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 요구 사항: n이 클수록 더 많은 경험을 저장해야 함&lt;/li&gt;
&lt;li&gt;계산 복잡성: n이 클수록 더 많은 계산이 필요함&lt;/li&gt;
&lt;li&gt;샘플 효율성: n이 크면 샘플 효율성이 더 높을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;온라인 vs 오프라인 학습&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 알고리즘: 온라인 학습 방식 (TD 오차를 즉시 계산하고 업데이트)&lt;/li&gt;
&lt;li&gt;두 번째 알고리즘: 오프라인/에피소드 단위 학습 방식 (에피소드 완료 후 일괄 업데이트)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-step TD 학습은 TD 학습과 몬테카를로 방법 사이의 중간 지점을 제공하며, 적절한 n 값 선택 또는 다양한 n 값의 혼합을 통해 학습 성능을 최적화할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그리드 월드로 보는 수식 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 4x4 그리드 월드를 가정한다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;+---+---+---+---+
| S | O | O | O |
+---+---+---+---+
| O | O | X | O |
+---+---+---+---+
| O | O | O | O |
+---+---+---+---+
| O | O | O | G |
+---+---+---+---+&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;S: 시작 위치 (0,0)&lt;/li&gt;
&lt;li&gt;G: 목표 위치 (3,3), 보상 +1&lt;/li&gt;
&lt;li&gt;X: 장애물 (1,2), 진입 불가&lt;/li&gt;
&lt;li&gt;O: 빈 공간, 보상 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;n-step TD 수식 적용 (n=3 예시)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 초기화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 상태 s에 대해 V(s) = 0으로 초기화&lt;/li&gt;
&lt;li&gt;학습률 &amp;alpha; = 0.1&lt;/li&gt;
&lt;li&gt;할인율 &amp;gamma; = 0.9&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 에피소드 생성&lt;/h3&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;s₀ = (0,0), a₀ = 오른쪽, r₁ = 0, s₁ = (0,1)&lt;/li&gt;
&lt;li&gt;s₁ = (0,1), a₁ = 아래쪽, r₂ = 0, s₂ = (1,1)&lt;/li&gt;
&lt;li&gt;s₂ = (1,1), a₂ = 오른쪽, r₃ = 0, s₃ = (1,3) (장애물 우회)&lt;/li&gt;
&lt;li&gt;s₃ = (1,3), a₃ = 아래쪽, r₄ = 0, s₄ = (2,3)&lt;/li&gt;
&lt;li&gt;s₄ = (2,3), a₄ = 아래쪽, r₅ = 1, s₅ = (3,3) (목표 도달)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 3-step TD 업데이트 수식 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n=3일 때의 업데이트 공식:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAsye2/btsNBG6Yzj8/HeHwzkMwCCMvApeZUNAQwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAsye2/btsNBG6Yzj8/HeHwzkMwCCMvApeZUNAQwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAsye2/btsNBG6Yzj8/HeHwzkMwCCMvApeZUNAQwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAsye2%2FbtsNBG6Yzj8%2FHeHwzkMwCCMvApeZUNAQwK%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;920&quot; height=&quot;126&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 경로에 이 공식을 적용해보자.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;첫 번째 가능한 업데이트 (t=3)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 s₀에 대해:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R8Kcw/btsNBE9bWdW/Zn4LPVUJfdb0KX4uOtSUkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R8Kcw/btsNBE9bWdW/Zn4LPVUJfdb0KX4uOtSUkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R8Kcw/btsNBE9bWdW/Zn4LPVUJfdb0KX4uOtSUkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR8Kcw%2FbtsNBE9bWdW%2FZn4LPVUJfdb0KX4uOtSUkk%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;857&quot; height=&quot;80&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치를 대입하면:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bleuLf/btsNBw4qu0v/Cpn3kDZeyOgYKkR5esKAT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bleuLf/btsNBw4qu0v/Cpn3kDZeyOgYKkR5esKAT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bleuLf/btsNBw4qu0v/Cpn3kDZeyOgYKkR5esKAT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbleuLf%2FbtsNBw4qu0v%2FCpn3kDZeyOgYKkR5esKAT1%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;932&quot; height=&quot;189&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 번째 업데이트 (t=4)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 s₁에 대해:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfKnRE/btsNBC4EgZS/LaqjDa3KjnjQTIcGzqSfy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfKnRE/btsNBC4EgZS/LaqjDa3KjnjQTIcGzqSfy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfKnRE/btsNBC4EgZS/LaqjDa3KjnjQTIcGzqSfy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfKnRE%2FbtsNBC4EgZS%2FLaqjDa3KjnjQTIcGzqSfy1%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;849&quot; height=&quot;83&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치를 대입하면:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm1omY/btsNz0TxpXs/npaPxo2r6zwg222fM4Ack1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm1omY/btsNz0TxpXs/npaPxo2r6zwg222fM4Ack1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm1omY/btsNz0TxpXs/npaPxo2r6zwg222fM4Ack1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm1omY%2FbtsNz0TxpXs%2FnpaPxo2r6zwg222fM4Ack1%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;935&quot; height=&quot;174&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;세 번째 업데이트 (t=5)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 s₂에 대해:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUSGGx/btsNAGGYHq7/as5n4iCWd957UcOmHOU7jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUSGGx/btsNAGGYHq7/as5n4iCWd957UcOmHOU7jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUSGGx/btsNAGGYHq7/as5n4iCWd957UcOmHOU7jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUSGGx%2FbtsNAGGYHq7%2Fas5n4iCWd957UcOmHOU7jk%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;834&quot; height=&quot;89&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치를 대입하면:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzrGNg/btsNCp4Ls72/kkzzQnOvZ3L13JwcBQdbb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzrGNg/btsNCp4Ls72/kkzzQnOvZ3L13JwcBQdbb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzrGNg/btsNCp4Ls72/kkzzQnOvZ3L13JwcBQdbb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzrGNg%2FbtsNCp4Ls72%2FkkzzQnOvZ3L13JwcBQdbb0%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;964&quot; height=&quot;89&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목표 상태의 가치 V(3,3)은 일반적으로 0으로 설정된다 (종료 상태).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be6GV2/btsNA9hxwEo/WULIqmNli2c4URzORsjYFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be6GV2/btsNA9hxwEo/WULIqmNli2c4URzORsjYFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be6GV2/btsNA9hxwEo/WULIqmNli2c4URzORsjYFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe6GV2%2FbtsNA9hxwEo%2FWULIqmNli2c4URzORsjYFk%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;712&quot; height=&quot;64&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;64&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;h3 data-ke-size=&quot;size23&quot;&gt;4. 에피소드 종료 후 처리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에피소드가 종료되면 (t=5, done=True), 아직 업데이트되지 않은 상태들을 처리한다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UCqyL/btsNz6zdxsh/fsBpP59F7flFs6NYrYRaw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UCqyL/btsNz6zdxsh/fsBpP59F7flFs6NYrYRaw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UCqyL/btsNz6zdxsh/fsBpP59F7flFs6NYrYRaw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUCqyL%2FbtsNz6zdxsh%2FfsBpP59F7flFs6NYrYRaw0%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;586&quot; height=&quot;61&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 i=1,2에 대해:&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i=1 (상태 s₄)&lt;/h4&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;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdnYPg/btsNBFUyR0Z/DSm2xLnsi4aKMZF5Onmb5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdnYPg/btsNBFUyR0Z/DSm2xLnsi4aKMZF5Onmb5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdnYPg/btsNBFUyR0Z/DSm2xLnsi4aKMZF5Onmb5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdnYPg%2FbtsNBFUyR0Z%2FDSm2xLnsi4aKMZF5Onmb5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;361&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;i=2 (상태 s₃)&lt;/h4&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLdgrR/btsNBM0sseB/CchArsfUygQ9UoE3bSICfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLdgrR/btsNBM0sseB/CchArsfUygQ9UoE3bSICfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLdgrR/btsNBM0sseB/CchArsfUygQ9UoE3bSICfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLdgrR%2FbtsNBM0sseB%2FCchArsfUygQ9UoE3bSICfk%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;990&quot; height=&quot;363&quot; data-origin-width=&quot;990&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 다양한 n 값을 사용한 혼합 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 3에서 본 것처럼, 다양한 n 값의 반환값을 혼합하여 사용할 수 있다:&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FRGjd/btsNCaGMUqx/wIdm2HGlR3m3FbVtHl2Mnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FRGjd/btsNCaGMUqx/wIdm2HGlR3m3FbVtHl2Mnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FRGjd/btsNCaGMUqx/wIdm2HGlR3m3FbVtHl2Mnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFRGjd%2FbtsNCaGMUqx%2FwIdm2HGlR3m3FbVtHl2Mnk%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;543&quot; height=&quot;122&quot; data-origin-width=&quot;543&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, n=3, n=5, n=8을 혼합하면:&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oAOd1/btsNAMNMWLH/24F5XX7MJgoCfpRDAjiH81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oAOd1/btsNAMNMWLH/24F5XX7MJgoCfpRDAjiH81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oAOd1/btsNAMNMWLH/24F5XX7MJgoCfpRDAjiH81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoAOd1%2FbtsNAMNMWLH%2F24F5XX7MJgoCfpRDAjiH81%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;607&quot; height=&quot;94&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제에서 t=0일 때 이 식을 적용해보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;G₀^(3) = r₁ + &amp;gamma;r₂ + &amp;gamma;&amp;sup2;r₃ + &amp;gamma;&amp;sup3;V(s₃) = 0 + 0 + 0 + 0.9&amp;sup3;&amp;times;0 = 0&lt;/li&gt;
&lt;li&gt;G₀^(5) (에피소드 길이가 5이므로) = r₁ + &amp;gamma;r₂ + &amp;gamma;&amp;sup2;r₃ + &amp;gamma;&amp;sup3;r₄ + &amp;gamma;⁴r₅ + &amp;gamma;⁵V(s₅) = 0 + 0 + 0 + 0 + 0.9⁴&amp;times;1 + 0 = 0.9⁴ = 0.6561&lt;/li&gt;
&lt;li&gt;G₀^(8)는 에피소드 길이(5)를 초과하므로, G₀^(5)와 동일합니다 = 0.6561&lt;/li&gt;
&lt;/ul&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;860&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMpw9/btsNAOLrVSK/SkLIu3VNKcrIs6Gl954mLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMpw9/btsNAOLrVSK/SkLIu3VNKcrIs6Gl954mLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMpw9/btsNAOLrVSK/SkLIu3VNKcrIs6Gl954mLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMpw9%2FbtsNAOLrVSK%2FSkLIu3VNKcrIs6Gl954mLK%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;860&quot; height=&quot;64&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수렴 특성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 큰 경우: 수렴 속도가 빠르지만 분산(variance)이 큼&lt;/li&gt;
&lt;li&gt;샘플이 많을수록: 큰 수의 법칙에 의해 분산 문제가 완화됨&lt;/li&gt;
&lt;li&gt;혼합 접근법: 여러 n 값을 조합하여 편향(bias)과 분산(variance) 사이의 균형을 이룸&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 n-step TD 학습은 1-step TD 학습과 몬테카를로 방법 사이의 유연한 중간점을 제공하며, 문제와 환경에 맞게 n 값을 조정하거나 여러 n 값을 혼합하여 성능을 최적화할 수 있다.&lt;/p&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;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ZWJP/btsNAZTA8Sl/NqJN9AIZATYDj5GdTiwrN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ZWJP/btsNAZTA8Sl/NqJN9AIZATYDj5GdTiwrN0/img.png&quot; style=&quot;width: 33.6281%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;1576&quot; data-filename=&quot;Screenshot from 2025-04-26 12-46-04.png&quot; data-widthpercent=&quot;34.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ZWJP/btsNAZTA8Sl/NqJN9AIZATYDj5GdTiwrN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ZWJP%2FbtsNAZTA8Sl%2FNqJN9AIZATYDj5GdTiwrN0%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;607&quot; height=&quot;1576&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bobShX/btsNBvLsaxi/xMkdyoaBemfeBuyT8PCMLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bobShX/btsNBvLsaxi/xMkdyoaBemfeBuyT8PCMLk/img.png&quot; style=&quot;width: 32.0232%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;1595&quot; data-filename=&quot;Screenshot from 2025-04-26 13-02-07.png&quot; data-widthpercent=&quot;32.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bobShX/btsNBvLsaxi/xMkdyoaBemfeBuyT8PCMLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbobShX%2FbtsNBvLsaxi%2FxMkdyoaBemfeBuyT8PCMLk%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;585&quot; height=&quot;1595&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k56GF/btsNCckiF7m/Nwv2JWiXk9M3sxsrVc0MdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k56GF/btsNCckiF7m/Nwv2JWiXk9M3sxsrVc0MdK/img.png&quot; style=&quot;width: 32.0232%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;1595&quot; data-filename=&quot;Screenshot from 2025-04-26 13-02-14.png&quot; data-widthpercent=&quot;32.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k56GF/btsNCckiF7m/Nwv2JWiXk9M3sxsrVc0MdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk56GF%2FbtsNCckiF7m%2FNwv2JWiXk9M3sxsrVc0MdK%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;585&quot; height=&quot;1595&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d15TGI/btsNz7SrS02/82VnJPCs6VP334VfJ9NROk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d15TGI/btsNz7SrS02/82VnJPCs6VP334VfJ9NROk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d15TGI/btsNz7SrS02/82VnJPCs6VP334VfJ9NROk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd15TGI%2FbtsNz7SrS02%2F82VnJPCs6VP334VfJ9NROk%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;802&quot; height=&quot;1088&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/60</guid>
      <comments>https://dev-self.tistory.com/60#entry60comment</comments>
      <pubDate>Sat, 26 Apr 2025 15:03:56 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 52일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;n-step TD Prediction&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD learning은 현재 추정치와 다음 상태에서의 추정치 간의 &quot;차이(difference)&quot;를 통해 학습한다. 기존의 1-step TD 방법은 즉각적인 보상과 다음 상태만을 고려하기 때문에 장기적인 보상 구조를 파악하는 데 시간이 오래 걸린다. n-step 접근법은 더 먼 미래의 보상을 직접적으로 고려함으로써:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습 속도를 향상시키고&lt;/li&gt;
&lt;li&gt;보다 정확한 가치 함수 추정이 가능하다.&lt;/li&gt;
&lt;li&gt;지연된 보상이 있는 환경에서 특히 효과적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;1-step transition에 대한 value function의 Bellman 방정식&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TDX46/btsNzhlMWRk/NksGvaHg2SMC50u6xdNxL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TDX46/btsNzhlMWRk/NksGvaHg2SMC50u6xdNxL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TDX46/btsNzhlMWRk/NksGvaHg2SMC50u6xdNxL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTDX46%2FbtsNzhlMWRk%2FNksGvaHg2SMC50u6xdNxL1%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;549&quot; height=&quot;61&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 기대값 표기법으로 &lt;span&gt;&lt;span&gt;&lt;span&gt;=Ea,s&amp;prime;&amp;pi;[r+&amp;gamma;V&amp;pi;(s&amp;prime;)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;로 간단히 나타낼 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로, Bellman 방정식을 2-step transition으로 확장한 식이 제시된다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u57ee/btsNxY8RvzE/afrcKN4ANhOm5AP5t8qYr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u57ee/btsNxY8RvzE/afrcKN4ANhOm5AP5t8qYr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u57ee/btsNxY8RvzE/afrcKN4ANhOm5AP5t8qYr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu57ee%2FbtsNxY8RvzE%2FafrcKN4ANhOm5AP5t8qYr1%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;897&quot; height=&quot;91&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 수식들은 2-step transition으로도 동일한 value function이 성립함을 보여준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 개념을 n-step으로 일반화한다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dD6TGM/btsNzyHzsRO/kGBMaVoLAjDNCS3sY0pFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dD6TGM/btsNzyHzsRO/kGBMaVoLAjDNCS3sY0pFkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dD6TGM/btsNzyHzsRO/kGBMaVoLAjDNCS3sY0pFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdD6TGM%2FbtsNzyHzsRO%2FkGBMaVoLAjDNCS3sY0pFkK%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;614&quot; height=&quot;70&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 다시 다음과 같이 전개된다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FgSrn/btsNxR2YPQ8/KMFobbRwgE3pkimOrGCbQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FgSrn/btsNxR2YPQ8/KMFobbRwgE3pkimOrGCbQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FgSrn/btsNxR2YPQ8/KMFobbRwgE3pkimOrGCbQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgSrn%2FbtsNxR2YPQ8%2FKMFobbRwgE3pkimOrGCbQK%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;680&quot; height=&quot;90&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 반복하면 결국 원래의 1-step Bellman 방정식으로 돌아오게 되며, 이는 n-step transition으로도 성립함을 보여준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TD(Temporal Difference) learning에서의 n-step 적용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD(Temporal Difference) learning에서의 n-step 적용에 대해 설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD learning은 샘플로 평균을 계산하므로 업데이트 식이 복잡해지지 않음.&lt;/li&gt;
&lt;li&gt;그러므로 수렴 속도가 빨라지는 n-step transition을 쓰면 좋다.&lt;/li&gt;
&lt;li&gt;n이 크면 나중에 받은 보상이 직접적으로 V(s_t)에 반영되므로 long-term 관계 학습에 좋다.&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;357&quot; data-origin-height=&quot;44&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZLa0s/btsNzMyQhWG/uWRqHQjG7u2NMPKIylyNtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZLa0s/btsNzMyQhWG/uWRqHQjG7u2NMPKIylyNtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZLa0s/btsNzMyQhWG/uWRqHQjG7u2NMPKIylyNtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZLa0s%2FbtsNzMyQhWG%2FuWRqHQjG7u2NMPKIylyNtK%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;357&quot; height=&quot;44&quot; data-origin-width=&quot;357&quot; data-origin-height=&quot;44&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;value function 학습에 대한 설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1-step TD를 이용한 value function 학습:&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;515&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vrYFL/btsNyew9gPJ/y4EhbuFKnNojBLFipVbKok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vrYFL/btsNyew9gPJ/y4EhbuFKnNojBLFipVbKok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vrYFL/btsNyew9gPJ/y4EhbuFKnNojBLFipVbKok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvrYFL%2FbtsNyew9gPJ%2Fy4EhbuFKnNojBLFipVbKok%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;515&quot; height=&quot;53&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n-step TD를 이용한 value function 학습:&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;432&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkbTnA/btsNxZ1d9jB/qBfkVvwmliDSZkDzHLbYf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkbTnA/btsNxZ1d9jB/qBfkVvwmliDSZkDzHLbYf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkbTnA/btsNxZ1d9jB/qBfkVvwmliDSZkDzHLbYf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkbTnA%2FbtsNxZ1d9jB%2FqBfkVvwmliDSZkDzHLbYf0%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;432&quot; height=&quot;57&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caAPnm/btsNySGxr7q/UqHM3Sl5P0LMK6zHTQkmx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caAPnm/btsNySGxr7q/UqHM3Sl5P0LMK6zHTQkmx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caAPnm/btsNySGxr7q/UqHM3Sl5P0LMK6zHTQkmx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaAPnm%2FbtsNySGxr7q%2FUqHM3Sl5P0LMK6zHTQkmx0%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;246&quot; height=&quot;55&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;n-step TD에서 n이 무한대로 가능 경우:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyjoh/btsNyFgC4y3/7KDO67rVnIyMhrkwXFl4mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyjoh/btsNyFgC4y3/7KDO67rVnIyMhrkwXFl4mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyjoh/btsNyFgC4y3/7KDO67rVnIyMhrkwXFl4mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyyjoh%2FbtsNyFgC4y3%2F7KDO67rVnIyMhrkwXFl4mk%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;683&quot; height=&quot;167&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 Monte-Carlo Prediction과 동일해진다. 오른쪽 그림은 Richard Sutton의 &quot;Reinforcement Learning: An Introduction&quot;에서 가져온 것으로, TD(1-step)부터 n-step, Monte Carlo까지의 스펙트럼을 시각적으로 보여주고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7iAa/btsNygWcKOm/mfILEevcy5ZNkDmGNu62YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7iAa/btsNygWcKOm/mfILEevcy5ZNkDmGNu62YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7iAa/btsNygWcKOm/mfILEevcy5ZNkDmGNu62YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7iAa%2FbtsNygWcKOm%2FmfILEevcy5ZNkDmGNu62YK%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;901&quot; height=&quot;534&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1&gt;n-step TD Learning 설명: 실제 예시를 통한 이해&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 TD Learning 수식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD Learning의 기본 수식은 다음과 같다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V(s_t) &amp;larr; V(s_t) + &amp;alpha;[r_t+1 + &amp;gamma;V(s_t+1) - V(s_t)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식을 간단한 그리드월드 예시로 이해해보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 그리드월드 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 4x4 그리드월드가 있다고 가정해보자:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;+---+---+---+---+
|   |   |   | G |
+---+---+---+---+
|   | X |   |   |
+---+---+---+---+
|   |   |   |   |
+---+---+---+---+
| S |   |   |   |
+---+---+---+---+&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S: 시작 지점 (보상: 0)&lt;/li&gt;
&lt;li&gt;G: 목표 지점 (보상: +10)&lt;/li&gt;
&lt;li&gt;X: 장애물 (보상: -5)&lt;/li&gt;
&lt;li&gt;빈 칸: 일반 이동 (보상: -1, 매 스텝마다 소모되는 에너지를 의미)&lt;/li&gt;
&lt;li&gt;감마(&amp;gamma;) = 0.9 (할인율)&lt;/li&gt;
&lt;li&gt;알파(&amp;alpha;) = 0.1 (학습률)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 1-step TD Learning 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에이전트가 시작지점(S)에서 오른쪽으로 한 칸 이동했다고 가정해보자:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태(s_t): (3, 0) [S 위치]&lt;/li&gt;
&lt;li&gt;현재 상태의 가치 추정치 V(s_t): 0 (초기값)&lt;/li&gt;
&lt;li&gt;다음 상태(s_t+1): (3, 1) [S의 오른쪽]&lt;/li&gt;
&lt;li&gt;다음 상태의 가치 추정치 V(s_t+1): 0 (초기값)&lt;/li&gt;
&lt;li&gt;받은 보상(r_t+1): -1 (일반 이동)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD 업데이트 공식을 적용하면: V(3, 0) &amp;larr; 0 + 0.1 &amp;times; [-1 + 0.9 &amp;times; 0 - 0] = -0.1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 S 위치의 가치는 -0.1로 업데이트된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. n-step TD Learning 예시 (n=3)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 에이전트가 다음 경로를 따라 이동했다고 가정해봅시다: S &amp;rarr; 오른쪽 &amp;rarr; 위로 &amp;rarr; 위로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-step TD에서는 3개의 스텝에서 얻은 보상을 모두 고려한다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태(s_t): (3, 0) [S 위치]&lt;/li&gt;
&lt;li&gt;보상 시퀀스: r_t+1 = -1, r_t+2 = -1, r_t+3 = -1&lt;/li&gt;
&lt;li&gt;3스텝 후 상태(s_t+3): (1, 1)&lt;/li&gt;
&lt;li&gt;V(s_t+3) = 0 (초기값)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-step TD 업데이트 공식: V(s_t) &amp;larr; V(s_t) + &amp;alpha;[r_t+1 + &amp;gamma;r_t+2 + &amp;gamma;&amp;sup2;r_t+3 + &amp;gamma;&amp;sup3;V(s_t+3) - V(s_t)]&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;V(3, 0) &amp;larr; 0 + 0.1 &amp;times; [-1 + 0.9&amp;times;(-1) + 0.9&amp;sup2;&amp;times;(-1) + 0.9&amp;sup3;&amp;times;0 - 0] = 0 + 0.1 &amp;times; [-1 - 0.9 - 0.81] = 0 + 0.1 &amp;times; [-2.71] = -0.271&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S 위치의 가치는 -0.271로 업데이트된다. 1-step TD(-0.1)보다 더 낮은 값을 가지는데, 이는 3-step이 더 먼 미래의 부정적 보상(-1)까지 고려했기 때문이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 영어 학습 컨텍스트 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TD Learning을 영어 단어 학습 앱에 적용한다면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태(s): 현재 학습 중인 단어 (예: &quot;apple&quot;)&lt;/li&gt;
&lt;li&gt;행동(a): 복습 방법 선택 (플래시카드, 퀴즈, 문장 만들기 등)&lt;/li&gt;
&lt;li&gt;보상(r): 테스트 결과 (+1: 맞음, -1: 틀림)&lt;/li&gt;
&lt;li&gt;가치함수 V(s): 해당 단어를 얼마나 잘 기억할지에 대한 예측&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, &quot;apple&quot; 단어에 대한 학습 시퀀스:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;플래시카드 사용 &amp;rarr; 퀴즈 틀림(-1) &amp;rarr; 문장 만들기 &amp;rarr; 퀴즈 맞춤(+1) &amp;rarr; 일주일 후 테스트 맞춤(+1)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-step TD 학습을 적용하면: V(&quot;apple&quot;) &amp;larr; V(&quot;apple&quot;) + &amp;alpha;[-1 + &amp;gamma;&amp;times;0 + &amp;gamma;&amp;sup2;&amp;times;(+1) - V(&quot;apple&quot;)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 각 단어마다 최적의 학습 경로를 찾아나갈 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. n이 무한대일 때 (Monte Carlo)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n이 무한대(에피소드 끝까지)라면, 에이전트가 S에서 시작해 G에 도달하는 최적 경로를 따랐을 때:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보상 시퀀스: -1, -1, -1, -1, -1, -1, +10 (7스텝)&lt;/li&gt;
&lt;li&gt;총 할인된 보상(G_t): -1 + 0.9&amp;times;(-1) + 0.9&amp;sup2;&amp;times;(-1) + ... + 0.9⁶&amp;times;(+10) &amp;asymp; 2.15&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Monte Carlo 업데이트: V(S) &amp;larr; V(S) + &amp;alpha;[G_t - V(S)] = 0 + 0.1&amp;times;[2.15 - 0] = 0.215&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 목표에 도달하는 경로의 장기적 가치를 직접적으로 반영한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 n-step TD는 즉각적인 1-step TD와 전체 경로를 고려하는 Monte Carlo 사이의 균형점을 제공하며, 문제의 특성에 따라 적절한 n 값을 선택할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FTyQ6/btsNzcEJ3hW/ojjiZtcq4cNo1mrAU8JBP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FTyQ6/btsNzcEJ3hW/ojjiZtcq4cNo1mrAU8JBP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FTyQ6/btsNzcEJ3hW/ojjiZtcq4cNo1mrAU8JBP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFTyQ6%2FbtsNzcEJ3hW%2FojjiZtcq4cNo1mrAU8JBP0%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;1035&quot; height=&quot;729&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1-step transition&lt;/b&gt; (파란색 섹션)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그리드월드에서 에이전트가 한 칸 이동하는 간단한 예시&lt;/li&gt;
&lt;li&gt;&quot;현재 상태의 가치 = 즉각적인 보상 + 다음 상태의 가치(할인)&quot;라는 직관적 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2-step transition&lt;/b&gt; (녹색 섹션)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트가 두 칸 이동하며 받는 보상들을 고려&lt;/li&gt;
&lt;li&gt;&quot;현재 상태의 가치 = 첫 번째 보상 + (두 번째 보상 + 할인된 미래 가치)&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n-step transition&lt;/b&gt; (주황색 섹션)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트가 n개의 칸을 이동하며 받는 모든 보상 고려&lt;/li&gt;
&lt;li&gt;더 긴 시퀀스의 보상을 고려하는 방식 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TD 학습 실제 예시&lt;/b&gt; (보라색 섹션)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1-step TD 예시: &quot;실제 보상(+10) + 다음 상태 예측 가치(20) - 현재 예측 가치(25) = 오차(+5)&quot;&lt;/li&gt;
&lt;li&gt;n-step TD 예시: &quot;여러 스텝의 실제 보상(+10,+5,+7) + 미래 상태 예측 가치(15) - 현재 예측 가치(25) = 오차(+12)&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TD에서 Monte Carlo까지의 스펙트럼&lt;/b&gt; (우측 하단)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1-step(즉각적인 보상만 고려)부터 Monte Carlo(에피소드 끝까지 모든 보상 고려)까지&lt;/li&gt;
&lt;li&gt;&quot;미래에 대한 고려 범위가 넓어짐&quot;을 화살표로 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|인증|&lt;/p&gt;
&lt;p&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/7sSQN/btsNxizWKZD/bey6sQIw7ltTEg6hmiALk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7sSQN/btsNxizWKZD/bey6sQIw7ltTEg6hmiALk1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;1368&quot; data-filename=&quot;Screenshot from 2025-04-25 01-45-59.png&quot; style=&quot;width: 34.0142%; margin-right: 10px;&quot; data-widthpercent=&quot;34.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7sSQN/btsNxizWKZD/bey6sQIw7ltTEg6hmiALk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7sSQN%2FbtsNxizWKZD%2Fbey6sQIw7ltTEg6hmiALk1%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;601&quot; height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7QkvW/btsNy9aeLGY/yYNXsTv9u7LQ7z4YfYuKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7QkvW/btsNy9aeLGY/yYNXsTv9u7LQ7z4YfYuKkk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;1533&quot; data-filename=&quot;Screenshot from 2025-04-25 02-15-34.png&quot; style=&quot;width: 29.6461%; margin-right: 10px;&quot; data-widthpercent=&quot;30.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7QkvW/btsNy9aeLGY/yYNXsTv9u7LQ7z4YfYuKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7QkvW%2FbtsNy9aeLGY%2FyYNXsTv9u7LQ7z4YfYuKkk%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;587&quot; height=&quot;1533&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdAncI/btsNyh1qlH0/ikki3fhiv6KjH1Q6KB7UAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdAncI/btsNyh1qlH0/ikki3fhiv6KjH1Q6KB7UAK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;1368&quot; data-filename=&quot;Screenshot from 2025-04-25 01-46-02.png&quot; data-widthpercent=&quot;34.83&quot; style=&quot;width: 34.0142%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdAncI/btsNyh1qlH0/ikki3fhiv6KjH1Q6KB7UAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdAncI%2FbtsNyh1qlH0%2Fikki3fhiv6KjH1Q6KB7UAK%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;601&quot; height=&quot;1368&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&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;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;1217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS9PS6/btsNxWDyvr3/Odx0keXVjDmQS9c4ETUBL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS9PS6/btsNxWDyvr3/Odx0keXVjDmQS9c4ETUBL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS9PS6/btsNxWDyvr3/Odx0keXVjDmQS9c4ETUBL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS9PS6%2FbtsNxWDyvr3%2FOdx0keXVjDmQS9c4ETUBL1%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;1204&quot; height=&quot;1217&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;1217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/59</guid>
      <comments>https://dev-self.tistory.com/59#entry59comment</comments>
      <pubDate>Fri, 25 Apr 2025 02:31:54 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 51일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;강화학습 환경 및 Q-학습 코드 분석&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;1894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2D8gt/btsNx1dxQxB/Rh28EOxQFmwIPZgTcMxJmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2D8gt/btsNx1dxQxB/Rh28EOxQFmwIPZgTcMxJmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2D8gt/btsNx1dxQxB/Rh28EOxQFmwIPZgTcMxJmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2D8gt%2FbtsNx1dxQxB%2FRh28EOxQFmwIPZgTcMxJmK%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;2347&quot; height=&quot;1894&quot; data-origin-width=&quot;2347&quot; data-origin-height=&quot;1894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;환경(Environment) 분석&lt;/h2&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;&lt;b&gt;4x4 격자&lt;/b&gt;: 총 16개의 상태가 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특별한 위치들&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직장(workplace): (0, 3) 위치, 값 2로 표시&lt;/li&gt;
&lt;li&gt;집(home): (3, 3) 위치, 값 3으로 표시&lt;/li&gt;
&lt;li&gt;공원(park): (1,1), (1,2), (2,1), (2,2) 위치, 값 -1로 표시&lt;/li&gt;
&lt;li&gt;에이전트: 값 1로 표시, 초기 위치는 (0, 0)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행동(Actions)&lt;/b&gt;: 4가지 행동 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0: 위로 이동&lt;/li&gt;
&lt;li&gt;1: 오른쪽으로 이동&lt;/li&gt;
&lt;li&gt;2: 아래로 이동&lt;/li&gt;
&lt;li&gt;3: 왼쪽으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확률적 환경&lt;/b&gt;: 70%의 확률로 선택한 행동을 수행하고, 30%의 확률로 무작위 다른 행동을 수행한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보상 시스템&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 보상: -0.5 (매 스텝마다)&lt;/li&gt;
&lt;li&gt;직장에 도착: +5&lt;/li&gt;
&lt;li&gt;집에 도착: +10&lt;/li&gt;
&lt;li&gt;공원에 위치: -1.0&lt;/li&gt;
&lt;li&gt;이미 목표 지점(직장이나 집)에 있는 경우: 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종료 조건&lt;/b&gt;: 에이전트가 직장이나 집에 도착하면 에피소드가 종료된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Q-learning 핵심 알고리즘 분석: &lt;b&gt;&lt;i&gt;핵심 수식과 실제 코드 매핑&lt;/i&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q-learning의 핵심 업데이트 규칙은 다음과 같다:&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;711&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIAEwY/btsNxZUjl1m/7K3NMElxvxqSBzImNineVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIAEwY/btsNxZUjl1m/7K3NMElxvxqSBzImNineVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIAEwY/btsNxZUjl1m/7K3NMElxvxqSBzImNineVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIAEwY%2FbtsNxZUjl1m%2F7K3NMElxvxqSBzImNineVk%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;711&quot; height=&quot;82&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드에서 이 수식이 구현된 부분을 살펴보자:&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 수식의 각 부분이 코드에서 어떻게 구현되었는지 매핑
td = r + gamma * action_value_matrix[i_s_next].max() - action_value_matrix[i_s][a]
action_value_matrix[i_s][a] = action_value_matrix[i_s][a] + alpha * td&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위의 실제 매핑을 표로 정리하면:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GQTj4/btsNy98ZDZj/DcKUOm0H1cpGDWzkDEkpA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GQTj4/btsNy98ZDZj/DcKUOm0H1cpGDWzkDEkpA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GQTj4/btsNy98ZDZj/DcKUOm0H1cpGDWzkDEkpA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGQTj4%2FbtsNy98ZDZj%2FDcKUOm0H1cpGDWzkDEkpA1%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;1156&quot; height=&quot;597&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 내 핵심 Q-learning 구현 부분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 코드에서 Q-learning의 핵심 부분과 수식을 직접 매핑한 것이다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# 핵심 Q-learning 알고리즘 부분
def sarsa(env):
    # Q(s,a) 초기화: 모든 상태-행동 쌍에 대해 0으로 설정
    action_value_matrix = np.zeros([len(env.state_space), len(env.action_space)])
    
    # &amp;epsilon;-greedy 정책에 따라 행동 선택
    def sample_action(eps, action_value):
        a_max = action_value.argmax()  # 최대 Q값을 가진 행동 선택 (greedy)
        pi = np.zeros([len(env.action_space)])
        pi[:] = eps / len(env.action_space)  # 모든 행동에 &amp;epsilon;/|A| 확률 부여
        pi[a_max] = pi[a_max] + 1 - eps      # 최적 행동에 추가 확률 부여
        a = np.random.choice(env.action_space, p=pi)  # 확률에 따라 행동 선택
        return a

    # &amp;epsilon; 값 계산 함수: 시간에 따라 감소
    def get_eps(total_step_count):
        return 1 / (1 + k_eps * total_step_count)  # k_eps = 1e-4
    
    # 학습 루프
    total_step_count = 0
    for loop_count in range(10000):  # 10000 에피소드 실행
        done = False
        step_count = 0

        # 환경 초기화 (s &amp;lt;- s0)
        s = env.reset()
        i_s = get_state_index(env.state_space, s)

        # 에피소드 실행
        while not done:
            # 현재 상태의 Q값들
            action_value = action_value_matrix[i_s]  # Q(s,&amp;middot;)
            
            # &amp;epsilon; 계산 및 행동 선택
            eps = get_eps(total_step_count)
            a = sample_action(eps, action_value)  # a ~ &amp;pi;(&amp;middot;|s)
            
            # 행동 실행 및 결과 관찰
            r, s_next, done = env.step(a)  # r, s' &amp;lt;- Env(s,a)
            
            # TD 학습 (Q-learning)
            i_s_next = get_state_index(env.state_space, s_next)
            alpha = 1 / (1 + k_alpha * loop_count)  # 학습률 계산, k_alpha = 2e-2
            
            # --- 핵심 Q-learning 업데이트 공식 ---
            # TD 오차: &amp;delta; = r + &amp;gamma;&amp;middot;max_a'Q(s',a') - Q(s,a)
            td = r + gamma * action_value_matrix[i_s_next].max() - action_value_matrix[i_s][a]
            
            # Q값 업데이트: Q(s,a) &amp;lt;- Q(s,a) + &amp;alpha;&amp;middot;&amp;delta;
            action_value_matrix[i_s][a] = action_value_matrix[i_s][a] + alpha * td
            # ---------------------------------
            
            # 종료 상태의 Q값은 0으로 설정
            if done:
                action_value_matrix[i_s_next] = 0
            
            # 카운터 업데이트 및 상태 전이
            step_count += 1
            total_step_count += 1
            
            s = s_next
            i_s = i_s_next

        # 진행 상황 출력
        if (loop_count + 1) % 100 == 0:
            print(
                f&quot;[{loop_count}] action_value_matrix: \n{action_value_matrix} &quot;
                + f&quot;eps: {get_eps(total_step_count):.4f} &quot;
                + f&quot;alpha: {alpha:.4f}&quot;
            )

    # 학습된 Q 함수에서 최적 정책 추출
    policy = np.zeros([len(env.state_space), len(env.action_space)])
    state_indexes = np.arange(len(env.state_space))
    argmax_actions = action_value_matrix.argmax(axis=-1)  # 각 상태에서 최대 Q값을 가진 행동
    policy[state_indexes, argmax_actions] = 1.0  # 최적 행동에 확률 1 부여

    return action_value_matrix, policy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실제 예시 계산&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 특정 상황에서의 Q-learning 업데이트를 살펴보자:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상황 가정:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태 s: (0,0) [그리드의 왼쪽 상단] (인덱스 i_s = 0)&lt;/li&gt;
&lt;li&gt;선택한 행동 a: 1 (오른쪽으로 이동)&lt;/li&gt;
&lt;li&gt;보상 r: -0.5 (기본 이동 보상)&lt;/li&gt;
&lt;li&gt;다음 상태 s': (0,1) [오른쪽으로 한 칸 이동] (인덱스 i_s_next = 1)&lt;/li&gt;
&lt;li&gt;loop_count: 100 (100번째 에피소드)&lt;/li&gt;
&lt;li&gt;total_step_count: 500 (총 500 스텝 진행)&lt;/li&gt;
&lt;li&gt;현재 Q값 action_value_matrix[0][1]: -1.2 (예시 값)&lt;/li&gt;
&lt;li&gt;다음 상태의 Q값들 action_value_matrix[1]: [-0.8, -0.5, -1.0, -1.1]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&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;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;alpha = 1 / (1 + k_alpha * loop_count) = 1 / (1 + 0.02 * 100) = 1/3 &amp;asymp; 0.333&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;epsilon; 계산:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;eps = 1 / (1 + k_eps * total_step_count) = 1 / (1 + 0.0001 * 500) = 1/1.05 &amp;asymp; 0.952&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TD 오차 계산:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;max_q_next = action_value_matrix[i_s_next].max() = max([-0.8, -0.5, -1.0, -1.1]) = -0.5
td = r + gamma * max_q_next - action_value_matrix[i_s][a]
td = -0.5 + 0.95 * (-0.5) - (-1.2) = -0.5 - 0.475 + 1.2 = 0.225&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Q값 업데이트:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;markdown&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;action_value_matrix[i_s][a] = action_value_matrix[i_s][a] + alpha * td
action_value_matrix[0][1] = -1.2 + 0.333 * 0.225 = -1.2 + 0.075 = -1.125&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;- 이렇게 Q값이 -1.2에서 -1.125로 업데이트되었다. TD 오차가 양수이므로 Q값이 증가했으며, 이는 실제 보상과 다음 상태의 예상 가치를 고려할 때 현재 행동의 가치가 이전보다 높다는 것을 의미한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Q-learning 알고리즘 실행 과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림은 Q-learning 알고리즘의 내부 실행 과정을 보여준다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;초기화&lt;/b&gt;: 모든 상태-행동 쌍의 Q값을 0으로 초기화한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에피소드 시작&lt;/b&gt;: 에이전트를 초기 상태(0,0)로 리셋한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행동 선택&lt;/b&gt;: &amp;epsilon;-greedy 정책에 따라 행동을 선택한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;epsilon; 확률로 무작위 행동 선택&lt;/li&gt;
&lt;li&gt;(1-&amp;epsilon;) 확률로 현재 최대 Q값을 가진 행동 선택&lt;/li&gt;
&lt;li&gt;&amp;epsilon;는 시간에 따라 감소: &amp;epsilon; = 1/(1+k_eps*total_step_count)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행동 실행&lt;/b&gt;: 선택된 행동을 실행하지만, 환경이 확률적이기 때문에 30%의 확률로 다른 무작위 행동이 실행된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q값 업데이트&lt;/b&gt;: TD(시간차) 학습을 통해 Q값을 업데이트한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습률 &amp;alpha; 계산: &amp;alpha; = 1/(1+k_alpha*loop_count)&lt;/li&gt;
&lt;li&gt;TD 오차 계산: TD = r + &amp;gamma;&amp;middot;max_a'Q(s',a') - Q(s,a)&lt;/li&gt;
&lt;li&gt;Q값 업데이트: Q(s,a) &amp;larr; Q(s,a) + &amp;alpha;&amp;middot;TD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종료 확인&lt;/b&gt;: 에이전트가 직장이나 집에 도달했는지 확인한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;종료된 경우: 해당 에피소드를 마치고 다음 에피소드로 넘어간다.&lt;/li&gt;
&lt;li&gt;종료되지 않은 경우: 상태를 전이(s&amp;larr;s')하고 다시 행동을 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정책 추출&lt;/b&gt;: 충분한 학습 후, 각 상태에서 최대 Q값을 가진 행동을 선택하는 최적 정책을 추출한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;1110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkiA4k/btsNxTzzb1D/BBuxS2gLtdOnPY9ClhvwzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkiA4k/btsNxTzzb1D/BBuxS2gLtdOnPY9ClhvwzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkiA4k/btsNxTzzb1D/BBuxS2gLtdOnPY9ClhvwzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkiA4k%2FbtsNxTzzb1D%2FBBuxS2gLtdOnPY9ClhvwzK%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;1241&quot; height=&quot;1110&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;1110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|인증|&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/onHMn/btsNw2jzGp5/PMqqdaPyEJH6hRKdVhItkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/onHMn/btsNw2jzGp5/PMqqdaPyEJH6hRKdVhItkk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1353&quot; data-filename=&quot;Screenshot from 2025-04-24 17-48-05.png&quot; style=&quot;width: 37.3865%; margin-right: 10px;&quot; data-widthpercent=&quot;38.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/onHMn/btsNw2jzGp5/PMqqdaPyEJH6hRKdVhItkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FonHMn%2FbtsNw2jzGp5%2FPMqqdaPyEJH6hRKdVhItkk%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;618&quot; height=&quot;1353&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Uih0/btsNzdXGsjZ/hlwXxikz9KERM5Iw1qSi8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Uih0/btsNzdXGsjZ/hlwXxikz9KERM5Iw1qSi8K/img.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;1760&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.9038%; margin-right: 10px;&quot; data-widthpercent=&quot;28.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Uih0/btsNzdXGsjZ/hlwXxikz9KERM5Iw1qSi8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Uih0%2FbtsNzdXGsjZ%2FhlwXxikz9KERM5Iw1qSi8K%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;600&quot; height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QNHEf/btsNy8Wlkhl/vOUgKKowzggFa3NpBT3g40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QNHEf/btsNy8Wlkhl/vOUgKKowzggFa3NpBT3g40/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;1562&quot; data-filename=&quot;Screenshot from 2025-04-24 17-48-13.png&quot; style=&quot;width: 32.3841%;&quot; data-widthpercent=&quot;33.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QNHEf/btsNy8Wlkhl/vOUgKKowzggFa3NpBT3g40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQNHEf%2FbtsNy8Wlkhl%2FvOUgKKowzggFa3NpBT3g40%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;618&quot; height=&quot;1562&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO4Blc/btsNzfBaOLo/duT9Y3P9hfsh0klyJKt500/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO4Blc/btsNzfBaOLo/duT9Y3P9hfsh0klyJKt500/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO4Blc/btsNzfBaOLo/duT9Y3P9hfsh0klyJKt500/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO4Blc%2FbtsNzfBaOLo%2FduT9Y3P9hfsh0klyJKt500%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;2298&quot; height=&quot;1230&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/58</guid>
      <comments>https://dev-self.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 24 Apr 2025 18:06:36 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 50일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;Q-learning &lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;알고리즘 코드 구현 연습&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-sourcepos=&quot;138:1-138:14&quot; data-ke-size=&quot;size26&quot;&gt;1. 기본 개념 설명(복습)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-sourcepos=&quot;140:1-157:103&quot;&gt;
&lt;li data-sourcepos=&quot;140:1-140:161&quot;&gt;&lt;b&gt;강화학습 (Reinforcement Learning):&lt;/b&gt; 에이전트(Agent)가 환경(Environment)과 상호작용하며 보상(Reward)을 최대화하는 방향으로 행동(Action)을 학습하는 머신러닝의 한 분야이다. 시행착오(Trial-and-error)를 통해 학습한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;141:1-141:59&quot;&gt;&lt;b&gt;에이전트 (Agent):&lt;/b&gt; 학습하고 행동하는 주체 (이 코드에서는 격자 세계를 돌아다니는 개체).&lt;/li&gt;
&lt;li data-sourcepos=&quot;142:1-142:60&quot;&gt;&lt;b&gt;환경 (Environment):&lt;/b&gt; 에이전트가 상호작용하는 외부 세계 (이 코드에서는 4x4 격자).&lt;/li&gt;
&lt;li data-sourcepos=&quot;143:1-143:51&quot;&gt;&lt;b&gt;상태 (State, s):&lt;/b&gt; 환경의 현재 상황을 나타내는 정보 (에이전트의 위치).&lt;/li&gt;
&lt;li data-sourcepos=&quot;144:1-144:64&quot;&gt;&lt;b&gt;행동 (Action, a):&lt;/b&gt; 에이전트가 특정 상태에서 취할 수 있는 선택지 (상, 하, 좌, 우 이동).&lt;/li&gt;
&lt;li data-sourcepos=&quot;145:1-145:80&quot;&gt;&lt;b&gt;보상 (Reward, r):&lt;/b&gt; 에이전트가 특정 행동을 취한 결과로 환경으로부터 받는 피드백 신호 (목표 도달 시 +10, 그 외 0).&lt;/li&gt;
&lt;li data-sourcepos=&quot;146:1-146:60&quot;&gt;&lt;b&gt;정책 (Policy, &amp;pi;):&lt;/b&gt; 특정 상태에서 어떤 행동을 할지 결정하는 에이전트의 전략 또는 규칙.&lt;/li&gt;
&lt;li data-sourcepos=&quot;147:1-149:109&quot;&gt;&lt;b&gt;가치 함수 (Value Function):&lt;/b&gt; 특정 상태 또는 상태-행동 쌍이 장기적으로 얼마나 좋은지를 나타내는 함수.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-sourcepos=&quot;148:5-149:109&quot;&gt;
&lt;li data-sourcepos=&quot;148:5-148:80&quot;&gt;&lt;b&gt;상태-가치 함수 (State-Value Function, V(s)):&lt;/b&gt; 상태 s에서 시작했을 때 앞으로 받을 총 보상의 기댓값.&lt;/li&gt;
&lt;li data-sourcepos=&quot;149:5-149:109&quot;&gt;&lt;b&gt;행동-가치 함수 (Action-Value Function, Q(s, a)):&lt;/b&gt; 상태 s에서 행동 a를 취했을 때 앞으로 받을 총 보상의 기댓값. Q-러닝은 이 Q함수를 학습한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;150:1-154:141&quot;&gt;&lt;b&gt;Q-러닝 (Q-Learning):&lt;/b&gt; 대표적인 &lt;b&gt;모델-프리(Model-Free)&lt;/b&gt;, &lt;b&gt;오프-폴리시(Off-Policy)&lt;/b&gt; 강화학습 알고리즘이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-sourcepos=&quot;151:5-154:141&quot;&gt;
&lt;li data-sourcepos=&quot;151:5-151:62&quot;&gt;&lt;b&gt;모델-프리:&lt;/b&gt; 환경의 작동 방식(상태 전이 확률, 보상 함수)을 미리 알 필요 없이 학습한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;152:5-152:139&quot;&gt;&lt;b&gt;오프-폴리시:&lt;/b&gt; 에이전트가 실제로 따르는 행동 정책(탐험 포함)과 학습하려는 목표 정책(최적 정책)이 달라도 학습이 가능하다. Q-러닝은 항상 다음 상태에서 가능한 Q-값 중 최댓값을 사용하여 업데이트하기 때문에 오프-폴리시이다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;153:5-153:68&quot;&gt;&lt;b&gt;Q-테이블:&lt;/b&gt; 상태와 행동 쌍에 대한 Q-값을 저장하는 테이블 (action_value_matrix).&lt;/li&gt;
&lt;li data-sourcepos=&quot;154:5-154:141&quot;&gt;&lt;b&gt;시간차 학습 (Temporal Difference, TD):&lt;/b&gt; 현재 추정치를 사용하여 다음 추정치를 업데이트하는 방식. Q-러닝은 TD 학습의 일종이다. r + gamma * max_a'(Q(s', a')) 부분이 TD 타겟이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;155:1-155:163&quot;&gt;&lt;b&gt;Epsilon-Greedy 탐험 (Epsilon-Greedy Exploration):&lt;/b&gt; 학습 초반에는 무작위 행동(탐험)을 통해 다양한 경험을 쌓고, 학습이 진행됨에 따라 점차 최적이라고 생각되는 행동(활용)의 비율을 높이는 전략이다. epsilon 값이 이 비율을 조절한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;156:1-156:120&quot;&gt;&lt;b&gt;학습률 (Learning Rate, &amp;alpha;):&lt;/b&gt; TD 에러를 얼마나 반영하여 Q-값을 업데이트할지 결정하는 비율. 너무 크면 학습이 불안정하고, 너무 작으면 학습이 느려진다. 이 코드에서는 점차 감소시킨다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;157:1-157:103&quot;&gt;&lt;b&gt;할인율 (Discount Factor, &amp;gamma;):&lt;/b&gt; 미래 보상을 현재 가치로 환산할 때 얼마나 할인할지를 결정하는 값 (0~1). 1에 가까울수록 미래 보상을 중요하게 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-sourcepos=&quot;3:1-3:30&quot; data-ke-size=&quot;size26&quot;&gt;2. 환경 설정 (environment.py)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경 코드는 4x4 격자 세계(Grid World)를 구현한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;초기화 함수 (__init__)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;5:1-5:66&quot; data-ke-size=&quot;size16&quot;&gt;이 코드는 강화학습 에이전트가 상호작용할 환경을 정의한다. 4x4 크기의 격자 세계(Grid World) 환경이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pf&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def __init__(self):
    '''
    state_space: 4x4 grid info using numpy
    value of the agent location: 1
    value of the goal location: -1

    action_space: {0, 1, 2, 3}
    0: up
    1: right
    2: down
    3: left
    '''
    self.agent_pos = {'y': 0, 'x': 0}
    self.goal_pos = {'y': 3, 'x': 3}
    self.y_min, self.x_min, self.y_max, self.x_max = 0, 0, 3, 3

    # set up state
    self.state = np.zeros([4, 4])
    self.state[self.goal_pos['y'], self.goal_pos['x']] = -1
    self.state[self.agent_pos['y'], self.agent_pos['x']] = 1

    self.state_space = list()
    for y in range(4):
        for x in range(4):
            state = np.zeros([4,4])
            state[self.goal_pos['y'], self.goal_pos['x']] = -1
            state[y, x] = 1
            self.state_space.append(state)

    self.action_space = [0, 1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;에이전트 위치&lt;/b&gt;: (0,0)에서 시작&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목표 위치&lt;/b&gt;: (3,3)에 고정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 표현&lt;/b&gt;: 4x4 NumPy 배열로, 에이전트 위치는 1, 목표는 -1, 나머지는 0&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 공간&lt;/b&gt;: 에이전트가 있을 수 있는 모든 위치를 미리 계산 (총 16개 상태)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;행동 공간&lt;/b&gt;: [0(상), 1(우), 2(하), 3(좌)]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경 리셋 (reset)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pf&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def reset(self):
    self.agent_pos = {'y': 0, 'x': 0}
    self.state = np.zeros([4,4])
    self.state[self.goal_pos['y'], self.goal_pos['x']] = -1
    self.state[self.agent_pos['y'], self.agent_pos['x']] = 1
    
    return self.state&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트 위치를 (0,0)으로 초기화&lt;/li&gt;
&lt;li&gt;상태 배열 재설정 후 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;환경 진행 (step)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pf&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def step(self, action):
    # Update environmental variables 
    if action == 0:
        # 'y' should be decreased by 1 or stay the same when it is at the top row
        self.agent_pos['y'] = max(
            self.agent_pos['y'] - 1, 
            self.y_min
        ) 
    elif action == 1:
        # 'x' should be increased by 1 or stay the same when it is at the most right column
        self.agent_pos['x'] = min(
            self.agent_pos['x'] + 1, 
            self.x_max
        )
    elif action == 2:
        # 'y' should be increased by 1 or stay the same when it is at the bottom row
        self.agent_pos['y'] = min(
            self.agent_pos['y'] + 1, 
            self.y_max
        )
    elif action == 3:
        # 'x' should be decreased by 1 or stay the same when it is at the most left column
        self.agent_pos['x'] = max(
            self.agent_pos['x'] - 1, 
            self.x_min
        )
    else:
        assert False, &quot;Invalid action value was fed to step.&quot;

    # Make a next state after transition
    prev_state = self.state
    self.state = np.zeros([4,4])
    self.state[self.goal_pos['y'], self.goal_pos['x']] = -1
    self.state[self.agent_pos['y'], self.agent_pos['x']] = 1

    done = False
    if self.agent_pos == self.goal_pos:
        done = True

    reward = self.reward(prev_state, action, self.state)

    return reward, self.state, done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 행동(action)에 따라 에이전트 위치 업데이트&lt;/li&gt;
&lt;li&gt;격자 경계를 벗어나지 않도록 처리 (min, max 함수 사용)&lt;/li&gt;
&lt;li&gt;상태 업데이트 후 이전 상태 저장&lt;/li&gt;
&lt;li&gt;목표 도달 여부 확인&lt;/li&gt;
&lt;li&gt;보상 계산 및 결과 반환 (보상, 다음 상태, 종료 여부)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;보상 함수 (reward)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ruby&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def reward(self, s, a, s_next):
    reward = 0
    y, x = np.where(s == 1)
    y_next, x_next = np.where(s_next == 1)
    if (
            (y_next == self.goal_pos['y'] and x_next == self.goal_pos['x']) and
            (y != self.goal_pos['y'] or x != self.goal_pos['x'])
        ):  # Reached the goal
        reward = 10
        
    return reward&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태와 다음 상태에서 에이전트 위치 추출&lt;/li&gt;
&lt;li&gt;목표에 도달했을 때만 보상 10 지급&lt;/li&gt;
&lt;li&gt;그 외에는 보상 0 (Sparse reward)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-sourcepos=&quot;40:1-40:34&quot; data-ke-size=&quot;size26&quot;&gt;2. Q-learning 구현 (q_learning.py)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;하이퍼파라미터 및 유틸리티 함수&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;pf&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;gamma = 0.9  # 할인율
k_alpha = 2e-2  # 학습률 감쇠 계수
k_eps = 2e-4  # 탐험률 감쇠 계수

def get_state_index(state_space, state):
    for i_s, s in enumerate(state_space):
        if (s == state).all():
            return i_s
    assert False, &quot;Couldn't find the state from the state space&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gamma: 미래 보상의 가치를 현재 기준으로 할인하는 비율&lt;/li&gt;
&lt;li&gt;k_alpha: 학습률을 에피소드가 진행됨에 따라 감소시키는 계수&lt;/li&gt;
&lt;li&gt;k_eps: 탐험률을 스텝이 진행됨에 따라 감소시키는 계수&lt;/li&gt;
&lt;li&gt;get_state_index: 주어진 상태 배열이 상태 공간 내에서 어떤 인덱스에 해당하는지 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q-learning 함수&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def q_learning(env):
    action_value_matrix = np.zeros([len(env.state_space), len(env.action_space)])

    def sample_action(eps, action_value):
        a_max = action_value.argmax()
        pi = np.zeros([len(env.action_space)])
        pi[:] = eps / len(env.action_space)
        pi[a_max] = pi[a_max] + 1 - eps
        a = np.random.choice(env.action_space, p=pi)
        return a

    def get_eps(total_step_count):
        return 1 / (1 + k_eps * total_step_count)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;action_value_matrix: Q-테이블 초기화 (16x4 크기)&lt;/li&gt;
&lt;li&gt;sample_action: 입실론-그리디 방식으로 행동 선택
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률 eps로 무작위 행동 선택&lt;/li&gt;
&lt;li&gt;확률 1-eps로 최대 Q-값을 가진 행동 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;get_eps: 전체 스텝 수에 따라 탐험률 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;학습 과정 구현&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;total_step_count = 0
for loop_count in range(2000):
    done = False
    step_count = 0

    s = env.reset()
    i_s = get_state_index(env.state_space, s)

    # Generate an episode
    while not done:
        action_value = action_value_matrix[i_s]
        eps = get_eps(total_step_count)
        a = sample_action(eps, action_value)
        r, s_next, done = env.step(a)

        i_s_next = get_state_index(env.state_space, s_next)
        alpha = 1 / (1 + k_alpha * loop_count)
        td = r + gamma * action_value_matrix[i_s_next].max() - action_value_matrix[i_s][a]
        action_value_matrix[i_s][a] = action_value_matrix[i_s][a] + alpha * td
        
        if done:
            action_value_matrix[i_s_next] = 0

        step_count += 1
        total_step_count += 1
        
        s = s_next
        i_s = i_s_next&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;2000번의 에피소드를 반복&lt;/li&gt;
&lt;li&gt;각 에피소드 내부:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 초기화 (env.reset())&lt;/li&gt;
&lt;li&gt;에피소드 완료될 때까지 반복:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태의 Q-값 가져오기&lt;/li&gt;
&lt;li&gt;현재 탐험률 계산&lt;/li&gt;
&lt;li&gt;행동 선택&lt;/li&gt;
&lt;li&gt;환경과 상호작용 (행동 실행)&lt;/li&gt;
&lt;li&gt;학습률 계산 (alpha)&lt;/li&gt;
&lt;li&gt;TD(Temporal Difference) 에러 계산 및 Q-값 업데이트&lt;/li&gt;
&lt;li&gt;종료 상태 처리 (종료 상태의 Q-값은 0으로 설정)&lt;/li&gt;
&lt;li&gt;상태 업데이트 및 카운터 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정책 추출 및 반환&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;# Generate optimal policy from the action value function
policy = np.zeros([len(env.state_space), len(env.action_space)])
state_indexes = np.arange(len(env.state_space))
argmax_actions = action_value_matrix.argmax(axis=-1)
policy[state_indexes, argmax_actions] = 1.0

return action_value_matrix, policy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습된 Q-테이블에서 각 상태별 최적 행동 추출&lt;/li&gt;
&lt;li&gt;확정적 정책 생성 (최적 행동에 확률 1.0 부여)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메인 실행 부분&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;:
    np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
    env = Env()
    action_value_matrix, policy = q_learning(env)

    argmax_actions = action_value_matrix.argmax(axis=-1)
    value_vector = np.sum(policy * action_value_matrix, axis=-1)

    value_table = value_vector.reshape(4, 4)
    argmax_actions_table = argmax_actions.reshape(4, 4)
    print(
        f&quot;value_table: \n{value_table}\n&quot;
        + f&quot;argmax_actions: \n{argmax_actions.reshape(4, 4)}&quot;
    )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 생성&lt;/li&gt;
&lt;li&gt;Q-learning 실행&lt;/li&gt;
&lt;li&gt;학습된 Q-테이블에서 최적 행동과 가치 계산&lt;/li&gt;
&lt;li&gt;결과를 4x4 격자 형태로 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot; data-sourcepos=&quot;40:1-40:34&quot;&gt;3. 코드 구조도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;1458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRk1jK/btsNvSTSDKc/Aux2CWJtgsekXO1zCwrkm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRk1jK/btsNvSTSDKc/Aux2CWJtgsekXO1zCwrkm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRk1jK/btsNvSTSDKc/Aux2CWJtgsekXO1zCwrkm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRk1jK%2FbtsNvSTSDKc%2FAux2CWJtgsekXO1zCwrkm1%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;985&quot; height=&quot;1458&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;1458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다이어그램은 Q-learning 알고리즘의 실행 흐름을 보여준다. 메인 함수에서 환경을 초기화하고, Q-learning 함수를 호출하며, 내부에서는 에피소드와 스텝을 반복하면서 Q-테이블을 업데이트하고 최종적으로 최적 정책을 추출한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행 및 디버깅&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be1ClV/btsNws8gl5t/I4ArDvPkTFu3nzXxAeJqD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be1ClV/btsNws8gl5t/I4ArDvPkTFu3nzXxAeJqD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be1ClV/btsNws8gl5t/I4ArDvPkTFu3nzXxAeJqD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe1ClV%2FbtsNws8gl5t%2FI4ArDvPkTFu3nzXxAeJqD1%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;959&quot; height=&quot;765&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력으로 보이는 부분은 학습 과정 중 1999번째 에피소드에서의 Q-테이블(action_value_matrix) 값이다. 이 시점에서 epsilon(탐험률)은 0.2128, alpha(학습률)는 0.0257이다.&lt;/p&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;가치 테이블(value_table)&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[[ 5.905  6.561  7.290  8.100]
 [ 6.561  7.290  8.100  9.000]
 [ 7.290  8.100  9.000 10.000]
 [ 8.100  9.000 10.000  0.000]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 위치에서의 최적 가치를 보여준다.&lt;/li&gt;
&lt;li&gt;목표 위치(3,3)의 가치는 0.000으로 설정되어 있다(종료 상태).&lt;/li&gt;
&lt;li&gt;목표에 가까울수록 가치가 높아지는 패턴이 명확하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최적 행동(argmax_actions)&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[[1 2 1 2]
 [1 1 1 2]
 [1 2 1 2]
 [1 1 1 0]]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 위치에서 에이전트가 취해야 할 최적 행동을 나타낸다.&lt;/li&gt;
&lt;li&gt;0: 위쪽, 1: 오른쪽, 2: 아래쪽, 3: 왼쪽&lt;/li&gt;
&lt;li&gt;대부분의 위치에서 오른쪽(1)이나 아래쪽(2)으로 이동하는 것이 최적인데, 이는 목표가 오른쪽 아래(3,3)에 있기 때문이다.&lt;/li&gt;
&lt;li&gt;마지막 행의 마지막 열(목표 위치, 3,3)에서는 위쪽(0)으로 이동하는 것이 표시되어 있지만, 이는 사실상 의미가 없다(종료 상태이므로).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해석:&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;학습이 성공적으로 이루어졌다. 목표 지점(3,3)에 가까울수록 가치가 높게 나타나며, 최적 행동들은 대체로 목표를 향해 움직이도록 설정되었다.&lt;/li&gt;
&lt;li&gt;격자의 오른쪽과 아래쪽 경계를 따라 목표로 향하는 경로가 형성되었다. 에이전트는 대부분의 위치에서 오른쪽(1)이나 아래쪽(2)으로 이동하는 것을 선호한다.&lt;/li&gt;
&lt;li&gt;가치 테이블에서 목표 상태(3,3)의 가치가 0인 것은 종료 상태 처리 로직(if done: action_value_matrix[i_s_next] = 0) 때문이다.&lt;/li&gt;
&lt;li&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;/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/NxbFu/btsNvrio82v/q3xXYLshQZPmPrMmhq4751/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NxbFu/btsNvrio82v/q3xXYLshQZPmPrMmhq4751/img.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;1884&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Screenshot from 2025-04-23 10-31-51.png&quot; style=&quot;width: 30.0558%; margin-right: 10px;&quot; data-widthpercent=&quot;30.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NxbFu/btsNvrio82v/q3xXYLshQZPmPrMmhq4751/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNxbFu%2FbtsNvrio82v%2Fq3xXYLshQZPmPrMmhq4751%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;607&quot; height=&quot;1884&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKp1Jw/btsNuYgWRgI/jnUufIMJSGm9nPy2zpFWf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKp1Jw/btsNuYgWRgI/jnUufIMJSGm9nPy2zpFWf0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;1707&quot; data-filename=&quot;Screenshot from 2025-04-23 10-47-11.png&quot; style=&quot;width: 33.6095%; margin-right: 10px;&quot; data-widthpercent=&quot;34.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKp1Jw/btsNuYgWRgI/jnUufIMJSGm9nPy2zpFWf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKp1Jw%2FbtsNuYgWRgI%2FjnUufIMJSGm9nPy2zpFWf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;1707&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7XgSZ/btsNvTrIYet/xDxkUEaeXp17PQbwgVKN8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7XgSZ/btsNvTrIYet/xDxkUEaeXp17PQbwgVKN8k/img.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;1665&quot; data-is-animation=&quot;false&quot; data-filename=&quot;Screenshot from 2025-04-23 10-31-57.png&quot; style=&quot;width: 34.0091%;&quot; data-widthpercent=&quot;34.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7XgSZ/btsNvTrIYet/xDxkUEaeXp17PQbwgVKN8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7XgSZ%2FbtsNvTrIYet%2FxDxkUEaeXp17PQbwgVKN8k%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;607&quot; height=&quot;1665&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot from 2025-04-23 10-54-55.png&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;1563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcUSkr/btsNvTZympV/K66Vnr5jUPxqe7ZQAjHUf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcUSkr/btsNvTZympV/K66Vnr5jUPxqe7ZQAjHUf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcUSkr/btsNvTZympV/K66Vnr5jUPxqe7ZQAjHUf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcUSkr%2FbtsNvTZympV%2FK66Vnr5jUPxqe7ZQAjHUf0%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;2154&quot; height=&quot;1563&quot; data-filename=&quot;Screenshot from 2025-04-23 10-54-55.png&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;1563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/57</guid>
      <comments>https://dev-self.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 23 Apr 2025 10:58:57 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 49일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;강화 학습: SARSA 알고리즘 코드 구현 연습&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1677&quot; data-origin-height=&quot;1311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzUSn7/btsNve3wdcP/JxWeBLHt88SmotO2p5sLhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzUSn7/btsNve3wdcP/JxWeBLHt88SmotO2p5sLhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzUSn7/btsNve3wdcP/JxWeBLHt88SmotO2p5sLhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzUSn7%2FbtsNve3wdcP%2FJxWeBLHt88SmotO2p5sLhK%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;1677&quot; height=&quot;1311&quot; data-origin-width=&quot;1677&quot; data-origin-height=&quot;1311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;환경 구현(Env 클래스)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트가 (0,0)에서 시작하고 목표가 (3,3)인 4x4 그리드 월드&lt;/li&gt;
&lt;li&gt;위, 오른쪽, 아래, 왼쪽의 네 가지 가능한 행동&lt;/li&gt;
&lt;li&gt;목표에 도달할 때 +10의 보상, 그 외에는 0&lt;/li&gt;
&lt;li&gt;환경은 에이전트의 움직임과 경계 확인을 처리함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SARSA 알고리즘 구현&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;온폴리시(on-policy) 시간차(temporal difference) 학습 알고리즘&lt;/li&gt;
&lt;li&gt;가상의 최적 행동이 아닌 실제 취한 행동을 기반으로 Q-값 업데이트&lt;/li&gt;
&lt;li&gt;핵심 업데이트 공식 사용: Q(s,a) &amp;larr; Q(s,a) + &amp;alpha;[r + &amp;gamma;Q(s',a') - Q(s,a)]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;탐색 전략&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;epsilon;-greedy 정책으로 탐색과 활용의 균형을 맞춤&lt;/li&gt;
&lt;li&gt;&amp;epsilon;(탐색률)과 &amp;alpha;(학습률) 모두 시간이 지남에 따라 감소&lt;/li&gt;
&lt;li&gt;탐색은 학습 초기에 환경을 발견하는 데 도움을 줌&lt;/li&gt;
&lt;li&gt;활용은 학습된 정보를 기반으로 정책을 개선함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 흐름:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 상태-행동 쌍에 대한 Q-값을 0으로 초기화&lt;/li&gt;
&lt;li&gt;각 에피소드마다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;환경 초기화(에이전트를 시작 위치에 배치)&lt;/li&gt;
&lt;li&gt;&amp;epsilon;-greedy 정책을 사용하여 초기 행동 선택&lt;/li&gt;
&lt;li&gt;에피소드가 끝날 때까지:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행동을 취하고, 보상과 다음 상태 관찰&lt;/li&gt;
&lt;li&gt;&amp;epsilon;-greedy 정책을 사용하여 다음 행동 선택&lt;/li&gt;
&lt;li&gt;SARSA 규칙을 사용하여 Q-값 업데이트&lt;/li&gt;
&lt;li&gt;다음 상태-행동 쌍으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종 Q-값에서 최적 정책 추출&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최적 정책 성능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 그리드 월드에서 SARSA가 학습한 최적 정책:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;에이전트를 시작 위치에서 목표 위치로 안내&lt;/li&gt;
&lt;li&gt;누적 보상을 최대화하기 위해 최단 경로 선택&lt;/li&gt;
&lt;li&gt;행동은 결정적(학습된 Q-값에 대해 탐욕적)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 아티팩트의 시각화는 에이전트가 그리드의 모든 위치에서 목표에 도달하기 위해 어떻게 이동하는지 보여준다. 화살표는 각 상태에서 가장 높은 Q-값을 가진 행동을 나타낸다. 이 구현은 다음과 같은 기본 강화학습 원칙을 보여준다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가치 함수 근사&lt;/li&gt;
&lt;li&gt;시간차 학습&lt;/li&gt;
&lt;li&gt;탐색과 활용의 균형&lt;/li&gt;
&lt;li&gt;가치 함수에서 정책 도출&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1691&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2YTPT/btsNvFzLu4M/JU9dRGpgrr8xcv3DhX4Ksk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2YTPT/btsNvFzLu4M/JU9dRGpgrr8xcv3DhX4Ksk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2YTPT/btsNvFzLu4M/JU9dRGpgrr8xcv3DhX4Ksk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2YTPT%2FbtsNvFzLu4M%2FJU9dRGpgrr8xcv3DhX4Ksk%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;1691&quot; height=&quot;1024&quot; data-origin-width=&quot;1691&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 코드 추출 및 설명&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 환경(Environment) 클래스 핵심 코드&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;pf&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;class Env:
    def __init__(self):
        # 에이전트와 목표 위치 초기화
        self.agent_pos = {'y': 0, 'x': 0}
        self.goal_pos = {'y': 3, 'x': 3}
        self.y_min, self.x_min, self.y_max, self.x_max = 0, 0, 3, 3
        
        # 상태 공간 설정
        self.state = np.zeros([4, 4])
        self.state[self.goal_pos['y'], self.goal_pos['x']] = -1
        self.state[self.agent_pos['y'], self.agent_pos['x']] = 1
        
        # 가능한 모든 상태 생성
        self.state_space = list()
        for y in range(4):
            for x in range(4):
                state = np.zeros([4,4])
                state[self.goal_pos['y'], self.goal_pos['x']] = -1
                state[y, x] = 1
                self.state_space.append(state)

        self.action_space = [0, 1, 2, 3]  # 위, 오른쪽, 아래, 왼쪽

    def step(self, action):
        # 행동에 따른 에이전트 위치 업데이트
        if action == 0:  # 위
            self.agent_pos['y'] = max(self.agent_pos['y'] - 1, self.y_min)
        elif action == 1:  # 오른쪽
            self.agent_pos['x'] = min(self.agent_pos['x'] + 1, self.x_max)
        elif action == 2:  # 아래
            self.agent_pos['y'] = min(self.agent_pos['y'] + 1, self.y_max)
        elif action == 3:  # 왼쪽
            self.agent_pos['x'] = max(self.agent_pos['x'] - 1, self.x_min)
        
        # 새로운 상태 생성
        prev_state = self.state
        self.state = np.zeros([4,4])
        self.state[self.goal_pos['y'], self.goal_pos['x']] = -1
        self.state[self.agent_pos['y'], self.agent_pos['x']] = 1

        # 목표 도달 여부 확인
        done = False
        if self.agent_pos == self.goal_pos:
            done = True

        # 보상 계산
        reward = self.reward(prev_state, action, self.state)

        return reward, self.state, done

    def reward(self, s, a, s_next):
        reward = 0
        y, x = np.where(s == 1)
        y_next, x_next = np.where(s_next == 1)
        # 목표에 도달했을 경우 보상 10 제공
        if ((y_next == self.goal_pos['y'] and x_next == self.goal_pos['x']) and
            (y != self.goal_pos['y'] or x != self.goal_pos['x'])):
            reward = 10
        return reward&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SARSA 알고리즘 핵심 코드&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;def sarsa(env):
    # Q-값 초기화 (행동 가치 함수)
    action_value_matrix = np.zeros([len(env.state_space), len(env.action_space)])
    
    # &amp;epsilon;-greedy 정책을 사용한 행동 선택 함수
    def sample_action(eps, action_value):
        a_max = action_value.argmax()
        pi = np.zeros([len(env.action_space)])
        pi[:] = eps / len(env.action_space)
        pi[a_max] = pi[a_max] + 1 - eps
        a = np.random.choice(env.action_space, p=pi)
        return a
    
    # 탐색률(&amp;epsilon;) 계산 함수
    def get_eps(total_step_count):
        return 1 / (1 + k_eps * total_step_count)

    # SARSA 메인 루프
    total_step_count = 0
    for loop_count in range(50000):
        done = False
        s = env.reset()
        i_s = get_state_index(env.state_space, s)
        eps = get_eps(total_step_count)
        a = sample_action(eps, action_value_matrix[i_s])

        # 에피소드 생성
        while not done:
            # 행동 실행 및 다음 상태, 보상 관찰
            r, s_next, done = env.step(a)
            i_s_next = get_state_index(env.state_space, s_next)
            
            # 다음 상태에서 &amp;epsilon;-greedy로 다음 행동 선택
            eps = get_eps(total_step_count)
            a_next = sample_action(eps, action_value_matrix[i_s_next])
            
            # 학습률 계산
            alpha = 1 / (1 + k_alpha * loop_count)
            
            # TD 오차 계산 및 Q-값 업데이트
            td = r + gamma * action_value_matrix[i_s_next][a_next] - action_value_matrix[i_s][a]
            action_value_matrix[i_s][a] = action_value_matrix[i_s][a] + alpha * td
            
            # 목표 상태의 경우 Q-값을 0으로 설정
            if done:
                action_value_matrix[i_s_next] = 0
                
            # 다음 상태-행동 쌍으로 이동
            s = s_next
            i_s = i_s_next
            a = a_next
            
            total_step_count += 1

    # 최적 정책 생성
    policy = np.zeros([len(env.state_space), len(env.action_space)])
    state_indexes = np.arange(len(env.state_space))
    argmax_actions = action_value_matrix.argmax(axis=-1)
    policy[state_indexes, argmax_actions] = 1.0
    
    return action_value_matrix, policy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 상세 설명&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 환경(Env) 클래스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기화 (__init__)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4x4 크기의 그리드 월드 생성&lt;/li&gt;
&lt;li&gt;에이전트는 (0,0)에서 시작, 목표는 (3,3)에 위치&lt;/li&gt;
&lt;li&gt;상태는 4x4 배열로 표현: 에이전트 위치는 1, 목표 위치는 -1, 나머지는 0&lt;/li&gt;
&lt;li&gt;state_space는 모든 가능한 상태를 저장 (총 16개의 상태)&lt;/li&gt;
&lt;li&gt;action_space는 가능한 모든 행동(0:위, 1:오른쪽, 2:아래, 3:왼쪽)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;step 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 행동(action)에 따라 에이전트의 위치 업데이트&lt;/li&gt;
&lt;li&gt;경계 밖으로 나가는 것을 방지하는 로직 포함&lt;/li&gt;
&lt;li&gt;새로운 상태를 생성하고 목표 도달 여부 확인&lt;/li&gt;
&lt;li&gt;reward 함수를 통해 보상 계산 후 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;reward 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목표에 도달했을 때만 보상 10을 제공, 그 외에는 0&lt;/li&gt;
&lt;li&gt;단순한 보상 체계로 에이전트가 목표를 찾도록 유도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. SARSA 알고리즘&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기화&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 상태-행동 쌍에 대한 Q-값을 0으로 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;sample_action 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;epsilon;-greedy 정책을 구현&lt;/li&gt;
&lt;li&gt;확률 &amp;epsilon;으로 무작위 행동 선택&lt;/li&gt;
&lt;li&gt;확률 1-&amp;epsilon;로 Q-값이 가장 높은 행동 선택&lt;/li&gt;
&lt;li&gt;수식: &amp;pi;(a|s) = &amp;epsilon;/|A| + (1-&amp;epsilon;) if a = argmax Q(s,a') else &amp;epsilon;/|A|&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;get_eps 함수&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간에 따라 감소하는 탐색률(&amp;epsilon;) 계산&lt;/li&gt;
&lt;li&gt;수식: &amp;epsilon; = 1/(1 + k_&amp;epsilon; * total_step_count)&lt;/li&gt;
&lt;li&gt;초기에는 탐색을 많이 하고 시간이 지남에 따라 학습된 정책에 더 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;메인 루프&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;환경 초기화 및 시작 상태에서 &amp;epsilon;-greedy로 행동 선택&lt;/li&gt;
&lt;li&gt;상태-행동-보상-다음상태-다음행동 샘플 수집&lt;/li&gt;
&lt;li&gt;TD 오차 계산: &amp;delta; = r + &amp;gamma;Q(s',a') - Q(s,a)&lt;/li&gt;
&lt;li&gt;Q-값 업데이트: Q(s,a) &amp;larr; Q(s,a) + &amp;alpha; * &amp;delta;&lt;/li&gt;
&lt;li&gt;다음 상태-행동 쌍으로 이동&lt;/li&gt;
&lt;li&gt;목표에 도달할 때까지 2-5 반복&lt;/li&gt;
&lt;li&gt;50,000번의 에피소드 수행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습률(&amp;alpha;) 감소&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수식: &amp;alpha; = 1/(1 + k_&amp;alpha; * loop_count)&lt;/li&gt;
&lt;li&gt;시간이 지남에 따라 학습률 감소로 Q-값의 안정화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적 정책 생성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 상태에서 Q-값이 가장 높은 행동을 선택하는 결정적 정책&lt;/li&gt;
&lt;li&gt;모든 상태에 대한 최적 행동을 매핑한 배열 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 알고리즘 수식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SARSA의 핵심은 다음 TD 학습 업데이트 규칙이다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q(s, a) &amp;larr; Q(s, a) + &amp;alpha;[r + &amp;gamma;Q(s', a') - Q(s, a)]&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;Q(s, a): 상태 s에서 행동 a를 취했을 때의 예상 누적 보상&lt;/li&gt;
&lt;li&gt;&amp;alpha;: 학습률(시간에 따라 감소)&lt;/li&gt;
&lt;li&gt;r: 즉각적인 보상&lt;/li&gt;
&lt;li&gt;&amp;gamma;: 할인 계수(0.9로 설정됨)&lt;/li&gt;
&lt;li&gt;s': 행동 a를 취한 후의 다음 상태&lt;/li&gt;
&lt;li&gt;a': 상태 s'에서 &amp;epsilon;-greedy 정책에 따라 선택된 다음 행동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 알고리즘은 실제로 취한 행동(a')의 Q-값을 사용하여 현재 Q-값을 업데이트하는 온폴리시(on-policy) 학습 방법이다. 이는 Q-learning과의 주요 차이점으로, Q-learning은 다음 상태에서 가능한 최대 Q-값을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로, 충분한 학습 후 각 상태에서 가장 높은 Q-값을 가진 행동을 선택하는 최적 정책이 형성된다. 이 정책은 에이전트를 시작 위치에서 목표까지의 최단 경로로 안내한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1&gt;Policy Iteration과 SARSA 결과값 비교 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제공된 두 이미지는 각각 Policy Iteration과 SARSA 알고리즘의 실행 결과를 보여준다. 두 알고리즘의 결과값을 비교해보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가치 함수(Value Function) 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Policy Iteration 결과 (이미지 1)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 결과:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[0.70296524 0.8610546  1.13251421 1.38260723]
[0.8610546  1.13397666 1.66059224 2.25038023]
[1.13251421 1.66059224 2.86659777 4.71086143]
[1.38260723 2.25038023 4.71086143 0.        ]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 결과:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[5.9049  6.561  7.29   8.1  ]
[6.561   7.29   8.1    9.   ]
[7.29    8.1    9.     10.  ]
[8.1     9.     10.    0.   ]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SARSA 결과 (이미지 2)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 결과:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;5.861  6.478  7.246  8.044]
[6.531  7.233  8.076  8.998]
[7.269  8.063  8.989  10.000]
[8.091  8.997  10.000 0.000]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최적 행동(Optimal Actions) 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SARSA 결과에서 최적 행동 (argmax_actions)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;[2 1 2 2]
[2 1 1 2]
[2 1 2 2]
[1 1 1 0]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&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;0: 위쪽&lt;/li&gt;
&lt;li&gt;1: 오른쪽&lt;/li&gt;
&lt;li&gt;2: 아래쪽&lt;/li&gt;
&lt;li&gt;3: 왼쪽&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 차이점&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;가치 함수 값&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Policy Iteration은 더 균일하고 정수에 가까운 값(5.9, 6.56, 7.29, 8.1 등)을 생성했다.&lt;/li&gt;
&lt;li&gt;SARSA는 약간 더 세밀한 값(5.861, 6.478, 7.246 등)을 생성했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;목표 상태의 가치&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 알고리즘 모두 목표 상태(오른쪽 하단 코너)의 가치는 0이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가장 높은 가치&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 알고리즘 모두 목표 바로 옆 상태들에서 10 또는 10에 가까운 가장 높은 가치를 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수렴 패턴&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Policy Iteration은 이론적으로 정확한 값으로 더 빠르게 수렴한다.&lt;/li&gt;
&lt;li&gt;SARSA는 시간에 따라 점진적으로 수렴하며, 일부 탐색으로 인해 약간의 값 변동이 있을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;학습 파라미터&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SARSA 실행 결과에서는 eps(입실론): 0.0154와 alpha(알파): 0.0196 값이 표시된다.&lt;/li&gt;
&lt;li&gt;이는 학습이 거의 끝나고 탐색(exploration)이 매우 적게 이루어지는 단계를 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 알고리즘 모두 비슷한 가치 함수와 최적 정책을 학습했지만, 접근 방식에는 차이가 있다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Policy Iteration&lt;/b&gt;은 환경 모델을 알고 있으므로 정확한 값으로 더 직접적으로 수렴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SARSA&lt;/b&gt;는 실제 경험을 통해 학습하므로 약간의 노이즈가 있을 수 있지만, 여전히 유사한 최종 결과에 도달.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 비교는 두 알고리즘이 서로 다른 접근 방식에도 불구하고 같은 문제에 대해 유사한 해결책을 찾을 수 있음을 보여준다. 실제 적용에서는 환경 모델의 가용성, 상태 공간의 크기, 컴퓨팅 리소스 등에 따라 적절한 알고리즘을 선택하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;|인증|&lt;/p&gt;
&lt;p&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/cV0Inj/btsNt3JC7Dj/nnCQy9URkP7kwYmbyu1u6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV0Inj/btsNt3JC7Dj/nnCQy9URkP7kwYmbyu1u6K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;1571&quot; data-filename=&quot;KakaoTalk_20250422_140405086_02.png&quot; style=&quot;width: 33.1931%; margin-right: 10px;&quot; data-widthpercent=&quot;33.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV0Inj/btsNt3JC7Dj/nnCQy9URkP7kwYmbyu1u6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV0Inj%2FbtsNt3JC7Dj%2FnnCQy9URkP7kwYmbyu1u6K%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;616&quot; height=&quot;1571&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RaUrA/btsNt42PUxO/USmSagJkvZ8aMc1z9W14a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RaUrA/btsNt42PUxO/USmSagJkvZ8aMc1z9W14a0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;1691&quot; data-filename=&quot;KakaoTalk_20250422_140405086_01.png&quot; style=&quot;width: 31.2882%; margin-right: 10px;&quot; data-widthpercent=&quot;32.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RaUrA/btsNt42PUxO/USmSagJkvZ8aMc1z9W14a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRaUrA%2FbtsNt42PUxO%2FUSmSagJkvZ8aMc1z9W14a0%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;625&quot; height=&quot;1691&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj6MEL/btsNufCZwm6/8DVpnGiEXhSVBrUcYFPhM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj6MEL/btsNufCZwm6/8DVpnGiEXhSVBrUcYFPhM0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;1571&quot; data-filename=&quot;KakaoTalk_20250422_140409138.png&quot; style=&quot;width: 33.1931%;&quot; data-widthpercent=&quot;33.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj6MEL/btsNufCZwm6/8DVpnGiEXhSVBrUcYFPhM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj6MEL%2FbtsNufCZwm6%2F8DVpnGiEXhSVBrUcYFPhM0%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;616&quot; height=&quot;1571&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBam3z/btsNrvlCuSB/Qp7OJhwmf0jKNNEdetPEAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBam3z/btsNrvlCuSB/Qp7OJhwmf0jKNNEdetPEAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBam3z/btsNrvlCuSB/Qp7OJhwmf0jKNNEdetPEAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBam3z%2FbtsNrvlCuSB%2FQp7OJhwmf0jKNNEdetPEAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;1508&quot; data-origin-width=&quot;2514&quot; data-origin-height=&quot;1508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/56</guid>
      <comments>https://dev-self.tistory.com/56#entry56comment</comments>
      <pubDate>Tue, 22 Apr 2025 15:52:14 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 48일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;&lt;b&gt;Q-러닝(Q-Learning)&lt;/b&gt; 알고리즘의 &lt;b&gt;수렴성(Convergence)&lt;/b&gt;&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;벨만 방정식과 수축 매핑 증명을 기반으로 &lt;b&gt;왜&lt;/b&gt; 그리고 &lt;b&gt;어떻게&lt;/b&gt; 최적 정책으로 수렴하는지 알아보자. &amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강화학습(Reinforcement Learning)의 Q-함수와 벨만 연산자(Bellman operator)에 관한 수학적 증명은 두 Q-함수 간의 차이에 대한 상한을 설정하고 벨만 연산자가 수축 매핑(contraction mapping)임을 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;기본 Q-함수 정의 (이미지 6):벨만 최적 방정식 (Bellman Optimality Equation)&lt;/i&gt;&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsRawc/btsNtOkR7Oq/pTfs7hts3cNyEu2kjnqTSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsRawc/btsNtOkR7Oq/pTfs7hts3cNyEu2kjnqTSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsRawc/btsNtOkR7Oq/pTfs7hts3cNyEu2kjnqTSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsRawc%2FbtsNtOkR7Oq%2FpTfs7hts3cNyEu2kjnqTSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1117&quot; height=&quot;109&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 최적 Q-함수에 대한 벨만 방정식으로, 현재 상태 s에서 행동 a를 취했을 때 얻을 수 있는 기대 보상과 다음 상태 s'에서의 최대 Q-값을 감가율 &amp;gamma;로 할인한 값의 합을 나타낸다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;벨만 연산자와 수축 매핑 증명:&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jt2F9/btsNtsI5goZ/TUHwcU7kXp4g4pbiFKKiF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jt2F9/btsNtsI5goZ/TUHwcU7kXp4g4pbiFKKiF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jt2F9/btsNtsI5goZ/TUHwcU7kXp4g4pbiFKKiF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJt2F9%2FbtsNtsI5goZ%2FTUHwcU7kXp4g4pbiFKKiF1%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;848&quot; height=&quot;275&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLh7t/btsNtjySe4N/Mt9v51C54D0akZq1z6acMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLh7t/btsNtjySe4N/Mt9v51C54D0akZq1z6acMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLh7t/btsNtjySe4N/Mt9v51C54D0akZq1z6acMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLh7t%2FbtsNtjySe4N%2FMt9v51C54D0akZq1z6acMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;113&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 부분은 두 Q-함수 Q&amp;sup1;과 Q&amp;sup2;에 벨만 연산자 T*를 적용했을 때, 그 차이가 원래 두 함수의 차이에 감가율 &amp;gamma;를 곱한 것보다 작거나 같음을 보여준다. &amp;gamma; &amp;lt; 1이므로 이는 수축 매핑의 정의를 만족한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;최종&amp;nbsp;수축&amp;nbsp;매핑&amp;nbsp;결론:&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zR9fk/btsNuEVumBm/VTRwZwOQWypl0uY0ec1DG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zR9fk/btsNuEVumBm/VTRwZwOQWypl0uY0ec1DG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zR9fk/btsNuEVumBm/VTRwZwOQWypl0uY0ec1DG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzR9fk%2FbtsNuEVumBm%2FVTRwZwOQWypl0uY0ec1DG1%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;660&quot; height=&quot;88&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설명: 벨만 연산자 T&amp;lowast;는 &amp;gamma;&amp;lt;1일 때 수축 매핑이다. 이는 반복적으로 T&amp;lowast;를 적용하면 가치 함수가 최적 가치 함수 Q&amp;lowast;로 수렴함을 보장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;i&gt;특정&amp;nbsp;경우의&amp;nbsp;차이&amp;nbsp;분석:&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqr3g/btsNt3htYz2/qk47IpZ0tMsygVmStzEd0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqr3g/btsNt3htYz2/qk47IpZ0tMsygVmStzEd0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqr3g/btsNt3htYz2/qk47IpZ0tMsygVmStzEd0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flqr3g%2FbtsNt3htYz2%2Fqk47IpZ0tMsygVmStzEd0K%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;1120&quot; height=&quot;267&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설명: 두 가치 함수의 차이는 항상 최대 차이 ∣∣Q1&amp;minus;Q2∣∣&amp;infin;이하이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수렴성 보장의 중요성&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;이론적 타당성&lt;/b&gt;: 알고리즘이 수렴하지 않는다면, 계산 자원을 아무리 투입해도 최적 정책을 찾지 못할 수 있다. 수렴성은 알고리즘의 이론적 완전성을 보장한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실용적 신뢰성&lt;/b&gt;: 현실 문제에 적용할 때 알고리즘이 언젠가는 최적 해답에 도달할 것이라는 신뢰를 제공한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고리즘 설계&lt;/b&gt;: 수렴성 분석을 통해 학습률, 탐색 전략 등 알고리즘의 핵심 파라미터를 설계하는 지침을 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 예측&lt;/b&gt;: 수렴 속도와 조건에 대한 이해는 알고리즘의 성능을 예측하고 문제에 맞게 조정하는 데 필수적이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;벨만 방정식을 통한 수렴성 증명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벨만 방정식의 핵심 요소를 통해 Q-학습의 수렴성을 증명하는 방법은 다음과 같다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;벨만 연산자의 수축성(Contraction Mapping)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벨만 방정식에서 핵심은 T*(Q)(s,a) = &amp;Sigma; p(s'|s,a)[r + &amp;gamma; max_a' Q(s',a')] 형태의 벨만 연산자가 수축 매핑이라는 점이다.&lt;/li&gt;
&lt;li&gt;두 Q-함수 Q&amp;sup1;, Q&amp;sup2;에 대해 ||T*(Q&amp;sup1;) - T*(Q&amp;sup2;)||&amp;infin; &amp;le; &amp;gamma;||Q&amp;sup1; - Q&amp;sup2;||&amp;infin;가 성립한다.&lt;/li&gt;
&lt;li&gt;여기서 &amp;gamma;는 1보다 작은 감가율(discount factor)이므로, 벨만 연산자는 Q-함수 간의 거리를 반드시 감소시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고정점 이론(Fixed Point Theory)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바나흐 고정점 정리(Banach Fixed-Point Theorem)에 따르면, 완비 거리 공간에서의 수축 매핑은 유일한 고정점을 가지며, 어떤 시작점에서든 반복적 적용을 통해 그 고정점에 수렴한다.&lt;/li&gt;
&lt;li&gt;벨만 연산자가 수축 매핑이므로, Q-학습 업데이트를 무한히 반복하면 유일한 최적 Q-함수 Q*에 수렴한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확률적 근사 이론&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 Q-학습은 샘플 기반이므로, 확률적 근사 이론을 통해 추가적인 조건(적절한 학습률 감소, 충분한 탐색 등)을 만족할 때 확률적으로 최적 Q-함수에 수렴함을 증명한다.&lt;/li&gt;
&lt;li&gt;이는 벨만 연산자의 수축성에 기반한 분석의 확장이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벨만 방정식에서 감가율 &amp;gamma; &amp;lt; 1이라는 조건은 수렴성 증명에 결정적이다. 이 조건으로 인해 벨만 연산자가 수축 매핑이 되고, 이를 통해 Q-학습이 최적 정책으로 수렴할 수 있다는 이론적 보장을 얻게 된다. 이러한 수학적 기반이 없다면, 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;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u50Aa/btsNtrJ7pfU/qkWbr25Q5w0GRv6JFQKyYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u50Aa/btsNtrJ7pfU/qkWbr25Q5w0GRv6JFQKyYk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;1678&quot; data-filename=&quot;Screenshot from 2025-04-21 19-57-43.png&quot; style=&quot;width: 30.2608%; margin-right: 10px;&quot; data-widthpercent=&quot;30.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u50Aa/btsNtrJ7pfU/qkWbr25Q5w0GRv6JFQKyYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu50Aa%2FbtsNtrJ7pfU%2FqkWbr25Q5w0GRv6JFQKyYk%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;1678&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfZqRy/btsNuggxNb4/JPpy0ngFqmLiIvNRDpZ50k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfZqRy/btsNuggxNb4/JPpy0ngFqmLiIvNRDpZ50k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;1627&quot; data-filename=&quot;Screenshot from 2025-04-21 20-32-24.png&quot; style=&quot;width: 32.3461%; margin-right: 10px;&quot; data-widthpercent=&quot;33.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfZqRy/btsNuggxNb4/JPpy0ngFqmLiIvNRDpZ50k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfZqRy%2FbtsNuggxNb4%2FJPpy0ngFqmLiIvNRDpZ50k%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;626&quot; height=&quot;1627&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogPA2/btsNtrJ7pdX/yTb6IRQBDoZvKkZpfOhdv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogPA2/btsNtrJ7pdX/yTb6IRQBDoZvKkZpfOhdv1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;1448&quot; data-filename=&quot;Screenshot from 2025-04-21 19-57-49.png&quot; style=&quot;width: 35.0674%;&quot; data-widthpercent=&quot;35.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogPA2/btsNtrJ7pdX/yTb6IRQBDoZvKkZpfOhdv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogPA2%2FbtsNtrJ7pdX%2FyTb6IRQBDoZvKkZpfOhdv1%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;1448&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;1192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHaGtu/btsNuJbbHLs/dILxrX1ChC10DNA5bE2zwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHaGtu/btsNuJbbHLs/dILxrX1ChC10DNA5bE2zwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHaGtu/btsNuJbbHLs/dILxrX1ChC10DNA5bE2zwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHaGtu%2FbtsNuJbbHLs%2FdILxrX1ChC10DNA5bE2zwK%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;892&quot; height=&quot;1192&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;1192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/55</guid>
      <comments>https://dev-self.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 21 Apr 2025 20:05:16 +0900</pubDate>
    </item>
    <item>
      <title>패스트캠퍼스 환급챌린지 47일차 : 스크래치부터 시작하는 강화학습의 모든 것 강의 후기</title>
      <link>https://dev-self.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;i&gt;*본&lt;span&gt;&amp;nbsp;&lt;/span&gt;포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|내용 정리|&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;lt;&lt;b&gt;Q-learning: off-policy 학습방법&lt;/b&gt;&amp;gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 Q-learning 공식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 벨만 최적성 방정식 (Bellman Optimality Equation)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1bbH/btsNsnmsdfC/VKFer76mSWsc1P7SmYulsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1bbH/btsNsnmsdfC/VKFer76mSWsc1P7SmYulsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1bbH/btsNsnmsdfC/VKFer76mSWsc1P7SmYulsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1bbH%2FbtsNsnmsdfC%2FVKFer76mSWsc1P7SmYulsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;114&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 기본 방정식은 최적 행동-가치 함수를 정의합니다. 상태 s에서 행동 a를 취했을 때의 최적 Q값은 즉각적인 보상의 기대값과 모든 가능한 다음 상태에서의 할인된 최대 미래 가치의 합과 같다는 의미이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 가치 반복 업데이트 (Value Iteration Update)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SzQlm/btsNrpskU10/ZC8VscZGufzWzIUATz9ai0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SzQlm/btsNrpskU10/ZC8VscZGufzWzIUATz9ai0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SzQlm/btsNrpskU10/ZC8VscZGufzWzIUATz9ai0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSzQlm%2FbtsNrpskU10%2FZC8VscZGufzWzIUATz9ai0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;111&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 반복적 업데이트 방정식은 반복 적용을 통해 최적 Q-함수에 접근한다. 각 반복마다 최적 정책에 더 가까워진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&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;span&gt;s&lt;/span&gt;&lt;/span&gt;와 행동 &lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;에 대해, &lt;b&gt;모든 가능한 다음 상태 &lt;span&gt;&lt;span&gt;s&amp;prime;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;의 전이 확률 &lt;span&gt;&lt;span&gt;p(s&amp;prime;∣s,a)&lt;/span&gt;&lt;/span&gt;를 고려.&lt;/li&gt;
&lt;li&gt;즉시 보상 &lt;span&gt;&lt;span&gt;r&lt;/span&gt;&lt;/span&gt;과 할인된 최대 미래 가치 &lt;span&gt;&lt;span&gt;&amp;gamma;max⁡a&amp;prime;Qk(s&amp;prime;,a&amp;prime;)&lt;/span&gt;&lt;/span&gt;의 &lt;b&gt;기댓값&lt;/b&gt;을 계산해 Q-value를 업데이트.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;모델 기반 (Model-Based)&lt;/b&gt;: 환경의 전이 확률 &lt;span&gt;&lt;span&gt;p(s&amp;prime;∣s,a)&lt;/span&gt;&lt;/span&gt;를 알고 있어야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적성 보장&lt;/b&gt;: 반복 적용 시 최적 Q-function &lt;span&gt;&lt;span&gt;Q&amp;lowast;&lt;/span&gt;&lt;/span&gt;로 수렴.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 계획법 (DP)&lt;/b&gt;: 실제 경험 없이도 이론적으로 계산 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Argmax 정책에 대한 벨만 방정식&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCRLYU/btsNteClpkM/NInPuoy1CgFxaLfJSvk2hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCRLYU/btsNteClpkM/NInPuoy1CgFxaLfJSvk2hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCRLYU/btsNteClpkM/NInPuoy1CgFxaLfJSvk2hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCRLYU%2FbtsNteClpkM%2FNInPuoy1CgFxaLfJSvk2hK%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;881&quot; height=&quot;136&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 특정 정책(특히 argmax 정책)을 사용할 때 Q-함수가 어떻게 업데이트되는지 보여준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&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;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;(예: 탐욕 정책) 하에서 Q-value를 업데이트한다.&lt;/li&gt;
&lt;li&gt;다음 상태 &lt;span&gt;&lt;span&gt;s&amp;prime;&lt;/span&gt;&lt;/span&gt;에서 정책 &lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;에 따라 행동 &lt;span&gt;&lt;span&gt;a&amp;prime;&lt;/span&gt;&lt;/span&gt;을 선택할 때의 &lt;b&gt;기대 미래 가치&lt;/b&gt;를 반영한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Argmax 정책 적용 시&lt;/b&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;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;가 &lt;span&gt;&lt;span&gt;arg&amp;thinsp;max⁡&lt;/span&gt;&lt;/span&gt;&amp;nbsp;정책이면 &lt;span&gt;&lt;span&gt;&amp;sum;a&amp;prime;&amp;pi;(a&amp;prime;∣s&amp;prime;)Qk(s&amp;prime;,a&amp;prime;)=max⁡a&amp;prime;Qk(s&amp;prime;,a&amp;prime;)&lt;/span&gt;&lt;/span&gt;가 되어, &lt;b&gt;가치 반복 업데이트와 동일해진다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정책 평가 (Policy Evaluation)&lt;/b&gt;: 주어진 정책 &lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt;의 성능을 평가할 때 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;온-폴리시 (On-Policy)&lt;/b&gt;: 정책 &lt;span&gt;&lt;span&gt;&amp;pi;&lt;/span&gt;&lt;/span&gt; 자체가 업데이트에 관여.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Argmax에 대한 정책 정의 (탐욕 정책)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o9lVC/btsNpvsdGca/vlrpO54GrI1Vx7s3OTOcmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o9lVC/btsNpvsdGca/vlrpO54GrI1Vx7s3OTOcmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o9lVC/btsNpvsdGca/vlrpO54GrI1Vx7s3OTOcmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo9lVC%2FbtsNpvsdGca%2FvlrpO54GrI1Vx7s3OTOcmk%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;718&quot; height=&quot;143&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Q-value &lt;span&gt;&lt;span&gt;Qk(s,a)&lt;/span&gt;&lt;/span&gt;에서 &lt;b&gt;가장 높은 값을 가진 행동 &lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;를 확률 1로 선택하고, 나머지 행동은 0으로 배제하는 결정론적 정책이다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &amp;epsilon;-탐욕 정책 (&amp;epsilon;-Greedy Policy)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FPjN7/btsNpwkjNtt/27OoK0is22xVrppxiBXEW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FPjN7/btsNpwkjNtt/27OoK0is22xVrppxiBXEW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FPjN7/btsNpwkjNtt/27OoK0is22xVrppxiBXEW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFPjN7%2FbtsNpwkjNtt%2F27OoK0is22xVrppxiBXEW1%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;861&quot; height=&quot;147&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;147&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;이 정책은 확률 1-&amp;epsilon; + &amp;epsilon;/|A|로 탐욕적 행동을 선택하고, 다른 행동들은 확률 &amp;epsilon;/|A|로 선택함으로써 탐색과 활용 사이의 균형을 맞춘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;최적 행동 선택 확률&lt;/b&gt;: &lt;span&gt;&lt;span&gt;1&amp;minus;ϵ+ϵ/∣A∣&lt;/span&gt;&lt;/span&gt;(주로 &lt;span&gt;&lt;span&gt;1&amp;minus;ϵ&lt;/span&gt;&lt;/span&gt;로 근사).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;나머지 행동 선택 확률&lt;/b&gt;: 균등 분배 &lt;span&gt;&lt;span&gt;ϵ/∣A∣&lt;/span&gt;&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Exploration-Exploitation 균형&lt;/b&gt;: 확률 &lt;span&gt;&lt;span&gt;ϵ&lt;/span&gt;&lt;/span&gt;으로 무작위 행동을 선택해 탐색을 보장한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Behavior Policy로 사용&lt;/b&gt;: Q-learning에서 데이터 수집을 위해 실제로 사용되는 정책이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Q-learning 업데이트 식&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clZkwn/btsNsmHOOpU/p9MnjgqmcjFwp6XAt6B0lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clZkwn/btsNsmHOOpU/p9MnjgqmcjFwp6XAt6B0lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clZkwn/btsNsmHOOpU/p9MnjgqmcjFwp6XAt6B0lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclZkwn%2FbtsNsmHOOpU%2Fp9MnjgqmcjFwp6XAt6B0lk%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;827&quot; height=&quot;103&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것은 Q-learning의 실제 구현 공식으로, 경험을 기반으로 Q값이 어떻게 업데이트되는지 보여준다. 대괄호 안의 항은 시간적 차이(TD) 오류이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;color: #383a42; text-align: left;&quot;&gt;&lt;code&gt;Initialize &amp;alpha; &amp;gt; 0, &amp;pi; and Q(s,a) for all s &amp;isin; S and a &amp;isin; A
While True
    Initialize s, done = False
    While not done
        a ~ &amp;pi;(&amp;middot;|s) (e.g., &amp;epsilon;-greedy)
        Take action a and observe r, s', done
        Q(s,a) = Q(s,a) + &amp;alpha;[r + &amp;gamma; max(Q(s',a')) - Q(s,a)]
        If done
            Q(s',&amp;middot;) = 0
        s = s'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;초기화 단계&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;학습률 &amp;alpha; (alpha)는 0보다 큰 값으로 설정.&lt;/li&gt;
&lt;li&gt;정책 &amp;pi; (pi)를 초기화.&lt;/li&gt;
&lt;li&gt;모든 상태 s와 행동 a에 대한 Q(s,a) 값을 초기화.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;에피소드 반복&lt;/b&gt; (외부 While 루프):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 에피소드마다 초기 상태 s를 설정하고 done 플래그를 False로 초기화.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태-행동-보상 루프&lt;/b&gt; (내부 While 루프):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태 s에서 정책 &amp;pi;에 따라 행동 a를 선택 (주로 &amp;epsilon;-greedy 정책 사용).&lt;/li&gt;
&lt;li&gt;선택한 행동 a를 환경에 적용하고, 보상 r, 다음 상태 s', 그리고 에피소드 종료 여부(done)를 관찰.&lt;/li&gt;
&lt;li&gt;Q-값을 다음 공식으로 업데이트합니다 -&amp;gt; Q(s,a) = Q(s,a) + &amp;alpha;[r + &amp;gamma; max(Q(s',a')) - Q(s,a)]&lt;/li&gt;
&lt;li&gt;&amp;alpha;는 학습률&lt;/li&gt;
&lt;li&gt;&amp;gamma;는 할인 계수&lt;/li&gt;
&lt;li&gt;max(Q(s',a'))는 다음 상태에서의 최대 Q-값&lt;/li&gt;
&lt;li&gt;[r + &amp;gamma; max(Q(s',a')) - Q(s,a)]는 TD(Temporal Difference) 오차&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;종료 조건 처리&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에피소드가 종료되면(done = True), 종료 상태의 모든 Q-값을 0으로 설정: Q(s',&amp;middot;) = 0 (이는 종료 상태에서는 더 이상의 미래 보상이 없다는 의미)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상태 업데이트&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태를 다음 상태로 업데이트: s = s'&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 중요도 샘플링을 사용한 오프-정책 TD 학습&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp; 1. 기본 벨만 방정식 (Target Policy &amp;pi;₁ 기준)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnfP0Y/btsNrY8PxNu/qMK8JLer3V8iyK56B9eMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnfP0Y/btsNrY8PxNu/qMK8JLer3V8iyK56B9eMhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnfP0Y/btsNrY8PxNu/qMK8JLer3V8iyK56B9eMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnfP0Y%2FbtsNrY8PxNu%2FqMK8JLer3V8iyK56B9eMhk%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;780&quot; height=&quot;108&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Target Policy &lt;span&gt;&lt;span&gt;&amp;pi;1&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;하에서 상태 &lt;span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/span&gt;의 가치 함수 &lt;span&gt;&lt;span&gt;Vk+1(s)&lt;/span&gt;&lt;/span&gt;를 계산한다.&lt;/li&gt;
&lt;li&gt;모든 행동 &lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;와 다음 상태 &lt;span&gt;&lt;span&gt;s&amp;prime;&lt;/span&gt;&lt;/span&gt;에 대한 &lt;b&gt;기댓값&lt;/b&gt;을 고려한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정책 &lt;span&gt;&lt;span&gt;&amp;pi;1&lt;/span&gt;&lt;/span&gt;의 성능을 평가할 때 사용된다 (정책 평가).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp; 2. Importance Sampling 적용 버전 (Behavior Policy &amp;pi;₂ 사용)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cThGvx/btsNrWiPw8v/RVQxXKCgP3vGhL4mWZCZVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cThGvx/btsNrWiPw8v/RVQxXKCgP3vGhL4mWZCZVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cThGvx/btsNrWiPw8v/RVQxXKCgP3vGhL4mWZCZVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcThGvx%2FbtsNrWiPw8v%2FRVQxXKCgP3vGhL4mWZCZVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;113&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Behavior Policy &lt;span&gt;&lt;span&gt;&amp;pi;2&lt;/span&gt;&lt;/span&gt;로 수집된 샘플을 재가중하여 &lt;span&gt;&lt;span&gt;&amp;pi;1&lt;/span&gt;&lt;/span&gt;의 가치 함수를 추정한다.&lt;/li&gt;
&lt;li&gt;Importance Sampling Ratio &lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;로 보정한다.​&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&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;92&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdSEoN/btsNtcLhpkx/jr2L36uKkoWg6wVw2yZHAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdSEoN/btsNtcLhpkx/jr2L36uKkoWg6wVw2yZHAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdSEoN/btsNtcLhpkx/jr2L36uKkoWg6wVw2yZHAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdSEoN%2FbtsNtcLhpkx%2Fjr2L36uKkoWg6wVw2yZHAk%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;92&quot; height=&quot;86&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;용도&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Off-policy 학습에서 Target Policy와 Behavior Policy가 다를 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp; 3. 샘플 기반 근사 (Monte Carlo 추정)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXWWWd/btsNrXovr5H/ENxA6xmBYINX0iVS5TrOQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXWWWd/btsNrXovr5H/ENxA6xmBYINX0iVS5TrOQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXWWWd/btsNrXovr5H/ENxA6xmBYINX0iVS5TrOQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXWWWd%2FbtsNrXovr5H%2FENxA6xmBYINX0iVS5TrOQ0%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;561&quot; height=&quot;106&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;의미&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 경험으로 얻은 샘플 &lt;span&gt;&lt;span&gt;(s,a,r,s&amp;prime;)&lt;/span&gt;&lt;/span&gt;에 Importance Sampling Ratio를 곱해 &lt;b&gt;평균&lt;/b&gt;을 낸다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;E^&lt;/span&gt;&lt;/span&gt;는 샘플 평균 연산자이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델 불필요 (Model-Free): 전이 확률 &lt;span&gt;&lt;span&gt;p(s&amp;prime;∣s,a)&lt;/span&gt;&lt;/span&gt;를 몰라도 적용 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방정식들은 중요도 샘플링 비율을 사용하여 다른 정책(&amp;pi;₂)을 따르면서 하나의 정책(&amp;pi;₁)에 대한 가치 함수를 학습하는 방법을 보여준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구조적 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q-learning은 다음과 같은 특성을 가진 오프-정책 강화학습 알고리즘이다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;탐색을 위해 행동 정책(주로 &amp;epsilon;-탐욕 정책)을 사용한다.&lt;/li&gt;
&lt;li&gt;목표 정책(최적/탐욕 정책)을 향해 업데이트한다.&lt;/li&gt;
&lt;li&gt;이론적 기반으로 벨만 최적성 방정식을 사용한다.&lt;/li&gt;
&lt;li&gt;경험한 전이(transition)를 기반으로 Q값을 반복적으로 개선한다.&lt;/li&gt;
&lt;li&gt;결국 최적 행동-가치 함수로 수렴한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 Q-learning 알고리즘은 Q값을 초기화한 후 반복적으로:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&amp;epsilon;-탐욕 정책을 사용하여 행동을 선택한다.&lt;/li&gt;
&lt;li&gt;보상과 다음 상태를 관찰한다.&lt;/li&gt;
&lt;li&gt;시간적 차이 공식을 사용하여 Q값을 업데이트한다.&lt;/li&gt;
&lt;li&gt;최적값에 수렴할 때까지 계속한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Q-learning 알고리즘 구조도&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p7NoP/btsNrdj05WQ/J6LJNuOK07WzeYxLnQOGz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p7NoP/btsNrdj05WQ/J6LJNuOK07WzeYxLnQOGz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p7NoP/btsNrdj05WQ/J6LJNuOK07WzeYxLnQOGz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp7NoP%2FbtsNrdj05WQ%2FJ6LJNuOK07WzeYxLnQOGz0%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;1113&quot; height=&quot;1618&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;초기화 단계&lt;/b&gt;에서 Q(s,a) 값을 랜덤하게 설정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 상태&lt;/b&gt;를 관찰.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;epsilon;-greedy 정책&lt;/b&gt;을 사용해 행동을 선택:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;확률 1-&amp;epsilon;로 가장 높은 Q값을 가진 행동을 선택 (탐욕적 행동)&lt;/li&gt;
&lt;li&gt;확률 &amp;epsilon;로 무작위 행동을 선택 (탐색)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선택한 &lt;b&gt;행동을 환경에 적용&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;행동 후 &lt;b&gt;보상과 다음 상태&lt;/b&gt;를 관찰.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Q값을 업데이트&lt;/b&gt;합니다: Q(s,a) &amp;larr; Q(s,a) + &amp;alpha;[r + &amp;gamma; max Q(s',a') - Q(s,a)]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종료 조건을 확인&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미달성 시 다시 2단계로 돌아감.&lt;/li&gt;
&lt;li&gt;수렴 시 다음 단계로 진행함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;최종적으로 &lt;b&gt;최적 정책을 도출&lt;/b&gt;: &amp;pi;*(s) = argmax Q(s,a)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;|인증|&lt;/p&gt;
&lt;p&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/bp1xp0/btsNsisaobW/dPpvkPm1h0Zj1BTZKuZUkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp1xp0/btsNsisaobW/dPpvkPm1h0Zj1BTZKuZUkK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;1615&quot; data-filename=&quot;Screenshot from 2025-04-20 00-01-09.png&quot; style=&quot;width: 30.2265%; margin-right: 10px;&quot; data-widthpercent=&quot;30.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp1xp0/btsNsisaobW/dPpvkPm1h0Zj1BTZKuZUkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1xp0%2FbtsNsisaobW%2FdPpvkPm1h0Zj1BTZKuZUkK%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;589&quot; height=&quot;1615&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUhWTO/btsNr5MynSE/CerzFYfJPT8fjKHRJRCpf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUhWTO/btsNr5MynSE/CerzFYfJPT8fjKHRJRCpf0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;1519&quot; data-filename=&quot;Screenshot from 2025-04-20 00-56-31.png&quot; style=&quot;width: 33.1189%; margin-right: 10px;&quot; data-widthpercent=&quot;33.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUhWTO/btsNr5MynSE/CerzFYfJPT8fjKHRJRCpf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUhWTO%2FbtsNr5MynSE%2FCerzFYfJPT8fjKHRJRCpf0%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;607&quot; height=&quot;1519&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8eB1h/btsNsaVqf12/kWEaCdHOirg9vwDkd4nzAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8eB1h/btsNsaVqf12/kWEaCdHOirg9vwDkd4nzAk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;1422&quot; data-filename=&quot;Screenshot from 2025-04-20 00-01-19.png&quot; data-widthpercent=&quot;35.14&quot; style=&quot;width: 34.329%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8eB1h/btsNsaVqf12/kWEaCdHOirg9vwDkd4nzAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8eB1h%2FbtsNsaVqf12%2FkWEaCdHOirg9vwDkd4nzAk%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;589&quot; height=&quot;1422&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zNFI/btsNrcL9cLQ/dPKbh8VnJK42Szd0OE5c21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zNFI/btsNrcL9cLQ/dPKbh8VnJK42Szd0OE5c21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zNFI/btsNrcL9cLQ/dPKbh8VnJK42Szd0OE5c21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zNFI%2FbtsNrcL9cLQ%2FdPKbh8VnJK42Szd0OE5c21%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;820&quot; height=&quot;1098&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-------&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 링크&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://bit.ly/4hTSJNB&quot;&gt;https://bit.ly/4hTSJNB&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>오공완</category>
      <category>직장인공부</category>
      <category>직장인자기계발</category>
      <category>패스트캠퍼스</category>
      <category>패스트캠퍼스후기</category>
      <category>환급챌린지</category>
      <author>dev-self</author>
      <guid isPermaLink="true">https://dev-self.tistory.com/54</guid>
      <comments>https://dev-self.tistory.com/54#entry54comment</comments>
      <pubDate>Sun, 20 Apr 2025 01:19:17 +0900</pubDate>
    </item>
  </channel>
</rss>