import numpy as np
import collections13wk-1: (강화학습) – 강화학습 Intro, Bandit 게임 설명, Bandit 환경 설계 및 풀이
1. 강의영상
2. Imports
3. 강화학습 Intro
- 강화학습(대충설명): 어떠한 “(게임)환경”이 있을때 거기서 “뭘 할지”를 학습하는 과업

Sutton, Richard S, Andrew G Barto, et al. 1998. Reinforcement Learning: An Introduction. Vol. 1. 1. MIT press Cambridge.
- 딥마인드: breakout \(\to\) 알파고

- 강화학습에서 “강화”는 뭘 강화한다는것일까?
- 강화학습 미래? (이거 잘하면 먹고 살 수 있을까?)
4. Bandit 게임 설명
- 문제설명: 두 개의 버튼이 있다. 버튼0을 누르면 1의 보상을, 버튼1을 누르면 10의 보상을 준다고 가정
- Agent: 버튼0을 누르거나,버튼1을 누르는 존재
- Env: Agent의 Action을 바탕으로 Reward를 주는 존재
주의: 이 문제 상황에서 state는 없음
- 생성형AI로 위의 상황을 설명한것 (왼쪽부터 챗지피티, 제미나이, 퍼플렉시티의 결과)



- 게임진행양상
- 처음에는 아는게 없음. 일단 “아무거나” 눌러보자. (“에이전트가 랜덤액션을 한다” 고 표현함 )
- 한 20번 정도 눌러보면서 결과를 관찰함 (“에이전트가 경험을 축적한다”고 표현함)
- 버튼0을 누를때는 1점, 버튼1을 누를때는 10점을 준다는 사실을 깨달음. (“에이전트가 환경을 이해했다”고 표현함)
- 버튼1을 누르는게 나한테 이득이 라는 사실을 깨달음. (“에이전트가 최적의 정책을 학습했다” 고 표현함)
- 이제부터 무조건 버튼1만 누름 \(\to\) 게임 클리어 (“강화학습 성공”이라 표현할 수 있음)
- 어떻게 버튼1을 누르는게 이득이라는 사실을 아는거지? \(\to\) 아래와 같은 테이블을 만들면 된다. (q_table)
| Action0 | Action1 | |
|---|---|---|
| State0 | mean(Reward | State0, Action0) | mean(Reward | State0, Action1) |
5. Bandit 환경 설계 및 풀이
A. 대충 개념만 실습
action_space = [0,1]
actions_deque = collections.deque(maxlen=500)
rewards_deque = collections.deque(maxlen=500)
#---#for _ in range(10):
action = np.random.choice(action_space)
if action == 1:
reward = 10
else:
reward = 1
actions_deque.append(action)
rewards_deque.append(reward)actions_dequedeque([0, 1, 0, 0, 0, 1, 0, 1, 1, 0], maxlen=500)
rewards_dequedeque([1, 10, 1, 1, 1, 10, 1, 10, 10, 1], maxlen=500)
actions_numpy = np.array(actions_deque)
rewards_numpy = np.array(rewards_deque)q0 = rewards_numpy[actions_numpy == 0].mean()
q1 = rewards_numpy[actions_numpy == 1].mean()
q_table = np.array([q0,q1])
q_tablearray([ 1., 10.])
action = q_table.argmax()for _ in range(5):
action = q_table.argmax()
if action == 1:
reward = 10
else:
reward = 1
actions_deque.append(action)
rewards_deque.append(reward)
actions_numpy = np.array(actions_deque)
rewards_numpy = np.array(rewards_deque)
q0 = rewards_numpy[actions_numpy == 0].mean()
q1 = rewards_numpy[actions_numpy == 1].mean()
q_table = np.array([q0,q1])actions_numpyarray([0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1])
rewards_numpyarray([ 1, 10, 1, 1, 1, 10, 1, 10, 10, 1, 10, 10, 10, 10, 10])
B. 클래스를 이용한 구현
class Bandit:
def __init__(self):
self.reward = None
def step(self,action):
if action == 0:
self.reward = 1
else:
self.reward = 10
return self.reward env = Bandit()class Agent:
def __init__(self):
pass
def act(self):
# 만약에 경험이 20보다 작음 --> 랜덤액션
# 경험이 20보다 크면 --> action = q_tabel.argmax()
pass
def save_experience(self):
# 데이터 저장
pass
def learn(self):
# q_table 을 업데이트하는 과정
pass
Important
앞으로의 수업에서는 아래에 해당하는 클래스의 기본 개념을 숙지하셔야 합니다. (13wk-2 주차 강의듣기전까지 꼭!)
- 클래스와 인스턴스의 개념,
__init__,self, 메소드 - 클래스의 상속
관련하여 제가 작년에 수업한 자료는 아래와 같습니다
- https://guebin.github.io/PP2024/posts/11wk-2.html 에서 1-7까지..
- https://guebin.github.io/PP2024/posts/14wk-2.html 에서 8-A
물론, 꼭 제 강의노트로만 공부하셔야하는것은 아닙니다. 제 수업 외에도 클래스를 잘 설명하는 다양한 자료들이 많이 있으니 자유롭게 참고하여 학습하시기 바랍니다.