본 기사의 프로그램은 Python 버전 3.13에서 실행되었습니다. 또한, numpy 버전은 2.3.5입니다.
| 링크 | 설명 |
|---|
| marubatsu.py | Marubatsu, Marubatsu_GUI 클래스 정의 |
| ... | |
| AI 목록과 지금까지 작성된 데이터 파일에 대해서는 아래 기사를 참조해 주세요. | |
지난 기사에서는 탐색(Exploration)에 모든 것을 집중한 '완전 랜덤'과 활용(Exploitation)에 모든 것을 집중한 '탐욕법(Greedy Method)'이라는, 정반대의 성질을 가진 두 가지 극단적인 알고리즘을 다각적인 시점에서 그래프화했습니다. 그 결과, 다중 슬롯머신 문제(Multi-Armed Bandit Problem, 강화학습 (RL))의 목적 함수를 최대화하기 위해서는 '탐색'과 '활용' 중 어느 한쪽에 치우치기보다는, 두 가지 요소를 어떻게 균형 있게, 그리고 적절한 순서로 조합하는지가 매우 중요하다는 것을 밝혀냈습니다.
이번 기사에서는 이 트레이드오프의 딜레마를 해결하기 위한 '진정한 강화학습 알고리즘'에 대해 설명합니다. 이번 글에서는 그 첫걸음으로, 가장 단순하면서도 강력한 능력을 가진 $\epsilon$-greedy 방법(엡실론-그리디 방법)을 소개하겠습니다.
$\epsilon$-greedy 방법의 아이디어는 매우 간단하여, '매번 탐색과 활용 중 어느 것을 수행할지 미리 정해둔 특정 확률에 따라 결정하는 것'입니다.
$\epsilon$-greedy 방법에서는 각 단계에서 탐색을 수행할 확률을 $oldsymbol{\varepsilon}$(엡실론)이라는 기호로 나타냅니다. $\varepsilon$는 확률이므로 반드시 0 이상 1 이하의 값을 가집니다.
아래와 같은 값을 설정합니다.
구체적으로, 다음과 같은 규칙(방책)으로 다음에 선택할 슬롯머신을 결정합니다.
- $\boldsymbol{\varepsilon}$ 확률로 무작위로 슬롯머신을 선택한다 (탐색) -
- $\boldsymbol{1 - \varepsilon}$ 확률(나머지 확률)로 지금까지 가장 많이 당첨된(당첨 확률의 추정값이 최대가 되는) 슬롯머신을 선택한다 (활용)
예를 들어 $\varepsilon = 0.1$로 설정한 경우, 매번 선택할 때 **10%의 확률로 모험(탐색)**하고, 나머지 **90%의 확률로 안정적으로 수익을 얻는다(활용)**는 의미가 됩니다.
기계 학습에서는 이 $\varepsilon$처럼 **'학습을 시작하기 전에 인간이 미리 정해두는 설정값'**을 **하이퍼파라미터(Hyperparameter)**라고 부릅니다.
반면에, 학습을 진행하면서 변화하는 '각 슬롯머신의 당첨 확률 추정값' 등은 단순히 **파라미터(Parameter)**라고 불러 구분합니다.
즉, $\epsilon$-greedy 방법은 인간이 설정하는 $\varepsilon$ 값에 따라 알고리즘의 성격이 크게 변한다는 특징을 가집니다.
실제로, $\varepsilon = 1$ (100% 탐색)로 설정한 경우는 항상 탐색을 수행하는 '완전 랜덤' 알고리즘과 완전히 일치하며, $\varepsilon = 0$ (0% 탐색)으로 설정한 경우는 항상 활용을 수행하는 '탐욕법'에 완벽하게 일치합니다.
따라서 이번 기사에서는 이 $\varepsilon$를 여러 값으로 바꿔보면서 알고리즘의 성질이나 움직임이 어떻게 변화하는지 그래프로 시각화해 보겠습니다.
위에서 '탐색'과 '활용'을 경우의 수로 나누어 설명했지만, 수학적으로는 방책을 하나의 확률식으로도 정리할 수 있습니다.
슬롯머신이 총 $n$ 대 있다고 가정하겠습니다.
- 탐색이 선택되었을 때(확률 $\varepsilon$):
모든 머신은 균등하게 선택되므로, 1대당 선택될 확률은 $\frac{\varepsilon}{n}$이 됩니다. -
- 활용이 선택되었을 때(확률 $1 - \varepsilon$):
'지금까지 최고의 당첨 기계'만 $1 - \varepsilon$의 확률로 선택되고, 그 외의 슬롯머신이 선택될 확률은 $0$이 됩니다.
이 두 가지는 독립적(동시에 발생하지 않음)이므로 더할 수 있습니다. 따라서 최종적으로 각 슬롯머신이 선택될 확률은 다음과 같습니다.
- 지금까지 최고의 당첨 기계가 선택될 확률: $(1 - \varepsilon) + \frac{\varepsilon}{n}$ -
- 그 외의 슬롯머신이 선택될 확률: $\frac{\varepsilon}{n}$
언뜻 보면 조금 복잡한 식처럼 보이지만, 실제로 하는 일은 '경우를 나누는 것'과 같습니다. 참고로 이 기사에서는 직관적인 이해도를 중시하여, 이후에도 '탐색'과 '활용'으로 나눈 상태에서 설명을 진행하겠습니다.
$\epsilon$-greedy 방법의 성질은 단계 수가 수백 회 정도인 '단기적 단계(아직 데이터 축적이 적은 시기)'와, 수천 회를 넘는 '장기적 단계(충분히 데이터가 모인 시기)'에 따라 그 특징이 크게 달라집니다.
이번 글에서는 $\epsilon$-greedy 방법의 움직임이 직관적이면서도 시각적으로 이해하기 쉬운 **'단계 수가 1만 회에 도달한 시점(장기적인 관점에서의 특성)'**에 대해 자세히 설명합니다.
참고로, 데이터가 충분히 모이지 않은 '단기적인 관점에서의 특성'은 다음 글에서 상세하게 다루겠습니다.
$\epsilon$-greedy 방법으로 다중 슬롯머신 문제(MAB)를 해결하는 Epsilon_Greedy_MAB_Agent
클래스를 정의합니다. 지난 글에서 작성한 탐욕법(Greedy_MAB_Agent)과 마찬가지로, 공통 기반이 되는 MAB_Agent 클래스 2를 상속받아 아래와 같이 간결하게 구현할 수 있습니다.
7~10행 (__init__ 메서드)
새롭게 $\epsilon$을 자유롭게 설정할 수 있도록, 원래의 __init__ 메서드를 **오버라이딩(Override)**하여 재정의합니다.
-
7행: $\epsilon$을 받기 위한 가상 인자(epsilon)를 추가합니다.
-
9행: 받은 $\epsilon$ 값을 나중에 사용할 수 있도록, epsilon 속성에 할당하여 기록합니다.
-
10행: 그래프의 제목에 어떤 $\epsilon$ 설정으로 실험했는지 한눈에 알 수 있도록 $\epsilon$ 값을 포함시킵니다.
12~21행 (select_arm 메서드)
다음으로 선택할 슬롯머신을 결정하는 메서드의 정의입니다. 13행에서 np.random.uniform()을 사용하여 '0.0 이상 1.0 미만의 무작위 숫자(균일 난수)'를 하나 발생시킵니다. 이 값이 설정한 $\epsilon$보다 작으면 '탐색(Exploration)'을, 그렇지 않으면 '활용(Exploitation)'을 수행합니다.
1 from ai import MAB, MAB_Agent
2 import numpy as np
3
...
행 번호가 없는 프로그램
from ai import MAB, MAB_Agent
import numpy as np
class Epsilon_Greedy_MAB_Agent(MAB_Agent):
...
앞서 노트에서 설명했듯이, '탐색'과 '활용'을 하나의 정책(확률 공식)으로 통합하여 select_arm 메서드를 작성하는 것도 불가능하지는 않습니다. 하지만 그 경우 각 슬롯머신이 선택될 확률을 매번 개별적으로 계산하여 np.random.choice에 확률 가중치(인자 p)로 전달해야 하므로, 프로그램이 상당히 복잡해집니다.
따라서 이렇게 if 문을 사용하여 간단하게 경우를 나누어 작성하는 것이 프로그램의 이해도를 훨씬 높여줍니다.
이번 글에서도, $\epsilon$ 설정값에 따라 $\epsilon$-greedy 방법의 특성이 어떻게 변화하는지 밝히기 위해 대규모 시뮬레이션을 진행합니다. 실험 조건은 지금까지의 글과 완전히 동일한 다음 조건을 설정합니다.
- 슬롯머신 대수: 3대
- 각 슬롯머신의 당첨 실제 확률:
[0.3, 0.5, 0.7]
이 환경에 대해 $\epsilon$ 값을 [0, 0.25, 0.5, 0.75, 1.0]의 5가지로 변화시키면서 알고리즘의 거동에 어떤 차이가 나타나는지 검증합니다.
아래는 이 처리를 수행하는 프로그램입니다.
- 1행: 5개의 에이전트를 기록할
egreedy_agents를 빈 리스트로 초기화합니다.
- 4~9행: 반복 처리로, $\epsilon$이
[0, 0.25, 0.5, 0.75, 1.0]의 각각의 경우에 대해 단계 수 1만, 에피소드 수 1,000으로 다중 슬롯머신 문제를 해결합니다. 계산 결과를 나중에 재사용할 수 있도록 5 데이터를 저장하는 폴더("../data/")에 `
100%|██████████| 1000/1000 [05:23<00:00, 3.09it/s]
save completed.
100%|██████████| 1000/1000 [05:14<00:00, 3.18it/s]
...
그래프를 표시하기 전에, 지난 기사와 마찬가지로 먼저 print_summary 메서드를 호출하여 각 실험 결과의 최종 단계(9,999 스텝 6)인 장기적인 관점에서의 통계 데이터를 문자로 출력하고, 설정한 $\epsilon$ 값에 따라 수치가 어떻게 변화하는지 고찰합니다.
for agent in egreedy_agents:
agent.print_summary()
실행 결과
ε-greedy 법(ε=0.0)의 결과 요약
============================
총 스텝 수 = 10000
...
아래는 print_summary로 표시된, “마지막에 수행된 1 에피소드의 결과”를 정리한 표입니다. $\epsilon = 0$과 $\epsilon = 1$의 경우는 지난 기사에서 검증했던 “탐욕법(Greedy)” 및 “완전 랜덤(Completely Random)”과 완전히 동일한 알고리즘입니다. 따라서 완전 랜덤의 경우 실험 결과는 지난 기사의 실험 결과와 거의 같은 수치를 보입니다. 반면, 탐욕법의 경우에는 지난 기사와 달리 처음에 “슬롯 0”에서 당첨이 나왔기 때문에 결과가 크게 다릅니다.
| $\epsilon=0.0$ (탐욕법) | $\epsilon=0.25$ | $\epsilon=0.5$ | $\epsilon=0.75$ | $\epsilon=1.0$ (완전 랜덤) |
|---|
| 획득한 코인 총 개수 | 7008 | 6442 | 6000 | 5485 |
| 획득한 코인의 평균 | 0.701 | 0.644 | 0.601 | 0.548 |
| 코인 총 개수 (슬롯 0) | 0 | 241 | 490 | 737 |
| 뽑은 횟수 (슬롯 0) | 1 | 819 | 1634 | 2513 |
| 코인의 평균 (슬롯 0) | 0.294 | 0.300 | 0.300 | 0.293 |
| 코인 총 개수 (슬롯 1) | 0 | 448 | 830 | 1281 |
| 뽑은 횟수 (슬롯 1) | 2 | 885 | 1676 | 2513 |
| 코인의 평균 (슬롯 1) | 0.000 | 0.497 | 0.495 | 0.510 |
| 코인 총 개수 (슬롯 2) | 7008 | 5761 | 4688 | 3467 |
| 뽑은 횟수 (슬롯 2) | 9997 | 8296 | 6690 | 4974 |
| 코인의 평균 (슬롯 2) | 0.701 | 0.694 | 0.701 | 0.697 |
이 표를 관찰하면, 무작위로 선택할 확률인 $\epsilon$ 값을 크게 증가시킬수록 각 수치가 다음과 같이 변화하는 특성을 발견할 수 있습니다.
전체 총점 (획득한 코인의 평균)- $\epsilon = 0$일 때의 최고 실력<br>0.7<br><br>(신(神)의 관점에서의 상한선)에서, $\epsilon = 1.0$을 향해 전체 평균값이 0.5로 감소하는 경향이 보입니다.
- $\epsilon = 0$일 때의 최고 실력-
실패 슬롯 (슬롯 0과 1) 데이터-
뽑은 횟수: 0회 근처에서, 세 슬롯에 균등하게 분배되는 “전체의 1/3(약 3,333회)”를 향해 증가합니다.
코인 총 개수: 횟수가 늘어나는 것에 비례하여, 0개에서 “진정한 확률 $\times$ 약 3,333회”의 개수를 향해 증가합니다.
코인의 평균 (정확도): 어떤 $\epsilon$ 값에서도 대수의 법칙(Law of Large Numbers)이 작용할 만큼 충분한 횟수가 뽑리므로, 각각의 진정한 실력(0.3이나 0.5)에 정확히 수렴하고 있습니다.
핵심 당첨 슬롯 (슬롯 2) 데이터-
뽑은 횟수: 거의 끝까지 반복되는 1만 회에서, 완전 랜덤일 때의 “전체의 1/3(약 3,333회)”를 향해 감소합니다.
코인 총 개수: 횟수가 줄어드는 것에 비례하여, “진정한 확률(0.7) $\times$ 1만 (= 7,000개)”에서 “0.7 $\times$ 약 3,333”을 향해 감소합니다.
이러한 결과가 나온 이유에 대해 자세히 설명하겠습니다.
$ ext{ε}$-greedy 방법은 전체의 '$ ext{ε}$ 확률'로 완전히 무작위 탐색을 수행합니다. 즉, 1만 스텝 에피소드 중에서는 평균적으로 스텝 수 × $ ext{ε}$ 회 의 탐색이 이루어집니다.
탐색 과정에서는 3대의 슬롯머신 모두가 완벽하게 공평하게 선택되므로, 각 슬롯머신은 최소한 다음 공식으로 계산할 수 있는 횟수만큼 확실히 시도(탐색)됩니다.
$$ ext{각 머신의 최소 시도 횟수} = rac{ ext{총 스텝 수} imes ext{ε}}{ ext{슬롯머신 대수}}$$
이 이론식을 이번의 '1만 스텝', '3대'라는 실험 조건에 적용하면, 각 슬롯머신이 최소한 선택되어야 할 이론값은 다음과 같습니다.
| $ ext{ε}$ 설정값 | 1대당 최소 시도 횟수 (이론값) |
|---|
| 0 | 0 |
| ... | |
위 표에서, $ ext{ε} = 0$인 경우를 제외하고는 어떤 설정에서도 모든 슬롯머신이 최소한 800회 이상 확실하게 선택됨을 알 수 있습니다.
이렇게 많은 레버를 당기면 대수의 법칙(Law of Large Numbers)이 강력하게 작용합니다. 따라서 AI는 데이터 부족으로 인한 착각을 일으키지 않고, '슬롯 2 (확률 0.7)'가 최고의 당첨기(神台)라는 것을 거의 확실하게 파악할 수 있게 됩니다.
최고의 당첨기가 판명된 후에는, '활용($1 - ext{ε}$ 확률)'이 선택된 스텝에서는 AI는 항상 '슬롯 2' 레버만 착각 없이 꾸준히 당기게 됩니다.
실제로 앞서 보여드린 print_summary의 데이터 표를 다시 살펴보면, 하품기인 '슬롯 0'과 '슬롯 1'이 선택된 횟수가 위 표의 이론값(최소 시도 횟수)과 거의 정확하게 일치하는 것을 확인할 수 있습니다. 이는 AI가 시뮬레이션의 '상당히 이른 단계'에서 '슬롯 2'가 최고의 당첨기임을 파악하고, 그 이후의 '활용' 과정에서는 하품기를 당기는 무의미한 선택을 완전히 중단했음을 입증합니다.
반면, 한 번도 탐색하지 않은 $ ext{ε} = 0$ (탐욕법)의 결과는 7,008장이라는 이론상의 최고 점수를 기록했습니다. 실제로 내역을 살펴보면, 1만 회 중 9,997회나 '슬롯 2'가 선택된 것으로 보아 처음부터 끝까지 거의 '슬롯 2'만 계속 당긴 것입니다.
지난 기사에서 검증했을 때는 우연히 처음에 하품기(슬롯 0)로 당첨이 발생했기 때문에, 평생 그 하품기에 묶이는 '자멸 루프'가 발생했습니다. 하지만 이번 에피소드에서는 운 좋게 최고의 당첨기인 '슬롯 2' 레버를 처음 당겼을 때 당첨이 발생했기 때문에, 처음부터 끝까지 정답 기계를 계속 당기는 데 성공한 것입니다.
이처럼 탐욕법($ ext{ε} = 0$)은 '우연히 첫 번째 운이 좋았을 뿐인데 최고의 점수가 나오는' 매우 격렬한 하이 리스크-하이 리턴의 도박적인 특성을 가지고 있습니다.
이 단 한 번의 우연한 결과만 보고, '$ ext{ε} = 0$ 탐욕법이 최강 알고리즘이다!'라고 판단하는 것이 얼마나 위험하고 성급한지 수학적으로도 입증되었습니다.
앞서 보여드린 $ ext{ε} = 0$의 결과를 자세히 보면, '슬롯 0'이 1회, '슬롯 1'이 2회 선택되어 있습니다. 탐욕법이라면 '처음에 선택된 슬롯머신만 당기지 않을까?'라고 생각할 수 있지만, 이는 다음과 같은 동작이 발생했기 때문입니다.
- 어느 슬롯머신에서든 당첨이 나올 때까지는 모든 슬롯머신의 당첨 확률 추정치가 '0'이 됩니다. 따라서 활용만 하는 탐욕법이라도 3대 중에서 무작위로 선택됩니다.
- '슬롯 2'에서 처음으로 당첨이 나올 때까지의 스텝 동안, '슬롯 0'이 1회, '슬롯 1'이 2회 선택되었고, 이 경우 모두 하품기를 당겼습니다.
- 일단 '슬롯 2'에서 당첨이 나오면, '슬롯 2'의 당첨 추정치만 플러스가 되므로, 그 이후 남은 모든 과정에서 AI는 오직 '슬롯 2'만을 계속해서 '편애'하며 당기게 됩니다.
이처럼 알고리즘의 움직임을 엄밀하게 추적함으로써 출력된 수치가 가진 의미를 설명할 수 있습니다.
단 한 번의 우연한 결과(1 에피소드)는 난수(운/불운)에 의해 데이터가 크게 달라지게 만듭니다. 따라서 운의 요소를 완전히 제거하고, 알고리즘이 가진 '진정한 실력'을 명확히 하기 위해 1,000번의 실험을 반복하여 얻은 최종 단계(1만 번째)의 집계 데이터를 비교해 보겠습니다.
아래는 print_summary가 출력한 1,000 에피소드의 집계 결과를 요약한 표입니다.
| ε=0.0 | ε=0.25 | ε=0.5 | ε=0.75 | ε=1.0 |
|---|
| 단계당 코인의 평균 | 0.556 | 0.649 | 0.600 | 0.550 |
| 맞는 예측값의 평균 (슬롯 0) | 0.061 | 0.300 | 0.300 | 0.300 |
| 맞는 예측값의 평균 (슬롯 1) | 0.158 | 0.501 | 0.500 | 0.500 |
| 맞는 예측값의 평균 (슬롯 2) | 0.336 | 0.700 | 0.700 | 0.700 |
실제로는 지금까지의 프로그램 집계 처리 과정에 계산되는 표준편차 값에 큰 오차가 발생하는 버그가 숨어 있다는 것을 알게 되었습니다. 따라서 혼란을 막기 위해 위 표에서는 의도적으로 표준편차 데이터를 삭제했습니다. 이 버그의 정체와 수정 방법은 이번 기사의 후반부에서 설명하겠습니다.
이 표를 통해, 무작위로 탐색하는 확률인 $\epsilon$ 값을 크게 할수록 장기적인 관점에서의 실력이 다음과 같이 변화하는 것을 볼 수 있습니다.
- 단계당 코인의 평균 (전체 점수)
$\epsilon = 0$일 때의 0.556에서, $\epsilon = 0.25$로 바뀌는 순간 0.649로 크게 치솟습니다. 하지만 이곳을 정점으로 하여, 이번에는 완전 무작위($\epsilon = 1$)인 0.500를 향해 우하향으로 감소합니다. -
각 슬롯의 맞는 예측값의 평균 (실력을 파악하는 정확도)
사고가 멈춘 루프가 발생하는 $\epsilon = 0$일 때만, 진정한 확률(0.3 / 0.5 / 0.7)에서 크게 벗어난 낮은 수치입니다. 그러나 $\epsilon > 0$인 경우에는 모든 슬롯 머신이 본래의 확률에 맞는 수치로 거의 완벽하게 수렴합니다.
앞서 제시된 '1 에피소드만 요약한 표'에서는, $\epsilon$가 커질수록 획득 코인의 평균이 깔끔하게 우하향으로 줄어들었습니다. 하지만 이는, $\epsilon = 0.0$의 탐욕법(Greedy Method)이 '우연히 최고의 당첨 기계(슬롯 2)를 첫 번째에 뽑았기' 때문입니다.
1,000번이나 실험을 반복하여 평균을 내면, 탐욕법($\epsilon = 0$)의 실제 평균 점수는 0.556이라는 낮은 값까지 침체됩니다. 왜냐하면, 3번에 1번은 최악의 당첨 기계를 잡고 평생 끌고 가기 때문입니다. 탐욕법의 특성에 대한 더 자세한 고찰은 이전 기사를 참조해 주십시오.
이번 실험처럼 총 단계 수를 10,000과 같은 큰 값으로 설정하는 경우에는, $\epsilon$를 극단적으로 작은 값(예: 0.0001)으로 설정하지 않는 한, AI는 시뮬레이션의 '상당히 빠른 단계'에서 진정한 확률이 가장 높은 슬롯 머신(슬롯 2)을 올바르게 파악할 수 있게 됩니다.
최고의 당첨 기계가 완전히 판명된 후에는, 그 이후 단계에서 얻게 되는 코인 개수는 다음 두 가지 모드의 조합에 의해 수학적으로 계산할 수 있습니다.
- 탐색 모드(확률 $\epsilon$): 모든 기계를 균등하게 뽑기 때문에, 얻을 수 있는 코인의 기대값은 전체 슬롯 머신의 평균 확률인 $p_{mean} = 0.5$가 됩니다. -
- 활용 모드(확률 $1 - \epsilon$): 정답의 신성한 기계만 계속 뽑기 때문에, 얻을 수 있는 코인의 기대값은 최고의 진정한 확률인 **$p_{max} = 0.7$**이 됩니다.
따라서 이 두 가지를 합산한 아래 공식은 데이터가 충분히 모인 후의 **'1 단계당 얻을 수 있는 코인의 평균 개수(기대값)'**를 나타냅니다.
$$ε \times p_{mean} + (1 - ε) \times p_{max}$$
그렇지 않다면, 아무리 $\epsilon$을 작은 값으로 설정하더라도, 스텝 수를 크게 늘려가면 결국 모든 슬롯 머신이 '실력을 파악하는 데 충분한 횟수'만큼 탐색되게 됩니다. 따라서 충분한 데이터가 쌓인 장기적인 단계에서는 활용 모드일 때 항상 최고의 당첨 기계(슬롯 2)만을 선택할 수 있게 됩니다.
그렇기 때문에, 스텝 수를 일정 이상으로 크게 늘리면, 결국 1 스텝당 평균 보상은 항상 이 기대값 공식으로 고정됩니다. 이는 **전체 시도 횟수를 늘릴수록 '스텝당 코인의 평균'이 이 수식의 값에 한없이 가까워진다(수렴한다)**는 것을 의미합니다.
이번 실험에서 설정한 값($p_{mean} = 0.5$, $p_{max} = 0.7$)을 이 기대값 공식에 대입하면 다음과 같습니다.
$$ egin{aligned} & ε \times 0.5 + (1 - ε) \times 0.7 \ &= 0.5ε + 0.7 - 0.7ε \ &= 0.7 - 0.2 \times ε ext{ }
ing{1} ext{ }
ing{2} ext{ }
ing{3} ext{ }
ing{4} ext{ }
ing{5} ext{ }
ing{6} ext{ }
ing{7} \ &= 0.7 - 0.2 \times ε ext{ }
ing{8} ext{ }
ing{9} ext{ }
ing{10} ext{ }
ing{11} ext{ }
ing{12} ext{ }
ing{13} ext{ }
ing{14} \ &= 0.7 - 0.2 \times ε ext{ }
ing{15} ext{ }
ing{16} ext{ }
ing{17} ext{ }
ing{18} ext{ }
ing{19} ext{ }
ing{20} ext{ }
ing{21} \ &= 0.7 - 0.2 \times ε ext{ }
ing{22} ext{ }
ing{23} ext{ }
ing{24} ext{ }
ing{25} ext{ }
ing{26} ext{ }
ing{27} ext{ }
ing{28} \ &= 0.7 - 0.2 \times ε ext{ }
ing{29} ext{ }
ing{30} ext{ }
ing{31} ext{ }
ing{32} ext{ }
ing{33} ext{ }
ing{34} ext{ }
ing{35} \ &= 0.7 - 0.2 \times ε ext{ }
ing{36} ext{ }
ing{37} ext{ }
ing{38} ext{ }
ing{39} ext{ }
ing{40} ext{ }
ing{41} ext{ }
ing{42} \ &= 0.7 - 0.2 \times ε ext{ }
ing{43} ext{ }
ing{44} ext{ }
ing{45} ext{ }
ing{46} ext{ }
ing{47} ext{ }
ing{48} ext{ }
ing{49} \ &= 0.7 - 0.2 \times ε ext{ }
ing{50} ext{ }
ing{51} ext{ }
ing{52} ext{ }
ing{53} ext{ }
ing{54} ext{ }
ing{55} ext{ }
ing{56} \ &= 0.7 - 0.2 \times ε ext{ }
ing{57} ext{ }
ing{58} ext{ }
ing{59} ext{ }
ing{60} ext{ }
ing{61} ext{ }
ing{62} ext{ }
ing{63} \ &= 0.7 - 0.2 \times ε ext{ }
ing{64} ext{ }
ing{65} ext{ }
ing{66} ext{ }
ing{67} ext{ }
ing{68} ext{ }
ing{69} ext{ }
ing{70} \ &= 0.7 - 0.2 \times ε ext{ }
ing{71} ext{ }
ing{72} ext{ }
ing{73} ext{ }
ing{74} ext{ }
ing{75} ext{ }
ing{76} ext{ }
ing{77} \ &= 0.7 - 0.2 \times ε ext{ }
ing{78} ext{ }
ing{79} ext{ }
ing{80} ext{ }
ing{81} ext{ }
ing{82} ext{ }
ing{83} ext{ }
ing{84} \ &= 0.7 - 0.2 \times ε ext{ }
ing{85} ext{ }
ing{86} ext{ }
ing{87} ext{ }
ing{88} ext{ }
ing{89} ext{ }
ing{90} ext{ }
ing{91} \ &= 0.7 - 0.2 \times ε ext{ }
ing{92} ext{ }
ing{93} ext{ }
ing{94} ext{ }
ing{95} ext{ }
ing{96} ext{ }
ing{97} ext{ }
ing{98} \ &= 0.7 - 0.2 \times ε ext{ }
ing{99} ext{ }
ing{100} ext{ }
ing{101} ext{ }
ing{102} ext{ }
ing{103} ext{ }
ing{104} ext{ }
ing{105} \ &= 0.7 - 0.2 \times ε ext{ }
ing{106} ext{ }
ing{107} ext{ }
ing{108} ext{ }
ing{109} ext{ }
ing{110} ext{ }
ing{111} ext{ }
ing{112} \ &= 0.7 - 0.2 \times ε ext{ }
ing{113} ext{ }
ing{114} ext{ }
ing{115} ext{ }
ing{116} ext{ }
ing{117} ext{ }
ing{118} ext{ }
ing{119} \ &= 0.7 - 0.2 \times ε ext{ }
ing{120} ext{ }
ing{121} ext{ }
ing{122} ext{ }
ing{123} ext{ }
ing{124} ext{ }
ing{125} ext{ }
ing{126} \ &= 0.7 - 0.2 \times ε ext{ }
ing{127} ext{ }
ing{128} ext{ }
ing{129} ext{ }
ing{130} ext{ }
ing{131} ext{ }
ing{132} ext{ }
ing{133} \ &= 0.7 - 0.2 \times ε ext{ }
ing{134} ext{ }
ing{135} ext{ }
ing{136} ext{ }
ing{137} ext{ }
ing{138} ext{ }
ing{139} ext{ }
ing{140} \ &= 0.7 - 0.2 \times ε ext{ }
ing{141} ext{ }
ing{142} ext{ }
ing{143} ext{ }
ing{144} ext{ }
ing{145} ext{ }
ing{146} ext{ }
ing{147} \ &= 0.7 - 0.2 \times ε ext{ }
ing{148} ext{ }
ing{149} ext{ }
ing{150} ext{ }
ing{151} ext{ }
ing{152} ext{ }
ing{153} ext{ }
ing{154} \ &= 0.7 - 0.2 \times ε ext{ }
ing{155} ext{ }
ing{156} ext{ }
ing{157} ext{ }
ing{158} ext{ }
ing{159} ext{ }
ing{160} ext{ }
ing{161} \ &= 0.7 - 0.2 \times ε ext{ }
ing{162} ext{ }
ing{163} ext{ }
ing{164} ext{ }
ing{165} ext{ }
ing{166} ext{ }
ing{167} ext{ }
ing{168} \ &= 0.7 - 0.2 \times ε ext{ }
ing{169} ext{ }
ing{170} ext{ }
ing{171} ext{ }
ing{172} ext{ }
ing{173} ext{ }
ing{174} ext{ }
ing{175} \ &= 0.7 - 0.2 \times ε ext{ }
ing{176} ext{ }
ing{177} ext{ }
ing{178} ext{ }
ing{179} ext{ }
ing{180} ext{ }
ing{181} ext{ }
ing{182} \ &= 0.7 - 0.2 \times ε ext{ }
ing{183} ext{ }
ing{184} ext{ }
ing{185} ext{ }
ing{186} ext{ }
ing{187} ext{ }
ing{188} ext{ }
ing{189} \ &= 0.7 - 0.2 \times ε ext{ }
ing{190} ext{ }
ing{191} ext{ }
ing{192} ext{ }
ing{193} ext{ }
ing{194} ext{ }
ing{195} ext{ }
ing{196} \ &= 0.7 - 0.2 \times ε ext{ }
ing{197} ext{ }
ing{198} ext{ }
ing{199} ext{ }
ing{200} ext{ }
ing{201} ext{ }
ing{202} ext{ }
ing{203} \ &= 0.7 - 0.2 \times ε ext{ }
ing{204} ext{ }
ing{205} ext{ }
ing{206} ext{ }
ing{207} ext{ }
ing{208} ext{ }
ing{209} ext{ }
ing{210} \ &= 0.7 - 0.2 \times ε ext{ }
ing{211} ext{ }
ing{212} ext{ }
ing{213} ext{ }
ing{214} ext{ }
ing{215} ext{ }
ing{216} ext{ }
ing{217} \ &= 0.7 - 0.2 \times ε ext{ }
ing{218} ext{ }
ing{219} ext{ }
ing{220} ext{ }
ing{221} ext{ }
ing{222} ext{ }
ing{223} ext{ }
ing{224} \ &= 0.7 - 0.2 \times ε ext{ }
ing{225} ext{ }
ing{226} ext{ }
ing{227} ext{ }
ing{228} ext{ }
ing{229} ext{ }
ing{230} ext{ }
ing{231} \ &= 0.7 - 0.2 \times ε ext{ }
ing{232} ext{ }
ing{233} ext{ }
ing{234} ext{ }
ing{235} ext{ }
ing{236} ext{ }
ing{237} ext{ }
ing{238} \ &= 0.7 - 0.2 \times ε ext{ }
ing{239} ext{ }
ing{240} ext{ }
ing{241} ext{ }
ing{242} ext{ }
ing{243} ext{ }
ing{244} ext{ }
ing{245} \ &= 0.7 - 0.2 \times ε ext{ }
ing{246} ext{ }
ing{247} ext{ }
ing{248} ext{ }
ing{249} ext{ }
ing{250} ext{ }
ing{251} ext{ }
ing{252} \ &= 0.7 - 0.2 \times ε ext{ }
ing{253} ext{ }
ing{254} ext{ }
ing{255} ext{ }
ing{256} ext{ }
ing{257} ext{ }
ing{258} ext{ }
ing{259}
앞서 제시된 $\epsilon = 0.0$ (탐욕법)의 데이터와 이번 극소 설정($\epsilon = 0.0001$)에 대한 1,000 에피소드의 평균값을 정리한 표입니다.
| 각 에이전트 실력 비교 (1,000회 평균) | $\epsilon=0.0$ (탐욕법) | $\epsilon=0.0001$ (극소 설정) |
|---|
| 단계당 코인 평균 | 0.556 | 0.566 |
| 성공 예측값 평균 (슬롯 0) | 0.061 | 0.093 |
| ... | | |
| 앞서 계산한 기대값 공식($0.7 - 0.2 \times \epsilon$)에 따르면, $\epsilon = 0.0001$일 때의 점수는 $0.7 - 0.2 \times 0.0001 = 0.69998$ (약 0.7개)로 거의 최고점의 하이스코어가 나와야 합니다. 하지만 실제 시뮬레이션 결과(실측값)는 이론값(0.699)보다 훨씬 낮은 0.566이라는 실망스러운 점수에 그쳤습니다. | | |
표의 수치를 자세히 살펴보면, 각 슬롯의 실력(예측값 평균) 역시 실제 확률(0.3 / 0.5 / 0.7)와는 거리가 멀고, 전혀 모험을 하지 않은 $\epsilon = 0.0$ 탐욕법과 거의 다르지 않은 대실패 상태임을 알 수 있습니다. 이처럼 안타까운 결과가 나온 원인은 **'신규 슬롯을 파악(탐색)할 시간이 압도적으로 부족했기 때문'**입니다.
1만 회라는 게임의 유한한 시간 속에서, 단 1회만 탐색하는 전략으로는 데이터가 전혀 쌓이지 않습니다. 그 결과, 데이터 부족으로 인한 착각(미혹 현상)을 수정하지 못하고, 1,000회 중 수백 번은 초기에 우연히 성공했던 실패 슬롯에 계속 매달리게 됩니다.
이 실험을 통해 강화학습(RL)에서 다음과 같은 중요한 교훈을 얻을 수 있습니다.
장기적인 목표만 본다면 '탐색($\epsilon$)을 줄여서 안정적으로 벌어들이는 것'이 가장 강력한 전술이지만, 시간이 유한하다는 점을 고려할 때 탐색을 너무 많이 줄이면 애초에 정답에 도달하는 것조차 못 하고 자멸하게 됩니다.